OmniAICreator/Qiita-1.07M huggingface dataset:
scikit-learn、Spark.ml、TensorFlow で Perceptron〜（１）イントロダクション

線形回帰に引き続き、Perceptronによる識別を scikit-learn、Spark.ml、TensorFlow で行ってみました。

# 1. パーセプトロン
パーセプトロンは隠れ層のない、入力層と出力層のみのシンプルなニューラルネットです。scikit-learnには Perceptron単体のモデルがあったのでそちらを使いましたが、Spark.ml と TensorFlowでは、入力層と出力層のみのニューラルネットのモデルを作りました。
パーセプトロンは識別器（Classifier）なので、x,y が与えられたら AかB かというデータが必要になります。今回は、線形回帰の時とほぼ同じ形で、

- ax + b >= y ならば 0
- ax + b < y ならば 1

というデータを作ることにします。

コードの説明は略。今回は 0 の場合は青、1の場合は赤の散布図を描いています。

```python:makeDataPC.py
#!/usr/bin/env python                                                                

import numpy as np
from numpy.random import rand

# data for calssifier                                                                
def makeDataPC(a, b, n=100, d=0.1, xs=0, xe=10):
    x = rand(n) * (xe - xs) + xs
    r = (rand(n) * 2 - 1) * d
    y = x * a + b + r
    r[r >= 0] = True  # tricky                                                       
    r[r  < 0] = False
    return x, y, r

import csv
def writeArrayWithCSV(dataFile, data):
    f = open(dataFile, 'w')
    writer = csv.writer(f, lineterminator='\n')
    writer.writerows(data)
    f.close()

import matplotlib.pyplot as plt
def plotXY(title, x, y, z):
    b = z.astype(np.bool)
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)
    bx = x[b]
    by = y[b]
    ax.scatter(bx, by, color='blue')
    r = -b
    rx = x[r]
    ry = y[r]
    ax.scatter(rx, ry, color='red')
    ax.set_title(title)
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    #fig.show()                                                                      
    imageFile = title + '.png'
    fig.savefig(imageFile)

# training data                                                                      
x,y,z = makeDataPC(0.4, 0.8, 100, 0.8)
title = 'trainPC'
plotXY(title, x, y, z)
dataFile = title + '.csv'
xyz = np.c_[x, y, z]
writeArrayWithCSV(dataFile, xyz)
```

- booleanインデックスという [False, True, False] というような boolean配列を numpy.arrayのindexにすると、True の index 値の配列を返す機能を使っています。

```
>>> n = np.array([1,2,3,4])
>>> b = np.array([False,True,False,True])
>>> n[b]
array([2, 4])
```
- boolean配列 b の逆は -b です。

```
>>> b = np.array([False,True,False,True])
>>> -b
array([ True, False,  True, False], dtype=bool)
```

![trainPC.png](https://qiita-image-store.s3.amazonaws.com/0/175988/45962c3a-d241-7a2c-3fef-e336fa894a48.png)
オープンソースBI 「Pentaho」

データウェアハウスに関する基本的な内容をまとめてみたものです。データウェアハウスに関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[オープンソースBI Pentaho] (https://www.techcrowd.jp/bi/pentaho/)

# [Pentahoの概要] (https://www.techcrowd.jp/bi/pentaho/)

Pentahoは、オープンソースのBIツールです。
世界的なオープンコミュニティによって作り出されたツールなので、迅速に先進技術を取り入れたBIツールとして評価されています。

Pentahoは、
・レポーティング
・対話型分析
・ダッシュボード
・データ・マイニング
などを備えたBIスイートですが、機能単位で個別のプロジェクトとなっているので、一度に全て導入する必要がなく、既存のシステムに少しずつ導入する事も可能です。

エディションは、
・無償で使用出来るコミュニティ・エディション
・ベンダーのサポートも受けられる有償のエンタープライズ・エディション
の2種類となっています。


# [Pentaho BIスイートの特徴] (https://www.techcrowd.jp/bi/pentaho/)

Pentahoは、豊富な機能を備えたBIスイートです。
Pentahoを使えば、BIに関する一通りの処理をする事が出来ます。

レポーティング
さまざまなフォーマットでの出力が可能なので、現在使用しているツールでレポートを読む事が出来ます

対話型分析
高速で多次元分析を行うR-OLAPエンジンMondrianを使い、素早くデータを処理します

ダッシュボード
インタラクティブなダッシュボードを、作成する機能を持っています

ETL
さまざまな種類のデータソースを操作して、DWHを構築します

データマイニング
データマイニングエンジンWekaによって、高度なデータマイニングを行う事が出来ます
BIで使われるOLAP処理とは

データウェアハウスに関する基本的な内容をまとめてみたものです。データウェアハウスに関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[BIで使われるOLAP処理とは] (https://www.techcrowd.jp/bi/olap/)

# [OLAPとは] (https://www.techcrowd.jp/bi/olap/)

OLAP (Online Analytical Processing)とは複雑な分析を高速で処理するシステムの事で、BIの分野では重要な技術となっています。

OLAPの特徴は、
・多次元のデータを操作出来る
・複雑な分析が可能である
・高度な分析でも素早い応答が可能である
などです。

OLAPは、
・経営管理
・市場の分析
・財務諸表の作成
などに企業活動に用いられています。


# [OLAPの種類] (https://www.techcrowd.jp/bi/olap/)

OLAPは、R-OLAPとM-OLAPに分類する事が出来ます。

R-OLAP
・RDBを使って多次元データモデルを構成
・スケーラブルなために、任意のサイズのシステムが構築出来る
・パフォーマンスが悪化する事がある

M-OLAP
・多次元データを分析するだけに作られたデータベース
・処理速度が速い
・扱うデータの量が少ない処理に向いている
Swift3 - PresentsViewControllerで左右に画面遷移する方法

# 概要

-Swift3
-Xcode8

# やること

Swift3で左右に画面遷移しようとした時、pushviewcontroller使うのって若干、手間なので、PresentsViewControllerで左右に画面遷移しようと思いました。

pushviewcontrollerを使うよりも安易に動くし、設定できることも多いので、こっちを使うほうがいいと思っています。

# 別個のストーリーボード間の繊維

例えば`Main`ストーリーボードから`Setting`という名前のストーリーボードに右遷移したい時は下記のように実装します。

```swift

            //ストーリーボードをインスタンス化
            let storyboard: UIStoryboard = UIStoryboard(name: "Setting", bundle: nil)
            let nextView = storyboard.instantiateInitialViewController()
            
           //右に遷移する
            let transition = CATransition()
            transition.duration = 0.5
            transition.type = kCATransitionPush

           //kCATransitionFromLeftにすれば左に遷移します
            transition.subtype = kCATransitionFromRight
            view.window!.layer.add(transition, forKey: kCATransition)
            present(nextView!, animated: false, completion: nil)
```

# 同じストーリーボード間での遷移

Mainストーリーボードから同じストーリーボードに作られたビューコンへの遷移は下記のようにします。withIdentifierを"Storyboard IDから下記のように設定してください。画像ではApplicationInformationというビューコンに飛ぼうとしてます

![スクリーンショット 2017-06-06 12.13.22.png](https://qiita-image-store.s3.amazonaws.com/0/135794/cd7542ed-35d6-9e70-e8a5-a5491f96f06c.png)

```swift

let storyboard: UIStoryboard = self.storyboard!
            let nextView = storyboard.instantiateViewController(withIdentifier: "ApplicationInformation")
            let transition = CATransition()
            transition.duration = 0.5
            transition.type = kCATransitionPush
            transition.subtype = kCATransitionFromRight
            view.window!.layer.add(transition, forKey: kCATransition)
            present(nextView, animated: false, completion: nil)


```



# 参考

[How to present view controller from right to left in iOS using Swift](http://stackoverflow.com/questions/37722323/how-to-present-view-controller-from-right-to-left-in-ios-using-swift)

[Swift3 – PresentsViewControllerで左右に画面遷移する方法](http://off.tokyo/blog/2017/05/07/swift3-presentsviewcontroller%E3%81%A7%E5%B7%A6%E5%8F%B3%E3%81%AB%E7%94%BB%E9%9D%A2%E9%81%B7%E7%A7%BB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)
BIにおけるETL処理とは

データウェアハウスに関する基本的な内容をまとめてみたものです。データウェアハウスに関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[ETL処理とは] (https://www.techcrowd.jp/bi/etl/)

# [(Extract(抽出) Transform(変換) Load(書き出し))] (https://www.techcrowd.jp/bi/etl/)

ETLとは、BIで分析する時に重要となる
・Extract(抽出)
・Transform(変換)
・Load(書き出し)
の頭文字を並べたものです。

データを分析しやすい構造と内容に整理するために、BIではETL処理を行います。
さまざまなデータをETL処理する事で、利用しやすいものに変わります。


# [データソースからデータを抽出、利用しやすい形に変換してDWHに格納する処理] (https://www.techcrowd.jp/bi/etl/)

各種データソースから抽出したデータを利用しやすいフォーマットに変換してから、DWHに格納するのがETL処理の基本的な役目です。

直接データーソースをDWHに入力したのでは分析しにくく処理効率が悪化するので、抽出・変換・書き出し処理をしてから、DWHで利用するのが一般的となっています。

どのような分析をするのかを明確にしてから分析する時に必要となる情報や項目を検討して、具体的なテーブル構成を決めてETL処理を行います。


# [ETL処理が行えるソフトウェア] (https://www.techcrowd.jp/bi/etl/)

ETL処理が出来るソフトウェアには、
・オープンソースBIのPentaho
・OracleのWarehouse Builder
などがあります。

PentahoはETL処理以外にも、レポーティング・対話型分析・ダッシュボードなどにお機能を備えおり、Warehouse BuilderはOracleが持つ大規模データウェアハウス構築のノウハウを活かして、高品質で使いやすいETLツールとなっています。
inputにURLしか入らないようにしたい＆リアルタイムに制限をかけたい

[Vue.jsでシンプルな入力制限](http://qiita.com/hadakadenkyu/items/5baa770df6f97ff2caa0)の副産物というか本命というか。

##要件
- 指定した形式の文字列以外入らないようにして欲しい
- 指定した形式の一つはURL
- つまり、単に**URLとしてvalidな文字列の連続**ではなく、**http(s)://までは順番**に、**それ以降はURLとしてvalidな文字列の連続**としなければならない
    - ~~面倒くさい~~

##実装例
```html:Vueによる実装
<template>
<main id="app"><main id="app">
    <h1>VueでURL入力制限</h1>
    <table>
        <tbody>
        <tr>
            <th>URL:</th><td><input type="text" pattern="^(https?://[\w/:%#\$&\?\(\)~\.=\+\-]*|https?:/|https?:|https?|htt|ht|h)" maxlength="100" :value="test1" @input="test1=opt(test1,$event)"></td>
        </tr>
        </tbody>
    </table>
</main>
</template>
<script>
var vue = new Vue({
    el:'#app',
    data:{
        test1:'',
    },
    methods:{
        opt:function(oldVal,e){
            var re = new RegExp(e.target.pattern);
            var result = re.exec(e.target.value);
            
            return e.target.value = (result)?result[0]:oldVal;
        }
    }
})
</script>
```
##DEMO
http://jsrun.it/hadakadenkyu/22SK/

##解説

HTML5のinputにはpatternというプロパティが追加され、これをに正規表現を入れるとバリデーションがかけられる。

```html:patternの例
<form>
  <input type="text" pattern="[0-9]*" value="" placeholder="数字のみ">
  <button type="submit" value="送信">
</form>
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/94804/b75d2890-dbb7-6ee0-a1d6-a0d084149dd2.png)

ただし、見ての通り値は入力されてしまう。
これを、**そもそもinvalidなら入力できないようにする**にはinputイベントの度にvalidateをかける必要がある（実装例ではVueでやっている）。
しかし、その場合でも数字のみやアルファベットのみ、というのはいいのだが、今回のようにURLを入力させたい場合、**単にURLとしてvalidな文字列の連続を定めるとhttpから始まらない文字列が入力可能になってしまう**。
そこで、正規表現のORを表すメタ文字(|)を利用し、**validな場合を全て列挙する**。
このとき、**前にあるパターンが優先的に引っかかる**ため、**長いパターンから順に記述**する。

##蛇足
正直プロトコルをチェックボックスにしてドメイン名以降を入力させたほうがスマートだと思う。
ただ**日本語を見て英単語を打たせるタイピングゲーム**みたいのには使えそう。
Business Intelligence: BIとは何か

データウェアハウスに関する基本的な内容をまとめてみたものです。データウェアハウスに関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[BIとは何か] (https://www.techcrowd.jp/bi/whatisbi/)

# [業務系のトランザクション処理とBIとの違い] (https://www.techcrowd.jp/bi/whatisbi/)

大量なデータの中から組織運営に必要なデータを取り出して加工するのが、業務系のトランザクション処理です。業務系トランザクション処理は、ただのデータから意味のある情報に作り出します。

しかし、業務系トランザクション処理で加工された情報は定型的なオペレーションには役立ちますが、業務上の意思決定を行う人にとっては、必ずしも必要なものばかりではありません。

そのため、データを加工した情報をさらに取捨選択して、意思決定者の必要とする判断材料を作り出すBI(ジネス・インテリジェンス)が必要となるのです。


# [BI: さまざまな視点からの分析や非定型分析を行うのが特徴] (https://www.techcrowd.jp/bi/whatisbi/)

データ分析は、
・分類
・要約
・比較
などの操作を中心として行いますが、さまざまなデータを比較して可視化する事と、どのような傾向があるのか・注意するべきデータが存在するのかといった傾向を可視化する事が重要です。

このように、BIではさまざまな視点からの分析が必要となるため、データを同じような分析を繰り返すだけではなく、非定型な分析も行わなくてはなりません。


# [大規模データを多次元に分析するための手順] (https://www.techcrowd.jp/bi/whatisbi/)

数多くのデータを組み合わせて、多次元の分析を行うのがBIの特徴です。
多次元の分析の基本となるドリルダウン・スライシング・ダイシングを用いて、有効な情報を入手します。

ドリルダウン
ディメンション（集計項目）ごとのデータ集計の階層を変更して、データを掘り下げる操作です。

スライシング
2次元の表の横軸と縦軸にディメンションを指定して集計値を参照する事で、対象となるデータを絞り込みます

ダイシング
サイコロを転がすように使用するディメンションを入れ替える事で、異なる表を表示する操作です


# [BIのシステム構成と処理の流れ] (https://www.techcrowd.jp/bi/bisystem/)

BIシステム構成は、
・データの変換、抽出、ロードを行うETL
・データを格納するDWH(データウェアハウス)
・データを分析して可視化するBIツール
となります。

業務システムなどで使用している各種データソースを、ETLツールでフォーマットを整えてからDWHに格納し、その後にBIツールで分析を行います。


# [DWHのデータ構造とデータモデル] (https://www.techcrowd.jp/bi/bisystem/)

業務システムのデータを、ETLツールを使ってからBIシステムに取り込むのは、DWHで扱いやすいようなデータ形式にするためです。
如何に効率良くDWHを利用出来るかが、BIを使う時に重要となります。

特にDWHを使用する時に注意するべきなのが、
・OLAPの種類
・スタースキーマ
です。

OLAPの種類はR-OLAPとM-OLAPに大別出来ますが、OLAPの種類によってデータ構造が異なります。
そして、ファクトテーブルとディメンションテーブルからなるスタースキーマが、DWHのデータモデルを特徴付ける要素となっていますので、DWHを構築する際には理解しておかなくてはならない概念です。


# [データウェアハウスの論理設計とスタースキーマ] (https://www.techcrowd.jp/bi/starschema/)

BIシステムにおいて大量のデータを扱うデータウェアハウス(DWH)は、整合性を保ちつつ検索処理の速度を向上させる事が重要です。

この要件を満たす論理設計をするためには、DWHの特徴であるスタースキーマとサロゲートキーの仕組みを理解しておかなくてはなりません。


# [スタースキーマ] (https://www.techcrowd.jp/bi/starschema/)

スタースキーマとは、下記のふたつから構成されるスキーマです。

・分析対象となる数値データを格納したファクトテーブル
・分析の切り口となるデータを格納したディメンジョンテーブル

ファクトテーブルを中心として、その周囲にディメンジョンテーブルが星形に関連付けられる事からスタースキーマと呼ばれます。

スタースキーマには、

・構造がシンプルである事
・データ量を抑える事が出来る

などのメリットが存在します。


# [サロゲートキー] (https://www.techcrowd.jp/bi/starschema/)

サロゲートキーは代理キーとも呼ばれるもので、DWHのファクトテーブルとディメンジョンテーブルを関連付けるために使用されます。

主キーだけしか使用しない場合は、DWH内のデータに変化があった時に整合性がとれなくなる事もありますが、サロゲートキーを使う事でデータ間の関係を正常に保つのに役立ちます。
[git ailias]本日のまとめログと最後のタグからのコミットログ、その他

[gitで便利なエイリアス達](http://qiita.com/peccul/items/90dd469e2f72babbc106)
gitやるならば最初に見ておくべきであった…

.gitconfigの[ailias]の下に書いたコマンドは
例えば`git today`などとして実行できる。

# 今日一日の振り返りログ

```bash:.gitconfig
[alias]
    log1 = !git log --graph --date=relative --date-order --format=format:'%C(yellow)%h %C(bold green)[%ar] %C(reset)%s %C(red)%d %C(reset)'
    today = !git log1 --since='yesterday'  # todays work
```

* --since='yesterday'で昨日(24hours以内)からの差分を取得します。
* `--date=relative`で現時刻との差


![Screenshot from 2018-01-07 18-08-40.png](https://qiita-image-store.s3.amazonaws.com/0/113494/103890cc-9199-8544-de3e-b603ba9cabbf.png)



# 最後のtagからのコミットログ

```bash:.gitconfig
[alias]
    log0 = !git log --oneline
    last = !git log0 $(git tag | tail -1)..  # Latest tag
```

* `$(git tag | tail -1)`で最新のタグを取得しています。
* 最後の`..`で「最後のタグからの…」という意味になります。


![Screenshot from 2018-01-07 18-06-53.png](https://qiita-image-store.s3.amazonaws.com/0/113494/d2fe9f10-7d6f-14ac-e727-40cad16cb58a.png)



```bash:.gitconfig
[alias]
    log2 = !git log --graph --stat --pretty=format:'%C(yellow)%h %C(cyan)%cd %C(bold black)%an %C(
red)%d %n %C(reset)%s' --date=format:'%Y-%m-%d %H:%M:%S'
```

![Screenshot from 2018-01-07 18-01-26.png](https://qiita-image-store.s3.amazonaws.com/0/113494/b7d7df4c-aaab-cfe8-8ab3-52342677a5a0.png)

変更したファイルのみ表示


```bash:.gitconfig
[alias]
    log3 = !git log --patch-with-stat --date=format:'%Y-%m-%d %H:%M:%S' --pretty='format:%C(yellow)%H %C(bold
cyan)[%cd] %C(bold black)%an %C(red)%d% %C(reset)%n %s'
```

![Screenshot from 2018-01-07 18-03-22.png](https://qiita-image-store.s3.amazonaws.com/0/113494/28e8b27a-b977-b0d1-e1ef-0dfa05817de4.png)

--patch-with-statオプションによる差分の詳細



[公式](https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E5%B1%A5%E6%AD%B4%E3%81%AE%E9%96%B2%E8%A6%A7)にもいいこといっぱい書いてあります。



# sort

```bash:.gitconfig
[alias]
    sort = for-each-ref --sort=committerdate refs/ --format='%(HEAD) %(color:yellow)%(refname:short)%(color:reset) - %(color:red)%(objectname:short)%(color:reset) - %(contents:subject) - %(authorname) (%(color:green)%(committerdate:relative)%(color:reset))'  # Display branch info
```

出力結果
<img width="908" alt="gitsort.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/113494/17d89264-bf81-ec9b-8679-3f5f5df7d6fa.png">

tagとbranchのサマリーをコミット日時でソートして表示します。


# alias表示

```bash:.gitconfig
[alias]
    alias = config --get-regexp alias.*  # Display alias list
```

.gitconfigで指定されているaliasを表示します。

# zip化

```bash:.gitconfig
[alias]
    zip = !git archive --format=zip HEAD > `git symbolic-ref --short HEAD`.zip  # Archive HEAD as zip
```

HEADをzipにまとめます。
Intellij で HTML の空要素の終わりに空白を入れたかった

探すの意外と大変だったのでメモ

## 設定場所

`Editor > Code Style > HTML > Other`

## 変更前

![Screen Shot 2017-05-07 at 12.42.13 PM.png](https://qiita-image-store.s3.amazonaws.com/0/7196/1fcb18a0-7373-b942-06f3-3b9efe56f6a2.png)

## 変更後

![Screen Shot 2017-05-07 at 12.42.54 PM.png](https://qiita-image-store.s3.amazonaws.com/0/7196/fbbfc1ce-0feb-9979-ea07-d26acc7156da.png)
gradleでテストコードもjarにして、Mavenリポジトリにuploadする

## やりたいこと

複数のコンポから参照されているutilプロジェクトがある。
util のテストを作成する際に、テストのためのヘルパーメソッドを作ったが、他のコンポでもそのヘルパーメソッドを利用したい。

## 確認環境

* gradle 3.2
* java 1.8.0_45

## 構成

* util
* compoA


### uitl

* testコードのためのJarタスク(testJar)を追加し、artifacts に設定  
  （include, excludeをつかってヘルパーメソッドだけ固めるほうがいいとは思います）


```build.gradle
apply plugin: 'java'
apply plugin: 'maven'

repositories {
    jcenter()
}

dependencies {
    testCompile 'junit:junit:4.12'
}

group='testutil'
version=1.0

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "http://192.168.99.100:8080/repository/internal/"){
                authentication(userName: 'admin', password: 'xxxx')
            }
        }
    }
}

task testJar(type: Jar){
    classifier = 'tests'
    from sourceSets.test.output+sourceSets.test.allSource
}

artifacts {
    archives testJar
}

```


### compoA


* dependencies のtestCompile でclassifier付きで指定


```build.gradle
apply plugin: 'java'

group='testutil'
version=1.0

repositories {
    maven {
        url 'http://192.168.99.100:8080/repository/internal/'
    }
    jcenter()

}


dependencies {
    compile 'testutil:util:1.0'
    testCompile 'testutil:util:1.0:tests'
    testCompile 'junit:junit:4.12'
}
```
Githubを使ってる日本人が何人いるか推計する

前々から「日本にソフトウェアエンジニアって何人ぐらいいるのかな？」「ソフトウェアエンジニアだと定義が曖昧だけど、例えば"Githubアカウントを持ってる日本人"は何人いるんだろう」と気になっていました。
最近ふとそれを調べる方法を思いついたので、調べてみた結果を書きます。

# ちなみに
政府統計無いのかな？と調べたら「[ＩＴ人材を巡る現状について](http://www.meti.go.jp/committee/sankoushin/shojo/johokeizai/it_jinzai_wg/pdf/001_04_01.pdf)」という資料がありました。
ここでは「情報サービス業とインターネット付随サービス業の総人数」は**「約100万人」**と書かれていますが、その内コードを書く人が何人いるのかは依然不明です。

# 調べ方
Githubのユーザー検索を使います。

### 調べ方1: Locationの存在比で調べる
「ユーザー検索で[location:Tokyoを調べた結果](https://github.com/search?utf8=%E2%9C%93&q=location%3ATokyo&type=Users)が18000人だった。東京の人口:日本の人口=1:10なので、日本人Githubユーザーは約18万人！」という考え方です。
しかしこの方法には困った問題があります。
**1.Locationは任意入力で、全体の何割が入力してるか分からない**
入力率によって結果は大きく異なってしまいます。
しかしこの問題に関しては、既知の日本人ユーザーアカウントを調べてLocation入力率を調べれば、ある程度推定は可能です。
**2.地域偏在性が激しい**
日本の人口は東京:大阪:名古屋=13:9:7なのに対し、Githubユーザーの"Location"は東京:大阪:名古屋=20:2:1ぐらい偏っています。存在比による推計はある程度一様に分布してることが前提なので、この方法は使いにくいです。
**3.Locationは自由文入力で、人によって国名を書いたり都市名を書いたりまちまち**
トドメ。もうめんどくさいですね。

### 調べ方2: 苗字の存在比で調べる

「["Tanaka"でユーザー検索](https://github.com/search?q=tanaka&type=Users)したら1200人ヒットした。"田中"さん人口:日本人口=1:100なので([参考](https://myoji-yurai.net/searchResult.htm?myojiKanji=%E7%94%B0%E4%B8%AD))、日本人Githubユーザーは約12万人！」という考え方です。
この考え方であれば偏在性を心配する必要はありません。
任意入力なため入力率が不明なのはLocationと同様ですが、[Github Awards](http://git-awards.com/users?country=Japan&language=php&page=100&type=country&utf8=%E2%9C%93)で日本人ユーザーを無作為に見た感じ、入力率は30〜40%といったところでしょうか。
この場合ユーザー数=12万*2.5〜3ということになります。

# 調べた結果(2017/05時点)
ノイズを無くすため、日本語の音韻に独特な文字列を含む、ある程度長くてポピュラーな苗字をピックアップしました。itoさんとかは別の言語圏の名前も引っかかりそうだからです。

| 苗字       |       人口 |    Githubユーザー検索ヒット数    |
|:-----------------|------------------:|:------------------:|
| Suzuki             |              189万 |        1288        |
| Takahashi           |            180万 |       880       |
| Tanaka           |            134万 |       1200       |
| Watanabe           |            107万 |       897       |
| Nakamura           |            106万 |       774       |
| Yoshida           |            83万 |       597       |
| Sasaki           |            68万 |       581       |
| Kimura           |            58万 |       459       |
([人口の参照元](https://myoji-yurai.net/prefectureRanking.htm?prefecture=%E5%85%A8%E5%9B%BD))

|       |       |
|:-----------------|------------------:|
| **Family Name入力率**             |              30〜40%ぐらい？ |
(ざっくり目視確認)

ということで、プライベートアカウントとか考えたらキリはないですが、日本人Githubユーザーは概ね**20〜40万人ぐらい**と言えるのではないかと思います。

# 追記: おまけ
たくさん読まれてるようなのでおまけ。
「存在比から全体を推定する」というのは色んな分野で使われていて、考古学なら化石などの年代を測定する[放射性炭素年代測定法](https://ja.wikipedia.org/wiki/%E6%94%BE%E5%B0%84%E6%80%A7%E7%82%AD%E7%B4%A0%E5%B9%B4%E4%BB%A3%E6%B8%AC%E5%AE%9A)、生物学なら個体数を測定する[標識再捕獲法](https://ja.wikipedia.org/wiki/%E6%A8%99%E8%AD%98%E5%86%8D%E6%8D%95%E7%8D%B2%E6%B3%95)などがあります。
ソフトウェア開発でも、テスト手法に「バグ埋め込み法」というのがあって、これは「バグをわざと10件埋め込んでテストしたら、埋め込んだバグが5件、埋め込んでない自然バグが7件見つかった。見つかってない自然バグはあと7件あるぞ！」という考え方をします。
......と遠い昔学んだ記憶があるのですが、実際に使った話は聞いたことがありません。どこかで使ってるのかな。
降って湧いたモチベーションを失わないためのリアル環境構築

##前書き
プログラムをする時に始めることとして、まず[環境構築](http://e-words.jp/w/%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89.html)が話に上がってきます。
>環境構築とは、特定の装置やソフトウェア、システムなどが動作するように、
>コンピュータや情報システムの状態を整えること。

当然、上記のことがQiitaにはたくさん記事として上がっています。
しかし、どれだけPC内の状態が良くても、例えば手がかじかむような環境でやると気が散ってモチベーションや効率が下がってしまいます。
モチベーションというものは降って湧いたようなもので、いつやってくるかもわからないですしすぐに消えてしまうものでもあります。
邪魔なものが無い・邪魔されることのない環境を用意することも大切なことの一つです。
そんな曖昧なモチベーションを無くさないために私が実施している机周りの環境について今回は語っていきます。
##椅子
長時間座っていても疲れない椅子というのはどうしても必須になります。２０００円以下のパイプ椅子ではどうしても座っていると尻が痛くなって気が散ってモチベーションも効率も落ちてしまいます。
私が使用しているのはゲーミングチェアですが、人によってどのような椅子が良いのかは変わってきますから、ナフコとかで色々な椅子を試すのが良いでしょう。ここはケチっちゃ駄目です。
![IMG_1407[1].png](https://qiita-image-store.s3.amazonaws.com/0/150633/2787d9d8-13a6-5502-c22a-099aed66cef7.png)
##ディスプレイ
デュアルディスプレイもしくは4kディスプレイはあると大変便利です。最近３枚目が欲しくなってきました。ちょっと悩んでいます。
アームを使うとディスプレイの下に他のものが置けるのでお勧めです。
![s_IMG_1408[1].JPG](https://qiita-image-store.s3.amazonaws.com/0/150633/ea322f8c-532a-b7cd-c195-b8e0b1a1919f.jpeg)
また、高解像度のスマホのスクショを撮る際に縦にしてPCのディスプレイを縦にして画像を作成することも出来たりとこの点でも役に立ちました。
![s_IMG_1409[1].JPG](https://qiita-image-store.s3.amazonaws.com/0/150633/5d9134ae-3ce0-97de-4d34-cb62332bf03e.jpeg)
##机
デュアルディスプレイ・フルHDディスプレイを2枚横に置いても問題のない広さの机があると良いです。
##エアコン
空調はモチベーションや効率に大幅に関わってきます。
私は、スマホアプリを冬に作成したのですが、作成する上でこれが一番重要な要素だったのではないかと思っています。
高価安価について考える必要はないかと思いますが、部屋の広さに合ったエアコンを用意するのが良いでしょう。
![IMG_1410[1].png](https://qiita-image-store.s3.amazonaws.com/0/150633/548aec40-56f5-bc4c-ef0f-22b4a8e14daa.png)

##(番外編１)PC
これと言った何かは無いのですが、PCの処理に時間がかかってイライラするようならば買い替えをするのが良いでしょう。
最近のPCは本当に処理が速いですね。

##(番外編２)PCソフト
音楽系は置いておくとして、AdobeのMasterを持っておくというのはモチベーションが上がった際に何かをやる状態がPC環境上にあることで、タイムラグ無くモチベーションが高いまま実施したいことができるという利点があります。
ここ最近だと、イラストレーターとフォトショップとプレミアを使用しました。
各音楽ツール（ソフト・ハード共に）はいつかモチベーションが高まった時に作曲するためのものなのですが、未だその時は来ておりません。
・・・・いつかやってやるんだ。
![s_IMG_1416[1].JPG](https://qiita-image-store.s3.amazonaws.com/0/150633/aa51f275-1c58-533a-dd1c-6bb44dffcbb8.jpeg)

##まとめ
以上が私が実践しているモチベーション維持のためのリアル環境構築です。
「他にもこれが要るよ」というものがあれば、コメントで補填していただけるとありがたいです。
Dockerで運用しているMastodonのアップデート手順


## 概要
- すでに運用中のMastodonv1.3.2から1.3.3へアップデート
- dockerで運用（初期構築手順：[GCPでmastodonを公開する](http://qiita.com/sawadashota/items/ea206aa62e3bd18c2f74)）

## Update Source Code
```bash
$ git fetch
$ git reset --hard [version]
# docker-compose.ymlを編集（コメントアウトをはずす）
```

## Docker周り
```bash
$ /usr/local/bin/docker-compose pull
$ /usr/local/bin/docker-compose build
$ /usr/local/bin/docker-compose down
$ /usr/local/bin/docker-compose run --rm web rails assets:precompile
$ /usr/local/bin/docker-compose up -d
```
ディレクトリ毎にTensorflow環境を構築する (fish対応)

# 環境
- macOS Sierra
- fish shell（もちろん他のshellでもOK）
- Python 3
- Tensorflow 0.11.0
- PyCharm

# 手順
### pyenvでpythonをいれる

```shell-session
brew install pyenv
pyenv install 3.6.1
pyenv global 3.6.1
pyenv rehash
```

### 確認
```shell-session
pyenv versions
python --versions
which python
```

### vertualenvでディレクトリごとの仮想環境をつくる

```shell-session
sudo pip install --upgrade virtualenv 
virtualenv --system-site-packages -p python3 targetDirectory
source .../targetDirectory/bin/activate.fish # bashの場合は bin/activate
```

### 確認
```shell-session
cd .../targetDirectory
python --versions
which python
```

### tensorflowのインストール
```shell-session
cd .../targetDirectory
pip3 install --upgrade tensorflow     # for Python 3.n
pip3 install --upgrade tensorflow-gpu # for Python 3.n and GPU
```

### 確認
```
pip list
```

### PyCharmで環境を指定する
preferences->project->project interpreterメニューを開き、右上のボタンから add local を選択し、`targetDirectory/bin/python` を指定する
Python/Ruby/PHP/Golang(Go)でグループ分けの組み合わせ

#スターリング数を使ってPython/Ruby/PHP/Golang(Go)でグループ分けの組み合わせを実現する
[こちら](http://qiita.com/hiroykam/items/d182ae2a41dedb663380)で、基本的な組み合わせ数の算出を実現し、[こちら](http://qiita.com/hiroykam/items/3886d6a213cd593fdfab)では、上限のある重複組み合わせを実現。それらでは、あるグループから抽出して別の1つのグループを作成するパターンであった。
あるグループから複数のグループにする、つまりグループ分けの組み合わせパターン数を算出する方法はスターリング数を利用して実現できる。

参考：[スターリング数](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E6%95%B0)

##第2種スターリング数
*説明の都合上、第2種スターリング数から・・・
n個で構成されているグループをk個のグループに分けるパターン数を算出する。例えば、グループ(A, B, C, D)を2つに分ける場合、((A, B), (C, D))や((A, B, C), (D))といったパターン数を算出する。ただし、((A, B), (C, D))と((C, D), (A, B))は同一と見なし1カウント扱い。また、((A, B), (C, D))と((B, A), (D, C))のように分割されたグループ内での順序は考慮しない。

```math
\begin{eqnarray}
S(n,k)
 =
  \begin{cases}
    0 & ( k=0 \hspace{4pt} かつ \hspace{4pt} n \neq k ) \\
    1 & ( n=k \hspace{4pt} または \hspace{4pt} k=1 ) \\
    S(n−1,k−1)+kS(n−1,k) & ( a \lt b )
  \end{cases}
\end{eqnarray}
```

##第1種スターリング数
第2種スターリング数と異なるのは分けたグループで巡回置換できるものを除き、別カウントされる。つまり、グループ(A, B, C, D)を2つに分けるケースでは、((A), (B, C, D))と((A), (B, D, C))は別扱いだが、((A), (B, C, D))と((A), (D, C, B))、((A), (B, D, C))と((A), (C, D, B))といったパターンは同一扱いとされる。

```math
\begin{eqnarray}
S(n,k)
 =
  \begin{cases}
    0 & ( k=0 \hspace{4pt} かつ \hspace{4pt} n \neq k ) \\
    1 & ( n=k ) \\
    S(n−1,k−1)+(n-1)S(n−1,k) & ( a \lt b )
  \end{cases}
\end{eqnarray}
```

##ソースコード
###Python3
※実際のところ、第1種スターリング数を使ったことがないためPython3ではデフォルトを第2種とした。

```py
def stirling(n, k, s=True):
    """
    ｎはグループの要素数、kは分割するグループ数、sは第2種(default)かどうか
    """
    return (0 if n < k else
            1 if n == k else
            0 if k == 0 else
            stirling(n - 1, k - 1, s) + (k if s else n - 1) * stirling(n - 1, k, s)
            )

if __name__ == '__main__':
    print(stirling(6, 2))
    print(stirling(6, 2, False))
```

```text:出力結果
31
274
```

###Ruby2.4
デフォルトを第2種とした。

```rb
def stirling(n, k, s=true)
  if n < k
    0
  elsif n == k then 1
  elsif n == 0 then 0
  else
    stirling(n - 1, k - 1, s) + (s ? k : n - 1) * stirling(n - 1, k, s)
  end
end

p stirling(6, 2)
p stirling(6, 2, false)
```

```text:出力結果
31
274
```

###PHP7.1
デフォルトを第2種とした。

```rb
<?php

function stirling(int $n, int $k, bool $s = true) : int {
    if ($n < $k) return 0;
    elseif ($n == $k) return 1;
    elseif ($n == 0) return 0;
    else return stirling($n - 1, $k - 1, $s) + ($s ? $k : $n - 1) * stirling($n - 1, $k, $s);
}

print(stirling(6, 2). PHP_EOL);
print(stirling(6, 2, false). PHP_EOL);
```

```text:出力結果
31
274
```

###Golang
```go
package main;

import "fmt"

func stirling(n int, k int, s bool) int {
    switch {
    case n < k:
        return 0
    case n == k:
        return 1
    case k == 0:
        return 0
    case s:
        return stirling(n - 1, k - 1, s) +  k * stirling(n - 1, k, s)
    default:
        return stirling(n - 1, k - 1, s) +  (n - 1) * stirling(n - 1, k, s)
    }
}

func main() {
    fmt.Printf("%v\n", stirling(6, 2, true))
    fmt.Printf("%v\n", stirling(6, 2, false))
}
```

```text:出力結果
31
274
```
MacでAndroidのEmulatorを起動すると音声出力が8bitに劣化する問題

bluetoothのヘッドホンを使用している時など、特定の条件下で起きる不具合の模様。

エミュレータの音声出力を使わないのであれば、

`QEMU_AUDIO_DRV=none`

の環境変数を設定することで防げるので、以下のようなコマンドでエミュレータを起動する。

`export QEMU_AUDIO_DRV=none && ~/Library/Android/sdk/tools/emulator @Nexus_5X_API_23`

https://issuetracker.google.com/issues/36934624
OctoberCMS管理画面にリソースのCRUD的な管理画面を作る

OctoberCMSの管理画面でリソースの作成・閲覧・編集・削除などを行う画面の作成方法を説明する。ここでは長々と説明しているが、手順がわかってしまえば非常に簡単に作成できる。

[スキャフォールディング](https://octobercms.com/docs/console/scaffolding)でも必要なソースコードの雛形を作成できるが、
[Builderプラグイン](https://octobercms.com/plugin/rainlab-builder)を使用した方が必要なものをまとめて作成できるので遥かに楽。
Builderを使用しても余計なファイルやはデータは作成されないのでプロジェクトを汚す心配なく利用できる。
もちろん、Builderで作成したプラグインでも、Builderがなくても動作する。
（作成されるファイルのオーナーがWebサーバユーザになってしまうので、都度権限を修正するのが面倒だが、そこは環境に応じて工夫すればなんとかなる。）

### Builderプラグインをインストール
Builderプラグインは管理画面の設定からインストールしても良いが、プロジェクトの`composer.json`に記述しておくとチームで開発する際の管理が楽だ。（プラグインの`composer.json`ではないので注意）  
Builderプラグインは本番サーバへのデプロイは必要ないといので`require-dev`に追加する。

```
composer require --dev rainlab/builder-plugin
```

### プラグインを作成、またはロード
#### 新規プラグインを作成する場合
対象のプラグインがまだなければ作成する。

<img width="471" alt="builder_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/138322/c2f4fe48-8b12-c2e8-0bde-ce57fd0f40a8.png">

<img width="535" alt="builder_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/138322/f1649801-1485-c43c-31f7-396a40d41947.png">

#### 既存プラグインを使用する場合
既存プラグインをBuilderに認識させるには、基本的にはプラグインのルートに`plugin.yaml`を下記フォーマットで作成するだけだ。

```yaml:plugin.yaml
plugin:
    name: 'My Plugin'
    description: 'My practice plugin'
    author: pikanji
    icon: oc-icon-bicycle
    homepage: 'http://hogehoge.com/'
```

間違って拡張子を`.yml`にすると認識されないので注意。自分はこれにハマったw

そして、Builderに読み込ませる。

<img width="535" alt="builder_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/138322/72077d19-7783-af97-6ff2-67149c8418a9.png">


### DBテーブルを作成
Builderの"Database"メニューで"+Add"して、UIで項目を設定し保存すると、
`plugins/<auther_name>/<plugin_name>/updates`にマイグレーションファイルが作成される。  
テーブルスキーマの定義は、BuilderのUIからだと少し融通がきかないので、[Laravelのドキュメント](https://laravel.com/docs/5.1/migrations)を見ながらコードを手書きした方がいい。

マイグレーションの適用はBuilderの"Versions"メニューから管理できる。
ここからだとバージョンを選んでプラグイン毎に適用とロールバックが行える。

### モデルの作成
Builderの"Models"メニューから作成するプラグインのDBに存在するテーブルを選んでモデルファイルの雛形を作成できる。

作成されるとメニューに"Forms"と"Lists"が現れるが、
"Forms"はこのテーブルのデータ作成と編集のための入力フォームのことで、"Lists"はデータをリスト表示する際の表示項目を定義するものだ。

### 管理画面の作成・編集フォームとリストの作成
上記「モデル作成」で言及した"Forms"と"Lists"を作成する。  
それぞれ"Forms"と"Lists"の右にある"+"をクリックすることでUIが表示されるので、項目を入力して保存する。
作成画面は見れば使い方は分かるはずなので説明は省略する。  
設定ファイルは`plugins/<auther_name>/<plugin_name>/models/<table_name>`に作成される。

なお、"Label"は文字列の直設定もできるが、"+"から言語ファイルに作成してキーで指定することもできる。言語切替に対応しているということだ。

### 管理画面メニューの作成
上記で作成した画面にアクセスするには管理画面にメニューが必要だ。
Builderの"Backend menu"から、"Add main menu item"をクリックして、管理画面上に追加されるメインメニューを追加する。  
追加されたアイテムをクリックすると詳細を設定できる。
ここでは最低限"Code"を設定する。URLはまだ無いので`/`のままでよい。後で戻ってきて設定する。

### コントローラの作成
MVCのCの作成だ。ただ、OctoberCRMの管理画面ではコントローラを作成することで、ルーティングの設定無しでURLエンドポイントが作成されるので、ここではエンドポイントの作成の意味合いのほうが強い。

Builderの"Controller"メニューから"+Add"で追加する。

"Controller name"はコントローラのクラス名とURLを定義することになる。
複数単語からなるテーブル用のコントローラなら下記の例の様でよいだろう。
テーブル名：`product_types` -> コントローラ名：`ProductType`

そして、対応するモデルとメニューを選択する。

Behaviorについてはここでは割愛するが、とりあえず全て選択しておけば良い。

### メニューにURLを設定
コントローラができたらメニューにそのURLを設定して画面を開けるようにする。

Builderの"Backend menu"から作成済みのメニューをクリックし、
URLに`<author_name>/<plugin_name>/<controller_name>`を入力する。
このURLはリソースのデフォルトページで、デフォルトではリストページになっている。

以上で、最低限のリソース管理ページが出来上がりだ。
これだけで、リソースの作成・閲覧・編集・削除が可能だ。
intelliJでpython3を書こうとしたらpython2の警告が適用される時の対処

intelliJにGoと共存させてpython3のコードを書く必要が生じたので、python packageをインストールして、書こうとしたところ、python2準拠の警告が出たので、その対処法です。
理解が甘いので、間違っていたらコメントで指摘していただければ幸いです。

## 結論；facetsを設定するといいらしい

python2の警告が適用されるということは、python3のファイルがpython2のファイルとして読み込まれているということなので、SDKの設定を見直しました。

File>Project Structure>Project をチェックしたところ、ちゃんとpython3 SDKが選ばれている。

調べてみるとどうも、File>Project Structure>Facets からpython interpreterを設定してあげなければいけなかったらしい。

Facetsの項目でpython3のinterpreterを選択すれば、python3の警告が適用される状態になりました。
ValueTupleをTuple・匿名型と比較してみる

#概要
C#7で導入されたValueTupleをそれまでのTupleや匿名型と比較してみました。

||ValueTuple|Tuple|匿名型|
|:-:|:--------:|:---:|:----:|
|名前付け|〇|×|〇|
|引数・戻値|〇|〇|×|
|型の種類|構造体|クラス|クラス|
|メンバの種類|フィールド|プロパティー|プロパティー|
|不変性|ミュータブル|イミュータブル|イミュータブル|

##名前付け
ValueTupleと匿名型はメンバに名前を付けることができます。
ただし、匿名型と異なりValueTupleは初期化時の変数名等から名前を割り当てることはできません。

```csharp
// ValueTuple
var vt = (x:1, y:"vt");
// 匿名型
var a = new { x = 1, y = "a" };

var x = 1;
var y = "yy";

// ValueTupleでは名前がつかない
var vt2 = (x, y);
// 名前を付けるためは、ちゃんと名前を書かないとダメ
var vt2_ = (x:x, y:y);

// 匿名型では名前がつく
var a2 = new { x, y };

// 明示的に名前付きのValueTupleとしても宣言可能
(int x, string y) vt3 = (1, "ccc");
```

##引数・戻値
Tupleと同様ValueTupleも引数・戻値としての利用が可能です。もちろん名前付きで利用できます。

```csharp
// Tupleは引数・戻値に利用できます。
public Tuple<int, string> GetTuple(Tuple<int, string> t) => t;
// ValueTupleも、引数にも、戻り値にも利用可能です。
public (int, string) GetValueTuple((int, string) vt) => vt;
// もちろん名前を付けることも
public (int x, string y) GetValueTuple2((int i, string s) vt) => vt;
```

##型の種類
ValueTupleは値型です。

```csharp
// structなので、null初期化できない
// Null 非許容の値型であるため、Null を '(int, string)' に変換できません
(int, string) vt = null;

// classなのでnull初期化可能
Tuple<int, string> t = null;
```
##メンバの種類
ValueTupleのメンバは、プロパティーではなくフィールドです。そのため、

* out/refの引数に渡すことができます。
* Propertyを前提としたFwでは利用不可です。（例えばBinding）

```csharp
var vt = (1, "a");
Add(ref vt.Item1);

var t = Tuple.Create(1, "a");
// プロパティまたはインデクサーを out か ref のパラメーターとして渡すことはできません。
Add(ref t.Item1);
```

##不変性
ValueTupleのメンバがフィールドであるため、不変にはなりえません。

```csharp
// 割り当て可能
var vt = (1, "a");
vt.Item1 = 2;

// プロパティまたはインデクサー 'Tuple<int, string>.Item1' は読み取り専用であるため、割り当てることはできません
var t = Tuple.Create(1, "a");
t.Item1 = 2;

// プロパティまたはインデクサー '<anonymous type: int Item1, string Item2>.Item1' は読み取り専用であるため、割り当てることはできません
var a = new { Item1 = 1, Item2 = "a" };
a.Item1 = 2;
```

なお、不変ではないものの値型であるため、以下のようなコードは記述できません。

```csharp
(int i, string s)[] arr =
{
    (1, "a"),
    (2, "b"),
    (3, "c"),
    (4, "d"),
};

foreach (var tuple in arr)
{
    // 'tuple' のメンバーは 'foreach 繰り返し変数' であるため変更できません
    tuple.i = 2;
}
```

値型はimmutableにすべきっていうのがClassLibrary設計の指針だった気がするのですが。

##追記
BuildInsiderに解説記事上がりました。

「C# 7のタプルが一般的なガイドラインに沿わずに書き換え可能な構造体である背景」
http://www.buildinsider.net/column/iwanaga-nobuyuki/016
0から偏見オンリーで覚えるMVC - Model編

MVCフレームワークで疲弊した諸君、独断と偏見で覚えてみないか？
もちろん私の考え方は大分歪んでいるだろうが、面白い体験になることは保証する
なお、今回はDjangoを例として使う

MVCの核心を一言で表すならこうだろう
「コード化されたER図に分けられたロジックにある程度動くHTML」
こいつの何が凄いのか、今回はModelを例にして説明しよう
View、Controllerも確かに凄い技術ではあるのだが、Modelの威力には敵わない

# フルスクラッチPHPでスキーマを変更してみる
君はフルスクラッチPHPでコードを書く現場に所属された
上司がSQLのスキーマを変えてくれと言う
その場合、君は以下の処理をしなければならない

1. ExcelでER図を更新する
2. 生SQL文でDBを更新する
3. DBのチェックを入れる
4. テストを行う（現場によっては手動テストかもしれない）
5. 深夜になった。君はようやく帰れる

ER図を知らない人向けに説明すると、ざっくり言うとにRDBMSの関連図だ
これをExcelで作るのはただただ苦痛だ。その上コロコロ変わりやがる
生SQL文はレガシーで、今時触りたい代物ではない
DBのチェックなんて出来る事ならしたくない
テスト？　どうせ手動だろ？　もう勘弁してくれよ
ようやく帰れた頃にはもう睡眠時間しか残されてない
こんなくたくたな毎日からおさらばしよう

# Modelの威力を発揮する
君はDjangoを扱う現場に所属された
上司がSQLのスキーマを変えてくれと言った
その場合、君は以下の処理だけでいい

1. Djangoでスキーマを変更してみる
2. DBの書き換え（マイグレートと呼ぶ。モダンなSQL文みたいなものを自動生成してスキーマを書き換える事）をする
2. テストを行う
3. お昼でさようなら

嘘のような話だが、フルスクラッチPHP書きにとっては残念ながら真実だ
Modelと呼ばれる、ER図をコードにしたものを書き換え、マイグレートして、テストを行うだけだ
マイグレートと聞くと難しいと感じる人も多いかもしれないが、やる事はターミナル開いて以下の二行を打つだけだ。

```bash
python manage.py makemigrations
python manage.py migrate
```

これだけでSQLのスキーマは変わった。後はテストをするだけで現場からおさらば出来る


実際に体験してみる

この素晴らしい機能を実際に体験してみよう

君は、上司に「簡単なTODOアプリのモデルを作ってくれ」と言われた
整理した結果、ユーザーとTODOのテーブルと、外部キーがあれば十分なことが把握した

フルスクラッチPHPで書くなんていう拷問はやめよう。いきなりDjangoに飛び込むんだ。

まず、君はModelを書く事にした
その結果、以下のコードを書いた

```python:models.py
from django.db import models

class User(models.Model):
    name = models.CharField(max_length=20)
    password = models.CharField(max_length=20)

class Todo(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    text = models.CharField(max_length=140)
```

厳密には間違ったコード（Djangoにはユーザーのモデルが標準で搭載されており、それを引っ張ってくるだけで十分。それとパスワードを暗号化していない）なのだが、説明が楽だし何より上司の目はごまかせそうなので大丈夫だろう
一応コードの意味を説明すると、1行目でDjangoのmodels機能を引っ張ってきて、継承している
CharFieldはただの文字列型、ForeignKeyはただの外部キーだ
こんなちっぽけなコードだけで、君のアフター5は保証される

次は、DBを更新しよう
と言ってもやることは簡単だ。さっき説明した通りに

```bash
python manage.py makemigrations
python manage.py migrate
```

これだけで君はDBの書き換えに成功する
後は自動テストなり手動テストなりして現場からおさらば出来る
浮いた時間でアニメでも見よう。お薦めはプリパラだ

#View,Controllerの解説
動くHTMLとロジック、以上
需要があれば書く
Dockerを使ってHTMLファイル閲覧用に仮NGINXを起動する（１行メモ）

docker の bind mount を使って NGINX を現在のディレクトリ上で一時起動する方法１行メモ。

```shell-session
# docker run --rm -p 80:80 -v $(pwd):/usr/share/nginx/html/ nginx
or
# docker run --rm -d --name tmpnginx-p 80:80 -v $(pwd):/usr/share/nginx/html/ nginx
# docker stop tmpnginx
```

* ヘルプファイル等HTMLで記載されたものを閲覧する際、いちいち NGINX (もしくはApache) の設定を変更して参照させるのはメンドクサイ。
* しかも閲覧終わったら NGINX のプロセスは終了して欲しい。（セキュリティ的にもいらないプロセス動いてて欲しくないという気分的にも）
* しかも --rm オプション使ってるので Ctrl+c で終了するとコンテナ綺麗にする必要もない
* もしログが表示されるのがうざかったら -d でバックグラウンド起動しておいて stop で止めればOK

以上
FactoryGirlでDRYを実践するためのtransient活用

FactoryGirlで"Transient Attributes"(一時的な属性)の機能がスッキリ書くために便利だったので紹介します。

# より詳しくはこちら
-
 https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#transient-attributes
- [FactoryGirlのtransientとtraitを活用する - Qiita](http://qiita.com/joker1007/items/da63b8630351c1f3fe1d)


# とにかく書いてみる例
```rb
FactoryGirl.define do
  factory :job_user, class: User do
    name "yamada(job_name)"
    sequence(:email) { |n| "job_name#{n}@example.com" }

    trait :programmer do
      name "yamada(programmer)"
      sequence(:email) { |n| "programmer#{n}@example.com" }
    end

    trait :architect do
      name "yamada(architect)"
      sequence(:email) { |n| "architect#{n}@example.com" }
    end

    trait :writer do
      name "yamada(writer)"
      sequence(:email) { |n| "writer#{n}@example.com" }
    end
  end
end
```

上記はuserの名前の後ろとメールアドレスにお仕事の英名を含むような仕様になっています。
見つめていると、DRY(Don't Repeat Yourself)に反しているような気がしてきます。
このような場合にTransient Attributesを使うことができます。


# Transient Attributesを利用した例

`job_name`という一時的なattributesを定義して、traitでは`job_name`のみ差し替えるようにしました。

```rb
FactoryGirl.define do
  factory :job_user, class: User do
    transient do
      job_name "job_name"
    end
    name { "yamada(#{job_name})" }
    sequence(:email) { |n| "#{job_name}#{n}@example.com" }

    trait :programmer do
      job_name "programmer"
    end

    trait :architect do
      job_name "architect"
    end

    trait :writer do
      job_name "writer"
    end
  end
end
```

```rb
user = FactoryGirl.create(:job_user, :programmer)
user.name #=> "yamada(programmer)"
```

一時的なattributeの`job_name`のみ差し替えるようにしました。
この書き方があまり他に見当たらなくて、気づくまでtransient do...endをいちいち書いたりして余計見通しを悪くしていたりしました...。
だいぶスッキリしたのではないでしょうか。

また、次のように指定することも可能です。
もし繰り返して使うようなjob_nameがないのであれば、いっそtraitを無くしてこちらで対応しても良さそうです。

```rb
user = FactoryGirl.create(:job_user, job_name: "driver")
user.name #=> "yamada(driver)"
```

# callbackでも使えるよ
callbackでも第2引数でtransientで指定したattributeを取得できます。

```rb
FactoryGirl.define do
  factory :job_user, class: User do
    transient do
      job_name "job_name"
    end
    name { "yamada(#{job_name})" }
    sequence(:email) { |n| "#{job_name}#{n}@example.com" }

    after(:create) do |user, evaluator|
      user.introduction ||= "私の仕事は#{evaluator.job_name}です"
    end
  end
end
```

```rb
user = FactoryGirl.create(:job_user, job_name: "driver")
user.introduction #=> "私の仕事はdriverです"
```


便利〜 :smile:
初めてGemsでRubyのライブラリを公開する

# GemsでRubyのライブラリを公開する方法
## Gemsで公開できるライブラリを作成する
### 必要なライブラリをインストールする
```bash
$ sudo apt-get install rbenv bundler rake
$ sudo gem install rspec
```

### gemspecを作る
gemするために必要なプロジェクトを作成します。

```bash
bundle gem "gem name" -t
```

"gem name"のフォルダができるので、このフォルダの中にプロジェクトを作ります。
lib/に"gem name".rbがありますので、そのファイルに実際に動かすライブラリを入れます。


### "gem name".gemspecを編集する
"TODO: "が入っているとエラーになるので、TODOを消して正しい記述をしてください。
  spec.summary       = %q{<font color="red">"TODO:XXXX"</font>}
  spec.description   = %q{<font color="red">"TODO:XXXX"</font>}
  spec.homepage      = "<font color="red">"TODO:XXXX"</font>"

### gemの依存関係があれば記述しておきます。
#### gemspec
この一行はrubygem.orgから公開する場合はコメントアウトしてください。

```ruby
    #spec.metadata['allowed_push_host'] = "TODO: Set to   spec.add_development_dependency "bundler", "~> 1.11"
```

```ruby
  spec.add_development_dependency "rake", "~> 10.0"
  spec.add_development_dependency "rspec", "~> 3.0"
 # 追加する行
  spec.add_dependency "google_drive", "~> 2.1"
  spec.add_dependency "termcolor", "~> 1.2"
```
#### Gemfile
このようにgemspecの下に依存関係のあるgemを記述します。

```ruby
source 'https://rubygems.org'

 # Specify your gem's dependencies in easy-google-drive.gemspec
gemspec
gem "google_drive","2.1.3"
gem "termcolor","1.2.2"
```
### githubにpushします。
### gemのビルドを行います。
```
$ rake build
```
### 動作確認
作成したgemをインストールして動作確認をします。

```bash
$ sudo gem install pkg/"gem name"-"version".gem
```
公開しないのであれば、ここまでで作業は終了です。

## Gemに公開します。
### rubygem.orgにユーザ登録する
1. [https://rubygems.org](https://rubygems.org)にアクセスしてユーザ登録をします。
2. 登録をしたら"Edit Profile"をクリックします。Email Meの下にある小さいところです。
![2017-05-06-183752_1440x900_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/136933/13a1845a-2078-11e3-c236-d2a7c25b4fc8.png)
3. profileの一番下にcurlの情報があるので、それをconsole画面に貼り付けて認証を行います。<br>

```bash
$ curl -u NaotakaSaito https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials; chmod 0600 ~/.gem/credentials
Enter host password for user 'NaotakaSaito':
 ### パスワードを入力してください###
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    56    0    56    0     0     76      0 --:--:-- --:--:-- --:--:--    76
```

### gemを公開する

(2017年5月17日 公開するためのコマンドを変更しました)

```
$ rake release
```

（おまけ）
新たな端末からリリースを行うとき、rake releaseでエラーが発生します。
その時は、まずgem pushをしてください。
メールとパスワードを入力するとエラーで終了しますが、問題ありません。

```
$ gem push
   Don't have an account yet? Create one at https://rubygems.org/sign_up
    Email: 
    Password:

Singed in.
Error: While executing gem ... (Gem:: CommandLineError)
    Please specify a gem name on the command line (e.g. gem build GEMNAME)
```
Singed in.がでたらサーバーにログインできたということなので、最後に

```
$ rake release
```
をしたら完了です。

sugo gem install "gem name"
でインストールして正しいバージョンがインストールできるか確認をしましょう。
行政への提言：IT運用における働き方の変革のためには

昨今、働き方の変革が叫ばれていて、ノー残業、ノー休日出勤という風潮になっている。

しかし、IT運用の現場では、

 * 夜間、休日急遽トラブル呼び出される。
 * 止まらない体制のために、夜間待機体制がある

などが一般的に行われている。

ただし、このシステム止またって、人命に関わるの？というシステムが多々ある。
ここで提案、行政側で

**人命にに関わる公共インフラを除き、平日日中以外の時間帯のサービスに対して、サービスレベルを求めてはいけない**

休日止まっていたら、止まったままでもよい。
という割り切りでよいのでは？
これで随分とシステム関係者の生活が守れると思います。
</span> 直後の <br> を消したい例 (IE6対応)

* `</span> 直後の <br>` を消したい例

## IE8以降

```html
<span>aa</span>
<br>
<span>bb</span>

<script>
var elements = document.getElementsByTagName("span");
for (i=0; i < elements.length; i++) {
	elements[i].style.display = 'none';
	// </span> 直後の <br> を消したい
	if (elements[i].nextSibling instanceof HTMLBRElement) {
		elements[i].nextSibling.style.display = 'none';
	}
}
</script>
```

* HTMLBRElement は [IE8以降対応](https://msdn.microsoft.com/en-us/library/hh869690(v=vs.85).aspx)だった。

## IE6以降、javascript対応ガラケー対応

```diff
  <span>aa</span>
  <br>
  <span>bb</span>
  
  <script>
  var elements = document.getElementsByTagName("span");
  for (i=0; i < elements.length; i++) {
  	elements[i].style.display = 'none';
  	// </span> 直後の <br> を消したい
- 	if (elements[i].nextSibling instanceof HTMLBRElement) {
+ 	if (elements[i].nextSibling.nodeName == "BR") {
  		elements[i].nextSibling.style.display = 'none';
  	}
  }
  </script>
```
Railstutorial 4版　覚書 第８章

自分が分かりづらかったところをまとめました。

#HTTPはIDを保持する手段がない

半永久的な接続（セッション）を別途設定する。
Railsではcookiesを使うのが一般的
Railsのメソッドsessionで実装

- Sessionsコントローラを使う

```
rails generate controller Sessions new
```
アクションnew、create、deleteで実装する

- ルートの変更と追記
ヘルプファイルのgetの変更
get sessions_new_url -> get login_path


#フォーム
モデルを使わないので、Active Recordの機能がつかえない（エラーメッセージ）
=>フラッシュメッセージでエラーを表示

```
form_for(@user) #Modelある
=>
form_for(:session, url: login_path)
```

#log_inメソッド
session[:user_id] = user.id  の意味がよくわからなかったがこういうことだと理解した。

sessionは自動で暗号化するメソッド
session[:user_id].class #=>String
session.class #=>Hash

IDを使うから
session[:user_id] = user.id

なんでも突っ込める
nameを使う場合
session[:index] = user.name

オブジェクトを使う場合

```
> session[:index] = @current_user
=> #<User id: 1, name: "Rails Tutorial", email: "example@railstutorial.org", created_at: "2017-05-04 23:00:02", updated_at: "2017-05-04 23:00:02", password_digest: "$2a$10$RW0ReoYLSB1MfniZrrDAFOv/UAH36IQ1t/3zjZPPr92...">
session[:index].id #=>1
session[:index].name #=>"Rails Tutorial"
```

#テストは画面遷移を記述していく
今回は全部覚えられないので、全章終わったらまとめたい。
Check! あえて az コマンドを使って VM を便利に使う bat スクリプト（PowerShell 版はいずれ…！）

こんにちは、[エクストリームデザイン][] の @dz_ こと大平かづみです。

Prologue - はじめに
====

Azure をサクサク触るために、CLI を利用してます。私は Windows を使っているので PowerShell 版… ではなく、Mac や Linux を使うほかのメンバーとも情報共有ができるように `az` コマンド（[Azure CLI 2.0](https://docs.microsoft.com/ja-jp/cli/azure/get-started-with-azure-cli "Get started with Azure CLI 2.0 | Microsoft Docs")) を使っています。

`az` コマンドは便利なのですが、複数台の VM の情報が見たいとかいっぺんに操作したいとき！ リソース名とは別の `id` を指定するものが多いです。

bash なら、id 一覧を取得してパイプでサクッとできるものの、コマンドプロンプトではうまくできません><

なので、よく使うユースケースのものをまとめた bat スクリプトを書きました！（時代逆行…？）

リソースグループを指定して、仮想マシンを操作する bat スクリプト
====

説明
----

基本的には、私が作業に必要なことしか盛り込んでいませんが、もし流用されるようであれば、用途に合わせてカスタマイズいただければと思います。

また、はじめて bat スクリプトを書いたので、未熟な点があるかもしれません。ご理解いただけますと幸いです。

### 機能概要

リソースグループを指定して、内包する仮想マシンに対して以下の操作ができます。

- IPアドレス一覧取得（パブリック、プライベートともに）
- 仮想マシン操作
    - 状態取得
    - 開始 (start)
    - 停止 (stop)
    - 割り当て解除 (deallocate)

### 前提条件

- `az` コマンドがインストールされていること
    - 参考: [Install the Azure CLI 2.0 | Microsoft Docs](https://docs.microsoft.com/ja-jp/cli/azure/get-started-with-azure-cli "Install the Azure CLI 2.0 | Microsoft Docs")
- `az login` を済ませていること
    - 参考: [Log in to Azure](https://docs.microsoft.com/ja-jp/cli/azure/get-started-with-azure-cli#log-in-to-azure "Log in to Azure | Get started with Azure CLI 2.0 | Microsoft Docs")

### 使い方

下記のソースコードを *vms.bat* としてどこかに配置してください。

例として、リソースグループ `myRG` 内の仮想マシンを操作するサンプルを示します。

```bash
# vms.bat が置いてあるディレクトリに移動
$ cd <path to vms.bat>

# IPアドレス一覧取得
$ vms myRG ips

# 仮想マシンの状態取得
$ vms myRG status

# 仮想マシンの開始
$ vms myRG start

# 仮想マシンの停止
$ vms myRG stop

# 仮想マシンの割り当て解除
$ vms myRG deallocate
```

なお、`ips` 以外の操作では、初回に id一覧を取得し、*vms.bat* と同じディレクトリにファイル保存し、（ 例: *myRG-vms.tsv* ）。以降の操作ではこのファイルを参照します。

もし、仮想マシンの操作順番を変えたい場合（ 例: 特定のサーバーを先に開始したい、など）は、このファイルのidの順序を変えればその通りに実行します。

vms.bat ソースコード
----
- [dzeyelid/vms.bat | GitHub Gist](https://gist.github.com/dzeyelid/b8f7cc146277a9c365eeae81abcdf26a)

<script src="https://gist.github.com/dzeyelid/b8f7cc146277a9c365eeae81abcdf26a.js"></script>

Epilogue - おわりに
====

なお、Windows で bash を使いたい場合は、 Ubuntu on Windows を使った方が素直かもしれません！私の場合は、もろもろの兼ね合いで [cmder](http://cmder.net/ "cmder") を介してコマンドプロンプトを使っています。以前に使い方をまとめた記事があるので、ご興味ある方は下記をご参考くださいませ～。

- [Check! cmder ～ Windows に Monokai スタイルのコンソールを導入 (実行ポリシーのトラブルシューティング)](http://qiita.com/dz_/items/68de2b07aab9ef4aab68 "Check! cmder ～ Windows に Monokai スタイルのコンソールを導入 (実行ポリシーのトラブルシューティング)")


[エクストリームデザイン]: http://xd-lab.net/
Rubyでタロット占いプログラムを作る(その1)

#はじめに
・Rubyのプログラミングを始めて約9ヶ月
・そろそろオブジェクト指向的に何かを作りたい
ということで、タロット占いを作ることにしました
(ついでにQiitaへ投稿練習もかねて）

#制作環境(動作環境)
Windows7 64bit
Ruby 2.3.3

#目標
以下の2点を最低ラインに
・(今後の事も踏まえて）入力を受け取って選択肢を選べるようにする
・占い方法としてワンオラクル(一枚カードを引くだけ）を実装する
また今後のために
・カードを作るためのクラスを作成する
→将来的に大アルカナ(22枚）、小アルカナ(56枚)を作る必要があるので
・同様に占い方法も別ファイルに作成して追記可能にしておく

#作成したプログラム(ver.1)
第一目標を目指して作ったプログラムがこちらになります

```main.rb
require './arcana'
require './logic'
#定数(カードリスト)
a0 = Arcana.new("愚者",  0,"自由、希望、未来への可能性","現実逃避、焦りや不安、怠慢")
a1 = Arcana.new("魔術師",1,"創造性、アイディア、始まり","失敗、予想外、優柔不断")
a2 = Arcana.new("女教皇",2,"直感的、清純、真実","思い込み、批判的、偏見")
a3 = Arcana.new("女帝",  3,"豊かさ、成功、繁栄","誘惑、浪費、依存心")
a4 = Arcana.new("皇帝",  4,"目標、指導力、決断力","身勝手、独りよがり、不完全燃焼")
a5 = Arcana.new("法王",  5,"伝統、常識、善行","暗転、障害、過ち")
a6 = Arcana.new("恋人達",6,"新たな始まり、協力、出会い","逃げ、迷い、訪れない")
a7 = Arcana.new("戦車",  7,"冒険心、独立心、探究心","限界、失望、疲労感")
a8 = Arcana.new("力",    8,"努力による結果、存在感、努力","過信、実力不足、試練")
a9 = Arcana.new("隠者",  9,"内省、静かな暮らし、真実を求める","頑固さ、引き篭もり、孤独")
a10 = Arcana.new("運命の輪",  10,"予期せぬ幸運、解放、予想外","トラブル、アクシデント、急変")
a11 = Arcana.new("正義",  11,"正義、公正、公平","不安定、判断ミス、バランスが悪い")
a12 = Arcana.new("釣られた男",  12,"岐路、過渡期、忍耐","閉塞感、本末店頭、困難")
a13 = Arcana.new("死神",  13,"潮時、ターニングポイント、再スタート","欠乏、喪失、無力感")
a14 = Arcana.new("節制",  14,"節度、節約、堅実さ","ミス、過度の要求、トラウマ")
a15 = Arcana.new("悪魔",  15,"破壊、堕落、嫉妬","悪徳、背信、強情")
a16 = Arcana.new("塔",  16,"急激な変化、破綻、魂の成長","混沌、戸惑い、漠然")
a17 = Arcana.new("星",  17,"希望、夢を叶える、インスピレーション","過大評価、誇張、誘惑")
a18 = Arcana.new("月",  18,"悩み、トラウマ、隠し事","欲求、状況の好転、真実")
a19 = Arcana.new("太陽",19,"潜在的可能性、成果、成長","エネルギー不足、実力が出ない、期待外れ")
a20 = Arcana.new("審判", 20,"復活、回復、変革","失意、幻滅、苦境")
a21 = Arcana.new("世界", 21,"完成、達成、勝利","スランプ、苦渋、絶望感")

list = [a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21]

#実行処理開始
puts "タロット占いの館へようこそ"
scene = "start"
while true
  case scene
    when "start"
      puts "占いの方法、または終了を選んでください"
      puts "1:ワンオラクル"
      puts "2:プログラムを終了する"
      sn = gets.to_i
      case sn
        when 1
        i = rand(21)
        spread1(list[i])
        when 2
        puts "プログラムを終了します"
        puts "少しお待ちください"
        sleep 2
        exit
        else
        puts "ちゃんと選択してください"
        scene = "start"
    end
  end
end
```

```arcana.rb
# coding: utf-8
class Arcana
  def initialize(cardname = "テスト",mynumber = 123456789,contentNP = "abcdefg",contentRP= "vwxyz")
    @name = cardname
    @number = mynumber
    @contentNP = contentNP
    @contentRP = contentRP
  end

  def card
    puts "カードの名前は#{@name}"
    puts "カードのナンバーは#{@number}"
    puts "正位置の内容は#{@contentNP}"
    puts "逆位置の内容は#{@contentRP}"
  end

  def name
   @name
   puts @name
  end

  def number
    @number
    puts @number
  end

  def contentNP
    @contentNP
    puts @contentNP
  end

  def contentRP
    @contentRP
    puts @contentRP
  end
end
```

```logic.rb
require './arcana'
def spread1(i)
  puts "では占います"
  sleep 2
  ary =["正位置","逆位置"]
  puts "占いの結果はこちらになります"
  puts ary.sample;
  i.card
  puts "最初に戻ります"
  sleep 3
end
```
#今後の目標
・mainの処理を色々改修
カードリストと配列を直接書いてしまったので、もうちょっとスマートにまとめる
・占いロジックの追加
2～3枚を使った物から、配置が重要になるものも含めて色々実装
・最終的にはRailsに移植してweb上でプレイ可能にする

とりあえずこれを目標に頑張っていきたいと思います