OmniAICreator/Qiita-1.07M huggingface dataset:
float指定時・header固定時に要素がかぶるときの対処法

#18.12.1　課題内容
###指示書を完成させる(headerをスクロールしても固定されるようにする）
![キャプチャ181201.PNG](https://qiita-image-store.s3.amazonaws.com/0/321593/058f183b-1889-cceb-88cb-dc4692f7d8a7.png)

- 与えられている雛形

```HTML:sample.html
<!DOCTYPE html>
<html lang="en" class="">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <link rel="stylesheet" href="sample.css">
</head>
<body>
  <div class="wrapper">
    <header>
    </header>
    <div class="contents">
      <div class="left-content">
      </div>
      <div class="right-content">
      </div>
      <div class="bottom-content">
      </div>
    </div>
    <footer>
    </footer>
  </div>
</body>
</html>
```

```CSS:sample.css
html, body{
  height: 100%;
  margin: 0;
  padding: 0;
}
.wrapper{
  height: 100%;
}
header{
  background-color: #333;
  height: 70px;
}
.contents{
  width: 960px;
  background-color: #eee;
  margin: 0 auto;
}
.left-content{
  background-color: red;
  width: 700px;
  height: 400px;
}
.right-content{
  background-color: yellow;
  width: 260px;
  height: 300px;
}
.bottom-content{
  background-color: green;
  height: 250px;
}
footer{
  height: 60px;
  background-color: #333;
}
```

### 1．body部分の黄を赤の左に配置したい！

まず、以下のようにcssを指定すると

```CSS:sample.css
.left-content /*赤*/{
  background-color: red;
  width: 700px;
  height: 400px;
  float:left; /*左寄せにしたいので*/
}
.right-content /*黄*/{
  background-color: yellow;
  width: 260px;
  height: 300px;
}
.bottom-content/*緑*/{
  background-color: green;
  height: 250px;
  clear:both; /*左寄せを解除*/
}
```

.right-content（黄）が消えました・・・正しくは赤の下に潜り込んでいました
![キャプチャ181201_2.PNG](https://qiita-image-store.s3.amazonaws.com/0/321593/8513bb07-6e78-adbc-272e-d9808228f79c.png)



この問題を解決するには
**.right-contentにもfloat:left;をかける**

```CSS:sample.css
.left-content /*赤*/{
  background-color: red;
  width: 700px;
  height: 400px;
  float:left; /*左寄せにしたいので*/
}
.right-content /*黄*/{
  background-color: yellow;
  width: 260px;
  height: 300px;
  float:left;/*追加部分*/
}
.bottom-content/*緑*/{
  background-color: green;
  height: 250px;
  clear:both; /*左寄せを解除*/
}
```

できました！！
![キャプチャ181201_3.PNG](https://qiita-image-store.s3.amazonaws.com/0/321593/c86040ab-f1eb-8d0a-d4fd-bf681336eb8a.png)


###2．headerを固定する
固定するために下記のコードを追記しました

```CSS:sample.css
header{
  background-color: #333;
    width:100%;
  height: 70px;
/*以下３行追記部分*/
  position:fixed;
  top:0;
  z-index:100;
}
```
するとbodyの上部分がheaderと重なってしまいました（headerの高さ分ずれてしまっています）
![キャプチャ181201_4.PNG](https://qiita-image-store.s3.amazonaws.com/0/321593/f07325d0-561a-f6a0-fd15-c3df8c1fcc43.png)


headerの高さ（70px）分padding-topでずらすとうまくいきました

```CSS:sample.css
.contents{
  width: 960px;
  background-color: #eee;
  margin:0 auto;
  padding-top: 70px;/*追記部分*/
}
```
【もげぞうβ】atcoder beginner contest001をやる

# PeerCast プログラミング配信 Advent Calendar 2018 一日目

はい、もげぞうβです。
カレンダー１日目は、atcoder beginner contest001をやりました。

- A問題  


```cl
(defun abc001a ()
  (format t "~d~%" (- (read) (read))))
```

- B問題  
いいのかコレ

```cl
(defun abc001b ()
  (let ((vv 0)
	(m (read)))
    (cond
      ((> 100 m)
       nil)
      ((>= 5000 m 100)
       (setf vv (* (/ m 1000) 10)))
      ((>= 30000 m 6000)
       (setf vv (+ (/ m 1000) 50)))
      ((>= 70000 m 35000)
       (setf vv (+ (/ (- (/ m 1000) 30) 5) 80)))
      ((> m 70000)
       (setf vv 89)))
    (format t "~2,'0d~%" vv)))
```

- C問題  
うーん・・・(´・ω・`)

```cl
(defun hoge (x)
  (multiple-value-bind (a b)
      (floor (* 10 x) 1)
    (if (>= b 0.5)
	(incf a))
    (/ a 10.0)))

(defun abc001c ()
  (let ((x (/ (read) 10.0))
	(y (hoge (/ (read) 60.0)))
	(dir "N") (W 0))
    (cond
      ((and (> 33.75 x) (>= x 11.25))
       (setf dir "NNE"))
      ((and (>= x 33.75) (> 56.25 x))
       (setf dir "NE"))
      ((and (>= x 56.25) (> 78.75 x))
       (setf dir "ENE"))
      ((and (>= x 78.75) (> 101.25 x))
       (setf dir "E"))
      ((and (>= x 101.25) (> 123.75 x))
       (setf dir "ESE"))
      ((and (>= x 123.75) (> 146.25 x))
       (setf dir "SE"))
      ((and (>= x 146.25) (> 168.75 x))
       (setf dir "SSE"))
      ((and (>= x 168.75) (> 191.25 x))
       (setf dir "S"))
      ((and (>= x 191.25) (> 213.75 x))
       (setf dir "SSW"))
      ((and (>= x 213.75) (> 236.25 x))
       (setf dir "SW"))
      ((and (>= x 236.25) (> 258.75 x))
       (setf dir "WSW"))
      ((and (>= x 258.75) (> 281.25 x))
       (setf dir "W"))
      ((and (>= x 281.25) (> 303.75 x))
       (setf dir "WNW"))
      ((and (>= x 303.75) (> 326.25 x))
       (setf dir "NW"))
      ((and (>= x 326.25) (> 348.75 x))
       (setf dir "NNW"))
      (t (setf dir "N")))
    (cond
      ((>= 0.2 y 0)
       (setf W 0
	     dir "C"))
      ((>= 1.5 y 0.3)
       (setf W 1))
      ((>= 3.3 y 1.6)
       (setf W 2))
      ((>= 5.4 y 3.4)
       (setf W 3))
      ((>= 7.9 y 5.5)
       (setf W 4))
      ((>= 10.7 y 8.0)
       (setf W 5))
      ((>= 13.8 y 10.8)
       (setf W 6))
      ((>= 17.1 y 13.9)
       (setf W 7))
      ((>= 20.7 y 17.2)
       (setf W 8))
      ((>= 24.4 y 20.8)
       (setf W 9))
      ((>= 28.4 y 24.5)
       (setf W 10))
      ((>= 32.6 y 28.5)
       (setf W 11))
      ((>= y 32.7)
       (setf W 12)))
    (format t "~a ~d~%" dir W)))
```

- D問題
あとで！

とりあえず配信できてよかった。
Advent Calendar はいいぞ。

# Advent Calendar はいいぞ。

## あんた誰。

#### 0Delta(ぜろでるた)
* HAL名古屋ゲーム作学科2016年卒
* その後インフラエンジニアとして就職
* 「インフラ勉強会」というコミュニティができると聞いて真っ先に飛びついた人。

##### 過去に参加したアドベントカレンダー
* [WindowsをDISMで回復させる - HAL Advent Calendar 2016](https://qiita.com/0Delta/items/51d04d0f2ffde2ed3fef)
* [プログラムを書く前にやっとくべきこと - HAL Advent Calendar 2017](https://qiita.com/0Delta/items/3f6845c0804305151eca)

## そもそもアドカレって何。

12/1～12/25(クリスマス)の期間中、一日一人ずつ特定のお題(または組織)でブログ記事を投稿していくというイベントのこと。
詳しくは[こちら](https://help.qiita.com/ja/articles/qiita-adcal-1)。


## で、何で良いの

**注：以下全て私の主観です**。

### 定期的なアウトプットの場が得られる
* 用意された機会があると、意外とやれてしまう。
* 年一度なので、締め切りに追われる毎日……　といった事がない。
* 継続する事で(非常に緩いが)アウトプットするクセがつく。
* "きっかけ"ができることで、「また書いてみようかな」という気持ちが生まれる。

### テーマが決まっているモノがあり、書くことに困りにくい。
* と言っても何書けばいいの？ってことが少なくなる。-> 悩む時間が少なくなって書く時間が減る。
* 既に既出だけど……というn番煎じでも、テーマに沿ってるから問題なし！と割り切ることができる。

## つまり
### 超初心者、今日から始める人向け。

技術ブログ書きだすにはもってこいの場なのだ。
短文でも既知でも、実際文章にしてみると理解が深まったり、自分の脳内でキレイに整理されたりetc、色んなプラス効果があるぞ。
**Advent Calendar はいいぞ。**まだ参加枠がある場所が沢山ある。
**何も躊躇する必要はない、書いてみよう。きっと良いことがあるから。**
gitでmergeしたらconflictしたので元に戻したい時

# git でmergeしたらconflictだったとき
conflictした状態では他のbranchに切りかえることができず、
`error: you need to resolve your current index first` というエラーが出る。

このままではbranchの切り替えができないが、
以下のコマンドでマージ前の状態に戻せる。

```
git merge --abort
```

これ以降branchの切り替え可能。

#もしよかったら
「この記事が役に立った」と思ったら、以下のリンクから投げ銭(¥200)お願いします！
https://note.com/sakusaku34/n/nf87c1a08e181
【FileMaker】FileMaker Goでデータを持ち歩こう！

今回は、Qiita Advent Calendarにある、「[Qiitaユーザー大決戦、ベストレビュアーは誰だ!? Advent Calendar 2018](https://qiita.com/advent-calendar/2018/itreview)」の記事として投稿します。

レビューはあまりしたことないのですが、仕事で使っているFileMakerおよびFileMaker Goのことなら書けそうだなと思ってエントリーし、ここではFileMaker Goについてレビューを書いていきます。

# 必須項目

## ◆レビュータイトル
FileMaker Goでデータを持ち歩こう！

## ◆お使いのツール名
![FMGO17-App-Icon256.png](https://qiita-image-store.s3.amazonaws.com/0/60538/8480526e-c4bd-9e22-a20b-23bba2b97ed2.png)
Apple100%子会社の[FileMaker社](https://www.filemaker.com/jp/)の[FileMaker Go](https://www.filemaker.com/jp/products/filemaker-go/)
FileMaker Goの最新バージョンは、17になります。
App Storeから無料でダウンロード・インストールできます。

## ◆この製品・サービスの良いポイントは何でしょうか？
[FileMaker Pro Advanced](https://www.filemaker.com/jp/products/filemaker-pro-advanced/)や[FileMaker Server](https://www.filemaker.com/jp/products/filemaker-server/)とも接続でき、データを一元化して管理できるのが最大の魅力です。

![FileMakerGo.png](https://qiita-image-store.s3.amazonaws.com/0/60538/bf93efbd-e532-641d-67cf-1ecb2f5b260e.png)


例えば、AWS上の[FileMaker Cloud](https://www.filemaker.com/jp/products/filemaker-cloud/)で稼働しているFileMakerのシステムにFileMaker Goからアクセスし、データをいつでもどこからでも閲覧・編集などが行えます。
つまり、地球上のインターネット環境のあるところであれば、どこからでもデータの一元化ができ、データを持ち歩くことができるのです。
しかも、URLを覚える必要はありません。
FileMaker Goがどこにアクセスすればいいかを覚えています。

また、iPhoneやiPadにデータの入ったFileMakerファイルを単独で入れて、自分専用のデータベースとして活用することもできます。


## ◆改善してほしいポイントは何でしょうか？
FileMaker Goだけでは開発ができません。
[FileMaker Pro Advanced](https://www.filemaker.com/jp/products/filemaker-pro-advanced/) (PC版)でしか開発ができないということは、iPhoneやiPadしかない環境でふと思い立ってアプリを作ろうとした場合、その場でささっとアプリが作れないのが歯がゆいです。
単純なテーブルやリレーションシップ、レイアウトが作成できればすぐに作って活用できるので、簡易的な開発環境でもいいので実装してもらえるともっと使い勝手が良くなると思っています。

## ◆どのようなビジネス課題を解決できましたか？あるいは、どのようなメリットが得られましたか？
FileMakerを使ったシステム開発では、今やiPhoneやiPadを活用するケースが多くなってきていて、数多くの[お客様事例](https://www.filemaker.com/jp/solutions/customers/)が紹介されています。
そして、「働き方改革」のツールとしてFileMaker Goが活用され続けています。

# その他項目

##◇おすすめ度（10段階評価）
★★★★★★★★☆☆
おすすめ度は8です。

## ◇あなたはこの製品・サービスをどのような立場で関与していますか？
・ユーザー（利用者）
とともに、FileMaker App開発者ですが、選択肢になかったので、追記しておきます。

## ◇満足度を5段階で評価ください

| 項目 | 評価 |
|------+------|
| 機能への満足度 |★★★★☆|
| 使いやすさ |★★★★★|
| 導入のしやすさ |★★★★★|
| 管理のしやすさ |★★★★★|
| サポート品質 |★★★★★|
| 価格（費用対効果） |★★★★★|

## ◇利用期間をお選びください
・3年以上

## ◇他製品・サービスからの乗り換えですか？
・新規導入

## ◇製品・サービスは適正にバージョンアップを行っていますか？
・はい

## ◇検討者にお薦めするポイントがあれば記入ください
FileMakerを使ったシステム構築を考えている場合、FileMaker Goも同時に検討し、幅広い活用方法でシステムの課題を解決してください。



# まとめ
その他、実装に関する項目もあるのですが、開発ツールを活用して開発する側ですのでここまでとしておきます。
【設計時の見落とし】画面をクリアする

# はじめに
これは[設計時の見落とし Advent Calendar](https://qiita.com/advent-calendar/2018/overlook)の1日目の記事となります。

業務アプリケーションの設計をするときに、見落としがちなところに焦点をあてて紹介します。 
下流工程からの手戻りを少なくして 双方の負担を減らしましょう。

以前、別ブログなどに書いた記事のQiita向けにリライトしてみようと思います。

# 画面をクリアする
以前、「画面をクリアする。」とだけ書かれた仕様書がありました。

「画面をクリアする。」とは、実際どのようなことを指すのでしょうか？

1. 単に入力項目値を消去する
2. 入力項目値を消去し初期値をセットする

経験則からクリアするというのは2番を指すことが多いのですが、まれに1番の場合もあるので仕様者またはユーザーに確認する必要があります。

クリアした時の処理も入力項目の種類や用途により仕様を決めておく必要があります。

* 文字入力項目は、空文字とする。
* 数値専用項目は、0 とするのか空文字とするのか
* コンボボックスは、空文字とするのか先頭項目をセットするのか
* 複数のラジオボタンは、未選択とするのか選択しておくのか
* 日付や時刻では、空文字とするのかシステム日付/時刻など初期値をセットするのか

などなど・・・

この他に検索画面などでは、検索条件のみクリアとするのか、検索結果も含めてクリアするのかもあります。

## 例えば
アンケートなどの性別選択で男と女の選択ラジオボタンがあり、男にデフォルトが付いていた場合、女性側は必ず変更する必要が出てきます。
面倒なのでデフォルトのままにしてしまう女性が絶対に出てきます。そうするとアンケートとしては正確ではなくなってしまいます。

# 複写の考慮
見積入力画面や売上入力画面などでは、複写機能(以前入力したのとほぼ同じ内容なので、入力した情報を読み出して、変更箇所のみ入力したい）をつけたい要望があります。

複写機能をつけた場合に、項目によってはコピーすると逆にミスが発生することが起こりえます。
よって、わざと手入力させる項目を設けるかどうかユーザーと確認する必要があります。

# まとめ
値がセットされていることで入力者の入力負担を減らすことができ、少しでも手間が省けて楽させてあげたいと開発側は考えることが多いです。
しかし、場合によってはわざと手間をかけさせて上げた方がいいのです。
Goで環境変数を読み込んでバイナリに埋め込む

ビルドした時点での環境変数を常に参照してほしいということは、運用上たまに起こる要求なのではないかと思います。

この要求を解決するためのそれっぽいライブラリはあるのですが[^1]、要求に対して機能が過剰だなという感じでした。

ほしかったのは以下のような機能です。

* 入力を受け取って環境変数をロードするgoファイルを生成する
* 環境変数をロードするためにメインのコードでimportをする必要がない
  * つまり、このライブラリがなくてもコンパイルを通すことが出来る

こんな感じのシンプルなライブラリが欲しかったので作りました。

https://github.com/k-motoyan/envenb

## 使い方

環境変数を定義するシンタックスの標準入力を受け取り、環境変数をロードするためのコードを標準出力に出力します。

goのファイルにはシェルのパイプを使って出力することになります。

```sh
# システム環境変数を入力
echo FOO=$ENV_VAR1\nBAR=$ENV_VAR1 | envenb > envenb.go

# ファイルから入力
cat .env | envenb > envenb.go
```

出力されたファイルをビルド時に含めればコードからこの環境変数を利用出来るようになります。

```sh
go build mian.go envenb.go
```

```go:main.go
package main

import (
    "fmt"
    "os"
)

func main {
    fmt.Println(os.Getenv("FOO")) // foo
    fmt.Println(os.Getenv("BAR")) // bar
}
```

ご覧の通り、メインのコードには環境変数を読み込むためのライブラリによる依存が全く見当たりません。

## どうやって環境変数をロードしているのか？

Goのグローバル変数がプロセス起動時に評価されるのを利用しています。
グローバル変数への代入に即時関数を利用し、即時関数内で環境変数の設定を行うことでライブラリの依存なくコンパイルを通せるようにしているのです。

```go
import "os"

var _ = func() interface{} {
    var envValues = map[string]string{%v} // %vの箇所に標準入力から受け取った値が置換されて置かれます。

    for key, value := range envValues {
        if err := os.Setenv(key, value); err != nil {
            log.Fatalln(err)
        }
    }

    return nil
}()
```

---

あしたは @kikuchy の「Diverse Podcastを支える技術」です。
同じ会社にいながら、このあたりの話を全く知らないので楽しみですね！

[^1]: 名前忘れました…
Firebase Performance Monitoringの２点間計測機能を使ってみる。【Android】

FireBasePerformanceMonitoringの機能のひとつに、ある点からある点までの2点間を計測するTrace機能があります。
[Android 向け Firebase Performance Monitoring を使ってみる](https://firebase.google.com/docs/perf-mon/get-started-android?hl=ja
)


同じクラス内であれば、newTrace("")してオブジェクトを生成し、.startTrace()　→　.stopTrace()をすればいいですが、

+ 別のクラスを跨ぐとき
+ Activity・Fragment間を移動するとき

を計測するケースを考えると、ユーティリティっぽく使える方が保守性・拡張性があります。
また、ActivityにTraceオブジェクトを持たせて、コールバックを受け取るなりしてstop()するのもあまりやりたくないのも理由ですね。

SingletonとEnumで作ってみましたので、アウトプットがてら共有します。



```java:PerformanceMontoringSample.java

public class PerformanceMonitoringSample {
    private static PerformanceMonitorSample performanceMonitorSample;
    private final Map<TraceName, Trace> traceMap = new HashMap<>();

    public enum TraceName {
        SAMPLE_ONE("sample_one"),
        SAMPLE_TWO("sample_two");

        private final String traceInstanceName;

        TraceName(String traceInstanceName) {
            this.traceInstanceName = traceInstancName;
        }
    }

    private PerformanceMonitoringSample() {
    }

/**
 * インスタンスを取得
 */
    public static PerformanceMonitoringSample getInstance() {
        if (performanceMonitorSample == null) {
            performanceMonitoringSample = new PerformanceMonitoringSample();
            return performanceMonitorSample;
        } else {
            return performanceMonitorSample;
        }
    }

```
ここまでが

+ EnumでTraceを管理する。
+ コンストラクタ
+ getInstance()で呼び出せるようにする

ですね。


以下、計測開始と終了の処理を書いていきます。


```java:PerformanceMontoringSample.java
    /**
     *計測を開始
     */
    public void startTrace(TraceName traceName) {
        if (traceMap.containsKey(traceName)) {
            return;
        }
        Trace myTrace = = FirebasePerformance.getInstance().newTrace(traceName.traceInstanceName);
        myTrace.start();
        traceMap.put(traceName.traceInstanceName, myTrace);

        }
    }

    /**
     *計測を終了
     */
    public void stopTrace(TraceName traceName) {
         //Map自体のnullチェックが必要かも・・・
         if (traceMap.containsKey(traceName)) {
             traceMap.remove(traceName.traceInstanceName).stop;
            }
        }
    }
}
```

###使い方
使い方としては、まずgetInstance()でPerformanceMonitoringインスタンスを生成し、計測したい2点間でstart()とstop()をするだけです。
裏でPerformanceMonitoringがうまい事よしなにやってくれるので、分岐だけ網羅しておけば良い感じに計測してくれる＆そうそう落ちることはない、はずです・・・。
未経験の技術への取り組みについて

# はじめに

本記事は[Makuake Product Team Advent Calendar 2018](https://qiita.com/advent-calendar/2018/makuake)の２日目の記事です。
株式会社マクアケ開発本部マネージャーの[kimura-ryohei](https://qiita.com/kimura-ryohei)と申します。

チーム・個人で扱っていない未経験の技術への取り組みを始める際には、当然ながらうまく導入を開始したいという考えが生まれます。マクアケでもそれは同様で、導入のたびにうまく導入するための努力をしてきました。今回は、直近で未経験の技術への取り組みを行う際に、意識したことをまとめます。チームで行った取り組みと個人で行った取り組みの両方について、大きく以下の３点について意識をしていました。「素早い知識浸透」「未経験領域でもできるアウトプット貢献」「リリースの際のリスク軽減」の３つです。これらを具体例も踏まえて書かせていただきます。

# 素早い知識浸透

## モブプログラミングの活用

モブプログラミングの詳細については割愛します。概要としては、一人のドライバー（PCを操作する人）の書いているコードを見ながら、周りを複数名のナビゲーター（ディスプレイを見ながら指示を出す人）が囲み、ドライバーに対して適宜指示を出すことで、一つの機能を全員で一気に実装する仕組みです。弊社ではjQueryを主に使っていた環境に対して、新しくVue.jsを導入したいという流れになり、その導入時にモブプログラミングを行ったのが最初でした。モブプログラミングの効果の一つとして知識共有の高速化があり、未経験の技術の知識を参加メンバー全員に早く浸透させることができました。

## 方針を考えるところから一緒に議論

現在、弊社では新しくマイクロサービス化に取り組んでおり、その一環として実装の方針を週一回定例の時間を設けて議論しています。具体的な例としては、システムの分割とチームの分割について議論しました。マイクロサービス化後のシステムの形に合わせた組織の分割をしたいという考えのもと、チームの役割分担や進め方に関わるメンバー全員で議論やすり合わせを行いました。方針策定の時点からメンバーを巻き込むことで、同じ知識・目線を持った上でマイクロサービス化を進めていけると考えています。

## 定期的な勉強会で一緒にインプット

前述のマイクロサービス化の取り組みの中で行っていることです。マイクロサービスの理解に必要と思われるキーワードを挙げ、担当者設定の上、毎週発表・質疑応答により知識共有・浸透を図っています。こちらは現在も進行中で、最近では“コンウェイの法則”や、“マイクロサービスにとってのDDD”などのキーワードについてメンバーから発表してもらい、議論を行いました。

## 質問しやすい環境づくり

こちらは筆者がマクアケにジョインした際に、個人的に未経験の技術に取り組むことを経験しており、その中で経験的に良かったと思うことになります。未経験の技術に取り組む際には一人で取り組むことも重要ですが、同時に誰かに質問をしながらすすめることも重要です。この領域の質問は誰にすればよいのかが明確になっていると、質問がしやすく効率的に技術理解を進められたと感じています。そのためには、質問してもいいんだという心理的安全な環境を作っておくことも重要だと思います。質問のやり方についても、直接口頭で話したほうが早いことも多く、相談・回答できる相手を近くの座席に配置することも効果的でした。

## 経験者のサポート

これはマイクロサービス化の取り組みでも、前述の筆者の経験からも重要だと感じました。当たり前のことではありますが、未経験者を経験者がサポートすることはとても重要です。界隈に知れ渡っているベストプラクティスなどを取り入れることで、無駄な失敗を減らすことができます。チーム内に経験者がいなければチーム外から招くことも選択肢に入れることが大事です。弊社では、実際にマイクロサービス化の際に、社外のマイクロサービス化経験者をお招きし、マイクロサービスについての知見を伺いました。

# 未経験領域でもできるアウトプット貢献

## 技術領域に依存しない知識の活用

こちらも筆者の経験から重要だと思うことになります。例えばプログラムの設計知識（疎結合にする、抽象化するなど）は、言語や技術領域に依存せずに使えるので、新規技術領域だとして品質向上に貢献できる可能性があります。ある技術領域の未経験者が過去の知見から、既に経験者によって作られたプログラムの改善を提案することもありうるということです。この際、ある技術領域の未経験者の発言だからといって、経験者がその発言を軽視するようなことがないようにしましょう。

# リリースの際のリスク軽減

## ビッグバンリリース回避

こちらはVue.jsの導入時に行いました。大規模に一度にリリースをするのではなく、小規模なリリースを複数回行う方針を取るということです。弊社の例ですと、Vue.js導入時に、まずは新規ページを一つだけVue.jsを用いて作成し、そこで成功例を作りました。その後に既存のページの置き換え等の大きめの変更にも着手、リリースを進めました。これらの後、今では新規ページは基本的にVue.jsを使うようになっています。

# まとめ

以上、マクアケが未経験の技術に挑戦する際に行っていることをまとめました。大きく３点、「素早い知識浸透」「未経験領域でもできるアウトプット貢献」「リリースの際のリスク軽減」について意識をしています。今後もマクアケでは未経験の技術も取り入れながら、サービスをより良くしていきます。
また、一緒に「世界をつなぎ、アタラシイを創る」エンジニアを募集しております。ご興味持っていただけた方はぜひ一度、「[各種エンジニア募集！ クラウドファンディングMakuake](https://www.wantedly.com/projects/26807)」からご連絡いただければと思います。
【Unity2D】Sceneビュー上でCollider2Dの表示が追従しない問題

# 症状
Collider2D をアタッチした GameObject を Scene ビュー上で移動した際に、コライダーのアウトライン（デフォルトの設定では緑色）が表示上追従しない問題が発生。
![00102.png](https://qiita-image-store.s3.amazonaws.com/0/321683/54a786d6-92a4-73f1-a57e-f4a04f3a5f98.png)
![00104.png](https://qiita-image-store.s3.amazonaws.com/0/321683/d51b6ce5-51c2-43fc-6ea6-54e7901b261e.png)


- Unity 2017.2.1f1 Personal を使用。
    - Unity の他のバージョンを試してみたが、直らなかった。
- OnValidate() 的なタイミングで一時的には直る。
- ゲームを実行した際の当たり判定などの挙動に問題はみられない。
- 実害はないが、レベルデザイン中にストレスが溜まるので完全に直したい。

# 解決策
Collider2D をアタッチした GameObject（またはその親の GameObject）に **Rigidbody2D をアタッチすると直りました。**

### 教訓
基本的に、Collider2D をアタッチした GameObject には必ずセットで Rigidbody2D もアタッチしよう。
※動的に動かす予定のないオブジェクトでも、Body Type: Static な Rigidbody2D をアタッチしよう。
特定のViewのスクリーンショットを撮る

# やりたいこと
特定のViewのBitmapを取得し、ImageViewに表示

# 実装
```ScreenShot.kt
class ScreenShot {

    fun generateScreenShot(): Bitmap {
        // 適当なファイル名
        val filename = context.filesDir.path + System.currentTimeMillis().toString() + ".jpg"
        val output = FileOutputStream(filename)

        view.isDrawingCacheEnabled = true
        view.drawingCacheBackgroundColor = Color.TRANSPARENT
        val saveBitmap = Bitmap.createBitmap(view.drawingCache)  // Bitmap生成
        saveBitmap.compress(Bitmap.CompressFormat.PNG, 100, output)
        output.flush()

        view.isDrawingCacheEnabled = false
        return saveBitmap
    }
}
```

# 便利に
Extensionに追加しておくと色んなViewからBitmap取得できて便利です。

```ViewEx.kt
    val View.screenShot: Bitmap
        get() {
            val filename = context.filesDir.path + System.currentTimeMillis().toString() + ".jpg"
            val output = FileOutputStream(filename)

            isDrawingCacheEnabled = true
            drawingCacheBackgroundColor = Color.TRANSPARENT
            val saveBitmap = Bitmap.createBitmap(drawingCache)
            saveBitmap.compress(Bitmap.CompressFormat.PNG, 100, output)
            output.flush()
    
            isDrawingCacheEnabled = false
            return saveBitmap
        }
```


# 特記事項
 - 対象のViewに重なっていたとしても子で無い場合、Bitmapとして出力されません。
 - 書き込み権限が必要
react-nativeのui用にreduxのreducerにvalidatorを仕込むライブラリを作った話

[redux-state-validation](https://github.com/tkow/redux-state-validation)というライブラリを作ってnpmで公開していますのでその話を今回はします

## なぜ作ったのか

reduxのvalidationの仕組みを持っているライブラリは検索を行うと
[redux-form](https://redux-form.com/7.4.2/examples/fieldlevelvalidation/)
[redux-validator](https://github.com/MaxLi1994/redux-validator)
この二種類が出てきます。

ただこれらのライブラリはformおよびactionにvalidatorが紐づいており、redux-formにおいては、formの入力方法をたくさん作成するほど、redux-validatorについては、actionをたくさん定義するほどvalidationを冗長に書かなければ行けなくなり、大きなアプリケーションを作る際に非常に効率が悪くなってくるのではないかと思いました。
webとnativeの共通構造化を考える上でredux-formをreact-native用のコンポーネントに突っ込むとなると微妙だなと思い、色々考察した結果、reducerのdispatchのstate変更時にvalidationをかけることができれば、十分なのではないかと思い作ることにしました。

具体的に何ができるかというと、reducerにvalidationを定義し、invalidation条件に引っかかるとrootのstateにerrors stateをくっつけます。errorsに関してはidを振り当てられるので表示したいところでidを使ったり、for文を回したり自由に表示してくださいというスタンスのライブラリです。reducerにvalidatorを定義するため、ほぼ記述場所を集約できます。具体的には、リポジトリを参考にしてください。

[redux-state-validation](https://github.com/tkow/redux-state-validation)

# NG集

作ってく中でも想定外の問題が度々起きたので、あたふたしました。

##　失敗1　初期値の入力に失敗する

初期値はundefinedが入ってくるため、最初のバリデーションに引っかかった瞬間errorになっていました。
僕が設定したテストケースでは全てちゃんと初期値が定義されているものしか実証していなかったため、想定から漏れていました。気づいて即日修正しましたが、この時期にインストールした人には多大なるヘイトをためたことでしょう。今思ってもわざわざ楽でもないコードに独自の設定突っ込ませ挙句、よしやってみようと思って、いきなりエラーかましてくるなんて最悪のUXですね。この件でユーザーがちゃんとつく前にREADMEとかに開発途上の段階ではWARNINGでも書いとこうかと思いました。

##　失敗2 バリデーションがキツすぎて入力ができなくなった

reduxのstateとformの入力値が同期していると、電話番号のようにある程度入力長が決まっているものに対して、最初からlength固定値の制限をかけると入力値が空の状態で文字入力を行った時にバリデーションに引っかかり、全くstateに文字入力できなくなるというバグがあることに気づきました。これではまずいので、formのsubmit時に行われるバリデーションと毎回のバリデーションを分けることができるようにしました。具体的には、warningというoptionをつけたvalidatorに関してはstateの変更を許容し、つけないものに関しては、条件に引っかかった場合はstateを戻すという使い分けをできるようにしました。ただし、formからの入力かどうかを検知するためにはdispatchされたactionからなんらかのmetaデータや　actionTypeによってバリデーション条件を追加しないと行けないので、　validatorにaction入力も許可しました。しかし、ここまできて、思ったこと。


```math
\def\textlarge#1{%
 {\rm\Large #1}
}
```

$\textlarge{ あ、これredux-formとredux-validatorの機能足し合わせただけry }$

#　結論

結論としては、このライブラリの利点はstate自体に紐づくvalidatorであるとため、ステイトの増減や変更に強いライブラリを作ろうとしたものですが、結局最低限、actionまたは、formに依存せざるを得ないことがわかりました。ただ、redux自体はreducerとactionは密結合なので、reducerの定義にactionを使ったバリデータを実装するのは問題ないかと思い、アーキテクチャ的にはいい感じになったかと思います。<strike>流行れ!</strike>　react-nativeには、UIから入力制限をかける機能もあってそれで十分な可能性もあり、あくまで防波堤のような地味な機能なので、自分で作っといてなんですが、あんまり今の所恩恵を感じることができていません。しかしながら、防御壁とは常に身の回りにあって意識せずとも僕らを守ってくれているのだということだと思うことにしています。もし物好きな方がいらっしゃったら（2018/12/01現在は安定している...はずなので）ぜひ使ってみて、感想および、クレームをお待ちしております。極力善処します。

# 得られた学び

typescriptからnpmのパッケージ配信のノウハウやcommitizen,standard-version,type-doc,istanboolなどの使い方に詳しくなりました。code-coverageもストイックにやっています。ただ、coverage100%　でも人間の想定範囲を超えるケースが発生することを体験したので、テストしてもこれなのだから、テストはしないとやばいよなっていう感慨を得ました。あとcommiter気分になってみるとこれメンテの辛さ結構感じましたね。OSSコミッターさんありがとう。
イーサリアムと比較しながら EOS の特徴を説明する

EOS とイーサリアムとを比較しながら、EOS の特徴をまとめてみます。

## EOSなんぞや
EOSIO は、 [BlockOne](https://block.one/) というスタートアップ企業がリードして開発しているソフトウェアです。
EOSIO というソフトウェアを、コミュニティによってリリース・運営して、実際稼働しているのが [EOS](https://www.eos.io) というパブリックブロックチェーンです。

## 全体

|比較内容|EOS|イーサリアム|
|------|-----|---------|
|トランザクション手数料|基本無料<br>スマートコントラクトが負担するかエンドユーザー負担するか選択可能|必須(GAS)|
|スマートコントラクト更新|可能|不可|
|コンセンサスアルゴリズム|DPoS + 非同期BFT|PoW(PoS移行計画あり)|
|データ構造|ブロック <br>> リージョン <br>>> サイクル <br>>>> シャード<br>>>>> トランザクション <br>>>>>> アクション|ブロック <br> > トランザクション|
|データ保存領域|チェーンデータ＋スーパーノードメモリ|チェーンデータ|
|ユーザ識別子|意味ある文字列（12桁、アルファベット+1から5の数字|ランダムの 40 桁の16進数文字列|
|ユーザ管理|アカウント＋権限|アドレス|

## トランザクション手数料基本無料
イーサリアムはトランザクションを送信するためには、手数料（GAS)が必ず払わないと行けません。
EOS は、基本的に、エンドユーザー側が手数料なしでトランザクションを送信出来ます。
代わりに、スマートコントラクト・サービス提供側が運営料金を払う必要になります。

## スマートコントラクト更新
イーサリアムは更新できませんが、EOSの場合、必要な権限があれば、スマートコントラクトを更新出来ます。

## コンセンサスアルゴリズム
イーサリアムは、現状PoW、将来はPoSになりますが、EOS は、DPoS ＋ 非同期 BFT になっています。

### DPoS
投票によって選出された 21 個のノードが、決められた順番に従ってブロック生成・検証処理を行う

### 非同期 BFT
ブロックの生成と検証処理を分けて、平行で実行するようにした仕組み。
DPoS だけの場合は、選出されたノードが自分の番になった時だけ、一個前のブロックを検証します。
問題なければ、その後に続いて新しいブロックを生成する。

そうなると、１つのブロックが生成されてから、ネットワーク上の 2/3 以上（つまり 14）のブロック生成ノードに
検証してもらうことは、14 個のブロック生成時間を待たないといけない為、ブロック確定の時間が長い

EOS の場合は、それを改善したい為、検証処理を非同期にし、ブロック生成ノードがブロックを生成したら、
すぐネットワークにブロードキャストし、他のノードに検証してもらう。
他のノードが検証した結果をすぐ送信元に返事します。14 個の返事を収集できればブロックが 100% 確定になります。

**現在まだ実装されていない**

## データ構造
イーサリアムは、トランザクションをブロックにまとめるようなシンプルな構造ですが、
EOS の場合、並列実行をサポートするため、より多い階層の構造になっています。

- ブロック
- リージョン
    - ブロックを地域などによって別々のサブチェーンのように分ける（詳細の記載があんまりない）
- サイクル
    - １つのブロックを順番実行の複数サイクルに分ける
    - あるアカウントから別のアカウントに送信し、後者が受け取ったアクションを処理する為に生成したアクションが次のサイクルで処理される
    - こうすることで、１つのブロック時間の中、アクションの送信と返事を処理できるようになります
- シャード
    - 静的な分析によりアクションが関連するアカウントを判定できる
    - その上、アクションを関連しているアカウントでシャードに分ける
    - 異なるシャードは、並列実行できる
- トランザクション
    - アクションのまとまり
    - アトミック性があり、全部成功か全部失敗だけ
- アクション
    - EOS における処理の最小単位
    - 送信先、アクション名、パラメータ、認証情報を含めている

## データ保存領域
イーサリアムは全部チェーンデータに保存していますが、
EOS の場合は、チェーンデータ以外に、21 個のブロック生成ノードのメモリ上にデータベースを持たせる。
マルチインデックステーブルと呼ばれている仕組みになります。

公式の eosio.token スマートコントラクトの場合は、

- アカウントごとの残高データは、マルチインデックステーブルつまりメモリ上のデータベースに保持する
- 送信履歴は、ブロックチェーンデータに保持する

ように実装されています。

## ユーザ識別子
イーサリアム上は、厳密に言いますとユーザという概念がありません。単なるアドレスになります。
アドレスは、プライベートキーとペアになっているパブリックキーによって算出した値になります。

EOS の場合は、アカウントという概念があり、識別子は、

- 12桁文字列
- 使える文字列は、a-z、1-5 

になります。制限ありますが、一応人間が読める文字列になります。

## ユーザ管理
イーサリアムは、アドレスのみ、ユーザという概念がない

EOS は、アカウントとロールベースの権限の概念があります。
アカウント作成する時、デフォルト `owner` と `active` ロールが作成されます。
作成時、 `owner` と `active` ロールに紐づくキーペアのパブリックキーを指定する必要があります。

- 1つのロールに複数のキーペアを指定し、重み係数を設定するのも出来ます
- デフォルトのロール以外に、任意のロールを設定出来ます

**ユーザ作成自体が有料で EOS トークンを使う必要があります。現在は日本円 200　円程度**

## まとめ
DPoS コンセンサスアルゴリズムが本当に続けるかどうかはまだ疑問ありますが、
エンドユーザーに対する無料で利用できるのと、処理スピードが速いのは間違いないので、
EOS を使う価値が十分あると思います。
セレクタ

#セレクタとは
・何に対して何をどうしたいかを指定してあげるもの
##何に対して（セレクタ）
・body、h1、head...等これら以外も指す
・**タイプセレクタ要素名{属性:値;}**
・**セレクタ{属性（プロパティ）:値;}**
##属性（プロパティ）
・セレクタの何を指定したいか
##値
・セレクタの何に指定したものをどうしたいのか？

```css:css
p{color:#ccc;}
```

上記の意味はｐタグの色を#cccに指定するという意味を持つ

##クラスセレクタ「class」
・1ページに何度も使える
・class名も駄々かぶり大丈夫
・大事なのは名前付け
・誰が見てもわかるような名前をつけること

```css:css
.class{bg:#ccc;}
```
上記はclassというクラス名を持つものの背景に対して色を#cccにしてくださいという意味

##IDセレクタ「ID」
・1ページに何度も使える
・使えるがid名かぶりはだめ
・動くには動くけども間違いである
・誰が見てもわかるような名前をつけること

```css:css
#id{bg:#ccc;}
```
上記はidというid名を持つものの背景に対して色を#cccにしてくださいという意味
##全称セレクタ
・*{属性:値;}
・優先度は最も低いので簡単に消せる
・全てに効果を発揮するため発揮してほしくない輩に対してはきちんと指定してあげないといけない

```css:css
*{
padding:0px;
margin:0px;
font-size:18px;
}
```
上記はページ内全てに対してパディングとマージンを0pxに
文字サイズを18pxに指定するという意味

```css:css
#main * p{
font-size:18px;
}

```
上記はid「main」の中のpに文字の大きさを18pxに指定するという意味

##グルーピング
・セレクタ,セレクタ{属性（プロパティ）:値;}
・同時に効かせたいコードの時に使うと大変便利なのがこの子
・カンマ「　,　」を忘れないこと

```css:css
h1,h2,h3{
color:#ccc;
}
```
上記はh1,h2,h3に対して色を#cccに指定するという意味


##子孫セレクタ
・親要素 子要素{属性（プロパティ）:値;}
・こいつを理解してあげるとコードを理解しやすくなる
・何の中の何の中の何に対して何をどうしてあげるか

```css:css
main p span{
color:#ccc;
}
```
上記はmainの中のｐの中のspanに対して文字色を#cccに変更してあげるという意味
heroku内のpostgresqlからデータを取り出す方法

## はじめに

[Gaiax Group Advent Calendar 2018](https://qiita.com/advent-calendar/2018/gaiax-group)の記事の一つです！

少し前に[techpitMarket](https://market.techpit.jp/)さんの教材を参考にrailsで作ったアプリをherokuで公開したらみんなに遊んでもらえたのでデータベースからデータを取り出す方法について書きます！

[作ったアプリについてはこちら](https://note.mu/koppe55/n/n8055b0e572c5)

## 環境
```
-ruby on rails
-cloud9
-heroku
```

## 手順
初めにcloud9上で自分が作ったアプリの階層に移動します。
移動したらcloud9上からherokuにログインします。


```
$ cd "自分のアプリ名"
```


```
$ heroku login
```

このときうまくログインできなかったら以下のコマンドを試してみてください。

```
$ heroku login --interactive
```
  

あとは以下のコマンドを打てば

```
$ heroku run rails console
```

```ruby
koppe:~/environment/seminar-ssi (master) $ heroku run rails console              
Running rails console on ⬢ seminar-ssi... up, run.1679 (Free)
Loading production environment (Rails 5.2.1)
irb(main):001:0>
```

このようにconsoleが立ち上がります！

## テーブル内の全レコードを取得

.allを使ってテーブルの全レコードを取得しようとします。

```ruby
irb(main):001:0> @datas = Inquiry.all
D, [2018-12-01T09:34:52.636125 #4] DEBUG -- :   Inquiry Load (4.0ms)  SELECT  "inquiries".* FROM "inquiries" LIMIT $1  [["LIMIT", 11]]
```
するとなぜかlimitが掛かっていてレコードが11件しか取り出せませんでした。

今度はこちらがlimitを指定してやってみました。

```ruby
irb(main):005:0> @datas = Inquiry.limit(50)
D, [2018-12-01T09:43:52.664790 #4] DEBUG -- :   Inquiry Load (1.6ms)  SELECT  "inquiries".* FROM "inquiries" LIMIT $1  [["LIMIT", 11]]
```

これでもlimitが掛かってしまいました...

11件しか表示できない仕様なのかとあきらめかけていたら...

```ruby
irb(main):012:0> Inquiry.first(20)
D, [2018-12-01T10:46:45.503676 #4] DEBUG -- :   Inquiry Load (0.9ms)  SELECT  "inquiries".* FROM "inquiries" ORDER BY "inquiries"."id" ASC LIMIT $1  [["LIMIT", 20]]
```
firstを使ったら任意のレコード数を取得できました！

firstは`@hoge = テーブル名.frist(n)`とすることで最初からn個データを取ってくることができます。

`テーブル名.last`も同じように使えます。

```ruby
irb(main):015:0> Inquiry.count
D, [2018-12-01T10:54:40.965828 #4] DEBUG -- :    (1.1ms)  SELECT COUNT(*) FROM "inquiries"
=> 106
```
countで全カラム数を取得して

```ruby
irb(main):016:0> Inquiry.first(106)
D, [2018-12-01T10:56:04.402121 #4] DEBUG -- :   Inquiry Load (2.0ms)  SELECT  "inquiries".* FROM "inquiries" ORDER BY "inquiries"."id" ASC LIMIT $1  [["LIMIT", 106]]
```

firstの引数に入れてあげれば全データを取得できました！！

```ruby
irb(main):020:0> Inquiry.where("email LIKE ?", "a8117%").first(50)
D, [2018-12-01T11:10:02.295685 #4] DEBUG -- :   Inquiry Load (3.8ms)  SELECT  "inquiries".* FROM "inquiries" WHERE (email LIKE 'a8117%') ORDER BY "inquiries"."id" ASC LIMIT $1  [["LIMIT", 50]]
```
こんな風に他の条件の最後にfirstを付けてあげればlimit(11)に縛られることなく検索できます！
下記の参考記事を見ながら色々遊んでみてください。

ここまで読んでくださりありがとうございました。

参考)
[ActiveRecord + MySQLでレコード抽出](https://qiita.com/kawabex/items/c87eba694c520dc541cb)
[Rails - モデルから特定のカラムのみ取得](https://qiita.com/zaqisuke/items/39e18a36d96d314b97af)
[Railsのモデル検索あれこれ](https://qiita.com/tono0123/items/576a4a4659b51860f304)
[Ruby on Railsを使っての基本的なデータ取得を学ぶ](https://qiita.com/shell/items/c328f7715eeb098ea0a6)
[Rails入門 where likeであいまい検索！複数条件やOR条件も解説](https://www.sejuku.net/blog/71189)
jsdoでchip8　その10


#概要

jsdoでchip8やってみた。
アセンブラ練習問題、解いてみた。
お題は、0から255まで表示。

#解答例


```
start  load  v0  0
  load  v1  0
  load  v2  0
  load  v3  5
  load  v4  5
  load  v5  5
  load  v6  0
  load  v7  1
  load  v8  3  
loop6  load  I  100
  load  v3  5
  load  B  v6  
  load  v2  I
  load  I  0
loop0  sub  v0  v7
  eq  v15  0
  goto  loop1
  disp  v3  v4  5
  add  v3  v5
  load  I  0  
loop2  sub  v1  v7
  eq  v15  0
  goto  loop3
  disp  v3  v4  5
  add  v3  v5
  load  I  0  
loop4  sub  v2  v7
  eq  v15  0
  goto  loop5
  disp  v3  v4  5   
  scroll
  add  v6  v7
  goto  loop6
loop1  add  I  v5
  goto  loop0
loop3  add  I  v5
  goto  loop2
loop5  add  I  v5
  goto  loop4    
```

#成果物

http://jsdo.it/ohisama1/8yvv

以上。
Scipyのinterpolateで欠損しているデータを補間する

# はじめに
データを取得したセンサの仕様などによって、本当は連続値であるものを離散値で計測する場合があります。例えば、センサのクロック周波数の仕様や、ストレージの容量節約のために測定を2秒おきにすると、測定値が連続に変化せず、離散的に変化する結果となります。2秒より小さい刻み幅で、例えば1秒の単位でデータを加工したい場合、なんらかの手法で不足しているデータの補間をする必要があります。
今回はScipyの`interpolate.interp1d`を使用して補完をしてみます。

# 参考
- Scipy.org，『scipy.interpolate.interp1d』，https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp1d.html
- 山本昌志，『スプライン補間』，平成18年11月27日，http://www.yamamo10.jp/yamamoto/lecture/2006/5E/interpolation/interpolation_html/node3.html

# 手順
次の関数

```math
y = x \ \mathrm{sin}x,
```
から$x = 1,2,...,10$のときの$y$の値をサンプリングします。これらの点の間の補完を通して、保管の手法を見ていきます。

```python
import matplotlib.pyplot as plt
import numpy as np

def g(x):
    return x*np.sin(2*x)

x = np.linspace(0, 10, num=11)
y = g(x)
plt.plot(x, y, 'o')
plt.grid(True)

# 比較のためのグラフ
u = np.linspace(0, 10, num=101)
v = g(u)
plt.plot(u, v, alpha=0.2)
```
<img width="507" alt="スクリーンショット 2018-12-01 19.20.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/211712/5558fd9c-4aff-7d0b-f961-88cf48ffdac8.png">


## 線形補完
線形補間は2点のデータを直線(すなわち線形)で結び補完する方法です。データの間隔が小さければ良い近似になりますが、間隔が大きい場合は誤差が大きくなります。

```python
from scipy import interpolate

f = interpolate.interp1d(x, y, kind='linear')
plt.plot(u, f(u),'-')
plt.grid(True)

# 比較のためのグラフ
plt.plot(u, g(u), alpha=0.2)
```
<img width="507" alt="スクリーンショット 2018-12-01 19.22.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/211712/769e579b-300b-5245-4edf-a45c0f0a87ee.png">

## スプライン補間
スプライン補間は、データを短区間に区切って低次の多項式で補完したものです。下記は3次の補完をしました。

```python
f2 = interpolate.interp1d(x, y, kind='cubic')
plt.plot(u, f2(u), '-')
plt.grid(True)

# 比較のためのグラフ
plt.plot(u, g(u), alpha=0.2)
```
<img width="507" alt="スクリーンショット 2018-12-01 19.29.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/211712/dadaff0c-3288-bd0f-cbb8-460bb7bb2f73.png">

## その他
`kind`で補完する方法を選べます。

| 補完の手法     |      kind |
|:----------------:|:-----------------:|
|線形補間|'linear' |
| スプライン補間             | 'zero', 'slinear', 'quadratic', 'cubic'|
| 直前の点の値         |    'previous' |
| 直後の点の値       |    'next'|
|一番近い点の値|'nearest'|

```python
f3 = interpolate.interp1d(x, y, kind='nearest')
plt.plot(u, f3(u), '-')
plt.grid(True)

# 比較のためのグラフ
plt.plot(u, g(u), alpha=0.2)
```
<img width="507" alt="スクリーンショット 2018-12-01 19.54.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/211712/12e42053-1cfb-ff76-5efa-13762cb2eaea.png">

## データの外側の補完
　`fill_value='extrapolate'`とするとデータの外を補完できますが、もちろん離れれば離れるほど当てはまりは悪くなります。`'cubic'`の補完では11すら当てはまりません。

```python
f4 = interpolate.interp1d(x, y, 'cubic', fill_value='extrapolate')
z = np.linspace(0, 12, num=121)

plt.plot(z, f4(z), '-')
plt.grid(True)

# 比較のためのグラフ
plt.plot(z, g(z), alpha=0.2)
```
<img width="507" alt="スクリーンショット 2018-12-01 20.03.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/211712/6f8618a1-c0e0-4b63-1607-f4f93ce09e36.png">

# おわりに
データの補完をやってみました。点と点の間で関数が激しく振動しなければ、データ間の補完はそれなりに合っていそうです。しかし、データの範囲外にもこの手法を用いるとただちに破綻します。データの範囲外で外装したい場合は、きちんと予測モデルを構築する必要があります。
Pythonのlen関数がいかにオブジェクト指向的であるか説明する

## Pythonのlen関数キモくない

どうも、Pythonのlen関数大好きマンです。Pythonのlen関数に関するポエムを垂れ流していきたいと思います。

言わずと知れたPythonのlen関数ですが、例えば以下のような使い方をします。

```python
Python 3.6.5 (default, Apr  1 2018, 05:46:30)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" fo
r more information.
>>> list = [1, 2, 3]
>>> len(list)
3
>>>
```

Pythonでは`list.len()`のように書かずこのように書くのです。オブジェクト指向への対応を謳う様々な言語で`list.len()`や`list.length()`のような書き方を採用しているので、このシンタックスはオブジェクト指向っぽく無い、などとしばしば議論になります。

私の主張は、むしろこのシンタックスこそがオブジェクト指向的だというものです。鉞お待ちしています。

## len()について何が考えられたか

Pythonのlen関数について説明されている[メーリングリストのアーカイブ](https://mail.python.org/pipermail/python-3000/2006-November/004643.html)には以下のような記述があります。

> First of all, I chose len(x) over x.len() for HCI reasons (def \_\_len\_\_() came much later). There are two intertwined reasons actually, both HCI:

この場合のHCIは、おそらくHuman Computer Interactionのことでしょう(間違っていたらごめんなさい)。この部分で言いたいことはlen(x)はx.len()よりもHCI的に優れている。つまり人間にとって読みやすいのはlen(x)の方であるということだと思います。このメーリングリストでは、その理由が2つ述べられています。


> (a) For some operations, prefix notation just reads better than
postfix -- prefix (and infix!) operations have a long tradition in mathematics which likes notations where the visuals help the mathematician thinking about a problem. Compare the easy with which we rewrite a formula like x*(a+b) into x*a + x*b to the clumsiness of doing the same thing using a raw OO notation.

Postfix(x.len())よりもPrefix(len(x))の方が読みやすい場合があり、また、PrefixやInfixが数学では用いられ、数学者が問題を考える上で助けになってきたことが述べられています。

例として、x*(a+b)をx*a + x*bに書き直すことが挙げられています。

私見を述べると、Postfixを支持する人もa + bをa.add(b)と書いたり、x*(a + b)をx.mul(a.add(b))と書いたりするわけでは無いですし、このあたりを統一する意味はよくわかりませんし、それをもってオブジェクト指向的ではないと考えるのは早計だと感じます。

二つ目の理由として以下が挙げられています。

(b) When I read code that says > > > len(x) I *know* that it is asking for the length of something. This tells me two things: the result is an integer, and the argument is some kind of container. To the contrary, when I read x.len(), I have to already know that x is some kind of container implementing an interface or inheriting from a class that has a standard len(). Witness the confusion we occasionally have when a class that is not implementing a mapping has a get() or keys() method, or something that isn't a file has a write() method.

注目したのは前半の部分で、Pythonでは、len(x)と書くと、返り値が整数で、引数はコンテナです。x.len()と書くと、xに実装されているlenがスタンダードなものなのかを知っていなければなりません。

私見ですが、len関数はPythonのコンテナ回りの実装に関するメタ構造として機能している言うことができると考えます。

アラン・ケイはオブジェクト指向を始めとするソフトウエアの設計に関する多くの功績で知られていますが、アラン・ケイの[ソフトウエア工学は矛盾語法(oxymoron)か？](http://metatoys.org/oxymoron/oxymoron.html)という記事があり、ここには以下のようなことが書かれています。

> しかし実際そんな事はまだ分からないので、機能満載の大規模設計の正反対であり、「機能なし」か、もっと良い言い方をすると「ほとんどメタ」のシステムが必要になる。残念ながら、現在のほとんどのソフトウェアは機能満載言語で書かれるのでこういったものには対応出来ない。

私より余程理解のある方の翻訳なので、翻訳の妥当性の検討などは省略しますが、アラン・ケイは「もっとメタを」ということを考えていたことが分かります。また、どうやらアラン・ケイは機能満載言語というものを嫌っていたということがわかり、言語機能そのものについてはシンプルであるべきだと考えていたことがわかります。

## オブジェクト指向わからん

ここまで書いておいて心苦しいのですが、何がオブジェクト指向的かを判断するほど私がオブジェクト指向を理解していないことが分かりました。アラン・ケイが語っていたことが全てなのか、それとも各言語の様々な実装や実装に際する考え方を含むのかすら分かりません。

なのでここからは私見ですが、オブジェクト指向が目指していたものは、「オブジェクトに対して「もっとメタを」定義することで、そのメタに対して実装しやすくする。」ということだと考えています。「機能は少なく、メタ構造はきちんと」という方針は非常にオブジェクト指向的だと感じますし、Pythonのlen関数、ひいてはPython全体からそのような姿勢を感じます。
4.0.1の新機能(メンテナンス管理)について


10/11にEC-CUBEの新バージョン、EC-CUBE4をリリースしましたが、
近々、4.0.0のマイナーバージョンアップとしてバージョン4.0.1のリリースを予定しています。

今回は、バージョン4.0.1で追加される新機能、"メンテナンス機能"について説明します。


##メンテナンス機能とは
Webサイトを運営しているなかで、一時的にユーザーのアクセスを遮断したいとき、
例えば
 - サイトの更新を行うが、データに不整合が起きないようにしたい
 - 予期せぬエラーが発生していて、一時的にサイトを非表示としたい
というようなときに、フロント画面(エンドユーザーが触れる画面)へアクセスできないように制御する機能です。

通常は、サーバー上で.htaccessなどのファイルに設定を記載するなどして制御する必要がありますが、
今回のバージョンアップから、それを管理画面上で行うことができるようになります。


##メンテナンス機能の内容
###メンテナンス管理メニューから、メンテナンスモードを有効化、無効化を行う
１.管理画面のメニューの、コンテンツ管理にある"メンテナンス管理"というサブメニューをクリックします。
<img width="600" alt="スクリーンショット 2018-12-01 19.25.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/216034/af71af3e-1d99-c8f1-8b3a-629e437b9644.png">

2.[有効にする]をクリックします。
<img width="600" alt="スクリーンショット 2018-12-01 19.26.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/216034/1b6db4cd-176b-2aa2-f5bc-78c9620ae33e.png">

3.これでメンテナンスモードになります。
<img width="600" alt="スクリーンショット 2018-12-01 19.36.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/216034/8a4a2172-bb52-d7e2-062c-e8bf3cf1072d.png">

このとき、フロント画面側はメンテナンス画面に切り替わっています。
<img width="600" alt="スクリーンショット 2018-12-01 19.37.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/216034/69e1de0d-8b57-0fb4-892c-84dc675fe863.png">

###プラグインの操作時のメンテナンス切り替え
プラグインのインストール/有効化/無効化/削除/アップデート時の、
開始時から完了まで、メンテナンスモードに切り替わります。
※自動的に切り替わるので、プラグインを操作する場合はタイミングにご注意ください


## バージョン4.0.0をお使いの方へ
[開発ドキュメント](http://doc4.ec-cube.net/)の[バージョンアップ方法](http://doc4.ec-cube.net/quickstart_update)に、4.0.1へのバージョンアップ方法が記載されています。
こちらを参考に本体のバージョンアップを行ってください。
バージョンアップ後にメンテナンス機能を利用できます。
知っておくと便利！正規表現の利用例をキャプチャー付けで解説してみます

Randstad Advent Calendar 2018、5日目の記事です。まずはお断りから、、私はランスタッドでマーケティングの仕事をしており、今回の企画では唯一ITメンバーではないものです。が、前職では3年間のエンジニア経験があって、（少し強引）この企画に参加させていただきました。

#この記事は誰に向けて書いているか？
正規表現は知らないが作業効率を上げたい方や、正規表現は少し知っているが仕事上ではなかなか活用できていない方々です。正規表現のプロには向いていませんので、あらかじめご了承ください。

#自己紹介
Web制作会社でWebエンジニア3年、Webコンサルタント3年間を経験しました。Webエンジニア時代では、以下の言語やサービスを触ったことがあります。
- プログラミング言語：PHP、Perl
- データベース言語：MySQL、PostgreSQL
- サーバ：Linux、Windows Server
- Webサイト制作：HTML、CSS、JavaScript
- CMS：Movable Type（PowerCMS）、NOREN、HeartCoreなど

---
**ではでは、本題に入ります～**


#正規表現とはなにか？
正規表現（せいきひょうげん）とは、文字列の中に見つかる「パターン」を表現する記述方法です。パターンを記述することによって、複数の文字列の集合を一通りで表現することができます。

#よく使う正規表現の例
私が前職のエンジニア時代と現職のマーケターとして、よく使う正規表現五つを、キャプチャーを使いながらご紹介します。

##HTMLソースが混ぜられた文章から文章だけを残したいタグ
置換前：`<("[^"]*"|'[^']*'|[^'">])*>`
置換後：※空白
###置換前
![1.png](https://qiita-image-store.s3.amazonaws.com/0/321673/a5ea3e28-a5ff-6ff4-1f34-ae255e484c3a.png)
###置換後
![2.png](https://qiita-image-store.s3.amazonaws.com/0/321673/3027dc0c-e1cb-14ca-538b-9b72412a7047.png)

##電話番号の先頭に、国番号を一括で入れる
置換前：`0([0-9]{1,3}-[0-9]{2,4}-[0-9]{3,4})`
置換後：`+81)$1`
###置換前
![3.png](https://qiita-image-store.s3.amazonaws.com/0/321673/e57f146c-07de-d40a-ce93-f20a0a26564c.png)
###置換後
![4.png](https://qiita-image-store.s3.amazonaws.com/0/321673/4281cd14-36f8-2704-3b8c-ede65977c827.png)

##文章中のスペース（半角、全角）を全部削除したい
置換前：`[ 　]`
置換後：※空白
###置換前
![5.png](https://qiita-image-store.s3.amazonaws.com/0/321673/31b5fb97-a685-e9d0-b17f-d06aa0c13a2c.png)
###置換後
![6.png](https://qiita-image-store.s3.amazonaws.com/0/321673/c1bf2860-6f37-92a1-6f0b-c516882a29f2.png)

##文章中の不要な改行を除く
置換前：`^\r\n|^\r|^\n`
置換後：※空白
※Windowsとmac両方を対応
###置換前
![7.png](https://qiita-image-store.s3.amazonaws.com/0/321673/1c617bce-a7f4-de0c-a7a9-db04a1d3d080.png)
###置換後
![8.png](https://qiita-image-store.s3.amazonaws.com/0/321673/1f2e9d5b-4ff3-c8fb-1822-9abe2fedf005.png)

##メールアドレスから@前半の文字列を取り出したい
置換前：`\@.*`
置換後：※空白
###置換前
![9.png](https://qiita-image-store.s3.amazonaws.com/0/321673/78a1e8d8-aa14-46ae-9bb5-8cbb9df70eb7.png)
###置換後
![10.png](https://qiita-image-store.s3.amazonaws.com/0/321673/4bae92a2-c931-df4f-b594-1c04f28c12cc.png)


#正規表現を活用するには便利なエディタ、サイト
まずはエディタから。
サクラエディタを7年以上愛用しています！すこし宣伝を～
https://sakura-editor.github.io/download.html

次は正規表現が正しいかをチェックできるサイトをご紹介します。
PHPとJavaScriptには対応していますので、便利です。
http://okumocchi.jp/php/re.php

だたし、正規表現はプログラミング言語によって少し違うこともありますので、利用する際には、ご注意ください。

#まとめ
正規表現を一旦身につければ、非常にパワフルで、幅広く利用でき、エンジニア、マーケティング、データ分析などの業務に関わる方には、大いに役立つことは間違いありません。

最後で少し余談ですが、今までの私の経験で、正規表現を知らない同僚に正規表現を教えて、それが彼らの仕事効率UPにつなげる場合は、本当に感謝の言葉をたくさんもらっています。格好付けのスキルにもなりますので、ぜひこの記事を機に勉強してみてはいかがでしょうか～
DevOpsって何ぞや

[DevOps Advent Calendar 2018](https://qiita.com/advent-calendar/2018/devops) 1日目です。

# DevOps って何ぞや

アドベントカレンダーやるにあたり、初心に戻ってDevOpsって何ってところを見てみたいと思います。
最初聞いた時、デブが運用やる話？って思ったのは秘密です。

## DevOps という考え方の出現

[DevOpsとは何か？ そのツールと組織文化、アジャイルとの違い](https://www.buildinsider.net/enterprise/devops/01)

ぐぐってみたら、このサイトを発見して、元々 flickr の人が考えたものだったらしいということを知りました。
とりあえず、最初の考え方って重要ですよね。

読んでもらえるとわかるのですが（手抜き）、Dev（開発）とOps（運用）が愛し合うってことですね（違

![devops_love.png](https://qiita-image-store.s3.amazonaws.com/0/318450/42a8b6df-34c1-1f81-3bf6-e2dd99cc8be0.png)
引用：[10+ Deploys Per Day_ Dev and Ops Cooperation at Flickr Presentation](https://cdn.oreillystatic.com/en/assets/1/event/29/10%2B%20Deploys%20Per%20Day_%20Dev%20and%20Ops%20Cooperation%20at%20Flickr%20Presentation.pdf)

反発しあって、責任を押し付けあっていた、開発と運用が協力しあうことを目標として、そのためのツールや文化について言われています。

## ツール

### 1. Automated infrastructure

`自動化されたインフラストラクチャ`ということで、Ansible とか Terraform とか chef とかなんとか使って構築の自動化するってことですね。
特定の人にしかできない秘伝のたれ的なことをやめましょうってことなのかな。

### 2. Shared version control

`共有化されたバージョン管理`ということで、Git とか SVN とか Mercurial とかなんとか使って、きちんとバージョンを管理しましょうと。
誰のせいとかじゃなくて、どういうリリースをしたから不具合出たってことをはっきりさせようってことかな。

### 3. One step build and deploy

`１手順でのビルドとデプロイ`ということで、Jenkins や CircleCi とか travis とか Google Cloud Builder とか使って、さくっとビルド＆デプロイしましょうと。
コマンドラインを何行もポチポチ打って、ビルドとかデプロイするんじゃねーよと（心が痛い・・・）

### 4. Feature flags

`機能フラグ`ということで、コンフィグファイルなどで、機能をオンオフにできるってことでいいんだと思います。
結構埋め込み式のやつとか見かけますから、オンオフできる方が便利ですよね。
でも、そうするとソースの肥大化とかしないのかな？とか別の心配事項は出てきますけど。

### 5. Shared metrics

`メトリックの共有化`ということで、計測して計測して、そして、計測しましょうってことですかね。
計測された数値で見ることによって、どこがどう悪いのか、とかがわかるわけですよね。
お前が悪いとか、責任のなすりあいにならなくて、問題あるとこ直すだけでよいってことになります。

### 6. IRC and IM robots

`IRCとIMボット`ということで、IRCは最近あまり使われないですけど、slack とか chatwork とか何なら Line でもいいと思います。
そういうとこに、ビルドしたよとか、問題発生したよ、とか自動で流せるようにするわけですね。
最近の開発だと、slack が色々と連携しやすいのもあって、よく使われてるのを見ますが、そこは会社の文化もあるので、好き好きですね。

## 文化

### 1. Respect

`尊敬`ということで、お互いを尊重しましょうと。
けなしあう相手ではないので、尊重して協力してやってきましょうということですかね。
ラブ＆ピースです。

### 2. Trust

`信頼`ということで、お互いのやることを信頼しようということでしょうか。
ビジネスを成功させるためにみんながベストを尽くすという点は共通してるので。

### 3. Healthy attitude about failure

`失敗に対する健全な態度`ということで、失敗は起こるものだと考えましょうってことですかね。
何も失敗せずリリースできればいいですけど、何１つ不具合ないとかの方が珍しいですから、失敗はあるものだと考えて、それを責めたりしないようにしましょうと。

### 4. Avoiding Blame

`非難を避ける`ということで、３とちょっとかぶる感じもありますけど、問題が発生したときに失敗を探すのではなく、問題点を見つけることに注力しろってことですかね。
誰が失敗したとか言ってたら余計な段階を踏むことになるので、問題点を見つけて、それを解決する、というシンプルな方にしましょうと。
まぁ、誰が悪いとか責任のなすりつけあいはよくある話ですね・・・

## 終わりに

細かい話は参照したところを読んでいただけるといいと思いますし、より細かくわかりやすく説明されてます（他力本願）
日本の場合、ツールの方ばかりに目が行って、文化の方はなおざりになるパターンが多いような気もします。
文化も含めての DevOps だと思うので、そのあたり気にかけていきたいものですね。

なんとなく、デブが Ops やるって何だろうと初心に戻る感じで、原点探しをしてみました。
そういう flickr さんは無料版がずいぶんと縮小したようなので、残念な感じではありますが・・・
CoreMLについて、ちょっと調べてみた

ついに今年も12月ですね・・。
12月といえば、、そうAdvent Calendarです！！:innocent:

ということで、今年もAdventCalendarの記事を書きたいと思います。

# 今回の話題

iOS向けにCoreMLという機械学習向けのライブラリが提供されているということで、ちょっと興味を持って調べてみました。
※そこまで深くは見てないです。

# モチベーション

エッジAIでの推論速度周りに少し興味があって、他のフレームワークと比較して、使い勝手がどうなのかなーと思ったため。

# CoreMLについて

overviewは[こちら](https://developer.apple.com/documentation/coreml)
この構造を見ると、CoreMLを基準として、高レベルなレイヤー（Vision、Neural Language、GameplayKit）と低レベルなレイヤー（Accelerate and BNNS、Metal Performance Shaders）に挟まれていることが分かります。

CoreMLは簡単に言えば、「低レベルなレイヤーのみだと使いにくいから、高レベルなレイヤーを用意して、DeepLearningに関する機能をアプリに組み込みやすくする」ために用意されたような印象を受けました。

とりあえず、各レイヤーが何をやっているかをドキュメントから追ってみました。

あと下記の記事がとても良かったです。
https://qiita.com/shu223/items/33774d896b7142fcfc1c

※CoreMLの前（iOS10）から、Neural Networkの構築はできたんですね・・、知らなかった。。

### Vision

ドキュメントは[こちら](https://developer.apple.com/documentation/vision)
APIを見てみると、割と利用シーンを絞って、動画＆画像解析絡みのタスクを簡単に出来るようにしている印象が見られます。

例えば、以下ですね。

* Face Detection
* Text Detection（文字認識って精度がどうかは知らないので、面白そう）
* Object Tracking

結構簡単に組み込めるようになっているのは大変助かりそうですね。

### Neural Language

ドキュメントは[こちら](https://developer.apple.com/documentation/naturallanguage)

画像解析と比較すると、出来ることは限られているように見えますね。
※やはり画像解析の方が発達してるのか・・。

* Tokenization（わかち書きのみ？）
* Language Identification（何の言語かをテキストから推定）
* Linguistic Tags（品詞推定、固有表現抽出）

品詞推定（というより単語の分割）の精度が高ければ、
固有表現抽出の精度もあがると思うので、試しに使ってみたい所。

### GameplayKit

ドキュメントは[こちら](https://developer.apple.com/documentation/gameplaykit)

ゲームを作る上での必要な要素（乱数生成、行動生成とか）をAPIとして提供しているっぽいですが、詳細はちょっと読めてないです・・。
※別途ドキュメント読めたら読もうと思います。

### Accelerate and BNNS

#### Accelerate

ドキュメントは[こちら](https://developer.apple.com/documentation/accelerate)

CPUでの推論速度を向上するためのアクセラレーターっぽいですね。
※ニューラルネットワークでの推論最適化フレームワークは最近色々とあって（TVM、OpenVINOとか）、エッジAIの波が来てますよね。

ここは別途詳細調査したいと思っています。

#### BNNS

ドキュメントは[こちら](https://developer.apple.com/documentation/accelerate/bnns)

~~んー、、NNの基本的なAPI群を提供しているっぽいが、、後述するMPSと位置づけがかぶっているような・・。
※ということで、詳しく見てないです。~~

どうやら、CPUでの推論最適化を行えるような実装になっているっぽいですね。
※MPSがGPUでの最適化に対し、BNNSはCPUでの最適化のようですね。

### Metal Performance Shaders（MPS）

ドキュメントは[こちら](https://developer.apple.com/documentation/metalperformanceshaders)

こちらは基本的にGPUを利用したNNに関するモデルを構築出来るようにAPIを提供してそうです。
RNNやCNN系列のAPIをそれぞれ提供しているみたいです。

* [RNN](https://developer.apple.com/documentation/metalperformanceshaders/recurrent_neural_networks)
 * GRUやLSTMもレイヤーとして提供してくれるのはありがたいですね。
* [CNN](https://developer.apple.com/documentation/metalperformanceshaders/convolutional_neural_network_kernels)
 * 多分、こっちから出来たのかな？
 * Convolution, Pooling, FCレイヤー, Activationレイヤーといった基本的な所は提供されています。（BatchNormやDropoutなども） 
 * またConvについては、DepthWiseやBinaryも提供されていて、結構使い勝手良さそう。


# 最後に

CoreMLについて、概要レベルですが、少し調べてみました！
※個人的には推論最適化周りがちょっと興味あるので、Accelerateはもう少し掘り下げて見ようと思ってます。

明日は @discake の登壇になります！
皆様、お楽しみに！
nexeでexeにドラッグアンドドロップされたファイル・フォルダを取得する

#始めに
nexeでパッケージしたexeにドラックアンドドロップされたファイル・フォルダのパスを受け取って色々したいなーと思って調べました。

#実装
普通にnode.jsのコマンドライン引数を使えば良さそうです。

```javascript
const fs = require('fs');

const ddfilelist = process.argv.slice(0,process.argv.length); //argvをコピーする
ddfilelist.splice(0,2); //3番目以降がコマンドライン引数なのでその部分だけ取得

ddfilelist.forEach((item) => {
  const type = fs.statSync(item).isDirectory() ? "directory" : "file";  //directoryかfileか判定
  console.log(`${item} : ${type}`);
})
```
Goでdockerコマンドの履歴を保存&実行するツール作った

[Docker Advent Calendar 2018](https://qiita.com/advent-calendar/2018/docker) 1日目です。

こんにちわ。

せっかくのアドベントカレンダー初日でエントリーがなかったので、
サクッとエントリーして、サクッとツールを作ったのでサクッと紹介します。

# どんなやつ
`docker ps -a`やら`docker run --rm -it golang`やらのコマンド履歴を保存して、
検索&実行ができるやつです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/90eab1ae-3760-641f-70cc-3c18ed279ee8.png)

# 導入
[こちら](https://github.com/skanehira/god)に参照ください。
`go get`するかバイナリダウンロードするかしてください。

Macでしか動作確認していないのですが、Linuxでも動くと思います。
動かなかったらissueください。

# おすすめ設定
`alias docker='god'`しておくことをおすすめします。
引数を指定した時は内部でその引数をdockerコマンドに渡しているだけですので、すべての引数使用可能です。

# 使い方
- 履歴一覧から選択して実行
引数無しで実行する一覧が出力されるので、選択した履歴が即実行されます。
![notargs.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/baa385e2-0e9e-fa71-d487-81b06b1285e2.gif)

- 引数を渡して実行
引数を渡すとそのままdockerコマンドに引数が渡され実行されます。
![haveargs.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/133d57bf-ec15-b384-1136-8f67a0af3ca4.gif)

# 履歴の保存先
`$HOME/.docker_cmd_history`にあり、ただのファイルです。
削除すれば履歴全部消えます。

# 終わりに
`Ctrl+r`でコマンド履歴検索できるので、使い道はあまりなさそうですが、
dockerコマンドに関する履歴だけ絞って再実行する時に便利かもしれません。

サクッと作ったので、バグがあるかもしれません。
その時はissueください。

では、引き続きアドベントカレンダーお楽しみくださいー