OmniAICreator/Qiita-1.07M huggingface dataset:
Node-redのjsonataでGlobalとかFlowにアクセスできる(v0.17~)

#何の話？
Node-redでChangeノードでマジ便利なjsonataで、GlobalとかFlowとかにどうやってアクセスすんだよ！？って話です。
(標準がmsgを省略したパスで記述するので、、、）

#結論
$globalContext("hogehoge")で
global.hogehoge
にアクセスできます。Flowも同じ。

#参考
https://nodered.org/blog/2017/06/28/version-0-17-released

ちなみに
https://groups.google.com/forum/#!topic/node-red/QtIVXllCj4s
で出来ないって言ってる人いるけどなんでやろ。v0.17.5 on bluemixなら行けたけどな。
Homebrewを用いたgitのインストール

・実施環境
macOS High Sierra 10.13

##homebrewのインストール
・homebrewとは
macOS用のパッケージマネージャーです。
どういったソフトをインストールしたのかの記録、新しいバージョンが出た際の更新を行います。
これを用いてgitのインストールを行います。

###**homebrewのインストール**
[公式ページ](https://brew.sh/index_ja.html)にも掲載されていますが、下記コマンドをターミナルで実行します。

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

実行後、色々とダウンロードやインストールが開始します。

※補足事項
`Press RETURN to continue or any other key to abort`
と聞かれた際は、enterキーを押してあげてください。

`Password:`と聞かれた場合は、パスワードを入力してください。

###**インストールチェック**
下記コマンドをターミナルで実行します。

```
brew doctor
```

結果として　`Your system is ready to brew.` が返ってくれば、無事インストールが済んだことになります。

##**gitのインストール**
下記のコマンドでgitをインストールします。

```
brew install git
```

下記のコマンドを実行し、インストールしたgitを使用できる状態にする。

```
export PATH="/usr/local/Cellar/git/2.14.1/bin:$PATH"
```

下記のコマンドを実行し、バージョンが表示されれば完了です。

```
git --version
```
チャットツールのススメ

# オンラインチャットツール
1.Slack
2.ChatWork

## 1.Slack
- 有償だけど、使い勝手が良い
- チャンネル機能で公開範囲（public/private）の設定が可能
- スレッド機能で会話が煩雑になりにくくすることも可能
- 個人DM（ダイレクトメッセージ）
- ＠での相手へのメンション通知
- 各種絵文字やアイコンが充実（カスタマイズ可能）
- bot機能（カスタマイズ可能）
- 相手のオンライン/オフライン状況がわかる

## 2.ChatWork
- 誰でも使いやすいUIデザイン
- チャンネル機能あり
- TOでの相手へのメンション通知
- 各種絵文字やアイコンが充実
- マイチャットにて、メモ書き可能
- チャット内容をタスク化ができる（期限や相手へのタスクとして期限設定可能）
Slack Incoming Webhook URLの取得方法

## まずは**Slack**に登録しましょう。
https://slack.com/

## **Slack**の登録が終わったら下記の**Slack API**ページにアクセスします。
https://api.slack.com/apps?new_app=1

## 右上の**Create New App**をクリック
[![https://gyazo.com/1089867d7d63f09a7167014fb8af2031](https://i.gyazo.com/1089867d7d63f09a7167014fb8af2031.png)](https://gyazo.com/1089867d7d63f09a7167014fb8af2031)

## **App Name**と**Development Slack Workspace**を入力して**Create App**をクリック
[![https://gyazo.com/c2770b4b90081d4a1194cec8e7bd74b1](https://i.gyazo.com/c2770b4b90081d4a1194cec8e7bd74b1.png)](https://gyazo.com/c2770b4b90081d4a1194cec8e7bd74b1)

## **Add Features and Functionality**の**Incoming Webhooks**をクリック
[![https://gyazo.com/e5687f28e588ea9c5f7b416a180f2894](https://i.gyazo.com/e5687f28e588ea9c5f7b416a180f2894.png)](https://gyazo.com/e5687f28e588ea9c5f7b416a180f2894)

## 右上のスイッチを**ON**にする
[![https://gyazo.com/a0cc570acd8cf81235a8b5a65006b1e3](https://i.gyazo.com/a0cc570acd8cf81235a8b5a65006b1e3.png)](https://gyazo.com/a0cc570acd8cf81235a8b5a65006b1e3)

## **Add New Webhook to Workspace**をクリック
[![https://gyazo.com/4a4c9e46f39a46f31cea94ddd678527f](https://i.gyazo.com/4a4c9e46f39a46f31cea94ddd678527f.png)](https://gyazo.com/4a4c9e46f39a46f31cea94ddd678527f)

## **投稿先（通知したいチャンネル）**を選択して**許可する**をクリック
[![https://gyazo.com/9252ed45f551042af57577f71c0e37b9](https://i.gyazo.com/9252ed45f551042af57577f71c0e37b9.png)](https://gyazo.com/9252ed45f551042af57577f71c0e37b9)

## 下の方の**Webhook URL**が取得すべきURLとなります。
[![https://gyazo.com/62a6166dcdd5ddaad995a411e2cbe6ec](https://i.gyazo.com/62a6166dcdd5ddaad995a411e2cbe6ec.png)](https://gyazo.com/62a6166dcdd5ddaad995a411e2cbe6ec)

## 余力があれば左のカラムの**Basic information**から様々な設定ができます。
[![https://gyazo.com/df161f7028ffd2950cfbbbdb65bebfcc](https://i.gyazo.com/df161f7028ffd2950cfbbbdb65bebfcc.png)](https://gyazo.com/df161f7028ffd2950cfbbbdb65bebfcc)

## もしよかったら**Display Information**の項目から投稿デザインを設定してみましょう。
[![https://gyazo.com/6e0faf3a3679fecd9404062088bc32b0](https://i.gyazo.com/6e0faf3a3679fecd9404062088bc32b0.png)](https://gyazo.com/6e0faf3a3679fecd9404062088bc32b0)
IQテスト、EQテスト（IQ測定とEQ測定）の解答

IQテスト： https://www.arealme.com/iq/ja/
EQテスト： https://www.arealme.com/eq/ja/
それぞれ満点(200点)を取ってみました。
その解答です。

# IQテスト（IQ測定）
<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">このIQテストでわたしはIQ【200】を記録しました！みんなもやってみよう！ <a href="https://t.co/VvaJXaU9MW">https://t.co/VvaJXaU9MW</a> <a href="https://twitter.com/hashtag/IQ%E3%83%86%E3%82%B9%E3%83%88?src=hash&amp;ref_src=twsrc%5Etfw">#IQテスト</a></p>&mdash; NJ@F# (@TakayukiNakajo) <a href="https://twitter.com/TakayukiNakajo/status/995664106190389248?ref_src=twsrc%5Etfw">May 13, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

###Q1. 1, 3, 5, 7, 8, 9, 11 - 仲間外れの数字はどれですか？
8

###Q2. 仲間外れの動物はどれですか？
ヘビ

###Q3. 29、27、24、20、15 - この次にくる数字はどれですか？
9

###Q4. PEACHがHCAEPになるなら、46251はどれになりますか？
15264

###Q5. 2、10、12、60、62、310 - 次にくる数字はどれですか？
312

###Q6. ここに入るのはどれでしょう？
A

###Q7. 「すべてのBloopsがRazziesであり、かつすべてのRazziesがLazziesであるならば、すべてのBloopsは絶対にLazziesである」この命題は：
正しい

###Q8. 2,4,8,16,32,64 - 次にくる数字はどれですか？
128

###Q9. 長女が１６歳の誕生日を迎えた日、その歳は弟の４倍でした。では、長女の歳が弟の２倍になるのは長女が何歳になるときですか？
24

###Q10. 1, 1, 2, 3, 4, 5, 8, 13, 21 - この数列にあってはいけない数字はどれですか？
4

###Q11. ここに入るのはどれでしょう？
B

###Q12. ここに入るのはどれでしょう？
F

###Q13. 121,144,169,196 - 次にくる数字はどれですか？
225

###Q14. ４人の容疑者が次のように話しました、４人のうち一人だけウソをついているとすると、正しいのはどれでしょう？
Ｃがウソをついており、Ｂが犯行を行った
 
###Q15. ここに入るのはどれでしょう？
-5

###Q16.大きさが完全に等しい正方形の紙が以下のように重なっています。一番下にあるのはどの紙ですか？
8

###Q17. 5,10,19,32,49,70 - 次にくる数字はどれですか？
95

###Q18. *のマスに入る数字はどれですか？
17

###Q19. 表の*のマスに両方とも同じ文字が入るとしたら、それはどの文字ですか？
H

###Q20. 次にくるのはどの図ですか？
A



# EQテスト
<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">EQ、わたしは200 ！ <a href="https://t.co/JdtvURXv96">https://t.co/JdtvURXv96</a> <a href="https://twitter.com/hashtag/EQTest?src=hash&amp;ref_src=twsrc%5Etfw">#EQTest</a></p>&mdash; NJ@F# (@TakayukiNakajo) <a href="https://twitter.com/TakayukiNakajo/status/995667539471421440?ref_src=twsrc%5Etfw">May 13, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

###Q1. 飛行機に乗っていたら、突然乱気流に巻き込まれ、機体が大きく揺れ初めました；この時あなたは？
想像がつかないので分からない以外の回答を選択

###Q2. ４歳の子供たちを連れて公園で遊んでいたら、一人の子がみんなと遊んでもらえず大声で泣き始めました；この時あなたは？
その子に話しかけ、遊んでもらえるよう考える

###Q3. 中間テストの時、どうしてもＡが取りたい科目でＣの成績しか取れなかったとしてら、あなたは？
細かく学習計画を立ててそれを実行する 
or
この科目の成績が悪くても大したことじゃないと考え、もっと成績のいい科目に集中する 

###Q4. あなたは保健会社のセールスをしていますが、１５人もの客に長話をして誰にも売れず、悲しくなってきました；この時あなたは？
次の客こそはと考え、懸命な態度を維持する

###Q5. あなたは人種差別を許さない会社で社長をしています；ある日、社員が人種差別的なジョークを言っているのを耳にしたら、あなたは？
そのようなジョークはあなたの会社に相応しくないと、その場ではっきり注意する

###Q6. 友達の車に乗っていると、突然前に車が割り込んできました；友達はひどく怒っており、なだめようと思います；あなたは？
自分にも同じようなことがあって、その時は腹が立ったが、あとでその車が事故に遭い、救急車で運ばれた話をする

###Q7. 恋人と激しくケンカしました；怒りのあまり、思わずお互いの人格を攻撃してしまいました；この時あなたは？
２０分ほど間をおいて、そのあと話を続けることにする

###Q8. 新しい職場に配属され、リーダー格のポストを任されました；ここで面倒な問題を解決するとき、あなたが最初にするのは？
適当な時間を与えてお互いの理解を促す

###Q9. あなたの３歳の息子は臆病で、生まれつき知らない人や不慣れな場所に対してひどく人見知りする性格です；あなたは？
簡単なことから徐々に見知らぬ人や場所に慣れるように、長期間にわたる訓練を計画する

###Q10. あなたは子供の頃習ったきりずっと機会がなかった楽器を最近また習いなおしました；有効に時間を利用したいと思っていますが、あなたは？
少しずつ能力を延ばす短い曲を練習する






######賛否両論ありそうなので、コメントにてぜひ！
電気系プログラミングガチ素人が、Xamarinでアプリ開発する話　5日目　~iOSとAndroidProject,SAPとPCL,~

#それぞれのデリゲートの場所
iOS: ~.iOS -> AppDeligate.cs
Android: ~.Android -> MainActivity.cs

でそれぞれアクセスが可能。

#SAP?PCL?
SAP:Shared Asset Project
PCL:Portable Class Library

##違いは何よ？
SAPファイルはApp.csのみの構成（？)と書かれたましたが、見た所マスターのパッケージが少し少なくなってました。
また、以下の記述がPCLの特徴のようです。

```
all the common code is bundled into a dynamic-link li- brary that each application project references and binds to at run time.
```
全てのコードは一度、Dllの形式に変換されて、実行時に関連づけられて実行される。

```
With the SAP approach, the common code files are effectively included with each of the five application projects at build time. By default, the SAP has only a single file named App.cs, but effectively it’s as if this HelloSap project did not exist and instead there were five different copies of this file in the five application projects.
```
????
一個ずつ和訳します。

SAPでは、５つのアプリケーションのビルド環境に応じて、適切にインクルードされる。デフォルトならば、App.csでネーミングされるものの、５つのアプリケーションで適切にそれぞれ変換される。

つまり、この二つの違いは、一度変換して、実行時にアプリケーションとしてビルドして行く方法と、それぞれのビルド環境にあわせて、変換して行くタイプという違いのようです。

#今回はここまで・・・
今回は、ちょっと読み解くのが難しかったです。これから先はちょっと長丁場になりそうなので、
ここで一旦切ります！
ごめんなさい！
Raspberry PiとMIDIインターフェースでデバイス開発をする

この記事では、Raspberry PiとMIDIインターフェースを組み合わせて一つの独立したデバイスを作ります。

Raspberry Piによる各センサーやインターフェース（ボタン・スイッチ・Webなど）のコントロールについては、多くの情報が比較的簡単に入手できますが、
それらを一つの製品としてくみ上げる過程を重点的に記載したいと思います。
コードの解説については比較的少なめになりますが、ご容赦ください。

### シリーズ目次
1. ***Raspberry PiとMIDIインターフェースでデバイス開発をする]***
2. [RtMidiライブラリを使って、MIDIインターフェースを作成する](https://qiita.com/ixsiid/items/dfd093732d05260ed174)
3. [SMF (Standard Midi Format)を解析し、MIDIインターフェースに流し込む（プロトタイプ編）](https://qiita.com/ixsiid/items/e3633bc0a594dc5fb972)
4. ***SMF (Standard Midi Format)を解析し、MIDIインターフェースに流し込む（クラス編）***


# やりたいこと
1. Raspberry PiにMIDIオーディオを演奏させる
2. MIDIキーボードを接続し、1のオーディオを伴奏として演奏する
3. 演奏しながら音色や伴奏の種類を変更できる

簡単なシーケンサだと思ってもらえればいいです。

# 必要な機能を列挙する
1. MIDIファイルの解析
2. オーディオ出力
3. MIDIインターフェースのコントロール
4. スイッチのコントロール

# 実現する方法を考える
今回の開発デバイスの中核として [FluidSynth](http://www.fluidsynth.org/) を選びました。
FluidSynthはオープンソースのソフトウェアシンセイザーで、これを選択した理由は次の通りです。
1. コンソールベースで動作する
2. 動作が軽い
3. 起動後にコンソールでインタラクティブに、音量・音色の変更などの操作ができる

FluidSynthを核として、不足した機能を実現する方法を考えます。
1. 接続するMIDIインターフェースとFluidSynthを中継するMIDIインターフェースエミュレータを実装する
2. MIDIファイルを読み取り、エミュレータからMIDI信号をFluidSynthに流す
3. MIDIインターフェースから信号を読み取り、FluidSynthに流す
※MIDIインターフェースエミュレータはMIDIインプット、MIDIアウトプットの両方を実装します。

この時点の（想定）システム図

![MKT.png](https://qiita-image-store.s3.amazonaws.com/0/256650/b9185e55-2481-65a6-163f-de1eb48b2f38.png)


# 実装する
MIDIインターフェースエミュレータを作成するために[RtMidi](https://www.music.mcgill.ca/~gary/rtmidi/)というライブラリを使います。
このライブラリを使いたいため、言語はC++を使うことにしました。

実際のコードは第2回に続きます。

# ここまでの振り返り
ここまでの流れはRFLPという開発の流れに沿っています。
R: Requirement
F: Function
L: Logic
P: Physical(, Program, Product, ...)
開発の経験が多い人ほど、この流れが早く頭のリソースを使わずにこなせます。
特に今回は、MIDIへの理解が浅く、FluidSynthを核にするという方法に確定するまでにたくさんの試行錯誤を繰り返しました。

### ナビ
|前|次|
|:---|---:|
|なし|[RtMidiライブラリを使って、MIDIインターフェースを作成する](https://qiita.com/ixsiid/items/dfd093732d05260ed174)|
Vue.jsとaxiosを使用してWordpressの記事一覧を取得する

# はじめに
企業サイトなどは通常静的に作成することが多いですが、
新着情報やリリースノートなどはWordpressで運用することが多いです。

トップページにその一覧を表示する際は、PHPで呼びだすことが一般でしたが、
Wordpress 4.7 からWP REST APIが標準装備されました。

しかしPHPで書くとWordpressの余分なリクエストを受けてしまい、レスポンスが低下します。
WP REST APIを使用してレスポンスをあげつつ一覧を呼びだしてみたいと思ったので試してみました。
# 使用したライブラリ
* [Vue.js](https://jp.vuejs.org/index.html)
* [axios](https://github.com/axios/axios)

# 作成工程
## コンポーネントの作成
Wordpressのカスタム投稿などを駆使して複数のブログコンテンツを作成する案件がほとんどです。
そのためコンポーネントを作成して、再利用可能なコードを用意します。

今回エラー時のハンドリングを記述していませんので、実運用の際はその処理を追加する必要があります。

```javascript:main.js
Vue.component('testAxios', {
  props: ['theUrl'],
  data () {
    return {
      info: '',
    }
  },
  mounted () {
    axios
      .get(this.theUrl)
      .then(response => (this.info = response.data))
  },
  template: `<article>
    <section v-for="item in info">
      <h2>{{ item.title.rendered }}</h2>
      <p v-html="item.excerpt.rendered"></p>
      <time>{{ item.date.slice(0, 10) }}</time>
    </section>
    </article>`,
});
```

## 呼びだすAPIのURLを定義
呼びだすAPIのURLについては[WP REST APIのサイト](https://ja.wp-api.org)をご覧ください。

```javascript:main.js
new Vue({
  el: '#app',
  data: function() {
    return {
      theUrlAlpha: 'http://example.com/wp-json/wp/v2/posts?per_page=3',
      theUrlBravo: 'http://example.com/wp-json/wp/v2/posts?per_page=6',
    }
  },
});
```

## HTML側の記述
コンポーネントを記述して、そのコンポーネントに表示させたいAPIを紐付けます。

```html:index.html
<div id="app">
  <test-axios :the-url='theUrlAlpha'></test-axios>
  <hr>
  <test-axios :the-url='theUrlBravo'></test-axios>
</div>
```

# まとめ
無事に呼びだすことができました。
これで純粋な静的ページとさせながらも、動的に記事一覧を取得させられます。

JavaScriptに不慣れなため不備が見受けられるかもしれません。
不備や改善点がございましたらご指摘いただけますと幸いです。
Swiftを使用してデザインパターンまとめ 3.Template Methodパターン

# はじめに

この投稿は [増補改訂版 Java言語で学ぶデザインパターン入門](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797327030/ref=pd_lpo_sbs_14_t_0/356-3204401-9680611?_encoding=UTF8&psc=1&refRID=SP1KH4HSA304JZVG7WZT) に沿って学んだことを章ごとにまとめるものです．
今回は第3章 Template Method についてまとめます．

# Template Method とは

## Template Methodってどんなパターン？


* スーパークラス側で抽象メソッドを定義
* スーパークラス内で抽象メソッドの呼び出し方を定義 <- ここが「テンプレート」に相当します
* サブクラスごとに抽象メソッドを定義

## 何が嬉しいの？

* 大まかな処理の流れを共通化できる
* 処理の中身は違う，流れは共通な処理を呼び出せる
* 大まかの処理の流れの順番等に変更が生じた場合，簡単に修正できる

## 注意すること

* メソッドの呼び出され方はスーパークラスに実装されているのでスーパークラスの実装を意識する必要がある
* サブクラスが量産されたりするので， Template Method パターンにこだわりすぎないように注意


# 実装例

## 目的

今回は顔文字を出力するためのクラスを作成します．

今回はスーパークラスとして `Protocol` を使用しました．

## 実装

### Emoticon プロトコル

顔文字を出力するために必要なメソッドやプロパティを定義したプロトコル

```swift:Emoticon
protocol Emoticon {
    /// 顔の文字列 (例: "^o^")
    var face: String { get }
    /// 顔の文字列で初期化
    init(face: String)
    /// 顔の左側の文字列 (例: "\(")
    func makeLeftSide() -> String
    /// 顔の右側の文字列 (例: ")/")
    func makeRightSide() -> String
    /// 顔文字の表示 (上記の例では "\(^o^)/" が表示される)
    func printEmoticon()
}
extension Emoticon {
    /// 顔文字の表示メソッドの実装
    func printEmoticon() {
        // プロトコルで定義されたまだ中身のないメソッドを使用して顔文字を作る
        // ここがテンプレート部分にあたる
        let emoticon = makeLeftSide() + face + makeRightSide()
        print(emoticon)
    }
}
```

### Normal クラス

基本的な `()` で囲まれた顔文字用のクラスです．


```swift:Normal
final class Normal: Emoticon {
    let face: String
    required init(face: String) {
        self.face = face
    }
    func makeLeftSide() -> String {
        return "("
    }
    func makeRightSide() -> String {
        return ")"
    }
}
```

### Crab クラス

`v()v` で顔を囲まれた顔文字用のクラスです．
かにクラスってなんかテンション上がりません？(？)v(`･ω･´)vかに
実装は Normal クラスと同じです．

```swift:Crab
final class Crab: Emoticon {
    let face: String
    required init(face: String) {
        self.face = face
    }
    func makeLeftSide() -> String {
        return "v("
    }
    func makeRightSide() -> String {
        return ")v"
    }
}
```

## 動作確認

実装は以上です．
実際に Normal クラスと，かにクラスにシャキーンの顔を渡してみます．

```swift
Normal(face: "`･ω･´").printEmoticon()	// (`･ω･´)
Crab(face: "`･ω･´").printEmoticon()	// v(`･ω･´)v
```

このように，同じ `printEmoticon()` メソッドを呼んでおり，スーパークラス(今回はプロトコル)の中身も同じですが， `makeLeftSide()` と `makeRightSide()` の実装が異なるため，違う内容が出力されました．

# まとめ

今回は Template Method パターンをまとめました．

## Template Method の形

### AbstractClass (抽象クラス) 役

今回は `Emoticon` プロトコルがこの役をしました．
サブクラスで定義する抽象メソッドの呼び出し方や大まかな流れをここで定義しました．

### ConcreteClass (具象クラス) 役

今回は `Normal` クラスと，かにクラスにあたります．
それぞれの `Emoticon` プロトコルに呼び出されるメソッドを実装しました．

## クラス図
![TemplateMethod.png](https://qiita-image-store.s3.amazonaws.com/0/196051/c9cebd25-7b5a-2029-f589-e452d407b7aa.png)

## 思ったこと

* 基本の基本，という感じの考え方だと思います，自然に使っていきたい．
* 継承の形を使用するので， `templateMethod` 内でのみ使用したいメソッドを抽象メソッドとして定義するべきではなさそう． (そういう意味では今回の実装例はあまりよろしくない)
    * 単体でも使う想定のメソッドを抽象メソッドとして定義するべき (クラスの外から呼び出すことができてしまうため)
docker-composeを爆速にする

_※ 色々修正しました_

Rails開発等でdocker-composeを使うと非常に遅い場合があります（特にDocker For Mac）。
docker-compose時に余計なファイルをマウントしてしまってるのが原因らしいので、`.git`, `log`, `tmp`, `vendor` などのホストからマウントする必要のないディレクトリを別のvolumeでマウントを上書きしてしまえば解消されます。

具体的な `docker-compose.yml` は以下のようになります（Railsの例）

```yml
version: '3'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile.dev
    environment:
      RAILS_POSTGRES_HOST: db
    ports:
      - "3000:3000"
    volumes:
      - .:/app:cached
      - bundle:/usr/local/bundle:cached
      # 1. exclude volumes
      - /app/vendor
      - /app/tmp
      - /app/log
      - /app/.git

    links:
      - db
  db:
    image: postgres:9.6
    environment:
      POSTGRES_USER: root
      POSTGRES_PASSWORD: password
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data:cached
volumes:
  bundle:
    driver: local
  pgdata:
    driver: local
```

`1. exclude volumes` で指定しているようにAnonymous VolumeでVolumeを上書きすると、該当Volumeは永続化されなくなります。

これでDocker For Macマウント遅い問題は8割方解消できました。
もっと良いやり方などあればコメント等で教えて頂けると幸いです。
Gitの使い方メモ

#リポジトリ作成

#git-flowの準備
##developブランチの作成

##初期化
リポジトリ->Git flow->リポジトリの初期化

#開発
##新規フィーチャー作成

1. developにリベース<br>
1. リポジトリ->Git flow->次のアクション<br>
『新規フィーチャーを開始』
フィーチャー名にはチケット番号を入れる。
1. プッシュ<br>
念のため、先にプッシュ。
1. 修正/追加など作業
1. コミット
1. プッシュ<br>
念のため、修正したブランチのみプッシュ。
1. プルリクエストを作成
1. マージ先は開発ブランチの『develop』
2. マージ(この作業は責任者)
3. フィーチャーの終了<br>
リポジトリ->Git flow->次のアクション<br>
『現在のブランチを終了』<br>
『ブランチを残す』
1. フェッチ
2. プル

#リリース

1. リポジトリ->Git flow->新規リリースを開始<br>
最新の開発ブランチ
2. リポジトリ->Git flow->次のアクション
3. 『master』ブランチをプッシュ
githubでリモートへの初回pushでよく手間取る

# 概要
久々にリポジトリを作った時に、あれ、前どうやってpushの設定したっけ。。。となるのでメモ。

# 本題
自分のなかで　よく遭遇するうまくいかないポイントはちゃんとリモートを追加できていないこと。以下のコマンドを実行すればリモートが表示されるのだが、表示されない。

```
git remote -v
```

表示されないなら、設定されていないってことだよね、じゃあ`git remote add`でリモートの設定をすれば良いじゃん？と安直な考えから、以下のことをするとエラーが出てしまってうまく設定できない。

```
$ git remote add origin https://github.com/[アカウント名]/[レポジトリ名].git
> fatal: remote origin already exists. <-こんなこと言われる
```

この際に、`add`ではなく`set-url`にするとリモートを追加することができる。

```
$ git remote set-url origin https://github.com/[アカウント名]/[レポジトリ名].git
```

この後にpushをすることでようやく初回pushができる。

```
git push -u origin master
```
NanoPIのセルフ環境でKernel Build

# はじめに
NanoPI, RasPIでKernelを再構築するのはクロス環境を使う方が一般的ではないかと思われますが、負荷試験として、あるいはLinux母艦を持っていない等で、NanoPI自身でBuildする時の手順をまとめてみました。
Armbian (debian)の場合です。

# Sourceの入手と展開
[kernel.org](https://www.kernel.org)にいきtar.gzのURLをコピーします。最新よりLTSの最新版のが普通はいいですね。ここでは4.14.40で行ってみます。
まずtara termまたはsshでNanoPIに繋ぎ

```
cd /usr/src
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.40.tar.xz
tar xf linux-4.14.40.tar.xz
ln -s linux-4.14.40 linux
```
とします。
別にリンクを張らなくてもよいですが、/usr/src/linuxにカーネルがあるというのは伝統的定位置ですので。

# 環境をセットする

```
cd /usr/src/linux
zcat /proc/config.gz > .conf
apt install bc bison flex ncurses
make oldconfig
make menuconfig
```

# Build する

```
make -j4
make install
```
# ここまで
ここから先、u-bootが新しいカーネルを起動できるようにするのですが、まだできていません。
Vue.js備忘録

公式サイトを自分用にまとめたものです。
https://jp.vuejs.org/v2/guide/index.html

##宣言的レンダリング
```
<div id="app">
  {{ message }}
  <input v-model="message">
</div>
```
```
var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  }
})
```
##コンポーネントによる構成

##インスタンスライフサイクルフック
> 例えば、created フックはインスタンスが生成された後にコードを実行したいときに使われます。

![lifecycle.png](https://qiita-image-store.s3.amazonaws.com/0/237046/809dd34f-4ded-dee7-b4eb-d31b0197f1d1.png)

##コンポーネントの基本
```
// button-counter と呼ばれる新しいコンポーネントを定義します
Vue.component('button-counter', {
  data: function () {
    return {
      count: 0
    }
  },
  template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>'
})
```
```
<div id="components-demo">
  <button-counter></button-counter>
</div>
```

外部の.vueファイルを呼び出す場合は以下のよう書くことができる。
```
import Test from './components/Test.vue'
Vue.component('test', Test);
```
文字列の繰り返しをシンプルに書きたい

```python
def repeat(str, n):
    return str * n 
```

文字列の内容をn回だけ繰り返した新しい文字列を生成したいという場合、Pythonでは上の例のように書くことができます。つまり`*`演算子が文字列を繰り返す機能を有しているのですが、同様のことをJavaで実現するとなると、次のようなメソッドを定義することが多いと思います(nullチェックなどは省略)。

```java
public static String repeat(String str, int n) {
  var sb = new StringBuilder();
  while(n-- > 0) sb.append(str);
  return sb.toString();
}
```

別にこれでかまわないといえばそのとおりなのですが、Pythonでは1行で書けるのにJavaでは書けないというのは悔しい(謎)。そこでJavaで文字列の繰り返しをシンプルに書く方法をよく考えるのですが、個人的にまず思いつくのが`Stream`を使う方法。

```java
public static String repeat(String str, int n) {
  return IntStream.range(0, n).mapToObj(i -> str).collect(Collectors.joining(""));
}
```

確かに1行にはなったものの、1行にするためにややトリッキーな書き方をしている印象も受けます。よりシンプルにすべく、いろいろ調べる中で思いついたのが以下の方法。

```java
public static String repeat(String str, int n) {
  return String.join("", Collections.nCopies(n, str));
}
```

より短く、よりシンプルになりました。短くするためにトリッキーなことをするという感じもありません。`Collections.nCopies`がリストを生成するため、そこだけ気にしつつ、積極的に使っていきたいと思います。

Apache Commons Langの`StringUtils.repeat`を使えばいいっていうのはいいっこなし(´・ω・｀)
TensorFlowは、Windows(32bit)環境上では動かないがWindows(64bit)では動く

#TensorFlowは、64bit環境でしか動きませんよ！
人工知能について、ぐぐったら、TensorFlowというフレームワークが出ているらしいよというので早速ダウンロードしに行く。もちろんWindows版です。うちは若い頃のように複数ＰＣ持てなくなったのでWindowsですよ。
しかしここで見逃していた。下図の赤枠64bitを！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/256838/6273c1a2-3401-05f3-fd93-193a8620938f.png)

この時点で、Winodowsを使っているユーザーで32bitユーザーは、諦めるしかない。
すぐに、PC上のOSを64bitに変更するようにOSの再構築が必要だ。

ちなみにうちの環境は、幸いWindows7(64bit)だったので問題は無いのだが、上に書いたように見逃していた。
TensorFlowのダウンロードサイトに記載があるようにAnacondaと一緒に環境構築することが楽そうなので、Anacondaもダウンロードすることにする。しかしこの時点でもまだ64bitを意識していないので、Anacondaを32bitでダウンロードしてしまう。
(過去の俺よ、待て！　それは、間違っている。TensorFlowは64bitなんだぞ。)

#以下は、間違ったダウンロードからリカバリまで

TensorFlowを使いたい人は、決してAnaconda 32bitをダウンロードしてはいけない。何度も言うが、TensorFlowは、環境が64bitじゃないとインストールすら出来ない。
[Download Anaconda Distribution](https://www.anaconda.com/download/)

- (1)Anaconda 32bit版をダウンロード(間違い始まり）
- (2)Anaconda 32bit版インストール（間違い中）
- (3)TensorFlowのインストール（間違いに気づく）
当然、TensorFlowのインストールが途中でこける。
冒頭の箇所をよく読む。64bitということに初めて気づく。

- (4)Anaconda 32bit版をアンインストール（間違いリカバリ中）
- (5)Anaconda 64bit版をダウンロード（間違いリカバリ中）
- (6)Anaconda 64bit版をインストール（間違いリカバリ中）
- (7)TensorFlowの再インストール（リカバリ成功）
成功する。

#ほんじゃまとめ
TensorFlowの環境を整えるためには下記の準備をしましょう。
-OSは64bitが必要。OSがWindowsの人は64bit化しておきましょう。
-Anacondaで環境作る人は、Anacondaも64bit版をインストールしましょう。
-TensorFlowは、最初に書きましたが64bit環境じゃないとインストールできません。

#後日談
会社のPCでTensorFlow環境構築しようぜと思ったが残念な事に会社のPCのOSがWindowsで32bitだった。64bitOSにするには手続きで時間が掛かる上に説明が大変なのであきらめています。
仕方ないからPythonだけ入れました。フレームワークに頼るよりは、例のこの本で１からじゃなくてゼロから勉強するのもいいかも。

<a target="_blank"  href="https://www.amazon.co.jp/gp/product/4873117585/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873117585&linkCode=as2&tag=httblosone04a-22&linkId=ac1f59ebcb161daea36a368e8970c7e5"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4873117585&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=httblosone04a-22" ></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=httblosone04a-22&l=am2&o=9&a=4873117585" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
Androidの端末のCPUアーキテクチャを調べる

#Introduction
Androidでどうしてもバイナリを使わなければならない場合、CPUのアーキテクチャ決定が必要となることでしょう。ところが、日本語の文献を見つけること能わずだったので、書きました。そもそも、現代のAndroidアーキテクチャでは、armv7(32Bit),arm64(64bit)が主流です、まれにAtomやmips、armelもありますが、、、
とりあえず、仮想マシンと一般的なスマホが区別できるのがいい思います。

#Practice

```java
	List arch = getSupportedABIs();
	System.out.print("Arch:"+arch.toString());
	if (String.valueOf(arch).contains("arm64")) {
		System.out.print("This architecture may be arm64(64Bit)");
	}else if(String.valueOf(arch).contains("v7")){
		System.out.print("This architecture may be armv7(32Bit) ");
	}else if(String.valueOf(arch).contains("x86_64")){//仮想マシン
		System.out.print("This architecture may be Virtual Machine(64Bit) ");
	}else if(String.valueOf(arch).contains("x86")){//仮想マシン
		System.out.print("This architecture may be Virtual Machine(32Bit) ");
	}else{
		System.out.print(" Architecture is not detected ");
	}


//////////

	public static List<String> getSupportedABIs() {
		if (Build.VERSION.SDK_INT >= 21) {
			return Arrays.asList(Build.SUPPORTED_ABIS);
		} else {
			return Arrays.asList(Build.CPU_ABI, Build.CPU_ABI2);
		}
	}
```


これでさばけるはずなのですが、アーキテクチャ名が妙だとおかしな振る舞いをするかもしれません。


#Reference
https://stackoverflow.com/questions/15025353/arm-runtime-cpu-type-detection
http://metalkin.tistory.com/81
CentOS7でselenium、Chrome Web Driveのインストール方法


Cent OS6ではうまく行かなかったのでCent OS7での設定になります。


##chromeをインストールする
vim /etc/yum.repos.d/google.chrome.repo

```
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
```

あとはyumでインストール

```
yum update
yum install google-chrome-stable
sudo yum install -y libOSMesa google-noto-cjk-fonts
```

libOSMesaはクラッシュ防止
google-noto-cjk-fontsはフォント


##seleniumをインストールする
centOSの場合はpyvirtualdisplayも入れる

```
pip install selenium
sudo pip install pyvirtualdisplay
```

pipがない場合は入れる

```
yum -y install python-devel
yum -y update
yum -y install python-pip
```

これでセットアップ完了

###エラーと対処法

途中で発生したエラーとその対処法です

```
selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH.
```

which chromedriver
でパスを見つけて、
browser = webdriver.Chrome(executable_path='Chromedriverがあるパス')
でパスを指定してあげる 

```
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally
```

chromedriverのバージョンが古くないか確認
yum update
参考：
https://sites.google.com/a/chromium.org/chromedriver/downloads

```
selenium.common.exceptions.WebDriverException: Message: chrome not reachable
```

このメッセージが出る場合はchromeのプロセスだらけになっている可能性があるので

```
ps aux | grep chrome
```

で確認

```
killall chrome
killall chromedriver
```

コマンドでプロセスを終了する
また、webdriverを動かしているコードにquit()を書いて終わらせる。close()ではプロセスは終了しないので注意。
WOWhoneypotのURI調査

1日ごとに見たことがないURIがあるか調査したい。
そんな思いから、とてつもなく簡単なコードを書いた。

#uri.sh
スクリプトしては、わずか2行です。
ago変数に前日の月日を文字列として渡してあげます。
5月13日に実行したら、「05-12」の文字列が返ってきます。
その後、該当文字列でgrepし、awkでURIだけを抽出し、ユニークにしてURLデコードしてあげます。


```uri.sh
#!/bin/bash
ago=`date "+%m-%d" -d '1 day ago'`
grep $ago log/access_log.txt | awk {'print $5"\t"$6'} | nkf -w --url-input  | sort | uniq > uri/$ago.txt
```

#crontab
毎日午前0時になったら、uri.shを実行したい。そんな時は、crontab -eコマンドを使用し、以下の１行を追加します。

```
0 0 * * * /tmp/wowhoneypot/uri.sh
```

#最後に
commコマンドを使って、前日との差異を表示させる。
例えば、comm -23 05-12.txt 05-11.txtとか。
知ってるURIをまとめておいて、同じだったら見ないとかするともっと効率的に見れそう。
WSL上でlatexmkを使う

# 何をするか
WSL (Windows Subsystem for Linux)において```latexmk```を使えるようにします。Vimと最終的には連携させたい(Future Plan)。いろいろなサイトを参考にしてやってみたがエラーが出て苦労したので、解決方法をまとめておく

# 環境
* Windows10 64bit
* W32TeX

# 手順
W32TeXをWindowsで使っていたので```latexmk```自体はもともと入っています。これをWSLで使えるようにパスを通すなどします。bash上で```vim ~/.profile```と押して```.profile```を開きます。そして以下のようにパスを追加していきます。

```bash:~/.profile
export PATH=$PATH:/mnt/c/w32tex/bin　　　　
export PATH=$PATH:/mnt/c/w32tex/share/texmf/tex/latex
```
右辺の値は人によって違うかもしれません。ここから```latexmk```のための設定をしていきます。

まず```.latexmkrc```という```latexmk```のための設定ファイルを編集します。これはいろいろなサイトに書き方が書いてあります。

* [latexmkとquickrun.vimを使ってVimでLaTeXを書く](https://ksmzn.hatenablog.com/entry/latexmk-quickrun-vim)
* [VimでLaTeX編集！vim-quickrunとlatexmkで自動コンパイルと部分コンパイル](https://qiita.com/ssh0/items/4aea2d3849667717b36d)

最初はこれを参考にして書いてみたのですが、"platex not found"のエラーが。```platex```にはパスを通したはずなのでこのエラーはなぜ起こるのか最初わかりませんでした。

このエラーの原因はWSLだと見落としがち（？）のもので、Windowsのプログラムを実行するには　```platex```だけでは不十分で、最後に```.exe```をつけなければいけなかったのです。これを直したらちゃんと通るようになりました。

```bash:~/.latexmkrc
$latex            = 'platex.exe  -kanji=utf8 -synctex=1 -halt-on-error';                                                                                              $latex_silent     = 'platex -synctex=1 -halt-on-error -interaction=batchmode';
$bibtex           = 'pbibtex';
$dvipdf           = 'dvipdfmx.exe %O -o %D %S';
$makeindex        = 'mendex %O -o %D %S';
$max_repeat       = 5;
$pdf_mode   = 3; #dvipdfmxを使ってPDF生成
```
今は```latexmk```を使ってVimの```quickrun```プラグインでLaTeXのコンパイルをできるように頑張っていますが、コンパイルするとファイルが見つからないというエラーが出て途方に暮れています。解決したら、もしかしたら記事にするかもしれません。
Scalaの勉強(2)

#ScalaのList
Scalaには多様なコレクションクラスが用意されており、コレクションはインスタンスを格納するコンテナです。

今回はListについて学んだ事をメモ代わりにいくつか書いていこうと思います。

##List
```Scala
val x = List(1,2,3)

println(x)
// List(1, 2, 3)
```

Listの先頭を取得する

```Scala
val x = List(1,2,3,4)

println(x.head)
// 1
```
Listの最後を取得する

```Scala
val x = List(1,2,3,4)

println(x.last)
// 4
```

Listの先頭を除いたListを取得する

```Scala
val x = List(1,2,3,4)

println(x.tail)
// List(2, 3, 4)
```

Listの先頭に要素を付け加えたListを取得する

```Scala
val x = List(1,2,3,4)

val y = 5 :: x

println(y)
// List(5, 1, 2, 3, 4)
```

Listの最後に要素を付け加えたListを取得する

```Scala
val x = List(1,2,3)
    
val y = x :+ 99
    
println(y)
// List(1, 2, 3, 99)
```

Listを連結する

```Scala
val x = List(1,2,3)

val y = List(97,98,99)

println(x ::: y)
// List(1, 2, 3, 97, 98, 99)
```

Listの長さを求める

```Scala
val x = List(1,2)

println(x.length)
// 2
```

filter関数を使用し、Listから2で割り切れるものだけを取得する

```Scala
val x = List(1,2,3,4,5,6,7,8,9,10)

println(x.filter(a => a % 2 == 0))
// List(2, 4, 6, 8, 10)
```
homebrewを使用したGitのインストール

# homebrewを使用したGitのインストール

homebrewでGitをインストールをしていきます。

## ①Gitのインストール

まずは、以下のコマンドを実行してGitをインストールします。

```
$ brew install git
```

以下のコマンドを実行してGitのバージョンが更新されたか確認します。

```
$ git --version
```

## Gitの初期設定

次のコマンドを実行して「ユーザ名」および「メールアドレス」を登録します。
登録しておかないと、Git使用時にエラーが出ます。

```
$ git config --global user.name "[ユーザ名]"
$ git config --global user.email [メールアドレス]
```

次のコマンドでGitの出力結果に色をつけます。
下記コマンドは好みですが、カスタマイズもできます。
見やすいため、設定しておくことを推奨します。

```
$ git config --global color.ui true
```

最後に設定した内容を以下のコマンドで確認します。

```
$ git config --list
```

上記で設定した、「ユーザ名」、「メールアドレス」、「色設定」が反映されていることを確認したら終了です。


Gitのインストールだけだったので、エラーもなく簡単にできました。
チュートリアル２章

2.1 アプリケーションの計画
↓
↓
source 'https://rubygems.org'

gem 'rails',        '5.0.3'
gem 'puma',         '3.9.1'
gem 'sass-rails',   '5.0.6'
gem 'uglifier',     '3.2.0'
gem 'coffee-rails', '4.2.2'
gem 'jquery-rails', '4.3.1'
gem 'turbolinks',   '5.0.1'
gem 'jbuilder',     '2.7.0'

group :development, :test do
  gem 'sqlite3', '1.3.13'
  gem 'byebug',  '9.0.6', platform: :mri
end

group :development do
  gem 'web-console',           '3.5.1'
  gem 'listen',                '3.0.8'
  gem 'spring',                '2.0.2'
  gem 'spring-watcher-listen', '2.0.1'
end

group :production do
  gem 'pg', '0.20.0'
end

# Windows環境ではtzinfo-dataというgemを含める必要があります
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]


でbundle install --without production
するもエラー
↓
↓
↓
korosuke:~/workspace/toy_app $ bundle install --without production

[!] There was an error parsing `Gemfile`: You cannot specify the same gem twice with different version requirements.
You specified: sqlite3 (>= 0) and sqlite3 (= 1.3.13). Bundler cannot continue.

 #  from /home/ubuntu/workspace/toy_app/Gemfile:40
 #  -------------------------------------------
 #    # Call 'byebug' anywhere in the code to stop execution and get a debugger console
 >    gem 'sqlite3', '1.3.13'
 #    gem 'byebug', '9.0.6', platform: :mri
 #  -------------------------------------------


↓
↓　解決策
↓

チュートリアルに書いてるgemfileをコピペして保存後に
bundle update

解決。
Rのapply 関数でnumeric・Factor が混在するデータフレームを扱う際のエラー

R の `apply` 関数で、データ型が混在するデータフレームを扱う際にハマったのでメモ。

# apply() 関数 の概要
[![Rdoc](http://www.rdocumentation.org/badges/version/base)](http://www.rdocumentation.org/packages/base) を参照。

## 説明
`array` や `matrix` のマージンに関数を適用して得られる値の `vector` か `array` か `list` を返す。

## 使い方
`apply(X,MARGIN, FUN, ...)`

## 引数
* `X`
    * `arary` や `matrix` 
* `MARGIN`
    * 関数が適用される対象（次元）を指定する。
    * 例えば、`X`が`matrix`の場合、MARGIN=1 で行ごと、 MARGIN=2 で列ごと、MARGIN=c(1,2) は各要素ごと に関数を適用させることを表す。
* `FUN`
    * `MARGIN` で指定した対象に 適用させる関数

### 例
```R
> x = matrix(1:9,3,3,dimnames=list(c("row1","row2","row3"), c("col1","col2","col3")))

> apply(x,1,sum)
row1 row2 row3 
  12   15   18 

> apply(x,2,sum)
col1 col2 col3 
   6   15   24 

> apply(x,c(1,2),sum)
     col1 col2 col3
row1    1    4    7
row2    2    5    8
row3    3    6    9
```

## 参考資料
[ベクトル、行列、データフレーム、リスト、配列、テーブルの違い](https://cell-innovation.nig.ac.jp/surfers/vector_difference.html)


# エラーの経緯
データフレームを用意する。

```R
> a = data.frame(x1=c(1,2,3),x2=c("aaa","bbb","ccc"))
> b = data.frame(x1=c(1,2,3),x2=c(4,5,6))
> a
  x1  x2
1  1 aaa
2  2 bbb
3  3 ccc
> b
  x1 x2
1  1  4
2  2  5
3  3  6
```

`str` 関数でデータフレームの内容を確認する。
`a` は データ型 `numeric` と `Factor` のカラムを持っている。
`b` は データ型 `numeric` と `numeric` のカラムを持っている。

```R
> str(a)
'data.frame':	3 obs. of  2 variables:
 $ x1: num  1 2 3
 $ x2: Factor w/ 3 levels "aaa","bbb","ccc": 1 2 3
> str(b)
'data.frame':	3 obs. of  2 variables:
 $ x1: num  1 2 3
 $ x2: num  4 5 6
```

apply 関数を適用する。

```R
> apply(a, 2, mean)
x1 x2 
NA NA 
Warning messages:
1: In mean.default(newX[, i], ...) :
   引数は数値でも論理値でもありません。 NA 値を返します 
2: In mean.default(newX[, i], ...) :
   引数は数値でも論理値でもありません。 NA 値を返します 
> apply(b, 2, mean)
x1 x2 
 2  5 
```

`numeric` カラムだけの `b` では、想定通り列ごとの平均を求めることができている。
`a` は `numeric` のカラム `x1` に 「引数は数値でも論理値でもありません。」のエラーが出ている。何故…？

# 原因
apply 関数は、2次元のオブジェクトを与えるとまず `as.matrix` によって `array` に強制的に変換しようとする。

`array` は 単一のデータ型 だけしか持つことができないため、複数の型が混在したオブジェクトを扱う場合は
強制的な型変換が実行される。これを coercion という。

型の間には以下の大小関係が存在し、「大きい」型に合わせてデータ型の変換が行われてしまう。
`Logical < Integer < Numeric < Character`

そのため、データフレーム `a` は `as.matrix` によって 全て `Character` 型のデータに変換されてしまう。

```R
> as.matrix(a)
     x1  x2   
[1,] "1" "aaa"
[2,] "2" "bbb"
[3,] "3" "ccc"
```

`Character` 型には `mean` を適用することはできない。

```R
> c = c("a","b","c")
> c
[1] "a" "b" "c"

> str(c)
 chr [1:3] "a" "b" "c"

> mean(c)
[1] NA
 警告メッセージ: 
 mean.default(c) :   引数は数値でも論理値でもありません。 NA 値を返します
```

以上が、`numeric` と `Factor` が混在したデータフレームに、`apply` 関数を使って `mean` 関数を適用すると
エラーが出てしまう原因であった。
Cntlmを使ってNTLMv2認証Proxy環境をやっつける

#概要
* NTLMv2認証ProxyはLinuxやクロスプラットフォームなアプリと相性が悪い
* 間にCntlmを噛ませて認証を代行してもらうことで解決する

# Cntlmとは
認証Proxyへの認証を代行してくれるものです。対象サーバーへの認証情報を記憶させておくと、CntlmをProxyとして指定することで通信を中継＆勝手に認証をしてくれるもよう。
http://cntlm.sourceforge.net/

Linux以外にもWindows版もあり、そちらはWindowsサービスとして動作するようです。

## 導入方法
### インストール
* Windowsでは上記Urlからインストーラexeをダウンロードして導入する
* Linux(Ubuntu)では以下のコマンドで取得、または上記urlから取得

```bash
sudo apt install cntlm
```

### 設定ファイルの編集
* Windowsではインストールフォルダ内にあるcntlm.iniを編集する
* Linuxでは```/etc/cntlm.conf```

```bash
Username        <ユーザー名>
Domain          <ドメイン名>
Password        <パスワード>

Proxy       <プロキシサーバー名 or IPアドレス>:<ポート>
Listen      <自分の待ち受けポート（デフォルト：3128）>
```

### テスト実行
* Windowsではcntlmインストールフォルダでコマンドプロンプトを起動
* Linuxではコンソールより以下

```bash
cntlm -I -M http://www.google.co.jp
```
* Passwordを聞かれるので、設定にも記載したproxy認証パスワードを入力する
* 成功すると以下の文字列が応答される

```bash
----------------------------[ Profile 0 ]------
Auth NTLMv2
PassNTLMv2 <認証ハッシュ>
------------------------------------------------
```

* ここの2行の文字列をコピーして、さきほどの設定ファイルの末尾に追記する

### 起動
* Windowsの場合はCntlm Authentication Proxyサービスを起動する
* Linuxの場合はCntlmサービスを再起動する

```bash
sudo service cntlm restart
```

### 設定
あとは各アプリでのProxyに以下の内容を設定するだけ（設定ファイルのListenを3128に設定している場合）

```bash
http://localhost:3128
```

これでaptもnpmもcurlも、Windows上でのeclipseも問題なく接続できるように。

### 余談
localhostじゃなくて社内ネットワーク上にこっそりcntlmを導入した環境を構築しておいて、みんなProxyでそちらを指定すれば幸せになるのでは……と思ったけどユーザー認証の意味がなくなるから管理側に怒られますね。

#### 参考
[Cntlmを使いNTLM proxy環境下でもnpmを使いたい](https://opcdiary.net/?p=30377)
[[Windows]Forefront TMGのNTLM認証プロキシをCntlmでなんとかする](https://sevenb.jp/wordpress/ura/2016/01/27/windowsforefront-tmg%E3%81%AEntlm%E8%AA%8D%E8%A8%BC%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%82%92cntlm%E3%81%A7%E3%81%AA%E3%82%93%E3%81%A8%E3%81%8B%E3%81%99%E3%82%8B/)
[CNTLMでプロキシ設定する](http://cobachie.hatenablog.com/entry/2015/07/21/104121)
[Ubuntuのproxy設定まとめ](http://dragstar.hatenablog.com/entry/2015/03/21/130333)
3分でわかるMyBatis -MyBatis vs Hibernate-

#想定読者
- MyBatisという言葉を聞いたことがあるが何者なのか知らない方
- MyBatisを使っているが他と比べて何が違うか知らない方

#MyBatisとは何か
[mybatis.org](http://www.mybatis.org/mybatis-3/ja/index.html)にはこう書かれています。
>MyBatis はカスタム SQL、ストアドプロシージャ、高度なマッピング処理に対応した優れた<font color="red">永続化フレームワーク</font>です。

##永続化とは何か
[Hatena](http://d.hatena.ne.jp/keyword/%B1%CA%C2%B3%B2%BD)に聞いてみました。
>ファイルやDBなど、プログラム終了後もデータが失われないような場所へのデータ保存を指す

オブジェクト指向プログラミングでは、あるクラスのインスタンスを生成し、メソッドを呼び出すことで特定の処理を実行します。例えば、ショッピングサイトであれば、注文やキャンセルなど様々な処理が考えられます。

当然のことならが、各処理の記録をデータとして長期的に記録する必要が出てきます。
しかし、<font color="red">インスタンスは主記憶装置上に生成されるため、プログラムの終了とともにその内容は消えてしまうのです。</font>ゆえに、プログラムで実行された処理内容をデータベースに保存する処理（永続化）が必要となります。

##結局MyBatisとは何か
私なりにまとめると以下のようになりました。
**オブジェクト指向言語におけるオブジェクトとデータベースに関する処理との対応づけを容易にする便利ツール**

このようなフレームワークのことをO/Rマッパーといいます。

##O/Rマッパーとは何か
O/RマッパーとはO/Rマッピングを実現するライブラリやフレームワークのことです。
[weblio](https://www.weblio.jp/content/O/R%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0)に聞いてみました。
>**O/Rマッピングとは、オブジェクト指向言語におけるオブジェクトと、リレーショナルデータベースにおけるレコードとを対照させることである**。ここでの「マッピング」とは「対応付ける」というほどの意味である。

>O/Rマッピングによって、リレーショナルデータベースのレコードがオブジェクトとして直感的に扱えるようになり、リレーショナルデータベースにアクセスするプログラムを記述する処理を容易にすることが可能となる。

MyBatisもO/Rマッパーの一つということになります。

#コードから読み解くMyBatis
MyBatisではデータベースへの操作(SQL)をXMLに記載してJava側で呼び出します。
（Annotationも使用できますがここでは省略します）

```XML
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
  <select id="selectUser" resultType="User">
    select * from Users where id = #{id}
  </select>
</mapper>
```
[MyBatisスタートガイド](http://www.mybatis.org/mybatis-3/ja/getting-started.html)をもとに作成

ここではユーザーのIDをもとにユーザのデータをデータベースから取得するSQLを記載しています。
JavaでselectUser(任意のユーザID)を呼び出すことでSQLを実行し、取得した結果をresultTypeで指定したクラス(User)に代入できます。

```Java
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUser(16280001);
```

#MyBatisの特徴
MyBatisは、一般的なO/Rマッパーのようにデータベースのテーブル構造とオブジェクトをマッピングするのではなく、SQL文とオブジェクトをマッピングするという特質を持っています。

Java側ではSQLで取得するデータに着目すればよく、テーブル構造を意識する必要がないため柔軟性が高いといえます。

#Hibernateと比較してみる
代表的なO/Rマッパーである[Hibernate](http://hibernate.org/)とMyBatisを比較してみましょう。

|比較項目|MyBatis|Hibernate|
|:--|:--|:--|
|マッピング|SQL文とオブジェクト|テーブル構造とオブジェクト|
|SQL|手動作成|自動生成|

##SQLの扱いの違いが意味すること

###手動生成
- SQLの細かいチューニングが可能
- SQL文によってはDBMSに依存する（特定のDBMSでしか使えない）
- 開発者がSQLを意識する必要がある

###自動生成
- 実際に発行されるSQLが非効率になる恐れがある（＝細かいチューニングが不可能）
- 特定のDBMSに依存しない
- 開発者はSQLを意識しなくてよい

MyBatisを使用するということはSQLをガッツリ書かなければならないということです。
手間はかかるものの、開発者がSQLを完全にコントロールできるため、開発者が意図した通りのデータ操作を実現することができるのです。

#最後に
この記事では、有名なO/Rマッパーの一つであるMyBatisについて説明しました。
MyBatisの概要だけでもわかっていただけたのであれば幸いです。
OSSにpull requestを出した時の流れ

これまでOSSに対してパッチを送るということを、実質したことが無かった。
ハードルが高いと感じていたからだ。たとえば、英語でコミュニケーションが取れるのか、プロジェクトのお作法に則れるのか、そもそも送ったパッチがしょぼいかもといった不安だ。

GW中暇だったので、重い腰を上げ、GitHubのpull requestの形でパッチを送ってみた。
https://github.com/VSCodeVim/Vim/pull/2618

その時の流れを示してみる。
OSSにパッチを送ってみたいけど躊躇していたり、何を送ったら良いか分からない人の参考になれば。

# どんなパッチを送るか考える
普段良く使うツールやライブラリで欲しい機能や解決して欲しい不具合に考える。
↓
VSCodeのVim Extensionで、コマンド入力時に<up>/<down>キーで過去の履歴を選択できないことが不便に感じていた。
なので、それに対処することに決定。

# 誰かが既に取り組んでいないか確認
GitHubのissueを適当なキーワードで検索
↓
以下のissueが見つかる。
https://github.com/VSCodeVim/Vim/issues/779
https://github.com/Microsoft/vscode/issues/426
↓
取り組もうとはした人はいるものの、VSCodeがExtention向けに公開しているAPIの仕様の都合上、単純には実現できなさそう。

# 代替案を考える
vimには、「q:」コマンドというものがある。
コマンド履歴を表示して、その中から選択したコマンドを実行するというもの。
コマンド入力欄の<up>/<down>キーで履歴を選択するよりは不便だが、ないよりはましだと思うので、「q:」コマンドを実装することにした。

# プロジェクトの情報を収集する
パッチを送る時のルール(Contributing)、ソフトの大まかな作りのドキュメントを読む。

# 手を動かす
VSCodeVimのリポジトリをforkする。仕事でGitHubを使用するときはforkしないので、forkする理由はよく分からなかったが、リポジトリ本体にするpush権限がないからだろう。fork後は、普通にコードを修正してローカルでコミット。

forkしたリポジトリの扱いや、コミットメッセージの書き方は以下のページが参考になった。
https://qiita.com/itosho/items/9565c6ad2ffc24c09364
https://qiita.com/icb54615/items/3544c419a3f6fc3534fb

# pull requestを出して、修正の取り込みを依頼する
1. 動作確認
  1. テストコードの実行(プロジェクトのルール)
  1. 手動による動作確認(UIに影響があり かつ テストコードでテストできないので)
1. push
1. issueの登録  
   プロジェクトのルールでissueの登録が推奨されていたので(手を動かす前に登録した方が良いかも)
1. pull requestを出す  
   オリジナルのリポジトリではなくforkで作ったリポジトリから

後は、reviewerの反応を待つ。

# レビュー指摘対応
reviewerがコメントをくれるので、それに沿ってコードを修正したり、議論したり。

# mergeされたことの確認
全部の指摘に対応すると、reviewerがmasterにmergeしてくれる。
リポジトリのpull requestの状態を確認して、mergeされたことを確認したら、終了。
issueを自分でcloseすべきかは判断できず(本来、fix <issue番号>という形式でコミットメッセージを記述しておくと、自動でcloseしてくれるらしいが)

# pull request出してみた感想など
一言でいえば、パッチを送るハードルはかなり低かった。

- 英語力は無くても、意外と英語でコミュニケーションは取れた。書く方はほとんどGoogle翻訳頼み。
- パッチは送っても意外と無視されなかった
- プロジェクトルールには厳密に従わなくても、特にパッチを拒否されたりはしなかった(従わないことが良いこととは思わないが)
- pull requestをmasterに取り込む直前でコミットログの整理が要求される or reviewerが整理するのかと思ったが、そんなことは無かった。自分の雑然としたコミットログがそのままmasterに取り込まれてしまい、恥ずかしい。もう少し綺麗にコミットメッセージを書けばよかった。
- javascriptのスーパセットであるTypeScriptを触ったが、今どきのjavascriptはいけてる記述ができることが分かった。たとえば、非同期処理のPromise, async/awaitなど。
- パッチの作成中、いくつかの不具合に遭遇。普通に使っている分には手を加える余地のないものに見えたが、開発に参加してみるとパッチのネタは意外とあるものだと感じた。
- 仕事も一応、ソフト開発なので、一日中仕事している感があった。相当な気力が必要。これが続けられる人はすごい
LaTeX備忘録 #プリアンブル

#frame numberだけが欲しい
（Infoline以外のouterthemeを利用する場合）

`\setbeamertemplate{footline}[frame number] % footlineの情報をスライド番号のみにする
\setbeamercolor{page number in head/foot}{fg=black} % スライド番号の表示色を黒にする`

*beamerのスライドにフレーム番号を挿入する*
https://qiita.com/yt_siden/items/aaac54f6389a8068a4ee

#タイトルページ全般
*LATEX Beamerの使い方*
http://joker.hatenablog.com/entry/2014/10/18/222303

#章ごとに振り番したい
*ー*
https://www.biwako.shiga-u.ac.jp/sensei/kumazawa/tex/011.html

#geometry パッケージを用いて行数を指定
http://www.biwako.shiga-u.ac.jp/sensei/kumazawa/tex/geometry.html
APIGatewayを使ってサーバーレスなURL短縮サービスを作る（URL生成編）

こちらの記事の続きです。
[APIGatewayを使ってサーバーレスなURL短縮サービスを作る（URL取得編）](https://qiita.com/monamu/items/79054ca8e4a7a6a89213)

# 何を作るか？

諸事情により、外部のURL短縮サービスを使えない場合のために、自前のURL短縮サービスを作ります。
このサービスは、以下の2つから構成されます。

* URL生成
    * 入力された任意のURLに対して、短縮したURLを生成する
    * 生成したURLを元のURLと共にAmazon S3に格納する
* URL取得
    * 与えられた短縮URLを元にS3から元URLを取得する
    * HTTPレスポンスでステータスコード301とともにLocationヘッダで元URLを返す

この記事では、AWS Lambdaを使ってURLを生成する部分を実装します。
URL取得の部分は[こちらの記事](https://qiita.com/monamu/items/79054ca8e4a7a6a89213)を参照してください。

# 概要

URL生成部分は、以下のように実装します。

* 短縮キーとして一意な文字列を生成する。
* 短縮キーをS3オブジェクトのキー（ファイル名）としてS3バケットにオリジナルURLを格納する。
* 短縮キーと取得用APIのURLから、短縮URLを生成して返却する。

上記をLambdaFunctionとして実装し、APIGatewayで公開します。

# 作成方法

CloudFormationのテンプレートを用意してあるので、まずはそれを実行します。

https://github.com/monamu/qiita-url-shorter

こちらからapp-generateurl.yamlを取得して、CloudFormationで実行してください。
以下のパラメータを設定し、StackNameは任意で構いません。

* DataBucketName: [こちらの記事](https://qiita.com/monamu/items/79054ca8e4a7a6a89213)で作成したS3バケット
* GetUrlEndpoint: [こちらの記事](https://qiita.com/monamu/items/79054ca8e4a7a6a89213)で作成したAPIまたは、カスタムドメインを設定している場合はそのAPI。`{key}`で終わっている必要あり。

まずはそれを実行しますと言いつつ、実行したら完成です。

# 使い方

## 短縮URL生成APIを呼ぶ

このページで作成したCloudFormationスタックのOutputsのApiに対して、POSTで短縮前URLをリクエストします。

``` sh 
$ curl -X POST <OutputsのApi> -H "Content-Type:applcation/json" -d "{\"Url\": \"https://www.google.co.jp\"}"
```

結果

``` sh
{"Url":"短縮後のURL"}
```

短縮後のURLの末尾はランダムなキーになっているはずです。

このURLにアクセスしてみます。

``` sh
curl -i "短縮後のURL"
```

結果

``` sh
HTTP/2 301
content-type: application/json
location: https://www.google.co.jp
〜中略〜
{"Location":"https://www.google.co.jp"}
```

きちんとStatusCodeが301でlocationヘッダに元のURLが設定されているので、Webブラウザはリダイレクトしてくれるでしょう。

# まとめ

あとは、URLを生成するページなりプログラムを作成して、それを実行した結果を利用者に伝えれば完成です。（この記事ではそこまでは触れないです）

AWSのサービスを使って、ほとんどプログラムを書かず、サーバーレスなURL短縮サービスができてしまいました。

では。
楽して遊ぶUbuntu Part1 ~UbuntuとRuby導入~

- 個人的なメモとして(~~よく忘れるので~~)

## 開発環境
- 仮想ソフト：Parallels Desktop 13 for mac
- Ubuntu 16.04
- Ruby 2.5.1

## Ubuntu設置
- Parallelsの場合、英語版Ubuntu16.04を無料ダウンロードすることで、1. ~ 3.をスキップできる

1. 下記サイトからUbuntuのISOファイルをダウンロードする
  - [Ubuntu Desktop 日本語 Remixのダウンロード | Ubuntu Japanese Team](https://www.ubuntulinux.jp/download/ja-remix)
2. md5sumを確認する
    - Mac：`md5 <File Name>`
    - Windows：`certutil -hashfile ＜File Path＞ [Hash Algorithm]`
3. Parallelsを起動し、新規 > DVD/イメージファイルからWindows/その他OSをインストールを選択する
4. UbuntuのISOファイルを選択する
5. Linuxユーザー名とパスワードを設定する
6. Ubuntuの保管ディレクトリを設定する
7. 構成を設定する
    - メモリを1GB → 4GBに変更
8. 下記コマンドを実行する
    
    ```
    sudo apt update && sudo apt upgrade -y
    ```
    - 実行時、下記エラーが発生した場合、[こちら]( https://bugs.launchpad.net/ubuntu/+source/appstream/+bug/1579712/comments/24)を参考にして修正を行う
 
    ```
    E: Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/test -w /var/cache/app-info -a -e /usr/bin/appstreamcli; then appstreamcli refresh > /dev/null; fi'
    E: Sub-process returned an error code
    ```

9. Ubuntuを再起動する

## Rubyインストール
- rbenvを使用する

1. gitをインストールする
    
    ```
    sudo apt install git -y
    ```
2. rbenvをインストールする
    - 詳細：[GitHub - rbenv/rbenv: Groom your app’s Ruby environment](https://github.com/rbenv/rbenv#installation)
   
    ```
    git clone https://github.com/rbenv/rbenv.git ~/.rbenv
    ```
3. PATHが通るように.bashrcに設定する

    ```
    echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
    ```
4. .bashrcに下記を追加する

    ```
    eval "$(rbenv init -)"
    ```
5. PATHが設定できているか確認する
    - 問題がなければ.bashrcファイルに4., 5.で入力したPATHが記入されている

    ```
    cat .bashrc
    ```
6. PATHに追記した内容を反映させる(再起動させる)

    ```
    source ~/.bashrc
    ```
7. コマンドで確認する(2018/05/13現在)

    ```
    rbenv -v
    rbenv 1.1.1-30-gc8ba27f
    ```
8. ruby-build(rbenvのプラグイン)をインストールする
    - 詳細：[GitHub - rbenv/ruby-build: Compile and install Ruby](https://github.com/rbenv/ruby-build)

    ```
    git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
    ```
9. 必要なパッケージをインストールする

    ```
    sudo apt install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev -y
    ```
10. rbenvでインストールするRubyのバージョンを確認する

    ```
    rbenv install -l
    ```
11. Ruby 2.5.1をインストールする

    ```
    rbenv install 2.5.1
    ```
    - インストールに失敗した場合は、エラーメッセージに記載されているパッケージをインストールする

        ```
        ERROR: Ruby install aborted due to missing extensions
        Try running `apt-get install -y <Packages that need to be installed>` to fetch missing dependencies.
        ```
12. 通常使うバージョンに設定する

    ```
    rbenv global 2.5.1
    ```
13. Rubyのバージョンを確認する

    ```
    ruby -v
    ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
    ```
14. (任意)gemのバージョンを更新する

    ```
    gem update --system
    ```
15. (任意)bundlerを導入する

    ```
    gem install bundler
    ```

## 参考
- [Raspberry PiにRuby (2.4.1)インストール - Qiita](https://qiita.com/orihomotakanat/items/b4a983617f64d4768b7c)
- [UbuntuにRubyをインストールした話 - Qiita](https://qiita.com/toshi726/items/f212916dfc9a103f7cfa)
RxTracerでエラーを追跡しやすくする

redditのandroiddevに、RxJava 2関連のライブラリ [RxTracer](https://github.com/halfhp/rxtracer) が取り上げられていたので、使ってみました。
RxTracerはRxJava 2のスタックトレースに、subscribe側を含むように書き換えるライブラリです。

halfhp/rxtracer: Better stack traces for RxJava2
[https://github.com/halfhp/rxtracer](https://github.com/halfhp/rxtracer)

## 使い方
RxTracerの使い方はとても簡単です。
ライブラリをプロジェクトに追加した後は、有効化するだけです。

```kotlin
RxTracer.enable()
```

## RxTracer適用前後で比較する
RxTracerを適用する前後で、例外発生時のバックスタックがどう変わるか見てみましょう。

動かすのは、以下のコードです。
IllegalArgumentExceptionを発生させ、わざとOnErrorNotImplementationExceptionに繋げます。

```kotlin
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    tracer().subscribe()
}

private fun tracer() : Observable<String> {
    return Observable.fromCallable {
        throw  IllegalArgumentException()
        return@fromCallable "aaaa"
    }
    .subscribeOn(Schedulers.io())
}
```

### RxTracer適用前
RxTracerを適用していない場合のスタックトレースは以下のとおりです。
非常に長いので、画像のキャプチャにしました。

<img width="1306" alt="Screen Shot 2018-05-13 at 19.52.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/9665/f4e70975-b1c8-d760-7a8a-5633cdd62f77.png">

スタックトレースには、IllegalArgumentExceptionの発生箇所しか含まれていません。
なお、subscribeOnを消すと、RxTracerが適用されてなくてもsubscribeを含んだログが含まれます。

### RxTracer適用後
次に、onCreate内の先頭でRxTracerを有効にした場合です。
(通常だと、デバッグ用のApplicationクラス内などで有効化するでしょう。)

<img width="1447" alt="Screen Shot 2018-05-13 at 19.55.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/9665/8fc73ddb-7ee7-8a85-c013-bdf475d1167f.png">

スタックトレースに、onCreate内のsubscribeの行を含んでいます。
どこがOnErrorNotImplementationExceptionでエラーの実装が足りてないのか分かりやすくなりました。
Herokuについてまとめてみる

# Herokuとは
取り敢えずここを見ると良いと思います。
https://devcenter.heroku.com/categories/reference

日本語はこちら
https://jp.heroku.com/

HerokuはPaaS(Platform as a Service)です。
アプリケーションを実行するための環境を用意してくれます。

具体的に言うと

* サーバー
* OS
* データベース
* 各々のプログラミング言語の実行に必要な環境

上記のことを気にせずに、アプリ開発に集中することが出来ます。

# Herokuのすごいところ

## デプロイ簡単
`git push heroku master` を実行するだけで、デプロイできます。
自分でデプロイスクリプト書かなくてすみます。

## 初期コストが安い
Herokuは初期コストが安いと思います。
Free : Free
Hobby : $7/月
Professional : $25 - $500/月

## リリースのバージョン管理が楽
`heroku releases` というコマンドを打つと直近のリリース一覧が表示されます。
ロールバックもしやすいです。

## アドオンが豊富で楽しい
New Relic、MongoDB、SendGrid結構あります。

## Dynoのスケールアップ・スケールアウトがすんごい簡単
https://www.heroku.com/dynos
`heroku dyno:type web=standard-2x` こんな感じのコマンドでスケールアップが出来ます。

新しくWebサービスの立ち上げに携わることになったのでそちらでHerokuの導入が出来たらさらに詳しくまとめて記事書きます。
hubコマンドでUnauthorized(HTTP 401)エラー

# 環境

OSX High Sierra
git version 2.14.3 (Apple Git-98)
hub version 2.2.9

# 問題

hubコマンドで認証に失敗する。

```bash
$ hub clone dyoshikawa/my-private-repo
Error getting repository: Unauthorized (HTTP 401)
Bad credentials
```

# 解決法

[https://github.com/github/hub/issues/1067](https://github.com/github/hub/issues/1067)

GitHubのダッシュボードからSetting→Developer settings→Personal access tokensを開く。
tokenをRegenerateして新しく生成されたトークンをコピー。

Macで~/.config/hubをエディタで開き、oauth_tokenを置換する。

```:~/.config/hub
github.com:
- user: dyoshikawa
  oauth_token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  protocol: https
```
Laravel のweb.phpのResource指定でshowが動かなかった話

Laravel のweb.phpのResource指定でshowが動かなかった話。

下記を読んで、web.phpでresourceという指定をすると、
自動的に判別して、指定したControllerのindexやshowというfunctionへ飛ばしてくれると学んだ。
1.[LaravelでRoute::resourceを使うときに気をつけること](https://qiita.com/sinpey_g2/items/9297f41d5f7a9d91aa11)
2.[Laravelのルーティング表](https://qiita.com/daijinload/items/3024bea467fdc3464826)

が、indexの処理は上手く動くのにshowの処理は上手く動かない。散々悩んだ結果が単純なコレでした↓

(誤)

```php5
        Route::resource('/student/', 'StudentController', ['only' => ['index','show']]);
```

(正)

```php5
        Route::resource('student', 'StudentController', ['only' => ['index','show']]);
```

前後にスラッシュを入れて記載する癖があったのですが、それが悪さをしていたようです。
resource指定をする際には文字のみで記載する良い様です。
Vapor 3.0 でのルーティングでリダイレクト or ビューのレンダリングをする (2)

例えば、

- ログインしていればビューをレンダリング
- ログインしていなければログインページにリダイレクト

をしたい場合を考える。

[Vapor 3.0 でのルーティングでリダイレクト or ビューのレンダリングをする (1)](https://qiita.com/5t111111/items/16f3c4d8e82c0c76b695) では、型安全な戻り値を返すために2種類の別の型のレスポンスをラップした Enum を用意する方法を紹介した。

しかし、もっと手軽に実現したい場合は、`AnyResponse` を利用することができる。

例えば、上記記事と同様のことを `AnyResponse` を使うと↓のように書ける。

```swift
final class ArticleController {

    ...

    func new(_ req: Request) throws -> Future<AnyResponse> {
        guard isLoggedIn(req) else {
            let redirect = req.redirect(to: "/users/login")
            return Future.map(on: req) { AnyResponse(redirect) }
        }
        let page = try req.view().render("articles/new")
        return Future.map(on: req) { AnyResponse(page) }
    }

    ...

}
```