OmniAICreator/Qiita-1.07M huggingface dataset:
[Day2] TypeScript × Node.jsで簡単なRESTAPI作ってみる(Swagger編)

#### [Day1] TypeScript × Node.jsでHello World
https://qiita.com/okkun_includer/items/5b7a916cd7008f3c7a1c
#### の続きです

## Swaggerとは
REST API作るときに簡単にドキュメント作れます。
curlで動作確認やコード自動生成も出来る！(強い)

## Swagger Editor
以下のサイトで編集できる。
https://editor.swagger.io/

諸事情により、アップロード出来ない場合はdockerもある。
API用のコンテナと一緒に立てるのが良さそう。
`swaggerapi/swagger-editor`

## SwaggerでHello World

```
swagger: '2.0'
# 説明とか
info:
  description: Sample
  version: 1.0.0
  title: Sample API
# REST APIのURLを書く場所
host: 'localhost:3000'
# 共通の階層を指定する。Swagger的にはv1とかがデフォルト
basePath: /v1
# 基本はhttp通信かhttps通信か両方
schemes:
  - http
  - https

# セキュリティの定義
# Basic認証をかけてます
securityDefinitions:
  basicAuth:
    type: basic

# メインディッシュ
# パスに入ったときのinputとoutputを定義する
paths:
  /user/list:
    get:
      tags:
        - user
      summary: ユーザ情報取得
      security:
        - basicAuth: []
      responses:
        '200':
          description: Success
          schema:
            $ref: '#/definitions/result_user_list'
  
  /user/regist:
    post:
      tags:
        - user
      summary: ユーザ情報登録
      security:
        - basicAuth: []
      parameters: 
        - in: body
          name: user
          required: true
          schema:
            $ref: '#/definitions/user_model'
      responses:
        '200':
          description: OK
 
# モデルクラスの定義
# なるべく小さく定義して、$refで再利用すると使いやすい
definitions:
  user_model:
    type: object
    properties:
      id:
        type: integer
        example: 10001
      name:
        type: string
        example: okkun
      email:
        type: string
        example: okkun.development@gmail.com
      age:
        type: integer
        example: 24
  
  result_user_list:
    type: object
    properties:
      users:
        type: array
        items:
          $ref: '#/definitions/user_model'
      
    
externalDocs:
  description: Find out more about Swagger
  url: 'http://swagger.io'
```

## 結果
こんな感じでユーザ情報一覧を取ってくるAPIドキュメントが作れました。
（プライバシーポリシーどうなってんだ）

<img width="688" alt="スクリーンショット 2018-09-13 23.04.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/286417/f52b7130-3ca1-d1f8-7ae3-fd506090eeb4.png">

swagger-codegenとか使うとyamlを読み取って通信周りのコード自動生成してくれます
https://github.com/swagger-api/swagger-codegen

## 感想
ドキュメント作るの大事
Item 66: Use native methods judiciously

# 66.nativeメソッドは気を付けて使うべし
## native メソッド
Java Native Interface（JNI）を使って、CやC++で書かれたメソッドを呼べる。

歴史的に、nativeメソッドには3つの用途がある。

* windowsのレジストリなど、プラットフォーム特有の機能へアクセスするため
* レガシーなデータにアクセスするライブラリを含む、nativeコードのライブラリを使うため
* パフォーマンス向上のため

プラットフォーム特有の機能にアクセスするためにnativeメソッドを使うことは正当である。
とはいえ、Javaは成熟してきたので、だいたいの機能はある。例えば、Java9ではOSのプロセスにアクセスできたりする。
また、Javaにはないライブラリがnativeライブラリにある場合も、nativeメソッドを使ってよい。

性能のためにnativeメソッドを使うことはあまりない。
初期のJavaではそのようなことがあったらしいが、JVMの進化によりそんなに性能は変わらなくなっている。

## nativeメソッドの欠点
nativeメソッドには大きな欠点がある。

* nativeメソッドはsafe（BOFとかが起きないという意味の、メモリ管理的な安全のことだと思う）でないので（Item50）、nativeメソッドを使っているアプリケーションは、Javaとは言え、メモリ破損のエラーに対して免疫があるとは言えなくなる。
* nativeメソッドはプラットフォームに大きく依存するので、移植性がなくなる。
* デバッグがむずい
* 下手すると性能劣化する。ガベージコレクターがうまく働かないことがあり得るし、nativeコードを行き来するコストがかさむためだ。
* 可読性が低く、冗長な記述が必要なグルーコードが必用。

つまり、よく考えてnativeメソッドを使えということ。
daemon 稼働状況表示（シェルスクリプト）



こんにちは。
指定した daemon が稼働しているか表示してみました（下記例では ```daemons="httpd smbd caffeinate"``` が動いているかどうか、およびその ```pid```）。macOS 上で動かしました。

```console
$ ./deamons.sh 
/usr/bin/caffeinate 7289
$ kill -9 7289
```

```deamons.sh
#!/bin/sh
daemons="httpd smbd caffeinate"

coloring() { [ -n "$1" ] && echo $'\e[32m'${1}$'\e[0m' || echo '' }

for daemon in $daemons; do
  d=`which $daemon 2>/dev/null` && pid=`pidof $daemon` && echo $d `coloring "${pid}"` | grep '[0-9]'
done
```

* なお ```jobs -l``` コマンドは、現セッションで稼働させたバックグランドジョブ（＋プロセスID）を表示します。
Picassoでwrap_contentなImageViewに画像を読み込む際に縦横それぞれN倍する

## はじめに
こんな記事を書いておいてなんですが、**まず大前提として取得してくる画像のサイズを揃えること**を検討するべきだとは思います。

それでも**「不揃いな画像を取得してきて、縦横それぞれ等しくN倍したwrap_contentなImageViewを並べたい」**という謎の機能要件が有ったのでこの記事を書くに至りました。

今回使った主なライブラリのバージョンは下記です、適宜読み替えて下さい。

* org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.61
* com.squareup.picasso:picasso:2.71828

## 概要
画像の拡大はImageViewのscaleTypeをゴニョゴニョするという認識でしたが、まずImageViewのサイズを絶対値ないしmatch_parentに固定せねばなりません。

例えば取得してくる画像のサイズがそれぞれ

* 100 × 160
* 150 × 180
* 200 × 120

のように全てバラバラだったとき、先にImageViewのサイズを決めてしまうことにより

* 予め決めた範囲内での画像の拡大になってしまう
* よしんばN倍出来ても、それらを並べたときに上下左右に無用なスペースが生まれてしまうことがある

という問題が発生してしまいました。

例で上げた3枚の画像を縦横それぞれ2倍するとしたら、下記のようなサイズになるはずです。

* 100 × 160 => 200 × 320
* 150 × 180 => 300 × 360
* 200 × 120 => 400 × 240


## 実装
PicassoのTransformationインターフェースを実装する形で解決出来ました。 

```ScaleTransformation.kt
class ScaleTransformation(
        private val scale: Float
) : Transformation {

    override fun transform(source: Bitmap?): Bitmap? {
        source ?: return null

        //1倍にするとcreateBitmapしてもsourceを返そうとして死ぬ
        if (scale == 1f) {
            return source
        }

        val matrix = Matrix().apply {
            setScale(
                    scale,
                    scale
            )
        }

        val result = Bitmap.createBitmap(
                source,
                0,
                0,
                source.width,
                source.height,
                matrix,
                true
        )

        source.recycle()

        return result
    }

    override fun key(): String =
            "ScaleTransformation(scale = $scale)"

}
```

Picassoで画像をloadする際に、倍率をFloatで指定してセットしてあげれば動きます。

```呼び出し元.kt
Picasso.get()
    .load(imageUrl)
    .transform(ScaleTransformation(2f)) //← 倍率を指定
    .into(image_view)
```

## 終わりに
もともとの画像サイズがバラバラとは言えど、ある程度常識的な範囲に収まるという前提のコードになっています。
元画像のサイズがとてつもなく巨大なときなどに画像を拡大しようとするとメモリリーク不可避な感じになる気がするので、ちゃんとやるなら変換後の画像サイズに応じて、入力された等倍の割合をよしなに緩めるなどの対応が必要かと思います。
【GitHub】Fork my repository〜自分のリポジトリをForkする〜

世の中の色々なリポジトリをforkして作業することは多いと思うが、自分のリポジトリをforkしたい場合の手順を記載していきます。

方法は2つあります。 下記を参考に両方試してみます。

- [github 自分のリポジトリを fork する方法](https://qiita.com/JhonnyBravo/items/21feb3d599fc22743224)
- [githubで自分のリポジトリをforkする](https://qiita.com/moyashidaisuke/items/2efff3d94f140fe68a91)



### 方法1 : 空のリポジトリへimportする方法
1. README.mdなどを含めない空のリポジトリを作成します。
<img width="804" alt="1_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/122901/730aae3c-1e10-c8f7-84d6-2d06cf3420a5.png">


2. 『import code』を押します。
<img width="1072" alt="1_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/122901/913fb2d4-ae71-2c01-8e23-05459384fb1e.png">

3. forkしたいリポジトリのURLを貼ります。
<img width="629" alt="1_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/122901/688d4487-1cdd-9fae-bb90-bac1032c9e40.png">

4. 読み込みが終わったら完了です。
<img width="619" alt="スクリーンショット 2018-09-13 19.14.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/122901/4b7bf018-1a99-bca1-fc2d-17e8e83494c5.png">

### 方法2 : 『+』マークからimportする方法(最短)

1. リポジトリの右上にある『+』からImport repository押下
<img width="1027" alt="スクリーンショット 2018-09-13 19.31.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/122901/806a60c4-b7e4-4be8-db1e-9062e5e18f30.png">



2. fork元にリポジトリURLと作成したリポジトリ名を記載します。
<img width="676" alt="2_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/122901/28bb52b3-363d-9b44-b7ca-89a8d1b87363.png">

3. 読み込みが終わったら完了です。
<img width="663" alt="スクリーンショット 2018-09-13 19.32.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/122901/386a9e18-eb35-025a-422e-7bfd012a1768.png">


以上です。
どっちの方法でも結果は同じなので、空のリポジトリを作成してしまった場合は方法1を。それ以外は方法2を採用すると良いと思います。
DS-Lite for systemd-networkd

自分のマシンだけIPv4パケットをカプセル化してトンネルに送りたい人向け。
ルータにしたい人は[これ書いた時に参照した参考資料](http://haruo31.underthetree.jp/2017/08/24/archlinux%E3%81%A7mio%E3%81%B2%E3%81%8B%E3%82%8Aipoe%E6%8E%A5%E7%B6%9A%E5%90%91%E3%81%91%E3%81%AE%E3%83%AB%E3%83%BC%E3%82%BF%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B/)を読むと良いです。

# TL;DR
例えば接続先がtransixだったら、以下の3つのファイルをつくるべし

```systemd.unit:/etc/systemd/network/LAN.network
[Match]
Name=en*

[Network]
DHCP=ipv6
Tunnel=dslite0
IPForward=ipv4

```

```systemd.unit:/etc/systemd/network/transix.netdev
[NetDev]
Description=IPv4 Internet Link via DS-Lite(RFC6333) gateway provided by transix
Name=dslite0
Kind=ip6tnl
MTUBytes=1500

[Tunnel]
Mode=ipip6
Local=<YOUR IPV6 ADDRESS>
Remote=<てくろぐを参照orあのURLをdigとかで引く>
DiscoverPathMTU=true
```

```systemd.unit:/etc/systemd/network/transix.network
[Match]
Name=dslite0

[Route]
Destination=0.0.0.0/0
```

# 詳説
まずお使いのネットワークファイルに、`Tunnel=デバイス名`と`IPForward=ipv4`を書き足します。この時のデバイス名は先述の参考資料で違う名前を使っていることからわかる通り、英数字なら大概なんでもいいと思います。
次にnetdevファイルを作ります。私はファイル名をトンネル事業者名にしていますが、これもなんでもいいです。抑える必要があるのは、ネットワークファイルで挙げたデバイス名とこのファイルに書く`Name`が一致していることです。なお、`Local`に指定するIPアドレスを変動に耐えられるようにするのは私にはできませんでした。
最後に、トンネルのネットワークファイルを書きます。これはルーティング用のものらしく、`Destination`がゼロになっていることはデフォルトルートを意味するようです。

# で、なんで動かないの？
いや、Archな人とかはこれで普通に動くはずです。
手元のGentoo環境では、これで`ip addr`や`ip link`、`ip -4 route`した限りは完璧ですが実際にIPv4ノードにpingしてみるとパケットが闇に呑まれてしまいます。
原因は明らかにカーネルコンフィグの必要な項目が有効になっていないことだろうと思っているのですが、私にはそれがどれなのかわからず途方に暮れたままです。
いや、せっかく[GentooJPの相談用リポジトリ](https://github.com/gentoojp/issues/)作って頂いてるんだからそこにIssue作ればいいんですが、ちょーっとGithubの私のアカウントはとっちらかってしまっていて……片付いたら尋ねに行くつもりです。
Ubuntu 16.04 64bitに特定バージョンのgccをローカルビルドする

makeに3時間ぐらいかかります。

```sh
mkdir -p $HOME/local/bin
mkdir -p $HOME/local/src
cd $HOME/local/src
wget https://ftp.gnu.org/gnu/gcc/gcc-6.4.0/gcc-6.4.0.tar.gz
tar xzvf gcc-6.4.0.tar.gz
cd gcc-6.4.0
./contrib/download_prerequisites
./configure -v --disable-multilib --prefix=$HOME/local
sudo apt install make
make
make install
echo "export PATH=$HOME/local/bin:$PATH" >> $HOME/.profile
source $HOME/.profile
g++ --version
```

いろいろエラーがでることもあると思ういますがそのたびに、対応が必要。 makeがとても長い...。

参考:
https://askubuntu.com/questions/864893/update-gcc-to-the-6-3-version
Render Propsからコールバックを呼ぶ

普通はそんなことをしないと思うのですが、Render Propsからコールバックを呼ぶような処理をすることとなり、一工夫が必要となりました。

# TL; DR

* ReactはRender PhaseとCommit Phaseに分かれている
* Render PropsはRender Phaseだけど、`setState`はCommit Phaseから呼ばないといけない
* 下層にコンポーネントをセットして、そこのイベントを介する

# 前提条件

もともとReact外を経由するような方法で値を取得して、`onGet`コールバックを駆動するようなコンポーネントを作っていました。で、React 16.3で加わった`Context`を使えばスッキリ書き直せるようにも思えてきたのですが、とりあえず従来のコンポーネントも（上に`<Provider>`をセットすることを除けば）そのまま使えるようなものに置き換えておこうと考えました。

# Render Propsとは

詳しくは[Reactのドキュメント](https://reactjs.org/docs/render-props.html)や[別の方の記事](https://qiita.com/shoichiimamura/items/1646d4cec14ab8da3be8#_reference-f72a975a20921eced44f)に譲りますが、Render Propsは、「`prop`として、コンポーネントを返す関数を取る」技法です。この関数の引数を外側のコンポーネントでセットすることで、関数の出力となるコンポーネントの挙動を変化させることができます。

なお、`prop`の名前が`render`とは限りません。実際、`Context.Consumer`も子要素 =`children`に関数を取ります。

# 素直に書くとエラーに

まずは、素直に書いてみました。

```jsx
function ContextGetter(props){
  return(
    <Context.Consumer>
      { 
        value => {
          this.props.onGet(value);
          return null;
        } 
      }
    </Context.Consumer>
  );
}
```

このようにしたら動く…と思いきや、「`render`の中から`setState`は呼べません」のようなエラーとなってしまいました。

# 2つのフェーズ

Reactの実行は、2つのフェーズに分かれています（[ここの模式図](http://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/)が見やすいです）。

* Render Phase…描画を実行する部分。React 17で非同期化が計画されていることもあり、`setState`など副作用のある操作は行えない。
* Commit Phase…描画が完了した後処理の部分。`setState`などの実行も可能。

ということで、文字通りRender PhaseにあたるRender Propsでは、`setState`を行うようなコールバックの実行はできないのでした。

# では、どうする？

コールバックを呼ぶのはCommit Phaseでないとうまくいかないので、`Consumer`の内側にさらにコンポーネントを入れて、内側の`componentDidMount`や`componentDidUpdate`などで拾うことにしました。

```jsx
function ContextGetter(props){
  return(
    <Context.Consumer>
      { 
        value => <ContextGetterInner value={value} onGet={this.props.onGet} />
      }
    </Context.Consumer>
  );
}

class ContextGetterInner extends React.PureComponent{
  componentDidMount(){
    this.props.onGet(this.props.value);
  }

  componentDidUpdate(){
    this.props.onGet(this.props.value);
  }
}
```

# 結論

素直に`Context`を使うほうが、ずっとわかりやすいや。
Jenkins で、追い push したら同じ Pull Request の実行中のビルドを abort する

[GitHub Pull Request Builder Plugin](https://github.com/jenkinsci/ghprb-plugin) というプラグインを使ってビルドを kick している場合、[この方法](https://github.com/jenkinsci/ghprb-plugin/issues/379#issuecomment-233019290) で出来る。
意外とやり方が分からなかった。
RedmineとGitLabのDockerイメージを連携させる（bindfs版）

# はじめに
RedmineとGitLabのDockerイメージを連携させる方法としては、以下の記事のようにRedmine側にベアリポジトリを作ってWebHookでGitLabと同期するのが一般的だと思います。

* [(改訂版) Docker でオフィシャルな GitLab イメージと Redmine イメージのコンテナを連携させる](https://qiita.com/nkenbou/items/e512b4aea9de40da606a)
* [RedmineとGitLab@Dockerの連携設定](https://qiita.com/iwa-na/items/56b44bf8baebe3698dda)

ただ、この方法だとリポジトリ毎に個別に設定が必要で、特に初回のベアリポジトリのクローンはWeb UI上からの操作もできません。
そのためリポジトリ数が多かったり、サーバ管理者とGitLab/Redmineの管理者が分かれている場合に運用が面倒です。
そこで何とかGitLabのリポジトリデータを直接Redmineが参照できないか試してみました。

# 何が問題か

基本的にはGitLabのリポジトリが格納されたディレクトリをRedmineのDockerでボリュームマウントして参照すればいいはずです。
しかしGitLabのリポジトリはOwnerしかアクセスできず、その上GitLabとRedmineではDockerイメージの実行uidが異なるため、そのままでは権限がなく参照できません。

以下の記事では、Redmine/GitLabのDockerfileをそれぞれ改変し、共通のgidでリポジトリデータにアクセスするようにしていますが、筆者の方も書いているとおりDockerイメージを改変することになるのでいまいちです。

[Docker でオフィシャルな GitLab イメージと Redmine イメージのコンテナを連携させる](https://qiita.com/nkenbou/items/41b8c855d9a349a9a016)

というわけで、これと同じようなことをDockerイメージの改変なしにできればいい、ということになります。

# bindfs

そこでbindfsを使います。bindfsは`mount --bind`と同じようにディレクトリを別のディレクトリにマウントするコマンドですが、その際uid/gidやパーミッションを変更することができます。
つまりGitLabの実行uid(998)が所有しているリポジトリデータをRedmineのuid(1000)がOwnerであるかのようにマウントできるということです。
（uidの値は使用するDockerイメージによって違うかもしれません。適当に読み替えて下さい）

実行方法は以下のような感じです。

```console

$ ls -l -d gitlab/data/git-data
drwx------. 4 998 root 73  8月 17  2016 gitlab/data/git-data
$ sudo bindfs -u 1000 gitlab/data/git-data redmine/data/git-data
$ ls -l -d redmine/data/git-data
drwx------. 4 1000 root 73  8月 17  2016 redmine/data/git-data
```

uid=998がOwnerだったgit-dataディレクトリがマウント先のredmine/data/git-dataではuid=1000がOwnerになっています。
bindfsの`-u`オプションは下位ディレクトリ含めて全てのuidを指定された値に書き換えます。そのためgit-data以下のあるリポジトリは全てRedmineからアクセス可能になります。

正しくマウントできることが確認できたら`/etc/fstab`に書いておきます。
Redmine側は読むだけなので`ro`でマウントするのがいいでしょう。

```:/etc/fstab
/path-to-gitlab/data/git-data /path-to-redmine/data/git-data fuse.bindfs ro,force-user=1000 0 0
```

# docker-compose.ymlなど

最後にdocker-composeのボリュームマウント設定などをまとめておきます。
ここでは以下のようなディレクトリ構成を想定します。

```
- gitlab/
  - docker-compose.yml
  - data/
    - git-data/
- redmine/
  - docker-compose.yml
  - data/
    - git-data/ (gitlab/data/git-dataをbindfsでマウント)
```

このときdocker-compose.ymlのボリュームマウント（関係するところだけ抜粋）は以下のようになります。


```gitlab/docker-compose.yml
        volumes:
            - ./data:/var/opt/gitlab
```

```redmine/docker-compose.yml
        volumes:
            - ./data/git-data/repositories:/git:ro
```

これでRedmineのイメージからは`/git`以下にベアリポジトリがあるように見えるので、RedmineのWeb UIから`/git/test.git`などと指定するだけでOKです。
Item 65: Prefer interfaces to reflection

# 65.リフレクションよりインターフェースを選択すべき
## リフレクションはパワフルな機能だが、欠点もある

リフレクションの欠点は以下。
* コンパイル時の型チェックで受ける恩恵を失う
* リフレクティブなアクセスをするコードは洗練されておらず、冗長である
* 通常のメソッド呼び出しに比べて、リフレクションでのメソッド呼び出しは遅い

分析ツールや依存性注入フレームワーク等のリフレクションを利用した洗練されたアプリケーションはあるが、それらでもリフレクションの欠点がみえるにつれ、リフレクションから離れていってる。もし、リフレクションを使うべきか迷ったとしたら、おそらく使わないのが正しい。

## リフレクションを使うケース
リフレクションはとても限られたケースで使う。
コンパイル時には得られないクラスを利用せねばならない多くのプログラムでは、コンパイル時に、そのクラスを入れる型として、適切な型、スーパークラスが存在している（Item64）。
このケースでは、リフレクティブにインスタンスを作成し、インターフェースやスーパークラス経由でそれら生成されたインスタンスにアクセスする。
例として、以下のプログラムでは、第一引数で特定される、```Set<String>```のサブクラスのインスタンスを作り、他のコマンドライン引数をそのSetの中に詰め込んで標準出力する。
HashSetを第一引数にとるとランダムで表示されるが、TreeSetを第一引数にとるとアルファベット順で表示される。

```java
package tryAny.effectiveJava;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.Set;

public class Reflection {
    // Reflective instantiation with interface access
    public static void main(String[] args) {
        // Translate the class name into a Class object
        Class<? extends Set<String>> cl = null;
        try {
            cl = (Class<? extends Set<String>>) // Unchecked cast!
            Class.forName(args[0]);
        } catch (ClassNotFoundException e) {

            fatalError("Class not found.");
        }
        // Get the constructor
        Constructor<? extends Set<String>> cons = null;
        try {
            cons = cl.getDeclaredConstructor();
        } catch (NoSuchMethodException e) {
            fatalError("No parameterless constructor");
        }
        // Instantiate the set
        Set<String> s = null;
        try {
            s = cons.newInstance();
        } catch (IllegalAccessException e) {
            fatalError("Constructor not accessible");
        } catch (InstantiationException e) {
            fatalError("Class not instantiable.");
        } catch (InvocationTargetException e) {
            fatalError("Constructor threw " + e.getCause());
        } catch (ClassCastException e) {
            fatalError("Class doesn't implement Set");
        }
        // Exercise the set
        s.addAll(Arrays.asList(args).subList(1, args.length));
        System.out.println(s);
    }

    private static void fatalError(String msg) {
        System.err.println(msg);
        System.exit(1);
    }

}
```
上記で使われるテクニックは本格的なservice provider framework（？Item1）で使われるくらい強力なものである。
だいたいこのテクニックがリフレクションで必要なすべてである。

上記には2つ欠点がある。
* 6つの実行時エラーが出うる。これらはリフレクションを使わなければコンパイル時に検出できるエラーである。
* 名称からインスタンスを生成するのに25行もかかってしまっている。通常のコンストラクタなら1行ですむのに。

上記のコードではキャスト時にwarningが出ている。
仮に第一引数に取る名称がSetの実装クラスでなくとも、```Class<? extends Set<String>>```へのキャストは成功するので、この警告は正当なものである。
warningの抑制についてはItem27をみるべし。

リフレクションを使う非常にレアなケースとして、パッケージの複数のバージョンを動的に使う場合がある。
一番古いバージョンをコンパイルしておいて、動的に新しいクラスのメソッドを呼び出すなどを行う。（全然ぴんと来ない）
Sparkの出力で空ファイルができてしまう時の対処方法

## 本記事について
Sparkで結果を出力する際、データの入っていない空ファイルが出力されることがあります。本記事ではその空ファイルが出力されないようにする方法について記載します。

## 空ファイルが出力される原因
Sparkはデータを集計する際、１箇所で処理するのではなく、データをいくつかの固まりに分けて、並列分散処理しています。そして、その固まりをパーティションと呼びます。

集計結果を出力する際、各パーティションが集計して、その結果を各パーティションから出力するのですが、集計の結果、出力するデータが無いパーティションが存在することもあります。

出力するデータが無いパーティションは、出力をしないのではなく、レコードの無い空ファイルを出力します。これが空ファイル発生の原因となります。

ですので、全てのパーティションに集計結果が含まれるよう、パーティション数は、集計結果のレコード件数より十分小さい必要があります。

## 対処方法
集計結果のレコード数を調べ、その件数と比較して、パーティション数が多すぎるようでしたらパーティション数を減らして再配分します。

下記にPySparkのサンプルを記載します。（ここではレコード件数がパーティション数の4倍より少ない場合はパーティションの調整を行っています）

``DataFrame.repartition(<N>)``を呼ぶと、指定したパーティション数でDataFrameのデータを再配分してくれます。

```py
num_recodes = df.count()
num_partitions = df.rdd.getNumPartitions()

if num_recodes<=4 :
    num_partitions = 1
elif (num_partitions*4)>num_recodes :
    num_partitions = int(num_recodes/4.0)

if num_partitions != df.rdd.getNumPartitions() :
    df = df.repartition( num_partitions )
```
基礎Ruby on Rails #02 Chapter1 アプリケーションの新規作成

前 [基礎Ruby on Rails #01 Chapter1 Rails開発環境の構築(WSL)](https://qiita.com/tseno/items/4ac39c8b71f87f714282)
次 [基礎Ruby on Rails #03 Chapter1 ディレクトリ構造・コントローラ・アクション・ビューの作成](https://qiita.com/tseno/items/6ce3c3b3a4724ac6215e)

# アプリケーションの新規作成

### rails newコマンド

```sh
$ cd ~/rails
$ rails new asagao -BCMT --skip-coffee -d sqlite3
```

- rails new コマンドのオプション
    - -B  bundleコマンドを実行しない。
    - -C  Action Cableのファイル群を生成しない。
    - -M  Action Mailerのファイル群を生成しない。
    - -T  テスト関連のファイル群を生成しない。
    - --skip-coffee  CoffeeScriptを使用しない。
    - -d  データベースの種類を指定する。

### Gemfileの修正（本に載っていない）

railsサーバーを起動すると以下のように怒られるので、Gemfileを編集する。

```
There was an error while trying to load the gem 'uglifier'. (Bundler::GemRequireError)
Gem Load Error is: Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes.
```
Gemfileの以下のコメントアウトを外して、mini_racerを使えるようにする。（node.jsをインストールしてもOKらしい）

```ruby:Gemfile
gem 'mini_racer', platforms: :ruby
```


### bundle lockコマンドの実行（macOS, WSL/Ubuntu）

```sh
$ cd asagao
$ bundle lock --add-platform x64-mingw32 x86-mingw32
（省略）
Writing lockfile to /mnt/c/Users/tseno/Desktop/rails/asagao/Gemfile.lock
```

- Gemfile末尾の以下の環境で動かすために、上記のbundle lockコマンドを実行する。MinGW環境で動かさないのであればGemfileから削ってもよい。

```:Gemfile
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
```

### bundle installコマンドの実行

必要なGemパッケージをインストールする。

```sh
$ bundle install
```

### アプリケーションの起動

```sh
$ bin/rails s
```

http://localhost:3000/ を開く。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88686/9d78566b-e355-f2a1-19c9-3c583f13f2d7.png)

参考
[改訂4版 基礎 Ruby on Rails (IMPRESS KISO SERIES)](https://www.amazon.co.jp/%E6%94%B9%E8%A8%824%E7%89%88-Ruby-Rails-IMPRESS-KISO/dp/429500460X/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=1536666358&sr=1-1)
GitHubに自分のPCをssh接続するための方法

作業履歴を見ていてくれるナイスガイ、Gitさんを使えるようにする為の難しかった所です。

- なぜこの手順が必要か
-
webサービスであるGitHubが、今作業しているPC端末を特定して、接続する為に必要です。
Gitさんがおもにsshを使用してやりとりしている為、sshの公開鍵をGitHub側に登録します。


- 必要な手順
-
１、sshの秘密鍵、公開鍵を作成する
２、公開鍵をGitHubに登録する

※以下、mac環境のみの解説となります。ご了承ください。


- すでに公開鍵があるか確認する


```ruby:qiita.rb
$ ls ~/.ssh
```
上記のコマンドで、下のような二つのファイルがすでにある場合には、秘密鍵・公開鍵は作成済みです。


```ruby:qiita.rb
id_rsa           id_rsa.pub
```

- 秘密鍵と公開鍵を生成する
-
上のコマンドで確認できなかった場合、新しくsshの秘密鍵・公開鍵を作成する必要があります。

```ruby:qiita.rb
$ ssh-keygen -t rsa -C "morikuma@email.com"
```
大文字、小文字にご注意ください。また、メールアドレスはご自身の確認できるものに変更してください。

実行すると３回、それぞれ以下の内容を入力するよう求められて処理が止まりますが、
設定が必須ではないので、Enterキーの３連打で突破することができます。
- 生成した鍵を保存するフォルダ
- パスフレーズ
- パスフレーズ（確認用）

- 公開鍵をGitHubに登録する

１、公開鍵の内容をコピーします

```ruby:qiita.rb
$ pbcopy < ~/.ssh/id_rsa.pub
```

※このコマンドで、クリップボードに公開鍵の文字列がコピーできています

２、GitHubに登録する
<img width="1034" alt="スクリーンショット 2018-09-13 21.41.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/148137/f1699e3e-099c-1a7e-413c-fcbe743fe8f0.png">
(1)右上、プロフィールアイコンのオプションから、「settings」を選択し、
(2)上の図左側の一覧から「SSH and GPG keys」を選択します
(3)右上緑色の「New SSH key」ボタンを押すと、上の画面になります
(4)タイトルは、使用するPC端末がわかりやすい名前にするといい感じです（例：プライベートPC、訪問先の企業名やプロジェクト名など）
(5)Keyの欄に１、でコピーした公開鍵を貼り付けます
(6)「Add SSH key」ボタンをクリック


- SSHの接続をチェック

登録作業は以上ですが、試しに接続をチェックして見ましょう

```ruby:qiita.rb
$ ssh -T git@github.com
```
このコマンドで、次のように表示されたら、「yes」と入力してEnterを押します


```ruby:qiita.rb
The authenticity of host 'github.com (207.97.227.239)' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)?
```
接続がうまくできていれば、下のメッセージが返ってくるはずです


```ruby:qiita.rb
Hi username! You've successfully authenticated, but GitHub does not
provide shell access.
```


これで、ナイスガイなGitさんがすぐそばにいる素敵なプログラミングライフがはじめられます！
cloneも、pullもpushも自由自在！！

今日はこのあたりで失礼します。
制限環境下でWindowsを快適に使う

# 制限環境下でWindowsを快適に使う

　自分のPCなら自由にアプリをインストールしたり設定を変えられるが、仕事で使うPCだとなかなかそうはいかないもの。
「あのアプリあったら一発なのに……！」しかしそのアプリを入れられないときにどうするかをまとめてみた。
※少しずつ内容を増やします。


## 前提

　こんな環境下を想定してます。

- 管理者によってWindowsの変更は一切できない
- アプリのインストール不可
- 使える道具は以下
    - Excel
    - Word
    - PowerPoint
    - CMD
    - VBS
    - PowerShell
- 前提条件に書いていないアプリは基本使えない


## 環境の確認

### レジストリの内容を見たい

　Get-ChildItemを使うことで、レジストリの値を見ることができる場合があります。（この方法で表示できないキーもある）
　不具合発生時に、レジストリの値を変更できずとも値を確認することである程度の調査が可能なケースがあるので、たまに使います。

```PowerShell:Get-ChildItemの例
　PS C:\> Get-ChildItem -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate'

    Hive: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate


Name                           Property
----                           --------
Auto Update                    AcceleratedInstallRequired                  : 1
                               ActionCenterLastPossibleRestartNotification : 2014-07-29 18:00:00
                               ActionCenterNotificationCount               : 4
                               AUOptions                                   : 3
                               ElevateNonAdmins                            : 1
                               ForcedReboot                                : 2
                               IncludeRecommendedUpdates                   : 1
                               IsOOBEInProgress                            : 1
                               NextSqmReportTime                           : 2016-07-17 16:44:16
(以下略)
```


## ファイル操作

### もらった分割ファイルの結合

　hoge.zip.001, hoge.zip.002, ... などといったファイルを結合させる場合、コマンドプロンプトから次のコマンドで結合が可能です。

```CMD:COPYコマンド
> copy /B hoge.zip.001+hoge.zip.002 hoge.zip
```
tmux でマウスドラッグ終了時の挙動を「自動コピーして copy-mode 終了」ではなく「テキスト選択して copy-mode 続行」に変える

# 免責
古め (2.1 以前？) の tmux の挙動は確認していません。
今回確認したのは tmux 2.7 での挙動です。

# 内容

言葉では非常に説明しにくいのですが、 tmux の設定で `set-option -g mouse on` すると、マウスドラッグ終了時の挙動は次のようになります：

「ドラッグ範囲をバッファにコピーし、copy-mode を終了」

tmux では、 スクロールも copy-mode でおこなわれる (と私は理解しています) ため、(マウスで) 範囲選択するとその時点でスクロールがキャンセルされてしまいます。(選択範囲はちゃんとコピーされている)

しかし、個人的には次のような挙動だとありがたいです：

「ドラッグしたら範囲選択のみ。copy-mode は終了しない (=スクロールが巻き戻らない)。選択範囲をバッファにコピーしたいときは、明示的に何らかのキー入力をする」

つまり、tmux 以外の環境での普通のコピーと同じ挙動であってほしいということです。
 (例えばブラウザでは、「範囲選択をしたら勝手にテキストがコピーされてスクロールが巻き戻る」ようなことはせず、「範囲選択は範囲選択。コピーしたいなら `ctrl-C` やら `cmd-C` やらで明示的にコマンド入力。コピー後に選択範囲をキャンセルしたり、スクロールが巻き戻ったりしない」ですよね・・・) 

この挙動にするには、次のような設定を入れれば OK です：

```
# Explicit `Enter` key fires copying the selection
unbind -T copy-mode MouseDragEnd1Pane
bind-key -T copy-mode Enter send-keys -X copy-pipe "tmux copy-buffer"
```

`Enter` の部分は好きなキーに変えてください。tmux のよく使われる [^1] コピーのキーバインドと合わせるなら、 `y` も自然かと思います。
(2行目は tmux.conf の設定例で `bind-key -T copy-mode v send-keys -X begin-selection` と一緒によく見るので、すでに設定済みの人も多いと思います)


[^1]: よく使われるというか、デフォルトのキーバインドなんだろうか？
DjangoGirlsで生じたエラーまとめ

#DjangoGirlsを進めていくなかで生じたエラー
djangoGirlsのチュートリアルを[Django Girls Tutorial](https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/content/)を元に進めていく中で、仕様の変化などで生じたエラーをまとめてみた。自分のメモ用

###環境
python:3.6.5
Django:2.1.1

###参考元
[Djangoのincludeの仕様が変っていてハマったのでメモ](https://mocabrown.com/blog/archives/5346)
[Django2.0から必須になったon_deleteの使い方](https://www.djangobrothers.com/blogs/on_delete/)
[DjangoアプリをHerokuにデプロイする時のエラー対処 whitenoise編](https://qiita.com/ymhr1121/items/344c4eb300ab9972d0c2)

##エラー1:on_delete
[Django Girls Tutorial](https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/content/)のDjango modelsの項で、モデルの変更を伝えるために以下を実行すると、

```
(myvenv) ~/djangogirls$ python manage.py makemigrations blog
```

```
TypeError: __init__() missing 1 required positional argument: 'on_delete'
```
とエラーが、、、　調べてみるとDjangoはバージョン２以降から、blog/models.pyの`ForeignKey`の引数に`on_delete`を渡さないといけないらしい。

###解決策
訂正前

```blog/models.py
 class Post(models.Model):
    author = models.ForeignKey('auth.User')
```
訂正後

```blog/models.py
 class Post(models.Model):
    author = models.ForeignKey('auth.User',on_delete=models.CASCADE)
```
因数のところに**on_delete=models.CASCADE**と渡せばＯＫ！

##エラー2：whitenoiseの仕様変化に伴うエラー
デプロイの項の終盤で、

```
command line
(myvenv) ~/djangogirls$ python manage.py runserver
```
と入力すると

```
command line
ImportError: 
Your WhiteNoise configuration is incompatible with WhiteNoise v4.0
This can be fixed by following the upgrade instructions at:
http://whitenoise.evans.io/en/stable/changelog.html#v4-0
```
とかいうエラーが発生。色々調べたところ、[Django Girls Tutorial](https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/content/)を進めていると、

```blog/wsgi.py
from whitenoise.django import DjangoWhiteNoise
application = DjangoWhiteNoise(application)
```
と記述するシーンありますが、Whitenoiseがアップデートされて、エラーを引き起こすとのこと。

###解決策
```blog/wsgi.py
from whitenoise.django import DjangoWhiteNoise
application = DjangoWhiteNoise(application)
```
上のコードをまず消去。そして、'mysite/setting.py'をいじります。
setting.pyのMIDDLEWAREの部分を

```mysite/setting.py
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
```

に変更。２行目に`'whitenoise.middleware.WhiteNoiseMiddleware',`を追加している。
ECMWFのデータをpythonスクリプトでダウンロードする準備

ECMWFのサーバーからデータをダウンロードするのには、ブラウザ上に立派なUIが用意されていてぽちぽちでダウンロード出来るのだけど、やっぱりぽちぽちは面倒なので、スクリプトでダウンロードする準備。
ECMWFのアカウントを持っていて、macportsをインストールしてあることだけが条件。

##参考URL
Accessing ECMWF data servers in batch - ECMWF Web API - ECMWF Confluence Wiki https://confluence.ecmwf.int/display/WEBAPI/Accessing+ECMWF+data+servers+in+batch


##手順
###1.macportsでpipをインストールする。
pipのバージョンはどれでもいいと思うのだけど…とりあえずpy37のをインストールした。

```:terminal
$ sudo port install py37-pip
--->  Computing dependencies for py37-pip
The following dependencies will be installed:  pip_select
Continue? [Y/n]: Y
--->  Fetching archive for pip_select
--->  Attempting to fetch pip_select-0.1_0.darwin_17.noarch.tbz2 from https://packages.macports.org/pip_select
--->  Attempting to fetch pip_select-0.1_0.darwin_17.noarch.tbz2.rmd160 from https://packages.macports.org/pip_select
--->  Installing pip_select @0.1_0
--->  Activating pip_select @0.1_0
--->  Cleaning pip_select
--->  Fetching archive for py37-pip
--->  Attempting to fetch py37-pip-18.0_0.darwin_17.noarch.tbz2 from https://packages.macports.org/py37-pip
--->  Attempting to fetch py37-pip-18.0_0.darwin_17.noarch.tbz2.rmd160 from https://packages.macports.org/py37-pip
--->  Installing py37-pip @18.0_0
--->  Activating py37-pip @18.0_0
--->  Cleaning py37-pip
--->  Updating database of binaries
--->  Updating database of C++ stdlib usage
--->  Scanning binaries for linking errors
--->  No broken files found.                             
--->  No broken ports found.
--->  Some of the ports you installed have notes:
  py37-pip has the following notes:
    To make the Python 3.7 version of pip the one that is run when you execute the commands without a version suffix, e.g. 'pip', run:
    
    port select --set pip pip37
```
とこんなコメントが出てくる。（pip37の場合）

###2.コメント通りpip37をActiveにする。

```:terminal
$ sudo port select --set pip pip37
Selecting 'pip37' for 'pip' succeeded. 'pip37' is now active.
```

###3.インストールしたpipでecmwfのapiLibraryをインストールする。

```:terminal
$ sudo pip install https://software.ecmwf.int/wiki/download/attachments/56664858/ecmwf-api-client-python.tgz
（中略）
Collecting https://software.ecmwf.int/wiki/download/attachments/56664858/ecmwf-api-client-python.tgz
  Downloading https://software.ecmwf.int/wiki/download/attachments/56664858/ecmwf-api-client-python.tgz
Installing collected packages: ecmwf-api-client
  Running setup.py install for ecmwf-api-client ... done
Successfully installed ecmwf-api-client-1.5.0
```

###4.ECMWF KEYを確認して、.ecmwfapircに書き込む
ECMWFのページにログインして下記のページに行くと、アカウントにヒモ付けられているKEYを確認できる。
ECMWF | Your API key https://api.ecmwf.int/v1/key/
下記を参考に、.ecmwfapircに書き込む。

```:$HOME/.ecmwfapirc
{
    "url"   : "https://api.ecmwf.int/v1",
    "key"   : "XXXXXXXXXXXXXXXXXXXXXX",
    "email" : "john.smith@example.com"
}
```

これで準備OK。
mkdirした後にcdしてください、自動で。

mkdirしたら当然cdしたいじゃないですか。

## だからコマンドにします

```
$ vi ~/.bashrc
# 追記
alias mkdircd='echo -n "Input directory name that you want to create: ";read DIRNAME;echo -n "You will create ${DIRNAME}. OK? [y/n] ";read YESNO;if [ ${YESNO} == "y" ]; then  mkdir -p ${DIRNAME}; cd ${DIRNAME};fi'
```
## 適用します

```
$ source ~/.bashrc
```
## 完成したコマンドがコチラです

```
$ pwd
/home/vagrant
$ mkdircd
Input directory name that you want to create: test_dir/test
You will create test_dir/test. OK? [y/n] y
$ pwd
/home/vagrant/test_dir/test
```
VBAでExcelデータ間引きwithイミディエイトウィンドウ


##追記
[えくせるちゅんちゅんーVBAのデバッグにおける真のイミディエイトウィンドウの使い方](https://www.excel-chunchun.com/entry/2019/02/10/190143)
直接Deleteするのではなく、一度選択してからまとめてDeleteすること

##コード① ～行を一つ飛びで削除～
・エクセルシートが表示されている状態で [Alt] + [F11]→ [Ctrl] + [g]でイミディエイトウィンドウに移る
・以下のコードを打ち、[Enter]で実行

```VB
For i = 100 to 2 step -2: Rows(i).delete: Next i
```
###ポイント
・イミディエイトウィンドウは複数行の命令を書いて実行はできないので「 : 」で繋げて一行で書く
・2 to 100じゃなく下の行から削除していく

###注意
・他の VBAマクロと同様に消したあとに[Ctrl]+[z]で元に戻すことは出来ない。
・Rowsは Worksheetオブジェクトのプロパティ
・ワークシートオブジェクトを指定しない場合 Acitivesheet.Rowsを省略したものとして実行される。
・なので ActiveSheetの間違いに注意


###メリット
・慣れると他の方法より楽。多分



##コード② ～1000行→100行に間引き～

IF文が使えないので Select Caseで評価する

```vb
For i = 1000 to 1 step -1: Select Case (i mod 10) <> 0: Case True:Rows(i).delete: End Select: Next i
```

###見やすく書き直し

```vb
Private Sub Test2
  For i = 1000 to 1 step -1
    Select Case (i mod 10) <> 0
      Case True
        Rows(i).delete
    End Select
  Next i
End Sub
```

###メリット？
・個人的にはイケルと思うがどうだろう
・せめて IF Statementが使えれば。

###参考
【teratail】 Excel VBA イミディエイトウィンドウで「分岐のあるループ処理」を実行したい
 [https://teratail.com/questions/110791](https://teratail.com/questions/110791)




##コード③おまけ ～FizzBuzz～

```vb
For i = 1 to 100: Select Case ((i mod 3) = 0) * 2 + ((i mod 5) = 0): Case -3: ?"Fizz Buzz": Case -2: ?"Fizz": Case -1: ?"Buzz": Case 0 : ?i: End Select: next i
```

・イミディエイトウィンドウ上では「? プラス　値」 or 「?　プラス　変数」で値を出力してくれる。


###書き下し

```vb
Private Sub Test3No1
  For i = 1 to 100
    Select Case ((i mod 3) = 0) * 2 + ((i mod 5) = 0)
      Case -3
        Debug.Print "FizzBuzz"
      Case -2
        Debug.Print "Fizz"
      Case -1
        Debug.Print "Buzz"
      Case 0
        Debug.Print i
    End Select
  Next i
End Sub
```

・複雑な制御構造はスラスラと書けないかなーと思ったけれどなんとかなった。

####真理値表
・Trueは -1なので、True × 2 = -2
・Falseは 0

| A    | B    | 2A+B |
|:----:|:----:|:-----|
| True | True | -3   |
| True | False| -2   |
| False| True | -1   |
| False| False| 0    |



###結論
If文が使えないとちょっと厳しいかな
ディスプレイの色について

##色について
人間の網膜は380nm~780nmの範囲の光を感じ取ることができる。
光の核となる構成要素は「赤」「青」「緑」である。
光には異なる3つの属性がある。

1. 色相・・・赤、青、緑といった色味
2. 明度・・・明るい、暗いといった明るさ
3. 彩度・・・色味の強い、弱いといった鮮やかさ。　

*彩度が高いとは、何の色かはっきりとわかりやすいということ。純色に対して、黒白グレーを足すことで様々な色を出すことができる。
 

###加法混色と、減法混色
* 加法混色は、ディスプレイなどで使われている。光を発っしてその色を重ねることで様々な色を表現するもの。赤、青、緑（RGB）3色が重なるほど白に近くなる。
* 減法混色とは、印刷物などで使われる。シアン、マゼンタ、イエロー（CMY）を混色し、混ぜるほど黒に近くなる。


###ディスプレイ上での色表現
**RGB**
PCはRGBの組み合わせで色を合成している。

**ガンマ値**
ディスプレイ上で輝度を表す。デュスプレイの色は0~255の数値で表している。全ての和が0であれば輝度０。255であれば輝度100%。

**色温度**
ディスプレイ上の画像と印刷した画像では色味に違いを感じることがある。その原因に色温度がある。
色温度が低いほどディスプレイ上で黄みや赤みが強い白に見えるようになる。

**カラーマネジメントシステム**
RGBやCMYKなど色空間が違うデバイス間では同一の色は表現できない。CMSでは色々なデバイスに対してICCプロファイルに記録されたデータを元に色空間を変換し
デバイス間に違いがあっても同様のカラー表現を行う仕組みである。


**webセーフカラー**
webサイトの色はユーザ側のパソコンの環境によって正しく再現できない場合がある。そのためNetScapeCommunicationsが最低限必要と言われる216色のカラーを選定した。
相関係数のイメージを解説したい

#はじめに
統計学を勉強していると必ず出てくる相関関数のイメージについてまとめてみました．

#相関係数とは何ぞや

2種類のデータが与えられたとき，これらの間にはどのような関係があるのかを知りたいことがあります．例えば，
    - 親の身長と子の身長
    - 飲酒年数とがんの発生率
などがありますね．

このような2つのデータ(変量)を$x$と$y$とするとき，**相関係数（correlation coefficient）$r$**を次のように定義します．



$$
\begin{equation}
r=\frac{1}{NS_xS_y}(x_1-\overline{x})(y_1-\overline{y})+(x_2-\overline{x})(y_2-\overline{y})+\cdots+(x_2-\overline{x})(y_2-\overline{y})
\end{equation}
$$

但し，$\overline{x}$と$\overline{y}$は$x,y$の平均，$S_xとS_y$は$xとy$の標準偏差です．

相関係数$r$は常に

```math
-1 \leq  r \leq 1
```

を満たし，下図のような関係となります．

<img width="875" alt="統計解析の基礎.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/290566/e587cd17-e26e-6fd7-d135-b55eb0bbd4db.jpeg";style="text-align:center;">

#共分散とは何ぞや

共分散は2変量のばらつきを表すものです．

$N$組のデータ$(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)$が与えらえれているとき，**共分散（covariance）**$S_{xy}$を次のように定義します．

```math
S_{xy}=\frac{1}{N}\Bigl\{
(x_1-\overline{x})(y_1-\overline{y})+(x_2-\overline{x})(y_2-\overline{y})+\cdots+(x_2-\overline{x})(y_2-\overline{y})\Bigr\}
```

もうお気づきかもしれませんが，相関係数に似ていますよね．この共分散$S_{xy}$を用いると，相関係数の式は次のように書き換えられます．

```math
相関係数r=\frac{S_{xy}}{S_x \cdot S_y}=\frac{xとyの共分散 \ \  \ \  }{\sqrt{xの分散 \ \  \ \  }\sqrt{yの分散 \ \  \ \  }}\ \ 
```

#ベクトルを用いた説明

**"なぜrという数値が2つの変量$x,y$の関係を示している"**のでしょうか．統計解析を広い意味で捉えると**空間構造を調べている**と言え，ここではベクトルを用いて説明してみたいと思います．

2つのベクトル

```math
\begin{equation}
\boldsymbol{x}=(x_1, x_2,\cdots, x_N),\ \ \ \boldsymbol{y}=(y_1, y_2,\cdots, y_N)
\end{equation}
```

があり，その内積$\boldsymbol{x}\cdot\boldsymbol{y}$は

```math
\begin{align}
\boldsymbol{x}\cdot\boldsymbol{y}&=x_1y_1+x_2y_2+\cdots+x_Ny_N \\
&=||\boldsymbol{x}||\cdot||\boldsymbol{y}||\cos\theta
\end{align}
```

で定義されています．但し，

```math
\begin{align}
||\boldsymbol{x}||=\sqrt{x_1^2+x_2^2+\cdots+x_N^2}  \\
||\boldsymbol{y}||=\sqrt{y_1^2+y_2^2+\cdots+y_N^2}
\end{align}
```

これを変形していくと，

```math
\begin{align}
\cos\theta&=\frac{\boldsymbol{x}\cdot\boldsymbol{y}}{||\boldsymbol{x}||\cdot||\boldsymbol{y}||} \\
&=\frac{x_1y_1+x_2y_2+\cdots+x_Ny_N}{\sqrt{x_1^2+x_2^2+\cdots+x_N^2}\sqrt{y_1^2+y_2^2+\cdots+y_N^2}} \\
&=\frac{(x_1y_1+x_2y_2+\cdots+x_Ny_N)/N}
{\sqrt{(x_1^2+x_2^2+\cdots+x_N^2)/N}
{\sqrt{(y_1^2+y_2^2+\cdots+y_N^2)}/N}} \\ 
&=\cfrac{xとyの共分散}{\sqrt{xの分散 \ \  \ \  }\sqrt{yの分散 \ \  \ \  }} \\
\end{align}
```



つまり，

```math
相関係数=\cos\theta
```
です．この$\theta$とは2つのベクトル$\boldsymbol{x}と\boldsymbol{y}$のなす角

<img width=300 src="https://qiita-image-store.s3.amazonaws.com/0/290566/8c894caf-0eda-b1ba-4fda-b2ebd31b2c88.jpeg">

のことです．

したがって，

2つの変量$\boldsymbol{x}と\boldsymbol{y}$の関係　$\leftrightarrow$　2つのベクトル$\boldsymbol{x}と\boldsymbol{y}$のなす角
　　　　　　　　　　　$\leftrightarrow$　2変量$xとy$の相関関数

となり，次の様になります．

<img width=600 src="https://qiita-image-store.s3.amazonaws.com/0/290566/31672006-ac43-89b6-e69a-68ef731b56ef.jpeg">

例えば，$r \simeq -1$の場合，上の図で示していたように**強い負の相関がある**としました．これをベクトルで考えると，2つのベクトル$\boldsymbol{x}$と$\boldsymbol{y}$の向きが**$180^{\circ}$異なっている**ことを意味しています．

同じように，$r \simeq 1$の場合，**強い正の相関がある**と説明しました．これをベクトルで例えると，2つのベクトル$\boldsymbol{x}$と$\boldsymbol{y}$が**同じ向きである**ということです．

#参考

岩村貞夫，"統計解析のはなし"，東京図書，1989年
Pidginの覚書

その内ちゃんとPidginの使い方を纏めたいなあと思いつつ、差し当たって覚書として記しておく。

筆者の環境は次の通り。

+ Pidgin 2.13.0
+ Windows 10 64bit

# プラグイン
## Pidgin PBar
公式ページ　https://www.hauweele.net/~gawen/pidgin-pbar.html

[Mystatusbox](#mystatusbox)と併存させるには、両プラグインがMystatusbox→Pidgin PBarの順で読み込まれる必要が有ると見受けられる。そこで、`%AppData%\.purple\prefs.xml`を次のように書き換える。

```xml:変更前
<pref version='1' name='/'>
	…
	<pref name='pidgin'>
		<pref name='plugins'>
			<pref name='loaded' type='pathlist'>
				…
				<item value='C:\Program Files (x86)\Pidgin\plugins\mystatusbox.dll'/>
				…
				<item value='C:\Program Files (x86)\Pidgin\plugins\pbar.dll'/>
				…
			</pref>
		</pref>
		…
	</pref>
	…
</pref>
```
```xml:変更後
<pref version='1' name='/'>
	…
	<pref name='pidgin'>
		<pref name='plugins'>
			<pref name='loaded' type='pathlist'>
				…
				<item value='C:\Program Files (x86)\Pidgin\plugins\pbar.dll'/>
				…
				<item value='C:\Program Files (x86)\Pidgin\plugins\mystatusbox.dll'/>
				…
			</pref>
		</pref>
		…
	</pref>
	…
</pref>
```

## Mystatusbox
公式ページ　https://bitbucket.org/rekkanoryo/purple-plugin-pack/wiki/Mystatusbox

[Purple Plugin Pack](https://bitbucket.org/rekkanoryo/purple-plugin-pack/ "rekkanoryo / purple-plugin-pack — Bitbucket")に内包されている。

[Pidgin PBar](#pidgin-pbar)と併存させる場合、その方法は同節を参照されたい。
UiPathでJSON文字列をDictionaryで生成する


## UiPathでのJSON文字列操作

UiPath OrchestratorのAPIを叩く際には、RESTでログイン処理をする必要がありますが、Bodyのパラメタには [UiPath Orchestrator API Guide](https://orchestrator.uipath.com/v2018.2/reference#authenticating) にあるように、

```c#
{
    "tenancyName" : "Documentation",
    "usernameOrEmailAddress" : "Documentation",
    "password" : "DocumentationAPItest"
}
```

というJSON文字列を渡してあげる必要があります。さあ UiPath Studioでこの文字を構築するとこんな感じに、、。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/ea05f83d-15f7-610b-58fa-6e3c47ca763d.png)

AB Assignの中身はこう
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/2edb67ba-3323-a126-6ffa-865413351e36.png)
いやいや長過ぎ、ダブルクォート多すぎでしょうorz

みえないですよね。こうです

```
"{""UsernameOrEmailAddress"":""" + usernameOrEmailAddress   + """,""tenancyName"":"""+tenancyName+""",""Password"":"""+  password +"""}"
```

ってことで、こんな時はDictionaryで処理してみましょうというはなしです。

## Dictionaryでやってみる
先のJSON文字列を構築するために、Dictionary な変数を作成し、それをJSON化してみます。

Build dictionary アクティビティを用いて、Valuesに対して、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/909385ce-e5f6-5b68-b7aa-411c4990944e.png)

JSONのプロパティ名になる文字列をKeyに、値になるデータをValueにセットします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/da6814b1-0dcf-f4dc-1e8a-258f719e28bc.png)

そのDictionaryな変数jsonDicを、AB Assignで文字列に変換して代入します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/c8973a0f-8d9e-7d3a-1332-4133ae745fa3.png)

変換するメソッドは

```c#
Newtonsoft.Json.JsonConvert.SerializeObject(jsonDic)
```

というのがありますのでコレを使いましょう。

実行してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/e50869ab-b6aa-e255-820e-9beeb6621a11.png)

OKそうですね。

お疲れ様でした。

## 関連リンク
- [UiPath Orchestrator API Guide](https://orchestrator.uipath.com/v2018.2/reference#authenticating)
- [C#でJSONを扱うライブラリ「Json.NET」を使ってみました](https://qiita.com/ta-yamaoka/items/a7ff1d9651310ade4e76)
【Carbon】createFromDate関数の引数補完がいい感じ

PHPerにはおなじみ（？）の日付ライブラリ、Carbon。
最近これを使う機会ができて、[ドキュメント（英語）](https://carbon.nesbot.com/docs/)を見ながら「うおーっ」ってなっております。

何かと多機能ではありますが、使いどころの多そうな`createFromDate`関数の引数補完がめっちゃ賢いなと思ったのでシェアします。

## createFromDate()の補完機能

### 実は引数なしでも使える

通常こんな感じですが

```php

Carbon::createFromDate(2018, 9, 13);  // "2018-09-13 18:58:43"
```

実は引数なしだと、**実行した日時の情報**で補完してくれます。

```php

Carbon::createFromDate();  // "2018-09-13 18:58:43"
```

### 一部だけ引数がある場合

```php

Carbon::createFromDate(null, 12, null); // "2018-12-13 18:58:43"
```

引数を当てた部分だけ切り替わります。

### 実在しない日付の場合


```php

Carbon::createFromDate(null, null, 31); // "2018-10-01 18:58:43"
```

そのまま出力されれば**2018-09-31**となりそうなところ。
９月３１日は存在しないので、次月にうまく切り上げてくれます。かしこい。

## 使いどころ

引き継いだ案件で、こんな実装がされていましたが

```php
// ①：　nullの変数にデフォルト値を突っ込む処理
if(is_null($year))  { $year  = date("Y"); }
if(is_null($month)) { $month = date("n"); }
if(is_null($day))   { $day   = date("j"); }

// ②：　①を引数に取る
Carbon::createFromDate($year, $month, $day);
```

①はすでに組み込まれているということですね。
すっきり実装できてよろしい。

## now()やtoday()との違いは？

今後の参考にと思って、一応確かめました。

```php

$date  = Carbon::createFromDate();  // "2018-10-01 18:58:43"
$now   = Carbon::now();             // "2018-10-01 18:58:43"
$today = Carbon::today();           // "2018-10-01 00:00:00"
```

引数なしの`createFromDate()`は、`now()`と同等と見て良さそうです。
`today()`は時刻がリセットさせていますね。

ちなみに、

```php

$date === $now //false

// stringにキャストしてみる
(string)$date === (string)$now  //true
```
全く一緒ではないみたい。なんだろ？

## さいごに

`checkdate`みたいなチェック系の関数がもっと充実してたら良いのに。
Apache JMeterをDockerコンテナで試す（Mac編）

# Apache JMeterの環境構築
MacでApache JMeter4.0の環境を構築します。
ブラウザからダウンロードも可能ですが、Homebrewでインストールします。

JMeterのインストール

```shell
$ brew install jmeter
```

以上でApache JMeterのインストールは終わりです。


# JMeterのアクセス先コンテナを作成

今回はMac上にDockerコンテナを立ち上げて、そこへリクエストを送ります。
Dockerコンテナを作成するためにdocker-compose.ymlとDockerfileを以下のように作成します。

docker-compose.yml

```yml
version: '2'
services:
    app:
        build:
            context: .
        container_name: jmeter-test
        tty: true
        ports:
            - "8080:80"
```

Dockerfile

```
ROM amazonlinux:2016.09
 
RUN yum -y install httpd
RUN touch /var/www/html/index.html
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
```

作成したら以下のコマンドでビルドします

```shell
$ docker-compose build
```
コンテナを立ち上げます

```shell
$ docker-compose up
```

これでApacheが起動されたDockerコンテナが立ち上がりました。
http://localhost:8080
で真っ白なページにアクセスできると思います。
そこに対してApache JMeterからリクエストを送ろうと思います。

# Apache JMeterによるリクエスト
### Apache JMeterの起動
以下のコマンドで起動できます

```shell
$ jmeter
```

### Apache JMeterの設定
起動したら以下の手順で設定を行います。

1. 「Test Plan」を右クリックしADD>Thread Group （どんくらいリクエスト送るかThread数とLoop数を記述）
2. 「Thread Group」を右クリックしADD>Http Request（Request先を記述）
3. 「Thread Group」を右クリックしADD>View Results in Table（結果を見る表）
4. HTTP Requestに以下のように値を設定
![スクリーンショット 2018-09-12 17.34.03.png](https://qiita-image-store.s3.amazonaws.com/0/218021/5698ae7a-2c1f-33ce-c7b6-292428c9a4c2.png)


## 実行
画面上のstartボタンを押すことで実行されます。
![スクリーンショット 2018-09-12 17.34.15.png](https://qiita-image-store.s3.amazonaws.com/0/218021/f65de9cf-3b16-9db9-9e3f-243f6f68e057.png)
LAN基礎2

##LAN基礎2

##ネットワーク機器  

###ハブ
コンピュータから接続されているLANケーブルを束ねる集線装置で、接続口である複数のLANポートを備えています。  

 - リピータ/シェアードハブ(Layer1)  
ケーブル上で減衰した電気信号を再生して中継することで、LANケーブルを延長します。
受信データは全てのコンピュータに転送します。
その為、衝突（コリジョン）が発生する可能性が高い。
現在スイッチングハブが主流となっている為、ほとんど流通していない。
 - ブリッジ/スイッチングハブ(Layer2)  
受信データのMACアドレスを解析して宛先のコンピュータに転送します。
Layer1と違いMACアドレスを記憶しているので、無駄な転送をしない。つまり衝突が発生しない。

 **リピータやブリッジは、今では単独の危機としては使われていない為、機能としての名称になっています。**

###ルータ(Layer3)  
ネットワークの中継・転送機器の一つで、異なるネットワーク同士を接続し、制御する装置。

 - 機能面
   + ルーティングテーブル  
ルータが端末に保持するパケットの配送先に関する経路情報
   + ルーティングプロトコル  
ルーディングテーブルを他のルータと交換するためのプロトコル。
     + スタティックルーティング  
管理者が予め設定した固定的なルーティングテーブルに基づいて経路選択をする。
     + ダイナミックルーティング  
動的に生成・更新し続けるルーティングテーブルに基づいて経路選択をする。  

 - 分類
   + ハイエンドルータ（数百万～数億円）  
通信事業者、データセンター、大企業コアルータ
   + ミドルレンジルータ（100～300万円）  
企業のコアルータ、通信事業者のエッジルータ  
   + ローエンドルータ（数万～100万円）  
中小企業のセンタルータ、支店用ルータ
   +ブロードバンドルータ（～数万円）  
小規模拠点用、家庭用

---

参照資料・引用元
WEB
[IT用語辞典 e-Words](http://e-words.jp/)
書籍
[平成30年度 栢木先生のITパスポート教室]
React Js with GraphQL using Apollo GraphQL

Apollo Client is a fully-featured caching GraphQL client with integrations for React, Angular, and more. It allows you to easily build UI components that fetch data via GraphQL. ... Universally compatible, so that Apollo works with any build setup, any GraphQL server, and any GraphQL schema.

In [previous article](https://qiita.com/monyoudom/items/579d44952029d902e1f5) I had created sample backend graphQL. Now I would like to build the frontend side which using React js.

#Set up the React js project

We will set up the project, create the following:

- A Reactjs project called cookbook_display
- An app within cookbook_display called ingredients


```terminal
# Create the project directory
mkdir cookbooks
cd cookbook
# Install React 
npm install -g create-react-app
# Install React-apollo
npm install -g react-apollo
# Create the React sample project
create-react-app cookbook_display
```

In side the App.js let add some code like this

```react

import React, { Component } from 'react';
import { HashRouter, Route, Router } from 'react-router-dom';

import ApolloClient from 'apollo-boost';
import { ApolloProvider } from 'react-apollo';

const client = new ApolloClient({
  uri: 'http://localhost:8000/graphql'
});



export default class Index extends Component{
    render() {
        return (
            <ApolloProvider client={client}>
            <HashRouter forceRefresh={false}>
                <div>
                    <Route path='/' component={Home} exact={true}/>
                </div>

            </HashRouter>
            </ApolloProvider>
        )
    }
}
```
Create View that call Home.js with the following code

```react

import React from 'react';
import ApolloClient from 'apollo-boost';
import { ApolloProvider } from 'react-apollo';

export default class Home extends React.Component {

    constructor(props) {
        super(props);
        
    }


   

    render() {
        return (

           <ApolloProvider client={client}>
				<Query
			          query={gql`
					    {
                           allIngredients {
                                id
                                name
                              }
						
					}`}
	      >
            {({ loading, error, data }) => {
						if (loading) return <p>Not available</p>;
						if (error) return <p>error :( </p>;
                        return (
                         <h1>data.name</h1>

                       );
            }}
         

          </Query>



         </ApolloProvider>
        );
    }
}

```

#Run the Project

```react
npm start
```
#Summary

This is the sample frontend with GraphQL. In next article I will add more point about :
1. Does GraphQL have any restrictions?
2. How is the speed compared with the REST API?
メモ：奥多摩ハッカソンで使って技術について-CryptoStation

# 奥多摩ハッカソン
奥多摩にてハッカソンを開催。使って技術を共有するための私的メモです。
**参加**: ソニックガーデン様・BIT学生のみんな・ISSHO

# やったこと
CryptoStationというブロックチェーン技術を使ったスタンプラリーアプリケーションの実装

# プレゼン資料
https://docs.google.com/presentation/d/1jZQoKsut_iRbea7EbSLhi-CfrwL5nJ7gqPIqr_kdY44/edit?usp=sharing

# 使用技術
- **アプリケーション**：HTML, CSS, Javascript, PHP
- **API**: node.js
    - for api
        - body-parser
        - express
    - for blockchain
        - openzeppelin-solidity" 
        - truffle-contract
        - truffle-hdwallet-provider
        - web3
- **ブロックチェーン**: Ethereum(solidity)
    -  ERC721(Non Fundible Token Standard)
        -  https://github.com/OpenZeppelin/openzeppelin-solidity/tree/master/contracts/token/ERC721
    -  Remix
        -  https://remix.ethereum.org/#optimize=false&version=soljson-v0.4.24+commit.e67f0147.js
    -  Truffle
        -  https://truffleframework.com/truffle
    -  Ganache
        -  https://truffleframework.com/ganache

# TOKEN
CST
deployed at Ropsten network.
https://ropsten.etherscan.io/token/0xcf9ec8d6e47e2dcf4706b2d817e7ff7c57b82308

thx!!
![7784E0BB-5E45-42D6-8194-0FE204B5C68B.jpeg](https://qiita-image-store.s3.amazonaws.com/0/60143/9f5e4a79-5c95-4e65-8aa3-e4f94b487653.jpeg)
[MovableType]コンテンツタイプでカテゴリセットを使う

リファレンスに例が無くハマったのでメモ。

## 環境

- Movable Type 7 r4208

## コンテンツタイプテンプレートでコンテンツデータに指定したカテゴリの一覧を出力

コンテンツタイプに指定したカテゴリセットの**フィールドの**名前（カテゴリセットの名前ではなく）を「カテゴリ1」とすると、こんな感じ。

```html
<mt:ContentField content_field="カテゴリ1">
  <!-- mt:Categories とかは無しで直接カテゴリがループする -->
  <!-- 通常のループと同じく、__first__/__last__などが使える -->
  <mt:If name="__first__"><ul></mt:If>
  <!-- 通常のカテゴリーと同じテンプレート変数が使える -->
  <li><$mt:CategoryBasename$>: <$mt:CategoryLabel$></li>
  <mt:If name="__last__"></ul></mt:If>
<mt:Else>
  <!-- 他カテゴリと同様に、カテゴリの指定が無い場合は mt:Else が機能する -->
  <li>なし</li>
</mt:ContentField>
```

一番最初にメインカテゴリが来るので、それだけ必要な場合は`__first__`で取ってくると良いかも。

## 特定のカテゴリセットに属するコンテンツデータを一覧する

```html
<mt:Contents content_type="コンテンツタイプ1" field:6ab81edd42c2bd6841a671c71d28132c847b9dac="カテゴリ1 AND NOT カテゴリ2">
  <mt:ContentsHeader></ul></mt:ContentsHeader>
  <li><$mt:ContentIdentifier$>: <mt:ContentField content_field="フィールド1"><$mt:ContentFieldValue$></mt:ContentField></li>
  <mt:ContentsFooter></ul></mt:ContentsFooter>
</mt:Contents>
```

ちなみにこのバージョンでは、カテゴリでコンテンツデータを絞り込むと、並べ替えが効かないバグがある。