OmniAICreator/Qiita-1.07M huggingface dataset:
HTTPプロトコルとRESTfulについて学習してみた[初心者編]

##概要

HTTPプロトコルとRESTfulについてまとめです

##なぜこれをやろうと思ったか


プログラミング初心者を脱却するため必要な知識の一つとしてHTTPプロトコルとRESTfulだからです。
->たぶんIT企業のマナーだと思います

##HTTPプロトコル

そもそもHTTPとは
=>URLを一番左についているhttpとかhttpsのこと



そもそもプロトコルとは
　->最低限ルール。　つまりこれは、〇〇してくださいねみたいね

##HTTPの仕組み

WEBサーバー（HTTPのサーバー）とwebプラウザ（自分のPCのchrome）の二つが、TCPの８０番ポートを使って
通信すること。


具体的に言うと、自分のpcからgoogle検索のトップページにアクセスする
以下の手順で、自分のPCにgoolge検索のトップページが表示される

手順
１. 自分のpcからhttps://www.google.co.jp/のhtmlページがほしいと、googleのwebサーバーに要求する
2. googlewebサーバーからhtml情報が自分のpcに表示される
3. 自分のpcにgoogle検索表示

## 裏でたくさんやり取りしている。

実は、一つのページにつき１００−２００個ぐらいやり取りをしている。
　画像、css,スクリプトなどたくさんあり一つ一つwebサーバーやり取りしている。

時間がかかるので、いくつか同時にpcとwebサーバーでやり取りしている。


http://www.atmarkit.co.jp/ait/articles/1703/29/news045.html

##RESTful APIについて

つまりHTTPメゾット(url)にだれでもわかりやすい名前をつけること

railsならindex（一覧ページ）,new(新規登録ページ)などだれでもわかりやすい名前をつける。
　railsだとnew＝新規登録ページだと決まっている

##ついで　

変数も名前でどんなことをしているわかりやすくする

###[お願い]
　自分は、プログラミング学習中です。内容に謝りがあればコメントでお願いします

##参考文献

https://tarosky.co.jp/tarog/895
http://www.atmarkit.co.jp/ait/articles/1703/29/news045.html

https://developer.ntt.com/ja/blog/92ae9651-557e-482c-8f53-59cbce049c02
Jenkins と Gitlab の連携

プラグインがインストールされている状態での設定方法。設定方法がよく変わるらしく悩んだので記録する。

## Gitlab から Jenkins にビルド開始を伝える [Jenkins CI service](https://docs.gitlab.com/ee/integration/jenkins.html)

* Gitlab の該当のプロジェクトから Settings > Integrations
* Project services > Jenkins CI
* Active: チェック
* Trigger: 必要な物をチェック
* Jenkins url: もしも Jenkins の URL が https://example.com/job/Group/job/Project/job/tool/ だったら、`https://example.com/` の部分
* Project name: もしも Jenkins の URL が https://example.com/job/Group/job/Project/job/tool/ だったら、`Group/Project/tool` のように job を除いた名前

## Jenkins から Gitlab にビルド完了を伝える

Gitlab の Jenkins CI service のドキュメントには、あたかも Gitlab 側で設定するだけで [Gitlab pipeline との連携が出来る](https://docs.gitlab.com/ee/integration/jenkins.html#overview) かのように書いてあるが嘘だった。Gitlab pipeline と連携するには以下のように Jenkins ファイルの適当な位置に適当なコマンドを入れる必要がある。ざっくり書くとこんな感じだった。

```groovy
pipeline {
  agent any

  options {
    gitLabConnection('Your GitLab Connection')
  }

  stages {
    stage('build') {
      steps {
        updateGitlabCommitStatus name: 'build', state: 'running'
        hogehoge
      }
    }
  }

  post {
    success {
      updateGitlabCommitStatus name: 'build', state: 'success'
    }
    failure {
      updateGitlabCommitStatus name: 'build', state: 'failed'
    }
  }
}
```

* gitLabConnection とは、GitLab との接続を表す名前。権限によっては一般ユーザには見えないが、ビルドしたブランチに行って View Configuration > General > GitLab Connection で見ることが出来る。
* updateGitlabCommitStatus
    * name: `build` など適当な名前
    * state: `pending`, `running`, `canceled`, `success`, `failed` のどれか

## 参考

* [Jenkins Declarative Pipeline jobs への設定方法](https://github.com/jenkinsci/gitlab-plugin#pipeline-multibranch-jobs)
* [Jenkins GitLab Plugin リファレンス](https://jenkins.io/doc/pipeline/steps/gitlab-plugin/)
* [Set Up Jenkins Gitlab Merge Request Builder](http://klinki.github.io/set-up-jenkins-gitlab-merge-request-builder/)
Node.jsって何ですか？

※非エンジニアやJS初心者向けの記事です。分かりやすさを優先しているので、正確な定義とは若干ズレている可能性があることをご了承下さい。
# Node.jsって何ですか？
## "プログラミング言語ではない"
`言語`は"JavaScript"
"Node.js"は`実行環境`です。
## よくわからない
だと思います。
有名な言語は大概`実行環境`も一緒になっていることが多いです。
## 身近なものだと、VBAとWord/Excel/PowerPointの関係に近い
VBA、いわゆるマクロって呼ばれる機能ですね。
「書き方、基本命令」を決めている`言語`と、
「拡張命令、できること」を決めている`実行環境`がある訳です。
## Word/Excel/PowerPointはプログラミング言語ですか？
違いますよね？
## "プログラミング言語ではない"
"Node.js"は`実行環境`です。
今までは、これが各種"ブラウザ"でした。
"Node.js"はサーバーサイドやその他諸々ができる子です。
## ただ一つ違うこと
ブラウザはJavaScriptが無くても成り立ちますし、
Word/Excel/PowerPointはVBAが無くても成り立ちます。
その点、"Node.js"は、JavaScriptの実行がメイン機能なので、JavaScriptが無いと成り立ちません。
## もう一声
人間で例えてみる。
言語はコミュニケーションの手段でしかありません。
やれることは人によって違います。
"Node.js"はサーバーサイドやその他諸々ができる子です。
# TypeScriptって何ですか？
## "方言"のようなものです
JavaScript「本当に！？」
TypeScript「ほんまか！？」
## 関係性も似ています
関西弁を話せる人は、ある程度標準語を話せることが期待できます。
標準語を話せても、関西弁を話せるとは限りません。
(習得は新規言語に比べると楽ですし、雰囲気は感じ取れます)
※一部派生言語では、大きく書き方が違う場合もあります。日本語なら琉球語のようなものがあります。
# V8って何ですか？
~~日本の男性アイドルグループです~~
## JavaScriptの言語を解釈するパーツです
これがあるとJavaScriptが話せるようになります。
## Node.jsでもブラウザ(Chrome)でもV8が使われています
言語を話すためのパーツなので共通です。
## FirefoxやEdgeは…？
`SpiderMonkey`や`Chakra`などオリジナルのエンジンを利用しています。
## V8は頭の片隅に置いておく程度でいい
電子レンジにマグネトロンが使われていることは、知らなくても生きていける。
# (おまけ)
## JavaScript≠フロントエンド
ブラウザだけじゃない。
## Node.js≠サーバーサイド
コマンドラインツールも作れる。マイコン制御にも使われたりする。
Webだけのモノじゃない。
これは、JSの可能性をブラウザの外、全てに広げるものだ。
世間的にはサーバーで使うことが多くても、例外は居る。(私とか)
WebサービスのJava11対応をしてみた話

# はじめに
私が開発と運用保守をしているWebサービスがJava8で動作していたためJava11対応をしてみた際の備忘です。

# 経緯
Webサービスが無事リリースされ安心し始めた、2018年2月頃に以下発表を読んで愕然としました。
リリースしたWebサービスの環境の寿命が近づいていることに。
春頃からJava界隈の様子見と情報収集をしながら、夏頃から対応作業を始めました。

- [来月にはJava 10が登場し、9月にはJava 11が登場予定。新しいリリースモデルを採用した今後のJava、入手方法やサポート期間はこう変わる（OpenJDKに関する追記あり] (https://www.publickey1.jp/blog/18/java_109java_11java.html)

# 対応前の環境
1年程度前から稼働しているサービスということもあり、当時の開発環境として以下で該当サービスが構成されていました。
各ツールはタイミングを見ながら更新していたため、メジャーバージョン以外は比較的新しめな状態でした。

- アプリケーション
    - Java : OpenJDK8
    - Build Tool : Gradle 4.8
    - Application Framework : Spring Boot 1.5.13.RELEASE
    - Test Framework : JUnit 4.12
- CI/CD
    - Jenkins 2.120.x
- コード解析
    - SonarQube 6.4(SonarJavaPlugin 5.0利用)
  
# 対応後の環境
2018年11月中旬頃の各ツールの最新版、または安定版で構成しました。

- アプリケーション
    - Java : OpenJDK11(11.0.1)
    - Build Tool : Gradle 5.0RC1
    - Application Framework : Spring Boot 2.1.0.RELEASE
    - Test Framework : JUnit 5.3.1
- CI/CD
    - Jenkins  2.138.2
- コード解析
    - SonarQube 7.1(SonarJavaPlugin 5.9利用)

# 対応の流れ
概ね以下のような流れでJava11対応を実施しました。

- 2018年2月  Javaのサポートライフサイクルの変更に愕然とする（暫く見なかったことにしていました)
- 2018年7月  OpenJDK11にアップデートすることを決意
- 2018年8月  OpenJDK10、Spring Boot 2.0にアップデートをし様子見
- 2018年9月  OpenJDK11 EarlyRelease、Spring Boot 2.1.0.Milestoneにアップデートし様子見
- 2018年10月 OpenJDK11 GA、Spring Boot 2.1.0.RELEASEにアップデートし本格対応
- 2018年11月初旬 たくさんテストする ※一番大変な時期。この時期にJUnit4からJUnit5にテストコードを変更
- 2018年11月中旬 商用サービス環境にリリース

2018年10月のツール正式リリースからはBug対応やテストコード変更でバタつきましたが、事前に様子見でアップデートをしていたため、大きな問題は発生しませんでした。
正式リリースから実質1ヶ月弱の期間で商用サービスとしてリリースできたのは良かったかなと。

# 残課題
急ぎ対応したこともあり、以下は課題として残りましたが、12月以降順次対応しています。

- Java11対応のGradle5.0のリリース遅れ(当初11月初旬の見通しだった)に伴い、RC版を利用した
- JUnit5としてのテストコード最適化が不足
- JDK9以降に採用された新機能や便利機能に適応できなかった

# 感想
バタつきましたが無事、2019年1月のJDK8のサポート終了に間に合ったのと、比較的最新のツールに移行できたのは良かったなと。
これで2019年3月のJava12リリースまでは延命できたので次はJava12対応の準備をしていこうかなと考えています。
iPadを楽譜表示などに使うときにたったひとつ注意すること

# 概要
Apple Pencilの充電を十分にしておくか、接続を切っておくこと、です

# 説明
充電が5%を切るとこのようなポップアップが出てきてしまいます。。
![images.png](https://qiita-image-store.s3.amazonaws.com/0/68213/bf3d81d1-afc5-06ff-0710-a20916fcde4b.png)
tesseractで文字（日本語）認識やってみた

#はじめに
こんにちは。
文字認識ってなんだか夢がありますよね！そんな文字認識も簡単に出来てしまうこの時代… **やらねば損**だねということでまずコマンドラインで実行させて行こうかなと思います。

##参考にさせて頂いたサイト
[Ubuntuにtesseract-ocrをインストール](https://qiita.com/edisonthk/items/f8ebe22e4b40aa9c7472)
さんの記事を参考にさせていただきました。
##インストール
###パッケージインストール
まず外堀から埋めていきます。

```
sudo apt-get install autoconf automake libtool
sudo apt-get install libpng12-dev
sudo apt-get install libjpeg62-dev
sudo apt-get install libtiff4-dev
sudo apt-get install zlib1g-dev
sudo apt-get install libicu-dev      
sudo apt-get install libpango1.0-dev 
sudo apt-get install libcairo2-dev   
sudo apt-get install libleptonica-dev
```
ここからtesseractをインストール
```
sudo apt-get install tesseract-ocr
```
ここまででtesseractはインストールされました。
続いて…
###言語のデータファイルインストール
[https://github.com/tesseract-ocr/tesseract/wiki/Data-Files](https://github.com/tesseract-ocr/tesseract/wiki/Data-Files)にアクセスし
tesseract-ocr-3.02.eng.tar.gz
tesseract-ocr-3.02.jpn.tar.gz
をインストール→解凍します。
次に/usr/local/share/tessdataに
jpn.traindata
eng.traindata
を入れます。
この時、
```
sudo mv jpn.traindata ../../../usr/local/share/tessdata
```

ってやると一発です。
../../の部分は自分のtraindataがあるディレクトリに合わせてください。

ここまで来たら
```
sudo apt update
sudo apt upgrade
```
したら完了です。

##使用してみる
適当なpngファイルを用意します。
著作権とか面倒なのでやり方だけ載せておきます。

```
tesseract 認識したい画像(png) 出力ファイル名 -l 言語選択
```
例えば、okatsuki.pngという画像の文字認識をしたい。
出力ファイル名は、OK.txtにしたい。
言語は日本語で　
という場合は
```
tesseract okatsuki.png OK -l jpn
```
って感じになります。
ちなみに英語の場合はjpnのところをengにすれば大丈夫です。

##最後に
いかがでしたでしょうか？備忘録的な要素を多分に含んでいるため、大変読みづらい記事であったかと思いますがみなさんの参考になれば良いなと思います。
またいつか、文字認識を使ったなにかを作ったら続きという感じでやっていきます。
みなさんもぜひいろいろ作って見てください。
ではでは。
VSCode 用 SystemVerilogの拡張を作る（#4）

# 独自コマンドを実装する
[Ctrl+P], Align parenthesis

とか打つと括弧でalignしてほしいのです。
こういったコマンドを実装します。

コマンドを実現するコード自体は簡単で、vscode API を使いながら実装します。
テキスト置換系であればそれほど難しくありません。
[公式ページの解説](https://code.visualstudio.com/docs/extensions/example-word-count)で大体わかります。

```javascript:行末空白削除コマンド
export function deleteTrailingWhiteSpaces () {
  if (! vscode.window.activeTextEditor) {
      vscode.window.showInformationMessage("Open files first!");
      return;
  }

  let e   = vscode.window.activeTextEditor;
  let d   = e.document;
  let ss  = e.selections;
  let s   = ss[0];
  let c   = s.active;

  let st  = s.start.line;
  let ed  = s.end.line;

  let text = [];

  for (let lnum = st; lnum <= ed; ++lnum) {
      let line = d.lineAt(lnum).text.replace(/\s+$/, "");
      text.push(line);
  }

  // Apply edit
  e.edit(function (edit) {
      for (let i = 0; i < text.length; ++i) {
          let editStart = new vscode.Position(i + st, 0);
          let editEnd   = new vscode.Position(i + st, d.lineAt(i + st).text.length);
          let rngEdit  = new vscode.Range(editStart, editEnd);
          edit.replace(rngEdit, text[i]);
      }
  });

  return true;
}
```

このコードをTypeScriptで書いて、拡張機能に登録し、コンパイルして吐き出されたJSを指定すれば動作します。


# Node.js と VSCode拡張機能ライブラリ
VSCodeの拡張機能はNode.jsが必要です。
[このあたり](https://code.visualstudio.com/docs/nodejs/nodejs-tutorial)を参考にWindows用のNodeをインストールします。
npmコマンドにパスが通っていることを確認しておいてください。

package.jsonのdependenciesにvscodeを入れておくと、npm install で拡張機能用のライブラリが入ります。

```json:package.json
  "dependencies": {
    "@types/node": "^10.12.10",
    "typescript": "^2.9.2",
    "vscode": "^1.1.22"
  }
```

この vscode ライブラリですが、npmインストール後にスクリプトを実行しないといけないようです。

```shell
% node ./node_modules/vscode/bin/install
```

これを自動化するためにscriptsのpostinstallを書いておくことでnpm installすると勝手にやってくれるようになります。

```json:package.json
  "scripts": {
    "postinstall": "node ./node_modules/vscode/bin/install",
  },
```

# 拡張機能の起動シーケンス
VSCodeはJavaScriptで書かれたコードを拡張機能としてロードします。
package.jsonのmainで指定されたパスに.jsを付けたものを実行するようです。

```json:package.json
  "main": "./out/extension",
```

なので、TypeScriptで書かなくてもいいのです。
でも TypeScript で書いたほうが補完がよく効くので私は結局TypeScriptを使いました。
他にも、パーサーの実行速度の問題でTypeScriptを選択した経緯があります。


# コマンドの登録
コマンドをVSCodeで実効するには以下の作業が必要です。

1. コマンド実行関数を書く
2. activate関数内でコマンド実行関数を拡張機能に登録する
3. pacakge.jsonで、登録したコマンドをVSCodeのインターフェースに登録する

2と3が別れているの鬱陶しいのですが、2が拡張機能自体の実装で、3がVSCodeコマンド群への登録です。
グラフの作成

なにかの資料を作成中、なんでもいいから何かグラフを作りたい場合のコード

```python:main.py
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt


x = np.random.rand(100)
y = pd.date_range('2000-01-01',periods=100,freq='D')
df = pd.DataFrame({'x':x},index=y)
df.plot(figsize=(100,50))
plt.savefig('sample.png')

```
秘伝のタレと化したAndroidプロジェクトを改善した(い)話

この記事は[Kosen13s' Advent Calendar 2018](https://adventar.org/calendars/3258)の19日目の記事です。
本当は、もっと面白い記事を書きたい人生だった。


# 前置き
いつか貴方が「~~クソコード~~秘伝のタレ」に出会ったときの助けになりますように、という思いでこの文章は書かかれました。
もちろん秘伝のタレに出会わないに越したことはないと思います。ですが、万が一にも出会ってしまったときにちょっと思い出して貰えれば幸いです。



# TL;DR
本質的に良いコード = テストが書けるコード
単体テストを書くのが難しいときはシステムテストを足掛かりにしよう


# 「秘伝のタレ」プロジェクトの問題：テストが書けない
秘伝のタレを生み出す原因は何でしょうか？

- 変数名が意味不明
- 1つのメソッドが数百行くらいある
- 括弧の位置がバラバラ
- 1行で色々なことをやりすぎ
- コメントがない (or 意味がないコメント)

これらの要因は確かにコードの品質を下げます。しかし、これらは**秘伝のタレの要因にはならない**と思っています。
秘伝のタレの本質的な要因は以下だと思います。

- **モジュール間の結合が密**
- **スコープが広すぎる**

なぜなら、これらの要因は**単体テストを困難にする**からです。
変数名が意味不明だったりメソッドが長かったりするだけなら、単体テストを書いてリファクタリングして終了です。
一方で、密結合なモジュールはテストを行えないので、リファクタリングにかなりの勇気を必要とします。


## 単体テストが困難な具体例
例えば、こんな感じのクラスがあるとします。


```java:Data.java
/**
 * ユーザデータと商品データを扱う
 * UserとItemの実装は割愛
 */
public class Data {
  private List<User> users = new ArrayList<>();
  public User getUser(int index) {return user.get(i);}

  private List<Item> items = new ArrayList<>();
  public Item getItem(int index) {return items.get(i);}

  public void getData() {
    // apiを叩いてユーザ情報を取得している
    users = ...
    // apiを叩いて商品情報を取得している
    items = ...
  }
}
```

このクラスをActivityがこんな感じで使っています。


```java:Sample.java
class Sample extends Activity {
  User user;
  Item item;
  int index;

  @Override
  onCreate(Bundle savedInstanceState) {
    Data data = new Data();
    user = data.getUser(index);
    item = data.getItem(index);
  }
	
  // 例外処理は省略
  getNextData() {
    user = data.getUser(index++);
    item = data.getItem(index++);
  }
}
```


このような実装になると、単体テストを行うことは困難です。
なぜなら、

1. **Dataクラスとapiが結びついている = 実際にapiを叩かないとプログラムの実行ができない**
1. **Sample#getNextがglobal変数を参照しているため、結果が一定でない**

からです。
前者は、apiへのアクセスを別のクラスにすると良いでしょう。[DIコンテナ](https://github.com/google/dagger)を使えると非常にgoodですね☺。
後者を改善するのは非常に難しいと思います。異なるクラスの複数のメソッドがglobal変数にアクセスしまくっていると読み解くことも困難です。僕は`git grep`しながらゴリゴリ読んでいきました😇。何か良い方法があれば教えて欲しいです。

# 改善する：システムテストを書く
「単体テストが書けないのが秘伝のタレを生み出す」という主張をここまでしてきました。
では、どのようにして秘伝のタレを改善すれば良いでしょうか？
単体テストが書けないのはどうしようもないので、システムテストを書くことにしました。「色々変更した後にシステムテストが動けばOK！」という方針でリファクタリングに取り組んでいます。
システムテストには[Espresso](https://developer.android.com/training/testing/espresso/)を使いました。
アプリの操作をコードに変換できるので、学習コストは低めと思います。


# まとめ：俺たちの戦いはまだまだこれからだ
...1つ前のセクションにはもっと色々と書きたかったです。Advent Calendarに日程突っ込んだときには「あと3週間もあるし、いろいろ書けるやろｗ」とか思っていましたが、そんなことはありませんでした。
やや尻すぼみにはなりましたが、改めて結論を出すと「単体テストが書けないコードは秘伝のタレを生み出す。単体テストが書けないコードはシステムテストを書く。」ということになります。
今後、リファクタリングを続けていって得た知見を追記したいと思います。👍

# 余談：asciidocを使おう
ところで、仕様書がないというパターンがあると思います。存在していても、良くないフォーマットで作られているとか。
そんなときには是非[asciidoc](https://github.com/asciidoc/asciidoc)を試してほしいと思います。markdownの強化版みたいなやつです。テーブル関連の表現力が良さげでした。
シェル の ssh 接続「先」でコマンドを直接実行するワンライナー

# 例

```
ssh 127.0.0.1 echo OK! OK!
```

# 引数1個バージョン

```
ssh 127.0.0.1 "echo OK OK"
```

ちょっと分かりにくいがシェル的に、以下どちらの書き方でも動く

# 引数複数バージョン

```
ssh 127.0.0.1 "echo" "OK" "OK"
```








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
SSOについてまとめた

# はじめに
IT業界に入って５年目にしてログインAPIを作ることになり、SAML認証に出会いました。
恥ずかしながらWEB一般的に使われる認証認可の仕組みを理解しておらず、盛大にハマりました。
今後の勉強のためにSSO、SAMLのほか、OAuth、OpenID、OpenID Connectについてまとめました。
理解の浅い箇所がありますが、お手柔らかにしていただけると幸いです。
# SSO（シングルサインオン）とは
１つのログインIDとパスワードで複数のWEBサービスにログインできる仕組み
## SSOの登場人物
- クライアント（＝ユーザー）
- SP（Service Provider）
- IdP（Identity Provider）

## SSOの仕組み
### エージェント方式
- Webアプリケーションサーバーに仲介役の「エージェント」というソフトを入れる
- Cookieを利用
- Webアプリケーションサーバー内のエージェントは、ユーザーログイン状態/アクセス権限を問い合わせ、認証状態を確認することで、シングルサインオンを実現

### リバースプロキシ方式
- ブラウザとWebアプリケーションサーバ間に「リバースプロキシ」サーバを設置
- 「リバースプロキシ」サーバにエージェントソフトを導入することで、シングルサインオンを実現

### 代理認証方式
- ログイン対象のWebアプリケーションに対して、ユーザーの代わりにID/パスワードを送信
- 代理入力することによってログインを完了させ、シングルサインオンを実現

### フェデレーション方式
- 異なるドメイン間で、パスワード等の情報を渡すことなく、安全に認証されたユーザーの情報を連携することで、シングルサインオン(SSO)を実現
- フェデレーション方式に使えるプロトコルは標準化が進められており、現在ではSAMLやOpenID Connectが使用されている

#### SAML（Security Assertion Markup Language）
- ユーザーの認証や属性、認可に関する情報を記述するマークアップ言語
- SAMLを使えばクッキーを利用せずに認証情報の伝達が可能

# OAuthとは
準備中
# OpenIDとは
準備中
# OpenID Connectとは
準備中
# 参考文献
##### 全般
- https://www.goodpic.com/mt/archives2/2008/01/openid_oauth.html
- https://www.slideshare.net/tkudo/openid-connect-devlove

##### SSO
- https://www.ogis-ri.co.jp/pickup/themistruct/note/note_sso01.html

##### SAML
- https://japan.entrust.com/column/ai/small.html
- https://auth0.com/blog/jp-how-saml-authentication-works/

##### OAuth & OpenID & OpenID Connect
- https://www.ibm.com/support/knowledgecenter/ja/SSEQTP_liberty/com.ibm.websphere.wlp.doc/ae/cwlp_openid_connect.html
- https://www.ogis-ri.co.jp/otc/hiroba/technical/openid-connect/chap1.html
- https://www.sakimura.org/2011/05/1087/
- https://www.buildinsider.net/enterprise/openid/connect
- https://christina04.hatenablog.com/entry/2015/01/26/194841
- https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be
- https://qiita.com/TakahikoKawasaki/items/498ca08bbfcc341691fe
- https://tech-lab.sios.jp/archives/8651
dartで、あるパッケージから特定のオブジェクトだけimportする方法

`import AAA show aaa` を使うと、 AAAというパッケージから、aaaというオブジェクトだけをimportできます。

python でいう、 `from AAA import aaa` と同じだと認識しています。

例：

```
import 'dart:convert' show JSON;
```

この記述の利点としては、 **コード中のオブジェクトが、どのパッケージにあるかがすぐわかる** ことだと思います。
Pythonで処理の時間を測る（小数第２位）

```python
import time #関数をインポート
start = time.time() #開始時間を記録

###ここに処理を入れる

finish = time.time() #終了時間を記録
dt = finish - start #終了時間 − 開始時間によって処理の時間を求める
print("{0:4.3g}".format(dt) + "秒") #小数第二位で処理にかかった時間（秒）を表示
```
Vue.js のプラグインを書く時の、prototype 「あり」と「なし」の違い

Vue プラグインのいくつかの書き方について整理しています。
この記事ではメソッドの影響範囲についてのみ言及します。

Vue プラグインを書く時には install メソッドを公開し、その中で、グローバル・アセットを追加したり、グローバル・ミックスインによりコンポーネントオプションを追加したりもできますが、その点については触れません。

## インスタンスメソッド

prototype を使う場合のメソッドを、インスタンスメソッドと言います。

```js
import Vue from "vue";

Vue.prototype.$myMethod = () => {
  console.log("$myMethod");
};

/* eslint-disable no-new */
const vm = new Vue();

vm.$myMethod(); // "$myMethod"
Vue.$myMethod(); // Error
```

インスタンスメソッドは、プロトタイプチェーンされるので、子コンポーネント内で `this.$myMethod()` を使用できます。Vue インスタンスの作成前（beforeCreate）でも使用できます。

また、全てのインスタンスが利用できるプロパティは `$` で始まるように書くのが推奨されています。詳しくはこちら [Vue Cookbook の Adding Instance Properties](https://vuejs.org/v2/cookbook/adding-instance-properties.html) を参照してください。

## Vueグローバルメソッド

prototype を使わない次のようなメソッドを、グローバルメソッドと言います。

```js
Vue.myGlobalMethod = () => {
  console.log('myGlobalMethod')
}
```

Vue は new キーワードを使って Vue インスタンスを生成します。生成された Vue インスタンスでは、グローバルメソッドを使うことができません。もちろん、Vue が提供してくれるグローバルメソッドも同様です。

```js
import Vue from "vue";

Vue.aaa = "aaa";

/* eslint-disable no-new */
const vm = new Vue();

console.log(Vue.aaa); // "aaa" 
console.log(vm.aaa); // undefined
console.log(Vue.version); // 2.5.21
console.log(vm.version); // undefined
```

グローバルメソッドを書く際には、既存のVueグローバルメソッドと衝突しないように注意です。また、グローバルメソッドは、静的メソッド（スタティックメソッド）とも言われるようです。

## まとめ
独自プラグインを作成する時に、インスタンスメソッドと、グローバルメソッドの違いを理解した上で install を書かないと、うまく動かないので注意が必要です。

## 参照

https://vuejs.org/v2/guide/plugins.html
Elixir入門の入門（インストール→「Hello, World!」を表示）

最近、Elixirが気になっているので、Elixirのインストールと「Hello, World!」を表示するスクリプトを書いてみました。

# Elixirをインストールする
まず、Elixirを利用するための環境を整備したいと思います。
Elixirのインストールは、公式サイトに記載されています。
https://elixir-lang.org/install.html

私は、Macを利用しているので、 `brew` コマンドで簡単にインストールすることができます。

```bash
$ brew install elixir
```

# 「Hello, World!」を実行してみる
とりあえず、「Hello, World!」を実行してみます。
`iex` コマンドを利用すると、インタラクティブにコードを実行することができます。

```bash
% iex
Erlang/OTP 21 [erts-10.1.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace]

Interactive Elixir (1.7.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> IO.puts "Hello, World!"
Hello, World!
:ok
```

せっかくなので、新規に `helloworld.ex` というファイルを作成し、コンパイルして実行してみます。
ちなみに、私は開発にVisual Studio Code（以下、VS Code）を利用しているので、 `vscode-elixir` というプラグインを使っています。シンタックスハイライトなども行ってくれるので、とても便利です。
https://marketplace.visualstudio.com/items?itemName=mjmcloug.vscode-elixir


```helloworld.ex
defmodule Helloworld do
    def helloworld do
        IO.puts "Hello, World!"
    end
end

Helloworld.helloworld
```

コンパイル方法は、下記の通りです。

```bash
% elixirc helloworld.ex
Hello, World!
```

コンパイルの実行が終わると、 `Elixir.Helloworld.beam` というファイルが生成されます。

```bash
% ls
Elixir.Helloworld.beam	helloworld.ex
```

コンパイルされたファイルを実行するには、 `elixir -e` コマンドを実行します。

```bash
% elixir -e Helloworld.helloworld
Hello, World!
```

# ソートプラグラムを作ってみる
「Hello, World!」だけではつまらないので、ソートプラグラムを作ってみたいと思います。
作るとは言っても、既に `Enum.sort` というメソッドが用意されているので、そのメソッドを利用してみたいと思います。

Enum.sortのドキュメントは下記URLを参照ください。
https://hexdocs.pm/elixir/Enum.html#sort/2

数値配列を降順ソートする実行結果は下記の通りとなります。
とても簡単です。

```bash
iex(1)> list = [1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
iex(2)> Enum.sort(list, &(&1 >= &2))
[5, 4, 3, 2, 1]
```

また、文字列配列をバイト数が大きい順に並べるには、下記コマンドを実行します。

```bash
iex(1)> list = ["a", "ab", "abc", "abcd", "abcde"]
["a", "ab", "abc", "abcd", "abcde"]
iex(2)> Enum.sort(list, &(byte_size(&1) > byte_size(&2)))
["abcde", "abcd", "abc", "ab", "a"]
```

とても便利。以上です。
NodeJSでjQueryを使う

昨今、マイクロサービス化が盛んな影響もあり、WebAPIで情報をやり取りできるRESTfulなWebAPIサービスが多く提供されているが、世の中にはまだHTTPリクエストに対し、サーバレンダリング方式でHTMLを返すことでしか情報を取得できないサイトも存在する。
そんなサイトに対して「必要な情報だけほしい」となると、HTMLを解析して、欲しい情報部分だけを抜き出す処理が必要になるのだが、そんなときjQueryはとても便利なわけで、ブラウザでなくネイティブのJavaScript（Node.js）でHTMLを解析するプログラムを書くときに、jQueryを使う方法はないものか試してみた。

# 必要なパッケージ
## jQuery
言うまでもなく必要なのでnpmでインストールして`require`する。

```
npm install jquery
```

## jsdom
https://www.npmjs.com/package/jsdom

Node.jsでDOM操作することができるパッケージだ。これを使うだけでも目的を達成できることが多いのだが、今回はjQueryのインタフェースで使いたいので、合わせてインストールする。

```
npm install jsdom
```

# サンプルコード
とても簡単なコードだが、とりあえずはこれで動くことを確認した。

```js
const jsdom = require('jsdom');
const { JSDOM } = jsdom;
const dom = new JSDOM(`<html><body><div id="aaa">AAA<div></body></html>`);
const { document } = dom.window;
const jquery = require('jquery');
const $ = jquery(dom.window);

console.log($("#aaa"));
console.log($("#aaa").text());
console.log($("#aaa")[0].id);
```

```:実行結果
jQuery { '0': HTMLDivElement {}, length: 1 }
AAA
aaa
```

jQueryの全機能の動作を確認したわけではないので、動かない機能もあるかもしれないが、とりあえずセレクタが使えればなんとかなる！

# 追記：TypeScriptでトライ
せっかくなので、TypeScriptでトライしてみた。

```typescript
import fs from "fs";
import jq from "jquery";
import { JSDOM } from "jsdom";

fs.readFile("read.html", "utf-8", (err, data) => {
    const dom = new JSDOM(data);
    const $: JQueryStatic = <any>jq(dom.window);  //ここがポイント
    console.log($("div"));
});
```
Goで標準入力している処理をテストしたい

自分メモとして

Goで下記のように標準入力からの入力待ちの処理をテストしたい時ってどうすりゃいいのかなってことで調べてみた

```golang
var sc = bufio.NewScanner(os.Stdin)
if sc.Scan() {
	var txt = sc.Text()
}
```

そもそも `os.Stdin` 直接渡さず、 `bufio.NewScanner` に `io.Reader` 渡せばいいんですが、、、

まぁ、それができない状況と察してください

## os.Stdin 差し替える

スマートではないですが、多分このやり方がサクッとできそうです

os.Stdin は下記のように定義してあります

```golang
package os

~~ 省略 ~~

var (
	Stdin  = NewFile(uintptr(syscall.Stdin), "/dev/stdin")
	Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout")
	Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr")
)
```

Stdin を `io.Reader` を実装しているオブジェクトに差し替えてやります

```golang
// 一時ファイル作成
tmp, _ := ioutil.TempFile("", "tmp")
orgStdin := os.Stdin
os.Stdin = tmp
defer func () {
	os.Remove(tmp.Name())
	os.Stdin = orgStdin
}()

tmp.Write([]byte("なにかしらの入力")
// 読み書き位置を先頭に
tmp.Seek(0, 0)
```

ざっくりとですが、こんな感じになります

---

余談

ちょっとした処理でも、テスト書く前提でコーディングするようにしないと後々面倒なことになるんで気をつけなければー
Elastic TranscoderとMedia Convertで作った動画エンコードサーバを、ffmpegのサーバにどうして置き換えたのか

この記事は[AWS Advent Calendar 2018](https://qiita.com/advent-calendar/2018/aws)の18日目の記事です。

[Weddy Weddy](https://weddyweddy.net)というアプリを弊社で開発していまして、Elastic TranscoderとMedia Convertを使用して、動画と音源を合成してエンコードするサーバを作りました。
ただ今現在ではこの仕組みをやめてffmpegを使って大人しく動画変換サーバを作ったのですが、その理由など色々とを放出してみようと思って書かせていただきます。

## Weddy Weddyとは
[<img width="1171" alt="スクリーンショット 2018-12-17 17.50.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/119260/b5a4016c-1d2c-bfea-7a94-ed0f228b452f.png">](https://www.weddyweddy.net/)
ダンサー向け動画プラットフォームです。
簡単に言うとTikTokのガチのダンス動画バージョン。
おふざけとかなしで、こちらが選曲編曲したバトルとかでよく使われてる曲(30秒前後くらい)を撮影時に流し、それを投稿してサーバ側で動画と曲を合成していくようなアプリです。

頑張ってダンサーにアプローチしたり広めたりなどでぼちぼちユーザも増えてきています。

ちなみにWeddy Weddyっていうのはジャマイカの有名なクラブパーティの名前だったりします。

## Weddy Weddyの動画の仕様
* 縦型
* 720p
* h265
* mp4

## 試作1
<img width="582" alt="スクリーンショット 2018-12-19 14.01.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/119260/4191ab14-b8d0-57e3-a63b-87c635e8f762.png">

### 流れ
* 動画をS3にアップロード
* DBに投稿データを挿入
* S3アップロードをフックにElastic Transcoderを走らせて動画をエンコードおよびサムネイル作成してS3に再びアップロード
* S3アップロードをフックにffmpegをLambda上で走らせて動画と曲を合成
* 合成した動画のアップロードをポーリングで検知してDBを書き換え
* 動画投稿完了しましたを通知

### 難点
ffmpegをLambda上で走らせるとなると…という気分になってしまった。
とりあえずLambda通すとエラー検知とか面倒だったなぁと。
あとLambdaコードの管理が正直面倒。

## 試作2
<img width="646" alt="スクリーンショット 2018-12-19 14.06.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/119260/976d645e-8d1c-66b2-a2e2-16f334bcc741.png">

### 流れ
* 動画をS3にアップロード
* DBに投稿データを挿入
* S3アップロードをフックにElastic Transcoderを走らせて動画をエンコードおよびサムネイル作成してS3に再びアップロード
* S3アップロードをフックにMedia Convertを使用して動画に曲を合成
* 合成した動画のアップロードをポーリングで検知してDBを書き換え
* 動画投稿完了しましたを通知

### 難点
とりあえずffmpegを使わずにMedia Convertを使えばできるというと判明。
ただしH265変換はMeida Convertは現状対応しておらず、Elastic Transdocerを通さないといけず。
けどポーリングで検知するのはちょっと辛いなぁと思いつつ。
それにまだまだスピードは足らず、30秒程度の動画で1分半ぐらいかかってしまう。
それにMedia Convertでは縦動画をそのまま変換しようとすると、内部のrotateタグが削除されてしまうので、再生するときに縦動画が横動画扱いになってしまう。

## 現在の仕様
<img width="607" alt="スクリーンショット 2018-12-18 13.30.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/119260/ac1d11d6-d30b-1ff0-3532-f1c50ea6564e.png">

### 流れ
* 動画と曲をffmpeg使って合成してS3にアップロード
* 合成した動画のURLを取得してDBに挿入して動画投稿完了しましたを通知

### どうして今の仕様なのか？
いっそのこと動画エンコードサーバを作ることに。
そうすればH265変換も曲合成もなんでもできるなぁと。
それにサーバスペックという名前の札束でぶん殴ることでスピードアップすることができるなぁと。
月額のサーバ代と考慮して30秒程度の動画で30秒ぐらいまで抑え込むことに。
もう少しスピードアップしたいならばffmpegのGPU対応で、サーバもGPUにしないといけないんだけど。

## ちなみに
実はHLS形式で最初は配信していたんだけど、変換回数でコストがかかるし、そもそも全部読み切らないで途中で止まってしまうとかもあったり、そもそも短い動画だから向いていないかもなぁとか色々と考えていたり。
それにHLS形式で出そうとするとMedia ConvertだとどうしてもH264になってしまうし。
だからH265でMP4で行こうかと思ったり。

## まとめ
Elastic TranscoderとMedia Convertを使うのは流れ的には問題ないんだけど、動画の長さとかそこらへんによってはそもそもエンコードに時間がかかってしまう。
というかSNSみたいな動画のプラットフォームとして運用するならばアップロードに時間がかかりすぎるので辛いところがある。
ffmpegでもスピードを出したいならば札束でぶん殴るか、GPUでぶん回すかしないと厳しい。
alias登録すべきワンライナーを探すワンライナー

*これは [今すぐalias登録すべきワンライナー by ゆめみ① Advent Calendar 2018](https://qiita.com/advent-calendar/2018/yumemi01_one-liner) の18日目の記事です。*

<a href="https://twitter.com/M_Ishikawa">@M_Ishikawa</a> です！

このアドベントカレンダー。

登録してみたものの。。

うーん。[自分のdotfiles](https://github.com/ishikawam/dotfiles/search?q=alias&type=Code)見返してみて、いろんなaliasあるんですが、特に晒そうと思うものがなくて。
一番良く使う`grep`とか`git`とか、あとは集計に` | sort | uniq -c | sort -n`のパイプとかとか。

で、渾身のalias晒すんじゃなくて、渾身のaliasを探すワンライナーをばご紹介。

## 渾身のaliasを探すワンライナー(錯乱

```shell
open "https://github.com/search?q=alias+language%3AShell+extension%3Ash&type=Code"
```

https://github.com/search?q=alias+language%3AShell+extension%3Ash&type=Code

![image.png](https://qiita-image-store.s3.amazonaws.com/0/13541/34f70775-4f92-d4a7-c501-09bf31f064a1.png)

みんなこまめにチェックして暇な時に探すとよいよ！じゃあね！（ほんとごめんなさい
SourceTree利用時　利用していないリポジトリを参照している

SourceTree利用時の
git の SSL 設定で時間がかかったので備忘録

SourceTreeで
入力していないリポジトリを参照している原因

fatal: Could not read from remote repository.

確認　追加　削除の方法はこちらに記載されている
https://qiita.com/hijion/items/ae2cccebf5d28ff733f3

git config --globalは
特定のURLに代替URLでアクセスする。
認証キーつけるときとか。
アプリケーションのデプロイにAWX + Ansibleを活用してみた話

はじめまして！ 2018年4月に新卒でインフラチームへ配属された int_sorarinu です！
この記事は [Willgate Advent Calendar](https://qiita.com/advent-calendar/2018/willgate) の19日目の記事です！

# はじめに
皆さんはアプリケーションのデプロイ手法というものに頭を悩ませ夢を膨らませていた経験はないでしょうか。
かく言う私もこれまで Capistrano や CodeDeploy などを活用して夢を膨らませていた経験があり、その中で今回 Ansible に夢を託してみたという記事を書きます。

# Ansible
オープンソースの構成管理ツールで主に大量なサーバに対してソフトウェアをインストールしたり、設定ファイルを設置したりするのに利用されるものです。

基本的にはサーバの構成管理なのでアプリケーションのデプロイに利用されることはあまりないのではないでしょうか。
実際私も「Ansibleでアプリケーションのデプロイをやってます！」というところは見たことも聞いたこともありません。

しかし、Ansibleに夢を託す為にも今回はペライチのPHPソースをAnsibleでデプロイしてみました。

# デプロイ用Playbook
``` Ansible:Playbook
---

- name: git clone Repository
  git: repo=git@bitbucket.org:xxxxxxxxxxx/xxxxxxxx.git dest=/usr/src/xxxxx force=yes

- name: chown nginx:nginx /usr/src/xxxxx
  file: path=/usr/src/xxxxx state=directory owner=nginx group=nginx mode=0755 recurse=yes

- name: make symbolic link /usr/src/xxxxx/index.php to /var/www/app/index.php
  file: src=/usr/src/xxxxx/index.php dest=/var/www/app/index.php owner=nginx group=nginx state=link
```

やっていることは非常に単純で、 `git　clone` してきてドキュメントルートに対してシンボリックリンクを作成しているだけです。実際にプロダクトへ導入するとなった際には、マイグレーションのコマンドを発行したりする必要があります。

Ansibleのコードは出来ましたが、実際にデプロイする際に　`ansible-playbook -i servers site.yml -l appservers -u username -k -K --vault-password-file vault_pass --tags "deploy"` のような長いコマンドを一々発行することになります。

実際のプロダクトでアプリケーションのデプロイを行う人の身にもなってあげれば、デプロイシェルを用意するなりChatOpsを導入するなりしなければいけません。

そこで今回、 **AWX** を利用してデプロイ環境を整えることにしました。

# AWX
RedHat社が提供しているAnsibleを拡張するためのソリューション `Ansible Tower` のOSS版で、Playbookの実行結果を可視化できるダッシュボードやロールベースのアクセス権限管理などができるツール。
[AWX Git Repository](https://github.com/ansible/awx)

![スクリーンショット 2018-12-19 13.32.52.png](https://qiita-image-store.s3.amazonaws.com/0/137467/429dea1e-8891-2116-e2d9-09b639963229.png)

AWXの管理画面から、認証情報やインベントリなどの各種必要な情報を作成し、最後にテンプレートを作成することで利用ができるようになります。

![スクリーンショット 2018-12-19 13.38.50.png](https://qiita-image-store.s3.amazonaws.com/0/137467/5d31fa18-c876-4e9a-ba33-2487233b0759.png)

作成したテンプレートは赤丸で囲ったロケットマークをクリックするだけで実行されます。
![スクリーンショット 2018-12-19 13.41.16.png](https://qiita-image-store.s3.amazonaws.com/0/137467/a1ae8e6f-d211-d700-cef5-d30150069065.png)

また、LDAPアカウントとAWXアカウントを紐づけておくことができるため、LDAPのユーザグループなどによって実行できるPlaybookなどが設定できるため、権限管理なども容易にできるようになります。（開発者は Dry-Run だけ流せるみたいなことが出来ます）

# おわりに
雑になってしまいましたが、アプリケーションのデプロイでAWXとAnsibleを活用する方法をまとめてみました！
もちろんCapistranoやCodeDeployなどを利用することのメリットも多いですが、こうしてAnsibleに夢を託すことも面白いと思います。

デプロイ手法にお悩みの方がいらっしゃいましたら夢を託してみてはいかがでしょうか！
Googleスプレッドシートで別シートから条件に合うデータを取得する方法

# 概要
Googleスプレッドシートでデータをまとめる際に何度も同じことするの面倒だったので、
別シートにマスターデータを作ってそのデータを参照するようにしたら楽になったというお話。

ちなみにこちらの記事を参考にしました。
[Googleスプレッドシート 他のシートから特定のセルを条件付きで取ってきて表示させたい](https://chaika.hatenablog.com/entry/2015/11/26/143853)

# やり方
1. IMPORTRANGE関数を使って他のスプレッドシートからデータを取得
2. そのデータに対してQUERY関数を使って条件に合うデータを絞る
3. 条件のセルが空でなければ条件に合ったデータを入力する

## 1.IMPORTRANGE関数を使って他のスプレッドシートからデータを取得

まずはIMPORTRANGE関数を使って別のスプレッドシートからデータを取得します。
これで別のスプレッドシートの指定範囲をまるっと取得できます。

```sql:IMPORTRANGE関数
=IMPORTRANGE("spreadsheets_URL","sheet_name!A1:B70")
```
https://support.google.com/docs/answer/3093340?hl=ja


## 2.そのデータに対してQUERY関数を使って条件に合うデータを絞る

QUERY関数を使って先ほどIMPORTRANGE関数を使って取得したデータから条件に当てはまるデータを検索します。
今回はA列の値が一致したところのB列の値が欲しいので、こんな感じになります。

```sql:QUERY関数
=query(IMPORTRANGE("spreadsheets_URL","sheet_name!A1:B70"),"select Col2 where Col1 ="&B2)
```
https://support.google.com/docs/answer/3093343?hl=ja

注意すべきポイントは

- A列はCol1、B列はCol2のようにCol表記する
- B2セルを指定する時に`&`でつなげる(文字列の連結扱いなので`&`を使う)


## 3.条件のセルが空でなければ条件に合ったデータを入力する

先ほど条件に当てはまるデータを検索しましたが、条件のセルが空だった場合はエラーになってしまいます。
そこで、ISBLANK関数を使ってセルが空の場合は何もせず、何かしら入力されている場合だけQUERY関数が実行されるようにします。

```sql:ISBLANK関数
=if(ISBLANK(B2),B2が空の場合の処理,B2に値が入ってる場合の処理)
```

## 最終結果

今までのを全て組み合わせるとこんな感じになります。

```sql:完成形
=if(ISBLANK(B2),"",query(IMPORTRANGE("spreadsheets_URL","sheet_name!A1:B70"),"select Col2 where Col1 ="&B2))
```
これでB2セルに値が入っている場合だけ、sheet_nameのA1〜B70の範囲で`select B列 where A列 = B2`した結果が入るようになります。

### 補足
IMPORTRANGE関数は本家のExcelには無い機能なので、Googleスプレッドシート便利だなと思いました。
ユニットテストのカバレッジについて

# テストカバレッジとは

テストにおける確認が終わった部分の割合（**テストの網羅率**）のこと。

テスト全体に対して「これくらいカバーしてる」的な指標だったり、「テストを全部やると、これだけ確認できるはずで、今はこれだけの確認が終わってる」という目安にもなる。

英語で「coverage」は「（影響を及ぼす）範囲」を意味する。

# テストの種類

システムのテストの種類には以下の4つが一般的である。

* **単体（ユニット）テスト**：クラスや関数の単位のプログラムのテスト
* **結合テスト**：単体（ユニット）テストで検証したプログラムを組みわせて行うテスト
* **機能テスト**：結合したプログラムを1つの機能として行うテスト
* **システムテスト**：システムが仕様通りに動くかを検証するためのテスト

そして単体（ユニット）テストは以下のようにさらに細かく分類できる。

* **機能確認テスト**：1つのモジュールが設計書や仕様書通りに動作することを確認するテスト
* **制御フローテスト**：プログラムの論理構造に沿って「命令」や「分岐」などが実行されるかを確認するテスト
* **データフローテスト**：データや変数が「定義」「使用」「消滅」の順に行われているかを確認するテスト

# テスト手法

単体（ユニット）テストにおいて一般的に実施されているテスト手法として「**ホワイトボックステスト**」と「**ブラックボックステスト**」の 2 種類が存在する。

ホワイトボックステストは、「システムの中身を理解した上で、それらを意識しながら行うテスト」のことである。ホワイトボックステストを行うにあたり、論理構造（処理の流れや実行順序）を視覚化する必要がある（可視化ツールなどでコードを視覚化してもいいが、Too much すぎる気はしてる、頭の中で論理構造を構築してテストコードに落とすくらいでいい）。

ブラックボックステストは、当該ユニットの外から見た機能（入出力)に着目し、コードが期待される機能（詳細設計仕様）を満たしているかどうかを検証するテスト。いわゆる機能テストのこと。

# ホワイトボックスのカバレッジ基準

カバレッジ基準とは、テストにおいて着目する「要素」のことを指す。
カバレッジを出すのに何を基準にするか、という決めごとのようなもの。

ホワイトボックステストにおけるカバレッジ基準には以下の種類がある。

* **命令網羅 (Statement Coverage) (C0)**：すべての命令を少なくとも1回は実行するテストケース
* **分岐網羅 (Branch Coverage) (C1)**：判定条件の真・偽を少なくとも1回は実行するテストケース
* **条件網羅 (Condition Coverage) (C2)**：判定条件が複数ある場合に、それぞれの条件が真・偽の場合を組み合わせたテストケース
* **複合条件網羅 (Multiple Condition Coverage) (MCC)**：判定条件のすべての可能な結果の組合せを網羅し、かつ、すべての命令を少なくとも1回は実行するテストケース

どのカバレッジ基準を使用するかは、コードの精度やテストケースによって様々でケースバイケースな部分がある。

# テストカバレッジは100%を目指す？

まず「カバレッジが高ければソースコードの品質が高い」というのは**誤り**である。

ソースコードの品質の良し悪しに関わらず、テストケースが適切に設定されていない場合（バグを上手く捉えらないテスト）はカバレッジが高く算出されてしまう。

また、カバレッジの数値を上げる「労力」（カバレッジを100%に近づける作業）はカバレッジの数値に対して指数関数的に増加していることが報告されている。

> We also found that the test effort increases exponentially with test coverage, but the reduction in field-reported bugs increased only linearly with test coverage. This suggested that for most projects the optimal levels of coverage are likely to be well short of 100%.

> via: https://docs.microsoft.com/en-us/azure/devops/learn/devops-at-microsoft/100-code-coverage-worth-cost

カバレッジを計測する目的は「**テストが十分に網羅されていないコードを検出すること**」であり、カバレッジの数値を高くすることだけに執着することは費用対効果が低い。

カバレッジの数値を100%にする作業よりも「**テストケースのレビューに時間を割く**」方が費用対効果が高い。

目指すカバレッジの目標値は概ね「**80%台後半か90%台**」が望ましく、50%以下の場合は問題があるので見直しが必要である。

> [テストカバレッジ - Martin Fowler's Bliki (ja)](http://bliki-ja.github.io/TestCoverage/)

カバレッジ100%はテストの完了条件ではなく「**努力目標**」とすることが望ましい。

カバレッジの数値に対して盲目的になってはならない。

# 参考記事

* https://www.techmatrix.co.jp/t/quality/coverage.html
* https://qiita.com/bremen/items/8b6542467d2a0066e5af
* https://qiita.com/ktarow/items/8c3d94d6c21a0c86b799
* https://qiita.com/bremen/items/d02eb38e790b93f44728
* http://d.hatena.ne.jp/fukken/20110321/1300706153
Galaxy のadminとしてユーザーを追加する

# adminの権限でユーザーを追加しよう
これまで次の二点について解説してきた
- [ログインしているユーザーだけGalaxyを利用可能にする](https://qiita.com/percipere/items/7eefcfcfacdf270d4f56)
- [自由にユーザー登録できないようにする](https://qiita.com/percipere/items/23e76fc532a1c0df09b3)
これで、起動したGalaxyを勝手に利用される事は無くなったが、今度は利用者自身では登録ができない

上記の設定以降はAdmin権限を持つユーザーが利用者を適宜登録しなければらならい

## Galaxyのadminツールを利用して、Adminの権限でユーザーを管理する
Adminの権限を持つユーザーがGalaxyにログインした場合、上部のメニューに"Admin"が表示される
![Screen Shot 2018-12-17 at 16.51.55.png](https://qiita-image-store.s3.amazonaws.com/0/213053/d1f1aa63-9925-5c2e-d7a5-de6f2b01265d.png)

これをクリックすると下記のような表示に変わる
![Screen Shot 2018-12-19 at 10.19.31.png](https://qiita-image-store.s3.amazonaws.com/0/213053/6eac845e-1ffb-521a-7ea5-c05b8c18c6bb.png)

ここで管理可能な機能は３種に大別されていて
- Server このGalaxyで利用可能なデーターに関する設定、計算Jobの管理、リファレンス等の管理
- User Management　ユーザーの管理
- Tool Management 利用可能なツールの管理等

となっている
ここでは、User Management => Usersをクリックする
![Screen Shot 2018-12-19 at 10.19.31.png](https://qiita-image-store.s3.amazonaws.com/0/213053/2c65f61d-298d-e86b-71e3-30e9beba2063.png)

ユーザーの一覧画面になるので、"Create new user"をクリック
(表示サレテイルユーザーはそれぞれのシステムによって異なる)![Screen Shot 2018-12-19 at 11.41.49.png](https://qiita-image-store.s3.amazonaws.com/0/213053/8d99111b-731e-e758-2839-ec6e0f1b9339.png)

"Create Account"のパネルが中心に表示されるので、
"Email address:"にユーザーのメイルアドレス
"Password:"と"Confirm password:"にこのGalaxy用のパスワード
"Public name:"にこのGalaxy上で表示する名前3文字以上の名前を記入する(文字列として、英字の小文字、数字、ピリオド、アンダースコア、ダッシュが利用可能)
最後に"Submit"をクリックして登録を行う
![Screen Shot 2018-12-19 at 11.47.23.png](https://qiita-image-store.s3.amazonaws.com/0/213053/93552b78-790c-7865-7c84-5832239fbb99.png)
これで、Galaxyサーバーにユーザーを追加できる

#ユーザーの削除について
**登録したユーザーをGUI上で削除する方法は提供されていない**

今回はここまで:smile:
JavaScript で通常引数の関数呼び出しと分割代入による名前付き引数呼び出しで関数オーバーロードする

JavaScriptでは引数が固定されないので、関数オーバーロードは引数の内容をみて自分で処理わけしたりします。

で、既存の関数呼び出しと、名前付き引数での関数呼び出しをどちらも行えるようにします。

コードで示すとこんな感じにしたいということ。

```js
console.log(testAdd(10, 20));  // 30 と表示
console.log(testAdd({ valueA: 10, valueB: 20 })); // 30 と表示
```

どちらも同じ testAdd 関数ですが、通常の引数が２つの呼び出しと、名前付き引数呼び出しを共存させます。

これをどうやって実現させるかというと、下記のように行います。

```js
const isObject = function(value) {
  if (
    Object.prototype.toString.call(value) === '[object Object]' &&
    value !== null &&
    typeof value !== 'undefined'
  ) {
    return true;
  }
  return false;
};

const isArgsDestAssign = args => {
  return args.length === 1 && isObject(args[0]);
};

const argsAssign = (argsValue, valueNames) => {
  const args = Array.isArray(argsValue) ? argsValue : Array.from(argsValue);
  if (isArgsDestAssign(args)) {
    return args[0];
  }
  const result = {};
  valueNames.split(',').forEach((valueName, index) => {
    result[valueName.trim()] = argsValue[index];
  });
  return result;
};

// -----

const testAdd1 = function() {
  const { valueA, valueB } = argsAssign(arguments, 'valueA, valueB');
  return valueA + valueB;
};

const testAdd2 = (...args) => {
  const { valueA, valueB } = argsAssign(args, 'valueA, valueB');
  return valueA + valueB;
};

```

testAdd1 は、関数式(関数宣言も同じ)での、testAdd の実装。
arguments を使っています。

testAdd2 は、アロー関数での、testAdd の実装。
残余引数を使っています。

引数が1つで、中身がオブジェクトの場合と、
それ以外のときとで、変数に代入する前で、処理分岐して処理を行っています。


もっと、引数の型チェックしたい場合は、こちら参考に。よろしくです。


型チェックは TypeScript や Flow じゃなくて JavaScript にやらせる。 - Qiita
https://qiita.com/standard-software/items/0b2617062b2e4c7f1abb
Ruby on Rails 備忘録

# Rails備忘録
新規Railsアプリケーションを作ったり、開発を進める時に定常的に行っている
作業をまとめます。随時更新していきます。

## generateコマンドで生成するファイルを減らす
「bin/rails generate」コマンドが生成するファイルを減らします。

```/config/initializers/generators.rb
Rails.application.config.generators do |g|
  g.helper false # ヘルパーを作成しない
  g.assets false # CSS, JavaScript ファイルを生成しない
  g.skip_routes true # config/routes.rb を変更しない
  g.test_framework false # テストスクリプトを生成しない
end
```

## コントローラーの作成
```
# コントローラーを作成する
$ bin/rails generate controller top index

# 誤って生成したコントローラーを削除する
$ bin/rails destroy controller top index
```

アクション名を指定せずに生成し、後からメソッドを記述したりviewディレクトリに
index.html.erbファイルを作成する事もできます。

```
$ bin/rails generate controller top
```

bin/を付けずにrailsコマンドを使うと、　RubyGemsでインストールしたrailsコマンドが
動きます。bin/railsとすると、binディレクトリのスクリプトが使われます。
「generate」は「g」と省略できます。

## ルーティングの設定
作成したコントローラーをURLのパスと紐づけるためにルーティングを設定します。

```/config/routes.rb
Rails.application.routes.draw do
  root "top#index"
end
```

## データベースの作成
```
# データベースを作成
$ bin/rails db:create
# 本番用のデータベースを作成
$ bin/rails db:create RAILS_ENV=production
# データベースを削除
$ bin/rails db:drop
```

## タイムゾーンの設定
モデルを作成したりマイグレーションを行う前に、
Railsアプリケーションのタイムゾーンを設定します。

```config/application.rb
module Hogehoge
  class Application < Rails::Application
    ...
    config.time_zone = "Tokyo"
  end
end
```

## モデルの作成とマイグレーション
```
# Memberモデルの作成
$ bin/rails g model member
```

```
# マイグレーションスクリプトを作成後、さらにカラムを追加する場合
$ bin/rails g migration AlterMembers
# バーションを指定する
$ bin/rails db:migrate VERSION=xxxxxxxx
# 現在のマイグレーションのバージョンを確認
$ bin/rails db:migrate:status
# 直前に行われたマイグレーションを1つ取り消す
$ bin/rails db:rollback
# 一度に複数のマイグレーションをロールバックする
$ bin/rails db:rollback STEP=3
# マイグレーションを最初からやり直す
$ bin/rails db:migrate:reset
```

リリース後のマイグレーションは慎重に行いましょう。

**マイグレーション用メソッド**

| メソッド | 引数 | 機能 |
|:-----------|:------------|:------------|
| add_column     | (テーブル名,カラム名,型,オプション)|カラムの追加 |
| rename_column  | (テーブル名,カラム名,新しい名前)  |カラム名の変更|
| change_column  | (テーブル名,カラム名,型,オプション)|カラム型の変更|
| remove_column  | (テーブル名,カラム名)           |カラムの削除|
mixi AI ロボットチーム の「褒める組織」に 学びたい、心理的安全性を作るために一番大事なこと。抜粋学習。

# [褒める組織 - Qiita](https://qiita.com/halhorn/items/bd530a382a7f1d2f8505) by @halhorn さん

>mixi AI ロボットチーム の開発マネージャーをしているインコです。

>DeepLearning で対話ロボットを作ろうとしているインコです。 >https://www.wantedly.com/projects/92981

# 一番大事なこと

>いちばん大事なのは、相手の話に興味を持つことと、それを素直に口に出すことです。

「プラスの思ったことを口に出す」「思ってもないことを言わない」「感動を伝える」

# 入社1年目の教科書

ちょうど自分が今日読んでいた本と内容がマッチして、この記事を読んで完全同意。

>褒め言葉のコツ？感動したら人に一瞬で伝える！入社1年目の教科書。 
https://youtu.be/PcQp1kT6hP4 

[入社1年目の教科書 要約 まとめ 感想 - Togetter](https://togetter.com/li/1299861)




# 褒めることは難しい

褒めるから関係が良い、関係が良いから褒めることが効く、好循環を保とう。

>関係が悪化してしまうと、褒めることは自分を下だと認めることと感じてしまったり、逆に上から目線と感じさせる事になったりしてしまうこともあります。

いったんハンディキャップを背負ってしまうと辛い。実感。


# ポリシーを示す、文化を共有する

そもそも価値観を共有しておかなければ、何をやっているかが伝わらない。

>上に書いたような事を明示的に伝えて賛同してくれるメンバーを作るのも大事です。

# 褒める文化で起こることは「自己開示しやすくなる」

自己開示する、してもらうには、太陽と風の法則。「さあ、自己開示しろよ！」といきなり言っても無駄。地固めからやりたい。

#link
[心理的安全性yumainaura - Google Search](https://www.google.co.jp/search?q=%E5%BF%83%E7%90%86%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7yumainaura&oq=%E5%BF%83%E7%90%86%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7yumainaura&aqs=chrome..69i57.3580j1j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【社内勉強会】CSSの基本のキ

- 本記事は社内勉強会の資料です。
- だいたいの内容は[HTMLクイックリファレンス-CSSの基本](http://www.htmq.com/csskihon/)からの抜粋になります。
- 記載者はcss初心者なので内容がおかしかったら優しく突っ込んであげてください。

---
#CSSとは？
- 正式名称はCascading Style Sheets
- webページのスタイルを指定する言語です。

---
#基本書式
基本形 : セレクタ { プロパティ : 値; }

```css:css
div {
	width  : 50px;
	height : 50px;
	color  : #FFF;
}
```

---
#セレクタの種類
基本的なセレクタのみ抜粋

| セレクタ | 書式 | 適用範囲 |
|:---------:|:---------:|:---------:|
| 要素型 | `div{ ... }`など | 要素名で指定した要素 |
| 全称 |　`*{ ... }` |　全要素　|
| id | `#title{ ... }` | idで指定した要素 |
| class | `.template{ ... }` | class名で指定した要素 |

---
#まとめて書くなら
同じ内容ならまとめて書けます。

```css:css
h1, h2{ width : 50px;} /* どっちも50px */
```

---
#〇〇の要素の××について書くなら
セレクタの間にスペースで実現できる。
`.A .B`ならAクラスの子孫要素のBクラスに適用するという意味になります。

```css:css
.dialog .button{ width : 50px; } /* dialogの中にあるbuttonに適用される */
```

---
#セレクタの優先順位
スタイルの競合があった場合は、後に読み込まれたスタイルが優先されます。

```css:css
.box{ width : 50px; }
.box{ width : 100px; } /* 最終的なwidthは100pxになる */
```

---
セレクタの種類による優先順位は、id＞class＞要素名の順となります。
例えば以下のようにhtmlとcssが書かれていたとすると、最終的なwidthは50pxになります。

```css:css
#foo{ width : 50px; } /* これが適用される */
.bar{ width : 100px; }
 div{ width : 200px; }
```

```html:html
<div id="foo" class="bar" > hoge </div>
```

---
下記のような複数セレクタと単一セレクタでセレクタ名に競合があった場合は、複数セレクタが優先されます。

```css:css
.foo .bar{ width : 50px; }
.bar{ width : 100px; } 
```

```html:html
<!-- widthは50px -->
<div class="foo bar" > hoge </div>
<!-- widthは100px -->
<div class="bar" > hoge </div>
```

---
ただし、`!important`というキーワードがあると問答無用でそのスタイルに従います。

```css:css
.box{ width : 50px !important;} /* これが適用される */
.box{ width : 100px; }
```

詳しい優先順位はセレクタの詳細度に依存します。
- 参考：[詳細度](http://buburinweb.wp.xdomain.jp/css-detailing)

---
優先度計算が面倒なら[Specificity Calculator](http://specificity.keegan.st/)を使うといいと思います。

---
#継承
フォントサイズや文字の色など一部のプロパティは子要素に継承されます。

```css:css
.box{ color : red; }
```

```html:html
<div class="box">
	<!-- 文字は赤くなる -->
	<div> hogehoge </div> 
</div>
```

---
特にフォントサイズの指定が相対的な指定だと親と子の要素が掛け合わされた要素になります。

```css:css
.box{ font-size : 90%; }
.text{ font-size : 90%; }
```

```html:html
<div class="box">
	<!-- 文字サイズは90×90の81%になる -->
	<div class="text"> hogehoge </div> 
</div>
```

---
#複数のスタイルから引用
2個以上のスタイルを指定するとどちらの適用されます。

```css:css
.foo{ font-size : 16em; }
.bar{ color : red; }
```

```html:html
<!-- 文字サイズ：16em かつ 文字の色が赤色になる -->
<div class="foo bar"> hogehoge </div> 
```

---
指定に重複がある場合は先述した優先順位に従います。

```css:css
.foo{ color : blue; font-size : 16em; }
.bar{ color : red; }
```

```html:html
<!-- 文字の色は赤色になる -->
<div class="foo bar"> hogehoge </div> 

<!-- この場合も赤色になる -->
<div class="bar foo"> hogehoge </div> 
```

---
#外部スタイルシートをインポート
`@import`でほかのスタイルシートからスタイルを読み込みができます。
ただ、処理速度的にあまり推奨されていないみたいです。

```css:sub.css
.foo{ color : blue; font-size : 16em; }
```

```css:main.css
@import url("sub.css"); /* これでmain.cssでfooクラスが使える */
```

---
#参考にしたサイト
- [HTMLクイックリファレンス-CSSの基本](http://www.htmq.com/csskihon/)
- [CSSのセレクタとは？覚えておきたい25種類と書き方-サルワカ](https://saruwakakun.com/html-css/reference/selector#section7)
- [CMAN.jp-cssとは？](https://web-designer.cman.jp/css_ref/css_base/css/)
- [\[CSS\] CSSの詳細度による「適用順(優先順位)」と「上書き」](http://buburinweb.wp.xdomain.jp/css-detailing)
HTML5ゲームエンジンの徹底評価[日本語訳] (6) 各エンジンのコンセプト・設計思想・機能比較のまとめ 


- [HTML5ゲームエンジンの徹底評価 \[日本語訳\] (1) 2D・3D対応とプログラミング言語の比較](https://qiita.com/motoyasu-yamada/items/f4e03f98442b3ec164be)
- [HTML5ゲームエンジンの徹底評価 \[日本語訳\] (2) Three.jsとPixi.js](https://qiita.com/motoyasu-yamada/items/0139a933ded6f478f92a)
- [HTML5ゲームエンジンの徹底評価 \[日本語訳\] (3) PhaserとEgretEngine](https://qiita.com/motoyasu-yamada/items/0df8489e6ad3c9c8cefc)
- [HTML5ゲームエンジンの徹底評価 \[日本語訳\] (4) enchant.jsとcrafty.js](https://qiita.com/motoyasu-yamada/items/0402bf1759f823405355)
- [HTML5ゲームエンジンの徹底評価 \[日本語訳\] (5) Turbulenz, cocos2d-js, PlayCanvas, melonJS](https://qiita.com/motoyasu-yamada/items/4265dab44bf82dc27b7b)

# Quintusエンジン
Quintusは、ツールを提供していません。

# Hiloエンジン
Hiloは、ツールを提供しています。

# 結論

結果は予期しないものでした。

オープンソースゲームエンジンは、オーサリングツールを制作することは言うまでもなく、ライブラリをメンテナンスすることも開発者に大きな労力が注ぎ込まれています。多くのエンジンは、`Tiled`、`TexturePacker`等のような他の人気のなサードパーティツールに依存しています。

さまざまな機能が実装されてはいますが、開発全体のワークフローにおいては、各エンジンはおおかれ少なかれ問題を抱えています。Egretとcocos2d-jsのみが、ビジュアルオーサリングツールを提供しています。しかしながら二つのエンジンはまったく異なる考え方のものです。cocos2d-jsはUnity3Dに近いプロダクトで、巨大な統合開発環境を提供しています。Egretは、役割毎にツールが分割されています。異なる役割や開発の各プロセス毎に各ツールは設計されています。

比較すると、Egretの各ツールの役割は直交しており、各ツールはより深い機能が提供しているが、各ツールがファットにならないようになっています。

Cocos Creatorは、すべてを統合して、1つのソフトウェアですべてを解決することを目指しています。

---

続く・・・
[HTML5ゲームエンジンの徹底評価[日本語訳] (7)  パフォーマンス比較編](https://qiita.com/motoyasu-yamada/items/777b50d658d47f920a4d)
配列を指定した要素数の二次元配列に分割する

圧倒的にくだらない気がするけどググり力が足りなくて、書いた方が早いから書いてしまった
絶対もっと良い方法あるからコメントで「このメソッド一行でおk」みたいなことを教えてくれると助かります


# やりたいこと
元の要素数は分からないけどとりあえず3個ずつに分割して二次元配列にしたいよー！

```
[1, 2, 3, 4, 5, 6, 7, 8, 9] => [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] => [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] => [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11]]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] => [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
```

# ソース

## extension

`while`の無限ループと`idx`変数とかバカっぽい

```swift
extension Array{
  func split(count:Int)->Array<Array<Element>>{
    var idx = 0
    var rtn = Array<Array<Element>>()
    while idx < self.count  {
      let c = idx + count < self.count ? count : self.count - idx
      let slise = self[idx..<idx + c].map{$0}
      idx += count
      rtn.append(slise)
    }
    return rtn
  }
}

```

## テスト

```swift
  let t1 = [Int](1...9)
  let t2 = [Int](1...10)
  let t3 = [Int](1...11)
  let t4 = [Int](1...12)
  let t5 = [Int]()
  let t6 = [1]

  let b1 = t1.split(count: 3)
  let b2 = t2.split(count: 3)
  let b3 = t3.split(count: 3)
  let b4 = t4.split(count: 3)
  let b5 = t5.split(count: 3)
  let b6 = t6.split(count: 3)

  print("\(t1) => \(b1)")
  print("\(t2) => \(b2)")
  print("\(t3) => \(b3)")
  print("\(t4) => \(b4)")
  print("\(t5) => \(b5)")
  print("\(t6) => \(b6)")
```

```
[1, 2, 3, 4, 5, 6, 7, 8, 9] => [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] => [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] => [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11]]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] => [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
[] => []
[1] => [[1]]
```
Gitをシンプルに使う


## 基本的なこと

ブランチを切り替えながら作業することになるので、必ず、現在のブランチが表示されるツールで作業します。
コマンドラインであればGit Bash、IDEであればなんでもよいかと思います。

Gitは多機能で複雑ですが、Git flowの概念を理解しておくことで、シンプルに利用できます。

Git flow - https://danielkummer.github.io/git-flow-cheatsheet/index.ja_JP.html

* リモートリポジトリ
  サーバーで管理する共有リポジトリ（つまりバックアップ対象）

* ローカルリポジトリ
  自分のPCで管理する個人リポジトリ（リモートリポジトリをクローンしたもの）

* masterブランチ
  リリース済みのコードが入ったブランチ（常に動作する）

* developブランチ
  開発中のコードが入ったブランチ（リリースはしていないが常に動作する）
  ※ developブランチをつくらず、masterブランチだけで運用する場合もあります。

* feature-(機能番号)ブランチ
  修正を行っているブランチ（developブランチからブランチする）

* release-(リリースバージョン)ブランチ
  リリース作業中のブランチ（developブランチからブランチする）

* hotfix-(障害番号)ブランチ（bugfix-(障害番号)ブランチ）
  障害対策のための修正を行うブランチ

## ダメなこと

* リポジトリに中間生成物をコミットしてはいけません。（ビルドプロセスに問題が出たり、リポジトリサイズが肥大化するからです）

そのために、.gitignoreファイルに、中間生成物のファイル名、フォルダ名を記載して、コミットされないようにします。

## ローカルリポジトリにクローンする

```
git clone リポジトリ名
```

## ブランチを作成する

基本的にはチケット管理ツールと連動し、チケットからリモートリポジトリのブランチを作成します。

## ローカルリポジトリのブランチを切り替える

常にfeature/hotfix/bugfixブランチで作業します。

```
git fetch origin ブランチ名
git checkout ブランチ名
```

ここで修正作業を行ないます。

## ローカルリポジトリにコミットする

VSCodeなどのIDEで作業します。

## ローカルリポジトリのmasterやdevelopにマージする

マージ時にconflictが起きると、conflictを解消するまで、他の操作ができなくなります。
そのため、conflictをすぐに解消しないのであれば、一旦確認する手順を行ないます。

### conflictが起きてもすぐ直す場合

```
git pull origin master
```

### conflictが起きるか確認する場合

```
git fetch origin master
git merge master --no-commit
```

ここでコンフリクトが発生するか確認します。
コンフリクトが起きたら解決（修正）します。

問題なければ、

```
git merge 
```

元に戻したければ、

```
git merge --abort
```

## リモートリポジトリにpushする

```
git push origin ブランチ名
```
「タスクの転移しやすさ」でタスクを分類する 「Taskonomy: Disentangling Task Transfer Learning」

転移学習のしやすさという観点で「タスクを分類する」研究があります。
CVPR2018年ベストペーパー受賞。

### Reference
- [Taskonomy: Disentangling Task Transfer Learning](https://arxiv.org/pdf/1804.08328.pdf)

文中の図表は論文より引用しています。

この記事は、Wantedlyの勉強会で取り上げられた論文・技術をまとめたものです。
[2018年に読んだ機械学習系論文・技術まとめ at Wantedly Advent Calendar 2018 - Qiita](https://qiita.com/advent-calendar/2018/wantedly_ml)

## モチベーション
機械学習の新しい問題が出てくるたびにデータを作り学習していては、訓練データが無限に必要になってしまいます。
そこで、別なタスクのネットワークの重みを再利用する方法が転移学習で広く使われています。

人間の直感的には、タスクが似ているほど転移学習はうまくいきやすいと考えます。たとえば、画像中のオブジェクトをピクセル単位で色塗りして分類するSegmentationタスクは、画像中のエッジを見つけるタスクと「似ている」と考えるのは自然な発想です。
そこで、**「どのタスクはどのタスクに転移学習しやすいのか、最小の計算コストでタスクを解くにはどうすればいいか」**考えて実験してみたのがこの論文です。

## Taskonomy
この論文ではCV（Computer Vision）系のタスク26個を用意して、タスクAからタスクBに転移学習したときの精度の差を比較しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/64964/fc732274-7b3b-4b9d-99cc-3f8995a4a7a5.png)

設定：予算（限られた計算資源）のなかで、タスクの集合の精度を最大化する。

- 1. sourceタスクをゼロから学習する
    - 各タスクのデータセットは用意している
- 2. sourceタスクからtargetタスクへ転移学習する
    -　上で学習したモデルをEncoderとして利用して（パラメータは固定）、targetタスクのレイヤーに入力（パラメータは学習する）。
    - 一対一だけでなく、複数のSourceタスクを入力するパターン（high order）もある。この場合、複数のEncoderを結合して入力する。
- 3. 上の結果から転移しやすさを計算
- 4. 転移しやすさのMatrixから、タスクのグラフ構造を定義する

上の予算は、「ゼロから学習してもいいSourceタスクの数」と定義されます。
Taskonomyという言葉は、「転移しやすさ（転移したときのGain）」でタスクの分類を行ったところが面白いところです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/64964/797a311d-1307-27e3-fa3c-09f3e2e9bf40.png)

下のサンプルは、予算8（ゼロから学習していい数）で、Order4（最大の組み合わせ数＝4）でタスクのGainを最大化するとしたら、この転移学習をする、と解釈できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/64964/d6bd2b50-bf47-e9cd-c5b9-3893c2b45ddd.png)

オンラインで結果を見れるサイトも存在します。
http://taskonomy.stanford.edu/

## まとめと感想
人間のアノテーションタスクも得意不得意があります。例えば自動運転用に走行画像のSegmentationのデータを精度良く作るのは難しく、各社ある意味で職人芸のようなアノテータを雇ってコストをかけてデータを作っています。
コストという意味で考えたときに、人間がもっと抽象的な問題を解いてその学習結果が転移できたら上のような労働集約的な行為がいらなくなるかもしれません（全て想像です）。

この論文では、もし人間が難しくてアノテーションしやすいタスクが見つかった場合、それを効率的に転移させることもできるかもという意味で将来的に価値がある研究だと思いました。