OmniAICreator/Qiita-1.07M huggingface dataset:
少しでもQiitaに貢献出来たらと

#$whoami
都内の高校二年生。Linux、Pythonなど触るもまだまだ素人。
#Qiitaを始めようと思ったきっかけ
今までPython関連、特にOpenCV・Tensorflowでさんざんお世話になったため。日本語のないドキュメントを参照する機会が多く、日本語で書かれたページの必要性を感じた。

#なにをするのか
作ったものとかまだ載せられるレベルではないので、自分が遭遇したエラーとその対処法などをtipsとして投稿していきたい。
kivyをインストールするのに戸惑った話

## 経緯
諸事情によりPythonでGUIアプリの制作を行うことになったので、どのライブラリを用いるか悩んだ結果、Kivyを使おうと考えたのですが....

## 入らぬ
公式の[Installation](https://kivy.org/docs/installation/installation-osx.html#using-homebrew-with-pip)にしたがって、環境構築を行なったがエラーを吐かれてインストールができない( ˘ω˘ )


## 環境
macOS Sierra 10.12.6
Homebrew 1.3.4
python 3.5.2

## 解決策
有志の方々が日本語に翻訳を行なってくださっているページに書かれている方法で導入できました。
[日本語翻訳 Installation](https://pyky.github.io/kivy-doc-ja/installation/installation-osx.html#using-homebrew-with-pip)

## 終わりに
環境構築はできたものの、公式のInstallationでインストールできなかった原因が不明なので、時間がある時に確認をしたいです。
apiblueprint のパラメーター内の記述で "-"(ハイフン) を使うとき

APIBlueprint を試しがてら使っているのですが、`-`(ハイフン)が入った値をパラメーターのサンプル値として設定するときに思ったような挙動をしなかったのでメモします。

```
+ Parameters 
  + sample1: sample1_val (string, optional) - サンプル1
  + sample2: sample2-val (string, optional) - サンプル2
```

みたいな記述をしたときに、 `sample2` の方がなぜか `reuired` で出力されてしまいます。

これはどうも ハイフン が原因のようで、ハイフン を使うときは `(バッククォート)で括らないといかんみたいです。

なので、

```
+ Parameters 
  + sample1: sample1_val (string, optional) - サンプル1
  + sample2: `sample2-val` (string, optional) - サンプル2
```

とやれば大丈夫です。

リファレンスに書いてありそう。
parseIntの基数問題


[この記事](https://qiita.com/standard-software/items/493651c84ca6ff34e4e4)を読んで、基数の罠は分かりすぎると思いつつ、標準関数の上書きのキモさが気になったので、自分がやるならどうするか考えてみた。

関数を上書きするのではなく、基数を固定したラッパー関数として実装すれば意味としても明確になるし標準関数を汚染もしないし良いのではと思う。

```js
function parseInt10(value) {
  return parseInt(value, 10);
}
function parseInt8(value) {
  return parseInt(value, 8);
}
function parseInt2(value) {
  return parseInt(value, 2);
}
```

ちなみに自分は標準関数をちゃんと基数付きで使えばいいじゃんと考えています。
色だと16進数だしビットフラグで2進数のときもあるし、文字から数値をパースするっていう用途に対してちゃんと設計されているので、
そのあたりの思想とか考え方をちゃんと把握しているほうがいいし、「オリジナルと違う」という気遣いが逆に余計な場合もあるので、素直にオリジナル使うのが一番よいのではと思った。
CSSで木目調背景と畳調背景

直接的に役に立つことはあまり無さそうですが、CSSのデザインのアイデアの一つとして記述します。
#結果から
将棋盤のイメージを作りました。
ソースはCodePenで公開しています。
https://codepen.io/nakyos/pen/RKJKEL
※以下は、Windows10、Chromeで表示した際のスクリーンショットです。
![shogi.png](https://qiita-image-store.s3.amazonaws.com/0/202377/5fb506c6-adc5-d997-50c6-51082fe53c24.png)
#盤
素材：榧
木目：板目
※柾目のほうが高級ですが、デザインとして面白い板目を選択しました。

```css:css
#board {
  background:
    linear-gradient(
      90deg,
      rgba(208, 147, 82, 0.6),
      rgba(192, 134, 70, 0.6) 60%,
      rgba(208, 147, 82, 0.6)
    ),
    repeating-radial-gradient(
      ellipse at 60% 500%,
      #c08646,
      #c08646 0.2%,
      #d09352 0.6%,
      #d09352 1%
    );
}
```

repeating-radial-gradientで、板目の楕円形を表現しています。
ただ、それだけだとクッキリし過ぎていたので、linear-gradientを重ねて程良くボヤけさせてみました。
#駒台
素材：桂
木目：柾目

```css:css
.stand {
  background:
    repeating-radial-gradient(
      circle at -1000% 0%,
      rgba(116, 77, 48, 0.7),
      #573216 7.5%,
      rgba(116, 77, 48, 0.9) 10%
    ),
    repeating-radial-gradient(
      circle at -1000% 0%,
      #573216,
      #573216 0.1%,
      #744d30 0.4%,
      #744d30 0.5%
    );
}
```

2つ目のrepeating-radial-gradientで、板目の直線に近い円形を表現しています。
ただ、それだけだとあまりにも規則的で人工的な印象になったので、1つ目のrepeating-radial-gradientを重ねて全体に濃淡の差を付けてみました。
#畳
素材：い草

```css:css
body {
  background:
    linear-gradient(
      0deg,
      rgba(139, 126, 74, 0.8),
      rgba(168, 157, 95, 0.6) 10%,
      rgba(168, 157, 95, 0.2) 90%,
      rgba(139, 126, 74, 0.8)
    ),
    linear-gradient(
      90deg,
      #f9daa4,
      #f9daa4 25%,
      #cea660 25%,
      #cea660 50%,
      #ddba78 50%,
      #ddba78 75%,
      #c69f5a 75%,
      #c69f5a
    );
  background-size: 4px 20px;
}
```

細かい縦と横のlinear-gradientを重ねて表現しています。
グラデーションの上下で少しだけ濃さを変え、上から光が差している状況をイメージしました。
EC2サーバにPython3環境構築

# やりたいこと
AWSのEC2サーバ上で、pyenv + Python最新版が動く環境を作る

### インスタンス情報
- インスタンスタイプ t2.micro
- Amazon Linux AMI 2017.03.1.20170812 x86_64 HVM

# pyenvインストール
githubのリポジトリからクローンしてきます
gitが入ってない場合は先にyumでgitをインストールします

`$ sudo yum install git -y`

```
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
Cloning into '/home/ec2-user/.pyenv'...
remote: Counting objects: 15477, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 15477 (delta 1), reused 6 (delta 1), pack-reused 15468
Receiving objects: 100% (15477/15477), 2.74 MiB | 2.15 MiB/s, done.
Resolving deltas: 100% (10593/10593), done.
```

リポジトリをクローンしてきたらパスを通してコマンドが打てるようにします

```
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```

ちゃんとコマンドが通るか確認

```
$ pyenv -v
pyenv 1.1.4-4-g433e2d1
```

# pythonインストール

### 必要な依存関係のインストール

`$ sudo yum install gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel -y`

### 本体のインストール

```
$ pyenv install 3.6.2
Downloading Python-3.6.2.tar.xz...
-> https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xz
Installing Python-3.6.2...
Installed Python-3.6.2 to /home/ec2-user/.pyenv/versions/3.6.2
```

### バージョンをインストールしてきたものに切り替え
以下のコマンドでこのOSで使用するPythonのバージョンを宣言

```
$ pyenv global 3.6.2
$ pyenv rehash
```

ちゃんと切り替わったか確認

```
$ python --version
Python 3.6.2
```

成功です
SRE本まとめ（5章 トイルの撲滅）

自分の理解を深めるためにまとめてみました。[4章](https://qiita.com/bassbone/items/fd5b1e4fc257043318f7)の続きです。

## 5章 トイルの撲滅

### トイルの定義
- 手作業であること。
- 繰り返されること。
- 自動化できること。
- 戦術的であること。
- 長期的な価値を持たないこと。
- サービスの成長に対してO(n)であること。

### トイルは常に悪なのか？
トイルが必ずしも悪なのではなく、少量であれば逆にトイルの対処をすることで小さい達成感が得られ、精神面でメリットがある。問題なのはトイルが大量の場合である。あまりにも大量のトイルをこなしていると開発側からSRE側にトイルが回ってくる可能性がある。

（[6章](https://qiita.com/bassbone/items/86414eddcc2b2d2b05ac)に続く）
FreeBSD をインストールしたらpkgやporstnapを使おうとしてもError Fetchingとなる

## errorの内容
vagrantを使ってFreeBSDを導入していたが、DVDなどからインストールを真面目にやってなかったのでやってみたらひっかかった。

```
root@FreeBSD11:~# pkg update
The package management tool is not yet installed on your system.
Do you want to fetch and install it now?[y/N]:y
Bootstrapping pkg from pkg+http://pkg.FreeBSD.org/FreeBSD:11:adm64/quarterly,please wait...
pkg: Error fetching http://pkg.FreeBSD.org/FreeBSD:11:adm64/quarterly/Latest/pkg.txz: No address record
A pre-built version of pkg could not be found for your system.
Consider changeing PACKAGESITE or installing it from ports: 'ports-mgmt/pkg'.


root@FreeBSD11:~# portsnap fetch
Looking up portsnap.FreeBSD.org mirrors...none found.
Fetching snapshot tag from portsnap,FreeBSD.org... failed.
No mirrors remaining,giving up.
```

***

## /etc/resolv.confをvagnrantで導入したものと比較したらおかしかった

* なぜか2つ入っていた

```/etc/resolv.conf
#nameserver 10.x.x.x

nameserver 127.0.0.1
```

## 修正
* vagrantできちんと使えてるアドレスに修正したらpkgもportsnapも普通に使えた

```/etc/resolv.conf
nameserver 10.x.x.x

#nameserver 127.0.0.1
```

***

## 結論
インストールのマニュアルを見ずに適当にDNS設定をしたのが行けないとは思う。
メッセージをちゃんと読むと「No address record」と書いてあったのでportsnapを実行する前に気づきたかった。
Heroku Container RegistryでRailsアプリを動かす

## 手順

https://devcenter.heroku.com/articles/container-registry-and-runtime

## 良い点

* Buildpacksを考慮しないで済むようになる
* Buildpacksで提供されてない環境を作れる
* 他のDockerの環境に移行するのがしやすくなる

## 制限

* Review Appsが使えない
* Automatic deploysやManual deployが使えない

## 構築例

https://github.com/f96q/kptboard

```:Dockerfile
FROM ruby:2.4.1

ENV RAILS_ENV production
ENV SECRET_KEY_BASE secret_key_base
ENV NODE_ENV production
ENV NPM_CONFIG_PRODUCTION false

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb http://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash -
RUN apt-get update -qq && apt-get install -y nodejs yarn
RUN mkdir /app
WORKDIR /app
ADD Gemfile /app/Gemfile
ADD Gemfile.lock /app/Gemfile.lock
RUN bundle install --without development test
ADD . /app
RUN cp /app/config/database.yml.nulldb /app/config/database.yml
RUN yarn install
RUN yarn run build
RUN bundle exec rake assets:precompile
RUN rm /app/config/database.yml

CMD bundle exec puma -C config/puma.rb
```

```:.dockerignore

.bundle

log
tmp

node_modules
yarn-error.log

.byebug_history

app/assets/javascripts/bundle.js
.env
.env.app
.env.db
.git
```

### コマンド

SECRET_KEY_BASEはrake secretの実行結果を設定する。

```bash
heroku create
heroku container:push web -a kptboard
heroku config:set SECRET_KEY_BASE=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx RAILS_LOG_TO_STDOUT=true RAILS_SERVE_STATIC_FILES=true
heroku addons:create heroku-postgresql:hobby-dev
heroku run rake db:migrate
```
jestのmockを有効活用する

# jestでテストするときはautomockをオンにするとよい
という話を書いたのですが、どうやって使うのかを書き忘れたので、こちらに書いておきます。
http://qiita.com/naokitomita/items/c60d201671d001333ee9

# 例

```js:app.js
import { hoge, fuga } from "../utils";

export function hogefuga() {
  return hoge() + fuga(2);
}
```

```js:utils.js
export hoge() {
  return "hoge";
}

export fuga() {
  return "fuga";
}
```

## テスト

```js:__test__/app.test.js
import { hogefuga } from "../app";
import { hoge, fuga } from "../utils";
jest.unmock("../app");

describe("app", () => {
  describe("#hogefuga", () => {
    describe("hoge, fuga returns hoge each.", () => {
      beforeAll(() => {
        // hoge, fugaは
        // https://facebook.github.io/jest/docs/en/mock-function-api.html
        // ↑に記述されているmockに置き換わっています。
        hoge.mockReturnValue("hoge"); // hogeを返すように設定しておいたり
        fuga.mockImplementation((p) => { // 実装を定義したりできます
          console.log("fuga called with: " + p);
          return "fuga";
        });
      });

      it("shuld returns hogefuga", () => {
        expect(hogefuga()).toEqual("hogefuga");
        expect(hoge.mock.calls.length).toBe(1); // 呼び出し回数
        expect(fuga.mock.calls[0][0]).toBe(2); // 1番目に呼ばれたときの第1引数のチェック
      });
    });
  });
});
```

# 参考
https://github.com/naoki-tomita/jest-mock-test
ここにサンプルを置いておきました。
Heroku Review AppsでRailsアプリケーションを動かすのに調べたこと

## どのpull reqのアプリかどうかを判定する方法

```js:app.json
{
  "env": {
    "HEROKU_APP_NAME": {
      "required": true
    }
  }
}
```

app.jsonでHEROKU_APP_NAMEを設定しておくと、HEROKU_APP_NAMEに`アプリ名-pr-pull reqの番号`で値が入るので判定できる。

## Amazon S3を使う

Review Appの場合pull reqごとに別環境前提になるので同じS3のバケットでディレクトリを別にするか、アプリごとにS3のバケットを作成後する。

### 同じS3のバケットを使う方法

アプリ毎に別のディレクトリにアップロードできるようにする。

#### CarrierWaveの例

```rb
class ApplicationUploader < CarrierWave::Uploader::Base
  def store_dir
     if ENV['HEROKU_APP_NAME'].present?
      "#{ENV['HEROKU_APP_NAME']}/uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
    else
      "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
    end
  end
end
```

###  S3バケットを作成する方法

aws-sdk-rubyを使いS3バケットを作成、削除するようにすれば良い。

https://devcenter.heroku.com/articles/github-integration-review-apps#pr-predestroy-script

1. pr-predestroy scriptでそのpull req用のS3のバケットを作成してバケットを環境変数にセットする
2. pr-predestroy のときにpull req用のS3バケットを削除する

## MySQLを使う

Clear DBは環境変数がDATABASE_URLで入ってこないため工夫が必要になる。

### ビルド時にHerokuのAPIを使ってDATABSE_URLにセットする方法

https://gist.github.com/derwiki/81ea11ffd8dd23d9cae7b706dea2dbc1

### database.ymlを修正する方法

```yaml:database.yml
production:
  url: <%= ENV.fetch('CLEARDB_DATABASE_URL', '').sub('mysql://', 'mysql2://') %>
```
Peek-a-tab + Vimiumでマウスレスなブラウジングをしよう

#1.前置き
## 大量にタブを開いた時
これくらいなら平気ですが、
![2017-09-25_09h40_24.png](https://qiita-image-store.s3.amazonaws.com/0/146590/4fa3912f-daca-7a05-c336-78822f542ee1.png)
このくらいになると何を開いているのかすら判らなくなってきます。
![2017-09-25_09h41_30.png](https://qiita-image-store.s3.amazonaws.com/0/146590/7ee53cc1-31e5-ce0a-7845-415264ab8712.png)
## Google検索をした時
少し前の話ですが、Googleの検索結果ページでショートカットキーが使用できなくなりました。
[Google 検索結果 ショートカット - Google 検索](https://www.google.co.jp/search?q=Google+%E6%A4%9C%E7%B4%A2%E7%B5%90%E6%9E%9C+%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88&oq=Google%E3%80%80%E6%A4%9C%E7%B4%A2%E7%B5%90%E6%9E%9C%E3%80%80%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88&aqs=chrome..69i57j0j69i64.13333j0j7&sourceid=chrome&ie=UTF-8)
検索ワードを入力し、キーボード操作で各ページまで行けるのが快適だったのですが、ショートカットが使えなくなってマウス操作が必要になり、少し面倒になりました。

#2.プラグインで快適にブラウジングしよう！
下記のプラグインを組み合わせると、キーボード操作だけでブラウジングする事が可能になり、どれだけタブを開いても迷子にならなくなります。
##[Peek-a-tab](https://chrome.google.com/webstore/detail/peek-a-tab-tabs-manager-f/nnpdamdaknpnohmlbnmgphiodghbohop)
タブ管理用のWindowで、今開いているタブを見渡せるプラグインです。
![2017-09-25_09h42_29.png](https://qiita-image-store.s3.amazonaws.com/0/146590/fe9ddfa7-8c52-cb20-3fd6-53d64efdd17a.png)
操作法はシンプルです
- Alt+Spaceでタブ管理用Windowの呼び出し
- カーソルキーで目的のタブに移動
- Enterでタブの決定。決定後はWindowが勝手にcloseされます。

##[Vimium](https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb)
「Vimっぽいキーバインドで、Chromeも操作しよう」というコンセプトのプラグインです。
基本的な操作は以下のようになっています。
- 「j」「k」ブラウザを下、上へスクロール
- 「/」画面内検索を開始（検索ワードを入力し画面内検索を行います。ブラウザ機能の画面内検索と併用可能です）
- 「f」画面の中にあるリンクを開く（fを押下すると、画面内にあるリンク全てにショートカットが割当てられます）
![2017-09-26_19h39_17.png](https://qiita-image-store.s3.amazonaws.com/0/146590/6839b3bb-2077-8eb5-a97c-a1f8a5ea43b0.png)
j, k, fだけでも覚えておくと、ブラウジング中にマウスへ手を伸ばす機会が激減すると思います。
ざっくばらんメモ_8：kaggle, projective space


###kaggle
Resnet regressionモデルを
stackingを含めたアンサンブルモデルの中へ
組み込んで見る．
現在学習中（結構時間がかかる）


###projective spaceを利用した線分及び面の表現
(x, y)２次元ユークリッド空間における線分は
ax + by + c = (x, y, 1)(a, b, c)^T = 0
の形式で表す事ができる．
ここで，l = (a, b, c)を線分と呼ぶ．
この時，係数をk倍した場合の
kax + kby + kc = (kx, ky, k)(a, b, c)^T = 0
も同じ線分を表しているため，このkに関する軸wを新たに含んだ
(x, y, w)の３次元空間をprojective spaceと呼び，
対応する線分上の点を(x/w, y/w)で代表して表現する．
ここで，(x, y, w)が線分上の点を表す条件は
上式で(kx, ky, k)を(x, y, w)で置き換えれば，
(x, y, w)(a, b, c)^T = 0
になる．
これは面表現に拡張する事が可能で，今度は(x, y, z)３次元ユークリッド空間で
考えた時，ある３次元直線ax + by + cz + d = 0があってそれを法線として捉えれば
対応する平面を構成出来る．
すると結局３次元直線だけを考えておけば良い事になる．
対応するprojective space(x, y, z, w)表現は
ax + by + cz + dw = 0
となる．
ここでn = (a, b, c)は法線ベクトル（必ずしも単位長でない）で
原点から平面への距離は
D = w / ||n||
で表せる．(http://mathinsight.org/distance_point_plane)
Go言語で素数を求める（Hello World 的サンプルプログラム）

なんとなく Go 言語を勉強してみた。

## Go言語のインストール

[Go言語のインストール](http://golang.jp/install)を見てやった。私の環境は Ubuntu 14.04 なのだが、バイナリが用意されていて、それを `/usr/local/go`に展開するだけ。拍子抜けするくらいインストールは簡単だった。Mac や Windows でもバイナリーが用意されているようだ。

## Go言語のチュートリアル

[A Tour of Go（日本語版）](https://go-tour-jp.appspot.com/welcome/1)が素晴らしい。ウェブ上でインタラクティブに Go言語のコードが実行できるようにもなっている。文字通り30分もこのチュートリアルを学べば、基本的なプログラムが書き始められるようになるだろう。

## 100未満の素数を求める
```go:prime.go
package main

import (
	"fmt"
)

func IsPrime(n int) bool {
  if n < 2 {
    return true
  } else if n == 2 {
    return true
  } else if n % 2 == 0 {
    return false
  } else {
    i := 3
    for i * i <= n {
      if n % i == 0 {
        return false
      }
      i += 2
    }
    return true
  }
}

func main() {
  for i := 2; i < 100; i += 1 {
    if IsPrime(i) {
	    fmt.Println(i)
    }
  }
}
```
素数を求めるにはもっとよいアルゴリズムがあるがとりあえずこれは Hello World 的習作なのでこれでよい。

# Go言語の実行とビルド

単に実行してみるだけなら、

```shell-session
$ go run prime.go
```
単独で実行できるバイナリが欲しければ、

```shell-session
$ go build prime.go
```
とする。この場合 `prime` という名前の実行ファイルができるので、

```
$ ./prime
```
とすれば、

```
2
3
5
...
```
などと結果が表示される。
ちなみに私の環境ではこの実行ファイルのサイズは1.8MBもあった。いろいろライブラリが静的にリンクされているのだろう。

# 感想

Go言語をちょっと触ってみるのはすこぶる簡単。
node.jsをアンインストールする

node.jsをアンインストールしようとしてつまづいたので、備忘録として。

##何をやってしまったか
 - パッケージマネージャ(.pkg)でnode.jsをサクッとインストール
 - 別のソフトウェアでnode.jsの最新版を使用しろ！と言われ、n latestコマンドを実行→開発途中のnode8.11へとアップグレードされる
 - Native Scriptを使おうとするとnode6以上で！と言われる（node8.11だと怒られた）
 - n 6.2 install を実行しても何も起きない（node5が規定のまま)
 - 
…さて、ここからどうしよう。

##ネット上で掲載されている方法
http://umekov.hatenablog.com/entry/2016/12/03/000001 を参考に作業すると、下記のようなコマンドに遭遇しますが、現在ではこの方法でnode.jsは削除できませんでした。
（npmの削除は「npm uninstall -g npm」でしっかりアンインストールできました）
```shell-session
$ lsbom -f -l -s -pf /var/db/receipts/org.nodejs.pkg.bom | while read i; do sudo rm /usr/local/${i}; done
$ sudo rm -rf /usr/local/lib/node /usr/local/lib/node_modules /var/db/receipts/org.nodejs.*
```
でも、これを実行しても「ファイルがないよ」と怒られてしまった。

##こういう時は大人しくpathを見てみる
パッケージマネージャでインストールしていると、一番最後の画面に「$PATHにnode足しといたよ、よろしくね！」ということが英語で書いてある。
つまり、PATHを見ればどこにnode.jsのファイルがあるかがわかる、ということです。
1. まずは以下のコマンドを実行する
```shell-session
echo $PATH
```
を実行したら、「node」と書いてあるものを探してください（PATHの通っているフォルダは**：**区切りで表記されています）
2. 見つけたら該当のフォルダへ「cd」コマンドで遷移→「cd ../」コマンドで一つ上のディレクトリに移動します。
```shell-session
cd (見つけたディレクトリ）
cd ../
```
3. 「rm」コマンドを「sudo」で実行します（PCの管理者パスワードを要求されます）
4. 最後にPATHを書き換えます。一旦「echo $PATH」の実行結果をメモ帳に貼り付け、先ほど削除したディレクトリの情報を削除してください。
```shell-session
vi ~/.bash_profile
```
5. 削除が完了したら、全てのPATHが通っているディレクトリが「：」で繋がっていることを確認して下さい。確認が完了したらその結果をvim上のPATHで始まるところにコピぺして、保存してください。
```shell-session
PATH=(先ほどコピーしたものをそのまま貼り付ける）
```
終わったら下記コマンドを実行して以下のものが出てくることを確認したら完了です！
```shell-session
source ~/.bash_profile
-bash: node: command not found
```
##次からは
nodebrewやnvmパッケージマネージャを使ってインストールしましょう！
 - nvm(Node.jsパッケージマネージャ） https://github.com/creationix/nvm
 - nodebrew https://qiita.com/ebisennet/items/15c3c9fdb04e66db6323
High SierraにアップデートされたMacでHomebrewがうまく動かない時

どうせなんだかんだ行ってもOSはアップデートしなくてはいけないのです。怖い怖い言ってもしかたないので、検証用の予備MacでHighSierra(macOS 10.13)を試してみました。

一見なんの問題もなくアップデート出来ていたのですが、```brew update```を叩いた時に```/usr/local```のパーミッション絡みで怒られます。

homebrewでよく見るトラブルなのですが、よく提示される解決方法である以下のコマンドが通りません。

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

そもそも上のコマンド、パーミッションエラーが出た時にコマンドそのものが表示されて、こいつを試せと促されるのですが今回はそれも出ず、そもそもエラーで通りません。

さて、どうしたものか？解決はカンタンです。**homebrewを突っ込み直しましょう。** 

homebrewのサイトから以下を引っ張ってきてターミナルで実行すれば解決です。

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

あとはいつものようにインストールが走り、Xcodeを実行していなければ規約の同意しとけと言われます。(Xcodeアップデート後のあるあるですね)
とりあえず終わったらコケていたbrew updateを試みてみましょう。

```
$ brew update
Already up-to-date.

```

はい、問題なく動いてますね。以上で解決。
BigQueryで10分ごとに集計するSQL

# BigQueryでログを10分ごとに集計する
10分ごとにBigQueryで集計したかったのでそのやり方をまとめました。
紹介するクエリの一部の変更で「1時間ごと」や「1分ごと」にも対応できます。

## サンプルテーブル
本記事では以下のようなログテーブルを例に集計を行います。

| カラム | 型 |
|:-----------|------------|
| is_sucsess | BOOLEAN |
| create_time | TIMESTAMP |
| ... | ... |

## クエリ
以下のクエリで10分間隔にsucsess(true or falseごとに)を集計を行います。
timestampを文字列に変換し、先頭から15文字(10分単位のところまで)を切り取り、それを利用しGROUP BYします。

```
SELECT time, is_success, count(1) AS cnt FROM (
  SELECT
    CONCAT(SUBSTR(FORMAT_TIMESTAMP('%Y-%m-%d %H-%M-%S', create_time, 'Asia/Tokyo'), 0, 15), "0") AS time,
    is_success
  FROM
    `プロジェクト名:データセット.テーブル名`
)
GROUP BY time, is_success
ORDER BY time, is_success
```

## 出力例
| time | is_sucsess | cnt |
|:-----------|------------|-----------|
| 2017-09-20 11:00 | true | 53 |
| 2017-09-20 11:00 | false | 2 |
| 2017-09-20 11:10 | true | 63 |
| 2017-09-20 11:10 | false | 3 |
| 2017-09-20 11:20 | true | 51 |
| 2017-09-20 11:20 | false | 1 |
| ... | ... | ... |


## まとめ
上の15の部分を適宜変えることで10分間隔だけでなく「1時間ごと」や「1分ごと」などにも対応可能です。
また、Asian/Tokyoの部分を適宜タイムゾーンに合わせる必要があります。
雑SQLなので、3分単位などの単位区切り以外での時間の集計には対応できません。
もっと良い方法、SQLがあったら教えてください！！！！

## 参考
- https://cloud.google.com/bigquery/docs/reference/legacy-sql?hl=ja#current_timestamp
Pythonでグラフを描く

# はじめに
Pythonを使ってグラフを描く方法を紹介します。
matplotlibを使います。

# 2次曲線
次の関数を例にして基本的なグラフの書き方を示します。

```math
y = 4x(1-x)
```

定義域は[0,1]です。
plotでグラフデータを設定します。showで表示します。

```py3
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 1, 100)
plt.figure(0)
plt.plot(x, 4*x*(1-x))
plt.show()
```

![figure_0.png](https://qiita-image-store.s3.amazonaws.com/0/84205/5577a5ff-2325-edb8-2d76-35edb7e57a29.png)

# 縦横比1：1
縦横比を1：1にします。

> plt.gca().set_aspect('equal', adjustable='box')

```py3
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 1, 100)
plt.figure(0)
plt.gca().set_aspect('equal', adjustable='box')
plt.plot(x, 4*x*(1-x))
plt.show()
```

![figure_0.png](https://qiita-image-store.s3.amazonaws.com/0/84205/f4260cd7-b5be-164f-80d5-41eee7e08b6d.png)

# タイトル、xラベル、yラベル、グリッド
タイトル、xラベル、yラベル、グリッドを表示します。
title / xlabel / ylabel / gridを使います。

```py3
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 1, 100)
plt.figure(0)
plt.gca().set_aspect('equal', adjustable='box')
plt.title('logistic map')
plt.grid(True)
plt.xlabel('x')
plt.ylabel('y')
plt.plot(x, 4*x*(1-x))
plt.show()
```

![figure_0.png](https://qiita-image-store.s3.amazonaws.com/0/84205/2e89b5b5-8001-0f95-1c9e-3231266e2e8a.png)

# 系列の追加
plotを実行することで系列を追加できます。

> plt.plot(x, x*(1-x))

```py3
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 1, 100)
plt.figure(0)
plt.gca().set_aspect('equal', adjustable='box')
plt.title('logistic map')
plt.grid(True)
plt.plot(x, 4*x*(1-x))
plt.plot(x, x*(1-x))
plt.xlabel('x')
plt.ylabel('y')
plt.show()
```

![figure_0.png](https://qiita-image-store.s3.amazonaws.com/0/84205/75bdf658-ccb1-3b68-60fe-6aeadece5e06.png)

# 凡例
凡例はlegendで設定します。

> plt.legend(["r=4", "r=1"])

```py3
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 1, 100)
plt.figure(0)
plt.gca().set_aspect('equal', adjustable='box')
plt.title('logistic map')
plt.grid(True)
plt.plot(x, 4*x*(1-x))
plt.plot(x, x*(1-x))
plt.xlabel('x')
plt.ylabel('y')
plt.legend(["r=4", "r=1"])
plt.show()
```

![figure_0.png](https://qiita-image-store.s3.amazonaws.com/0/84205/242d1bb6-1776-9058-ca22-fb86552b91fc.png)

# 数式、フォントサイズ
$で囲むことで数式が入力できます。fontsizeでフォントサイズを指定できます。

>
plt.xlabel('\$x\$', fontsize=20)
plt.ylabel('\$y(x)\$', fontsize=20)
>

```py3
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 1, 100)
plt.figure(0)
plt.gca().set_aspect('equal', adjustable='box')
plt.title('logistic map')
plt.grid(True)
plt.plot(x, 4*x*(1-x))
plt.plot(x, x*(1-x))
plt.xlabel('$x$', fontsize=20)
plt.ylabel('$y(x)$', fontsize=20)
plt.legend(["r=4", "r=1"])
plt.show()
```

![figure_0.png](https://qiita-image-store.s3.amazonaws.com/0/84205/58748b34-1547-1277-bc58-a1d5537d6e55.png)

# References
- [1] https://matplotlib.org/contents.html
SRE本まとめ（4章 SLO）

自分の理解を深めるためにまとめてみました。[3章](https://qiita.com/bassbone/items/756ef8b4769ceb0ee000)の続きです。

## 4章 SLO

### 用語
- SLI：指標。例：リクエストのレイテンシ、エラー率、システムスループット、可用性。
- SLO：目標。
- SLA：アグリーメント。契約に関する話なのでSLAの取り決めのSREが直接関わることはない。ただSLO違反のSLAにならないようにSREがチェックしたほうがいい。

### SLI
#### 例
- サーバーシステム：可用性、レイテンシ、スループット
- ストレージシステム：レイテンシ、可用性、耐久性
- ビッグデータシステム：スループット、レイテンシ

全てのシステムで正確性は重要。

### 収集
サーバサイドでやるのが通常だが、クライアントサイドでやらないといけにあケースもある。

### 集計
平均値を取ってしまうと重要な細部をぼかしてしまう可能性があるため、分布を取る方がよい。パーセンタイルをみてみるのもよい。

### SLO
#### ターゲットの選択
- 現在のパフォーマンスに基づいてターゲットを選択してはならない
- シンプルさを保つ
- 「絶対」は避ける
- SLOは最小限にとどめる
- 最初から完璧でなくてもよい

#### 期待の設定
- 安全マージンを確保する：対外的なSLOと内部的なSLOの間にマージンを置くことで、メンテナンスのためのバッファが確保できる。
- 過剰達成を避ける：意図的にメンテンナンスを設けることもあり。

（[5章](https://qiita.com/bassbone/items/00c754f86a02b1f22413)に続く）
Markdown の画像に枠線をつける

タイトル通りなのですが、Markdownの画像に枠線をつける方法が分からず、これで自己完結。
他に良い方法があれば教えてください。

テーブル記法の応用です。前後に空行が必要かも。

**元画像**
![markdown-mark.png](https://qiita-image-store.s3.amazonaws.com/0/203949/cd727bb6-ae78-7e26-fea6-d50942e33e28.png)

**枠線あり**

|![markdown-mark.png](https://qiita-image-store.s3.amazonaws.com/0/203949/cd727bb6-ae78-7e26-fea6-d50942e33e28.png)|
|:-:|

```
|![markdown-mark.png](https://qiita-image-store.s3.amazonaws.com/0/203949/092cc0ef-d1d1-821c-0ae0-5eb9fa1f4378.png)|
|:-:|

```
Google App Engine でバージョン管理をする

##概要
Google App Engine のバージョン管理がとても便利だったのでまとめます。

参考として、詳しくはこの記事がわかりやすいですが、実際の方法として私がうまくいった方法をまとめます。
https://qiita.com/senameru/items/c0df24d3371ecf3f6e2e

##バージョン管理方針

- 本番リリースバージョンは、r001、r002とバージョンを上げていく。
- 開発リリースバージョンは、d001、d002とバージョンを上げていく。

###例

- 開発d001 → 開発d002 → 本番r001 をリリース。
- その後、修正の必要が出た場合は、 d003を作成して開発・テスト。
- 本番r002をリリース

##Google App Engine のバージョン管理

何も考えずに、``` gcloud app deploy ``` でデプロイしていくと、デプロイごとに勝手にバージョンが増えていく。無駄に容量も消費するし管理できないので推奨しない。

###バージョンを指定してデプロイ

バージョンを指定してデプロイするには、

```
gcloud app deploy -v d001
```

とする（d001がバージョン番号）。
※ app.yaml に記載する方法もあるようだが、うまくいかなかった。

ただし、デフォルトだと、最後にデプロイしたバージョンがすぐにアクティブになってしまう。これは不便なので、デプロイ時にアクティブなバージョンが勝手に切り替わらないようにデフォルト設定を変更します。コマンドは以下。

```
gcloud config set app/promote_by_default false
```

デプロイ時に ``` --promote ``` オプションで都度指定することも可能。
参考：https://cloud.google.com/sdk/gcloud/reference/app/deploy

###アクティブなバージョン以外の確認方法

アクティブなバージョンは、

```
https://PROJECTNAME.appspot.com
```

で確認できますが、アクティブではないバージョンは、

```
https://d001-dot-PROJECTNAME.appspot.com
```

というURLで確認できます。（d001がバージョン番号）

###アクティブなバージョンの切り替え

ビジュアルで確認する意味も含めて、[Googe Cloud Console](https://console.cloud.google.com/) で切り替えます。

![171001_Gae.PNG](https://qiita-image-store.s3.amazonaws.com/0/24420/f045740e-7a2a-64e5-69ea-8e7f3a785184.png)

キャプチャは、開発バージョンを d001 ではなく v001 としています。
Docker 初心者 |  RUN と CMD の違い

- RUN - イメージ作成時に実行される
- CMD - コンテナ実行時に実行される

# 例

## Dockerfile

```:Dockerfile
FROM alpine

RUN echo "RUN!"
CMD echo "CMD!"
```

## イメージ作成

```
$ docker build . -t example_container
```

```
(色々な処理)

RUN!

(色々な処理)
```

## コンテナ実行

```
$ docker run example_container
```

```
CMD!
```


# 参考

- [DockerのRUNとCMDの違い - Qiita](https://qiita.com/YusukeHigaki/items/044164837daa5e845d50)

# 環境

- Docker version 17.03.1-ce, build c6d412e









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
VEX(SIMD) VS OPENCL(GPU&CPU)

Houdiniの実行処理について色々RnDする機会があったので
少し共有したいと思います。

実行環境は...
Ubuntu 16.04 LTS
Houdini16.0.633

---
VEX(SIMD) VS OPENCL(GPU&CPU)

今回はSphereを動かす処理をテストしたいと思います。
Test_Hip fileも今回はシェアします。

https://www.dropbox.com/home?preview=VEX_VS_OPENCL.hiplc


中身はこんな感じになってます。

![CL_vs VEX01.jpg](https://qiita-image-store.s3.amazonaws.com/0/179218/a6592f4d-dcc2-602e-c737-c073802b3f13.jpeg)


SIMDや並列/並行処理に少し慣れてきたので..ちょっと比べてみよ〜と思いました。

sin,cosで円運動を簡単に実装させたものをそれぞれ、50f M_Playで書き出してみます。


GPUプログラマーの方々のアウトプットを見させていただくと...
CLのパフォーマンスを体感できるのは
条件によってかなり変わってくるとのこと...
プログラム次第でもかなり変わってくるらしいです。

これからRnDしていく目標を的確にする目的もあり
今回のtipsを書きました。

OpenCLは...
:CPU
:GPU
それぞれ比べてみました。

---
OPEN_CL_TYPE = CPU


![CLyepe_CPU.jpg](https://qiita-image-store.s3.amazonaws.com/0/179218/75dc4b90-99b7-18ab-aa6b-31e86c020291.jpeg)

---



:CPU_VEX(wrangle)

![CPU_CL.jpg](https://qiita-image-store.s3.amazonaws.com/0/179218/771070b5-d21f-06ec-9834-91a6f3174a4f.jpeg)
Total : 16.298s
Viewport : 15.746s
Node : 0.552s

---

:CPU OPEN_CL

![CPU_openCL.jpg](https://qiita-image-store.s3.amazonaws.com/0/179218/9e48d0c3-34a8-616e-5aca-b73275d524b4.jpeg)
Total:16.145s
Viewport :14.189s
Node : 1.956s

---
:CPU_Compiled OPEN_CL

![Comped_CL.jpg](https://qiita-image-store.s3.amazonaws.com/0/179218/1d116252-4a20-3bf8-5114-e43f0dd4ab6d.jpeg)
Total : 17.188s
Viewport : 14.180s
Node : 3.008s

---
OPEN_CL_TYPE = GPU

![OPENCL_type_GPU.jpg](https://qiita-image-store.s3.amazonaws.com/0/179218/a62a40d6-f564-0c7f-cb3b-1407bcc56c5d.jpeg)

---
:GPU_VEX(wrangle)

![GPU_VEX.jpg](https://qiita-image-store.s3.amazonaws.com/0/179218/a4eb4f8e-b75b-c83d-5570-cfc823dcd3cb.jpeg)
Total:14.866s
Viewport :14.331s
Node : 0.534s

---
:GPU OPEN_CL

![GPU_OPEN_CL.png](https://qiita-image-store.s3.amazonaws.com/0/179218/361e9096-9dd2-7a7c-33bf-71a2132b7b2e.png)
Total:16.280s
Viewport :14.611s
Node : 1.669s

---
:GPU_Compiled OPEN_CL

![GPU_Comped_OpenCL.jpg](https://qiita-image-store.s3.amazonaws.com/0/179218/30ac54bc-c062-8e37-8571-311e1b4187b4.jpeg)
Total:15.954s
Viewport :14.265s
Node : 1.688s

---

ViewCockが不安定であまり参考になりませんが
NodeCockに注目してみてください。

まとめてみます。

50fps Anim_NodeCock

:CPU
VEX - 0.552s
OpenCL - 1.956s
Comed OpenCL - 3.008s

:GPU
VEX - 0.534s
OpenCL - 1.669s
Comed OpenCL - 1.688s

---

VEX(SIMD)強しですね笑
実行環境,PCスペック
僕自身のカーネルプログラムがダメかもしれないんですが...

結果だけ見ると
MainオペレーションはSIMDがベストという結論になりますねwww

並列/並行処理をうまく使うには
Model、実行環境、プログラムがうまいこと絡み合わないとパフォーマンスがうまく出てくれないですね...

OpenCLのMasterClassがなかなか出ない理由がわかった気がします笑

難しいです。
CloudGarageでメールが送れない

CloudGarageにCentOS7をいれて`mail`コマンドを使ったらエラーになった。

```:エラー
send-mail: fatal: parameter inet_interfaces: no local interface found for ::1
```

#解決策
ちょっと古いけど、[CentOSでIPv6 を無効にするとメールが送れなくなった - Qiita](https://qiita.com/cs_sonar/items/706a9204cba1a8e99cb1)の方法が参考になりそう（CloudGarageの場合、そもそもIPv6がない）

投稿によると`/etc/hosts`にあるIPv6設定をコメントアウトする必要あるらしい。

```:/etc/hosts
前
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

後
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
```

修正してもう一回送信

```
postdrop: warning: unable to look up public/pickup: No such file or directory
```

あれ？・・・`postfix`が起動してない？

```:サービス起動
systemctl start postfix
```

今度こそ送信完了。
【S3】boto3でMultipartUploadする

大サイズのデータをS3にMultipartUploadする時のためのメモ

```python:multi_part_upload.py
from memory_profiler import profile
import boto3
import uuid
import json

sc = boto3.client('s3')
bucket_name = '<bucket_name>'
encoding = 'utf-8'

@profile()
def upload():
    key = f'tests/{uuid.uuid4().hex[10:]}'
    mpu = sc.create_multipart_upload(
        Bucket=bucket_name,
        ContentEncoding=encoding,
        ContentType=f'application/x-jsonlines; charset={encoding}',
        Key=key
    )

    upload_id = mpu['UploadId']

    end = 10
    parts = []

    for i in range(end):
        part_number = i + 1
        contnet = f'{json.dumps(j)}\n' * 1024 * 1024
        part = sc.upload_part(
            Bucket=bucket_name,
            Key=key,
            PartNumber=part_number,
            UploadId=upload_id,
            Body=contnet.encode(encoding)
        )
        parts.append({
            'PartNumber': part_number,
            'ETag': part['ETag']
        })

        if part_number == end:
            sc.complete_multipart_upload(
                Bucket=bucket_name,
                MultipartUpload={
                    'Parts': parts
                },
                Key=key,
                UploadId=upload_id
            )


if __name__ == '__main__':
    upload()

```
Aviraの誤検出を回避する方法

# はじめに

※私の環境ではこの方法でAviraの誤検出を回避することが出来ましたが、もしかすると他の環境ではうまくいかないかもしれません。参考程度にご覧下さい。

環境
VisualStudio2017
C++
DXライブラリ

# Aviraによる誤検出

私の環境では、作成した実行ファイルがセキュリティソフトのAviraによって「トロイの木馬（TR/Crypt.XPACK.Gen2）」であると判断される問題が発生していました。
もちろんウイルスなどではなく、シンプルなウィンドウをただ表示させるだけのプログラムです。
また、この問題が発生するのはReleaseビルドで作成した場合のみとなります。

# 対策

プロジェクトのプロパティを開き、構成をReleaseにする。
構成プロパティ ＞ リンカー ＞ 最適化 を選択する。

初期状態
![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/125381/e002cd47-adbf-bc7a-92a1-3347640252d8.jpeg)

【参照】を【いいえ（/OPT:NOREF）】にする。
【COMDATの圧縮】を【いいえ（/OPT:NOICF）】にする。

さらに、このままだとビルド時に「/OPT:NOREFは/LTCG:incrementalの指定と互換性がない」と言われるので、

【リンク時のコード生成】を【リンク時のコード生成を使用（/LTCG）】にする。

変更後
![02.jpg](https://qiita-image-store.s3.amazonaws.com/0/125381/0240eaad-c9bc-1a4b-4be7-a09ef1d111cd.jpeg)

完了です。
少なくとも私の環境ではこの設定にすることでAviraに誤検出されることがなくなりました。
この記事が少しでも参考になれば幸いです。
PythonでオレオレLinqライブラリ書いてみた

PythonでオレオレLinqライブラリ書いてます.
ある程度できたので共有してみます.
なにかあったら, よろしくお願いします.
Githubは[こちら](https://github.com/yassu/Ilinq.py)です.

# インストール方法

```
$ pip install ilinq
```

# 使用例

ProjectEulerの問題2に, フィボナッチ数列の値が400万以下かつ偶数の部分の和を求めよという問題があります.
その問題を解いてみましょう.

```
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from ilinq.ilinq import Linq
from math import sqrt


def fib(n):
    return round(1/sqrt(5) * ((1 + sqrt(5))/2)**n)


fibs = Linq(range(1, 100 + 1))  \
    .select(fib)    \
    .where(lambda n: n % 2 == 0)

print(fibs.last() >= 4 * 10**6)
# => True

print(
    fibs
    .take_while(lambda n: n < 4 * 10**6)
    .sum()
)
# => 4613732
```
ちょっとずつ読むドメイン駆動設計 第ニ部 モデル駆動設計の構成要素 第五章 ソフトウェアで表現されたモデル4(エンティティ)

# エンティティ(Entities)

> 多くのオブジェクトは、本質的に、その属性によってではなく、**連続性と同一性(identity)**によって定義される(第二部 第五章より)

ここ改めて読むとすごいわかりずらいですね。。。

## 同一性
注文の例で言えば、注文完了しても、顧客の元に配送が完了しても、キャンセルされても、それが同じ注文であれば、それを認識できなければいけない。　
5分後に別の商品の注文があれば、先の注文と、その注文は区別されなければならない。

顧客の例で言えば、住所が変わっても、配送先が変わっても、姓が変わっても、さらには退会しても、同じ顧客であることを認識できなければいけない。さらにはサポートに問い合わせがあれば、電話の先の声の主と一致していることを確認できなければいけない。

## 連続性
注文の例で言えば、注文完了したり、配送完了したりと状態が変わっていくという、連続性がある。それは、アプリケーション内だけでなく、注文完了したら一旦、注文はRDBに送られ永続化される。その後、キャンセルのためにRDBから抽出されても、同じ注文であることを確認できる必要がある。

また、そういった注文の状態の変化や、他の属性の変化も、効果的に追跡できるようにする必要がある。

## 「属性によってではなく」とは
注文の例で言えば、購入された商品や配送先の情報、配達状況など、その属性は変化する。

顧客の例でも、住所や姓、名前自体も変わるかもしれない。メールアドレスや電話番号も変わるかもしれないが、変わっても同じ顧客だと認識されなければいけない。

そういう意味で、エンティティは属性ではなく、同一性・連続性に注目して定義する必要がある。

> エンティティのクラス定義、責務、属性、および関連は、エンティティの持つ特定の属性ではなく、それが何者であるかを中心にすえるべきだ。(第二部 第五章より)

## エンティティは何でないか

### javaのequalsはエンティティの同一性ではない
javaのequalsは標準では、同じメモリ上にあるオブジェクトの比較に用いられるもの。
例えば、キャンセルしたいと連絡があった注文のオブジェクトと、確認のためRDBから取得した注文のオブジェクトは同じ注文なのでイコールでなければいけないが、標準のjavaのequalsで比較してもtrueとはならない。

### 金額とか、住所とか姓名もエンティティではない
金額そのもの、1,000円とか1,200円とかは連続性（そもそも状態が変化しない）も同一性も関係ないのでエンティティではない。
住所とか、姓名も同様。

明日はどうこれをモデリングするかというところを読みます。
古い端末のGoogle Play自体のバージョンを強制的にあげる

#はじめに
かなり限定的な話。
実機確認で使っている端末を工場出荷状態に戻した後、Google Playが古い状態になっている。
このGoogle Playが古いと、特定のアプリが見えなくなる。

新しい端末(Android5 or later)では問題は起こらないはずだが、端末がAndroid4だと遭遇するはず。

#やり方
設定 -> アプリ -> Google Play -> 全てのキャッシュとデータを削除
次にGoogle Playを開いて、設定 -> ビルドバージョンをクリック。
すると「最新のGoogle Playにアップデートします」みたいなことを言われるので、数分待つ。

するとGoogle Playのアイコンが切り替わっている。終わり
サイド固定バナー（マイカートボタンなど）

##CSS

```test.css
@media screen and (min-width: 400px /*表示させたくない最小の大きさを記入（これはスマホの画面の大きさ）*/){
#sidebanner a{ display: none;}
}
#sidebanner a{
display: block;
background: url("画像URL")/*通常時画像*/ no-repeat scroll 0 0;
width: 50px;/*画像幅*/
height: 150px;/*画像高さ*/
text-indent:-9999px;
position:fixed;
right:0px;
top:140px;
}
  
#sidebanner a:hover{
display: block;
background: url("画像URL")/*マウスオーバー時画像*/ no-repeat scroll 0 0;
width: 50px;/*画像幅*/
height: 150px;/*画像高さ*/
text-indent:-9999px;
position:fixed;
right:0px;
top:140px;
-webkit-transition: width ease-in-out 0.5s;/*マウスオーバーの動く時間を記入して滑らかさを調節*/
-moz-transition: width ease-in-out 0.5s;
-ms-transition: width ease-in-out 0.5s;
-o-transition: width ease-in-out 0.5s;
transition: width ease-in-out 0.5s;
}
```
##HTML

```test.html
<div id="sidebanner">
<a href="リンク先URL"></a>
</div>
```
[Go] アドレスとポインタの簡単な例

#してみること#
```go
type Sample struct {
    array []int
}
```
「arrayに1を追加する関数」を作ってみる
#成功例#
&でアドレスの参照渡しをする。

```go
func main() {
    Add(&Sample.array)
    // → Sample.arrayの中身：[1]
}

func Add(array *[]int) {
    *array = append(*array, 1)
}
```
#失敗例#
値渡しをしてしまう。

```go
func main() {
    Add(Sample.array)
    // → Sample.arrayの中身：[]
}

func Add(array []int) {
    array = append(array, 1)
}
```
[React Native]iosのキーボードで画面が隠れるのを防ぐ

## 背景

- iosではキーボードを表示したときにキーボードにかぶる部分が見えなくなってしまう
    - スクロールしてもキーボードの隠れた部分は見えない
- ![control.gif](https://qiita-image-store.s3.amazonaws.com/0/175213/f9e51e3c-7a21-d61b-d70d-23274ff09ac0.gif)


## 解決策

- ReactNativeでKeyboardAvoidingViewというコンポーネントが用意されている

## サンプル

```jsx:index.ios.js
import React, { Component } from 'react';
import {
  AppRegistry,
  FlatList,
  KeyboardAvoidingView,
  ScrollView,
  StyleSheet,
  Text,
  TextInput,
  View
} from 'react-native';

const formItems = [
  { key: 1 },
  { key: 2 },
  { key: 3 },
  { key: 4 },
  { key: 5 },
  { key: 6 },
  { key: 7 },
  { key: 8 },
  { key: 9 },
  { key: 10 },
  { key: 11 },
  { key: 12 },
  { key: 13 },
  { key: 14 },
  { key: 15 },
];

class Sample extends Component {
  renderItem = ({ item }) => (
    <View style={styles.formGroup}>
      <Text>{item.key}</Text>
      <TextInput style={styles.formControl} />
    </View>
  )

  render() {
    return (
      <KeyboardAvoidingView behavior="padding">
        <ScrollView contentContainerStyle={styles.container}>
          <View style={styles.formContainer}>
            <FlatList data={formItems} renderItem={this.renderItem} scrollEnabled={false} />
          </View>
        </ScrollView>
      </KeyboardAvoidingView>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    backgroundColor: 'lightblue',
    padding: 25,
  },
  formContainer: {
    backgroundColor: 'white',
  },
  formGroup: {
    padding: 10,
  },
  formControl: {
    borderBottomWidth: 1,
  },
});

AppRegistry.registerComponent('Sample', () => Sample);
```

- ![default.gif](https://qiita-image-store.s3.amazonaws.com/0/175213/53fa90db-b3a7-572f-ad91-2c5e65f6985d.gif)

## さいごに

- 今回は`behavior="padding"`とした時だけきれいに動いたのでそれを採用した
- とりあえず動かしただけだったので、内部の実装とかは時間がある時に追記します
良いエラーメッセージの書き方

エラーには大抵「エラーメッセージ」が付いています。
自分は過去に、エラーメッセージの内容を雑にしてしまい後悔することがよくありました。
その経験から、良いエラーメッセージの書き方を考えました。

## エラーメッセージを2つに分類する
まず、エラーメッセージといっても次の2つのパターンで大きく異なってきます。

- (1) ユーザーが見るエラーメッセージ
- (2) 開発者が見るエラーメッセージ

## (1) ユーザーが見るエラーメッセージ

### 内部実装のことは書かないようにする

|||
|:--|:--|
|NG| MySQLのクエリ実行に失敗しました 'SELECT * FROM ...' |
|OK|検索処理でエラーが発生しました|

ソースコードの何処か～や、何のライブラリで～といったプログラマーしかわからない情報は書かないようにします。
ユーザー側からすると、謎の英語の羅列が出てきたりしてなんだか怖いですし、悪意のあるユーザーに**不正行為のためのヒントを与えてしまう可能性があり危険です**

たとえば、上の「わるい例」では MySQL を使っていることや、どのようなSQL文を実行しているか、テーブル名は…といった情報が見えてしまっているので攻撃のヒントを与えてしまうかもしれません。

もちろん、開発者だけが見られるエラーメッセージの場合は逆になります。（詳しくは後に）

### ユーザーの入力が原因の場合、はっきりと理由を書く

|||
|:--|:--|
|NG|入力欄が不正です|
|OK|ユーザーIDは4文字以上の英数字で入力してください|


ユーザーの入力内容が原因の場合、「何が悪かったのか」具体的に出してくれないとユーザーはイライラしてしまいます。

### 

## (2) 開発者が見るエラーメッセージ
開発者用のエラーメッセージは、ユーザー用とは違って**不具合が起きた場所をできるだけすばやく特定するために、詳しく、具体的にします**

### エラーに関わる値を具体的に出す

|||
|:--|:--|
|NG|config file not found|
|OK|config file not found: /path/to/config.ini |

たとえば、「設定ファイルが見つかりませんでした」と言われても「どこの設定ファイルを開こうとしてエラーになったの・・？」と困惑してしまいます。
また、期待した値と実際の値が違った場合は、**xxを期待したが、実際はyyだったのでエラーになりました** というところまで具体的に出しているとわかりやすいです。

### 原因を特定しやすくしてくれる一文を入れる

|||
|:--|:--|
|NG| table "users" not found| 
|OK| table "users" not found. have you init db? |

起こったことを伝えることは重要ですが、さらに**「原因はxxなのでは？」「～～を忘れていませんか？」**という提案が入っていると「あぁ～そうか忘れてた！！」って気づきやすいと思います。

### 正しい文法でなくても、英語を使う
これは好みが分かれそうなところですが、自分は自身しか使わないようなものでもエラーメッセージは英語で書くようにしています。
その理由はこんなところです。2つ目はとても個人的な理由ですが・・

- 文字エンコーディング関連の問題にぶつかる可能性がある
- vimで日本語入力に切り替えるのがしんどい

しかし、普段日本語を書いていると英語でメッセージを書くのは難しいです。そこで、自分は**文法は気にせずに書く**ようにしています。
正しい文法よりも、**何が起きたのか分かれば十分**と思っています。

たとえば、 `user(id=1) register fail` というエラーメッセージは（おそらく）文法的には変ですが、「ユーザー（ID: 1）、登録、失敗」という単語から何が起きたかはつかめます。

### エラーに至るまでの履歴（スタックトレース等）を表示する
開発者としては、エラーが発生した際に「どのような経緯でエラーになったのか」が知れると非常に有用です。
大抵のプログラミング実行環境では、スタックトレースを表示する処理が用意されているので、開発者用エラーメッセージにはつけておくと良いでしょう。

### 複数あるものは、自身を識別する値を一緒に表示する

|||
|:--|:--|
|NG|user register fail|
|OK|[ID: 12345]user register fail|


登録ユーザーや、マルチスレッドといった複数存在するものを扱っている場合、**「エラーが発生したのは複数あるうちのどの個体か」**を知ることで超探しやすくなります。
ユーザーIDや、スレッドID、IPアドレスなど個体を特定できるものはできるだけ一緒に入れましょう。

### 発生時刻を細かく表示する
気がついたらエラーメッセージがたくさん出ていた、という状況の場合**「いつ発生したエラーなのか」**は重要な情報になります。
特に長時間起動するサーバー等ではログに複数のエラーメッセージが並ぶこともよくあるので、秒より細かい単位までしっかり時刻を表示しておくと良いでしょう。
Django REST Framework : リクエストの昇順と降順


日付を新しい順で取りたかったので、以下のように修正した:cat:

```python:views.py

class DiaryViewSet(viewsets.ModelViewSet):
    # 修正前
    # queryset = Diary.objects.all()
    
    # 修正後
    # order_by して "-" を ソートするフィールド名に付ける
    queryset = Diary.objects.order_by('-date')

```
あるオブジェクトから特定のプロパティだけ取り出す « JavaScript

色々勘違いしてた終わり。

---

`lodash.pick`(逆だけど`lodash.omit`）みたいなやつを使わずに。

```js
// const obj = {a: 1, b: 2, c: 3};
Object.keys(obj)
  .reduce(
    (acc, key) => (
      ({}).hasOwnProperty.call(acc, key)
        ? {...acc, [key]: obj[key]}
        : acc
    ),
    {a: null, b: null}
  );

// => {a: 1, b: 2}
```

---

なんとなくdeepAssignな感じに改良。

```js
// const obj = {a: {aa: 1, ab: 2}, b: {ba: 1, bb: 2}, c: {ca: 1, cb:2}};
Object.keys(obj)
  .reduce(
    (acc, key) => (
      ({}).hasOwnProperty.call(acc, key)
        ? {...acc, [key]: {...acc[key], ...obj[key]}}
        : {...acc, [key]: obj[key]}
    ),
    {a: {ac: 3}, b: {bc: 3}}
  );

// => {a: {aa: 1, ab: 2, ac: 3}, b: {ba: 1, bb: 2, bc: 3}, c: {ca: 1, cb:2}};
```
Django REST Framework : Cros-Origin 設定

## APIをブラウザからも叩けるようにCROSに対応させる:frog:

ライブラリーのインストール
`pip install django-cors-headers`

settings.pyを以下のように修正すればOK! :pig:


```python:settings.py

... 省略

INSTALLED_APPS = (
    # 追加
    'corsheaders',
)

MIDDLEWARE = [
    # 追加
    'corsheaders.middleware.CorsMiddleware',
]

# 追加
CORS_ORIGIN_ALLOW_ALL = True

... 省略


```
【TensorFlow】tf.contrib.graph_editorを使って計算グラフの一部を複製する

# やりたいこと

計算グラフを作ったときの関数やソースコードを使わずに、計算グラフの一部を複製したい。

# 方法

`tf.contrib.graph_editor.graph_replace()`を使うと、
入力テンソルと出力テンソルさえ与えられれば途中のグラフを複製できます。
複製元と複製先で変数は共有されます。

公式ドキュメント: [tf.contrib.graph_editor.graph_replace](https://www.tensorflow.org/api_docs/python/tf/contrib/graph_editor/graph_replace)

# サンプルコードと実行結果

```py3
import tensorflow as tf
from tensorflow.contrib import graph_editor

tf.logging.set_verbosity(tf.logging.ERROR)


def f():
    """適当に計算グラフを作成して入力テンソルと出力テンソルを返す"""
    with tf.variable_scope('f'):
        x = tf.placeholder(tf.float32, (None, 64), name='x')
        h = x
        h = tf.layers.dense(h, 100, name='dense_1')
        h = tf.layers.dense(h, 100, name='dense_2')
        y = h
        return x, y


with tf.Graph().as_default():
    # 計算グラフを作成
    x, y = f()
    
    # x と互換性のあるテンソル
    new_x = tf.placeholder(x.dtype, x.get_shape(), name='x_copy')

    # x の代わりに x_copy を使って、x から y への計算をやりなおす
    new_y = graph_editor.graph_replace(
        y,                  # 複製元の出力
        {x: new_x},         # {複製元の入力: 新しい入力}
        src_scope='f',      # 複製元の名前スコープ (省略可)
        dst_scope='new_f',  # 複製先の名前スコープ (省略可)
    )
    
    # TensorBoardで確認
    tf.summary.FileWriter('/tmp/tensorboard', graph=tf.get_default_graph()).close()
```

![graph_large_attrs_key=_too_large_attrs&limit_attr_size=1024&run=(3).png](https://qiita-image-store.s3.amazonaws.com/0/154890/d840f0f3-facc-b754-7c8f-0710f2918081.png)

ちゃんと複製されています。
また、`f/dense_1`と`new_f/dense_1`、`f/dense_2`と`new_f/dense_2`は重みを共有しています。

# 補足

## `src_scope`と`dst_scope`

`x`から`y`を計算する上で必要なOpが `src_scope/foo/bar` という名前であれば `dst_scope/foo/bar` として複製されます。
名前が重複した場合は普通のOpと同じく `dst_scope/foo/bar_1` のような名前になります。

## 入力/出力が`tf.Variable`の場合
`tf.Variable`は`tf.Tensor`ではないので、そのまま引数として渡すとエラーになります。
`tf.Variable.value()`で出力テンソルを取得してください。

```py
x = tf.placeholder(name='x', shape=(1, 64), dtype=tf.float32)           # Tensor
new_x = tf.get_variable(name='new_x', shape=(1, 64), dtype=tf.float32)  # Variale

graph_editor.graph_replace(y, {x: new_x})          # ERROR
graph_editor.graph_replace(y, {x: new_x.value()})  # OK
```

# 変数も共有せずに完全に複製する
~~`tf.train.export_meta_graph()`と`tf.train.import_meta_graph()`を使えば可能です。~~
`meta_graph.export_scoped_meta_graph()`と`meta_graph.import_scoped_meta_graph()`を使えば可能です。

```py3
from tensorflow.python.framework import meta_graph
meta_graph_def, _ = meta_graph.export_scoped_meta_graph(export_scope='f')
meta_graph.import_scoped_meta_graph(meta_graph_def, import_scope='new_f')
```

~~ただし、複製元のグラフを作成するときに乱数のシード値を指定していた場合は、複製先も同じシード値を使うことになります。ご注意ください。~~
`tf.train.export_meta_graph()`がSaverを作っているのが理由だったようです。
Django の settings を切り替えるようにした話

# はじめに

Django で web アプリを作ってるんですけど、
heroku で本番環境やステージングで動作を変更したいときってあると思います。
そういうときは、settings ファイルを環境に合わせて作りましょー。
※ Django は 1.10.7 を使ってます。


# project を作ると

こんな感じになると思います。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/39090/6aedf4ef-1896-3630-9ab9-4c6dfad5d6bf.png)

通常は、上記の mysite/settings.py を読み込みます。


## 別の settings を作ってみる

仮に、settings をこんな感じに分けたとします。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/39090/994584a2-c88c-dd36-6dee-a6ec1f2d23c8.png)

このまま `python manage.py runserver` するとエラーになるので、読み込み先を変えましょう。


# どこを変えるのか

ずばり、manage.py と wsgi.py です。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/39090/c7812756-f644-ab21-e500-ffa191fa6802.png)


## 具体的に

この２ファイルには、それぞれ `os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")` と書かれている箇所があります。
これが settings の読み込み先になります。

```py3:manage.py
#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
    try:
        from django.core.management import execute_from_command_line
    except ImportError:
        try:
            import django
        except ImportError:
            raise ImportError(
                "Couldn't import Django. Are you sure it's installed and "
                "available on your PYTHONPATH environment variable? Did you "
                "forget to activate a virtual environment?"
            )
        raise
    execute_from_command_line(sys.argv)
```

```py3:wsgi.py

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

application = get_wsgi_application()
```


## これを、こうじゃ！

mac での開発は mysite/settings/local.py を読み込んでほしいので、これを `os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings.local")` と書き換えます。

```py3:manage.py
#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings.local")
    try:
        from django.core.management import execute_from_command_line
    except ImportError:
        try:
            import django
        except ImportError:
            raise ImportError(
                "Couldn't import Django. Are you sure it's installed and "
                "available on your PYTHONPATH environment variable? Did you "
                "forget to activate a virtual environment?"
            )
        raise
    execute_from_command_line(sys.argv)
```

```py3:wsgi.py

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings.local")

application = get_wsgi_application()
```


# 本番環境などではどうするか

ここまで読んだ方はわかると思いますが、django の setting の読み込み先は、DJANGO_SETTINGS_MODULE という環境変数で変えることができます。
例えば heroku の場合、環境に合わせて config var を変更することで、読み込む settings を変えることができます。
こんな感じで。

```bash
heroku config:set DJANGO_SETTINGS_MODULE=mysite.settings.production --app heroku_production
```

とても便利です。


# おまけ

[公式 doc](https://docs.djangoproject.com/en/1.10/topics/settings/) にもありますが、runserver 時に settings を指定することもできます。

```bash
django-admin runserver --settings=mysite.settings.local
```


Have a good django life !!
Cent0S7を再インストール　　-firewallの設定変更とかポート番号の変更とか-

さくらVPSにCentOS6をインストールし、ユーザーの追加やポートの変更apacheのインストール。。。などなどすまし、GitlabをインストールしてWordPressもインストールしたところで
うっかり

`yum security update`

したら、カーネルパニックになってしまい、色々試したのですが、直せず^^;

諦めてOSを再インストールすることにしました。
なんとなくCentOS7にしてみた。

前回とおなじくこちらの記事を参考に、apacheのインストールまで済ませて、
http://knowledge.sakura.ad.jp/beginner/2978/
ブラウザで確認したら、エラー表示でした。

原因はfirewallでhttpが開いておりませんでした。
`# firewall-cmd --list-all`
したら、以下の内容（sshしか開いていない。）

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:`

なので、
`# firewall-cmd --permanent --add-service=http`
と
`# firewall-cmd --reload`
して、httpを追加
以下のようになりました。 


public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: dhcpv6-client ssh http
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:`

これで、ブラウザ確認したら、　CentOSの画面が無事表示^o^

あと、以下の記事を参考に yum update　したときに
カーネルさんがアップデートしないようにしました。
http://altenergy-system.com/archives/2982


この記事の通り、カーネルもアップデートするようにしなくちゃいけないみたいなんですけど、
今の段階ではそれは諦めることに。


あと、CentOS7でのsshのポート番号変更は、こちらの記事がわかりやすかったです
https://qiita.com/fk_2000/items/019b62818e34be973227
Swift4 - Codable関連Tips

XCode9のGM Seedも出たということで、本格的に複数のプロジェクトでCodableを使い始めました。
だいぶ要領がつかめてきたところで、あー、最初から知ってれば良かったのに！と思ったハマりポイントを２つほどご紹介しておきます。

## Type X does not conform to protocol Y 対策
class/structがコーディング(encode/decode)できない場合にこのエラーが出るわけですが、原因となった変数のところにエラーメッセージが出るならまだしも、class/struct宣言のところにだけエラーが出るので非常に分かりにくいです。そのような場合はひとまず以下の２点をチェックすると良いです。

1. Codableでない変数が入っているとエラー
当然といえば当然ですが、コーディングできない変数が含まれるclass/structはコーディングできません。特にカスタムのclass/struct、そしてenumはCodableプロトコルを実装している必要があります。中でもenumは、Codableプロトコルに適合させるためにrawValueを明示する必要があるなど一手間二手間かかります。

2. Keyを与える場合、初期値を与えないとエラー
初期値を var variable:Int = 0 のように明示的に初期値を与えてやらないと上述のエラーになるようです。これが分からなくてけっこうハマりました。Optionalの場合、デフォルトはnilだから省略してもいいだろうと思いがちですが、明示的に = nil を与えないと理解してもらえないみたいなので要注意です。

## Decodeエラーをプリントするブロックは必ず記述しよう
そんなこと言われなくても、という人が大半かとも思いますが、エラーのcatch部分の記述方法を調べるのが面倒だったり、あとSwiftのtry?が便利だったりで、ついつい問題ある場合は「エラーです！」とだけprintすればいいや、みたいな感じでエラー処理を書くのをサボりがちになります。ですが、どんなに面倒でも最低限これだけは書いておいた方がいいです。

```Swift
let data = ... /* Data to decode */
let decoder = JSONDecoder()
do {
    let decoded = try decoder.decode(ResultObject.self, from: data)
} catch let error {
    print("Error = \(error)")
}
```
Decoderがかなり厳密に型や値の有無をチェックするので、ちょっとのミスでもすぐデコードエラーになります。なので当然エラーをキャッチしてなぜ失敗したのが知る必要があるのですが、Swiftのcatch節の書き方に柔軟性がありすぎて、最低限どう書いていいのか分からなくてけっこう戸惑いました。結果的に上記のように ```catch let error```でエラーを拾ってprintすれば最低限の原因は把握できます。これがあるとないとだと効率がぜんぜん違うので、どんなに面倒でも ```catch let error { print("\(error)")} ``` だけは書くようにしましょう。