OmniAICreator/Qiita-1.07M huggingface dataset:
React-Bootstrapで色々使ってみる -Navbar- 

[React-Bootstrapを使えるようにする](https://qiita.com/NShimpei/items/f3962353677dff00b7e6)でboot-strapが使えるようになったので、色々触ってみる。今回はNavbar。
ほぼ[本家](https://react-bootstrap.github.io/)のコピペなので、詳しくは本家参照。


#Navbar
ヘッダーにあたる部分。多分全アプリで必要だと思う。

とりあえずコピペしてみる。

```App.js
import React, { Component } from 'react';
import { Navbar, Nav } from 'react-bootstrap';
import LOGO from './logo.svg';

class App extends Component {
    render() {
        return (
            <Navbar bg="dark" variant="dark">
                <img
                    src={LOGO}
                    width="30"
                    height="30"
                    alt="React Bootstrap logo"
                />
                <Nav className="mr-auto">
                    <Nav.Link href="#home">Home</Nav.Link>
                    <Nav.Link href="#features">Features</Nav.Link>
                    <Nav.Link href="#pricing">Pricing</Nav.Link>
                </Nav>
            </Navbar >
        );
    }
}
export default App;
```
↓実行結果
<img width="1187" alt="スクリーンショット 2019-12-18 23.39.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552903/42c09d84-bfdb-ff7d-85fa-8ed9da604fa8.png">


これだとスマホとか画面が小さくなったときに選択肢が多いと、画面崩れが起きてしまう。悲しい。
<img width="498" alt="スクリーンショット 2019-12-18 23.43.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552903/1acf70d2-528e-1e31-5de0-99b81fd9c05c.png">

<br>
スマホとかでレスポンシブに動かしたいんや！！というときは、
下記のように書くといい感じにレスポンシブにしてくれるっぽい。

``` app.js
import React, { Component } from 'react';
import { Navbar, Nav } from 'react-bootstrap';
import LOGO from './logo.svg';

class App extends Component {
    render() {
        return (
            <Navbar collapseOnSelect expand="lg" bg="dark" variant="dark">
                <Navbar.Brand href="#home">
                    <img
                        src={LOGO}
                        width="30"
                        height="30"
                        alt="React Bootstrap logo"
                    />
                    SampleApp
                </Navbar.Brand>
                <Navbar.Toggle aria-controls="responsive-navbar-nav" />
                <Navbar.Collapse id="responsive-navbar-nav">
                    <Nav className="mr-auto">
                        <Nav.Link href="#home">Home</Nav.Link>
                        <Nav.Link href="#features">Features</Nav.Link>
                        <Nav.Link href="#pricing">Pricing</Nav.Link>
                    </Nav>
                </Navbar.Collapse>
            </Navbar >
        );
    }
}
export default App;
```

<img width="453" alt="スクリーンショット 2019-12-18 23.51.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552903/92c8922a-af9c-1299-fdd7-63a9ce682a26.png">

expand="true"にするとずっとハンバーガーメニューが表示されるようになる。
<Navbar.Brand>で囲った部分は、collapseされずに表示される



公式が用意していない色への変更とかはそのうち書く。
AWS Fargate Spot で気をつけること

Fargate Spot でちょっとだけハマったので

## 気をつけること

### 1. Blue / Green に対応していない

- CodeDeploy を利用した Blue / Green デプロイメントでは利用できません。

### 2. Default capacity provider strategy

- これを `FARGATE` と `FARGATE_SPOT` で設定すると Blue / Green Deployment は選べません。
- もちろん Launch Type も選べません。（両方 Fargate なので）

### 3. 既存 Cluster への登録

- AWS CLI で設定可能ですが、 `Default capacity provider strategy` が必須となっています。
    - https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/fargate-capacity-providers.html#fargate-capacity-providers-considerations
    - https://docs.aws.amazon.com/cli/latest/reference/ecs/put-cluster-capacity-providers.html
- 2 と 3 を合わせて考えた場合、Cluster で Blue / Green を利用する場合は一回 CLI で登録した後に `Default capacity provider strategy` を削除する必要があります。
    - これを実施した場合は、Rolling update と Blue / Green Deployment 双方選べるようになります。
    - ただし、 `FARGATE_SPOT` を利用するためには Rolling Update で ECS Service を作成後に CLI で設定する必要があります。
    - https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/fargate-capacity-providers.html#fargate-capacity-providers-considerations


### 4. 新規 Cluster

- 新規の場合は `Default capacity provider strategy` が設定されていない状態で `FARGATE` と `FARGATE_SPOT` がデフォルトで作成されています。
- 既存 Cluster で置き換えたとしたら、3 にあるように CLI で登録後に `Default capacity provider strategy` を削除した状態と同じです。



## 最後に

最近、 AWS Container に関しては [ロードマップ](https://github.com/aws/containers-roadmap) を公開したり、 EKS で頑張ったりとかなりカジュアルに進化をしている感じがしますが、その代わりに利用する側としても十分な確認や知識がより必要になってきた感じがします。
Java側からManagedBeanを取得する[JSF]

#目的
JSFを使っているが、ManagedBeanをJava側から取得したい。

👤 「普通にインスタンス生成すりゃええんじゃ？」

じゃなくて ManagedBeanとして取得したいんじゃ！

というときの解決法

#解決

とりあえず以下にBeanの例を書きます。
中身はそれっぽく適当に書いています。

```java:HogeBean.java
/* ↑省略  */
@Named("hoge")
@ManagedBean
@ViewScope
class HogeBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private String fuga;

    @PostConstruct
    public void init() {
        fuga = "アイス";
    }

    public String getFuga() {
        return fuga;
    }    
}
```

で、取得する方法の例はこちら。

```java
ELContext elContext = FacesContext.getCurrentInstance().getELContext();
HogeBean bean = (HogeBean) elContext.getELResolver().getValue(elContext, null, "hoge");  
```

##例
都合により、ManagedBeanを経由してManagedBeanを取得してテキスト出力すると仮定

```java:BeanBean.java
/* ↑省略  */
@Named("beeen")
@ManagedBean
@ViewScope
class BeanBean implements Serializable {

    private static final long serialVersionUID = 1L;

    public String getHogeBean() {
        ELContext elContext = FacesContext.getCurrentInstance().getELContext();
        HogeBean bean = (HogeBean) elContext.getELResolver().getValue(elContext, null, "hoge");  
    }    
}
```

```xml:view.xhtml
<!-- 省略 -->

<h:outputText value="#{beeen.hogeBean.fuga}"/>
```

出力結果：　アイス


#おわりに
Beanの振り分けを行うBean(用途として適切かは別として...)とかには使えそうですが、
多用するようになると設計を見直したほうがいいですね。
Python3系のAWS CLIと.NET Core v2.1の入ったCentOSイメージを作る

# 背景
仕事で.NET Coreのソフトをコンテナ化する機会があったので、そのまとめと**Python2系が2020年1月1日に廃止**されるので、Python3系の導入についても触れていこうと思います。

二番煎じかもしれませんが、ご了承ください。

# 内容
以下の構成でDockerのイメージを作成します。

* baseImage : CentOS
* Python 3系
* .NET Core v2.1

# 導入
## (1) DockerfileをClone
まず、以下のリポジトリをクローンしてください。

``` bash
# ファイルをClone
$ git clone https://github.com/susu-to-susu/Dockerfile_aws_dotnet.git
```

## (2)イメージの作成
Dockerfileの場所まで移動して、buildしてイメージを作成してください。

``` bash
# ディレクトリ移動
$ cd Dockerfile_windows_dotnet

# イメージの作成
$ docker build -t dotnet_aws .
```

## (3)コンテナの作成
以下のコマンドでコンテナを作成します。

``` bash
# コンテナの作成
$ docker run --name dotnet_aws -itd dotnet_aws bash
```

## (4)動作確認
以下のコマンドでコンテナにログインをしてaws-cliとdotnetCoreの確認をします。

``` bash
# アタッチ(ログイン)
$ docker attach dotnet_aws

[root@eb395ae3adad /]# dotnet --version
2.1.509
[root@eb395ae3adad /]# aws --version
aws-cli/1.16.305 Python/3.6.8 Linux/4.9.184-linuxkit botocore/1.13.41
```

# 解説
Dockerfileの中身は以下のようになっています。

``` Dockerfile
# Sample Dockerfile

# Indicates that the centos image will be used as the base image.
FROM centos:latest

# Install Python
RUN yum update -y
RUN yum upgrade -y
RUN yum install -y wget
RUN yum install -y python3

# AWS CLI Settings
RUN wget https://bootstrap.pypa.io/get-pip.py
RUN python3 get-pip.py

# Install awscli
# RUN pip install awscli
RUN pip3 install awscli --upgrade --user
ENV PATH $PATH:/root/.local/bin

# Metadata indicating an image maintainer.
LABEL maintainer="susu-susu@github.com"

# dotnet Core v2.1
RUN yum install -y dotnet-sdk-2.1
```

やっていることは非常に簡単で、python3とdotnetCore v2.1をyumでインストールしています。

``` Dockerfile
ENV PATH $PATH:/root/.local/bin
```

ここで気を付けることは、pip3でaws-cliをインストールした場合、デフォルトでは`/root/.local/bin`にコマンドが格納されるのですが、**環境変数に$PATHが適応されてません。**少なくとも自分がやった時はそうでした。
 
そのため、ENVに書く必要があります。

ターゲットとしては、dotnetCoreをWindows以外で利用したい。コンテナ化して使いたいって場合に最適です。

何か誤字脱字ありましたら、ご指摘頂けると幸いです。

# 参考リンク
* Docker日本語ドキュメント
    * http://docs.docker.jp/engine/reference/builder.html
* DMM.com
    * https://y-ohgi.com/introduction-docker/2_component/dockerfile/
生成した複数件のランダムな文字列において重複が発生しない確率は□％

# はじめに

[2019新卒 エンジニア Advent Calendar 2019](https://qiita.com/advent-calendar/2019/2019-graduates) 19 日目の記事です。

ソフトウエア開発において、ランダムな文字列を生成することがあります。例えば、アカウントの識別子（ID）という役割で利用されます。具体例としてTwitterでは、ユーザがアカウントを作成すると、長さ15のランダムな文字列をIDとして付与します。しかし、このような役割があるがゆえに、ランダムな文字列は重複してはいけません。それゆえ、万が一重複が発生したときに実行する相応の処理などもあるかと思います。

新卒として入社して以降、このような重複のないランダムな文字列を必要とするテストデータを作成する機会がありました。その時の興味として抱いていた、そもそもどれだけの確率で重複が発生するのか（上記、それ相応の処理が実行されることはあるのか）を明らかにしたいと思います。

※タイトルはトリビアの種のオマージュです。懐かしい番組ですね。🧠

# 実験

## 計算式

結果は以下の計算式で算出できます。

```math
P = \prod_{k = 0}^{n} \frac{(c^l)-k}{c^l}
```

上記に示した計算式の各変数は以下の通りです。

* c ・・・ランダムな文字列を構成する文字の種類
* n ・・・ランダムな文字列の件数
* l ・・・ランダムな文字列の長さ
* P ・・・重複が発生しない確率

## 実数による確率の算出

今回の実験におけるランダムな文字列は、数字と英字（小文字）の合計36種の文字から構成されるものと定義します。（例：長さ10の場合、yttrj4ca8n）この場合、以下の計算式によって重複が発生しない確率が算出できます。

```math
P = \prod_{k = 0}^{n} \frac{(36^l)-k}{36^l}
```
また今回の実験における他変数の値は以下とします。

- n ・・・100，10000，1000000
- l ・・・5，10，15

はじめに、以下の実数を当てはめます。Pythonのプログラムで計算します。

```math
n = 100, 
l = 5
```

```python
c = 36
n = 100
l = 5
P = 1

for k in range( n ):
    P = P * ((c ** l) - k) / (c ** l)

print(P)
```

```console
0.999918139356006
```

重複が発生しない確率は99%以上ですね。

まとめて算出し、比較してみます。

- 行：文字数
- 列：件数

|| 5  |10  |15  |
|---:|---:|---:|---:|
|100  |0.999918139356006|0.9999999999986461|1.0|
|10000  |0.4374156133080636|0.9999999863258114|1.0|
|1000000  |1.5e-322|0.9998632539253056|1.0 |

文字数10や15の場合ほとんど重複は発生しないようです。特に15は自分の環境におけるpythonによる計算ではわからない確率なんですね。

# おわりに

ソフトウエア開発において、生成することもあろうランダムな文字列の生成について、重複が発生しない確率を算出しました。文字数が5だと少々怪しいですが、10や15の場合、100万件のランダムな文字列を精製したとしても、重複はほとんど発生しないことがわかりました。しかし、念には念をということで対応する処理の準備は必要ですね。

しかし、ここで強運を使ってしまうことだけは避けたいな…

（2019年12月20日追記）
以下の記事に掲載していただきました！ありがとうございます！

- [【Python】Qiita 週間ストック数ランキング【自動更新】](https://qiita.com/kou_pg_0131/items/01127f188250a2d68dbf#_reference-c329aabd9ffa37374bff)（2019年12月19日 13時00分更新 ）
QtのDataDrivenTestでstd::size_tとかを（比較的？）ストレスなく使う

## これは

[Qt Advent Calendar 2019](https://qiita.com/advent-calendar/2019/qt)18日目の記事です

昨日は@task_jpさんの[QML の一部を別の QML で差し替える方法](https://qt5.jp/2019/12/overwriting-a-part-of-qml-in-qml/)でした

課題やってたらこんな時間になっちゃった　急いで書かなきゃ(18日23時40分)

## さて

みなさんQtのソフトウェアでのTestって何でやってらっしゃるんですかね？
私はとりあえずQt標準のTestで行っています
多くのテストフレームワークと同様にQtのテストフレームワークにも[DataDrivenTest](https://doc.qt.io/qt-5/qttestlib-tutorial2-example.html)の機能が備わっています

公式のサンプルにはこんな例が乗っています

```c++
void TestQString::toUpper_data()
{
    QTest::addColumn<QString>("string");
    QTest::addColumn<QString>("result");

    QTest::newRow("all lower") << "hello" << "HELLO";
    QTest::newRow("mixed")     << "Hello" << "HELLO";
    QTest::newRow("all upper") << "HELLO" << "HELLO";
}

void TestQString::toUpper()
{
    QFETCH(QString, string);
    QFETCH(QString, result);

    QCOMPARE(string.toUpper(), result);
}
```
`addColumn`テストデータのカラムの型を指定して
`newRow`でテストデータの値を登録していますね

## で、

さっきのサンプルを見ればわかるとおり（？）、
`addColumn`で登録した型の情報は`newRow`の式で参照することができないので、プログラマが間違えるとこんなものも書けてしまいます

```c++
void TestQString::toUpper_data()
{
    QTest::addColumn<QString>("string");
    QTest::addColumn<QString>("result");

    QTest::newRow("hoge") << "hello" << 1; // "result"の型がおかしい
}
```

まあこれくらいならエラーを見てすぐ気づくことができますが、`std::size_t`を渡そうとしたときで

```c++
void TestQString::toUpper_data()
{
    QTest::addColumn<HogeHogeData>("data");
    QTest::addColumn<std::size_t>("size");

    QTest::newRow("hoge") << .... << 1; // 1の型はintになる
}
```

これは突然`expected data of type 'ulong', got 'int' for element 0 of data with tag 'hoge'`とか吐いて死ぬことになる

仕方なくすべてのリテラルにsuffixをつけて回るのは非常に面倒だしすぐ忘れる

C++erなら型は気にしないとね！

## というわけでこうする

要は`newRow`のときに型がわかればいいので

```c++
namespace test {

template <class>
struct Column
{
    Column(const char* name) : str(name) {}
    const char* str;
};

template <class... Args>
struct DDTest
{
    DDTest(Column<Args>... cols)
    {
        (QTest::addColumn<Args>(cols.str), ...);
    }
    void newRow(const char* name, Args... args)
    {
        (QTest::newRow(name) << ... << args);
    }
};
template <class... Args>
DDTest(Column<Args>...)->DDTest<Args...>;

} // namespace test
```

```c++
void TestClass::HogeHoge_test_data() {
    test::DDTest dataTest(
        test::Column<std::size_t>("limit"),
        test::Column<std::size_t>("count"));

    dataTest.newRow("10000", 10'000, 1'000'000);
    dataTest.newRow("10000", 20'000, 1'000'000);
    dataTest.newRow("10000", 40'000, 1'000'000);
    dataTest.newRow("10000", 80'000, 1'000'000);
}
```

rowのラベルとデータが同じカッコ内に並ぶのはちょっと不格好だが、これで型が違うことを防げる（不格好なのはまあどうにでもなる（やってないけど））

ついでに入力中にIDEが型名を表示してくれるので若干助かる？
![Screenshot from 2019-12-19 00-15-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68544/f4129a08-c838-70fb-b87a-d9d2f39befd5.png)

書いてるうちに日付が変わってしまったZE

## 明日は

@cod-sushiさんの[Qtで作ったスクリーンショット作成アプリケーションについて紹介]() です
vignettesがRstudio上で読めない

## 概要
RパッケージのvignettesがRstudio上で見られない。```vignette(package = "hoge")```を実行すると```no vignettes found```となるとのことで、トラブル報告をいただく。

## 解決方法
install_github("hoge")はデフォルトだとvignettesをビルドしてくれないので、```build_vignettes=TRUE```オプションをつけて実行します。

## 参考文献
http://r-pkgs.had.co.nz/vignettes.html

神の原文もありますが、日本語文献でも出てますね
Rパッケージ開発入門 ―テスト、文書化、コード共有の手法を学ぶ   Hadley Wickham
 https://www.amazon.co.jp/dp/4873117593/ref=cm_sw_r_tw_dp_U_x_xhK-DbNCWT9AC
gawkで先頭が空のCSVデータを加工すると面白いことになる

以下のような行の先頭が空のCSVを用意する


```input.csv
,b,c,d,e,f
g,h,i,j,k,l
```

gawk(バージョン：GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.1.2)) で加工出力してみる。

```
gawk -v FPAT='[^,"]*|"([^"]|"")*"' -v OFS=, '{print $1,$2,$3,$4,$5,$6}' input.csv
```

結果は以下、なぜか先頭が空の行であった1行目が全て空で出力されている。（期待値はinput.csvの内容をそのまま出力してほしい）

```
,,,,,
g,h,i,j,k,l
```

納得できないため、1項目ずつちゃんと加工できているか調べてみる。

```
gawk -v FPAT='[^,"]*|"([^"]|"")*"' -v OFS=, '{for (i=1; i<=NF; i++) printf "field #%d: %s\n", i, $(i)}' input.csv
```

結果は以下、field #1は空、それ以外もCSV通りである。
したがって、FPATなどオプションが間違っているわけでもない。

```
field #1: 
field #2: b
field #3: c
field #4: d
field #5: e
field #6: f
field #1: g
field #2: h
field #3: i
field #4: j
field #5: k
field #6: l
```

なんで？ということで、stackoverflowに質問。

https://stackoverflow.com/questions/58647210/unable-to-parse-csv-with-empty-field-at-the-beginning-in-gawk

 <b>バグでした</b>

回答を頂いたEd Mortonさんによると、過去あったバグ（https://lists.gnu.org/archive/html/bug-gawk/2017-04/msg00000.html ）と関連があるもので、以下のように

```
{oFPAT=FPAT; FPAT=""; FPAT=oFPAT} 
```
を追加することで対処することができる

```
gawk -v FPAT='[^,"]*|"([^"]|"")*"' -v OFS=, '{oFPAT=FPAT; FPAT=""; FPAT=oFPAT} {print $1,$2,$3,$4,$5,$6}' input.csv
```

上記バグはEdさんが開発者に報告済み
https://lists.gnu.org/archive/html/bug-gawk/2019-10/msg00041.html

感謝します。
これで俺モ ゲンシジン

# はじめに
こんにちはRIN1208です。この記事は[ITRCアドベントカレンダー](https://adventar.org/calendars/4759)の19日目の記事になります。


# 経緯
まず初めにこの記事を書いた経緯の説明をしたいと思います。
この記事で作った物こちらの記事、[オレ プログラム ウゴカス オマエ ゲンシジン ナル](https://qiita.com/Harusugi/items/f499e8707b36d0f570c4)を読み自分でも作ってみたくなったので作成した物です。
内容は似ていますが作成した言語やパッケージは異なります。
こちらの記事は個人的にとても好きなので是非見てみて下さい。


# 開発環境
- Mac
- goの実行環境
- MeCabの環境


# MeCabのインストール(Mac)

```
$ brew install mecab
$ brew install mecab-ipadic
$ brew install git curl xz
$ git clone --depth 1 git@github.com:neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
$ ./bin/install-mecab-ipadic-neologd -n
```

上記のコマンドで一通りインストールできます。  
また今回neologd辞書もインストールしています。詳しくは[こちら](https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md)を参照して下さい。


# GoでMeCabを扱う

今回使用したGoのMeCabのラッパーは[mecab-golang](https://github.com/bluele/mecab-golang)です。
先ほどMeCabをインストールしたのでこちらのコマンドを実行すれば準備完了です。

```
$ export CGO_LDFLAGS="`mecab-config --libs`"
$ export CGO_CFLAGS="-I`mecab-config --inc-dir`"
$ go get github.com/bluele/mecab-golang
```

これで準備完了です。

main.goと言うファイルを作成して下さい。

原始人になれるコードはこちら

```go

package main

import (
	"fmt"
	"strings"

	"github.com/bluele/mecab-golang"
)

func parseToNode(m *mecab.MeCab, word string) {
	var key string
	tg, err := m.NewTagger()
	if err != nil {
		panic(err)
	}
	defer tg.Destroy()
	lt, err := m.NewLattice(word)
	if err != nil {
		panic(err)
	}
	defer lt.Destroy()

	node := tg.ParseToNode(lt)

	for {
		features := strings.Split(node.Feature(), ",")
		if features[0] != "助詞" && features[0] != "助動詞" {

			key = key + " " + features[7]
		}
		if node.Next() != nil {
			break
		}
	}
	fmt.Println(key)
}

func main() {
	var word string
	m, err := mecab.New("-Owakati")
	if err != nil {
		panic(err)
	}
	defer m.Destroy()
	fmt.Print("input keyword :")
	fmt.Scan(&word)
	parseToNode(m, word)
}

```

正直サンプルコードを少しいじっただけです。　　
それでは実行結果をみてみましょう。

```
$ go build main.go 
$ go run main.go
input keyword :これでみんな原始人になれる

 * コレ ミンナ ゲンシ ジン ナレル *
```
このような感じです。

ですがこちらのコードではカタカナで入力された言葉があるとエラーが出てしまいます。（改善予定）

他には限界ヲタクするとき等にも使用可能です。

```
$ go run main.go
input keyword :水着まこと可愛すぎてやばい
 * ミズギ マコト カワイ スギ ヤバイ *
$ go run main.go
input keyword :この子かわいすぎないか。ほんと好みすぎてやばい
 * コノ コ カワイ スギ 。 ホント コノミ スギ ヤバイ *  
```

こんな感じで限界ヲタクするとき等にも使えます。



#  おわりに
自分は初めcotoha apiを使用してやってみたかったのですがいろいろと面倒だったのでMeCabを使ったらかなり簡単にできました。形態素解析自体このコードを書くまでが初めてですが面白いですね（コード書いたの半年以上前）。またここまで読んでくれた方ありがとうございました！
[ReactNative] Sign In with AppleをAppleAuthenticationで実装してみた

# What
話題のSign In with AppleをexpoのAppleAuthenticationを使って実装してみました。
実装自体は非常に簡単で、AppleAuthenticationから必要な関数を持ってくるだけです。
ただ、本番運用をするには[APIドキュメント](https://docs.expo.io/versions/latest/sdk/apple-authentication/)の手順にしたがって設定をする必要があります。


以下は、ボタンを独自実装してみたサンプルです（通常のボタンだと、高さと横幅と角の丸みくらいしかいじれません）

```react

import * as AppleAuthentication from "expo-apple-authentication";

function AppleSignInButton() {
  return (
    <TouchableOpacity
      onPress={async () => {
        try {
          const credential = await AppleAuthentication.signInAsync({
            requestedScopes: [
              AppleAuthentication.AppleAuthenticationScope.FULL_NAME,
              AppleAuthentication.AppleAuthenticationScope.EMAIL
            ]
          });
          // 認証情報が返される
          console.log(credential);
        } catch (e) {
          if (e.code === "ERR_CANCELED") {
            console.warn(e);
          } else {
            console.warn(e);
          }
        }
      }}
      style={{
        marginVertical: 7.5,
        height: 40,
        backgroundColor: "black",
        flexDirection: "row",
        justifyContent: "center",
        alignItems: "center",
        borderRadius: 23,
        position: "relative"
      }}
      underlayColor={"white"}
      activeOpacity={0.2}
    >
      <Image
        source={require("../../assets/images/apple.png")}
        style={{
          height: 21,
          width: 18,
          position: "absolute",
          left: 16
        }}
      />
      <Text
        style={{
          fontSize: 16,
          fontWeight: "bold",
          color: "white",
          fontWeight: "bold"
        }}
      >
        Apple IDで登録
      </Text>
    </TouchableOpacity>
  );
}
```

###認証成功時に返却されるJSONデータ
```
Object {
  "authorizationCode": "一時的なセッショントークン",
  "email": "ユーザのemail。ユーザはemailを隠す事ができ、その場合はランダムな文字列のemailが生成される",
  "fullName": Object {
    "familyName": "hoge",
    "givenName": "fuga",
    "middleName": null,
    "namePrefix": null,
    "nameSuffix": null,
    "nickname": null,
  },
  "identityToken": "string型のJWT",
  "realUserStatus": 1,
  "state": null,
  "user": "アプリごとにuserが持つstrig型の識別子、ログインの確認などに使える",
}
```
コンソール接続不要：Ultra96 v2 で LED をチカチカさせてみた


# はじめに
Ultra96 v2 をゲットしたので、Lチカまで進めてみる。

# ブツの確認

Ultra96 v2 のパッケージには、以下が入っていた。

|No. | 品名| 数量|
|--:|---|---|
| 1 | 本体 Ultra96-V2 | 1個|
| 2 | microSD カード 16GB| 1個|
| 1 | microSD -> SD 変換アダプタ| 1個|
| 1 | 紙「Getting Started」| 1枚|
| 1 | 紙「IMPORTANT!」| 1枚|


本体とは別に、12V 電源と、USB-JTAG アダプタもゲット。

# やってみる

同梱の「Getting Started」は無視して、[このページ](https://www.96boards.org/documentation/consumer/ultra96/ultra96-v2/getting-started/)に従ってセットアップする。

お手軽そうな「Option 1」コースを選択した。

- OS イメージのダウンロード

以下の URL にアクセスして OS イメージファイルをダウンロードする。

http://avnet.me/ultra96-v2-oob

ファイル名: ultra96v2_oob_2018_3_190917_8GB.zip
ファイルサイズ: 761,515,027 Bytes
取得日: 2019年12月18日
注意点: ダウンロードに比較的時間がかかる

- microSD に OS イメージを書き込む

ダウンロードした ZIP ファイルを展開して、microSD カードにファイル「ultra96v2_oob_2018_3_190917_8GB.img」を書き込む。
Getting Started では、Etcher を使うようにと書かれているが、無視して Win32 DiskImager を使った。Linux 系 OS だったら dd コマンドでもいいと思う。

- 電源を Ultra96 に接続する → 緑のLED（D17）が点灯
- 近くに小さく「SW4」を書かれているスイッチを押す → 緑のLED（D2）が点灯、ファンも回りだす
- ブートが始まる → FPGA 部分が正常に起動した → 青のLED（D1）が点灯
- LED（D7）が点滅 → Linux が動作中
- ほかのデバイスから、WiFi の SSID 「Ultra96_xxxxxxxxxxxx」に接続する → 接続できない・・・。なんじゃこりゃ？

## 作戦変更

microSD カードを Linux マシンに接続して WiFi 設定を直接編集することにする。

- 適当な Linux マシンでターミナルを開いて以下を実行

```bash
$ wpa_supplicant <SSID>
<パスワード>
network={
  ssid="your_ssid"
  psk=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
}
```

- microSD を /mnt にマウントし、設定ファイル「/mnt/etc/wpa_supplicant.conf」に設定を保存

```bash
$ sudo vi /mnt/root/etc/wpa_supplicant.conf
# network={} の部分を以下のように修正して保存
network={
  ssid="your_ssid"
  psk=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
}
```

- DHCP サーバーのログを確認し、見慣れない MAC アドレスの IP アドレスを確認
うちのは、「F8:F0:05:xx:xx:xx」だった。
Newport Media Inc. で登録されてる。

- ブラウザで該当 IP アドレスにアクセスする

- Ultra96v2 のデモページを表示

![1st.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126852/54933c5b-4f99-29ad-5c7e-3c7d7d3e0088.png)
 

## デモページを操作

- 「Ultra96-V2 GPIO LEDs」をクリック

![2nd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126852/4f622afe-a916-35ed-3823-13b14dc30c82.png)


- LED0/D3 を Off にする → LED 消灯

- LED0/D3 を On にする → LED 点灯

## SSH でログインしてパスワードを変更

```bash
$ ssh root@<ip_address>
root@192.168.***.107's password:**** <- 初期パスワード:root
root@ultra96v2-oob-2018-3:~# passwd
New password: 
Retype new password: 
passwd: password updated successfully
root@ultra96v2-oob-2018-3:~#
```

# まとめ

無事に LED をチカチカさせられました。

使い終わったら、電源ボタン（SW4)を押してシャットダウンしましょう。

# 参照
http://zedboard.org/sites/default/files/documentations/Ultra96-V2-GSG-v1_1.pdf
CTFってなんぞ？

本記事は、[サムザップ Advent Calendar 2019 #1](https://qiita.com/advent-calendar/2019/sumzap1) の12/19の記事です。

　サムザップでサーバサイドエンジニアをしております。今回CTFに触れる機会があったので、ご紹介したいと思います。

#前置き
　サムザップを含む[SGE（サイバーエージェントのゲーム事業部）](https://creator.game.cyberagent.co.jp/)各社では、年に一度社員エンジニアを対象にハッカソン的なプログラミングコンテストを実施しています。毎年お題は変わっており事前情報はあまりないのですが、今年は「CTF形式のセキュリティ競技」がテーマという事だけ知らされておりました。

　はて？CTFってなんぞ？
あの24時間戦う男、ジャックバウアーがいたとこですか？（→それはCTU！）

#CTFとは
　20年近くサーバサイドエンジニアをやっておりますが、お恥ずかしながらCTFは初耳でした。Google先生に聞いてみたところ「Capture The Flag」の略なのだそうな。私の頭の中には真夏のビーチフラッグしか思い浮かばなかったのですが、情報セキュリティのスキルを用いて課題の中から隠された答えとなる「FLAG」を見つけ出し得点を稼ぐ競技なのだそうです。
　普段開発している中で、SQLインジェクションとかXSSくらいは気にしていたりしますが、「セキュリティーコンテスト」って言われるとちょっと身構えてしまいますね。そんなテーマで社内コンテストをやるっていうんですから、ちょっとは予習しておかなきゃかな？と思い、CTFについて調べてみました。

#必要な知識
- Webアプリケーションの脆弱性やデータベースアクセス
- プログラミング言語、リバースエンジニアリング
- ネットワークの通信技術やトラフィックのキャプチャ
- 暗号化技術

等々、幅広い知識が必要になります。

#代表的なCTF
大きなものでは「Security Contest（SECCON）」があり、毎年開催されています。これは有名ですね。でもいきなり大会！って敷居が高いですよね。そんなあなた(？)や私のために、いつでもチャレンジできる常設のCTFサイトがいくつかあります。

- [CpawCTF](https://ctf.cpaw.site/)
- [ksnctf](https://ksnctf.sweetduet.info/)
- [akictf](https://ctf.katsudon.org/)
- [Flaggers](http://ctf.nash-dev.com/entrance)

　この中から社内コンテストの予習も兼ねて、初心者にも解きやすいよ！との評判があった「CpawCTF」を少し触ってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136467/898e97c8-dacf-f231-e4a3-f25bd8f939c5.png)

　まずは右上の「SignUp」からユーザー登録しましょう。登録完了したら、「一度こちらを参考にしてください！」のリンク先をよく読みましょう。私はよく読まずにいきなり1問目を始めてしまった私は「ちょっと何言ってるのか良くわからないんですけど」状態でした。答えをWeb上に公開してしまうのはご法度らしいので詳しいことは書きませんが、言われてみればホントに問題に書いてあるまんまの回答でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136467/a6bc9ab6-6c3a-da79-6a3d-7bfc4d91653b.png)
　そんなこんなでLevel1の合計9問はサクッと1時間程度で終わりました。ちょっとした謎解きというかクイズ感覚で楽しいですね！（まだLevel1だし）よし、明日から続けていこう！

　と思っていたら、あっという間に社内のコンテスト当日を迎えてしまいました。（まだLevel1しかクリアしてないしー）当然のことながら、社内コンテストの結果は散々だったのですが、予めCTFってこんな風にやるんだよ、ってのがわかっていたので参考にはなりました。

#まとめ
　普段のサーバサイド開発ではあまり経験しない技術に触れる事ができてとても良い機会でした。CTFは1問1問が割と小さくできているので（Levelが上がるとそうでもないかもしれないが）、ちょっとした時間にチャレンジできるし、セキュリティの知識は知っている事で必ず業務にも生かせる分野だと思います。今後も暇を見つけて、いや、息抜きがてらに少しずつチャレンジしていこうと思います。

　年末年始のお休み中、あなたもCTFに挑戦してみてはいかがでしょうか？

明日は、@mmm_hiroさんの記事です。
AutoMLのVisionを使って画像識別をしようとしたら、料金がかかった話。

#あらすじ
Automlのvisionを使ってアプリ開発をしようとしたら、急に動かすことができなくなりました。

そこで、調べてみたところ１１月２１日よりautomlが一般公開されて、有料化され支払いが滞っているとのことでした。

google cloud platformに問い合わせてみたところ、以下の文章が送られてきました。

---
いつもお世話になっております。
グーグル・クラウドプラットフォーム・サポートの◯◯です。

日頃より弊社サービスをご利用いただきまして、ありがとうございます。先程はお電話にてご連絡いただきありがとうございました。

お問い合わせいただきました、Cloud Vision API AutoML Image Classification Online Predictions の料金が発生している件についてですが、経緯をご案内させていただきます。お客様は 10 月 14 日に無料トライアルの請求先アカウントを作成しましたが、10 月 18 日に有料アカウントにアップグレードしております。文末リンク [1] に記載がある通り、有効期限が切れていない無料トライアルの $ 300 のクレジット残額はそのまま残りますが、クレジット残額を超えて使用したリソースについては、登録されたクレジット カードに請求されますのでご了承下さい。

お客様は Cloud AutoML Vision の画像分類を使用しているということでよろしいでしょうか。画像分類モデルトレーニング後、デプロイされたモデルに対して $ 1.25 /ノード / 1 時間あたりの料金が課金されます。英語版のみのご案内とはなりますが、画像分類予測のご利用料金に関する詳細は文末リンク [2] にてご確認いただけます。文末リンク [3] に記載があるように、これまでベータ版でのサービス提供だったものが 11 月 21 日以降一般提供開始になり、画像分類の新しい価格設定が有効になっております。今後この課金を発生しないようにするためには、文末リンク [4] を参考にして、デプロイされた画像分類モデルを解除 ( Undeploy ) していただく必要がございますのでご了承ください。

未払い額が原因でサービスが停止しているようであれば、文末リンク [5] を参考にしてサービスを再開していただけます。

その他ご不明な点等ございましたら、ご遠慮なくご連絡ください。

何卒よろしくお願いいたします。


Google Cloud Platform Billing Support, Tokyo


クラウドプラットフォームに関する日本語でのお問い合わせ対応は
平日 9 時から 17 時までとなっております。対応時間外でお急ぎの場合は、
お手数ですが英語にてお問い合わせをいただけますようお願いいたします。

[1] https://cloud.google.com/free/docs/gcp-free-tier?hl=ja#how-to-upgrade
[2] https://cloud.google.com/vision/automl/pricing?hl=en#image_classification_deployment_and_prediction_costs
[3] https://cloud.google.com/vision/automl/docs/release-notes?hl=ja#November_20_2019
[4] https://cloud.google.com/vision/automl/docs/undeploy?hl=ja#automl_undeploy_model-web-integrated
[5] https://cloud.google.com/billing/docs/how-to/resolve-issues?hl=ja#resolving_declined_payments

---
私は１１月に約30.000円、１２月は３日目にして約10,000円かかっていました。

驚愕しました、、、

無料だと思っていたのに、、、

一般公開になってからは、1時間あたり1.25＄が使用料としてかかるみたいです。

この後、料金について調べてみたところ
１日あたり、約3300円かかります。

これは私が、無意識のうちに無料会員から有料会員にアップグレードしていたことが原因だとわかりました。

この料金がかかるのは、デプロイしている間なので使わないときは、アンデプロイしておけば料金はかかりません。

泣く泣く、支払いを行い利用することにしました。


#最後に

この記事を最後までお読みいただきありがとうございました。

 AutoMlVisionをお使いになる際は、皆様も料金面にはお気をつけください。
メッシュクラスを自作した

これは[C++ Advent Calendar 2019 18日目](https://qiita.com/advent-calendar/2019/cpp)の記事です。
昨日は@43x2さんの[C++でGCを実装してみた](https://qiita.com/43x2/items/59b3e39256be0572cc5d)でした。
明日は@CdecPGLさんの担当です。

# はじめに

年末ですね。忘年会シーズンですね。退社間際に会社の先輩からとばっちりの口撃をくらい、その後高校の同級生との忘年会に参加して不愉快な出来事を忘れるためにワインを飲んでいたら、Advent Calendarの担当日であることも忘れそうになりました。

さて、参加を表明してから何を書こうかずっと悩み、結局いいアイデアが思い浮かばなかったので、研究のために作成したメッシュクラスをもとにライブラリを作り始めたよというお話をしてお茶を濁すことにします。あと10分以内に…


# `fmesh`

[`fmesh`](https://github.com/shohirose/fmesh.git)はフラクチャー（亀裂）を表現するためのヘッダーのみのメッシュライブラリです。レポジトリのmotivation（動機）に書いていますが、面を表現するメッシュライブラリで分岐を許すものがOSSになかったので研究の過程で自作したメッシュクラスが元になっています。その後色々学んだこと、実装していて思ったことなどをとりこみ、一から作りなおしてライブラリとして公開してみました。順次機能を追加して行く予定です。

## 特徴

- ヘッダーのみ
- 三角形・四角形の面をサポート
- 面の分岐をサポート
- 型安全なインデックスを使ってメッシュ要素にアクセス
- Range-based forに対応
- Boost.PropertyMapに似た機能を提供する`property_array`

などなど。

## 使い方

```cpp
#include <vector>
#include "fmesh/fixed_size_face.hpp"
#include "fmesh/fracture_mesh.hpp"

using namespace fmesh;

struct point {
  double x;
  double y;
  double z;

  point() = default;
  point(double tx, double ty, double tz) : x{tx}, y{ty}, z{tz} {}
};

int main() {
  fracture_mesh<point, tri_face> mesh;

  // Add vertices
  std::vector<vertex_index> v_ids;
  v_ids.push_back(mesh.add_vertex(0.0, 0.0, 0.0));
  v_ids.push_back(mesh.add_vertex(1.0, 0.0, 0.0));
  v_ids.push_back(mesh.add_vertex(0.0, 0.0, 1.0));
  v_ids.push_back(mesh.add_vertex(1.0, 0.0, 1.0));
  v_ids.push_back(mesh.add_vertex(0.0, 0.0, 2.0));
  v_ids.push_back(mesh.add_vertex(2.0, 0.0, 0.5));

  // Add faces
  std::vector<face_index> f_ids;
  f_ids.push_back(mesh.add_face(v_ids[0], v_ids[1], v_ids[2]));
  f_ids.push_back(mesh.add_face(v_ids[1], v_ids[3], v_ids[2]));
  f_ids.push_back(mesh.add_face(v_ids[2], v_ids[3], v_ids[4]));
  f_ids.push_back(mesh.add_face(v_ids[1], v_ids[5], v_ids[3]));

  // Access to a point
  const auto& p1 = mesh.vertex(v_idx[0]);

  // Access to a face
  const auto& f1 = mesh.face(f_idx[0]);

  // Range-based for
  for (auto&& vi : mesh.vertices()) {
      const auto& p = mesh.vertex(vi);
      // ...
  }

  for (auto&& ei : mesh.edges()) {
      const auto& e = mesh.edge(ei);
      // ...
  }

  for (auto&& fi : mesh.faces()) {
      const auto& f = mesh.face(fi);
      // ...
  }

  // Invalidate vertices and faces
  mesh.invalidate(v_ids[0]);
  mesh.invalidate(f_ids[1]);

  // Remove invalid mesh entities
  mesh.remove_invalid_entities();
}
```

## 今後の予定

元のクラスには用意したけど、まだ移植していない機能がたくさんあるので、順次追加していきます。
ああ、0時に間に合わなかった…
Oracle Cloud Developer Imageを用いたComputeインスタンスの作成と初期設定

この記事は「[Oracle Cloud Infrastructure Advent Calendar 2019](https://adventar.org/calendars/4516)」の12月18日の記事として書かれています。

# 本記事の狙い
Oracle Cloud Developer Imageとは、Oracle Cloud Infrastructureにて利用が可能な、Oracle Database関連の開発ツールが一通りプリインストールされている環境です。どのようなツールが梱包されているかは、@shakiyamさんの[記事](https://qiita.com/shakiyam/items/6ba70516d2d78ed83664)をご参照ください。本記事アップ時点では2019年11月版となり、一部のツールのバージョンが上がっています。
本記事では、本イメージをCopmpute Cloud Serviceにて実際に使えるようにするチュートリアルを紹介いたします。
なお、Oracle Cloudにて公開されているカスタムイメージを入手できるマーケットプレイスは、残念ながらAlways Freeでは利用できません。月額無償枠か有償でのご利用が必要です。

# Computeインスタンスの作成
1. Oracle Cloud Infrastructureのクラウドコンソール画面の左上のハンバーガーメニューから「マーケットプレイス」を選択します。
![screenshot01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125837/02e067c0-7254-0f45-723d-b3d356dcb667.png)

2. マーケットプレイスの画面左のフィルタから、タイプは「イメージ」を、公開者は「Oracle」を、カテゴリから「Developer Tools」を選択して表示を絞り込むと、最上段に「Oracle Cloud Developer Image」が表示されますので、これを選択します。フィルタ結果が増えて価格まで絞り込む必要が出てきた場合は「無料」を選択してください。
![screenshot02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125837/c7943a47-8bdd-b048-7859-81571689932b.png)

3. Oracle Cloud Developer Imageの説明画面の右上から、作成先コンパートメント名を選択し、標準利用規約と制限(Oracle Standard Terms and Restrictions)をチェックし、インスタンスの起動ボタンをクリックしてCompute Serviceのインスタンスの作成を開始します。
![screenshot03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125837/0c4ccad7-12a3-ccc6-aa39-b874feec205d.png)

4. Computeのインスタンスを作成します。下記画面のように、すでにOracle Cloud Developer Imageが選択されている状態となっています。他の事項は通常のComputeインスタンスのように、シェイプやVCNなどを設定していってください。
![screenshot04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125837/7a9ef1e4-0516-490f-885d-04f6f50df109.png)

5. 4で作成が完了したら、sshで接続して開発を始められます。実インスタンス画面を確認すると、下図右下のように、Oracle Cloud Developer Imageを使用して作成されたことが分かるようになっています。
![screenshot05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125837/69dfc266-c683-4ed3-8fbe-2d6872ffc246.png)

# 追加設定
ソフトウェアは一通りインストールされてはいますが、実際に利用される際に新規導入が必要だったり、インストール済みのものでも追加設定が必要なものがあります。Compute Cloudに関しては[[Oracle Cloud] OCI IaaS関連情報まとめ](https://qiita.com/feifo/items/551a8a4250f83e4c33c3)や[[Oracle Cloud] OCI Database(DBaaS)関連情報まとめ（リンク集）](https://qiita.com/himiyaza/items/ebfbab15cee20bbcff45)の記事がリンク集として非常に参考になると思います。
Qiita記事テンプレートをつくった

## はじめに
Qiitaの記事を書いていく上で、効率よく記事を書くためにテンプレートがほしいなぁと思ったのですがいい感じなものがなかったので作成しました。


## テンプレート

```
## はじめに

## 開発環境

## コード

## 解説

## 補足

## 最後に

```

## テンプレート解説

こんな感じで使います。

```
## はじめに
なぜこの記事を書こうと思ったのか。
誰に向けた記事なのか。

## 開発環境
使ったツール、コマンド、言語等の情報を記述。

## コード
今回書いたコード、または成果物を書く。

## 解説
コードの細かい解説をする。

## 補足
解説した中でも、更に深く突っ込んで書きたいところがあれば書く。

## 最後に
書いてみての考察。
良かった点、悪かった点、次回への意気込み等。

```


## 最後に

こちらのテンプレート、人によってはメモ帳などに貼り付けてつかう人もいるかも知れませんが、効率を求めるのであれば、スニペットの拡張(コピペできる領域が増えたりする)がおすすめです。

Macでは[Clipy](https://clipy.softonic.jp/mac)、Windowsでは[Clibor](https://chigusa-web.com/clibor/)という名前のツールがあります。

ちなみに会社でサードパーティーのアプリケーションを入れちゃだめって言われている方は、辞書登録しておくのもいいかもしれません。
実体験から感じたアジャイルというものの難しさと本質のようなもの

## この記事で書くこと :santa_tone1: 

アジャイルというチームでサービスを開発、リリースを目指していく方法を取ろうとしたチームで過ごす中で、会社の体制や、チームメンバの出入りなどで変容していった歴史（時系列１->時系列2）の中での学び。
その学びを元にして、機能しそうな形というものを提示する。

ここでいう「アジャイル」の言葉の定義は、動作するソフトウェアを素早く開発するための
「アジャイルソフトウェア開発手法」全般を意味する。

## 記事を書くに至るモチベーション
・より良い仕事をチームですることの難しさをもっと色々な人に考えるきっかけをつくりたい。
・ 論語読みの論語知らず ということわざにもあるように実体験には意味があると思うので、記録として言語化してみようと思った。

## 時系列１
チームの中に、アジャイルへ成熟したメンバーがいる状態。
新規メンバーが参入したとしても、アジャイルへの理解が浸透しているため、教育することができる状態。

#### チームの開発サイクルについての取組み
スプリントは導入していない状態。
チケットをとったメンバーがリリースタイミングを調整しつつ開発を進める。

#### スプリントレビューの実施有無
無し

#### 共有についての取組み
毎朝チームメンバーで困った点や進捗などの軽い共有時間がある。
週に一度KPTを行い、課題点含めた振り返りと現状把握を行う。

#### 新規サービス開発についての取組み
まず、関係者で、インセプションデッキとユーザストーリを作成していた。
その内容を「マスタードキュメント」として位置付けを行った。
このストーリを元に、キックオフを行い他の開発者以外との認識を合わせる。

このMTGで目線を合わせた上で、開発者側が用件をB側とすり合わせを行いつつ、
見積もりを開始する。
見積もりが完了したタイミングで、再度B側含めて結果を元にミーティングを行い、リリースにむけてスケジュール感と、優先順位の変更による用件のすり合わせを行った。

迷ったときには、全員が「マスタードキュメント」に戻り、必要なもの、必要でないもの、を決めていった。

#### 開発者に求められていたことと、権利周り。

求められていたこと
・見積もりを行うこと
・実装フェーズに入ったら、とにかくつくりきることに注力すること。

権利
・見積もりを行った上で間に合わない場合は、その時点でΒ側と調整を行うことができる。
・実装機能に対して、バグなど、リリースを意識するあまり不完全なものを本番へあげることを避ける「あげない」という技術者サイドからの主張ができる。



## 時系列2
チームの人数の内訳
アジャイルへ理解のあるメンバー数　<  不慣れ（関心が薄い）なメンバー数

関心が薄いメンバーがマネージメント層に入ってしまった。
関心が薄い（不慣れな）メンバーがB側の意思決定者(PO)になってしまった。

#### チームの開発サイクルについての取組み
スプリントを導入している状態。
１週間に一度、B側と開発側とでスプリント会議が行われる。
基本的には作成されたチケットには期限がすでに決まっている状態。
チケットをとったメンバーがリリースタイミングを確認、調整しつつ開発を進める。
差込タスクは勿論あるが、なかなかスプリント会議で決まったことは動かせない状態。

#### スプリントレビューの実施有無
無し

#### 共有についての取組み
毎朝チームメンバーで困った点や進捗などの軽い共有時間がある。
週に一度KPTを行い、課題点含めた振り返りと現状把握を行う。

#### 新規サービス開発についての取組み
インセプションデッキとユーザストーリなどの作成は行われない。
マスタードキュメントがない状態で、フワッとリリース期限をきられる。
見積もりが終わってない状態で、リリースが決まっているというプレッシャーとストレスが加わる。

#### 開発者に求められていたことと、権利周り。
求められていたこと
・機能用件を出すこと
・見積もりを行うこと
・実装フェーズに入ったら、とにかくつくりきることに注力すること。

権利
・見積もりを行った上で間に合わない場合は、その時点でΒ側と調整を行うことができる。

時系列1と時系列2での違いはいくつかありますが、
両方を体験している人間としては、300倍くらい時系列2の方が進めづらさと、開発していくことへの心理的ストレスが強かったように思います。 :thinking: 

その心理的な差分は一体どこから来ていたのでしょうか？

## この差分は一体どこから来るのか
### アジャイルは開発者だけで完結することのできるアプローチではない
こちらが一番大きな差分だと思っています。
そして、アジャイルの難易度を適切に表現している一文ではないかと思うのと共に、
上手く機能するための本質（コアな要素）は、ここだと今自分は考えています。

時系列１では、アジャイルというアプローチの大切さや有用性をきちんとBサイドに説明できていました。
そして、それを説明することができるだけの存在感が開発チームにはありました。

ただ、B側にそれを受け入れるだけの余裕がなく、とにかくサービスを出すことを優先した場合
開発者は目の前の作業に集中する他なく、説明する機会を持つことができないまま業務にあたらなければなりません。

ましてや、開発のマネージメントにあたるメンバーが機能しない場合はさらに、開発者（作業者）はしんどい状態になってしまいます。なぜか？何を実装するのが適切か、理解や共通認識がないままリリースにむけたアウトプットを強いられているからです。

開発者と、Β側（PO/PM）と、他の部署のメンバー（営業など）がアジャイルという１つのアプローチの価値と方法を正確に理解し、それにそった動きを見せることで、初めてアジャイルは機能するようになるのです。

そのためにはきちんとした共有のための時間と手間をコストとして捉えるのではなく、必要なものと受け入れることが必要なのだと思います。
この最初の部分がアジャイルを難しく、そして世の中のソフトウェア開発で「何か上手く進まないな、、」「うーん、リリース辛い」「しんどみ。。」を産んでしまっている原因だと思っています。

## 最後に :sleeping: 
拙い文章になってしまいましたが、想いは込めたつもりです。 :bow: 
組織に対して「アジャイル」というアプローチを浸透させるという一番難しい（超えたら明るい未来が待ってる）壁を超えて行けるようになりますように！ :mountain: :bird: 
ソフトウェア開発に携わる人が少し不安などなくみんなで進めるようになるきっかけのようになればと思っています。

間違ってる箇所など含め、何かご意見などございましたらコメントなどいただけますと嬉しいです。 :bow: 
ありがとうございました。 :santa_tone1: :christmas_tree:
phpからPDOでmysql接続できなかった話

phpでPODを使ってmysqlに接続すると、
Uncaught PDOException: SQLSTATE[HY000] [1045] Access denied for user
このエラーが出てきて、ググった方法を試しても全く解決されなかった。
ユーザー名もパスワードも合ってるし、環境設定もできてるし、php.iniの設定もできてるし、ユーザー権限もALLになってるし、、、、
そこでもう一回上記の確認をしてみると、、、、、

あ！！！！！！！

ユーザー権限のdb名の部分が間違っていた、、、、
db名を今使ってる名前にして、楽々接続完了！！！

db周りの環境設定とかエラーとかすごい苦手だったけど、今回のことで少し詳しなったのでmysqlインストール後の設定方法に関して一応整理しておく。

①mysqlインストール
②php.iniでpdo部分のコメントアウト
③Apacheの再起動
④.bashrcにPATHを通す
⑤mysqlを起動後にユーザー権限を付与

とりあえず、dbのエラー発生したら、①PATHが通っているのか（.bashrc)②ユーザー権限が合っているのかを真っ先に確認すればいいんだね。
最強エディタEmacsならマトリックス(っぽいこと)もできる

# はじめに

Emacsはその長い歴史の中で、世界中の歴々のハッカーから数多くの~~**無駄**~~機能を与えられてきました。

本稿は、そんな数多あるEmacsの機能の中から、**Zone mode**を用いて
映画マトリックスシリーズに登場するあの緑コンソールを再現してみました。
再来年公開予定の待望の新作、マトリックス4に備えましょう。(ステマではない)

# 忙しい人用
## これをinit.elのてけとーなとこに書くと
```Lisp:init.elのてけとーなとこ
;; zone.el 内部で宣言される 定数zone-programs を予め上書きしちゃう
;; 今回は横に文字が流れるzone-pgmを利用
(defvar zone-programs
  [ zone-pgm-rotate-LR-variable ] )

;; zone をロード
 (require 'zone)

;; デフォルト文字色を緑にしてzoneを起動、終了後は文字色戻して決めゼリフ
(defun my-matrix ()
  (interactive)
  (let ((default-color (face-foreground 'default)))
    (set-foreground-color "green")
    (zone)
    (set-foreground-color default-color)
    (message "They're watching you...")))

;; Ctrl - # でマトリックスできるようにキーバインドに登録
(define-key global-map (kbd "C-#") 'my-matrix)

;; もしくは5秒間操作が無ければマトリックスする
(zone-when-idle 5)
```

## こうなる

![Dec-18-2019 21-40-57.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59382/d2f0e208-549c-8c39-76ae-b83f5d2efd69.gif)


## 注意！！
- 文字色が緑から戻らないことがたまにあります。
Emacsを再起動するか、`(set-foreground-color "文字色")`で戻せます。

- デフォルトの文字色以外はそのままの色で流れちゃいますが、それはそれで綺麗。

- gif中のコードは深く読まない事。(なんてコメントなんだ…

# 今回マトリックスしてみてわかったこと

- [Zone mode](https://www.emacswiki.org/emacs/ZoneMode)は、Emacsに標準搭載の機能です。パッケージのインストール等は特に必要ありません。直訳すると**居眠りモード**でしょうか。

- Zone modeは、一言で表すとスクリーンセーバーです。バッファ中の文字が様々なアクションで動いたり消えたり別の文字に変わります。
アクションは`zone.el`中の`zone-programs`変数に`zone-pgm-*`として列挙されており、通常だといずれかがランダムで起動します。

- 今回は緑コンソールを再現するために、`zone-pgm-rotate-LR-variable`に一つに制限しています。制限を外す(init.elのてけとーなとこでdefvarしてるのをコメントアウトする)と、緑文字が楽しく動き出すかと。

- `zone-when-idle`にてZone modeが起動するまでのアイドル時間を設定可能です。私は120 (Emacsが2分放置されると起動)にしています。(結構うっとおしい)

- Macだと`/Applications/Emacs.app/Contents/Resources/lisp/play/` 配下にZone modeの本体である`zone.el`が配置されています。この中をもう少し弄って、文字が流れる速度を映画っぽくしてみたりしましたが、それはまたの機会に…。

- なお、`play`フォルダにはEmacs標準搭載の各種ゲームのコードが詰まっています。~~ゲーム箱に入れられてるZone modeって…~~

- 映画に即して、文字を縦に流すには〜を少しだけ考えてみましたが断念しました。[縦書き機能](https://www.emacswiki.org/emacs/tategaki.el) というものはあるようです。本当になんでもあるなEmacs…。

- マトリックスし終わった後に喋る *They're watching you...* はマトリックスからの引用。


# おわりに
*Emacs is watching you...*＜●＞＜●＞
Docker コンテナ内から他の Docker コンテナにdocker exec実行

AWS Workspaces
Amazon Linux2
nginx 1.16.1

```:Dockerfile
FROM alpine:3.10.3

RUN apk --update add logrotate docker && rm -rf /var/cache/apk/*

# cronのdaemonを起動(log level=1, foreground)
CMD crond -l 1 -f
```

```
# Dockerイメージ作成
docker build -t base .

# Dockerコンテナ起動
docker run -d \
--name nginx \
-p 81:80 \
nginx:1.16.1

docker run -d \
--name base \
-v /var/run/docker.sock:/var/run/docker.sock \
base:latest

$ docker exec -it base sh
/ # docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
34f2c8645bd2        base:latest         "/bin/sh -c 'crond -…"   18 seconds ago      Up 17 seconds                            base
e48c7a09b233        nginx:1.16.1        "nginx -g 'daemon of…"   42 minutes ago      Up 42 minutes       0.0.0.0:81->80/tcp   nginx

/ # docker exec -it nginx bash
root@e48c7a09b233:/# ls
bin   dev  home  lib64	mnt  proc  run	 srv  tmp  var
boot  etc  lib	 media	opt  root  sbin  sys  usr

root@e48c7a09b233:/# nginx -v
nginx version: nginx/1.16.1
```

## 2019/12/20追記

コンテナ内でコンテナを操作するやり方は
「DinD(Docker in Docker)」
「DooD(Docker outside of Docker)」
があった。

[alpineベースのDocker公式イメージ](https://hub.docker.com/_/docker/?tab=description&page=4)
[ubuntuベースのteracy/ubuntu](https://github.com/teracyhq/docker-files/tree/master/ubuntu)

## DinD(Docker in Docker)

例

DinDではホストのDockerとは完全に別物のDocker環境なので、
docker ps、docker imagesを実行してもホスト側の情報は表示されない。

```
$ docker run --privileged --name dind -d docker:stable-dind
$ docker exec -it dind /bin/ash
/ # docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
/ # docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
```

## DooD(Docker outside of Docker)

例

ホストのdocker.sock (/var/run/docker.sock)をマウント

```
$ docker run -d \
--name nginx \
-p 81:80 \
nginx:1.16.1

$ docker run -ti \
--rm \
-v /var/run/docker.sock:/var/run/docker.sock \
docker \
/bin/ash

/ # docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
a31010707f45        docker              "docker-entrypoint.s…"   33 seconds ago      Up 32 seconds                            infallible_antonelli
2780dae6110b        nginx:1.16.1        "nginx -g 'daemon of…"   51 seconds ago      Up 50 seconds       0.0.0.0:81->80/tcp   nginx

/ # docker exec -it nginx bash
root@2780dae6110b:/# nginx -v
nginx version: nginx/1.16.1
```
[ReactNative] WebViewからpostMessageで値をアプリに渡す


# What

- ReactNative+expoのアプリでWebViewを扱う際に、WebViewから値を直接アプリに渡したい場合の方法です

expoを使用している場合、WebViewを扱うためにはreact-native-webviewをimportする必要があります。
以下、WebViewから値を渡すサンプル

`setInterval(function () {window.ReactNativeWebView.postMessage("Hello!")}, 2000)`
webViewからアプリに値を渡したい場合、postMessageを使用しますが、注意点として、`ReactNativeWebView`を対象にしないと正しく値が渡されないので注意。

アプリ側では、`onMessage`によって取得したeventから`event.nativeEvent.data`を参照する事で、postMessageの内容を見る事が出来ます。

```react
import { WebView } from "react-native-webview";

function PostMessageExample(props) {
  const html = `
      <html>
      <head></head>
      <body>
        <h1>hoge</h1>
        <script>
          setInterval(function () {
            window.ReactNativeWebView.postMessage("Hello!")
          }, 2000)
        </script>
      </body>
      </html>
    `;
  return (
    <WebView
      source={{ html }}
      onMessage={event => {
        console.log(event.nativeEvent.data);
      }}
    />
  );
}
```
新卒でPerlを書き始めてつまづいたことを並べます。

## はじめに
初めまして！新卒エンジニアの肉@nikuzukiです。
Qiitaを書くのは初めてです。よろしくお願いいたします。

私はミクシィに入ってからPerlを書き始めた者です。
日々、Perlを書いていて楽しい！と思う一方で、
まだまだ手に馴染んでおらず、Perlに書かされている感じの新米エンジニアです。

そんな私は、Perlを書き始めてからつまづいたことをメモしておりまして、
そのメモを自分の復習を兼ねて、アドベントカレンダーの記事にしました。

内容として、
- つまづいたこと（を問題風にしたもの）
- 解説
という順で書き並べていきます。

また、これらのメモはPerlを理解していなかった私が生んだコードたちです。
ご勘弁ください。

## True?False?

このなかで文字列が出力されるものはどれでしょうか？

```Perl
print "yakiniku" if 0;
print "sushi" if 0.0;
print "sukiyaki" if "0";
print "shabushabu" if "0.0";
```

### 説明

Perlにはブール値がありません。
その代わりTrueやFalseを表す数値や文字列を使います。
0や'0'はFalseを表し、1や'0'以外の文字列はTrueを表します。
気をつけないといけないのは'0.0'で、一見Falseのように感じますが、
'0'以外の文字列でありTrueを表します。
怖いですね〜。

|値、文字列|T or F|
|:-----------------:|:------------------:|
| 0 | False |
| 1 | True |
|''（空文字列）|False|
|'0'|False|
|'1'|True|
|'0.0'|True|

このコードでは"shabushabu"のみが出力されます。

## True?False? パート2

```Perl
my $array = [];
if ($array) {
  print "yes";
} else {
  print "no";
}
```

### 説明
いきなり$や[]が出てきました。怖いですね。
Perlにはスカラー変数というものがあります。
スカラー変数は数値や文字列、メモリアドレスを入れることができる変数です。
`my $変数名`で宣言することができます。

次にPerlのリストの話をします。
Perlは（）でリストを作ることができます。
配列は`my @変数名`で宣言することができ、
1,2,3という要素が入った配列を作るときは
`my @array = (1, 2, 3);`
と書きます。

その一方で[]はリストが存在するメモリアドレスを表します。
`my $array = [1, 2, 3];`は
1,2,3という要素が入っている配列が存在するメモリアドレスを$arrayに格納する
ということを表しています。
これをarrayref、配列のリファレンスと呼びます。
（$arrayという変数命名は正確ではありませんね...ごめんなさい...）

１行目では`$array`を宣言し、
空のリストが存在するメモリアドレスを`$array`に渡しています。

ここで本題に入ります。
空のリストが存在するメモリアドレスはTrueでしょうか？Falseでしょうか？
Perlにおいてメモリアドレスは全てTrueです。
ここでは"yes"と出力されます。


## リストとfor文

```Perl
my @array1 = (1, 2, 3);
my @array2 = (4, 5, 6);

for (@array1, @array2) {
  print $_;
}
```

### 説明
forをグルグル回すと何が出力されるでしょう？という問題です。
`$_`という怖そうなものがありますが、これはデフォルト変数と呼ばれるもので
for文のスコープ内において、配列の各要素が渡される変数となります。

問題はarray1と2がどうなるかというものですが、
Perlでは配列が展開されて渡されます。
よって`123456`と出力されます。
これは怖くないですね。

これがわかると

```Perl
my @a = ();
my @b = (1);

map {
  print "1";
} @a, @b;
```
も何が出力されるか分かりますね。

## 変わった代入

```Perl
my @array = [0, 1];
print $array[0];
```

### 説明
ここまでの説明がわかるとピンとくるかもしれません。
これは0が出力されず0と1を持つリストがあるメモリアドレスが出力されます。
Perlでは配列にスカラ（メモリアドレス）を代入すると一つの要素を持つ配列となります。

それではここから0を取り出すにはどうするでしょうか？
Perlでリファレンスの要素を参照するにはアロー演算子`->`を使います。
例えば、`$arrayref = [1,2,3];`で2番目の要素を参照するには
`$arrayref->[2];`と書きます。
今回の場合`@array`の中にメモリアドレスがあり、その中の1番目を参照するので
`$array[0]->[0];`と参照します。

()はリスト、[]はリファレンス
やや怖いですね。

## 終わりに
復習がてらに書き記したものなので、間違っている箇所があるかもしれません。
コメントでご指摘いただけると嬉しいです！

明日はらりょすさんです。
楽しみですね。
TypeScript の baseUrl について調べた事

## TypeScript の `baseUrl` とは何か？
module のインポート時に起点となるディレクトリを指定できる設定です。
詳細は[公式ドキュメント](https://www.typescriptlang.org/docs/handbook/module-resolution.html#base-url)を参照してください。

## `baseUrl` を設定する
tsconfig.json の `compilerOptions` で設定します。
インポート時に起点となるディレクトリを tsconfig.json を配置しているディレクトリから相対パスで指定します。

```tsconfig.json
{
  "compilerOptions": {
    "baseUrl": "./src"
  }
}
```

## `baseUrl` を設定した場合のモジュールのインポート
こちらのようなディレクトリ構成の場合...

```
.
├── dist
├── src
│   ├── components
│   │   └── index.ts
│   └── modules
│       └── module.ts
└── tsconfig.json
```

`src/components/index.ts` から `src/modules/module.ts` をインポートする時、通常は相対パスで指定すると思います。

```src/components/index.ts
import moduleDemo from '../modules/module'

moduleDemo()
```

tsconfig.json で　`baseUrl` に `./src` を指定しておくことで `./src` を起点にモジュール解決をする事ができるので、こちらのように書く事ができます。

```src/components/index.ts
import moduleDemo from 'modules/module'

moduleDemo()
```

## まとめ
create-react-app で　React + TypeScript を書いている時に、コンポーネントのインポートを相対パスで書くの面倒くさいな...と思っていたらこの設定を見つける事ができました。
これでコンポーネントのインポートがちょっとは楽になるかなと思います。
RxSwiftのオペレーターの勉強 その２（結合編）

[Atrae Advent Calendar 2019](https://qiita.com/advent-calendar/2019/atrae) の18日目を担当するアガツマです。
普段は、ビジネス版マッチングアプリ [yenta](https://yenta.talentbase.io/yenta) のiOS版を開発をしています。

[前回](https://qiita.com/_xAGAx_/items/b3fe92c9f2a31e1a6ca5)に続いて、RxSwiftのオペレーターについて書きます。
今回は、オペレーターの中でも複数のobservableを合成(結合)するようなものについてまとめました。
RxSwiftを勉強する際の参考になったら嬉しいです。



※RxSwiftのオペレーターとは、Observableに用意されているイベントを加工する用のメソッドのことを指します


# 複数のobservableを合成するオペレーター



## combineLatest

**処理**
２つのObsrvableのを監視してどちらか１つのObsrvableが送信される時、それぞれのObservableから送信される最新の値をまとめて送信する。


**用途**

複数の変数を監視する必要がある場合（複数入力のバリデーションなど） 
複数の値を組み合わせる処理

**コード**

```swift:
        let i = PublishSubject<Int>()
        let s = PublishSubject<String>()

        _ = Observable.combineLatest(i, s) {
            "\($0) + \($1)"
          }
          .subscribe {
            print("onNext: ", $0)
          }

        i.onNext(1)
        s.onNext("A")
        i.onNext(2)
        s.onNext("B")
        s.onNext("C")
        i.onNext(3)
```

**出力結果**

```
onNext:  next(1 + A)
onNext:  next(2 + A)
onNext:  next(2 + B)
onNext:  next(2 + C)
onNext:  next(3 + C)
```
## withLatestFrom

**処理**
あるObservableがイベントを送信した際に、もう一方の Observabe の最新のイベントを合成する。

**用途**
1つのアクションが起きた際に、他の値に対して何かしら処理をする場合。
（ボタンが押された時などに、他の要素がどのような値になっているか知りたいときなど）


**コード**

```swift:
        let i = PublishSubject<Int>()
        let s = PublishSubject<String>()
        
        i.withLatestFrom(s)
            .subscribe({ string in
                print("onNext: ", string)
            })
            .disposed(by: disposeBag)

        i.onNext(1)
        s.onNext("A")
        i.onNext(2)
        s.onNext("B")
        s.onNext("C")
        i.onNext(3)
```

**出力結果**

```
onNext:  next(A)
onNext:  next(C)
```


## zip

**処理**
複数の Observable のイベントを１つづつ順番に合成する。

**用途**
並列処理をしたい場合（API通信で複数のレスポンスを待ってから処理を進めたいときなど）

**コード**

```swift:
        let i = Observable.of(1,2,3,4,5)
        let s = Observable.of("A","B","C")

        _ = Observable.zip(i, s) {
            "\($0) + \($1)"
          }
          .subscribe {
            print("onNext: ", $0)
        }
```
**出力結果**

```
onNext:  next(1 + A)
onNext:  next(2 + B)
onNext:  next(3 + C)
onNext:  completed
```



# おわりに
今回は、RxSwiftでのObservableの合成についてまとめてみました。
このような、オペレーターを組み合わせることで、様々な処理を実現することができるのだなと思いました。
今後は、RxSwiftを用いたアーキテクチャーなどの理解を深めていきたいと思います！



### 参考
[RxSwift研究読本1 入門編](https://booth.pm/ja/items/1076262)
[ReactiveX Document](http://reactivex.io/documentation/operators.html#transforming)
Hello Java Lambda

簡単な要件を満たすコードを書くにあたって、Lambda を使わないケースと使うケースを比較してみます。
以下のような数字のリストを用意し、100以上の分だけ2倍したものを合算する処理を考えてみます。
仕様：100以上の分だけ2倍したものを合算する

```java:number-list
final List<Integer> numbers = Arrays.asList(50, 100, 10, 400, 120, 30, 220);
```

##### Lambda を使用しないケース
たとえば、リスト内の値を一つずつチェックし、もし100以上であればその数値を2倍し、total に加算するという流れが考えられます。
これ位の計算であれば、シンプルで分かりやすく大きな問題はないと思われます。
ただ、仕様（100以上の分だけ2倍したものを合算する）に対して、それを実現する一つの方法として ”数字を一つずつチェックする” というエンジニアのアイデアがそこに挟まれるため、やや誤解を与えやすいコードになる可能性があります。

```java:without-lambda.java
int total = 0;
for (Integer number : numbers) {
  if (number >= 100) {
    total += number * 2;
  }
}
System.out.println("Total is " + total);
```

##### Lambda を使用するケース
トータルのコード量としては上記とさほど変わっていません。
ただ、コードから見える処理の流れの読み方が変わってきます。
”リストから100以上の数値をフィルターで取り出し、2倍し、それらを合計する”となります。
ループで一つずつチェックするようなコードは書いていません。
まるで仕様（100以上の分だけ2倍したものを合算する）をそのまま記述しているような形で表現ができています。
全てのケースでそれが当てはまるわけではないと思いますが、要求仕様に対してより誤解の少ないコードがこの例では書けていると思います。

```java:with-lambda.java
int total = 0;
total = numbers.stream()
  .filter(num -> num >= 100)
  .map(num -> num * 2)
  .reduce(0, (base, value) -> base + value);
System.out.println("Total is " + total);
```
Javascriptレシピ①

Javascriptの簡単なメモです。
アプリ制作に応用できる基本レシピですので、参考にされたい方はどうぞ。

##関数の書き方

###①関数宣言
```js
function wanko(){
         }
```
wankoという関数名をつけて関数宣言しています。
おなじみですね。

###②関数式
```js
const wanko = function(){
      }

const wanko = () => {
      }
```
無名関数というやつです。
関数はデータの方として存在しているのでこのような書き方が可能になります。


Functionオブジェクトのオンストラクタを使った書き方もあるのですが、ほぼ間違いなく使わないので省略します。

##書き方
```js
const p = document.createElement('p');
p.textContent = 'wanko';
documen.body.appendChild(p);
```

これを関数にすると

```js

function toypoo(){
    const p = document.createElement('p');
    p.textContent = 'wanko';
    documen.body.appendChild(p);
}
```
コード自体はdocument.createElment(p)でp要素を作成
p要素のtextContentをwankoに
bodyにp要素を付与しています。

toypooという関数が出来ましたね、toypoo();で呼び出せます。


<button onClick='toypoo（）'>ボタン</button>
このように書くとボタンを押したらtoypoo関数が呼び出されます。


HTMLファイルが読み込まれたらwankoと表示します。


```js

window.onload = function(){
    console.log('wanko');
}

window.addEventListner('load', function(){
    console.log('wanko');
})
```

##引数

Javascriptでは引数を複数指定できます。

```js
function wanko(pome,toypoo){

    }

//引数にpomeとtoypooを指定することで関数内でpomeとtoypooが使えるようになります。

wanko(1,2);

//それぞれpomeとtoypooに対応しています。
```

##引数にコールバック関数

```js
function wanko(callback){
    setTimeout(function(){
        console.log('wanko');
        callback();
    }, 2000)
}
```

引数にcallback関数を指定しているので2秒経過後に引数に指定した関数が実行されます。

###returnで返り値
```js
function wanko(toypoo, pome){
    
    return toypoo+pome;
}

if(wanko(7,5) > 3){

 console.log('wan');
}  else {
       console.log(wanwan);
}
```

returnで返り値を戻すことで普通の値として関数を使えるようになりました。



    
続く