OmniAICreator/Qiita-1.07M huggingface dataset:
#git で 新しいブランチを切って、すぐに同じ名前で空のコミットを作成するコマンドと gitconfig エイリアスの例

# コマンド

- `git checkout -b` で現在のブランチから新しいブランチを作り、すぐに新ブランチにcheckoutできる
- git commit --allow-empty で空のコミットを作成できる
- `$()` の中は現在のブランチ名を、シェルで頑張って切り取っている
- これをコミットメッセージの内容として指定している

```
git checkout -b <BRANCH_NAME> && git commit --allow-empty -m "$( git branch | grep '* ' | sed 's/* //g' | head -n 1)"
```

# 実行例


```
git checkout -b <BRANCH_NAME> && git commit --allow-empty -m "$( git branch | grep '* ' | sed 's/* //g' | head -n 1)"
Switched to a new branch 'some'

[some e9c64562]  master
```

確認

```

commit 3a75169fa3b1c34c136625d93105dxb6fdd2b0e0 (HEAD -> some)
Author: YumaInaura <yuma.inaura@gmail.com>
Date:   Mon Dec 30 15:51:35 2019 +0900
```

 # .gitconfig 

```
[alias]
  current-branch-name = ! git branch | grep -e '^\\* ' | sed -e 's/^\\* //g'
  commit-by-current-branch-name = ! git commit --allow-empty -m "$(git current-branch-name)"
  checkout-new-branch-and-commit-empty = "!f() { git checkout -b \"$1\" && git commit-by-current-branch-name; }; f"

```

run

```
git checkout-new-branch-and-commit-empty YA
Switched to a new branch 'YA'
[YA 223ae3d5] YA
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2896








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
VPN網の構築 (IPv4 over IPv6)

# 構成
| ROUTER A | - NGN - | ROUTER B |

# L2TPv3によるVPN網構築
## ROUTER A
```bash
 bridge br10 {
     address 10.0.200.1/24
     aging 300
     bridged-conntrack disable
     hello-time 2
     max-age 20
     priority 32768
     promiscuous disable
     stp false
 }
- 省略 -
 l2tpv3 l2tpeth0 {
     bridge-group {
         bridge br10
     }
     destination-port 5000
     encapsulation udp
     local-ip [IPv6 AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA]
     mtu 1420
     peer-session-id 2
     peer-tunnel-id 2
     remote-ip  [IPv6 BBBB:BBBB:BBBB:BBBB:BBBB:BBBB:BBBB:BBBB]
     session-id 1
     source-port 5000
     tunnel-id 1
 }
```

## ROUTER B
```bash
 bridge br10 {
     address 10.0.200.2/24
     aging 300
     bridged-conntrack disable
     hello-time 2
     max-age 20
     priority 32768
     promiscuous disable
     stp false
 }
- 省略 -
l2tpv3 l2tpeth0 
 bridge-group {
     bridge br10
 }
 destination-port 5000
 encapsulation udp
 local-ip [IPv6 BBBB:BBBB:BBBB:BBBB:BBBB:BBBB:BBBB:BBBB]
 mtu 1420
 peer-session-id 1
 peer-tunnel-id 1
 remote-ip [IPv6 AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA]
 session-id 2
 source-port 5000
 tunnel-id 2
```

# トラブルシュート
## OSPFでの経路交換が行われない問題
### UDPパケットを確認
```bash
tcpdump -i [NIC]udp
```

### OSPFの通信状況を確認
```bash
tcpdump -i [NIC] -n “ip[9] == 89”
```

# 参考文献
- https://isid.ai/dev/2016/10/19/1100/
rubyのシンボルの内部処理について

# モチベーション
rubyの公式ドキュメントを見ても「シンボルは内部的に数値として扱っています」「テーブルを使ってGCをしています」としか書いておらず、具体的にどんなテーブルなのかまた、シンボルはどんな数値なのかという情報が全くわからなかったので調べました。

# 概要
シンボルを管理しているテーブルはハッシュオブジェクトを管理しているものと同じハッシュテーブルです。
そして、シンボルはハッシュ化されて管理されています。その詳しい仕組みを解説します

# Symbol.all_symbolメソッドとは
まずはじめに次のプログラムを実行してみましょう。

``` ruby
a = Symbol.all_symbols.dup
a.any?{|val| val == :hello_world } # ここでhello_worldというシンボルが作成される
# => false

a = Symbol.all_symbols.dup
a.any?{|val| val == :hello_world }
# => true
```
irbで実行してみるとわかる通り、Symbol.all_symbolsは新しいシンボルが作成されるたびに実行結果が変わります。
さらに

``` ruby
(:hoge.object_id == :hoge.object_id) == true
``` 
であることから、シンボルがシングルトンオブジェクトであることがわかります。

この実行結果から、:hogeというシンボルを使った際に次のような挙動をしていることが推測できます。

1. :hogeというオブジェクトをテーブル内で検索する
2. :hogeが見つかった場合、そのオブジェクトを返す
3. :hogeが見つからなかった場合、新しくオブジェクトを作成しテーブルに登録をし、作成したオブジェクトを返す

という挙動をしてるのが推測できます

# シンボルを管理しているテーブルについて

下のソースコードは[rubyのプロジェクト](https://github.com/ruby/ruby/blob/master/symbol.c)の一部です。

``` c
static VALUE
lookup_str_sym(const VALUE str)
{
    st_data_t sym_data;
    if (st_lookup(global_symbols.str_sym, (st_data_t)str, &sym_data)) {
	VALUE sym = (VALUE)sym_data;

	if (DYNAMIC_SYM_P(sym)) {
	    sym = dsymbol_check(sym);
	}
	return sym;
    }
    else {
	return (VALUE)0;
    }
}

```

このlookup_str_symという関数は名前から推測すると、文字列オブジェクトを引数にとってシンボルを返す関数っぽいですよね。lookupというの名前からしてテーブルから検索するっぽいですね。
st_lookupは第一引数がデータを格納したテーブル、第２引数がキー、第３引数が検索に成功した時にデータを書き込むためのポインタです。検索に失敗したら0、成功したらsym_dataにシンボルオブジェクトを書き込んで1を返します。

st_lookupの第一引数のテーブルの正体は何でしょう？それを知るためにglobal_symbols.str_symの正体を知る必要があります。
同じファイルの中にInit_symという関数があるので、その中を見てみましょう。

``` c
global_symbols.str_sym = st_init_table_with_size(&symhash, 1000);
```

st_init_table_with_sizeはハッシュ値のキーとバリューの管理にも使われています。ハッシュテーブルです。
シンボルが数値と等価という解説している記事を何回かみたことがあると思いますが、その数値の正体はハッシュ値だったのです。何のハッシュ値かというと文字列のハッシュ値ですね。
その証拠にsymhashの定義を見てみましょう。


``` c
static const struct st_hash_type symhash = {
    rb_str_hash_cmp,
    rb_str_hash,
};
```

これはst_init_table_with_sizeの引数にも使われています。なので、この構造体の中身を使って検索していることが推測できます。


global_symbols.str_symの正体は文字列オブジェクトをキーにしてシンボルを返すハッシュテーブルだったのです

# 最後に
日本語が不自由・説明がわかりにくいなどあると思うので、気軽に編集リクエストを送ってください
ウェブスクレイピング

# 概要

CSVに記入したURL一覧からページの情報をスクレイピングします。

# ソース

## package.json

```
{
  "name": "scraping",
  "version": "1.0.0",
  "description": "scraping",
  "author": "",
  "devDependencies": {
    "cheerio": "^1.0.0-rc.3",
    "csv-parser": "^2.3.2",
    "fs": "0.0.1-security",
    "json2csv": "^4.5.4",
    "request": "^2.88.0",
    "request-promise": "^4.2.5"
  }
}
```

- cheerio　・・・　読み込んだページをjQuery形式でDOM操作できる
- csv-parser　・・・　CSV形式をJSONに変換
- fs　・・・　ファイル操作
- json2csv　・・・　JSON形式をCSVに変換
- request　・・・ HTTP通信を行う
- request-promise　・・・　HTTP通信を行う

## url.csv

Yahoo!ニュースの記事情報をスクレイピングします。

```
url
https://news.yahoo.co.jp/topics/top-picks
https://news.yahoo.co.jp/topics/domestic
https://news.yahoo.co.jp/categories/world
```

## scraping.js

```Javascript
const fs = require('fs');
const request= require('request');
const rp = require('request-promise');
const csv = require('csv-parser');
const cheerio = require('cheerio');
const { Parser } = require('json2csv');

const results = [];
const list = [];

let count = 0;

let filename = 'dist/data.csv';
let loadfile = 'url.csv';

fs.createReadStream(loadfile)
.pipe(csv())
.on('data', function(data){
    results.push(data);
})
.on('end', function(){
    crawl(results[count]);
});


function crawl(result){
    let url = result.url;

    let _include_headers = function(body, response, resolveWithFullResponse) {
        return {
            response : response,
            $ : cheerio.load(body),
            body : body
        };
    };

    const options = {
        method: 'GET',
        uri: url,
        json: true,
        transform: _include_headers,
    };

    rp.get(url, options)
        .then((data) => {
            scrp(data.$, url, data.response, data.body);
        })
        .catch((error) => {
            console.log(error);
        });
}

function scrp($,url,response,body) {

    let category = $('.newsFeedTab_item-current').text();

    $('.newsFeed_item').each(function() {
        let title = $(this).find('.newsFeed_item_title').text();
        let date = $(this).find('.newsFeed_item_date').text();
        let href = $(this).find('.newsFeed_item_link').attr('href');
        let thumbnail = $(this).find('.thumbnail img').attr('src');
        
        if(href!==undefined){
            let obj = {
                category : category,
                title : title,
                date : date,
                href : href,
                thumbnail : thumbnail,
            }
            list.push(obj);
        }
    });

    count++;

    console.log('Complete:' + url);

    if(count < results.length ){
        crawl(results[count]);
    }else{
        write();
    }
}

function write(){
    let fields = ['category', 'title', 'date', 'href', 'thumbnail'];
    const opts = { fields };

    try {
        const parser = new Parser(opts);
        const csv = parser.parse(list);
        fs.writeFile(filename , csv, function(err) {
            if (err) throw err;
        });
    } catch (err) {
        console.error(err);
    }

}
```

[Github](https://github.com/hiron712/webscraping)
React Nativeでエントリーポイントを変更する

expo-cliで作成したReactNativeアプリでエントリーポイントの設定をしようとしたところ少し手こずったので備忘として残したいと思います。

## エントリーポイント初期設定

expo-cliで生成したReact Nativeプロジェクト(TypeScript)のディレクトリ構成は以下のようになっています。

```
my-rn-app
├── App.tsx
├── app.json
├── assets
├── babel.config.js
├── node_modules
├── package-lock.json
├── package.json
└── tsconfig.json
```

## エントリーポイント指定

ルートディレクトリに`App.tsx`があるのが自分的に嫌だったので、`src`ディレクトリを作りその配下に`App.tsx`を移動させました。

```
my-rn-app
├── src
│    └── App.tsx
├── app.json
├── assets
├── babel.config.js
├── node_modules
├── package-lock.json
├── package.json
└── tsconfig.json
```

するとエミュレータ上で以下のようなエラーが発生しました。
<img width="425" alt="スクリーンショット 2019-12-31 16.22.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442896/ac60fd23-4a5f-522f-6454-2d7811b7fa1c.png">


このエラー内容から、エントリーポイントの設定は`node_module/expo/AppEntry.js`で行なっていると推測できました。

ではエントリーポイントを指定している箇所はどこでしょうか？
探してみると、エントリーポイント:`node_module/expo/AppEntry.js`は`package.json`の`name`プロパティで指定していました。

``` javascript
"main": "node_modules/expo/AppEntry.js",
```

この部分を`src/App.tsx`に変更します。

``` javascript
"main": "src/App.tsx",
```

変更後、エミュレータでアプリが正常に起動するか確認すると、

<img width="410" alt="スクリーンショット 2019-12-31 16.35.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442896/43687946-4920-0fac-86c6-4041c1479ea0.png">


エラーがでてました。
どうやらアプリを実行するためのエントリーポイントの登録を行う必要があるようです。

## エントリーポイント登録

公式ドキュメントには以下のような説明がありました。

> App root components should register themselves with AppRegistry.registerComponent, then the native system can load the bundle for the app and then actually run the app when it's ready by invoking AppRegistry.runApplication.

> アプリのルートコンポーネントはAppRegistry.registerComponentに登録する必要があります。ネイティブシステムはアプリのバンドルをロードし、AppRegistry.runApplicationを呼び出して準備ができたら実際にアプリを実行できます。

とのことなので、`src/App.tsx`の`AppRegistry.registerComponent`でルートコンポーネントを登録、したいところですが`registerComopnent`の記載を確認すると

```javascript
static registerComponent(appKey, componentProvider, section?)
```

第一引数に`appKey`というものが必要になります。
調べると、`appKey`は`app.json`に設定するものだそうなので、プロパティを追加します。

`app.json`

```
{
  "expo": {
    "appKey": <APP_KEY>,
    
  }
}
```

ここまでできたら残すは`src/App.tsx`にAppRegistry.registerComponentでルートコンポーネントを登録するのみです。

`src/App.tsx`

```javascript
import React from 'react';
import { StyleSheet, Text, View, AppRegistry } from 'react-native';
import { expo } from './../app.json';
export default function App() {
  return (
    <View style={styles.container}>
      <Text>Open up App.tsx to start working on your app!</Text>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center'
  }
});

AppRegistry.registerComponent(expo.appKey, () => App);

```

エミュレータでアプリを確認すると正常に動作することが確認できましました。

<img width="284" alt="スクリーンショット 2019-12-31 16.55.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442896/9507b80b-56d5-2648-bf9c-5c4eec0e1aec.png">
自分のサイトにe2eテストを導入しようとしている話

この記事は[Playground Advent Calendar 2019](https://qiita.com/advent-calendar/2019/playground)の12/25の記事です。(めちゃめちゃ遅れてすんまそん。。)
こんにちは。にっし〜です。
今日は[自分のサイト](https://nisshii.dev)にe2eテストを導入しようとする話を書きます。
"しようとする話"なので今回で完結はしません。詰まったことがあればその都度更新していこうと思います。
(導入そのものでは詰まらなかったのでそこは省きます)

## 詰まったこと一覧
- cross origin error

自分のサイトではてなブログなどの[外部サービスのリンクを張っている部分](https://nisshii.dev/history)があるのですが、そこのテストを書こうとした時に出くわしました。
iframe間のリンクに飛べないってやつですね。
色々調べた結果2パターンの回避策があると知り、両方試したところ片方は上手くいってもう片方は失敗したので両方まとめときます。

1, `chromeWebSecurity: false`を設定する
cypressが出していたerrorの中にあった回避策で、security policyを無効にしてしまうことで無理くりアクセスしようというやつです。言い方から分かるように今回のケースでは失敗しました。
![スクリーンショット 2019-12-31 16.04.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178746/302e24b4-faba-cf92-3841-191a8512693c.png)
まぁそりゃそうですね。厳密に言うと失敗という言い方は正しくなくて、追加でプロキシの設定とかを弄ってcypressからのアクセスを"悪い人じゃないよ〜"ってしてあげれば良いみたいなのですが、ここでやりたいのは疎通確認(link切れ起こしてないよね？？)なのでそこまですることはないかぁという感じです。

2, `request`コマンドを使う
error文では上の回避策をレコメンドされるのですが、同時に渡されるlinkに飛ぶとこっちの回避策が上に出てきます。
何をするかというと、

```js:spec.js
cy.get('a').then(($a) => {
  // pull off the fully qualified href from the <a>
  const url = $a.prop('href')

  // make a cy.request to it
  cy.request(url).its('body').should('include', '</html>')
})
```
こんなコードを書きます(初めのgetの中身は各自のサイトのlink張ってる部分のタグに読み替えてください)
hrefタグを見て、そこからlink先のurlを取得します。
その後`request`コマンドを使って`GET`リクエストを送ります。(無事に疎通できると`200`で返ってきます)
あとは返ってきたものを`its`コマンドで受けて、その中身についてテストを書きます。
自分の場合は一先ず簡単にこんな感じにしています。

```js:spec.js
cy.get('.v-card__text > a').then(($a) => {
  // pull off the fully qualified href from the <a>
  const url = $a.prop('href')

  // make a cy.request to it
  cy.request(url).its('body').should('include', '<title>夏インターンに参加してきた話(サイボウズ編) - nisshii18’s blog</title>')
})
```
副次的な効果として、`visit`や`click`等の動作やブラウザからのアクセスが必要なくなるので実行時間が短くなります。テストの観点から実行時間が短く済むのは良いですね。


続く...
RailsとLaravelのドキュメントリンク集

RailsとLaravel両方触っているのですが、対応をまとめました。
表にするとリンクがうまくいかないページがあり、上がRails、下がLaravelという構成にしました。

言語公式
[ドキュメント](https://www.ruby-lang.org/ja/documentation/)
[PHP: Hypertext Preprocessor](https://www.php.net/)

FW公式
[Ruby on Rails Guides](https://guides.rubyonrails.org/)
[Laravel \- The PHP Framework For Web Artisans](https://laravel.com/)

FW日本語
[Ruby on Rails ガイド：体系的に Rails を学ぼう](https://railsguides.jp/)
[Laravel](https://readouble.com/laravel/)

API
[Ruby on Rails API](https://api.rubyonrails.org/)
[Namespaces \| Laravel API](https://laravel.com/api/6.x/index.html)
Docker上にCUI版の英語辞書を作成する。 

# はじめに
* CUI版の英語辞書で何かいいのはないかと探していたら
[sdcv](https://github.com/Dushistov/sdcv) というstardictのコマンドバージョンを見つけました。Docker上に環境を作ってみましたがなかなかいい感じです。

# 1. ホスト環境ディレクトリ構成
``` 
root
├── Dockerfile
├── dict_file（辞書ファイル格納ディレクトリ）
│   ├── 辞書ファイル1
│   ├── 辞書ファイル2
│   ├── XXXX


```
stardict形式の辞書ファイルをdict_fileに配置します。持っていない場合は下記サイトにいくつか使用できるものがあります。
http://download.huzheng.org/
手持ちの辞書ファイルをstardict形式に変換するツールもネット上にいくつかあります。

# 2. Dockerfile
``` 
FROM ubuntu:18.04
RUN apt update &&\
　　# 日本語環境、sdcv、lynxをインストールする
    apt install -y language-pack-ja-base language-pack-ja sdcv lynx --no-install-recommends &&\
    apt clean &&\
    rm -rf /var/lib/apt/lists/* &&\
    locale-gen ja_JP.UTF-8 &&\
    echo "export LANG=ja_JP.UTF-8" >> ~/.bashrc &&\
    echo 'export LANGUAGE="ja_JP:ja"' >> ~/.bashrc &&\
　　# 結果表示に使用するプログラムを指定する。
    echo "export SDCV_PAGER='/usr/bin/lynx -stdin'" >> ~/.bashrc
```
今回、ubuntuを使用しましたが他のイメージでも日本語表示をできるようにすれば構築可能と思います。
sdcv用環境変数、SDCV_PAGERはデフォルト指定なしですが結果をhtmlで出力する辞書が多いのでlynxを指定してみました。表示がrichになります。

# 3. コンテナbuildして起動する
``` 
docker build ./ -t sdcv
docker run --rm -v ${PWD}/dict_file:/root/.stardict/dic -it sdcv bash
```
辞書ファイルを格納するディレクトリをホストマシンと共有します。

# 4. 辞書ファイルの展開（必要に応じて）
``` 
tar -xjvf /root/.stardict/dic/辞書ファイル1.tar.bz2 -C /root/.stardict/dic
tar -xjvf /root/.stardict/dic/辞書ファイル2.tar.bz2 -C /root/.stardict/dic
```
アーカイブ形式の辞書ファイルはデフォルトの辞書サーチディレクトリに展開します。
sdcv用環境変数、STARDICT_DATA_DIRでもサーチディレクトリを指定することができます。

# 5. 単語検索（インタラクティブモード）
``` 
# sdcv
Enter word or phrase: <意味を知りたい単語>

```
![2020-01-07_061819.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60838/9ef15e12-34ed-da2a-2fba-246ecfb283e6.jpeg)
![2020-01-07_061849.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60838/9b653ef5-917c-df29-76b3-3254e4db6d76.jpeg)
![2019-12-31_163154.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60838/efdaf619-0f4f-7811-b6de-881882d01273.jpeg)
Ctrl+Cで終了するまで Enter word or phrase: のプロンプトが表示され連続して単語を検索できます。

# 6. 単語検索（ノンインタラクティブモード）
``` 
# sdcv <意味を知りたい単語>
```
1回のみの検索です。

# 7. help表示
``` 
# sdcv -h
```
デフォルトfuzzy-search（あいまい検索）ですが、オプションを指定すると完全一致で検索することができます。
# 8. man ページ

https://github.com/Dushistov/sdcv/blob/master/doc/sdcv.1

・sdcv用の設定ファイルや環境変数の説明が記載されています。
・複数の辞書を登録したときに$(HOME)/.sdcv_orderingに辞書名を設定して表示順を変更することができます。
・$(HOME)/.sdcv_historyに検索した単語が保存されます。ノンインタラクティブモードのみ？（ファイルの永続性は考慮が必要）

# 9. その他
コマンドベースなので検索結果を他プログラムのインプットにする等、いろんな活用が可能となります。
PythonでQRコードを作ってみる

まず最初に qrcode モジュールをインストールします。

```
pip install qrcode
```

後は、こんな感じです。

```Python
import qrcode

file_name = 'qr_cede.png'
qr_data = 'QRコードに埋め込まれる文字列でーす'
image = qrcode.make(qr_data)

image.save(file_name)
print('ファイル名 : ', file_name)
print('データ : ', qr_data)
print('QRコードを生成しました。')
```
iOS プッシュ通知に必要な証明書 p12とp8に関する疑問解消　（Firebase Cloud Messaging）

#はじめに
iOSでプッシュ通知の実装するには、色々は選択肢がある。

今回はそのうちの1つ、**Firebase Cloud Messagingを使う場合に必要な証明書に関する疑問を解消したい。**

#疑問って何？
そもそも**「p12とp8に関する疑問解消」**ってどゆこと？って事だが、、
以下の記事を見比べて欲しい。

[プッシュ通知に必要な証明書の作り方2019](https://qiita.com/natsumo/items/d5cc1d0be427ca3af1cb)

[iOSにおけるFirebase Cloud Messagingによるプッシュ通知の実装方法](https://qiita.com/rockname/items/4a092e39e571ddd19c5b)

上の記事では、**２つとも「iOS プッシュ通知に必要な証明書」**を取得する方法が紹介されている。

しかし！！！そこには大きな違いがある！！

###上の記事ではp12タイプの証明書、下の記事ではp8タイプの証明書
を取得しているのだ。

#Firebase Cloud Messagingではp8を使う
私は最初
「APNs用証明書ってなに？？」
「CSRファイって何？？」
「プロビショニングプロファイルって何？？？？！！！」

な状態でした。

そんな状態でプッシュ通知の実装に必要な設定を調べていると、もう混乱してきて・・・。

**原因はp12タイプの証明書と、p8タイプの証明書の２種類の証明書があることを知らなかったからだ。。。**

私はFirebase Cloud Messagingを使ってプッシュ通知を実装するつもりだったので、p8の証明書だけ取得すればいいのだ！！

#ちなみに
私はFirebase Cloud Messagingを使ったが、他にはAmazon SNSとかがあったりする。こっちではp12が必要となる。

[iOS プッシュ通知の証明書の交換手順 (Amazon SNS利用) 2019](https://qiita.com/chikara_funabashi/items/b218268402c652a22f1e)
UMTP-L1合格体験記

12/26にUMTP-L1試験を受験し合格したので、
今後受ける方の参考になれば幸いです:open_hands:

## なぜ受験したのか
・UML図が読めると自社のチームで開発していく上で設計方法を理解しやすくなるため。
・年間の目標に[UML図の資料を作成して、属人性を排除する]と決めて既存のUML図を更新する必要があるため。

## 予備知識
UML図に関しては全くもってありませんでした。
「四角形の図に矢印が付いててなんかそれぞれ関係してるんやなぁ〜:thinking:」としか思ってませんでした。

プログラミングの知識はC#で、
オブジェクト指向が少しわかる程度。(クラス、継承、抽象化、インターフェイスなど)
## 勉強について
勉強時間は２週間弱

勉強方法はひたすら↓の参考書を読むこと。
教科書+問題集という構成なので、
ひたすら教科書部分を読んで、理解できたらすぐ問題を解く。

私は1周終えた後、苦手分野の問題を再度解きました。

[参考書]
[[改訂版] UMLモデリング技能認定試験<入門レベル(L1)>問題集 -UML2.0対応](https://www.amazon.co.jp/%E6%94%B9%E8%A8%82%E7%89%88-UML%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0%E6%8A%80%E8%83%BD%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93-%E5%85%A5%E9%96%80%E3%83%AC%E3%83%99%E3%83%AB-%E5%95%8F%E9%A1%8C%E9%9B%86-UML2-0%E5%AF%BE%E5%BF%9C/dp/4774132454/ref=pd_sbs_14_img_0/355-5751850-0748217?_encoding=UTF8&pd_rd_i=4774132454&pd_rd_r=8b15cb9a-cb0d-40cb-ba2a-e80ddd8dc137&pd_rd_w=Bu6WE&pd_rd_wg=VILBK&pf_rd_p=ca22fd73-0f1e-4b39-9917-c84a20b3f3a8&pf_rd_r=FFK7RN7ZK0CFQA31YYGG&psc=1&refRID=FFK7RN7ZK0CFQA31YYGG)

[参考になったサイト]
[ITイメトレ](https://jibun.atmarkit.co.jp/scenter/ittrain/110_cal.html)
最後の総まとめに軽くやっておくといいです。
何問か試験範囲ではないものもあります。(コラボレーション図など)
## 試験結果
30問中24問以上(80%)正解で合格となります。
試験結果は28/30(93%)

| セクション     |    得点   |
|:-----------------:|:------------------:|
|開発プロセス/モデリングの基本概念|75%|
|ユースケース図|100%|
|クラス図|100%|
|シーケンス図|100%|
|コミュニケーション図|100%|
|ステートマシン図|100%|
|コンポーネント図|100%|
|配置図|0%|
|複数の図を使用したモデリング|100%|

2問ミスだったので
基本概念が４問、配置図が１問出たという計算ができますね。


##終わりに
これでUML図は読める様にはなったと思います！
しかし、実際にモデリングするのは難しいと思いますのでUMTP-L2の受験を来年に受けようと思います！
クリスマス、家に篭って勉強してよかった〜()
Goでnilでもメソッドを実行できる

こんにちは、ゴリラです。
せっかくの大晦日なのでGoのメソッドの仕様についてわかった面白い話をしようと思います。
みかんでも食べながら読んでみてください。

# nilでもメソッドを実行できる
このコードの実行結果はなんでしょうか？

```go
package main

import (
	"fmt"
)

type Foo int

func (f *Foo) do() {
	fmt.Println(f)
}

func main() {
	var f *Foo
	f.do()
}
```

nil pointerになると思った方はいると思いますが（自分はそうでした）、
答えは`<nil>`です。

## なぜ`<nil>`なのか
Goではメソッドはインスタンスを第1引数に受け取る関数になるとのことです。
[公式](https://golang.org/ref/spec#Method_expressions)に以下の様に書かれています。

```
The expression

`T.Mv`

yields a function equivalent to Mv but with an explicit receiver as its first argument; it has signature

`func(tv T, a int) int`
```

つまり`func (f *Foo) do()`は`func do(f *Foo)`として実行されます。
そのため、`do()`にnilのfが渡されて`<nil>`と出力されます。

# インスタンスなくてもメソッドを実行できる
以下のコードの実行結果は何でしょうか？

```go
package main

import (
	"fmt"
)

type Foo int

func (f Foo) do() {
	fmt.Println(f)
}

func main() {
	Foo.do(1)
}
```

答えは`1`です。

## なぜ1なのか
まず、`Foo`から直接`do()`を呼び出せる理由ですが、Goではメソッドはインスタンスではなく型に紐付いているからです。
そして先程解説したとおり、`func (f Foo) do()`は`func do(f Foo)`になるので、`Foo.do(1)`は1と出力されます。
ちなみに、1は暗黙的に`Foo`に変換されるので正しく出力されます。

## 余談1
以下のコードの場合、引数は不要です。

```go
package main

import (
	"fmt"
)

type Foo int

func (f Foo) do() {
	fmt.Println(f)
}

func main() {
	var f Foo // fはFooのインスタンス
	f.do()
}
```

これは推測ですが、
型で直接メソッドを実行する場合はインスタンス情報がないため引数で渡す必要だけど、
変数の場合はインスタンスがあるから引数は不要なのではないかと思います。

## 余談2
nilの`*Foo`型変数から値レシーバーのメソッドを呼び出すとnil pointerになります。

```go
package main

import (
	"fmt"
)

type Foo int

func (f Foo) do() {
	fmt.Println(f)
}

func main() {
	var f *Foo // fはnil
	f.do()
}
```

これも推測ですが、
`do`は`Foo`型の変数を受け取るので、`*Foo`から値を取ろうとしてnil pointerで落ちるのではないかと思います。

# 最後に
Go、奥深い…
頑張って公式ドキュメントを読もうと思いした。

ではみなさん、良いお年を〜
知識0のバカでも分かったVuex, Axios

# 勉強メモ
Vuex, Axiosについて勉強したことのメモ

# Vuex
Vuexは様々なコンポーネントからアクセスできる共有スペースみたいなもの。ここに変数を格納しておけば一元管理ができるというメリットがある。
諸々のことは`store.js`というファイルに書いていく。

### 状況
store.js内にある変数eventsデータを取得してEventList.vueで表示したい

## 使うときに書くコード (store.js)
`store.js`の`export default`の中身はこんな感じ

```store.js
export default {
  // 変数 vueの`data`に相当
  state: {
    events: []
  },
  // 以下2つはvueの`methods`に相当
  mutations: {
    ADD_EVENT(state, event){
      state.events.push(event)
    }
  },
  // actionsはmutationを呼び出すためのもの
  actions: {
    createEvent({commit}, event){
      // ここはaxiosが関係してくる
      return EventService.postEvent(event).then( () => {
        commit('ADD_EVENT', event)
      })
    }
  },
  // vueの'computed'に相当
  getters: {
    getElementById: state => id => {
      return state.events.find(event => event.id === id)
    }
  }

}
```



## 使うときに書くコード (EventList.vue)

`script`タグ内で
`import {mapState} from 'vuex`
↑これは`store.js`内の変数を使うための準備

importしたmapStateを以下のように使う

```EventList.vue
computed: mapState({
  events: state => state.events
})
```

**これで`<template>`において{{ this.events }}で使えるようになる。**
実は上記のを書かなくても`this.$store.state.events`で表示できるが、これだとeventsに対して処理を書くのが厳しいのでこんな感じの処理をする。

mapStateの書き方は色々あって、

```
computed: mapState({
  events: 'events'
})
```
```
computed: mapState['events']
```
のどれでも良い。

vuexのstate（変数）やgettersは次のように使う
`this.$store.state.(変数名 ex.events)`
`this.$route.getters.(getterの名前 ex.getElementById)`

actionsを使うときは
`this.$route.dispatch('(action名)', 引数)`


# Axios
APIを叩くためのもの。
serviceディレクトリに`~~Service.js`を作る

### 状況
store.jsのaction内でapiを叩きたい（上記コードのcreateEventアクション）
eventService.js内ではこんなことを書く。

```eventService.js
import axios from 'axios'

//叩くAPIの場所
const apiClient = axios.create({
  baseURL: `http://localhost:3000`,
  withCredentials: false,
  headers: {
    Accept: 'application/json',
    'Content-Type': 'application/json'
  }
})

export default {
  //eventsをget
  getEvents() {
    return apiClient.get('/events')
  },
  //eventをpost
  postEvent(event) {
    return apiClient.post('/events', event)
  }
}
```

`store.js`での使い方はこんな感じ

```store.js
.
.
.
action {
 fetchEvents({ commit }) {
      EventService.getEvents()
        .then(response => {
          commit('SET_EVENTS', response.data)
        })
        .catch(error => {
          console.log('There was an error:', error.response)
        })
    }
.
.
.


```
コピペはもうやめよう。Pythonでflattenするモジュールflatiの紹介

ちゃお・・・†

# はじめに
Pythonでネストしている (入れ子構造になってる) リストを1つのリストにまとめたい、つまりflattenしたい時ってたまにありますよね。そうした場合に対処する情報もWeb検索すればすぐ出てきますよね。でも、それをいちいちコピペするのって正直めんどくさくないですか？わたしはめんどくさい。というわけで、この記事ではPythonでflattenするモジュール`flati`を紹介します。

現時点ではPython 2.7とPython 3.4~3.8対応です。Pure-Pythonモジュールなので、対応しているPython環境さえあれば、Windows/macOS/Ubuntuなど色々なプラットフォームで動くと思います。

# 名前の由来
flatten処理とFulvio Fratiさん (一緒に研究したことある先生) をかけて`flati`と名付けました。「ふらてぃ」と発音してください。

# インストール
```
$ pip install flati
```

or

```
$ python -m pip install flati
```

# 使い方
```python

import flati

# flati.flatten()は入れ子になってるIterableオブジェクトを1要素ごとに返すジェネレーターです。
# 返却値を1つのIterableオブジェクトにまとめたい場合はlist()などを使ってください。
iterable = [(1, 2, 3), (4, (5, 6))]
list(flati.flatten(iterable))
# => [1, 2, 3, 4, 5, 6]

# もう1度書きます。flati.flatten()はジェネレーターです。
import types
isinstance(flati.flatten(iterable), types.GeneratorType)
# => True

# もし、ある特定のIterableオブジェクトをflattenしたくない場合は、"ignore"引数で指定してください。
iterable = [('abc'), ('def', ('g', 'hi'))]
list(flati.flatten(iterable, ignore=str))
# => ['abc', 'def', 'g', 'hi']
```

## Tips
もしもNumPyの`ndarray`をflattenしたい時は、NumPyの関数を使ってください。そっちの方が速いです。

- numpy.ravel()
 - コピーを作らないでオブジェクトを変更します。つまり破壊的処理です。
- ndarray.reshape(-1)
 - ビューを生成するので、`numpy.ravel()`と同じく高速処理に向いています。個人的にはこれが一番おすすめです。
- ndarray.flatten()
 - これはコピー処理を行うので若干遅いですが、破壊的処理でないので元の`ndarray`を保つことが出来ます。

参考: https://python.atelierkobato.com/flat/

# 先行事例
PyPIで "flatten" をクエリーにして検索して出てきたものを紹介します。`dict`型をflattenするものは対象外とします。

- flatten-list
 - ドキュメントのリンクが切れています。2017年8月でリリースが止まっています。`str`型と`bytes`型のみflattenしないようにハードコーディングされています。
- flatter
 - ドキュメントがありません。2016年8月でリリースが止まっています。[ソースコード](https://github.com/pelotoncycle/flatter/blob/master/flatter.py)を見ると何やら複雑な処理を行っているのでオーバーヘッドはどうなんでしょう？
- FlattenList
 - 2015年1月でリリースが止まっています。GitHub等での公開リポジトリがないのが不安かも。
- Flattener
 - 2016年3月でリリースが止まっています。`ignore`引数がないので`str`だけflattenしたくない時などに困るかも。
- flatlist
 - 名前の通り`list`型しか対応していません。2018年12月でリリースが止まっています。[ドキュメント](https://flattenit.readthedocs.io/en/latest/)はしっかりしています。

疲れたのでこの辺にしておきます。

# flatiを使うメリット

- Web検索して出てきたコードをコピペしなくて済む
- IterableなオブジェクトならなんでもOK
- `ignore`引数でflattenしたくない型を指定できる
- ジェネレーターなので巨大データを扱う場合にメモリ使用量がやさしい
- モジュール名の文字数が少なめ (5文字)
- 実装がシンプル ([ソースコード](https://github.com/ikegami-yukino/flati/blob/master/flati/py3.py))
- Pure-Pythonモジュールなので気軽に色々なプラットフォームで動く
- リクエストやバグ報告/修正についてのIssueとPull requestは日本語でもOK (題名は英語でお願いします)
 - くわしくはこちら: https://github.com/ikegami-yukino/flati/blob/master/CONTRIBUTING.md

# 厚かましいお願い
- もしも気に入ったら[flatiのGitHubリポジトリ](https://github.com/ikegami-yukino/flati)にスターをつけていただくと嬉しいです。たったの1クリックだけで、わたしの開発のモチベーションがアップします。
- スターだけじゃ物足りない！という方は、[flatiのGitHubリポジトリ](https://github.com/ikegami-yukino/flati)のSponsorボタンを押すとわたしにお金や物を送ることが出来ます。わたしの開発のモチベーションがかなりアップします。

# さいごに
これから数日間は、とりあえず作ったものの全然宣伝していなかったモジュールとかを紹介していきたいと思います。

震えて待て・・・†
useState チュートリアル

# 公式が一番です
- https://ja.reactjs.org/docs/hooks-intro.html
- が、初学者向けにちょっとしたチュートリアルを

## create-react-app

`create-react-app` をPCにinstallしていない場合は入れておいてください

```sh
npm install -g create-react-app
```

React用のappを作成

```sh
create-react-app react-hooks
cd react-hooks
npm run start (or yarn start)
```

一旦、 App.js内の記述は無駄な部分が多いので削除します

```js
function App() {
  return (
    <React.Fragment>
    </React.Fragment>
  );
}
```

## React Hooks
- 結局公式が一番わかりやすいです
    - 細かい話いいから実装方法だけ知りたいという人には本記事の方が早そうです
- https://ja.reactjs.org/docs/hooks-intro.html
- handlerの指定の仕方は2つのパターンがあります
    - handler内のロジックがシンプルな(１行ぐらいで済む)場合は即時関数
    - そうでない場合は普通に関数を定義して書いた方が可読性が高いです

```js
import React, { useState } from "react";
import "./App.css";

function App() {
  const [name, setName] = useState("John");
  const handleChangeName = e => {
    setName(e.target.value);
  };

  return (
    <React.Fragment>
      <h1>{name}</h1>
      即時関数: <input type="text" value={name} onChange={e => setName(e.target.value)} />
      <br />
      普通の関数: <input type="text" value={name} onChange={handleChangeName} />
    </React.Fragment>
  );
}

export default App;
```

## まとめ
- とても簡単ですね
- 画面遷移や複雑な状態(state)管理をしない場合はこれだけでも十分使いやすいです
Wiresharkちょっぴりいい感じな初期設定

# はじめに
問題解決の武器としてパケットダンプが有効な場合はいくつもあります。
大抵の場合はtcpdump、tsharkコマンドで調査は事足りるのですが
GUIを使った調査も分かりやすくて魅力的です。今回はWiresharkを使った解析で
私が便利だと思っている設定を２つご紹介します。

### 使用ソフトウェア
- Windows10
- Windows版 Wireshark 3.2.0

## 1. Wireshark に解析させなくてよいのでは？
Wireshark は便利で使いやすいと思います。ただパケットを解析しようとしたとき
デフォルト設定の効果からSeq/Ack番号が丸められたことによって
かえって初心者が混乱する様をちょくちょく見ます。
とりわけTCPに関しては、まるっと無効化してしまいましょう。
気が向いたら、Name Resolution 項目も無効化してしまいましょう。

### おススメ設定
![Wireshark設定３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559646/55ab7a4e-1fb9-61c1-1cd5-caac4540227f.png)


- メニューから、設定 - Appearance - Protocols - TCP をクリック
- チェックボックスを全て解除して、Ok をクリック

## 2. うわっ、私のカラム少なすぎ…？
Wiresharkはパケット一覧から任意の行をcsvなどにも出力出来るので
Excel大好きマンへの報告にとても便利なのですが、
デフォルトではカラムに物足りなさがあるので必要に応じて追加しましょう。

### 項目追加方法
![Wireshark設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559646/972cbd99-add6-0863-65bf-f17cea5093ec.png)


- メニューから、設定 - Appearance - Columns をクリック
- ＋をクリック
  - "New Column" 行が生成される
- New Column 行の種別フィールドをダブルクリックするとポート番号などの項目が選択できる
  - ない場合は、種別をCustomに指定して、Fieldsに表示させたい項目を直接書く(tcp.seq などなど)

### 項目追加方法その２(パケットダンプを持っている人向け)
![Wireshark設定２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559646/ee613b48-0974-69f8-65a4-c8a8c441400f.png)


1. 表示させたい項目を含んでいるパケットダンプを開く
2. 表示させたい項目があるフレームに移動
3. 画面中央のパケット詳細画面で、表示させたい項目を選択
4. 右クリックから、列として適用を実行

#### おススメの追加項目
1. Source Port
2. Destination Port
3. Sequence Number
4. Acknowlegment Number

---
### おまけ
- 古いバージョンのWiresharkと性能の残念なPCを使っている場合、起動やファイルを開くだけで
そこそこ待たされることがありました。そのようなとき私はプラグインディレクトリから
ファイルを移動させて少しでも速度を稼ぐことをやっていました。
今どきの環境ならギガオーダーでも楽勝だと思うので今回は割愛です。
PythonでのJSONとYAML／TOMLの相互変換

# PythonでのJSONとYAML／TOMLの相互変換

JSONだとコメントが書けない点が不便で、YAML/TOMLにチャレンジしてみました。configparserを利用するiniは今回の対象外です。

定義形式に慣れていない場合、最初からYAML/TOMLで定義を書き出すよりは、普段使いの定義ファイルから辞書経由で別形式に変換して進めるのが理解が早いと思います。プログラム内部では辞書経由でアクセスするため、処理自体を変える必要はないと思います。
今回は、以下のデータを元にテストしたいと思います。

```json:dat.json[テストデータ]
{
  "country": "Japan",
  "user": [
    {
      "name": "Taro",
      "phone": ["111-222-3333", "222-333-4444"],
      "age": 10
    },
    {
      "name": "Hanako",
      "phone": ["555-666-777"],
      "age": 20
    }
  ]
}
```

## 変換方法
jsonに加えて、yamlおよびtomlライブラリを利用します。

### JSON→YAML
JSONからYAMLに変換するにはyamlライブラリを利用します。

```python:json2yaml.py
import yaml
import json

with open('dat.json') as file:
    # JSONから辞書
    obj = json.load(file)
    # 辞書からYAML
    ym = yaml.dump(obj, Dumper=yaml.CDumper)
    print(ym)
```

```yaml:実行結果
country: Japan
user:
- age: 10
  name: Taro
  phone:
  - 111-222-3333
  - 222-333-4444
- age: 20
  name: Hanako
  phone:
  - 555-666-777
```

### YAML→JSON
YAMLファイルのロードはsafe_loadを利用したほうがよさそうです。参照方法はJSONと同じなので違和感なく使えると思います。（処理結果は、当然変換前と同じになるので省略）

```python:yaml2json.py
with open('dat.yaml') as file:
    # YAMLから辞書
    obj = yaml.safe_load(file)
    # 辞書からJSON
    js = json.dumps(obj, indent=2)
    print(js)
```

### JSON→TOML
JSONからTOMLに変換するにはtomlライブラリを利用します。使い方はYAMLやJSONと同じです。なお、pytomlはメンテされていない模様。

```python:json2toml.py
import toml
import json

with open('dat.json') as file:
    # JSONから辞書
    obj = json.load(file)
    # 辞書からTOML
    tm = toml.dumps(obj)
    print(tm)
```

```toml:実行結果
country = "Japan"
[[user]]
name = "Taro"
phone = [ "111-222-3333", "222-333-4444",]
age = 10

[[user]]
name = "Hanako"
phone = [ "555-666-777",]
age = 20
```
phone項目の最後のカンマがちょっと気になりますねｗ

### TOML→JSON
TOMLの読み込みもJSON/YAMLと同じような使い方です。

```python:toml2json.py
with open('dat.toml') as file:
    # TOMLから辞書
    obj = toml.load(file)
    # 辞書からJSON
    js = json.dumps(obj, indent=2)
    print(js)
```


# まとめ
YAML/TOMLともに一長一短がありますが、JSONに慣れている人はTOMLのほうが読みやすいかなと感じました。

# 今後やりたいこと
toml.dumpsのTomlEncoderを独自実装して以下を対応したいと思います。
- TOMLでサブセクションのインデント対応(json.dumpsのindent相当)
- 配列の項目の最後のカンマを除去
画像認識（機械学習PS）の一部をちょっとだけとまとめてみた。

#経緯
機械学習プロフェッショナルシリーズの画像認識を読んでから実際にCNNのコードを書くと、特に説明がなかったのにも関わらず、すんなりと理解できたので、共有できればなと思ったからです。

#そもそも画像認識とは
画像の中から、人や動物、文字や物体の形状を認識する技術です。

また、画像認識は**物体認識**と**シーン認識**に分けられ、物体認識はさらに**インスタンス認識**と**クラス認識**に分けられます。

```
画像認識
├─物体認識
│   ├─インスタンス認識
│   └─クラス認識
└─シーン認識
```

**物体認識**：入力画像に写る物体を認識し、適切なラベルをつけること。
**シーン認識**：複数の物体が写り、意味のなす状況を表現したもの。
**インスタンス認識**：レインボーブリッジの画像が入力されたとき、「橋」と出力するのではなく、「レインボーブリッジ」として出力するもの。
**クラス認識**：レインボーブリッジの画像が入力されたとき、「橋」と出力すること。入力画像の物体の属する概念を予測するもの。

#画像認識のキーワード
画像認識にはいくつかの重要な処理があります。それを順に説明します。

**局所特徴抽出**
画像中の点やエッジなどの特徴の周りの画素値や微分値をベクトルにして抽出したもの。

**統計的特徴抽出**
計測されたデータはノイズを含んでいたり外乱を受けたりするので、計測データは実際のデータの周りに分布してしまいます。そこで、計測したデータの確率統計的な構造に基づいてさらに特徴抽出を行うことで、ノイズや外乱の影響を受けにくい頑健な特徴に変換させること。

<img width="450" alt="スクリーンショット 2020-01-15 00.00.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557948/cb208a06-dcaf-7c8f-e154-be50cd8e4d6c.png">


**コーディング**
画像中の局所特徴を認識に有効な次元数のベクトルに変換すること。

**プーリング**
画像中に存在する複数のコーディング後の特徴ベクトルを、1本のベクトルにまとめること。

#深層学習
局所特徴抽出、統計的特徴抽出、コーディングやプーリングを多段に重ねた構造を深い構造という。この深い構造を入力から出力までで学習することを**深層学習**といいます。

メリット：
深層学習を利用することで、前述した局所特徴抽出やコーディング手法に詳しくなくても、入力データに対して望ましい出力を予測するシステムの構築が可能になる。

デメリット：
適切なネットワーク構造の設計やパラメータの学習が難しい。
必要とする訓練データ量が増え、計算コストが大きくなる。
計算途中がブラックボックス化することより、他人に説明することが難しい。

#畳み込みニューラルネットワーク

あるユニットが隣の層の全てのユニットと結合しているネットワーク層を**全結合層**といいます。
しかし、サイズの大きい画像に適用するとネットワークに含まれるパラメーター数が膨大となり、学習させるのが難しくなります。


そこで、画像特有の性質を利用します。

ある画素と近い画素どうしは強い関係を持ち、距離が離れると関係性は弱くなるという性質を利用して制約をかけます。そうするとことで、パラメーター数を大幅に減らし、学習をしやすくすることができます。
この、上層の近隣に存在するユニット群だけと結合している局所領域を**局所的受容野**といいます。

また、画像のどの領域でも有効な特徴は、**重み共有**を行う。重み共有によってさらにパラメータ数を減らすことができます。

画像の空間的特性を活かすためにユニットは平面状に並べられる。このようなユニット群を特徴マップと呼ぶ。この入力画像にカーネルを適用して特徴マップを得ることは、入力画像にカーネルを畳み込み演算することと等価になります。このような局所受容野と重み共有の特性を持つ層を**畳み込み層**といいます。


#コードだと
・特徴抽出

```
model.add(Conv2D(16, (3, 3), padding='same', input_shape=(28, 28, 1))
```
Conv2Dのクラスでを使い画像から特長を抽出します。
16種類の3×3のカーネルを入力データにかけ、16枚の出力データを得る。
<br/>
・活性化関数

```
model.add(Activation='relu')
```

正のところはそのまま出力して、負のところは0にして出力するRelu関数。
<br/>
・プーリング層

```
model.add(MaxPooling2D(pool_size=(2, 2)))
```

2×2一番大きい値を取り出し、より特徴を際立たせることができます。
<br/>
・過学習の対策

```
model.add(Dropout(0.5))
```
50％を捨ててデータの偏りをなくす。
<br/>
・全結合層

```
model.add(Dense(512)
```

全結合をし、出力を512個にする。

```
model.add(Dense(3, activation=’softmax’)
```
最後の出力層で最終的な出力数を決める。(私の場合は、3つでした。)
ソフトマックス関数を使って、それぞれの出力の予測確率を合計すると1になるという風に変換をする。
(ex.クラスが3つの場合(0, 9, 1)で[0]の確率が0％、[1]は90％、[2]は10％となる。）

#最後に
機械学習プロフェッショナルシリーズの画像認識は、画像認識で使われる有名なフィルターや分類器をほとんどのページを使って紹介しているます。画像認識やディープラーニングについて全く知らない方や、数学が苦手な方は読むのが難しいかなと思いました。

私も、たくさん勉強してからまた読みたいと思います。
Laravel6.0でログイン機能の実装

### はじめに
2019年9月3日にLaravel 6.0がリリースされました。
それに伴い、ログイン実装の手順が変わったので、自分用のメモとして残します。

本記事とあまり関係ない？かもしれませんが、バージョン確認のコマンドも気になる方がいるかもしれないので残しておきます。
#### バージョン確認コマンド

```
$ php artisan -V
```
#### バージョン5.8までのログイン実装コマンド
```
$ php artisan make:auth
```
上記のコマンドを実行するだけでログイン機能が実装できていました。
しかし、バージョン6.0からは下記の流れになります。

### バージョン6.0からのログイン実装の流れ
#### 1.laravel/uiをインストールする

```
$ composer require laravel/ui
```
laravel/uiという別パッケージで管理されるようになったので、composerでインストールをしてください。

#### 2.artisanコマンドでログイン関連のファイルを作成

vueで実装する場合は、

```
$ php artisan ui vue --auth
```

Reactで実装する場合は、

```
$ php artisan ui react --auth
```
上記のコマンドのどちらかを実行します。

#### 3.テーブルの作成
2でマイグレーションファイルも作成されているので、DBにテーブルを作成しましょう。

```
$ php artisan migrate
```

#### 4.VueやReactで必要なパッケージのインストール
※　npmが必要になるので、もし入っていない方はインストールをお願いします。

```
$ npm install
```
#### 5. インストールしたパッケージをビルド

```
$ npm run dev
```

上記の流れでログインの実装は完了できました。

#### 6. ブラウザで確認
トップページを見てみると、右上にLoginとRegisterの表記があれば実装は成功しています↓
![login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507371/0eeae534-5681-3fd2-b39f-75f8e52f1928.png)
このような感じです。見えにくくて申し訳ありません。笑

### さいごに
最後まで見てくださってありがとうございます！！
今回の記事で誤字、脱字等ありましたらお手数ですが、教えていただけると助かります。
便乗して「スクラムマスターを雇うときに聞いてみるとよい38個の質問」に答える（ふりかえりのみ）

[「スクラムマスターを雇うときに聞いてみるとよい38個の質問」に答える](https://qiita.com/viva_tweet_x/items/55258f657eb0b11eaf47)の冒頭を読み、とても良い取り組みただと感じ、真似て見ようと思いました。

全部は大変なので「ふりかえり」のみ答えてみます。
また、2019年12月31日時点の回答であり、日を重ねる毎に回答や考えは変る可能性があります。

# ふりかえりについて

## だれがふりかえりに参加してよいか？チームだけか？プロダクトオーナーも参加してよいか？

プロダクトオーナーに限らずプロダクトに関わるメンバーが全員が関わるふりかえりの場を設けるべきだと考えています。
規模が大きくなってくると難しいかもしれませんが、四半期毎や半期毎でも良いのでそうすべきだと考えます。

また、開発チームだけで行うふりかえりも必要な場合が多いと感じます。

ふりかえは必要な種類だけ用意し、必要で可能な頻度で実施すべきだと思います。

過去に関わったチームでは、毎日、毎週、毎月でふりかえりを行っていました。

## チームが健全な状態かをふりかえりの中で確認するか？それとも不要か？もし必要だとするとどうやって確認するか？

ふりかえりでチームの健全性を測ることは重要だと考えます。
チームの健全性を測るために[ふりかえりで4つの成長指標](https://qiita.com/jumperson/items/be9f6d3a192631689da8)を使ってバランスを見ていました。
また、健全な状態はどういう状態なのかチームで話し合うことも重要だと感じます。ただ、チームで話し合うためには信頼関係が必要であり、それが築けていない状態では1on1などで個別にヒアリングすることも検討します。

## 過去に使ったふりかえりのフォーマットはどんなものか？

多くはありませんが、以下のフォーマットを使ってふりかえりを実践した経験があります。

- KPT
- [私的ふりかえりの教科書](https://qiita.com/jumperson/items/0bf068edb805d9d20220) に沿ったふりかえり
- [4つの成長指標](https://qiita.com/jumperson/items/be9f6d3a192631689da8)

## どうやってマンネリを防いでいるか？

- 取り組むプラクティスを変える
- ふりかえりの頻度を変える
- ふりかえり対象期間にどんなことがあったかを事前に緻密にまとめ、その内容をもとにふりかえりを実施する

## チームはいつも妥当なアクションアイテムを選んではいるものの、実際に行動できていない。この悪しき習慣をどう扱うか？

まずはアクションアイテムに取り組む時間を確保します。
後は、予定通り時間が確保できたかをふりかえり、確保できなかった場合は確保できるように改善を行います。
時間は確保できているが成果が上がっていない場合は、成果が上がるようにゴール設定などのフォローアップを行います。

## どうやってアクションアイテムのフォローアップを薦めるか？

フォローアップが必要な状況によるが、他チームの協力が必要であれば協力の要請や、ゴールが設定できなければゴールの設定します。

いずれにせよ、権限移譲の範囲を明確にし、必要であれば細かくフォローアップします。
Git [fatal: update_ref failed for ref 'HEAD': cannot update the ref ~] 解決方法

# 概要
- fatal: update_ref failed for ref 'HEAD': cannot update the ref ~ と出たときの対処法
- 複数のPC（今回はlinuxとwindows）で作業していると、fileの権限が変わっていてroot userでしか作業できなくなったりする。
- gitをsudo実行したりしてもなる可能性がある。
- 権限を直せば解決する。

# 内容
1. 以下でgit 管理しているフォルダの権限を見てみる。特に、.gitの中や、新しく追加したファイルを確認する。

```
    -  ls -la
```
2 . user権限がrootになっているファイルがあれば、以下を実行する。
    
    - sudo chown -R user名:group名 管理しているfolder名

# おわり
- 解決するはず。
Alpine LinuxでRTCM3.3をNtrip Casterに送る

##開発環境

+ alpine-rpi-3.11.2-armhf.tar.gz
+ Pi3 B+

##概要

<img width="732" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181687/99048d83-0811-9908-87b7-738ba2485adc.png">

##Alpine linuxの初期設定
https://qiita.com/syui/items/7851423ddc132b751fa3

##使い方
+ [Alpine Linux](https://alpinelinux.org/downloads/)をダウンロードしてきてSDカードに展開。
+ 以下の自動設定スクリプトをダウンロードして、str2str-confフォルダの中にあるstrsvr.txtを自分の環境に合わせて編集する。空欄の場合は""の記号を消してください。<p>
https://drive.google.com/open?id=1ksPANbfdKbtqYTX__N8r08ONmt04Ukj6
</p>(update Jan/5/2020)
+ フォルダの中身をSDカードにコピー。フォルダは不要。
+ Raspberry PiにSDを差し込んで起動。
+ rootでログインして、setup-alpinで初期設定。
+ 以下のコマンドを実行

```sh
# sh /media/mmcblk0p1/run.sh
```

lbu commit -dまで済ませて終了するので、再起動するとntrip caster serverにデータ投げるようになります。
screenでstr2strというセッション立ち上げるようにしてありますので、psでプロセス生えてるか見るとか、アタッチして様子見してみるといいと思います。

+ 参考資料
[Linux screenコマンド使い方](https://qiita.com/hnishi/items/3190f2901f88e2594a5f)

```sh
screen -r str2str
```

##おわり
別にRTCM3.3じゃなくてもNMEAだろうがBINEXでもいいはずだけど、RTKやるために最初に必要になるのはRTCM3.3だと思うので、とりあえずタイトルにしました。
クライアント側もラズパイとかのOS乗ってる物ならば、NMEAを送り返してRTK結果をクラウドに貯めるとかも面白そうですね。

容量不足対策でstr2strのバイナリ入れといたので、横着したい人はalpine-sdkのインストールからアンインストールまでを削って、/usr/local/binに入れてrun.sh回せば完成します。
Android(Kotlin)で標準の音声合成(TextToSpeech)を細かくカスタマイズして使う

#概要
[Android(Kotlin)で標準の音声合成(TextToSpeech)を使う](https://qiita.com/maKunugi/items/059861da848219859f34)の続きになります。
上記の記事では、Android(Kotlin)で利用可能な音声合成、TextToSpeechの使い方をメモしましたが、より細かくカスタマイズして使う方法についてメモしていきます。

## 実装

すでにTextToSpeechのインスタンス生成が済んでいる前提でメモしていきます。
TextToSpeechの基本的な使い方に関しては、[Android(Kotlin)で標準の音声合成(TextToSpeech)を使う](https://qiita.com/maKunugi/items/059861da848219859f34)をご参照ください。

```kotlin
class MainActivity : AppCompatActivity(), TextToSpeech.OnInitListener {

    private var textToSpeech: TextToSpeech? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        // ~省略~
        textToSpeech = TextToSpeech(this, this)
        // ~省略~
    }
```
### 読み上げのピッチ・スピードを調整する

#### 読み上げのピッチ
読み上げ時のピッチ(高さ)を設定することが可能です。
ピッチはTextToSpeechの```setPitch (float pitch)```メソッドで行います。
デフォルトは1.0(基準)です。高くしすぎると音割れが起きます。

```kotlin
textToSpeech?.setPitch(0.6f)
```

#### 読み上げのスピード
読み上げのスピードは```setSpeechRate (float speechRate)```メソッドで行います。
デフォルトは1.0で、例えば2.0を設定すると基準の倍の読み上げ速度になります。

```kotlin
textToSpeech?.setSpeechRate(4.0f)
```

### 読み上げ時にパラメータを渡す
前回の記事でも少し触れましたが、TextToSpeeachは読み上げメソッドでBundleのパラメータを渡すことができます。
https://qiita.com/maKunugi/items/059861da848219859f34#%E8%AA%AD%E3%81%BF%E4%B8%8A%E3%81%92

定義

```
public int speak (CharSequence text, 
                int queueMode, 
                Bundle params, 
                String utteranceId)
```

パラメータには、
- KEY_PARAM_STREAM: オーディオストリームを変更する際に利用
- KEY_PARAM_VOLUME: 音のボリュームを調整するのに利用
- KEY_PARAM_PAN: 音の定位を調整するのに利用

上記の３つのパラメータを渡すことができます。

#### KEY_PARAM_STREAM
KEY_PARAM_STREAMはオーディオストリームを設定することができます。
利用可能な定数はAudioManagerに定義されているストリーム用の定数群になります。


```kotlin
        /*
        AudioManagerのSTREAM定数
        STREAM_ALARM
        STREAM_DTMF
        STREAM_MUSIC
        STREAM_NOTIFICATION
        STREAM_RING
        STREAM_SYSTEM
        STREAM_VOICE_CALL
         */

params.putInt(TextToSpeech.Engine.KEY_PARAM_STREAM, AudioManager.STREAM_MUSIC )
```

### KEY_PARAM_VOLUME
KEY_PARAM_VOLUMEによって読み上げの音量を変更することができます。
0~1の間での指定。0:無音　1: 最大音量 (Default)

```kotlin
params.putFloat(TextToSpeech.Engine.KEY_PARAM_VOLUME, 0.7f )
```
### KEY_PARAM_PAN
KEY_PARAM_PANは読み上げ音の定位を指定することができます。
-1~1の間で指定が可能です。　-1: 左 　0: 中央(Default)　1: 右

```kotlin

params.putFloat(TextToSpeech.Engine.KEY_PARAM_PAN, 1.0f)
```

上記のように、TextToSpeechは細かく読み上げの設定ができます。
以上、Android(Kotlin)のTextToSpeechを細かく調整する方法についてのメモでした。
Mac 開発環境設定メモ(Java/Node.js/Go)

#1. 日本語変換
##1.1 caps lockで日本語変換させる
英語キーボードの場合は、これやっておいても良さそう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131481/94e4b67e-edbd-8beb-a495-5bd9637d6ede.png)

##1.2 ショートカットキー 1
「Control+Shift+J」が「かな」キー、「Control+Shift+;」が「英数」キーと同じ役割をし、しかも２度押しすることで文字を打った後でもモードを変換できる。これはこのショートカットを覚えた方が使い勝手は良くなりそう。

##1.3 ショートカットキー 2
上記に加え、これを覚えるともっと良い

| 変換 | キー |
|:--|:--|
| ひらがな | ctrl + j |
| カタカナ | ctrl + k |
| 全角英数 | ctrl + l |
| 半角英数 | ctrl + ; |

#2. iTerm2
Terminalは縦横分割できるiTerm2を使う。
https://iterm2.com/

Color SchemeはIcebergがいいらしいのでこれを設定
http://cocopon.github.io/iceberg.vim/

また、等幅フォントのSF monoを使う場合は、個人用ライブラリにフォントをコピーして利用可能。

```
> cp /Applications/Utilities/Terminal.app/Contents/Resources/Fonts/* ~/Library/Fonts/
```


#3. Brew
https://brew.sh/index_ja

#4. Docker
https://www.docker.com/products/docker-desktop

#5. Visutal Studio Code
##5.1 本体
https://code.visualstudio.com/

##5.2 Exntension
https://github.com/hiro-sun/vscode-emacs

#6. Node.js
npm
node

#7. Java
MacでJDKの切り替え。.bash_profileに以下を書いて、source ~/.bash_profileで切り替え。

```..bash_profile
# SWITCH TO JAVA VERSION 8
export JAVA_HOME=`/usr/libexec/java_home -v "1.8"`

# SWITCH TO JAVA VERSION 13
#export JAVA_HOME=`/usr/libexec/java_home -v "13"`

export PATH=${JAVA_HOME}/bin:${PATH}
```
#8. Go

```
> brew install go
```

#9. Spring Tool Suite / Eclipse
#9.1 STS
https://spring.io/tools3/sts/all

#9.2 Eclipse + Spring Tools
https://www.eclipse.org/
https://spring.io/tools

#9.3 Keymapをemacsに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131481/446bd467-d418-933a-57c8-83090eaa7d21.png)


#10. DB / Redis
https://tableplus.com/
https://dbeaver.io/

#11. gif動画、画像編集
brew cask install licecap
brew cask install gyazo
brew cask install gimp

#12. Screen Capture保存先変更
defaults write com.apple.screencapture location ~/SS/;killall SystemUIServer

#参考URL
https://qiita.com/imura81gt/items/860ac6196e571c17b7e1
https://book.mynavi.jp/macfan/detail_summary/id=90165
https://qiita.com/kamorits/items/781e07d4779d6eb44b2f
tensorflow liteのGPU実行を試したいけどビルド出来なかった時

基本的には
https://www.tensorflow.org/lite/performance/gpu
を呼んでいけばいいのだけど、今はこの通りにやってもビルド出来ない。


次のような変更があり、一部のクラスが変わっている
https://github.com/tensorflow/tensorflow/commit/23a967474a3f1823235ab4201fd27e4dcd5725d6#diff-8eb564dd0ef4c2d24e69c2aa523bd047

CameraExampleViewController.mmを次のように変更すれば良い

```diff

- (void)dealloc {
#if TFLITE_USE_GPU_DELEGATE
  if (delegate) {
+    DeleteGpuDelegate(delegate);
-    TFLGpuDelegateDelete(delegate);
  }
#endif
  [self teardownAVCapture];
}
```


```diff
#if TFLITE_USE_GPU_DELEGATE
    
-  TFLGpuDelegateOptions options;
-  options.allow_precision_loss = true;
-  options.wait_type = TFLGpuDelegateWaitTypeActive;
-  delegate = TFLGpuDelegateCreate(&options);
-  interpreter->ModifyGraphWithDelegate(delegate);
    
+    GpuDelegateOptions options;
+    options.allow_precision_loss = true;
+    options.wait_type = GpuDelegateOptions::WaitType::kActive;
+    delegate = NewGpuDelegate(&options);
+    interpreter->ModifyGraphWithDelegate(delegate);
#endif
```
mpsytの再生が途中で止まるときは

Linux Mint 18.3上にvenvでpython 3.5.2の隔離環境を作成し、そこにmpsytを入れて時々YouTubeの音楽を楽しんでいる。しかし、久しぶりに音楽を再生したら、途中で止まるようになった。
そこで、これまでmplayerをプレーヤー本体として使ってきたが、mpvに変更して見ることにした。
変更手順は以下の通り。

- mpvをインストール

```
$ sudo apt install mpv
```

- mpsytにmpvをプレーヤーとして設定

```
$ mpsyt
> set player mpv
```

上記設定で何曲か試したところ、再生途中で止まることが無くなった。
[Scala] 関数リテラルとクロージャー

# はじめに

関数について、以下を記事にしてみました。

- 関数リテラル
- クロージャー

勉強したことを自分の備忘録として残しています。
まだま勉強中なので、誤りあればご指摘頂ければと思います。

# 関数リテラル

関数リテラルは関数がそのまま値として扱える。
例として、2つ数値の加算する関数リテラルをあげる。

```scala
(x: Int, y: Int) => x + y
```

`=>` は左辺のものを右辺に変換することを意味する。

値としての関数なので、変数に格納でき、カッコをつけた通常の関数と同じ扱いができる。

```scala
scala> val sum = (x: Int, y: Int) => x + y
sum: (Int, Int) => Int = $$Lambda$3124/1139694068@6c8f4960

scala> println(sum(1, 1))
2
```

これには、短縮できる形がある。(プレースホルダー構文)

```scala
scala> val sum2 = (_: Int) + (_: Int)
sum2: (Int, Int) => Int = $$Lambda$3133/124666644@5f26f8b3

scala> println(sum2(1, 1))
2
```

# クロージャー
関数リテラルでは、渡されるパラメータだけを参照していたが、別の場所で定義された変数を参照できる。
クロージャーとは、別の場所から定義られた変数を使うことで **閉じた項** なることから **クロージャー** と呼ばれる。
例として、変数thresholdを定義して閾値以上かどうかを判定する。
`(x: Int) => x > threshold` は thresholdをパラメータとして渡してないが別で定義することで参照できる。

```scala
scala> val threshold = 0
threshold: Int = 0

scala> val judg = (x: Int) => x > threshold
judg: Int => Boolean = $$Lambda$3135/535968552@215e1267
```

`judg` を使用して結果を確認する。問題なく、別で定義し変数thresholdを利用して閾値判定できる。

```scala
scala> judg(3)
res4: Boolean = true

scala> judg(-1)
res5: Boolean = false
```

# 参考
[Scalaスケーラブルプログラミング第3版](https://www.amazon.co.jp/dp/B01LYPRFI7/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
Cのconstでの関数引数制限

[link-1]:https://qiita.com/yohhoy/items/feadbe1a245caadc44f7
[link-2]:https://qiita.com/go_astrayer/items/63e8a059ae20a5d5e000

#完全に備忘録
以下の記事で詳しく説明されています。

>[図解：constとポインタと参照][link-1]
[変数の const 付け方一覧][link-2]


#結局何？
ポインタ(メモリ参照位置)を変更禁止にするか、中身の数値(メモリ参照位置に入っている値)です。
自分で組み込みするときはこれを使うと意図せぬ上書きとかのエラー回避に使えそうなのでしっかり覚えたいところ。

##ついでにポインタの覚えてること
ポインタに関して覚えてることも記載します。


 - 変数は数値変数とポインタ変数の2種類がある
    - 基本的に数値として扱う目的、アドレスを示す役割に分かれている。というか分けて考えた方が考えやすいです。
    - `*`,`&`はキャストみたいなもの。
 - `int* p`
    - ポインタ(アドレス本体)`p`
    - 数値(アドレスの中身)`*p`
    - ポインタの使い方の基本はアドレス位置を示すので`*`がついていると数値として扱う
 - `int p`
    - ポインタ(アドレス本体)`&p`
    - 数値(アドレスの中身)`p`
    - 主目的が数値を扱う変数。`&`がついているとポインタとして扱える
Spring Boot / Spring Framework よく使うメモ

#1.application.properties

```application.properties
server.port = 18080

logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.level.ore.ore.package=ERROR

spring.datasource.url=${DB_URL}
```

##1.1 server.port
Spring Bootには[Common Application properties](https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#core-properties)というプロパティファイルがあり、デフォルト値を持つものがある。

例えば、server.portは8080がデフォルトだが、ポートが衝突する場合は別のポートを指定する必要がある。

プロパティファイルに何も記述が無い場合は、server.port = 8080が指定されているのと同じ状態である。

##1.2 logging.level
logging.level.*
の*部分をパッケージ名に変更することで、パッケージ単位でログ出力のレベルを変更できる。

##1.3 環境変数を使う
spring.datasource.url=${DB_URL}
といった形で${環境変数名}をプロパティファイルに記載。
IntelliJ, Eclipse, STSでSpring Bootを実行する際、以下の場所で環境変数を定義して実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131481/a36d5200-0dbb-e4bd-5433-d1c14876368c.png)


##1.4 Profileを使う
application-prod.propertiesという名前でもう１つプロパティファイルを作成し、Spring Bootを実行する際、以下の場所でVM argumentsに-Dspring.profiles.active=prodを指定して実行する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131481/9c26b043-9eed-4b98-5aac-cab77c89f364.png)

##1.5 AutoConfigure
TBD
[macOS][Kotlin]結果とエラー情報を持つデータ

<p>Javaでは結果を関数の戻る値で、エラー情報は例外で、だったが、Androidは例外を勧めていないことは以前から感じていた。Kotlinでは、例外は復旧できない致命的な状況で利用とし、既存のJavaモジュールが投げてくる例外を包み込みResult型があったりしている。</p>

<p>自分でKotlinでプログラミングする際、あえて例外を利用する必要はないと思うので、どんなやり方が合うのか調べてみて辿り着いたコードを紹介する。参考にしたのは、<a href="https://github.com/Kotlin/KEEP/blob/master/proposals/stdlib/result.md">ここ</a>。</p>

<p>AndroidはActivityやFragmentが再生成されるということから、ActivityやFragmentのメンバー変数でModelを持たないだとか、再生成されてもModelが破棄されない。ModelはActivityやFragmentをメンバー変数で持っていると再生されると破棄されたものにアクセスしてしまう問題がある。それの解決策としてJetpackのViewModelやLiveDataがあるのだが、LiveDataではエラーを例外で渡せない。結果とエラー情報がLiveDataとなっているのが扱いやすいということがあるので、結果とエラー情報を持つ型を用意することにした。</p>

<pre><code>sealed class FindUserResult {
    data class Found(val user: User) : FindUserResult()
    data class NotFound(val name: String) : FindUserResult()
}
</code></pre>

<p>Swiftだとenumを利用すればだが、Kotlinのenum classは状態を定数で持つだけ。その代わり、sealed classを使えば値を持てる。そして、サブクラスを用意することによって、状態を持てる。</p>

<p>上の例では、FindUserResultのサブクラスがFoundとNotFoundになっていて　、プライマリコンストラクタでそれぞれのプロパティのuserとnameを宣言している。</p>

<p>この型を戻り値にした関数がこれ。</p>

<pre><code>fun findUserByName(name: String): FindUserResult {
    ....
    if (見つかった) return FindUserResult.Found(user)
    else          return FindUserResult.NotFound(name)
}
</code></pre>

<p>成功したらFoundを返している。失敗の場合はNotFoundを返している。処理の結果や、エラー情報はコンストラクタのパラメータで設定している。</p>

<p>この戻り値を受け取った側のコードがこれ。</p>

<pre><code>val result = findUserByName("bitz")
when (result) {
    is FindUserResult.Found -> println("find ${result.user}")
    is FindUserResult.NotFound ->println("find ${result.name}")
}
</code></pre>

<p>型で成功か失敗が分かり、プロパティで結果やエラー情報が取れる。</p>

【関連情報】
<a href="https://github.com/Kotlin/KEEP/blob/master/proposals/stdlib/result.md">Encapsulate successful or failed function execution</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />