OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu 18.04 LTS に LaTeX をインストール

# はじめに
Ubuntu 14.04や16.04などの古い環境にLaTeXをインストールする情報が多かったので、18.04にインストールしたときの情報を記述しておきます。

## 環境
- Ubuntu Budgie 18.04.1 LTS 64bit
- Windows 7 上の VMWare Workstaion 15 Player

(追記)
Windows Subsystem for Linux (WSL) で動く Ubuntu 18.04 LTS においても、同様の方法でインストールできます。 

# インストール
## aptの準備
まずは、リポジトリのアップデートとソフトウェアのアップデートを行います。

```
$ sudo apt update
$ sudo apt upgrade
```

## LaTeXのインストール
次に、LaTeXとその関連パッケージのインストールを行います。

```shellsession
$ sudo apt install \
       evince texlive-fonts-extra \
       texlive-fonts-recommended texlive-lang-cjk xdvik-ja
```

# 使い方
編集したtexファイルをhoge.texとした場合、以下のようにしてpdfに変換することができます。

```shellsession
$ platex hoge.tex
$ dvipdfmx hoge.dvi
```

コンパイルされたpdfファイルを閲覧するには、evinceを使用します。evinceを使うことで、pdfファイルを開いたまま再コンパイルすることができます。

```
$ evince hoge.pdf &
```


以上の手順でUbuntu 18.04上にLaTeXのコンパイル環境を整えることができます。
Reactで画面遷移にアニメーションをつける(TypeScript)

# はじめに
ようやくReactを触り始めました
ネットからのコピペで適当に作って「React余裕〜うぇ〜〜〜い」って思っていたら
[コレ(デモ1)](https://lucid-jackson-b8f247.netlify.com)
を
[こうしたい(デモ2)](https://vibrant-mestorf-d9c3aa.netlify.com)

画面遷移にほんのちょっとしたアニメーションをつけようとしただけで、えらく時間がかかってしまいました

# 環境(package.json抜粋)
```
  "dependencies": {
    "react": "^16.6.3",
    "react-redux": "^6.0.0",
    "react-router": "^4.3.1",
    "react-scripts-ts": "3.1.0",
    "redux": "^4.0.1",
    "typescript-fsa": "^3.0.0-beta-2",
  },
  "devDependencies": {
    "typescript": "^3.2.2"
  }
```

# ポイント
1. locationにアクセスするために、PropsをRouteComponentPropsを継承したものにする
1. CSSTransition にkeyをつけて、locationを一意にハンドリング（これをしないと、アニメーションがつかない）
1. Switch にlocationをそのままリレー（これをしないと、アニメーション起動の瞬間で古い画面が遷移先画面になる）

``` MainComponent.tsx
class MainComponent extends React.Component<IMainProps> {
    public render() {
        return (
            <TransitionGroup>
                <CSSTransition key={this.props.location.key} classNames={"pageTransition"} timeout={200} >
                    <div className={"page"}>
                        <Switch location={this.props.location}>
                            <Route exact={true} path='/' component={HomeComponent} />
                            <Route path='/home' component={HomeComponent} />
                            <Route path='/page1' component={Page1Component} />
                            <Route path='/page2' component={Page2Component} />
                        </Switch>
                    </div>
                </CSSTransition>
            </TransitionGroup>

        );
    }
}

interface IMainProps extends RouteComponentProps<{}>{
}

function mapDispatchToProps(dispatch: Dispatch<any>) {return {};}
function mapStateToProps(appState: any) {return {};}

export default withRouter(connect(mapStateToProps, mapDispatchToProps)(MainComponent));

```


# 補足
あとは、CSSTransitionの使い方にならって、適宜アニメーションのCSSを記載

``` App.css
.page {
  position: absolute;
  background-color: #fff ;
  width:100%;
}

.pageTransition-enter {
  opacity: 0;
  transform: translateX(100%);
}
.pageTransition-enter-active {
  z-index: 2;
  transition: opacity 100ms ease-out, transform 200ms ease-out;
  opacity: 1;
  transform: translateX(0px);
}
.pageTransition-exit-active {
  z-index: 1;
}

```

[すべてのソースはこちらです](https://github.com/nbfujiwara/reactSamplePageAnimate)
Kotlin＆ankoでDBアクセス

KotlinとankoでDB更新を行ったときの備忘録

社員ごとに日報を入力する

作成したファイル
NippoListDataParser（1件分のデータをNippoListDataに格納する）
NippoDatabaseOpenHelper.kt（テーブル）
NippoNyuryoku.kt
NippoData.kt(
NippoListData.kt(一覧格納用）

呼び出し順序
DB登録
NippoNyuryoku
↓
NippoDatabaseOpenHelper（インスタンス作成、DB登録）

一覧表示
Nippoichiran
↓
NippoDatabaseOpenHelper（インスタンス作成、SQL実行後結果取得）
↓
NippoListAdapter（SQL実行結果出力、R.layout.nippoichiran_cellに結果セット）
↓
activiti_nippoichiran.xml（一覧表示）
アジャイル開発で取り組んでいることそのさん

こんにちは♪
今回はアジャイル開発でとりくんでいること、そのさん！です♪

前々回はドラッカー風エクササイズ、前回はインセプションデッキの
ご紹介でした(*´ω｀*)

今回は、そのほかで取り組んでみてよかったことを
抜粋してご紹介します！


#デイリースタンドアップ
これは1日の始まりに、メンバー内で重要な情報を共有するために行います。
横文字を使うのがなんとなく恥ずかしいので、「朝会」と呼んでいます笑

共有というと会議のような、堅苦しい感じがしますが
これは1回10分もとらないで、下記の3点を共有しあうだけです。

・今日やること
・昨日やったこと
・プロジェクト進行の妨げになりそうな懸念があればなんでも話す

これで管理者以外でも、メンバーのタスクがわかりますし
当日早退予定などがあれば、ここで伝えておくのもいいと思います。


#ポイントで見積もる
各タスクができたとき、作業時間を工数で見積もるのではなく
「1ポイント」「3ポイント」「5ポイント」と
ポイントで見積もるようにしています。

こうすることによって「これは何人日かかるか」を日数で見積もるより
いわばそのタスクの「大きさ」をポイントで推し量るようなイメージです。

・1ポイント＝すぐできる
・3ポイント＝やれないことはない
・5ポイント＝かなり大変

ざっくりわけてみるとこのような感じです。
工数を出すよりもイメージがつきやすいので
このポイント分けには新卒など若手メンバーにも加わってもらいました。

もちろん各メンバーでポイントの見積もりが
最初はバラバラでもOKです。
どうして1ポイントだと思ったか、どうして5ポイントだと思ったかと
納得のいく答えがだせれば、それを話し合って最終的なポイントにすれば良いのです。


#まとめ
いかがでしょうか！
アジャイル開発で取り組んでいることをいくつかご紹介でしましたが
どれも初めて聞くこと、でも有益なことばかりです！

みなさんもぜひ取り組んでみてください(*´ω｀*)
Laravel5の複数ルーティングファイル作成時の順番について

##はじめに
Laravel5.3から`RouteServiceProvider.php`を拡張すると、複数ファイルでルーティングを管理出来るようになりました。
例えば以下のように分けることができます。

- 一般用ルーティング(web.php)
- 管理者用ルーティング(admin.php)

この時よくあるユースケースとして、サブドメイン等を運用しているとURIが重複することがあるので、順番を意識して設定する必要があります。

#環境
- Laravel 5.7
- PHP 7.2

#RouteServiceProvider.php
まずは拡張設定。
`map()`メソッドで、デフォルトの**`mapWebRoutes()`より上に**追記してください。

```php:app/Providers/RouteServiceProvider.php
public function map()
{
  $this->mapAdminRoutes(); // 追記
  $this->mapWebRoutes();
}

(中略)

// ここから追記
protected function mapAdminRoutes()
{
  Route::middleware('web')
    ->namespace($this->namespace)
    ->group(base_path('routes/admin.php'));
}
// ここまで

protected function mapWebRoutes()
{
  Route::middleware('web')
    ->namespace($this->namespace)
    ->group(base_path('routes/web.php'));
}
```

#routesディレクトリにadmin.phpを作成する
書き方は通常のルーティングと同じです。
サブドメインを使う場合は`domain`メソッドを使います。

```php:routes/admin.php
<?php
Route::domain('admin.hogehoge.com')->group(function () {
  Route::get('/', 'AdminController@index');
});
```

元の`web.php`に同じURIを設定し、ルーティング先には異なるコントローラーを指定してみます。

```php:routes/web.php
Route::get('/', 'PageController@index');
```

以上の設定で、

- `http://admin.hogehoge.com` の場合は`AdminController@index`
- `http://hogehoge.com` の場合は`PageController@index`

にルーティングされるようになりました。

##ルーティングは先に記述されたほうが優先される

`RouteServiceProvider.php`で`mapWebRoutes()`を先に読み込んでしまうと、サブドメインでのアクセス時も`PageController@index`にルーティングされてしまいます。
これは単一ファイルで運用した場合でも同様、先に記述したほうが優先されます。

##結論
システムが大きくなってくると、Routeファイルが何百行にもなったりgroupメソッドのネストなどが増えやすいので、複数ファイルで管理できるのはスッキリして良いですが、その際は読み込み順番を気にしましょう。
BHyVeとZFSで、とてもお仕事が捗った話

# はじめに

[BHyVeお手軽スクリプト](https://qiita.com/belgianbeer/items/5ddf8751580e8d6b651e)を作って以来、手元ではVMをホイホイ動かしたり止めたりしています。ここではそのBHyVeお手軽スクリプトとZFS環境が製品開発に大変役に立ったという実例を紹介したいと思います。

# アプライアンス開発のステップ

製品としてのアプライアンスを作る場合、最終的に出荷イメージを作りハードウェアに展開する形になると思います。出荷イメージの開発作成はこんな流れになると思います。

1. OSの基本部分をインストールする
2. OSの標準的な追加アプリケーションをインストールする。
3. OSの動作に必要な設定を行う。
4. アプライアンスに必要なアプリをインストールする
5. アプライアンスのアプリの動作設定を行う
6. アプライアンスとしての動作試験を行う
7. 出荷イメージを作る

各ステップでは、動作確認を行い動作が確認してOKであれば次へ、BADであれば前に戻ってやり直しとなるわけです。

ここで問題となるのは、BADで前のステップに戻る場合です。

コマンドを1個インストールして、その設定ファイルを書き換えた程度であれば、前のステップに戻るのは比較的簡単です。しかしながら複数のコマンドをインストールしていろいろ設定ファイルを書き換えた場合などは、前のステップに戻るのは容易ではありません。とくにPostgreSQLなどのデータベースが関係するような場合、データベースの内容を以前の状態に戻すのは困難な場合もありえます。そこで威力を発揮するのがBHyVeとZFSボリュームの組み合わせです。

# BHyVe と ZFSボリューム

BHyVe では、ディスクイメージに ZFSボリューム が利用でき、ZFSでは ZFSボリュームに対してもスナップショットが作成できます。つまり この組み合わせの場合、BHyVeで動いているVMの状態をZFSのスナップショットで簡単に保存できることになります。

具体的には前述の各ステップで、動作確認を行った段階で一旦VMをシャットダウンして スナップショット を録ります。こうすることで、次のステップを試し、うまくいかなくて以前の状態に戻すのは、直前に録ったスナップショットにロールバックすることで簡単に実現できます。

実は[BHyVeお手軽スクリプト](https://qiita.com/belgianbeer/items/5ddf8751580e8d6b651e)には当初

- VMNAME-snapshot
- VMNAME-rollback

のコマンドはなく、アプライアンスを開発していて必要になって用意したという経緯があります。

# BHyVeお手軽スクリプトとsudoの設定

アプライアンスの場合、開発者が root 権限で次のコマンドが利用できるように、sudo を適切に設定します。

- VMNAME-boot
- VMNAME-console
- VMNAME-rollback
- VMNAME-shutdown
- VMNAME-snapshot

具体的にはこのような設定になっていました。

user-a が VM名 debian0 で開発をする場合の設定例

```
belgianbeer@host$ cd /usr/local/sbin
belgianbeer@host$ ls -l vm-control debian0*
lrwxr-xr-x  1 root  wheel  10 Sep  7  2017 debian0-boot -> vm-control
lrwxr-xr-x  1 root  wheel  10 Sep  7  2017 debian0-console -> vm-control
lrwxr-xr-x  1 root  wheel  10 Sep  7  2017 debian0-rollback -> vm-control
lrwxr-xr-x  1 root  wheel  10 Sep  7  2017 debian0-shutdown -> vm-control
lrwxr-xr-x  1 root  wheel  10 Sep  7  2017 debian0-snapshot -> vm-control
-rwxr-xr-x  1 root  wheel  72 Sep  7  2017 vm-control
belgianbeer@host$ cat vm-control
#!/bin/sh

export PATH=~belgianbeer/bin/bhyve:$PATH
exec ${0##*/} "$@"
belgianbeer@host$
```

sudoの設定はこんな感じ

```
belgianbeer@host$ cat /usr/local/etc/sudoers.d/user-a
user-a ALL=(ALL) NOPASSWD: \
        /usr/local/sbin/debian0-boot, \
        /usr/local/sbin/debian0-console, \
        /usr/local/sbin/debian0-rollback, \
        /usr/local/sbin/debian0-shutdown, \
        /usr/local/sbin/debian0-snapshot
belgianbeer@host$ 
```

これで user-a は、パスワード無で、debian0のVMの起動、停止、スナップショットの作成、ロールバックを自由に行えます。

もちろんあらかじめ設定済みのVMのZFS Volumeがあれば、それをcloneすることで設定済みの続きから作業が行えます。この機能もこのような開発には**とても有効**です。

# 開発者に使わせてみた反応

実際にこの環境を社内の開発者に利用してもらいアプライアンスの開発を行ったところ、ものすごく感動してくれてます。

「これ凄いです！」「便利です！」「効率良いです！」「１日かかる作業がすぐすみます」

そして「FreeBSD使いたいです。勉強したいです。」と言ってくれました。

開発者「FreeBSDの勉強する本ありますか?」
みんみん「そーいうの無いから」 (ボソ)

Merry Christmas and Happy New Year! 
皆様、よいお年を！
[簡単まとめ] Tokyo HoloLens ミートアップ vol.11　忘年会スペシャル！

# はじめに

2018/12/15に行われたイベントの大まかなまとめです。後から振り返る時などに使ってください。

Tokyo HoloLens ミートアップ vol.11　忘年会スペシャル！ - connpass
https://hololens.connpass.com/event/106177/

## Keynote

今回のMeetUpは#GlobalMRBootcampと評して全国で一斉に行われていたらしく、Keynoteがありました。
開発者コミュニティなど、みんなで盛り上げていこうというエモい話をしていました。

Global MR Bootcamp keynote - YouTube
https://www.youtube.com/watch?v=oG0D246y1aU

動画は英語ですが、当日はHoloLab武仙さんの解説と一緒に聞きました。

## 軍艦島のガンショーくん 開発知見苦労話★濃縮★大公開！

軍艦島を使ったHoloLensのアトラクションの開発・運用のノウハウの話です。
空間シェアリングの話やアテンドなど、多岐にわたる話が聞けました。
Daydreamコン使ってる話やブルーム検知対策など面白かったです。

この辺の流れ
2018/12/15(土) Tokyo HoloLens ミートアップ vol.11 まとめ (3ページ目) - Togetter
https://togetter.com/li/1298832?page=3

動画このへんから
https://youtu.be/SDU6lzgFebc?t=685

## HoloLabから見た2018年

HoloLab中村さんによる全体的な話。
他業種(建築系など)とソフトウェアエンジニア系、CG系を渡ってどういった課題や可能性があるか、という話が面白かったです。

資料
HoloLab 2018
https://www.slideshare.net/kaorun55/hololab-2018

この辺の流れ
後半には会場とのQ&Aも。
2018/12/15(土) Tokyo HoloLens ミートアップ vol.11 まとめ (6ページ目) - Togetter
https://togetter.com/li/1298832?page=6

## (余談)LTしました

LT枠が12個ほどあり、その中の一つでLTさせていただきました。

HoloLensでバーチャルYouTuber - Speaker Deck
https://speakerdeck.com/nkjzm/hololensdebatiyaruyoutuber

# 感想

2回目の参加でしたが、和気あいあいとした雰囲気でゆるゆると進行するイベントでした。
プレゼンやLT、デモ展示などを通していろいろな交流が生まれていて、とても楽しかったです。
AWS-CLIのコマンド

## 概要
コマンドをすぐ忘れるのでメモっておく。
( また、覚えたコマンドを随時追加していく )

## ヘルプ
下記コマンドにてヘルプを確認できるようです。

```bash:ターミナル
$ aws help
```

EC2のコマンドについてなどは、下記のように更に階層を深くしてhelpを実行する。

```bash:ターミナル
$ aws ec2 help
```

## 基本設定
awscliの環境設定を操作するコマンド。
### 設定の登録
デフォルト設定を登録する。

```bash:ターミナル
# デフォルト設定
$ aws configure
```

プロファイルを指定して設定を登録する (ex: hoge)

```bash:ターミナル
$ aws configure --profile hoge
```

### 設定の確認
デフォルト設定の確認する。

```bash:ターミナル
$ aws configure list
```

プロファイル指定して確認する (ex: hoge)

```bash:ターミナル
$ aws configure list --profile hoge
```

## Amazon S3
`Amazon Simple Storage Service`についてのコマンド
### 内容確認
中身を確認してみる。

```bash:ターミナル
$ aws s3 ls

# バケットを指定する場合
$ aws s3 ls s3://{$my-bucket}
```

### アップロード
指定のフォルダ($my-folder)にアップロードする。
※ 例は、並列オプション（--recursive）を指定している

```bash:ターミナル
$ aws s3 cp myfolder s3://{$my-bucket}/{$my-folder} --recursive
```

## ダウンロード
データをローカルにダウンロードする。
※ 例は、ログファイルを除外するようにオプション指定している

```bash:ターミナル
$ $ aws s3 sync myfolder s3://{$my-bucket}/{$my-folder} --exclude *.log
```

## Amazon EC2
`Amazon Elastic Compute Cloud`についてのコマンド
### インスタンスの確認(一覧)
項目を絞り込むときは、jqコマンドを利用しています。

```bash:ターミナル
$ aws ec2 describe-instances

# 表示項目絞り込み (インスタンスIDのみ)
$ aws ec2 describe-instances | jq '.Reservations[].Instances[].InstanceId'
"i-0023**************"

# 表示項目絞り込み (インスタンスID + インスタンスタイプ + プライベートIP)
$ aws ec2 describe-instances | jq '.Reservations[].Instances[] | {InstanceId, InstanceType, PrivateIpAddress}'
{
  "InstanceId": "i-0023**************",
  "InstanceType": "t2.micro",
  "PrivateIpAddress": "172.0.30.11"
}
```

### インスタンスの確認(詳細)
```bash:ターミナル
$ aws ec2 describe-instances --instance-ids {インスタンスID}
```

### セキュリティグループを確認
```bash:ターミナル
# デフォルト
$ aws ec2 describe-security-groups

# 表示項目絞り込み (グループ名 + 説明 + グループID + VpcID)
$ aws ec2 describe-security-groups | jq '.SecurityGroups[] | {GroupName,Description,GroupId,VpcId}'
```

## 参考サイト
- [AWS コマンドラインインターフェイス](https://aws.amazon.com/jp/cli/)
- [AWS CLI - Command Reference](https://docs.aws.amazon.com/ja_jp/cli/latest/reference/index.html)
- [AWS CLIを使ってEC2インスタンスの情報を取得する](https://qiita.com/toshiro3/items/37821bdcc50c8b6d06dc)
DeepLearning 初心者まとめ

ゼロから作るDeep Learning(O'REILLY)を読んで、自分なりにまとめてみます。
まだ途中です。（4章）

## パーセプトロン

複数の信号を入力として受け取り、ひとつの信号を出力する。
信号とは「流す/流さない（1か0か）」のこと。
入力信号…ニューロンに送られる際に固有の重みが乗算される。
複数の入力信号の総和が計算され、閾値を超えた場合、1を出力する。
重み…wは入力信号への重要度をコントロールするパラメータとして機能する
バイアス…出力信号が1を出力する度合いを調整するパラメータとして機能する
単層パーセプトロンで、ANDやORなどの論理回路を表現できる、つまり、線形領域だけ表現できる。
多層パーセプトロンは、非線形領域を表現可能にし、XORゲートの表現もできる

## ニューラルネットワーク
2層ネットワークは、入力層、中間層、出力層で構成される。

### 活性化関数
入力信号の総和を出力信号に変換する関数 h(x)のこと。

`y = h(a)`

aは、入力信号の総和（＝ノード）、yは関数によって変換されたノード
**シグモイド関数**

```
import numpy as np
def sigmoid(x):
	return 1 / (1 + np.exp(-x))
```

**ステップ関数**

```
def step_func(x):
	if x > 0:
		return 1
	else:
		return 0
```

ニューラルネットワークでは、活性化関数には非線形関数を用いる。

**ReLU関数**

```
def relu(x):
	return np.maximum(0, x)
```

入力が0を超えていれば、そのまま出力。0以下なら、0を出力する。

**恒等関数**
出力層の活性化関数　σ()（シグマ） 隠れ層の活性化関数と異なる
恒等関数は入力をそのまま出力する関数

**多次元配列**
配列の次元数 np.ndim()関数
配列の形状 インスタンス変数 shape から得る。 A.shape
行列の積　左側の行列の行と右側の行列の列の間の要素ごとの積の和によって計算する。
np.dot ドット積　1次元配列の場合はベクトル、2次元配列の場合は行列の積を計算する。
別の形状の行列の積　例えばAの1次元目、Bの0次元目の値が一致しないとエラー。計算されるCはAの行数とBの列数から構成される。対応する次元の要素数を一致させる。
出力層で利用する関数（恒等関数・ソフトマックス関数）

**ソフトマックス関数**
ニューラルネットワークは分類問題と回帰問題で用いることができる。出力層の活性化関数は一般的に、回帰では恒等関数、分類ではソフトマックス関数を使う。出力は、0から1.0までの実数になるので、確率として解釈できる。

```
def softmax(a): *オーバーフロー未対策
	exp_a = np.exp(a)
	sum_exp_a = np.sum(exp_a)
 	y = exp_a / sum_exp_a

	return y
```

### 機械学習のフェーズは「学習」「推論」（分類）
機械学習はデータが命。データから答えを探し、データからパターンを見つけ、データからストーリーを語る。
### 推論
推論フェーズではソフトマックス関数は省略する。
ニューラルネットワークの推論処理は、**順方向伝播(forward propagation)**という。学習では、訓練データでの重みパラメータの学習、推論時には、学習したパラメータを使い入力データの分類を行う。
**正規化**
データをある決まった範囲に変換する処理
**前処理**
ニューラルネットワークに入力データに対して、何らかの決まった変換を行うこと。
**バッチ処理**
データ転送がボトルネックになる場合、負荷を軽減できる。
### 学習
特徴量の抽出まで機械が行う＝ニューラルネットワーク（ディープラーニング）
訓練データ（教師データ）、テストデータ
過学習
**損失関数**
「学習」とは訓練データから最適な重みパラメータの値を自動で獲得すること。
損失関数を基準として、その値が最も小さくなる重みパラメータを探し出す。
~2乗和誤差~

```
def mean_squared_error(y, t):
	return 0.5 * np.sum((y-t) **2)
```

*one-hot表現*
正解ラベルを1として、それ以外は0で表す表記法
~交差エントロピー誤差~

```
def cross_entropy_error(y, t):
	delta = 1e - 7
	return -np.sum(t * np.log(y + delta))
```

*ミニバッチ学習*
Gradleが参照するリポジトリの優先順位について

# TL;DR

Gradleが参照するリポジトリの優先順位は定義した順です。



https://twitter.com/mike_neck/status/1074545952038375425


# 説明

投稿時点最新バージョン(5.0)のGradleのドキュメントに以下のように書かれています。

> A project can have multiple repositories. Gradle will look for a dependency in each repository in the order they are specified, stopping at the first repository that contains the requested module.

https://docs.gradle.org/5.0/userguide/dependency_management_for_java_projects.html#sec:repositories_java_tutorial

なので、以下のように書いている場合は

```gradle
repositories {
    google()
    mavenCentral()
    jcenter()
}
```

1. Google
2. Maven Central
3. JCenter 

の順に優先されます。  
Googleで見つからなければMaven Centralへ、Maven Centralで見つからなければJCenterへ…といった感じで依存関係の解決を試みます。

また、上記の他にも以下のような優先順位決定のルールが存在します。

* アーティファクトのみ(jarだけなど)より、メタデータファイル(pomなど)が存在するモジュールを優先する
* モジュールが依存しているものは、同じリポジトリから依存関係を解決する

詳細は以下のドキュメントを参照してください。

* https://docs.gradle.org/current/userguide/introduction_dependency_management.html#sec:dependency_resolution
* https://docs.gradle.org/current/userguide/declaring_repositories.html#sec:declaring_multiple_repositories

# 調べた背景

GitLabでAndroidのビルドを行っているのですが、ビルドが不安定で2回に1回程度の頻度で失敗していました。
  
失敗しているジョブを確認すると、取得しにいくjarは異なれどJCenterにjarを取りにいくところで `403 Forbidden` になっていることは共通しており、JCenterが不安定なんだなと判断しました。

ただ、JCenterにしか無いjarが存在していたため、リポジトリから外すことが出来ず、なら優先順位を下げられないか？と考えたのが調査した背景です。

# まとめ

調べた結果は上述した通りです。

JCenterから取得する箇所は残っているものの、格段にビルドが安定しました。

まだ安定しない場合は、インハウスリポジトリとしてNexusをたてているので、Nexusをプロキシリポジトリにしてしまおうかと考えています。

# 経験者つよい

403でハマってて同僚に相談に行ったら「同じとこ(サーバー)でエラー出てない？」と含みのある感じで聞かれました。最初から完全にJCenterを疑ってたし正解だし凄い…

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">jcenterこのやろう</p>&mdash; てんてん😇 (@tenten0213) <a href="https://twitter.com/tenten0213/status/1072812819547021314?ref_src=twsrc%5Etfw">2018年12月12日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">jcenterでハマっている人を見ると、親近感を覚える</p>&mdash; かずひら (@kazuhira_r) <a href="https://twitter.com/kazuhira_r/status/1072877864985325568?ref_src=twsrc%5Etfw">2018年12月12日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
e.printStackTrace() と android.util.Log をつなぐ

```java:IDE-default
try {
  ...
} catch (Exception e) {
  e.printStackTrace();
}
```
例外送出するコードを開発環境にお任せで保護させると、こんな感じのガード文が出てくる。

しかし Android には標準出力や標準エラー出力がないため、この `printStackTrace` はどこへとも知れず、電子の闇に葬り去られる。

以下のようにすると Logcat で例外の内容を見られるようになるので、デバッグが捗る（かもしれない）。

```java:with-Logcat
try {
  ...
} catch (Exception e) {
  e.printStackTrace(new PrintWriter(new Writer() {
    private final StringBuffer buffer = new StringBuffer();

    @Override
    public void write(char[] cs, int offset, int length) {
      buffer.append(cs, offset, length);
    }

    @Override
    public void flush() {
      Log.e("Exception", buffer.toString());
      buffer.setLength(0);
    }

    @Override
    public void close() {
    }
  }, true));
}
```
（`StringBuffer` を経由せず `write` で直接 `Logcat` に転送するのでもいい。 Error で出力するのか Information とするか、はたまた Debug か。それからタグをどうするか。お好みで調整してください）
Android7以上の端末でもCharlesで通信を確認できるようにする方法

Android7以上(compileSdkVersion:24以降)でも通信をCharlesで確認できるようにする設定を備忘録として記載しようと思います。
#準備
予め下記の設定を行い、セキュリティ構成ファイルの追加を行って下さい。
1.AndroidManifest.xmlに下記を書き足す。

```xml
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config"
                    ... >
        ...
    </application>
</manifest>
```
2.セキュリティ構成ファイルとしてnetwork_security_config.xmlを下記のようなディレクトリになるように作成する。
`res/xml/network_security_config.xml:`

あとは下記から自分の用途にあったセキュリティの設定を行い、Android7以上端末でも通信をCharlesでも確認できるようにします。
#デバック時のみ確認を行う場合
デバック時にどの端末でも確認できるようにしたい場合はnetwork_security_config.xmlを下記のようにして下さい。

```xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="system"/>
        </trust-anchors>
    </base-config>
    <debug-overrides>
        <trust-anchors>
            <certificates src="user" />
        </trust-anchors>
    </debug-overrides>
</network-security-config>
```
#Charlesの独自証明書をインストールした端末のみ確認を行う場合
デバック時にCharlesが発行した独自証明書がインストールされた端末のみ通信を確認ができるようにする場合は下記のようにして下さい。
1.まずはCharlesのメニューからhelp→SSL Proxying→Save Charles Root Certificateを選択し証明書を保存して下さい。
<img width="1272" alt="スクリーンショット 2018-12-16 14.52.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/163140/f7123bfb-a912-26f9-a95d-09a10d4cce3e.png">

2.保存した証明書を「charles_ssl_proxying_certificate」というファイル名に変更して下記のようなディレクトリになるように追加して下さい。
`res/raw/charles_ssl_proxying_certificate:`
(※ファイル名に「-」が使えない点と、追加時に拡張子を付けないように気をつけて下さい)

3.最後にnetwork_security_config.xmlを下記のようにしてデバック時に追加した証明書を信頼するように設定します。

```xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="system"/>
        </trust-anchors>
    </base-config>
    <debug-overrides>
        <trust-anchors>
            <certificates src="@raw/charles_ssl_proxying_certificate"/>
        </trust-anchors>
    </debug-overrides>
</network-security-config>
```

#Android6以前のようにリリース時も確認できるようにする方法
デバック時リリース時の両方で確認が行えるようにしたい場合はnetwork_security_config.xmlを下記のように設定して下さい。
(※リリース時でも確認できるようになってしまう分、セキュリティ面では弱くなってしまいます)

```xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="system"/>
            <certificates src="user" />
        </trust-anchors>
    </base-config>
</network-security-config>
```
Oracle Blockchain Cloud Service 触ってみた（Dataspiderとの連携もちょっと紹介）

この記事は[Oracle Cloud Advent Calendar 2018](https://adventar.org/calendars/3077) 12/19日の記事です。

### OBCSとは
Oracle Blockchain Cloud Serviceの略でHyperledger fabricのマネージドクラウドサービス
Hyperledger環境を管理するコンソールが提供されており、GUI操作でPeerやチェーンコードの管理が可能となっている。

### インスタンスの作成

- 名前やPeer数を入力して作成
  - 【Service Name】はそのまま組織の名前になる
  - 【Create a new Network】にチェックをつけない場合、Ordererは作成されず、別組織に参加する前提でインスタンスが作成される
  - Peerの数は2~14の制限
![025b9b9a035d7cfd26a391247b99dad5.PNG](https://qiita-image-store.s3.amazonaws.com/0/206219/e12e822e-0e39-85c2-adcf-f4f5e8b13f23.png)

- 作成が完了すると以下のリソースが配置される
  - 作成完了までに約40~50分程度かかる
  - 膨大なリソースが確保されているがユーザーからは操作できない（バックアップや可用性のために確保されている）
  - 各インスタンスのメニューからOABCSコンソールへ遷移
　![4af25d43394ada1965418f9fbdda95f6.PNG](https://qiita-image-store.s3.amazonaws.com/0/206219/58af9a04-f2d6-e268-4500-4bc78ea12f6e.png)

### チェーンコードのデプロイ

- Goファイルをzip化してデプロイ
    - バージョン管理もしてくれるのでありがたい
- node.jsベースのチェーンコードのデプロイに対応
  - 実際のjsファイルとpackage.jsonをzip化したものをデプロイする方式
  - package.jsonにはchaincode.shim等のモジュールを依存関係に記載するが、解決に時間がかかるためコンソール上ではタイムアウトエラーが表示されるがしばらくするとinstantiateが完了している。
  - サンプルは[こちら](https://github.com/hyperledger/fabric-samples/tree/release-1.2/chaincode/fabcar/node)

### REST PROXY

- リクエストにBASIC認証を用いる必要がある
  - ID/PASSはOracle Cloudへのログインに使用するものと同じ
  - Oracle Identityというサービス（AWSでいうIAM）を使ってユーザーを追加したり、ロールを設定したりしてパーミッション管理を実現する
      - <組織名>managerのコンソールからIdentityサービスで作成したユーザーへのロールを設定する
  - REST通信を用いて他のOracle Cloudサービスや他システムと連携する

### 課金関連

- 1時間500トランザクションごとに日本円で60円の課金単位
- 注意点
  - 0トランザクションでも１時間当たりの課金は適用されるので１日あたり1,440円は最低でも課金される
  - 1インスタンス当たり最低でも月額約43,200円
  - queryに関しても１トランザクション扱い
  - 1ユーザートランザクションの裏ではエンドースメントPeerによるエンドースメントと台帳を共有しているPeerによるコミットがそれぞれの数によって内部トランザクションが発生し、それらも課金対象となる

### 既存システムとの連携
ブロックチェーンをエンタープライズ領域で活用しようとすると避けられないのが既存システムとの連携です
既存システムとブロックチェーンを連携させるには
・連携するブロックチェーン基盤の仕様に合わせたプログラム開発
・各ブロックチェーンに精通したエンジニアやコンサルタントの確保
などが必要になってきます

[DataSpider Servista](https://www.hulft.com/software/dataspider)  for Blockchain Adapterはノンプログラミングでブロックチェーンと既存システムの連携を可能にします。
[Innovation Summit Tokyo 2018](https://www.oracle.co.jp/campaign/innovation/2018/index.html)で発表した[資料](https://www.oracle.co.jp/campaign/innovation/2018/pdfs/ist18_d-2.pdf)も公開されていますので良ければご覧ください。

## まとめ
環境はOBCSで、チェーンコード実行や既存システムとの連携はDataspiderでイイ感じにシナジーがうまれそうです。
まだまだ国内Hyperledger fabricの事例はPoC段階で、多くの企業がその先のステップに進むために試行錯誤している段階だと思います。
OBCSのようなマネージドサービスを活用することで環境構築のコストを減らし、本来の検証にコストをかけることによってビジネス化へのスピードを加速させることができると期待しています。

### 参考ドキュメント

- [公式マニュアル](https://docs.oracle.com/en/cloud/paas/blockchain-cloud/index.html)
- [REST API仕様書](https://docs.oracle.com/en/cloud/paas/blockchain-cloud/rest-api/index.html)
- [サービス概要](https://cloud.oracle.com/en_US/blockchain)
PostgreSQLのDBをgzip形式でバックアップ・リストア

# やること

ただ単純にPostgreでDBのバックアップとリストアを行います。

## １．バックアップ

```
$ pg_dump -U [ユーザ名] [db名] | gzip > [ファイル名.gz]
```

## ２．DB内データ削除
```
$ psql -U [ユーザ名] [db名]
> SELECT current_schema;
> DROP SCHEMA public CASCADE;
> CREATE SCHEMA public;
```

## ３．リストア
```
$ gzip -cd [ファイル名.gz] | psql -U [ユーザ名] -d [db名]
```
繰り返し処理で書かれてたりする'&'に関する自分用メモ

# 前置き
使っておきながら`&`って何？って思ってたので軽く調べて考えた。
軽〜く調べて軽〜く考えただけなので違うかも。
追い追い修正していくつもりはある。

# 本題
##(&:method)
```ruby
nums = [1, 2, 3]
nums.map(&:to_s)
#=> ["1", "2", "3"]
```
こっちは割とすぐに(使い方だけ)覚えた。

```ruby
nums.map { |n| n.to_s }
#=> ["1", "2", "3"]
```
と同じ。
毎回メソッドを1つ実行する処理を短く書ける。
`nums.map(&:to_s)`の引数部分はString型になってる訳ではないので注意。
`&:to_s`は実際には`&:to_s.to_proc`が期待されるから
`:to_s`に対応するprocオブジェクトをブロックとして使いますよ！
みたいなことが書かれている...のかな。
だから`nums.map(&:to_s.to_i)`なんてやってもエラーになるよ。

##(&proc)
```ruby
words = [World, Japan, Ruby]
hello = proc { |x| "Hello #{x}!" }
words.map(&hello)
#=> ["Hello World!", "Hello Japan!", "Hello Ruby!"]
```
引数部分を()含め丸ごとブロックと入れ替えたのと同じって感じ。

```ruby
words.map { |x| "Hello #{x}!" }
#=> ["Hello World!", "Hello Japan!", "Hello Ruby!"]
```
いまいちよくわかってなくてあまり使ってなかったけど、ちゃんと理解すれば簡単(？)
やってること自体は`&:method`と同じでしかも基本形はこっち。
これはこれと一緒みたいなのがあるとやっぱりわかりやすい気がする。

#まとめ
正直完全な理解はできてないかも。言語化も難しい。
なんとなく`&`をprocオブジェクトの前に付けることで、
procオブジェクトをブロックとして使っているといったところだろうか。
`&proc`は見たまんまそうだし、`&:method`も実行時は
`&:method.to_proc`が期待されるとかでブロックを渡していることになるな。

こんな記事読んでヘェ〜ってなる人は「そもそもprocとは...」みたいなところがあるかもしれないけど
簡単に言えばブロックをオブジェクトとして作成しておけるものみたいな感じよきっと。
事前にブロックをオブジェクトとして用意しておけば、
今回のようにブロックとして使用する際に使いまわせて再利用性が高まるぜ！ってことよね。
Angular6 で俺式 KOAN スタック Webアプリを構築する、ほぼ全手順（概要）

## この記事の概要
個人的によく書いている「俺式」シリーズ。
[Angular6](https://angular.jp) で KOAN スタック Web アプリを作成する手順の備忘録。

以前までの経緯は、[こちらの記事](https://qiita.com/tomy0610/items/feaf4ced2ccb66373c15) を参照。

手順のうち、下記の内容を記載する

- Angular (v6) でのフロントエンド構築
- Koa (v2) で Web サービス, APIルーティングを構築
- その他、サーバサイドの簡単なバックエンド構築
- つまり、結果的に Web アプリのスケルトン的なものが完成する

加えて、以下、留意点。

- 外接部 (DB接続処理) の内容は今回書かない
- コンパイルに Webpack は一切使っておらず、 tsc のみ利用
- PWA (Progressive Web Apps) はあんま意識してない、ただの Web アプリ
- 今のところ GitHub などでソース公開はしてない (それだと勉強・理解にならないので)

## 前提
以下の環境で構築した。

- マシン：MacBook Pro (Retina, 15-inch, Mid 2015)
- OS：macOS High Sierra (v10.13.6)
- Node.js：v8.12.0
- Angular：v6.1.10
- Angular CLI：v6.2.6

上記のミドルウェア環境が未構築の場合は、公式ガイド等を参照してインストールしてください。
最低限、上記の前提が整ったものとして、作業手順を記載しています。

## Express ではなく Koa を利用

ほとんどの記事では、Node.js の Web フレームワークとして、Express を使用した記事になっている。
古いバージョンは async/await が標準には無かったが、どっかのバージョンからはもう Express でも問題なく書けるようになり、より使いやすくなった。

ただ、もともとは、欲しい機能ほぼ全部盛りの「フルスタック フレームワーク」だったはずだが、v4 からは一部機能が分割され、使う機能によっては別途インストールが必要になるという中途半端な仕様になった。
何が入ってて、何が別インストールなのかわかりづらいので扱いづらい・・・。

ということで、Express を使った MEAN スタックではなく、同じ Node.js の Web フレームワークで、より軽量な [Koa](https://koajs.com) を使った KOAN スタックにする。

## 構築手順
実際に構築する内容。
量が多いので、記事を分ける。

|手順|作業|内容|
|:---:|:---|:---|
|1|[Web アプリのベース構築](https://qiita.com/tomy0610/items/a1d28655da9f07068f8c)|Angular6 でのフロントエンド構築と Koa でのバックエンド構築を行い、簡単なクラサバ通信を行う。|
|2|[アプリの daemon（デーモン）化と環境変数操作](https://qiita.com/tomy0610/items/2ca951f8e511f9f477e8)|Web アプリの daemon（デーモン）化を行う。また、環境変数を操作し、アプリ実行モードによって色んな設定値を呼び分けられるようにする。|
|3|[クラサバ通信の呼び分け部分の作成](https://qiita.com/tomy0610/items/15241a615d107ec99613)|フロントにサービスを作成し、バックエンドのAPIルーティングを整備し、細かくクラサバ通信ができる様にする。|
|4|[ロギング機構をつくる](https://qiita.com/tomy0610/items/b042290322527c627633)|HTTP 通信が発生した場合や、例外発生時などにログが残るようにする。|
|5|[セッション管理を行う](https://qiita.com/tomy0610/items/3ef7d6d27ea534146c9a)|`koa-session` を使用してセッション管理機能を作る|
webpackを利用したvuejsでherokuの環境変数を利用する

## herokuの環境変数からvuejsへ変数をバイパスする
- herokuに設定した環境変数は、そのままではwebpackを利用したvuejsでは利用できません。
- vuejsの環境変数とherokuの環境変数を繋げるため、vueの環境変数ファイルで、環境変数をバイパスしてあげる必要があります。
- herokuは NODE_ENV=production で動作する前提なので、prod.env.jsに書いています。


```js:prod.env.js
module.exports = {
  NODE_ENV: '"production"',
  REST_API_URL: JSON.stringify(process.env.REST_API_URL)
}
```

- 上記のように prod.env.js上で REST_API_URL へ process.env.REST_API_URL をバイパスします。
- そしてこれを利用したいところで、普段と同じように process.env で利用します。

```js:some_useful_service.js
const restApiUrl = process.env.REST_API_URL
```


## ローカル環境で変数を設定する

- ローカルで環境変数を入れてあげたい場合は、heroku localコマンドを通して実行する方法も使えます。
- heroku localコマンドを通すと .envファイルが読み込まれます。
- .envファイルに KEY=VALUEの形式で環境変数を書いておきます。
- .envは.gitignoreに追加しておき、gitには上げない運用の方がやりやすいと思います。
- https://devcenter.heroku.com/articles/heroku-local

```bash:.env
REST_API_URL=https://restful-sample.com
```

- Procfileに以下の開発用のコマンドを追加してあげます。
- コマンドの名前はご自由にどうぞ。

```bash:Procfile
web-dev: npm run dev
```

- ローカルでは上記のweb-devを使って、サービスを起動できます。
- 起動時に .env が自動的に読み込まれます。
- ポートを変更したい場合は -p オプションで指定してください。

```bash
heroku local web-dev -p 8080
```

- ローカルマシンの環境変数に設定して、npm run devで実行しても環境変数は読み込まれます。

```bash:~/.bash_profile
export REST_API_URL=https://restful-sample.com
```

```bash
source ~/.bash_profile
npm run dev
```
Welcartのカートで消費税と税込価格を出す

![image.png](https://qiita-image-store.s3.amazonaws.com/0/289172/6adb5a00-89a5-949b-7f31-c58c10e2663b.png)

こんな感じにwelcartで価格を出す。
wc_cart_page.phpの`</tfoot>`の直前にコードを足します。
（私はクーポンプラグインなど使っていませんので諸々アレンジしてください。）

```php:wc_cart_page.php
<?php
$total_price = usces_total_price( 'return' );
$tax = $usces->getTax( usces_total_price( 'return' ) );
?>
<tr>
	<td colspan="5" class="aright">
		<?php _e('consumption tax', 'usces'); ?>
	</td>
	<td class="aright">
		<?php echo usces_crform($tax, true, false); ?>
	</td>
	<td colspan="2">&nbsp;</td>
</tr>
<tr>
	<th colspan="5" class="aright">
		<?php _e('total items','usces'); ?><em class="tax">（税込）</em>
	</th>
	<th class="aright amount">
		<?php echo usces_crform(($total_price + $tax), true, false); ?>
	</th>
	<th colspan="2">&nbsp;</th>
</tr>
```
もっといいスマートなやり方があるはずです。
Ubuntu 18.04にRedash 5.0.2をインストールする

# この記事の目的
UbuntuやLinuxをほとんど触ったことがない人間がRedashが便利と聞きつけて構築しようと思い立ち、つまずきながら何とか構築できました。その記録です。

* 先述の通り、Ubuntu、Linux初心者なので間違っている可能性があります。
* Redashのインストール以外の作業も行っています。

# 構築作業
## Ubuntuインストール
VMware ESXi 6.0.0上にUbuntuの仮想マシンを構築しました。
テスト目的だったのでサイジングは適当、かつ小規模です。

* CPU  
1 vCPU
* メモリ  
4 GB
* ストレージ  
100 GB

Ubuntuは18.04.1、日本語 Remixを使用しました。
以下からisoを取得しました。
https://www.ubuntulinux.jp/download/ja-remix

## Redash構築前準備
### curl
curlをインストールしました。

```shell
$ sudo apt install curl
```
### open-vm-tools
「仮想マシンにはVMWareToolsを入れるもんだ」と何も考えずにvSphere Clientからインストールしましたが、インストール中も「Legacyだよ」とか何とか言われて変だな、と思ったらopen-vm-toolsを推奨するとのことでした。[^1]
open-vm-toolsをインストール。

```shell
$ sudo apt-get install open-vm-tools
```
## Redash構築
### setup.shをダウンロード
```shell
$ curl -OL https://raw.githubusercontent.com/getredash/redash/master/setup/setup.sh
```

ここで結構難儀したのですが、ググって出てくるコマンドをそのまま実行しても404(Not Found)が返ってきてしまいました。
URLを調べたところ、githubのリポジトリの構成が変更されていて、かつbootstrap.shではなくsetup.shで構築するように変わった模様。

### setup.shの実行権限を付与
```shell
$ chmod +x ./setup.sh
```

### setup.shを実行
```shell
$ sudo ./setup.sh
```

必要なソフトウェアのダウンロード、インストールを自動でやってくれます。
完了メッセージ等は特にないので、コマンドライン上にエラーが出ていないことを確認します。

### 動作確認
ブラウザで仮想マシン(Ubuntu)のホスト名 or IPアドレスを指定すればアクセスできます。
`http://[ホスト名 or IPアドレス]`
adminユーザーの設定画面が表示されればOKです。

# その他
## 所要時間
途中で色々つまずいて調べたりしたため時間を要しましたが、上記手順だけであればUbuntu構築からでも2時間程度でRedash使用開始まで到達できるかと思います。[^2]

## 参考
構築にあたっては以下のサイトを参考させていただきました。
https://weblabo.oscasierra.net/redash-ubuntu1604-install/
https://www.climb.co.jp/blog_vmware/vmware-6346
http://ariarijp.hatenablog.com/entry/2016/07/03/162921

## 課題

* メール設定をしていないため、Alertのメールが飛ばない状態です。
* adminページ(http://[ホスト名 or IPアドレス]/admin)で、Queryのタブを選択すると500(Internal Server Error)となるため原因を調べる必要があります。

[^1]: http://partnerweb.vmware.com/GOSIG/CentOS_7.html#Tools
[^2]: 仮想ホストの性能や仮想マシンのサイジングによって変わります。
raspberry pi 1でtensrorflow lite その15

#概要

raspberry pi 1でtensorflow liteやってみた。
マイク入力を扱うので、alsaを叩いてみた。
そのまま、出力するモデルを学習してみた。

#データセットの作成。

```
import numpy as np

sample_rate = 44100.
nsamples = 320
t = np.arange(nsamples) / sample_rate
vin = np.sin(2 * np.pi * 440. * t) 
vsa = np.zeros((nsamples, 2))
a = 0
for i in range(nsamples):
  vsa[i, 0] = vin[i]
  vsa[i, 1] = vin[i]
data = np.c_[vsa[ : , 0], vsa[ : , 1], vin]
np.savetxt('sin.csv', data, delimiter = ',', header = "x0,x1,y")
print ("ok")
```

#モデルを学習してtfliteファイルを作る。

```
import numpy as np 
import tensorflow as tf
import tensorflow.contrib.lite as lite
import matplotlib.pyplot as plt

data = np.loadtxt('sin.csv', delimiter = ',', unpack = True)
x = np.c_[data[0], data[1]]
y = data[2]
fig = plt.figure(1)
ax = fig.add_subplot(311)
ax.plot(data[0][1 : 300])
ax = fig.add_subplot(312)
ax.plot(y[1 : 300])
ax = fig.add_subplot(313)
x_in = tf.placeholder("float", [None, 2])
y_out = tf.placeholder("float", [None, 1])
w1 = tf.Variable(tf.random_uniform([2, 8]))
b1 = tf.Variable(tf.zeros([8]))
y1 = tf.nn.tanh(tf.matmul(x_in, w1) + b1)
w2 = tf.Variable(tf.random_uniform([8, 1]))
b2 = tf.Variable(tf.zeros([1]))
y2 = tf.nn.tanh(tf.matmul(y1, w2) + b2)
loss = tf.nn.l2_loss(y2 - y_out)
train = tf.train.AdamOptimizer(0.001).minimize(loss)
with tf.Session() as sess:
  sess.run(tf.initialize_all_variables())
  for i in range(10001):
    sess.run(train, feed_dict = {
      x_in: x,
      y_out: y.reshape(320, 1)
    })
    if i % 1000 == 0:
      summary = sess.run(loss, feed_dict = {
        x_in: x,
        y_out: vin.reshape(320, 1)
      })
      print (i, summary)
  test_y = sess.run(y2, feed_dict = {
    x_in: x
  })
  converter = lite.TFLiteConverter.from_session(sess, [x_in], [y2])
  tflite_model = converter.convert()
  open("voice1.tflite", "wb").write(tflite_model)
  ax.plot(test_y[1 : 300])
  fig.set_tight_layout(True)
  plt.show()

```

#tfliteファイルを検証する。

```
import numpy as np
import tensorflow as tf
import tensorflow.contrib.lite as lite
import matplotlib.pyplot as plt

data = np.loadtxt('sin.csv', delimiter = ',', unpack = True)
x = np.c_[data[0], data[1]]
y = data[2]
fig = plt.figure(1)
ax = fig.add_subplot(311)
ax.plot(data[0][1 : 300])
ax = fig.add_subplot(312)
ax.plot(y[1 : 300])
ax = fig.add_subplot(313)
interpreter = lite.Interpreter(model_path = "voice1.tflite")
interpreter.allocate_tensors()
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
input_shape = input_details[0]['shape']
pred = []
for i in x:
  input_data = np.array([i], dtype = np.float32)
  interpreter.set_tensor(input_details[0]['index'], input_data)
  interpreter.invoke()
  output_data = interpreter.get_tensor(output_details[0]['index'])
  pred.append(output_data[0][0])
ax.plot(pred[1 : 300])
fig.set_tight_layout(True)
plt.show()

```
![v1.png](https://qiita-image-store.s3.amazonaws.com/0/18104/cc2eb3e2-2880-9377-bad1-c44af399cfbe.png)


以上。
Xamarinでカスタムフォントを使いたい（iOS）

iOSの場合、カスタムフォントを組み込むにはフォント名の指定が必要なのですが、ファイル名とフォント名は別物ということがわかってなくてちょっと手間取りました

## 事の始まり

https://jp.designcuts.com/product/best-selection-showashotai/

毛筆で書いたような書体のフォントが激安セールしてたので、うっかり買っちゃった

せっかくなので個人で配信してるアプリに使えないかなと試してました

＃ライセンス規約見ると「アプリ利用は要相談」と書いてるので実際の利用にはご注意ください


## 組み込んでみる

https://qiita.com/masatoru/items/24a0eb6b1a91f4df9bfa

すでに手順を書いてくださってる記事があったので見様見真似でやってみる

・・・

うーん、出てこない

フォント名はファイル名ではないのか・・・

## フォント名を調べてみる

環境はMacです

````
$ mdls Touryu.ttf 

com_apple_ats_name_family          = (
    "KSW\U95d8\U9f8dN",
    KswTouryuN
)
com_apple_ats_name_fond            = (
    KswTouryuN
)
・
・
以下省略
````

どうも名前は`KswTouryuN`っぽい。

````csharp
<Label Grid.Row="1" Text="{Binding Name}" FontSize="14" FontFamily="KswTouryuN"></Label>
````

### できたっ！
AWS Serverless Expressでlambdaの障害が起きて困った話

# はじめに

これはServerless2 Advent Calendarの13日目の記事です。

ただ、この記事を書いている今日はもう17日です。。。
この記事を書こう（ホントは別の話を書く予定だった）としていた当日に障害だったので許してください。

# 自己紹介

- 株式会社MidfreeのCTOの平田です。
- [「ETHBOARD」](https://ethboard.jp)という、書き込むとEthereumという仮想通貨を貰える匿名掲示板サービスを運営しています。
- 登録せずに書き込みや閲覧ができるので、是非遊びに来てください！！

# この記事について

Serverlessの技術詳細というよりは、直近に自分が経験した障害の体験談みたいなものなので、「そんなことあるんだなー」くらいに読んでもらえればと思います。

# システム構成

<img width="680" alt="スクリーンショット 2018-12-17 12.57.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/35779/53c6dc27-a596-4494-1752-3e093cd5539e.png">

システム構成をとても簡素に書くと上図のような感じです。
フロントもサーバーもaws-serverless-expressを使ってlambda上で動いています。

# 突然の障害？！

13日(木)14時半ごろから突如、サイトでエラーが頻発するようになる
↓
Githubのissueに同様の事象がいくつか報告されていたため、報告を元に回避方法を調査、検証するが復旧できず
↓
翌朝、lambda側の対応（おそらく）により無事、復旧

# 詳細

## エラー内容

API側のaws-serverless-expressで下記のようなエラーが出ていました。

```
Error: socket hang up
at createHangUpError (_http_client.js:299:15)
at Socket.socketOnEnd (_http_client.js:391:23)
at emitNone (events.js:111:20)
at Socket.emit (events.js:208:7)
at endReadableNT (_stream_readable.js:1064:12)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
at process._tickDomainCallback (internal/process/next_tick.js:218:9) code: 'ECONNRESET' 
```

コネクションエラーではあるものの、どういう要因で発生しているかを調べるのがかなり困難でした。
frontが動いているlambdaからapiをコールした時だけエラーが発生していました。（クライアントから呼んでいる箇所は正常）

## Githubでのissue

<img width="1144" alt="スクリーンショット 2018-12-17 13.16.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/35779/8d82e12a-2149-7a1e-b4af-6576cf79a95f.png">


https://github.com/awslabs/aws-serverless-express/issues/199
実際にあがっていたGithubでのissue報告です。
コードを変更していないのにエラーになりだしたと複数報告があがっていて、リージョン固有の障害等でもなさそうということがわかります。
これを見て自分のコードが悪い訳ではなさそうという安堵感と共にどうやって回避すればいいのだろうという絶望感を味わいました。

## 回避方法

結論からいうと、回避方法がわかる前に復旧しました。

Authorizationヘッダー関連の問題というコメントがあったため、その辺を修正してみるも直らなかったです。
また、node6.10にダウングレードしたら動いたよって人もいたんですが、コード的にかなり大掛かりなため試しませんでした。
（Typescriptで書いてたら簡単に行けたのか、、、とちょっとだけ後悔）

## 根本原因

どうやらlambda側の問題であることは間違いなさそうですが、まだ不明なままです。
issueにて原因などが公表されたら、後日、記事を更新したいと思います。

# まとめ

今回、デプロイしてないのに突如エラーが出始めるという事態が初めてだったので、記事にしてみました。
アクセス増加によるメモリとかスループットとかそういうエラーならまだわかるんですが、安定した環境での突発的なものだったので、実際かなり焦りました。
かなりレアなケースですが、クラウドを使う上でのリスクとして考えておく必要があるなと感じました。

また、ある技術に大きく依存してしまうのはこういうレアなパターンについて回避できなくなるリスクを持ち合わせているので、依存度は色々分散させておくのがいいなと思いました。今回のケースで言えば、おそらくTypescriptで作っていればnode.jsのバージョンを落としてすぐに回避できた可能性があったということです。そのためにTypescriptに移行するというのは違う気がしますが。。。

この記事によって、改めてみなさんのサービスのリスクポイントの把握などに繋がればいいなと思っています。

## 最後に

現在は安定的に稼働しているので、ぜひ[ETHBOARD](https://ethboard.jp)に遊びに来てください！！w
Laravel Socialiteの InvalidStateException エラー解決方法

## 事象
Socialiteを使ってソーシャルログインを実装したのだが、callback URLをリクエストする際にエラー発生。
厄介なのは認証する人のSNS側のパーミッション設定（ブラウザ？）によってエラーになったりならなかったりする。
`Laravel \ Socialite \ Two \ InvalidStateException`

## 環境
- Laravel 5.7
- Socialite 3

## 結論
プロバイダーからユーザー情報取得時にステートレスにすることで解決。

```php:app/Http/Controllers/SocialController.php
// Socialite::driver($provider)->user();
Socialite::driver($provider)->stateless()->user();
```

## セッションの問題
ソースコードを見ると、セッションからstateっていうのをとってくるんだけど、それがnullの場合にエラーになるっぽい。

```php:vendor/laravel/socialite/src/Two/AbstractProvider.php
/**
 * Redirect the user of the application to the provider's authentication screen.
 *
 * @return \Illuminate\Http\RedirectResponse
 */
public function redirect()
{
    $state = null;

    if ($this->usesState()) {
        $this->request->session()->put('state', $state = $this->getState());
    }

    return new RedirectResponse($this->getAuthUrl($state));
}
```

で、セッションの設定を見るとenvから読み込んでいる。

```php:config/session.php
'domain' => env('SESSION_DOMAIN', null),
```

というわけで当初、このあたりの記事を参考にさせていただきドメインをenvに登録するも直らず。
https://qiita.com/chtzmrtshgh/items/84817942255d3d5dff45

```php:.env
SESSION_DOMAIN=hogehoge.com
```
また、私の環境ではサブドメインでも同じ機能を参照しており、「hogehoge.com」「s.hogehoge.com」など複数ドメインで運用する環境ではうまくいきませんでした。

##セッション無効にするオプションはないものか
そもそも不安定なセッション取得を必須にしなくてもいいよね。
と思ったらありました。
ガイドに書いてあるとおり、ステートレスな認証を使うことで解決。
https://readouble.com/laravel/5.7/ja/socialite.html

>statelessメソッドはセッション状態の確認を無効にするために使用します。これはAPIへソーシャル認証を追加する場合に便利です。
return Socialite::driver('google')->stateless()->user();

## 結論
公式とかちゃんと読もう。
【Node.js】postで受け取った画像をS3へアップロードする

## はじめに
おはこんばんにちは@kaoryuuuです。
今回はnodeで実装したAPIでPOSTされた画像をS3へアップロードする方法を紹介していこうと思います。

## 今回やること
base64エンコードされた画像を受け取り、画像をS3へアップロードする

## install
```
npm install dotenv
npm install aws-sdk
```

## envファイル
ルートディレクトリに.envを作成し、リージョン情報などを作成してください。
※アクセスキーなどはaws-cli上で設定しています。
こちらを参考にしてます。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-getting-started.html

```.env
AWS_REGION = ""
AWS_BUCKET_NAME = ""
```

## アップロード処理
S3へのファイル名となるパスはユニークになるようにディレクトリを切って対応しています。
こうすることで機能ごとに参照することができるようになります。
※今回は 機能/ユーザーID/ファイル名の構成にしています。

```posts.js
import S3 from '../../s3';
import crypto from 'crypto';

router.post('/', (req, res) => {

    const timeStamp = Date.now();
    const encodedData = req.body.thumbnail;
    const fileData = encodedData.replace(/^data:\w+\/\w+;base64,/, '')
    const decodedFile = new Buffer(fileData, 'base64')
    // ファイルの拡張子(png)
    const fileExtension = encodedData.toString().slice(encodedData.indexOf('/') + 1, encodedData.indexOf(';'))
    // ContentType(image/png)
    const contentType = encodedData.toString().slice(encodedData.indexOf(':') + 1, encodedData.indexOf(';'))
    const hashName = crypto.createHash('md5').update(`${timeStamp}${fileData}`).digest('hex');
    const fileName = [hashName, fileExtension].join('.');
    const uploadType = "foo";
    const s3 = new S3();

    s3.uploadImage(id, decodedFile, contentType, fileName, uploadType)
        .then(() => {
           // 何か処理
        }
    })
});
```

```S3.js
import dotenv from 'dotenv';
import aws from 'aws-sdk';

dotenv.config();
aws.config.update({
    region: process.env.AWS_REGION
});

export default class S3 {

    uploadImage(userId, decodedFile, contentType, fileName, uploadType) {

        const params = {
            Body: decodedFile,
            Bucket: process.env.AWS_BUCKET_NAME,
            Key: `${uploadType}/${userId}/${fileName}`,
            ContentType: contentType
        }
        const s3 = new aws.S3()
        return s3.putObject(params).promise()
                    .catch((err) => { console.log(`Error: ${err}`) }) 
    }
}
```
MySQLが起動できない

# MySQLでエラーになるシーン

mysqlサーバーに入るときや、

```
$ mysql -u root
```

railsでmigrationを実行するとき。

```
$ bundle exec rake db:migrate
```

上記のようなコマンドを実行すると、正常に起動しない場合がある。

```
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```


# 解決方法

sudoを付けてmysqlサーバーを起動してみる。

```
$ sudo mysql.server start
```

起動できた！！！
![スクリーンショット 2018-12-17 13.55.14.png](https://qiita-image-store.s3.amazonaws.com/0/121435/771eb73e-1d8b-cf5d-fb75-17ea68e09685.png)
3scaleの新バージョン2.4の主な変更点とは

初版: 2018/12/18
著者: 田畑義之, 株式会社日立製作所 (GitHubアカウント: [@y-tabata](https://github.com/y-tabata))
本記事は、あくまで執筆者の見解であり、所属企業及びRed Hatの公式なドキュメントではありません。

# はじめに

2018年12月11日、Red Hat 3scale API Management Platform (以下、3scale)の[バージョン2.4](https://access.redhat.com/documentation/en-us/red_hat_3scale_api_management/2.4/html/release_notes/)がリリースされました。2018年10月5日の2.3のリリースから約2か月ぶりの新バージョンです。

本稿では、3scale 2.4の主な変更点を紹介します。

# 3scaleとは

3scaleとは、Red Hat主体で開発が進められているAPI管理製品です。
詳細は、筆者の過去記事「[OSSベースのAPI管理製品 3scale 2.2を試してみた](https://qiita.com/yo-tabata/items/eb81c5cb324cefa87efc)」の「[3scaleとは](https://qiita.com/yo-tabata/items/eb81c5cb324cefa87efc#3scale%E3%81%A8%E3%81%AF)」をご参照ください。

# 2.4の主な変更点

2.4の主な変更点は4つです。

-   サービスディスカバリ
-   GUIの刷新
-   CLIのサポート
-   IPチェックポリシー

他のマイナーな変更点に関しては[リリースノート](https://access.redhat.com/documentation/en-us/red_hat_3scale_api_management/2.4/html/release_notes/)をご参照ください。

## サービスディスカバリ

2.4の特筆すべき点は、このサービスディスカバリ機能が追加されたことです。

この機能はRed Hatが推進するアジャイル・インテグレーションを実現するための機能です。
アジャイル・インテグレーションとは、Red Hatが提供する3scale、OpenShift、Fuse、AMQを統合し、設計から公開までのAPIライフサイクル全般の全フェーズをカバーするというソリューションです。アジャイル・インテグレーションの詳細は、[公式サイト](https://www.redhat.com/ja/explore/agile-integration)をご参照ください。

サービスディスカバリ機能では、このアジャイル・インテグレーションを実現すべく、OpenShiftのサービスをAPIとして3scaleにインポートすることができるようになりました。また、OpenAPI Specification (Swagger)も3scaleのActive docsとしてインポートすることができるようになりました。

これにより、今まで3scale独自で設定する必要があったAPIの情報を、シームレスに取り込むことができるようになり、時間とコストの無駄がなくなりました。

## GUIの刷新

2.4では、GUIが刷新されました。
例えば、管理者ポータルのダッシュボードは以下のようになりました。

![24dashboard.png](https://qiita-image-store.s3.amazonaws.com/0/267112/c2612f65-9e02-8ab1-a953-549d3cc73c40.png)

比較のために、以下に2.3の管理者ポータルのダッシュボードを示します。

![23dashboard.png](https://qiita-image-store.s3.amazonaws.com/0/267112/6c7a7bbf-d2e0-110e-2e42-fb333f862464.png)

ボタンやタブ等の配置もガラッと変わり、2.3以前を使い慣れていた方にとっては、慣れるのに時間がかかるかもしれません。
しかし本変更の目的は、Red Hatの他製品(OpenShiftなど)と使用感を統一するためということですので、アジャイル・インテグレーションを考えると、製品ごとの違いが吸収されて使い勝手が良くなったかと思います。アジャイル・インテグレーションの推進に力を入れようとしていることが見て取れますね。

## CLIのサポート

2.4では、CLIが正式にサポートされました。
GitHubリポジトリは「[3scale_toolbox](https://github.com/3scale/3scale_toolbox)」です。

実は約1年前、筆者も本リポジトリにコミットしていました。
筆者は、既存のサービスを更新するUpdateコマンドを作り([PR #34](https://github.com/3scale/3scale_toolbox/pull/34))、またCopyコマンドをエンハンスして、"API Key (user_key)"のサービスのみではなく、"App_ID and App_Key Pair"のサービス、"OAuth 2.0"のサービス、"OpenID Connect"のサービスをコピーできるようにしました([PR #33](https://github.com/3scale/3scale_toolbox/pull/33))。

筆者がコミットしていたころは、3scale_toolboxはまだ非公式の便利ツール的な立ち位置でしたが、今回[ドキュメント](https://access.redhat.com/documentation/en-us/red_hat_3scale_api_management/2.4/html-single/api_devops/#cli-toolbox)も整備され、正式サポートとなったようです。
自ら手を加えた製品が正式にサポートされるのはうれしいですね。

## IPチェックポリシー

2.4では、IPチェックポリシーが追加されました([PR #907](https://github.com/3scale/apicast/pull/907))。
これは、IPアドレスによるアクセス制御を実現できるポリシーです。実際にアクセスしてきたクライアントのIPアドレスのみではなく、`X-Forwarded-For`ヘッダや`X-Real-IP`ヘッダに指定されたIPアドレスに対してもアクセス制御を適用することができます。

![ipcheck.png](https://qiita-image-store.s3.amazonaws.com/0/267112/ea6e833a-5240-0516-8e65-715e0addf0fb.png)

# おわりに

本稿では、3scale 2.4の主な変更点を紹介しました。
アジャイル・インテグレーション実現に動きだし、GUIも刷新され、また一回り製品としてグレードアップしたように感じます。
昨今マイクロサービスの分野では次々と新しい技術が登場し、それに伴いAPI管理の分野も目まぐるしく発展しています。今後の動きにも乞うご期待です。
MacにインストールしたjenkinsでチャットワークAPIを利用したメッセージ送信、実装メモ

JenkinsでチャットワークAPIを利用したメッセージ送信を作成したのでメモ

#前提
jenkinsインストール済み、Adminでログイン済み
環境はMac（Linux）

#チャットワークへメッセージを送るスクリプト

jenkinsをインストールした環境がMacのため、シェルスクリプトでチャットワークAPIへ送信しています。

最初に簡単にチャットワークAPIへ送れるかを確かめるため、「フリースタイル・プロジェクトのビルド」からジョブを作成し、curlを利用して以下のスクリプトを組みました。

```ruby:
#!/bin/sh

#チャットワークトークン
token="チャットワークAPIのトークン"
#送り先のルームID
room_id="ルームID（チャットワークURLの「#!rid」から後ろの部分）"
#チャットワークへ送るメッセージ内容
message="チャットワークにメッセージ送信"

# チャットワークにメッセージ送信
curl --insecure -X POST -H "X-ChatWorkToken:${token}" -d "body=${message}" "https://api.chatwork.com/v2/rooms/${room_id}/messages"
```
チャットワークAPIの申請ができていれば、上記シェルスクリプトの「token」と「room_id」を書き換えれば、チャットワークにメッセージが送れると思います。
チャットワークAPIのトークン取得は、[公式ドキュメント](http://developer.chatwork.com/ja/index.html)を見て取得してください。

##チャットワークへメッセージ送信するジョブを少し拡張する

これだけだとチャットワークに固定メッセージを送るビルドになってしまい、使いにくいのでルームIDとメッセージ内容だけ外部に公開して、パイプライン等の他ジョブから参照できるようにします。

以下の画像の通り、ビルドのパラメータ化を有効にして、テキストでルームIDとメッセージをパラメータ化します。
![スクリーンショット 2018-12-17 13.23.59.png](https://qiita-image-store.s3.amazonaws.com/0/104377/905ff356-18c2-1c2e-b727-0871ed4200ee.png)

パラメータを作成後、シェルスクリプトを以下の用に修正します。

```ruby:
#!/bin/sh

#チャットワークトークン
token="チャットワークAPIのトークン"

# チャットワークにメッセージ送信
curl --insecure -X POST -H "X-ChatWorkToken:${token}" -d "body=${message}" "https://api.chatwork.com/v2/rooms/${room_id}/messages"
```

だいぶスッキリしました。
これでチャットワークへメッセージ送信するジョブが使いやすくなりました。

たとえば、以下のパイプラインスクリプトを組むことで、他ジョブでアプリをビルドする時に、チャットワークへ通知させる、ということができます。

```ruby:
node {
    stage('1st-stage'){
        build job: 'ジョブ名', parameters: [
            [
                $class: 'StringParameterValue',
                name: 'message',
                value: 'チャットワーク送信テスト',
            ],
            [
                $class: 'StringParameterValue',
                name: 'room_id',
                value: 'ルームID（チャットワークURLの「#!rid」から後ろの部分）',
            ],
        ]
    }
}
```

こういうことができるようになるとJenkins触ってて楽しくなりますね。
Windowsでもバッチコマンドで似たようなことができると思います。
【備忘録】アルゴリズムの基本まとめ

こんにちは。
今回はアルゴリズムの基礎中の基礎について自分の頭の中を整理するための記事です。

##アルゴリズムとは
プログラミングを勉強していなくてもアルゴリズムという言葉を聞くことがありますが、その意味をしっかり説明するのは意外と難しいものです。
アルゴリズムとは簡単にいうと、問題解決に向けた計算や解決方法のことです。
コンピューターにアルゴリズムを通してプログラミングすることで、人間が行うと時間がかかることや不可能なことが可能となります。


##アルゴリズムの種類
アルゴリズムにはいくつかの種類があります。
ここではその種類と代表的な使い方の例をあげていきます。
####探索アルゴリズム
数多くあるデータの中から目的のデータを探し出すアルゴリズムのことを探索アルゴリズムと言います。
######線形探索
データの集合の中からあるデータを探索するために、一つずつデータの確認を行う方法です。
例えば、あるパーティの参加者100人分をまとめたリストがあるとして、その中から寝屋川区出身の五郎さんを探し出すときに、スキップすることなく1から順番にみていきます。
######二分探索
整列されたデータの集合を二分し、探し出したい要素が出るまで集合を二分し続ける方法です。
寝屋川の五郎さんが100人の中で78人目の参加者であった場合、50人目の人を区切りにグループを二分します。
五郎さんは50人目より前の集団には存在しないため、51から100人目のグループに存在することがわかります。
つぎにその51から100人目のグループを76人目を区切りに二分します。
するとグループは51から75人目と76人目から100人目に分けられ、五郎さんが属する76から100人目のグループが残ります。
このような作業を繰り返していくことでより効率的に目的であるデータまでたどり着くことができます。

####ソートアルゴリズム
データの集合を一定の規則に基づいて順番に並べることをソートと言い、それを可能にする方法をソートアルゴリズムと呼びます。
######バブルソート
ソートアルゴリズムの中でも基本的な考え方で、隣り合うデータを比較し規則ごとに並び替えるソートの方法です。
例えば順不同に並んだ1から100人目までのパーティの参加者をソートアルゴリズムで番号順に並び替える場合、隣り合う2人を比べ、番号が「若い人が左にくるように」並べていきます。
つまり「71、34、89、3、・・・」という番号で並んでいた場合、最初の2人は「71、34」となり、若い人が左にくるように並べる規則に従って「34、71」に入れ替えます。
同じように次は「71、89」となりますが、この場合すでに規則に従っているため交換する必要はありません。
「89、3」は規則に反しているため「3、89」と入れ替えられます。
これを順番に行い、規則通りにソートされるまで繰り返すのがバブルソートです。
######クイックソート
最も速いとされているソートの方法です。
これは軸となるデータを基にソートしていく方法ですが、文章のみでわかりやすく説明されている記事が見当たらず、自分の言葉でもうまく説明できる自信がないので以下の動画から直感的に理解していただくことを推奨します。
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/ywWBy6J5gz8/0.jpg)](http://www.youtube.com/watch?v=ywWBy6J5gz8)
######マージソート
パーティの参加者を一列に並べ、それぞれが独立するまで細分化していきます。
ここでは100人を例として持ち上げるとややこしいため、パーティのなかでもバーでお酒を飲んでいる8人を取り出したことにして話を進めます。
例えば「71、34、89、3、11、66、57、98」という8人の参加者がカウンターに座って並んでいたとします。
この全体の集合を2つの集合に分けていく作業を、1人1人が独立するまで続けます。

```
1. 「71、34、89、3」、「11、66、57、98」
2. 「71、34」、「89、3」、「11、66」、「57、98」
3. 「71」、「34」、「89」、「3」、「11」、「66」、「57」、「98」
```

次にその細分化したものを倍数で組み合わせていき、規則順に整列させます。
今回は昇順をソートの規則とします。

```
4. 「34、71」、「3、89」、「11、66」、「57、98」
5. 「3、34、71、89」、「11、57、66、98」
6. 「3、11、34、57、66、71、89、98」
```

以上のような方法で並び変えるのがマージソートです。


##まとめ
今回はアルゴリズムの中でも特に基本として取り上げられる探索アルゴリズムとソートアルゴリズムについて、それぞれの代表的なものをまとめました。
アルゴリズムを初めて勉強する人はぜひ参考にしてみてください。