OmniAICreator/Qiita-1.07M huggingface dataset:
Docker Apacheサーバー（httpd）＋バインドマウント

Docker初級
Apacheサーバーを簡単にローカルに立てて作成中のサイトなどをブラウザで確認できる。
サーバー環境とhtmlソースを別に管理できるので便利。

**Dockerをインストール（Mac）**
https://docs.docker.com/docker-for-mac/install/


### Apacheサーバー（httpd）を立て、別ディレクトリにあるhtmlを表示する

```
$ docker run -d -p 8080:80 -v [htmlファイルのパス]:/usr/local/apache2/htdocs/ httpd
```

（カレントディレクトリにあるhtmlをマウントする場合）

```
$ docker run -d -p 8080:80 -v "$(PWD)":/usr/local/apache2/htdocs/ httpd
```

ブラウザからアクセスする
http://localhost:8080/


コンテナ停止

```
$ docker stop [コンテナ識別子]
```

### docker コマンド


`$ docker run` イメージ取得、コンテナ生成、コンテナ起動を一度に行う

#### docker run のオプション
`-d, --detach` 
Run container in background and print container ID
バックグラウンドでコンテナを実行し、コンテナIDを表示する　

`-p, --publish=[]`
Publish a container’s port(s) to the host
コンテナのポートをホストに割り当てる
（例）`-p 8080:80` ホストのポート8080をコンテナのポート80に割り当てる

`-v, --volume`
Bind mount a volume
ボリュームをコンテナに連結して認識させる
 [ホストのディレクトリ]:[コンテナのディレクトリ] 

**Use bind mounts**
https://docs.docker.com/storage/bind-mounts/
Move系boxが効かない時の対処法メモ

![move_boxes.png](https://qiita-image-store.s3.amazonaws.com/0/65230/fdba24df-ebfc-c820-4247-c3bc77a68c50.png)
Naoqi2.5系へのアップデートでSLAMのβ版が使えるなりましたが
まだまだMove系boxって使うよね！しかも困った時に意外と対処法知らないよね！ってことで
今更だけど書いてみました。
# Move系boxが動かない時に考えられる原因と対処法メモ

### 充電ハッチがひらきっぱなし
あるよね。
機体はピンピンしてるのに動かない時はまずこれ確認しましょう。

### スクリプトがエラーはいてる
そりゃ動かないよね。
再生ボタン押してboxが赤くなるようなら、構文エラーとかOSのversionが対応してないとかその辺が疑われます。
![box_error.png](https://qiita-image-store.s3.amazonaws.com/0/65230/4fe63fad-f301-cbec-b855-06614dbc74e3.png)

### 足のSafetyが発動している
Pepperは安全第一！なので、通常のSafetyが有効な状態で近くに物を感知すると動けなくなります。
解除するには Set External Anti-Collision boxで Body part "Move"を"Disable"にして再生してあげます。
![safety.png](https://qiita-image-store.s3.amazonaws.com/0/65230/14a97686-e268-616a-5552-30b45eb3637f.png)

### 無理なスピードで移動させようとしてる
Pepperの移動速度は最大2km/h*なので、超えたら当然動けないよね。
同じ軌道で移動スピードを大幅に落としてみて動くようなら、速度が問題になっている可能性が高いかと。

### 無理な姿勢で移動させようとしている
Pepperは腰を**左右**に曲げる(=HipRollが"0"ではない)動作と、Move系の動作を並列で実行できません。

↓例えばこういう感じ

![pose_1.png](https://qiita-image-store.s3.amazonaws.com/0/65230/18409e47-1167-4894-e917-ab9e55c80b77.png)
通常はMove開始時に腰が垂直に戻ったりしますが、こんな風に無理な姿勢をさせたままだと
機嫌悪くして動かなくなるかもしれません。


### そもそもonStartが発火してない
うっかりこういうやつとか
![not_lined_1.png](https://qiita-image-store.s3.amazonaws.com/0/65230/b35ea94b-93e9-cfe2-e095-4bab5b068b88.png)
こういうやつとか
![not_lined_2.png](https://qiita-image-store.s3.amazonaws.com/0/65230/ff0b6d52-a9d3-b90a-5443-92189c3aca4b.png)

ちょっと慣れてきた頃にやっちゃいがちですよね。
そもそも線つながってねえ！みたいな。そりゃ動かないよね。
　
　

初歩的なミスに気をつけてみなさんも素敵なPepper Lifeを。

----------------
*製品仕様 https://www.softbank.jp/robot/consumer/products/spec/
codesignは、キーチェーンに含まれるキー"access"へアクセスしようとしています

## 現象

Macを買ったので、iOSアプリを作ろうとはしゃいでいる初心者エンジニアです。

早速Xcodeをインストール、空プロジェクトを作成し、実機を接続してアプリをビルドしようとしたところ以下のダイアログが出現。

<img width="546" alt="スクリーンショット 2018-12-03 23.56.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/189343/2ddfd587-35eb-45b6-a9ca-ec82a8ced850.png">

codesign？？
キーチェーン？？？
access？？？？

何を言われてるかわからず"拒否"を押してみたらビルドエラーに。。。

## 対処法

Macの、今ログインしているユーザのパスワードを入力し、"常に許可"を押してみたらビルドが続行しました。

※参考： https://stackoverflow.com/questions/46774005/codesign-wants-to-access-key-access-in-your-keychain-i-put-in-my-login-passwo

ちょっとしたことですが、日本語情報がなかったので。

## 余談
初めてMac使ってるんですが、ディスプレイが綺麗でフォントもおしゃれなので、記事書くのめちゃくちゃ楽しいです……笑
BitVisorのtelnet_dbgsh機能を使う

BitVisorのtelnet_dbgsh機能を使ってみます。今回はLinux KVMを有効にしたQEMUを使用し、UEFI(OVMF)を指定しています。

設定:

```:defconfig
(省略)
                .telnet_dbgsh = 1,
                .tty_mac_address = {
                        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
                },
                .tty_syslog = {
                        .enable = 1,
                        .src_ipaddr = { 192, 168, 0, 64 },
                        .dst_ipaddr = { 192, 168, 0, 27 },
                },
                .driver = {
                        .pci = "driver=pro1000, net=ip, tty=1",
                },
        },
        .ip = {
                .use_dhcp = 1,
        },
};
```

Intel GbE NIC用のドライバーを指定して、syslogログ出力とTCP/IPスタックを有効にしています。IPアドレスはUDPのsyslogを受け付けるコンピューターのIPアドレスに変えてください。ログ出力の設定に関しては以下の記事をご覧ください。
https://qiita.com/hdk_2/items/2431710fcf257904fc8a

QEMUは適当に以下のようにして起動します。この例ではTCP 8023番ポートを使用しますので、他のポート番号にする場合は適宜読み替えてください。

```shell-session:
$ mkdir _
$ ln -s ../bitvisor.elf ../boot/uefi-loader/loadvmm.efi _
$ qemu-system-x86_64 -bios OVMF.fd -cpu host -enable-kvm -m 2048 -snapshot -hda fat:_ -net nic -net user,tcp:127.1:8023-:23
```

EFI Shellが起動したらloadvmmと打ち込んでBitVisorを起動します。

```shell-session:
Shell> loadvmm
```

BitVisorが起動したら、syslogを参照してきちんとIPアドレスが割り振られたか見てみます。

```shell-session:
# tail -4 /var/log/messages
Dec  1 11:17:28 192.168.0.27 bitvisor: PCI: 6 devices found
Dec  1 11:17:28 192.168.0.27 bitvisor: Starting a virtual machine.
Dec  1 11:17:28 192.168.0.27 bitvisor: telnet server "dbgsh" ready
Dec  1 11:17:28 192.168.0.27 bitvisor: IP address changed: 0.0.0.0 -> 10.0.2.15
```

10.0.2.15はQEMUのSlirpがデフォルトで割り振るIPアドレスですので、良さそうです。QEMUを実行したホスト上からtelnetで接続してみましょう。

```shell-session:
$ telnet -- 127.1 -8023
Trying 127.0.0.1...
Connected to 127.1.
Escape character is '^]'.
> 
```

dbgshのプロンプトが出ました。ホスト名はlocalhostでも構いませんが、最初IPv6で接続しにいってからになるので、ここではIPv4アドレスを指定しています。telnetのポート番号に-を指定しているのは、telnet protocol negotiationを強制的に有効にするためです。詳しくはtelnet(1)のmanual pageをご覧ください。

今回はQEMUのhostfwd機能を使って別のポート番号にフォワードさせたのでこんなことになっていますが、23番ポートで接続できるなら、このような指定はいらないです。ただし、本機能にパスワードなどの認証は一切ありませんので、十分ご注意ください。少なくとも、インターネットから接続可能な状態にはしないことをおすすめします。

このdbgsh上で、logコマンドやdebugコマンドが通常通り使用できます。試しに、リセット時に実行されるファームウェアの部分をダンプしてみます。

```shell-session:
$ telnet -- 127.1 -8023
Trying 127.0.0.1...
Connected to 127.1.
Escape character is '^]'.
> debug 
guest state not found
debug> Dp/10 fffffff0 
FFFFFFF0  90 90 EB AC 90 90 90 90-90 90 90 90 90 90 90 90   ................
debug> q 
> exit 
Connection closed by foreign host.
```

このようにメモリーダンプができますし、exitコマンドで接続を切ることもできます。telnetを途中で切った場合は、再接続すると続きからになります。

```shell-session:
$ telnet -- 127.1 -8023
Trying 127.0.0.1...
Connected to 127.1.
Escape character is '^]'.
> deb   
telnet> Connection closed.
$ telnet -- 127.1 -8023
Trying 127.0.0.1...
Connected to 127.1.
Escape character is '^]'.
ug 
guest state not found
debug> 
```

また、telnetを切らないまま別のtelnetを開始した場合は、古いtelnetのほうが強制的に切れます。
Raspberry Pi 3 Model BでClementineのビジュアライゼーションを楽しむ方法

#はじめに
こんにちは。たいちゃんです。
初めて投稿しますので行き届かない面もあるかと思いますが、
頑張って記事を書きます。

#タブレット作ってみたけど・・・
まず、最初の投稿はRaspberry Pi 3 Model Bと公式の7"touchscreenで
タブレットっぽいものを作ったことを記事にしようと思います。

まずはこちらがそのタブレット(っぽいもの)です。
![KIMG0198.JPG](https://qiita-image-store.s3.amazonaws.com/0/319826/18f6a3c1-7fd7-c83c-3095-e82bb7576637.jpeg)
筐体はムトーエンジニアリングさんの3Dプリンターを使用して作りました。

画像は画面のある本体とスピーカーがドッキングした画像で、分離すると以下のようになります。
まずは画面のある本体から
![KIMG0191.JPG](https://qiita-image-store.s3.amazonaws.com/0/319826/ea939d98-2937-1d8b-d4c6-556147616fc4.jpeg)
次にスピーカーの部分
![KIMG0213.JPG](https://qiita-image-store.s3.amazonaws.com/0/319826/74a941e3-73bb-5f24-5cf0-126b13537c9d.jpeg)

これで出版社から購入したDRMフリーのPDFの電子書籍をEvinceで
読んだりしていましたが、Clementineのビジュアライゼーションがカクカクだったり、有料音楽
配信サイトで購入したミュージッククリップ等がVLCでうまく見られなかったりしていました。
この時はまだスピーカー部は出来ておらず、本体もプロトタイプを繰り返して完成度を
上げていっている状態でした。でもどうしても出来ない。そんな中インターネットで調べてみると
以下の情報に行き当たりました。

1)raspi-configでGL Driverを操作するとグラフィック関連が良くなる。
2)VLCで動画が見られないときはアクセラレーティドビデオ出力(オーバーレイ)のチェックを外す。

情報を掲載して下さった方には本当に申し訳ないのですが、どのサイトでこの情報を私が得たか
もうわかりません。この情報を得たのは今から1年程前の話なのです。只、この情報をもとに
調整をすると Clementineのビジュアライゼーションが割とスムーズに動き、
VLCでもミュージッククリップを見ることが出来るようになりました。

#調整方法をまとめると
私が調整を行ったポイントは以下の通りです。
1)GL DriverはGL(Fake KMS)にする。GL(Full KMS)だと私の環境だとシステムそのものがダウン
して使えなくなる。(これも情報源がどのサイトか分からなくなってしまって恐縮ですが、
公式の7"touchscreen特有の現象という情報がありました。)
2)VLCのオーバーレイのチェックを外す問題ですが、いつの間にかアップデートを
繰り返しているうちにVLCの仕様が変わってしまったらしく、現在は特にこの設定は
しなくても良いようです。(そもそもオーバーレイの項目が見当たらない。)

さらに私の場合ハイレゾ対応のFLACを聴くので、以下の設定をしなくてはならないようです。
3)Clementineの「バッファーの長さ」を0にする。
これをしないとFLACの再生後MP3等に移るとき音が出なくなってしまいます。
バッファーに何かデータが残るのでしょうか？

後はビジュアライゼーションを楽しむ為に操作しなかったときに画面が消えないように
設定をしたりします。前はファイルを操作して設定をしていたのですが、
ついこの間、Raspbianをインストールし直したので、試しに公式サイトのHelpの
ConfigurationでScreensaverの設定方法が紹介されていたので、
それを試してみました。

https://www.raspberrypi.org/documentation/configuration/screensaver.md

このxscreensaverは公式の7"touchscreenには縦サイズがあっておりませんが、
何とか使えるようです。現在はこれで放置しても画面が消えないようにしています。

また、SWAPも増やした方が良いようです。こちらも公式サイトのForumsから。
参考に100MB→1024MBにしてみました。

https://www.raspberrypi.org/forums/viewtopic.php?p=365913

以上が私がビジュアライゼーションを楽しむ為になんとか辿り着けた設定を記事にしてみました。
この場を借りてネット上のサイトに情報を掲載して下さった方々に感謝の念を表したいと思います。

#おまけ
本体とスピーカーの筐体の3DCADデータは以下のようになっております。
(FreeCADにて作成)
![FreeCAD_reader02.png](https://qiita-image-store.s3.amazonaws.com/0/319826/ca317e3a-7fc8-0c5f-71dc-87bd5d0bc719.png)
Sassを使ってビューごとにスタイルを適用させる方法

# はじめに
こんにちは！`#teamサイゼリヤ`アドベントカレンダー4日目のテッシです。
1年半前から大変お世話になっているぶっちー(@yoshixj)と実際にサイゼリヤに行ったことがあるため今回の`#teamサイゼリヤ`に参加させていただきましたw

今回はRailsで、Sassを使ってビューごとにスタイルを適用させる方法について書きたいと思います。

#スタイルシートの読み込み
Railsではデフォルトで`app/assets/stylesheets/application.css`というファイルが存在し、以下のような内容になっていると思います。

```css:app/assets/stylesheets/application.css
/*
 * This is a manifest file that'll be compiled into application.css, which will include all the files
 * listed below.
 *
 * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's
 * vendor/assets/stylesheets directory can be referenced here using a relative path.
 *
 * You're free to add application-wide styles to this file and they'll appear at the bottom of the
 * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
 * files in this directory. Styles in this file should be added after the last require_* statement.
 * It is generally better to create a new file per style scope.
 *
 *= require_tree .
 *= require_self
 */
```
この中に`*= require_tree .`という記述があり、これによって`app/assets/stylesheets`以下のすべての階層のスタイルシートが読み込まれます。
そのため、ビューごとにスタイルを適用したい場合でも`app/assets/stylesheets`以下のスタイルシートがすべてのビューに適応されてしまい、思わぬレイアウトの崩れが生じることがあります。

# Sassの特徴を使う
Sassではネスト(入れ子構造)が使えます。
cssで書くと以下のようになりますが、

```css:css
ul {
  margin: 0;
}
ul li{
  margin: 10px;
}
ul li a{
  color: #333;
}
```
Sassを使えば以下のようにネスト(入れ子構造)で書けます。

```scss:scss
ul {
  margin: 0;
  li {
    margin: 10px;
    a {
      color: #333;
    }
  }
}
```
今回はこのSassのネスト(入れ子構造)を使って`app/assets/stylesheets`以下のスタイルシートがすべてのビューに適応されてしまう問題を解決します。

# 解決方法
例えば、`app/views/top/index`のページにスタイルを当てる場合は、`app/assets/stylesheets/top/` ディレクトリを作成し、`index.scss`ファイルを作成し、以下のように記述します。

```scss:app/assets/stylesheets/top/index.scss
.top-index {
  // このブロックの中にスタイルを書いていく
  ul {
    list-style: none;
  }
}
```
`top-index`というクラス名は自由に設定していいですが、上記の例のように`controller名-action名`をクラス名に使うと対応が分かりやすいかもしれません。

次に、erbファイルの一番親の要素に以下のようにクラス名を当てます。

```erb:app/views/top/index.html.erb
<div class="top-index">
  <!-- このブロックの中にコードを書いていく -->
  <ul>
    <li>テッシ</li>
    <li>スアレス</li>
    <li>ネイマール</li>
  </ul>
</div>
```
このように`top-index`というクラス名を一番親の要素に当てることで、スタイルシートの`.top-index`で囲われたブロック内のスタイルのみが適用され、ビューごとにスタイルを当てることが可能になり、思わぬレイアウトの崩れを防ぐことができます。

#最後に
今回はSassの特徴を利用してビューごとにスタイルを適用できるようにする方法を書きましたが、他にもerbファイルに、読み込むスタイルシートを指定する方法などもあると思います。
少しでも参考になれば幸いです。最後まで読んでくださりありがとうございます！
集合は集約なのか？ってマサカリを投げてみる話

#昨日、こんな記事がありました。

@bigwheel [集約の境界と整合性の維持の仕方に悩んで2ヶ月ぐらい結論を出せていない話 ](https://kbigwheel.hateblo.jp/entry/2018/12/03/aggregate-and-consistency)

ヒャッハー新鮮な話題だあ！
とてもいいですね。やはり議論には具体的な議論対象が必要です。

ただ気になったのが、ユーザにユーザ自身に関する情報と、組織がユーザに対して持っている情報が両方ユーザに有る事です。それって同じところにある必要あるでしょうか？

###名簿は人間を含みません

この組織が所属してる人を使って何かをするってんならそりゃ集約でしょう。例えばこれが野球だとか戦争だとかならばチームとして統制の取れた動きが必要です。または関連したデータでもいいです。一般に明細を集約の中に含めるのは、集約が明細の合計である必要があるからです。例えばある伝票はその明細の合計として振舞うので伝票を送るならその明細も同時に送る必要があります。
ですがここで行っているのは人数の管理だけです。この組織は単なる集合とかコンテナであり関連するデータとは言い難いものがあります。集約じゃないんじゃないでしょうか？[そういや合成集約ですが去年こんな記事を書きました。](https://qiita.com/turanukimaru/items/0b1396393908b7e22618)組織に人間を所属させるではなく名簿を管理すると考えれば十分じゃないですかね？

###ユーザが組織に使用権があるか問い合わせるモデル

というわけで組織を名簿にして、対象のユーザから「俺使える？」と問い合わせるモデルを提案します。組織のほうにユーザのリストとその使用権を保持します。ユーザと組織を別集約にするという事ですね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151783/607d7580-6df9-ecf6-9b82-008934a826e0.png)

これは一種の循環参照になって気持ち悪いと言えば気持ち悪いのですが、ユーザ名簿からユーザへはIDを持っているだけでメッセージを飛ばしません。オブジェクトの参照もしません。つまりオブジェクトグラフではないことになります（強引？）。
やりとりするIDと使用権は値オブジェクトなので問い合わせる分には問題はないでしょう。例えば名簿にユーザID,使用権、登録順になるなんかを入れて、問い合わせに応じてそのユーザが使用権あるか＆登録順で数えて人数のうちに入っているかを返せば万一人数がオーバーしても大丈夫です。

###ユーザに有効無効を持たせるとえぐい

ユーザが有効であるか無効であるかを決めるのは組織なのでユーザ側に持たせるのはお勧めしかねます。具体的にはユーザ名やメールアドレスはユーザが変更できるのに組織が有効無効を変更できるのはそれ別問題じゃないの？ということです。こうすることで例えば組織がユーザ数を拡大したときとかに待機ユーザを有効にする、なんてのが組織の名簿上でできます。これをユーザに持たせると同一トランザクション内でユーザへの更新が大量に走りパスワード変更とぶつかったりするわけですよ。

###ユーザ登録の具体的な挙動

１．ユーザを作ってリポジトリに入れます。
２．ユーザのIDをもって組織に利用申請を出します。組織は利用者を登録しリポジトリに入れます。シーケンスを発行しておくと登録順が明確になって安心ですね。
３．もし同時に複数のユーザから登録申請が来て超過した場合はトランザクションではじいてもいいし、暫定的に受け入れたよって返事をしてもいいでしょう。
４．どちらにしろユーザは作れたが有効にならなかったという結果になるのでユーザをそのままにして枠の拡張を促すなり登録失敗として削除するなりします。
５．ユーザは許可が下りるまで誰も読まない記事を書いて待ちましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151783/2fbb3441-af07-e5b7-e721-e4b8b7a6bb5b.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151783/c7bd4bd1-01d7-cbad-0f48-364deda73a3f.png)




もし組織と個人の間にもっと色々ななんかがあったらゴメーヌ。
でもその場合でも私が言いたいのは「組織の中の個人と単なる個人は別の存在でもよくない？」です。
Laravelの最新情報チェックはLaravel Newsがおすすめ

# Laravel Newsとは
Laravelの最新情報を更新してくれるサイトです。
https://laravel-news.com

Laravelのアップデートの内容やTips等が結構な頻度で更新されており、Laravelについての最新情報を得るならこのサイトのみで十分なんじゃないかと思います。

メルマガを登録しておくと、更新の度にメールが来るので便利です。

## blog
https://laravel-news.com/blog

Laravelのアップデートの内容やTips等が投稿されています。

## Tutorial
https://laravel-news.com/category/laravel-tutorials

Laravelのチュートリアル記事が載っています。

Popular Laravel Tutorialsのところを読むと、Laravelの認証周りやEloquentモデル関係とCacheの使い方等、実際のシステムを作る上でハマるポイントについて書いて合って有益です。

# まとめ
Laravelはどんどん機能が増えるし便利なパッケージも出ているので、Laravel Newsで最新情報を追っておくと良いのかなと思います。
hello, world in Vanilla Java～EHW2018「MVP」

# 概要

このエントリは、「Enterprise "hello, world" 2018 Advent Calendar 2018」の12/3向けのものです。このAdvent Calendarでは、複数個のエントリにまたがる話の流れも鑑みつつ、なるべく1エントリで１つのトピックをカバーできるようにする予定です。

このエントリで記載するトピックは、「仕様を決める」と「MVP（Minimum Viable Product）を作ってみよう」です。

# 前提

Advent Calendar全体のお断りは、[Enterprise hello, world 2018](https://qiita.com/advent-calendar/2018/ehw2018)のサイトを参照ください。

## 想定読者

「Enterprise "hello, world" 2018」的なネタとしては、下記のような状況を想定しています。

> Day1で、移行しなければいけない古いプログラムの様子はつかんだので、移行に向かって仕事を進めなくてはいけない。
> 実現にあたっては、EHW2018の前提によって活動することを心に決めている。

# 仕様

- ユーザのインターフェースに「hello, world」という文字列を表示する

以上となります。では、実装しましょう。

# MVPを作る

## まず書く。

### 前提

OpenJDK 11.0.1を使用します。Windows10 バージョン1803でお送りします。

```
>C:\Java\jdk-11.0.1\bin\java -version
openjdk version "11.0.1" 2018-10-16
OpenJDK Runtime Environment 18.9 (build 11.0.1+13)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.1+13, mixed mode)
```

### 書きます！

```java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("hello, world");
    }
}
```

### 即時実行する(JEP 330)

Java11では、".java"ファイルを直接実行できるのでした。わほー。

```bash
>C:\Java\jdk-11.0.1\bin\java HelloWorld.java
hello, world
```

### コンパイルして実行する(JEP 304)

コンパイルして実行します。JDK11からの実験機能、「GCなしで実行する(EpsilonGC)」で実行してみます。

```
>C:\Java\jdk-11.0.1\bin\java -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC -Xlog:gc  HelloWorld
[0.028s][info][gc] Resizeable heap; starting at 250M, max: 4011M, step: 128M
[0.030s][info][gc] Using TLAB allocation; max: 4096K
[0.033s][info][gc] Elastic TLABs enabled; elasticity: 1.10x
[0.035s][info][gc] Elastic TLABs decay enabled; decay time: 1000ms
[0.036s][info][gc] Using Epsilon
hello, world
[0.325s][info][gc] Total allocated: 881 KB
[0.325s][info][gc] Average allocation rate: 1391734 KB/sec
```

GCなしの実行は、パフォーマンスに振った（例：Log4jのガベージなしへのトライアル）方面のチャレンジの道にトライする面では、興味深いですね。

# まとめ

このエントリでは、「Enterprise "hello, world" 2018 Advent Calendar 2018」(EHW2018)の3日目として、Java11の機能をなるべく使ってhello, worldを書いてみることをトピックとして取り上げました。

EHW2018のネタとしては、このあと、インフラまわりの明日がために向かう見込みです。
AdventCalendar2018 3 WordPress でつくるブログメディアの更新計画を考える

AdventCalenadr2018 3 WordPress でつくるブログメディアの更新計画を考える

はじめに、反省を書いておきます。
1日目と2日目で、AdventCalendar の執筆時間を15~30分で考えていたのですが、時間の確保が不足していました。
今回から45~60分で次は進めていきます。

[カレンダーの投稿2](https://qiita.com/pugiemonn/items/36b36c933666707965cb)で、企画がおぼろげながら見えてきました。

何をするかは固まってきたので、カレンダーの残りの日でどこまでやるのか計画をたててみます。


# 更新計画を決めておく
[カレンダーの投稿1](https://qiita.com/pugiemonn/items/1f70b156a241acf0d29f)では、以下を更新スケジュールとして挙げていました。

>- 企画
- リリース & 実装
- 運用
- マーケティング
- 振り返り

現在、企画は完了としておきます。

## 今後の計画
計画は計画通り進む必要はありませんが、計画があることでプロジェクトの成功率は高まります。
ブログの更新計画をたてましょう。

- [x]  企画
    - [x] 3日目 
        - 全体スケジュール
    - [x] 4日目 
        - 類似サイトの調査
- [x]  リリース & 実装
    - [x]  5日目 
        - ドメイン取得
        - レンタルサーバーの決定
        - WordPress のインストール
    - [x]  6日目
        - WordPress の設定
            - パーマリンク
            - 検索設定
            - ウィジェットの編集
            - ナビゲーションメニューの設定
    - [x]  7日目
        - WordPress 独自テーマの作成
        - テーマを GitHub へ登録
    - [x]  8日目 
        - WordPress プラグインの設定
        - Jetpack
        - セキュリティ
        - キャッシュ
        - 集客
        - アクセス数
        - カスタム投稿タイプ
        - CSV インポート
        - 問い合わせ
- [ ]  マーケティング
    - [x] 9日目
        - GoogleAnalytics
        - GoogleTagManager
        - GoogleSearchConsole
    - [ ] 10日目
        - ソーシャル対応
        - Twitter
        - Facebook
- [ ]  運用
    - [ ] 11日目
        - 記事を投稿しよう
        - 企画に沿った投稿
    - [ ] 12日目
        - 固定ページを使う
    - [ ] 13日目
        - カスタム投稿タイプのコンテンツを考える
        - 企画に沿った投稿
    - [ ] 14日目
        - ユーザー権限について
    - [ ] 15日目
        - SNS への投稿
    - [ ] 16日目
        - GA のデータを見る
    - [ ] 17日目
        - テーマのカスタマイズ
    - [ ] 18日目
        - CV ポイントの設置
    - [ ] 19日目
        - CV の計測設定
    - [ ] 20-21日目
        - CV 向けに出稿
    - [ ] 22-23日目
        - 広告レポートを確認
- [ ] 24-25日
    - 振り返り

こんな感じでいかがでしょうか。

# 最後に
ざっと更新計画を作りました。この通りに進むかは全く不明ですがやってみます(☝ ՞ਊ ՞)
新人のコードレビュー時に意識している事 〜悲しみの連鎖を断ち切りたい〜

#はじめに
多分に宗教の違いもあると思いますので、しがないエンジニアの愚痴・戯言程度に流していただければと思います。

#前置き
今年はいろいろと他人の作ったもの(主にweb)を新たに運用保守する機会が多かったです。
そしてどれも見事なク◯コードだったので、私のような被害者を出さないためにも今後コードをガリガリ書いていくであろう新人の育成には力を入れようと強く心に誓ったのでした(遠い目

そのため本稿では、今年の地獄を経た私が、どのような観点で面倒を見ている新人のコードレビューをしているか書きます。
滅びよ全ての◯ソコード。

主にPHP・JavaScript使ってます。

#観点
主に5つあります。
コメントを書けとかそういうのは大前提なので省略します。

##その1. switchを使え
条件分岐は何でもかんでもif。これはかなり多くて驚きました。
ifだと評価式にどんなものでも入るので、ひと目では規則性・意図が読めません。
実は間のelse ifで評価している変数が1文字違い、意味が違った、なども起こりえます。
switchだと何に対しての評価だというのが一意なので、余計な可能性を考えなくてすみます。

範囲などでswitch(true)を使うのは、個人的には好きですけど、さすがに宗教が過ぎるかなと思って書かせはしません。(見つけたら読めるようにはなってほしいけど)
スコープ区切ってコメント付けて、後から見た人が何の範囲を評価したいのか分かりやすく書けって感じですかね。

```javascript
// こっちよりも
let input = 'apple';
if(input == 'apple'){
  console.log('りんご');
}else if(input == 'orange'){
  console.log('みかん')
}else{
  console.log('果物ではない');
}
```

```javascript
// こっちが良い
let input = 'apple';
switch(input){
  case 'apple':
    console.log('りんご');
    break;
  case 'orange':
    console.log('みかん');
    break;
  default:
    console.log('果物ではない');
    break;
}

```

##その2. 変数の初期化は直前でしろ
人によるかもしれませんが、私の場合はコードは基本的に出力(or レスポンス)から追っかけます。
入力(or リクエスト)がどのように使われているか、を追いかけるより、どのように出力が生成されるか、を追いかけた方が効率的と思っているからです。
極端な話Webだと使ってないリクエストパラメータがあるケースもありますし()
そうなると、意味も無く先頭で初期化された変数は、その先頭からレスポンスまでの広範囲で加工されている可能性のある厄介なものとなります。
switchにも通じるものがありますが、余計な可能性を簡単に無くせるなら無くすべきだと思います。

```javascript
// こっちよりも
let work1 = 'apple';
let work2 = 'orange';
let work3 = 'peach';

if(work1 == 'apple'){
  console.log('りんごがあるよ')
}

if(work2 == 'orange'){
  console.log('みかんがあるよ')
}

if(work3 == 'peach'){
  console.log('ももがあるよ')
}
```
```javascript
// こっちが良い
let work1 = 'apple';
if(work1 == 'apple'){
  console.log('りんごがあるよ')
}

let work2 = 'orange';
if(work2 == 'orange'){
  console.log('みかんがあるよ')
}

let work3 = 'peach';
if(work3 == 'peach'){
  console.log('ももがあるよ')
}
```

##その3. 入力は先頭で格納しろ
上記に矛盾するような気もしますが、inputは先頭で受け取って変数に格納してほしいです。(コマンドのオプション、Webのリクエストパラメータなど)
特にインターフェイスが変わったときが本当にめんどくさいので…
バリデーションや加工も先頭でしてたら分かりやすいですしね。
というか先頭でしない・できない理由ってあまり見たことないので、逆に先頭に統一されてないと何かあるのか？というまた余計な可能性が(ry

##その4. 三項演算子を使え
三項演算子は使い方がおかしいとその分かりにくさたるや凄まじいものがありますが
使い方次第ではとても便利だと思います。
ifでやたら条件を見てはこっちの値、それ以外ならこっちの値、みたいなのがズラーッと列挙されてたら読む気を失います。
ブロックまで含めて5行、三項演算子なら1行で書けます。
こういう、単純に評価式を見て値を切り替えるだけのものはガンガン活用していった方が読みやすいです。

```javascript
// こっちよりも
let input = 'apple';
if(input == 'apple'){
  console.log('りんごがあるよ')
}else{
  console.log('りんごがないよ')
}
```
```javascript
// こっちが良い
let input = 'apple';
console.log((input == 'apple')?'りんごがあるよ':'りんごがないよ');
}
```

##その5. スコープを分けろ
あえて関数化しろではなくスコープを分けろと言います。
関数のメリットは処理の塊を明確にできる事と、処理の再活用だと思っていますが、単に前者だけの目的で使われている(と思われる)関数達をたくさん見かけます。
前者だけなら、無名関数を即時実行するだけで分かりやすいじゃんと思うのです。
※ただし数行の処理に限る
もう意味もなくメインロジックからたらい回しにするのは勘弁してくれさい

このへんをきちんと意識できるようになると、共通化とか拡張性のあるコードの構造とかそのあたりを考えられるようになるのかなと思います。

#あとがき
あくまでもドキュメント・仕様書はたまにある、というレベルのプロジェクトで経験したものを元にしています。
コードもコメントが無いのは当たり前、何を書いてるか分からないコメントですらトリックの推理に使える貴重なピースとなるレベルです。
※もちろん犯人の用意した罠の可能性もある

いつかそんなプロジェクトが滅びてほしいと思いつつ、まずは少しでも周囲のコーディングのクオリティアップのために今後も私なりに種を蒔いていこうと思います。
TclでOOM Killerを召喚

以前、ArmadilloというLinuxが走る組み込みボードでOOM Killerを発動させてみようとしたことがありました。

要するにメモリーを食い潰してやれば良い訳なので、

```tcl
while 1 {append foo bar}
```

をバックグラウンドで実行しつつ、定期的にpsとかfreeとかで監視してみるという方法でめでたく(?)OOM Killerが発動しました。

oom_score_adjをいじってOOM Killerを回避しているはずのサービスが本当に殺されないか、とかの確認に重宝しました。

なんせそのシステム、組み込みボードのくせにBusyBoxのsyslogdのメモリーリークのせいで不定期にシステムダウンしたりしてましたから。
ParaViewのMaskPointsとStream Tracer with Custom Sourceを使った流線の描画

ParaViewで流線を書くときのメモ。

Paraviewで3次元的な流れの流線をStream Tracerで描画すると、High Resolution Line Sourceで描画すると2次元的な流線になり、point sourceにするとポイント周りの流線は書けるがポイントから離れた位置では流線が出ない（ポイントRadiusやたら大きくするという手はある）。

![20181203_fig1.jpg](https://qiita-image-store.s3.amazonaws.com/0/130772/dd7b4d97-dfd8-d950-9b06-466d1db64fb9.jpeg)
Fig.1 High Resolution Line Source

![20181203_fig2.jpg](https://qiita-image-store.s3.amazonaws.com/0/130772/705cde26-f3d9-3a43-15ee-eadbd798c465.jpeg)
Fig.2 Point Source


こういう場合は、流線をStream Tracer with Custom Sourceを使う。

Stream Tracer with Custom Sourceでは流線を描く元データと流線を描画するシードを定義するFilterを選ぶ。FilterとしてSliceを選ぶとSliceした断面から流線が描画される。

![20181203_fig3.jpg](https://qiita-image-store.s3.amazonaws.com/0/130772/ae91df22-d043-586a-261f-995596d6bb89.jpeg)
Fig.3 Stream Tracer with Custom Source

Stream Tracer with Custom Sourceだけだとシード数の調整がうまくできないので、間にMask Pointsフィルターを挟むと、シードの数をMaximum Number of Pointsで調整できる。
フィルタ設定時のPipeline Browserを次に示す。

![20181203_fig4jpg.jpg](https://qiita-image-store.s3.amazonaws.com/0/130772/146b1b38-1499-6aad-fee6-592e794dfef0.jpeg)
Fig.4 フィルタ設定時のPipeline Browser

設定手順は次の通り。

1. Sliceで断面を作る
2. SliceにMask Pointsを設定する
3. Mask PointsのMaximum Number of Pointsを調整する（始めは小さい数にする。デフォルトは5000で描画すると重い）。
![20181203_fig5.jpg](https://qiita-image-store.s3.amazonaws.com/0/130772/675839ff-8957-b82e-25d7-fe52dec02f93.jpeg)
Fig.5 Mask PointsのMaximum Number of Points

4. Mask PointsにStream Tracer with Custom Sourceを適用する。
5. Stream Tracer with Custom SourceのInputに大本のデータを指定し（上の画像ではpost.foam）、Seed SourceにMask Pointsを指定する。

そうすると次の図のようになる。

![20181203_fig4.jpg](https://qiita-image-store.s3.amazonaws.com/0/130772/3e63750d-de3e-107b-153f-4f408b2cb8aa.jpeg)
Fig.6 Mask Points+Stream Tracer with Custom Source

流線のイメージがOKそうならMaximum Number of Pointsの数を増やしていく。この方法なら過剰な流線描画でフリーズする状態を回避できる。
[Swift4.2]UIImageViewに回転アニメーション追加

Activity Indicator がわりに画像を回転させてみました。

意外と簡単にできるんですね。
知らなかった。。。


```ViewController.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        // 背景のグレー
        let grayView = UIView(frame: self.view.frame)
        grayView.backgroundColor = UIColor.gray
        self.view.addSubview(grayView)
        
        // 画像
        let image = UIImage(named: "moon") // 回したい画像
        let imageView = UIImageView(image: image)
        imageView.center = grayView.center
        grayView.addSubview(imageView)
        
        // アニメーション
        let rollingAnimation = CABasicAnimation(keyPath: "transform.rotation")
        rollingAnimation.fromValue = 0
        rollingAnimation.toValue = CGFloat.pi * 2.0
        rollingAnimation.duration = 2.0 // 周期２秒
        rollingAnimation.repeatDuration = CFTimeInterval.infinity // 無限に
        imageView.layer.add(rollingAnimation, forKey: "rollingImage") // アニメーションを追加
        
    }
}

```

処理終わったタイミングで画面を覆っているgrayViewごとremove してやれば良さそうです。

一応、全体のコードはこちらです。
https://github.com/HiroshiOshiro/RollingImageSample
初めてのAtCoder （ABC114）

昨日（12/2），初めてAtCoderでプロコンに参加した．
プログラミングはちょこちょこやっていたが，まじめに勉強し始めてから1週間経たないうちの挑戦だったので緊張．
結果はABの2完1WAで，パフォは732，レートは46（言語はPython3）．
B問題までを8分で解けたのが大きい気がする．
ただ，残りの1時間30分くらいを全て使ってもC問題が解けなかったためめちゃくちゃ悔しい．
まず試してみたのはABSの[白昼夢](https://beta.atcoder.jp/contests/abs/tasks/arc065_a)的な解き方．

```python:main.py
N = input()
counter = 0
 
for i in range(1, int(N)+1):
  a = str(i)
  if '7' in a and a != '':
    a = a.replace('7', '')
    if '3' in a and a != '':
      a = a.replace('3', '')
      if a != '':
        a = a.replace('5', '')
        if a == '':
          counter += 1
print(counter)
```
これは半分ちょいACだったが，幾つかのケースがTLEで弾かれる．
この後は数学的に解こうとしてREを連発しながらコンテスト終了．

ちなみに模範回答はこれ．

```python:main.py
N = int(input())
 
def dfs(s):
  if int(s) > N: 
    return 0
  ret = 1 if all(s.count(c) > 0 for c in '753') else 0
  for c in '753':
    ret += dfs(s+c)
  return ret
 
print(dfs('0'))
```

いわゆる深さ優先探索と呼ばれるアルゴリズム（らしい）．
最初は文字列'0'から初めて，そこに'7'か'5'か'3'を付け足していく．
もし繰り返していく過程で文字列に'7', '5', '3'が全て含まれていればretに1が加算されていく．
最初に回答を見た時にパッと理解できなかったので，まだまだプログラミング（＋アルゴリズム）の知識が足りないなと反省．

次回は3完するぞい．
はじめてのClickUp#2 

#ClickUp概要
[はじめてのClickUp#1](https://qiita.com/uguisu/items/5656efd6c48a85d62489)ではClickUpに登録するまでやったので、次に色々いじってみます。
ClickUpの動画の[On Demand Demo](https://www.youtube.com/watch?v=n3_kvoJgaAg)を参考にしています。

##全体画面
サインインすると、以下のような画面になっているかと思います。
階層構造になっているのがわかります。上位からTeam、SPACES、PROJECTS、LISTS、TASKSという順です。
今回は、これらを作成するところまでやってみたいと思います。
<img width="1680" alt="スクリーンショット 2018-12-03 21.59.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/23911ae3-b217-6f81-dfdd-62a3363270ee.png">


##Team/Me
Teamが階層構造の最上位に位置します。アカウントを意味しており例えば＝会社です。
Meを押すとそのユーザーに割り当てられたタスクのみが表示されます。
(ちなみに前回記事では個人で作成してしまったので、ユーザーを追加しております。Invite more peopleから追加できます)

##SPACES
Teamの一つ下の階層です。動画を見る限り会社でいう部署のイメージのようです。
まずは開発部署を作ってみましょう。"Create Space"をクリックします。
<img width="584" alt="スクリーンショット 2018-12-03 22.21.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/5d5fd54f-3064-f304-cee5-85904c101d1b.png">

SpaceNameは開発とします。
PrivacyはTeamみんながみれるEveryOneを選択します。Privateだと選ばれし者のみ閲覧可能になります。
Task statusesで、その名の通りタスクのステータスを用意します。SimpleだとOpenかClosedのみなので、Customとします。
Task statusesにはデフォルトでテンプレートがあります。今回はCustomを選択してステータスは以下のようにセットします。色は自由に変えられます。
<img width="864" alt="スクリーンショット 2018-12-03 22.33.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/71115dcc-66eb-2446-b658-ab1259e8bd2a.png">

続いてClickAppを全てONにしてCreateします。あとで調節できるようです。
<img width="832" alt="スクリーンショット 2018-12-03 22.35.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/0b9e079b-c4c8-cd7b-16c2-6fd56a44abee.png">

##PROJECTSとLISTS
続いてプロジェクトを作成します。プロジェクトとリストを以下のようにセットします。Statusesは先ほど作成した物を使用します。"Create Project"します。
<img width="841" alt="スクリーンショット 2018-12-03 22.38.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/5a676a55-d2c0-8346-888b-db20d4c70dd4.png">

##TASKS
タスクを作成します。NEWTASKを選択します。
左上の人マークでタスクをアサインできます。試しに自分にアサインしてみます。
その隣はタグ、プライオリティ、期日、繰り返し、所要時間、ウォッチャーをそれぞれ設定できます。Space作った時にonにしたやつですね。
タスク名は「テスト」として、Build1.0.1リストにタスクを割り当てます。Descriptionを適当に書きます。Taskの下にさらにSubTaskを設定できるようですので、２つつくっておきます。チェックリストも試しに作ってみます。Attachmentに画像を添付してみて、"CREATE TASK"をクリックします。
<img width="772" alt="スクリーンショット 2018-12-03 23.19.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/34423c91-6624-91c0-0005-32d4dc58b7a5.png">

タスクが作成されました。
<img width="1352" alt="スクリーンショット 2018-12-03 23.23.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/681e9c54-c571-78f8-d365-2909a26214d1.png">

#終わりに
今回#２ではTeam、SPACES、PROJECTS、LISTS、TASKSを作成しました。
次回も引き続きClickUpをいじってみます。
Firebaseで爆速アプリリリースできたお話

#はじめに

今年2018年は、災害の多い年でした。
被害にあわれた方には、お見舞い申し上げます。


この記事は、2018年７月の西日本豪雨を受け、IT関係の自分にも何か役に立てる事はないかと考え、地図アプリを2日で開発、3日目には公開したお話です。
爆速で開発、リリースまでできたのは、Firebaseのおかげです。

Firebaseのサービスを、どういった理由で選択し、どういったシーンで利用したか、そんな事をこの記事では書かせてもらおうと思います。

# 開発要件とFirebase選択
アプリのコンセプトは平凡なもので、地図アプリに情報集約して役立ててもらおうというもの。
アプリ要件として必要だったものと、状況的に必要だったものが下記。

 |  | Firebaseにあるよ
--- + --- + ---
1 | データベース的なものが必要 | Firebase.Firestore
2 | 写真ストレージが必要 | Firebase.Storage
3 | アプリの公開 | Firebase.Hosting

　　＋

4. とにかく早くリリースしたい！しかも開発は１人
    * フロントとバックエンドと分けて開発する方法だと、開発に時間がかかってしまう
        * Firebaseには色々な言語のSDKが用意されていて、
        * それらを利用する事で、わざわざバックエンドを用意する必要がない！
![Firebase.png](https://qiita-image-store.s3.amazonaws.com/0/259334/837aa3b4-fc69-24d3-52df-c2c03a1894bb.png)
    * アプリとなると、iPhoneとAndroid。。。
        * アプリ開発未経験。両方覚える暇はない
        * PWAがあるじゃない！
        * IONICを使う事で解決！
5. 費用面もできる限り抑えたい
    * [Firebaseの料金体系](https://firebase.google.com/pricing/?hl=ja)がとても魅力的
    * 無料枠であるSparkでも結構な事ができる
    * 今回のアプリではGoogle Mapの利用の関係で、Blazeプラン（従量制）を利用しました。


        > Free usage from Spark plan included

        従量制ですが、上記記述通り無料枠分が含まれます。



# いざ開発

※今回は、Ionicを使いました。Ionicを使っての開発については今回の記事では端折ります。
　IonicはAngularベースのフレームワーク。
　Firebaseを利用する際は、[AngularFire2](https://github.com/angular/angularfire2)を利用しました。

## Firebase.Authenticationを導入する
今回のアプリは、誰でも登録ができて、誰でも見ることができるというもの。
しかしながら、本当に**誰でも**できていいのか、気になってきた。
例えば、悪意ある使い方をされた時が心配になってきたわけです。

FirebaseのSlackで質問させていただき、以下の助言をいただきました。
> Anonymousログインで認証させてAnonymousの場合は登録できる件数を絞るとかですかね

と言うわけで、Firebase.Authenticationの匿名ユーザを追加導入！

1. アプリ起動時に、匿名ユーザにてログインを行う（アプリ側で対処）
2. Firestoreのルールに、ログインされていたら読み書き可となるよう設定（Firebaseコンソールにて設定）


# Firebase.Hostingでアプリのリリース！
さて、随分と開発工程のお話をすっ飛ばしてますが、
フロントをIonicで開発し、Firebaseへ登録したり、登録した内容を読み込んだりといったことができるようになりました。

と言うわけで、**アプリ**をリリースします！
といっても、アプリの審査だなんだといった事を通している時間はありません。
でも大丈夫。今回はPWA...Webなのです。
Firebase.HostingにWebとして公開すればよいのです！

![みんなで地図__minnanochizu_さん___Twitter.png](https://qiita-image-store.s3.amazonaws.com/0/259334/acc62c90-03b7-8baa-f4a9-2afbc96a7fef.png)

[みんなで地図](https://mchizu.tabiji.life/)
※Firebaseのドメインで公開する場合、「***.firebaseapp.com」といった感じのURLになります。

# まとめ

## ２日で開発、３日めにはアプリリリースができた

必要最低の機能に絞っての公開。
あれもこれもできない状態ですが、それよりもスピードを重視。
初回リリースまでは、１日徹夜して、2日で開発、３日めにはリリースできました。

## 利用したFirebaseのサービス（最終結果）

おまけとして、アプリ開発・運営に寄付いただける仕組みを[Stripe.Checkout](https://stripe.com/payments/checkout)で作りました。、
Stripeから受け取ったトークンをクライアント側に返却する事なく、安全に処理させるため、
Firebase.Functionsで処理を行うようにしました。
※Firebase.Functionsでは、データベーストリガーのようなものや、APIのようなものを用意することができます。

というわけで、最終的にこれだけのサービスを利用する結果となりました

* Firestore
* Storage
* Hosting
* Authentication
* Functions


## 来年は災害のない１年となりますように

そして、このアプリですが、結果としてあまり活躍はしませんでした。
そちらについては色々と反省する点はありますが、アプリとしてはこのまましばらく公開しようと思っています。
使えるようでしたら、お使いください。
vue/require-valid-default-propはbindまでみてない

自分の理解度のせいなんですがね・・・・。

> error  Type of the default value for 'post' prop must be a function  vue/require-valid-default-prop

templateでbindしてるにも関わらず、上のエラーメッセージがでるので直書きしてました。
デフォルト値は設定してるやんけ！とおもってました。

よくよく調べてみると、単にpropのほうにdefaultを設定せよというエラーメッセージと言うことが判明。

# プロパティ系のドキュメント
- https://jp.vuejs.org/v2/guide/components-props.html#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%AE%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3
- https://jp.vuejs.org/v2/guide/components-props.html#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%AE%E5%8F%97%E3%81%91%E6%B8%A1%E3%81%97
Kotlinでメソッドチェーンするための実装

この記事は、ACCESS Advent Calendar 2018 4日目の記事です。

# はじめに

thisを返す関数の実装方法についてです。

Builderパターンにおいてメソッドチェーンをよく使いますが、Kotlinには [Default arguments](https://kotlinlang.org/docs/reference/functions.html#default-arguments) があるため、BuilderパターンもKotlinではあまり使うことはないかなと思っていました。

が、

* [Kotlin Fest 2018でのあんざいゆきさんのスライドでの例](https://speakerdeck.com/yanzm/kotlinfest?slide=14) のように、Builderパターンが有効なケースもある
* テストコードでメソッドチェーンを使うことは多い

ということで、
最近試した、メソッドチェーンのためにthisを返す関数の実装方法を紹介します。

# 普通にやると

```kotlin
val neko: Neko = Neko().foo().bar()

class Neko {
    fun foo(): Neko {
        // do something
        return this
    }
    fun bar(): Neko {
        // do something
        return this
    }
}
```

上記のように、戻り値の型を明記したり `return this` を書くのは、ちょっと冗長です。

# `apply()` を expression body として使う

```kotlin
val neko: Neko = Neko().foo().bar()

class Neko {
    fun foo() = apply {
        // do something
    }
    fun bar() = apply {
        // do something
    }
}
```
かなりシンプルになりました。

# 継承して使うには、もう一工夫

`apply` を使っても戻り値の型は `Neko` なので、Self-typeのようには使えず、
継承して使いたいときには困ったりもします。

```kotlin
class MikeNeko : Neko() {
    fun baz() = apply {
        // do something
    }
}

// Compile Error: barの戻り値はMikeNekoではなくNekoであるため。
val tama = MikeNeko().foo().bar().baz()
```

こういう場合は、拡張関数を使うと、なんとかなります。

```kotlin
open class Neko

fun <T : Neko> T.foo() = apply {
    // Nekoを継承したクラスに対してなにか処理してそのインスタンス自体を返す
}
```

こんなに頑張ってまで、継承を使って一体何を実現するのかという気もしますが、1つのやり方として。

---


明日の ACCESS Advent Calendar 2018 は @kenrota です。
circleciのAPIを使って別リポジトリのビルドを実行する

# 目的

- jobの中で別のリポジトリのビルドを実行したい
- 実行した別のリポジトリのビルドの完了まで待機し成功・失敗を判定して次のstepへ進むかどうかを制御したい

# どんなとき？

- e2eテスト専用のリポジトリといくつかのマイクロサービスからなるアプリケーションのコード用のリポジトリがあり，いずれかのアプリケーションのリポジトリがpushされるとそこからe2eテストを実行する等

# 環境設定

- `A` をjobを実行する側のリポジトリ
- `B` をjobを実行される側のリポジトリとします

## API Permissions からトークンを作成する

- ダッシュボードから `B` のリポジトリの settingsの `API Permissions` -> `Create Token` ボタンからトークンを払い出します
<img width="1255" alt="スクリーンショット 2018-12-03 22.34.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/248262/d70b4838-6885-cddb-9512-2416158de500.png">

## 払い出したトークンをAリポジトリの環境変数へ登録する

- ダッシュボードから `A` のリポジトリの settingsの `Environment Variables` -> `Add Variable` ボタンから先ほど払い出したトークンを環境変数として登録します
  - 今回は例として `B_REPO_TOKEN` としました
- こうすることでトークンを `.circleci/config.yml` へハードコードせずに済みます
<img width="1259" alt="スクリーンショット 2018-12-03 22.39.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/248262/5ddef114-140c-e365-7492-0ddb438f9a3a.png">

# jobの設定

- `A` リポジトリの `.circleci/config.yml` を書いていきます

```bash:.circleci/config.yml
steps:
  - checkout
  - run:
      name: install jq
      command: |
        # APIのレスポンスを解析するためにjqがあったほうがいいです
        apk add --no-cache --update jq 
  - run:
      command: |
        base_path='https://circleci.com/api/v1.1/project/<ここに:vcs-type>/<ここは:username>/<ここに:project>'
        target_branch='ここにBリポジトリのビルド対象になるブランチ名（大体はmasterが一般的でしょう）'
        # Bリポジトリのビルドを実行
        build_num=$(wget --header='Accept: application/json' --post-data='' \
          "${base_path}/tree/${target_branch}?circle-token=${B_REPO_TOKEN}" -O - 2>/dev/null | jq -r -e '.build_num')

　　　　　　　　　　　　　　　　# 特定のjobのみを実行したい場合は build_parameters[CIRCLE_JOB] を指定します
        # build_num=$(wget --header='Accept: application/json' --post-data='build_parameters[CIRCLE_JOB]=実行したいjob名' \
        #  "${base_path}/tree/${target_branch}?circle-token=${B_REPO_TOKEN}" -O - 2>/dev/null | jq -r -e '.build_num')

        if [ "$build_num" = "" ]; then
          exit 1
        fi

        # ビルド実行APIはリクエストするとすぐレスポンスが返ってくる非同期なものなのでビルドの状況をポーリングして完了するまで待機
        # ループの数はお好みで
        for i in `seq 1 10`; do
          echo "[Try ${i}] Waiting for build: ${base_path}/${build_num}"

          response=$(wget --header='Accept: application/json' "${base_path}/${build_num}?circle-token=${B_REPO_TOKEN}" -O - 2>/dev/null)
          if [ "`echo "$response" | jq -r -e '.lifecycle'`" = "finished" ]; then
            if [ "`echo "$response" | jq -r -e '.status'`" = "success" ]; then
              # ビルドが正常完了したので次のstepに進ませます
              exit 0
            fi

            break
          fi

          if [ $i -eq 1 ]; then
            # ある程度ビルドに時間がかかるようであれば1回目の待機は長い秒数にしておくとAPIの問い合わせ回数が減らせてよいでしょう
            sleep 120
          else
            sleep 15
          fi
        done

        # 終了ステータスを1以外にすることで次のstepに進ませないようにします
        exit 1
  - run:
      name: after B repo build
      command: |
        echo 'Bリポジトリのビルドが正常に完了したのでそのあとに何かやりたい処理．．．'
```

# まとめ

ビルドの実行から待機までを別のシェルファイルに切り出して共通化しておくと保守性が高まると思います．

API経由でビルド実行を柔軟に操作できればさまざまシチュエーションで活用できそうですね．
Dockerコンテナにexecする際にthe input device is not a TTYが出た時

### 環境
OS：Windows10（Docker for Windows）
ターミナルエミュレーター：Mintty（Git Bash）

### 内容
Dockerコンテナ内に入ろうと「docker exec・・・」コマンドを打ったら、以下のようなエラーが出ました。

```打ったコマンド
docker exec -it my-container bash
```

```発生したエラー
the input device is not a TTY.  If you are using mintty, try prefixing the command with 'winpty'
``` 

標準入力がTTYじゃないです。Minttyを使っているならコマンドの先頭に「winpty」を付けて再実行してください、とのこと。「環境」にも記載しましたが、当方コマンドを入力する時はGit Bashを利用しており、それが原因でした（Git BashのデフォルトエミュレーターはMintty）。なので、エラーメッセージに記載のある通り

```
winpty docker exec -it my-container bash
```

でイケました。ちなみに、Windows標準コマンドプロンプトでは「winpty」を付けなくてもイケます。

以上です。

## 参考
https://opcdiary.net/?page_id=27065
https://willi.am/blog/2016/08/08/docker-for-windows-interactive-sessions-in-mintty-git-bash/
Site24x7 を使ってDNS監視をしてみる

# Site24x7 を使ってDNS監視をしてみる

[Site24x7](https://www.site24x7.com/) についてはアドベントカレンダーの前の方が書いてるので、割愛します（手抜き・・・）
今回は Site24x7 の機能の１つ、DNSの監視についてやってみたいと思います。
何ができるのやら・・・

## DNS監視を追加する

### 1.Site24x7 にログインした後、メニューの `監視` をクリックします。

![247_001.png](https://qiita-image-store.s3.amazonaws.com/0/318450/2f1d6911-8319-fd72-79a3-db2407b316b0.png)

### 2.`監視の追加` をクリックします。

![247_002.png](https://qiita-image-store.s3.amazonaws.com/0/318450/a56cb3e9-4c5f-bdbc-0e0b-4b6e11ab392c.png)

### 3.`DNS監視`をクリックします。

![247_003.png](https://qiita-image-store.s3.amazonaws.com/0/318450/e807fd9c-46a0-bb3c-62a7-350d84684537.png)

### 4.設定を埋めてみます。

![247_004.png](https://qiita-image-store.s3.amazonaws.com/0/318450/c564167d-e56d-82d5-3e61-e8e460a7c635.png)

最低限下記を埋めれば動きます。

表示名： 適当な名前を設定しましょう。
DNSサーバー：　ご自分のドメインが設定されているDNSサーバを入れましょう（ex. ben.ns.cloudflare.com）
照会名：　ドメイン名を入れます。

これで、`保存` を押せばとりあえずの設定はできます。

`保存` ・ `キャンセル` が下と右上についてるのは面白いですね。

### 5.追加の監視設定が推奨される！？

なんか、追加のおすすめ監視設定が出てきました。

![247_006.png](https://qiita-image-store.s3.amazonaws.com/0/318450/a648a42d-f4af-530f-df17-8e2389af1052.png)

ついでなんで、`選択したリソースの監視` を押して追加しちゃいましょう。
ちょっと日本語が変なのはご愛敬ですかね・・・

### 6.追加される監視リストが出ます。

![247_007.png](https://qiita-image-store.s3.amazonaws.com/0/318450/435ccbd7-ce02-9f7f-b1d7-c495436f28b0.png)

`閉じる`を押します。

### 7.追加された監視リストが出ます。

![247_008.png](https://qiita-image-store.s3.amazonaws.com/0/318450/70cf5296-01a4-231d-6cb1-101597d471e7.png)

SMTPが３つ監視できないと出たのですが、`公式登録された・・・`というのが理由のようですが、いまいち基準がわからないですね。

`閉じる`を押します。

### 8.監視状況の画面が出ます。

![247_009.png](https://qiita-image-store.s3.amazonaws.com/0/318450/49a16e3a-8aeb-93bc-27b9-6c4d86dd91be.png)

おおーすげー

上の方の４つの〇が監視ステータスをわかりやすく表しています。
`ダウン` `アップ` `トラブル` `メンテナンス` の四種類あります。
今は全部OKなので、`アップ`が`９`になってますね。

下側には、各監視項目がパフォーマンスなどとともに一覧で出ています。

今は、プロプランの1か月お試しでやっているので、

`ベーシック監視`：`２００`
`アドバンス監視`：`５０`

になっていますが、結構すぐになくなってしまいそうな気もしますね。。。

## DNS監視の詳細

DNS名のとこをポチっと押すと、DNS監視の詳細画面にいきます。

![Site24x7_101.png](https://qiita-image-store.s3.amazonaws.com/0/318450/71b2a77c-f555-4600-3767-4209cbb73b16.png)

DNS監視の状況が詳細に出ています。

面白いのは、`ロケーションごとの可用性と応答時間` ですね。
上の３つは１桁台の応答時間ですが、下の３つは２桁台になっています。
cloudflare の DNS がどのあたりにあるのかなーと想像を膨らませることができます。

## まとめ

結構お手軽に監視項目の設定できますね。
ポチポチっとするだけで、簡単にDNSの監視できてしまいます（他の項目も・・・）
メンテナンスというステータスがあったのですが、どうステータスを取ってるのかは気になりますね。
色々といじってみたいと思います。

※2018/12/04 追記しました。
はじめてのゔぃむすくりぷと

## はじめに

VimConf 2018最高でしたね。
テンションが上がりすぎて、この感動を共有しないわけにはいかないと英語でまとめを書いてしまったので、アドカレのネタがVimConf記事から変更になりました。
Vim歴10ヶ月の若輩者ですが、どうぞよろしくお願いします。

## 写経

きっかけはVimConf2018のAlisueさんのセッションでした。
[Effective Modern Vim scripting](https://docs.google.com/presentation/d/e/2PACX-1vQKaWJY8w6QJpebvuzg334RfLDbQHv4-J_06yFxdTzLrrjhE_y5iuzA-JxCCuFdUAZQB2QQsidF_mys/pub?start=false&loop=false&delayms=3000&slide=id.p)

Modernとか、そういう言葉に弱いです。
最高のVim Script Tutorialな気配がしたのとDark Vimmerへの道を踏み出すために写経しました。

以下、写経して思ったこと

- autoload配下のpathと関数名が対応してる規約面白い
- source guardや`function!`など何のために必要なのか調査しないと分からないイディオムが多い
- Vital.vim、めっちゃ便利
- 公式のplugin manager、欲しすぎる
- Vim script、思った以上にモダンに書ける
- Vim script、pythonっぽさを感じる
- Promise、デバッグが難しい

## ゔぃむすくりぷつ

### FizzBuzz

定番です。~~これ以上のネタを思いつかなかった。~~

```vim
function! amake#fizzbuzz() abort
  for i in range(1, 100)
    call s:judge_fizzbuzz(i)
  endfor
endfunction

function! s:judge_fizzbuzz(i) abort
    if a:i % 15 == 0
      echo "FizzBuzz"
    elseif a:i % 3 == 0
      echo "Fizz"
    elseif a:i % 5 == 0
      echo "Buzz"
    else
      echo a:i
    endif
endfunction
```

### Linter

普段は[ALE](https://github.com/w0rp/ale)に任してしまっています。せっかくの機会なので、Linterをamakeの写経に足していく形で実装しました。
JS限定で`:w`するたびにエラーをQuickFixに出してくれます。
[こちら](http://kannokanno.hatenablog.com/entry/20120723/1343147069)を参考に実装。

- `autoload/amake.vim`

```vim
function! amake#eslint()
  let result = split(system('yarn eslint ' . bufname("")), '\n')
  let errors = []
  for r in result
    if r =~ '\<error\>' && r !~ 'Command failed with exit code'
      let info = { 'filename': bufname("") }
      let splited_error_line = split(r, 'error')
      let lnum_col = split(splited_error_line[0], ':')
      let info.lnum = trim(lnum_col[0])
      let info.col = trim(lnum_col[1])
      let info.text = trim(splited_error_line[1])
      call add(errors, info)
    endif
  endfor
  call setqflist(errors, 'r')
  cwindow
  silent! doautocmd QuickFixCmdPost make
endfunction

autocmd! BufWritePost *.js :call amake#eslint()
```

![Peek 2018-12-04 21-15.gif](https://qiita-image-store.s3.amazonaws.com/0/125675/1e5c435a-efa7-593d-ff08-30e2b62d0c45.gif)

ErrorだけでWarningが拾えてないとか同期処理なのででかいファイルをlintするとしばらく固まるとかまだまだな部分は多いですが、一応、動くものになりました。

`:h <something>`が早い上に、分かりやすいというのは衝撃的な事実でした。

普段は、詰まったらGitHubのドキュメント->ダメならissueなりstackoverflowなりを漁るので、公式のヘルプが丁寧かつ分かりやすく書いてあるのは最高かな？と思いました。
やはり、Vimは最高だった。

レポジトリです。
https://github.com/sasurau4/vim-amake

## 最後に

本当は、BufferとかText Editorっぽいものを盛り込んで自作プラギンを作りたかったんですが、
Vim力と愛が足りませんでした。でも、quickfix使えたので満足しました。
Dark Vimmerになるために精進します。
8946 Take#48

#問題

http://www.hackerschool.jp/hack/take48.php?no=dXduc3kgNDg7

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/b1810c12-1501-8902-fc69-66421e0492b8.png)

#解いてみた

- get_pass()関数をうまく呼び出して戻り値をgetしましょうという問題ですね。
- とりあえずソースを見てもいいんですが、どう考えてもURLがいつもと違います。
- dXduc3kgNDg7って何でしょう？後ろに=あれば大体base64と思ってもいいんですが、これにはありません。
- でもbase64の最後に=がない場合もあるので、一応やっておきましょう。
- CyberChef https://gchq.github.io/CyberChef/ 使います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/cbb3a220-a301-9d8f-c4cc-8db4397962fd.png)

- よくわかりませんが、半分くらいあってそう。最初はこれで複合しておいて、さらになんか複合が必要そうです。
- 48って何？
- 47に変更してbase64してみるか。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/ab8fea0d-7b72-b968-3bc5-5bae80c529a1.png)

- で、これをURLのパラメータに変えて、アクセスしてみる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/def4cc10-d2d9-e994-4774-8af3a07d7a3c.png)

- おー。
- 48は問題番号だったのか。まったく気づかなかった。
- ということはget_pass()を呼び出す処理を書いて、それをbase64したらいいっぽい。
- 48を47にして47と素直に表示してもらいたいところですが、何か入力チェックはしているということでしょう。
- その前に「uwnsy 48;」の「uwnsy」ってなんでしょう。
- PHPの文字表示方法と言えばechoかprint。文字数的にprintですかね。
- よく見るとprintをそれぞれ5文字ずらすとuwnsyということに気づいた。48はそのままだったから英字のみずらすのか？
- では「print get_pass();」をそれぞれ5文字ずらすと「uwnsy ljy_ufxx();」です。
- これをさらにbase64します。「dXduc3kgbGp5X3VmeHgoKTs=」です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/0056fa4a-b194-ad67-ac5d-aae2f6957396.png)

- 答えは5e7B4AD96Bです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/2f2f14d7-d19b-d0c5-0f1e-2f248a97eb97.png)
Xamarin.Androidで設定画面のアイコンが表示されない場合の対処方法

# 環境

* Windows
  * Windows 10 Pro
  * Visual Studio 2017 Community (Ver15.9.3)
* Android端末（実機）
  * Nexus 5X (Android Ver8.1.0)

# 現象

作成中のアプリがあるのですが、設定の「アプリと通知」からアプリを確認すると、アイコンが表示されていません。
（これ以外の場所では期待通りに表示されています）

![01.png](https://qiita-image-store.s3.amazonaws.com/0/203323/3c7dd30e-9728-a09d-e3cb-cb698d149f2b.png)

# 対処方法

`AndroidManifest.xml`にアイコン情報を追加します。

## 変更前（抜粋）

```xml:AndroidManifest.xml
<application android:label="アプリ名">
```

## 変更後（抜粋）

```xml:AndroidManifest.xml
<application android:label="アプリ名" android:icon="@mipmap/ic_launcher">
```

# 補足

Visual Studioで作成した直後のプロジェクトだと、設定画面でも問題なくアイコンが表示されていました。

![02.png](https://qiita-image-store.s3.amazonaws.com/0/203323/500b11e3-465f-39e1-2deb-820f2dd4eca4.png)

なんらかの変更で設定画面のアイコンが表示されなくなったのでしょうか……。

* アイコンをオリジナルに変更したとき
  * アイコンの名前？
  * 変更の仕方が悪かった？
* なんらかのプロジェクト設定を変更したとき

参考になれば幸いです。
Java9,10,11の新機能

#はじめに
どうも@chan_kakuです！
今回はそろそろJava8からJava11に移行しようかなーと言う人のためにJava9から11で追加されたAPI、機能について説明させていただきます。

## Java9
Java9の新機能については[こちら](https://openjdk.java.net/projects/jdk9/)を参考にしてください
### モジュールシステム
Java9ではProject Jigsawと呼ばれるプロジェクトがありました。
詳細は以下のリンク先にあります
[Project Jigsawについて](http://openjdk.java.net/projects/jigsaw/)
つまり、以下の4点がこのプロジェクトのゴールでした
>Make it easier for developers to construct and maintain libraries
and large applications

ライブラリや大規模アプリケーションのメンテナンスを容易にする
>Improve the security and maintainability of Java SE Platform Implementations in general, and the JDK in particular

Java SEプラットフォームのセキュリティと保守性の向上

>Enable improved application performance

アプリケーションパフォーマンスの向上

>Enable the Java SE Platform, and the JDK, to scale down for use in small computing devices and dense cloud deployments.

Java SEプラットフォームとJDKを低い性能のコンピューティングデバイスや密集したクラウド展開で使用できるように縮小できる

これらを解決するために、Java9ではモジュールシステムが導入されました。

モジュールシステムについては[この辺り](https://www.oracle.com/webfolder/technetwork/jp/javamagazine/Java-SO17-Modules.pdf)で詳しく説明されています

つまり、別のモジュール(ライブラリ)のpublic,protectedメンバーを使う時、または、別モジュールのためにpublic,protectedメンバーを使わせるときはmodule-info.javaと言うファイルを用意する必要があります。
このモジュールシステムによってモジュールの依存関係や、階層構造を以前に増して理解しやすくなります。

## Java10
Java10の新機能は[こちら](http://openjdk.java.net/projects/jdk/10/)にまとまっています。
個人的に気になった機能をピックアップしていきます

### 型推論
>JEP 286: Local-Variable Type Inference

これはつまりローカル変数の型推論機能です

```java:sample.java
var list = new ArrayList<String>();  // infers ArrayList<String>
var stream = list.stream();          // infers Stream<String>
```
Javaでは何でもかんでもこのvarを使ってしまうと型がよくわからなくなってしまうので、そこまで頻繁に使うような印象はないですが、上記のように右側に型が明記してある場合には使えるのではないでしょうか？

## Java11
例のごとくJava11の新機能は[こちら](https://openjdk.java.net/projects/jdk/11/)にまとまっています
この中からいくつかピックアップしたいと思います。

### ネストクラスのアクセス制限

>JEP 181: Nest-Based Access Control

ここではネストメイトのプライベートアクセスをJVMのアクセスルールとして制限すると記述されています。
ちなみにここで出てきたネストメイトとは以下のように定義されています

>A field or method R is accessible to a class or interface D if and only if any
of thefollowing conditions are true:
・R is private and is declared in a different class or interface C, and C and D, are nestmates.

これは使う側としては変わりはないのですが、バイトコードにすると今までよくわからないようなメソッドを読んでいたものちゃんと意図したものにようやくなった
というような感じです

### HTTPクライアント

>JEP 321: HTTP Client (Standard)

こちらはModanAPiやHTTP2,WebSocket,Reactiveに対応したと言うものです

### 型推論
> JEP 323: Local-Variable Syntax for Lambda Parameters

こちらはJava10の説明でもあった型推論がラムダ式のパラメータとしても使えるようになったと言うものです。


# 最後に
Java9~11で様々なfeatureが追加されましたが、個人的にはここで紹介したあたりを押さえておけばひとまずは大丈夫かなという印象です。
他にもこのfeatureは知っておかないとなどあればコメントいただけると助かります！
氾濫するAI用語を整理する

# 当記事について
氾濫するAI用語を整理する。
分類の仕方は人それぞれなので、当記事では自分が納得いくように分類する。
※ 理解が深まるごとに、編集していきます。

# 人工知能、機械学習、深層学習の関係
> 並列関係と間違われがちだが、これらには**包含関係**がある。

- **人工知能 (AI: Artificial Intelligence)**
    - 人間の知的活動をコンピュータで模したソフトウェア、その学問
- **機械学習 (ML: Machine Learning)**
    - 人間の学習を機械が再現すること
- **深層学習 (Deep Learning)**
    - 人間の脳のニューロン(神経細胞)が行う情報処理の仕組みをソフトウェアで再現した機械学習の手法の一つ

![AI_ML_DeepLearning.png](https://qiita-image-store.s3.amazonaws.com/0/215954/c7aa69ca-04e7-a335-3558-3968d02e33a3.png)


# AIの分類
> ジョン・サールという哲学者が、**強いAI**と**弱いAI**という分け方を提唱している。
> 現時点では、ドラえもんやアトムのような**強いAI**は実現していないとされる。

- **強いAI (Strong AI)**
    - 幅広い知識を持つ
    - 自意識を持つ
    - 人間と同等の汎用的な知的処理を行う
    - 人間の思考プロセスそのものを再現する
- **弱いAI (Weak AI)**
    - 知識は限定的
    - 自意識は持たない
    - 人間の知的処理の一部を再現する
    - 人間と思考プロセスは違えど、結果として人間の知的処理と同じ結果を実現する

![strongAI_weakAI.png](https://qiita-image-store.s3.amazonaws.com/0/215954/94ef2d9a-e790-0a34-0acd-6ec031528a5b.png)

# 機械学習の手法 - 学習データ別
> 教師あり学習etc.と深層学習etc.を横並びにするのには違和感があるので、分けて列挙する。

- **教師あり学習 (Supervised Learning)**
    - 学習データに対して、正解ラベルを持つ
- **教師なし学習 (Unｓupervised Learning)**
    - 学習データに対して、正解ラベルを持たない
- **半教師あり学習 (Semi-supervised Learning)**
    - 正解ラベルを持つ学習データと持たない学習データを用いる
- **転移学習 (Semi-supervised Learning)**
    - 既に学習したモデルを他の領域に利用する
- **強化学習 (Reinforcement Learning)**
    - 将来的な報酬を最大化するために思考錯誤しながら学習していく

**教師あり学習 (Supervised Learning)**
![kind_of_ML_Supervised_Learning.png](https://qiita-image-store.s3.amazonaws.com/0/215954/2d037136-0fc8-7302-4080-6a2ccff68b72.png)

**教師なし学習 (Unsupervised Learning)**
![kind_of_ML_Unsupervised_Learning.png](https://qiita-image-store.s3.amazonaws.com/0/215954/1f132487-0a52-80ce-0788-a75138c9f006.png)

**半教師あり学習 (Semi-supervised Learning)**
![kind_of_ML_Semi-supervised_Learning.png](https://qiita-image-store.s3.amazonaws.com/0/215954/c2192cb9-8237-3d53-91f5-474d0fde6a96.png)

**転移学習 (Transfer Learning)**
![kind_of_ML_Transfer_Learning.png](https://qiita-image-store.s3.amazonaws.com/0/215954/132a4206-3a19-7ab0-f8ae-1058a9916f2e.png)

↑すみません、間違ってます。

**強化学習 (Reinforcement Learning)**
![kind_of_ML_Reinforcement_Learning.png](https://qiita-image-store.s3.amazonaws.com/0/215954/b1104460-01ac-0b9a-36ff-59621de2053a.png)

# 機械学習の手法 - 学習プロセス別
> 深層学習は上記の手法と組み合わせられる。**深層学習=機械学習の賢いver.**と考えるようにした。

- **ニューラルネットワーク**
    - 人間の脳のニューロン(神経細胞)が行う情報処理の仕組みをソフトウェアで再現したもの
- **深層学習 (Deep Learning)**
    - ４層以上の層からなるニューラルネットワークで学習する

**ニューラルネットワーク**
![Nural_Network.png](https://qiita-image-store.s3.amazonaws.com/0/215954/864e4bac-5813-c650-8161-c7655c4ea210.png)

**深層学習 (Deep Learning)**
![Deep_Learning.png](https://qiita-image-store.s3.amazonaws.com/0/215954/dfcad106-f879-3961-65d0-a710c290c2da.png)

# 使用ツール
- 図の描画
    - 素晴らしき、[draw.io](https://www.draw.io/)。