OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel5.8】複数のデータベースに接続するときは全てのモデルに`$connection`を書こう

先日の[Eagerロード先テーブルは必ず主キーもSELECTしないといけない](https://qiita.com/rana_kualu/items/03087d60efd016fb8c4a)って記事を見るとわかりますが、Eagerロードでは複数テーブルを結合するのにJOINを使わず、データを別々に取ってきて後から合体させています。

つまり、これは異なるデータベースのテーブルに疑似リレーションを張れるのでは？

```php:テーブルA
class TableA extends Model{
    // テーブル名
    protected $table = 'table_a';

    /**
     * リレーション
     * @return BelongsTo
     */
    public function tableb()
    {
        return $this->belongsTo(TableB::class, 'b_id', 'id');
    }
}
```

```php:別DBのテーブルB
class TableB extends Model{
    // データベースがちがう
    protected $connection = 'other_database';

    // テーブル名
    protected $table = 'table_b';

    /**
     * リレーション
     * @return BelongsTo
     */
    public function tablea()
    {
        return $this->belongsTo(TableA::class, 'a_id', 'id');
    }
}
```

コントローラから呼び出す。

```php:コントローラ
    $columnsAB = TableA->with('table_b')->get();
    $columnsBA = TableB->with('table_a')->get();
```

さて、この動作はどうなるでしょうか？


答えは、`$columnsAB`は想定通りに取得できる、`$columnsBA`は取得できない、です。
わかりづら！

どうしてこんなことになるのでしょうか。

TableA→TableBの順で呼んだ場合、まずデフォルトのDBからTableAを呼び、次いでTableBを見に行った時点でDBが'other_database'に切り替わるのでTableBのデータも正常に取得できる、ということになります。

逆にTableB→TableAの順で呼んだ場合、TableBを見に行った時点でDBが'other_database'に切り替わってTableBのデータを正常に取得し、次いでTableAを見に行きますがDBは'other_database'のままでありTableAが読めない、となります。

原因はTableAに`$connection`が書かれていないせいです。
普段`$connection`を書いてないときは暗黙的に`default`が選ばれるので、何も書かずとも問題なく動作します。
しかし一度でも別のデータベースが選ばれると、その後は`$connection`を書かないかぎりそのDBが選ばれ続けてしまうみたいです。

# まとめ

複数のデータベースに接続する可能性があるときは、デフォルト接続先にも必ず`$connection`を書いておくと安全かもしれない。
Google Search Filter を使ってGoogleの検索結果からスパムサイトを排除する

### やりたいこと
最近google検索をすると、stack overflow の雑な翻訳だけを載せただけの中華(?)サイトが検索上位に散見されるので、まとめて検索結果から排除したい


###使うもの
https://chrome.google.com/webstore/detail/google-search-filter/eidhkmnbiahhgbgpjpiimdogfidfikgf


###使い方
①Googleの検索結果ページで拡張機能のアイコンをクリックする
②初回起動時は名前を入力する必要があるので、適当な名前を入力
③表示されたFilter入力画面に下記みたいな感じで排除したいドメインを入力しセーブ

```python
# SPAM - never show these results
codeday.me
stackoverrun.com
code.i-harness.com
www.voidcc.com
```

### 検索結果に平穏が訪れる
やったー
CentOS7/8 Red Hat7/8でよく必要となる設定(NW関連)

１）ネットワーク設定
デバイスを確認
nmcli d

２）インターフェイスを有効化
nmcli c m eth0 connection.autoconnect yes

３）IPアドレス、サブネットマスクを変更
nmcli c modify eth0 ipv4.addresses 192.168.10.1/24
※デバイスを確認して「eth0」を変更する

４）デフォルトゲートウェイを設定
nmcli c modify eth0 ipv4.gateway 192.168.10.1

５）DNS設定
nmcli c modify eth0 ipv4.dns 192.168.10.1

６）IPを固定割り当てに設定 (DHCP は "auto"に変更)
nmcli c modify eth0 ipv4.method manual

７）インターフェースを再起動して設定を反映
nmcli c down eth0; nmcli c up eth0
※デバイスを確認して「eth0」を変更する

８）設定確認
nmcli d show eth0

９）接続確認
ip addr

１０）ネットワーク再起動
NetworkManagerをリスタート
systemctl restart NetworkManager

１１）NetworkManagerからのResolveconf制御の解放

＃/etc/NetworkManager/Networkmanager.conf
ーーーーーーーーーーーー
[main]

dns=none       ＜ーを追加
ーーーーーーーーーーーー
※反映にはNetworkManagerリスタート

１２）IPv6停止とルーティングON設定
＃vi /etc/sysctl.d/99-custom.conf
 net.ipv6.conf.all.disable_ipv6 = 1
 net.ipv4.ip_forward = 1

１３）設定の有効化
＃sysctl -p /etc/sysctl.d/99-custom.conf
※iptableを使用する場合は上記が必要。Firewalldを使用する場合は自動的に有効化される
CodeIgniterに独自のログレベルを追加する方法

# 記事作成の経緯

Codeigniterには `log_message()` というログファイルにメッセージを記述する方法がある。

Error Handling
https://codeigniter.com/user_guide/general/errors.html?highlight=log_message#log_message

だが、この仕様が以下の問題を抱えている。

- `$config['log_threshold']` の値により出力されないログがある  
（1に設定した場合はERRORしか出力されない）
- INFO, DEBUGにはCodeIgniter自身のログも出力されて読みづらいので、`$config['log_threshold'] = 1` としたい。
- 用意されているものが3つ（ERROR, DEBUG, INFO）しかなく、出したいログに相応しい名前を選べない  
※例えばメールの送信結果だったら「EMAIL」とか、管理画面のログなら「MANAGE」とかにしたい。

そこで、簡単にカスタムログを出力する方法まとめた。

# 1. Logクラスの拡張

application/core に MY_Log.php を追加する
※「MY_」部分は config.php の `$config['subclass_prefix']` に従う。

# 2. My_Log.php にカスタムログを記述

Logクラスを継承して1行追加するだけ。

```PHP
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class MY_Log extends CI_Log {
    protected $_levels = array('ERROR' => 1, 'DEBUG' => 2, 'INFO' => 3, 'ALL' => 4, 'EMAIL' => 1, 'MANAGE' => 1);
}
```

- ERROR, DEBUG, INFO, ALL までは system/core/Log.php のもの（必須）。
- その配列の後ろに `$key => $level`  の形で追記していく。
- `$level` は `$config['log_threshold'] = 1` を想定しているのでERRORと同じ1にした。

# 3. 動作確認

任意のプログラム中にログ出力コマンドを書いてアクセス。

```PHP
// メール送信プログラム
if($mail_sended) {
  log_message('email', 'sended!');
} else {
  log_message('email', 'failed: 失敗原因とかを記載');
}
```

ログファイルには以下のように記載される

```
EMAIL - 2019-11-15 19:40:06 --> sended!
```

# 類似記事

- CodeIgniterのログを独自カテゴリーに分けて出力する  
https://qiita.com/Go-Noji/items/dbf248f2fd55ed48ca58
Openwrtでvethを使う

#OpenWrt でのvethのサポート
OpenWrt 18.06ではvethのサポートが追加されている
[OpenWrt 18.06.0 - First Stable Release - July 2018
](https://openwrt.org/releases/18.06/notes-18.06.0)

#Package
以下のパッケージが必要になる

- kmod-veth

#Config
以下のように書くことによって利用できる

```config:/etc/config/network
config device
        option type 'veth'
        option name 'veth0'
        option peer_name 'veth0-peer'
```

このほかにもオプションとして

- macaddr
- peer_macaddr

が指定できる([veth.c](https://git.openwrt.org/?p=project/netifd.git;a=blob;f=veth.c))

~~ここで設定したデバイスをinterfaceとして指定することによってデバイスが現れる~~

~~```config:/etc/config/network
config interface 'veth0'
        option ifname 'veth0'
        option proto 'dhcp'
```~~

再起動すると現れた
ぼくのプログラミング作業環境 2019

この記事は「[みんなのプログラミング作業環境 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/spec)」の1日目の記事です。

## 自己紹介

サーバーサイド＆インフラエンジニアです。
アプリサービスの会社に勤めているのでたまにXcodeやAndroid studioを触ることがありますが、基本はVSCode, Terminal, Chrome, Dockerくらいなのでスペックはそこそこ、でもプログラミング作業を行う物理環境はなるべく良くしたいというタイプです。
昔は個人サービスを良く作っていたので自宅の環境も良いものに整えていたのですが、ここ最近は会社でしかコードを書いていないので今回は会社の環境のみを書きたいと思います。

## BYOD期 2017年10月〜2019年10月

諸事情により入社時から2年ほどBYODでした。
自分でお金をかける必要はありますが外部拡張含めて好きな環境を整えられるのはBYODの醍醐味ですね。

| モノ | スペック/型番 | 補足 |
|:-----------------|:------------------|:------------------|
| メイン端末 | MacBook Pro (13-inch, Early 2015) | 整備品を11万円弱で購入しました |
| CPU | 2.7GHzデュアルコアIntel i5 | さすがにXcodeのビルドなどは重いです |
| RAM | 8GB | シンプルにサーバーサイドの開発をするのならわりとじゅうぶん。でも仮想環境を動かすことも増えたのでもう少し欲しい |
| SSD | 1TB | 購入時は128GBだったのですがさすがにケチりすぎましたね、しばらくSDカードスロットに128GBを追加で挿してました。その後SSDが安くなったので換装 |
| キーボード | JIS配列 | 断然JIS派 |
| 外部ディスプレイ | LG 27UD68-P | 最近は4Kディスプレイが安いのでありがたいです、27インチは少し大きかったかも |
| 外部キーボード | REALFORCE 91UBK-S | 会社で使うので静音モデルを |
| 右手マウス | Logicool M336BK | メインで作業する用。左右を入れ替えることもあるので対称モデル |
| 左手マウス | Magic Trackpad 2  | ブラウジング中にスクロール等を操作する用 |
| 椅子 | Ergohuman PRO | これだけは支給品、ちょっと自分の体には大きすぎるのが玉に瑕 |


## 会社支給期 2019年10月〜現在

諸事情によりBYODを辞めて会社で余っていた支給端末に乗り換えることになりました。
外部拡張はせずにノートパソコンだけで使ってます。
(予期せず12月からリモートワークになったので結果的には良かったです)

| モノ | スペック/型番 | 補足 |
|:-----------------|:------------------|:------------------|
| メイン端末 | MacBook Pro (13-inch, 2017) | 整備品で買ったものかも |
| CPU | 2.3GHzデュアルコアIntel Core i5 | 世代が新しいのかわりとサクサク |
| RAM | 8GB | 相変わらずギリギリのメモリ |
| SSD | 128GB | 私物ファイルがないのでまだ余裕あります |
| キーボード | US配列 | 慣れないのできつい… |
| 椅子 | Ergohuman PRO | これは変わらず |

## BYOD期と会社支給期を経て

やはり会社から支給されるものは必要最低限の環境になってしまうので、あまり快適にはならないですね。
無条件で最高スペックを揃えてくれるような会社なら良いのですが、一般的な会社であればありもので作業せざるを得ないですし、BYODが許されているのであれば貯金をぶっこんで最高の環境を整えていきたいものです。

# そしてアドベントカレンダーの次回は

2日目は[ひだお (hidao)](https://qiita.com/hidao)さんの更新です！
https://qiita.com/hidao/items/d485c716e3efb2c0c9ac
【JavaScript】htmlのスクロールを任意の位置にアニメーションする

## はじめに

利用規約を作ったときにに埋め込みスクロールが長すぎたので
自動スクロールさせて任意の場所に移動しそこから読めるようにすれば便利だと思います。
その機能をJavaScriptで実装させてみようと思います。

## 実装

まず移動させたい文章のとこでクラスを定義します。

```slim

h2.scroll hogehoge
p hugahuga
```

次にjsでアニメーションしていきます。

```javascript

var scroll_possition = $(".scroll").offset().top;
var term_posittion = $(".term").offset().top;
var posittion = scroll_possition - term_posittion
$(".term").animate({
  scrollTop: posittion
});
```

簡単なアニメーションで実装できました。
まずtermはファイル先頭のクラスになります。
そして移動させたい位置から全体の位置を引くとジャストで希望の位置が取得できます。
これをアニメーションさせてやれば読み込みと同時にアニメーションされます。
Terraformに関して（入門編）

# 概要
> インフラストラクチャ定義ツールに分類されるツール。インフラの構成を宣言的に定義できるところが特徴。HashiCorp社が開発しているためHashiCorp製のアプリケーションと書き方はほぼ同じ。

今回は参考サイトをもとにまとめている。

# install方法

下記のリンクからOS 毎のビルド済みバイナリをダウンロードしパスを通す。
ただ、macの場合はbrewを使って簡単にインストールすることが可能。

    $ brew install terraform


https://www.terraform.io/intro/getting-started/install.html

# 使い方とチュートリアル

参考サイトのチュートリアルがかなりわかりやすいのでそれを参考にすると良い。
また、AWSを利用するのでawscliのインストールが必要。導入方法は参考サイトを参照すること。

# 参考サイト
- [10分で理解するTerraform](https://qiita.com/Chanmoro/items/55bf0da3aaf37dc26f73)
- [AWS CLI をインストールする](https://qiita.com/mokuo/items/0484feefbaddb70a9b06)
- [Terraformに関して（応用編）] (https://paper.dropbox.com/doc/k1NCswIBbORxDdZxs1FWP)
Ansibleに関して（応用編）

前回（Ansibleに関して（入門編）)はansibleの導入とansibleを構成する設定ファイルの役割について説明して簡単な動作テストを行った。ここではansibleのより詳細な使い方について説明する。

# 使い方
## inventoryについて

この設定ファイルには接続するターゲットサーバの情報を書く。
単一のサーバだけでなく、グループを設定して一括で環境を構築することも可能。
グループの例

    [web]
    10.0.11.121
    10.0.11.122
    [batch]
    10.0.21.100
## playbookについて

この設定ファイルが環境を構築する重要なファイル。設定するものが多くなった場合、このファイル自体を管理するのが難しくなる。それを防ぐためにRoleという考え方を導入する

## Roleについて
実行するymlファイルを目的ごとに分割することで管理を容易にする考え方。

```
ファイル構造
    site.yml <= メインのymlファイル
    roles    <= 実行するymlファイル群
    hosts    <= ターゲット側の管理（inventoryファイル）
```
rolesディレクトリの中身

``` 
roles/
    <task>/ *タスクの目的を名前にするとわかりやすい
        files/      <= copyモジュールでセットアップされるファイル
        templates/  <= templateモジュールでセットアップされるJinja2形式のテキストファイル
        tasks/      <= roleで実行されるtaskを定義(main.ymlが読み込まれる)
        handlers/   <= サービスの再起動といった特定の条件で発火するイベントtask
        vars/       <= main.ymlにroleで利用される変数を定義 
        defaults/   <= main.ymlにroleで利用される変数のデフォルト値を定義します。 (後述のvarsとの違いは、group_varsなどで変数を上書きできる)
        meta/       <= Roleのメタ情報を配置
```
```
- rolesディレクトリの例
    roles
    | - setup_docker
    |     |- tasks
    |         |- main.yml
    | - test
          |- tasks
          |    |- main.yml
          |
          |- files

```
具体的な中身は、githubを参照

https://github.com/littletake/Ansible



- ansibleコマンドについて

rolesを使った利用をする場合のコマンドは下記のとおり。
hostsファイルにsite.ymlに記載したホスト名があることが条件。

    $ ansible-playbook -i hosts site.yml
# 注意点
sshキーを別のサーバーに送信する場合

送信するために”ssh-copy-id”というコマンドを使うがこれはssh接続以外に接続する手段があることが前提sshキーを送信しようとした場合、パスワードが必要になる。
参考サイト：sshのssh-copy-id（公開鍵登録コマンド）の使い方

# 使用例
docker環境構築

ファイル構造

    site.yml
    hosts
    roles 
      | - setup_docker
          | - tasks
               | - main.yml # タスクのメイン部分

コード
https://github.com/littletake/Ansible/tree/master/docker_test

# Tips
- Ansible勉強＆実践結果（随時更新）
- connection_pluginについて

ansibleとterraformの連携

- Terraform と Ansible で勉強会用の環境を自動構築してみた話
- AnsibleのTerraform moduleを考察してみる
- Dynamic Inventoryについて
Githubでかんたんに絵文字が使えるChromeExtensionつくったよ！

## :octocat:作ったもの
GitHubで、絵文字を簡単に挿入することができるChromeExtensionです:sparkles::sparkles:
簡易的に絵文字を検索したり、最近使った絵文字から選んだりできます！下記のリンクからインストールできます:moyai:
[Emoji Palette:blush:](https://chrome.google.com/webstore/detail/emoji-palette/oocijcnhgpbjeelnoafpcjmjdhogpmid)


## :notebook:使い方
1. 絵文字を挿入するテキストフィールドにカーソルを置きます。
2. 絵文字を選択してクリックすると、絵文字が挿入されます。

## :thought_balloon:作った背景など
### :heartbeat:テキストベースのコミュニケーションにおける絵文字のポジティブな効果

エンジニアは文字ベースでのコミュニケーションが多いですよね。
一方で、文字ベースのコミュニケーションは、情報が文字のみになってしまうので、感情が伝わりにくく、冷たい印象を受けることも多いように思います。私自身、テキストのコミュニケーションは気を配るように気をつけているのですが、そういった中で、絵文字は、感情を伝え、チームのコミュニケーションを円滑にしてくれるすてきな表現だと感じています:sparkles:

GitHubでは、Pull Requestでレビューが行われる場面も多いと思います:octocat:
現状でも絵文字のサジェスト機能はあるのですが、絵文字の名前を覚えるのが大変だったので、絵文字の挿入をかんたんにできるツールをつくることで、レビュー等する際に絵文字をたくさん活用する場面が増えたら良いなあと思っています:smirk::thought_balloon:
Pull Requestの説明に、絵文字をつかい、概要をわかりやすくするような活用もできるのではないかと思います。（注意事項に :warning: をつかうなど）

また、絵文字のもたらす価値の考察について、 @suin さんの[「このSlack時代に「笑顔」の絵文字の価値を考える」](https://suin.io/552)という記事が素敵だったので、引用させていただきます。記事では、このように締めくくられています。

>この記事を書いているときに「人は笑顔1回で現金16,000ポンド(215万円相当)の価値を感じる」という研究があることを知りました。これは、ほほえみ1回の刺激がチョコバー2,000個分の刺激に相当するので、チョコバーの単価を掛け算した金額なんだと思います。これ自体無茶な計算ですが、絵文字付きのメッセージで相手をニコリとさせられば、無償の原資で215万円の価値を与えられるわけです。
コミュニケーションには常に文脈が付き物で、正解がないのも確かです。それでも、些細な工夫で変わることもあります。ほんの少し絵文字を混ぜ込むだけです。派手なデコレーションはいりません。絵文字で215万円の値打ちは言い過ぎかもしれませんが、それでも感情は伝わりやすくなり相手をちょっぴり幸せにするのは確かなことでしょう。
次に送信するメッセージの最後に、笑顔の絵文字を試してみてはどうでしょうか？?



確かに、だれかの「ニコリ」がどれほどの値打ちなのか、単純に計算することは難しいですが、絵文字によってちょっとしたハッピーが増えたら素敵ですよね:slightly_smiling_face:このツールが誰かの「ニコリ」を増やすことに貢献できたらよいなあとおもいます:sparkling_heart:

##### :cherry_blossom:開発ハッピーにしたいきもち
少しでも開発が楽しくなったり、楽になるようなアイデアがあれば実現していきたいというきもちで、開発ハッピーマンを目指しているので、そんなおきもちも背後にあります。

というわけで、ちょっとしたツールではありますが、よかったらみなさん活用してくれると嬉しいです:joy_cat:

## :globe_with_meridians:参考・お世話にになったサイト
* https://developer.chrome.com/extensions/samples
Extensionの実装サンプルが公開されています！このサンプルをベースに動かしてみるとExtensionのつくり方が学べると思います:relaxed:

* emoji-mart-vue-fast
https://www.npmjs.com/package/emoji-mart-vue-fast

* emoji-mart
https://github.com/missive/emoji-mart

使わせていただいたライブラリです！素敵なライブラリのおかげで、すばやく届けたい価値を実現することができました！:pray:
計算ドリル python

今回はテキストファイルを利用して、一桁自然数の二項演算の計算ドリルを作っていきます。環境はanaconda。書いたコードは以下の通りです。

##コードと出力結果

```python:計算ドリル
import random

with open("keisan.txt","w") as f:
    answer = []
    for cnt in range(10):
        num1 = random.randint(1,9)
        num2 = random.randint(1,9)
        question = str(num1) + " + " + str(num2) + " = "
        answer.append(num1+num2)
        f.write(question+"\n")
    f.write("\nA. ")
    for ans in answer:
        f.write(str(ans) + " ")
```
```:出力結果
5 + 1 = 
5 + 2 = 
3 + 3 = 
2 + 6 = 
1 + 5 = 
4 + 8 = 
6 + 1 = 
8 + 4 = 
6 + 7 = 
6 + 4 = 

A. 6 7 6 8 6 12 7 12 13 10 
```

##フロー
プログラムのフローを説明してきます。

```python:テキストファイルのオープン
with open("keisan.txt","w") as f:
```
まず、最初に一桁の自然数を取得するために<b>randomモジュール</b>をインポートします。そして、テキストファイルに出力するために<b>withステートメント</b>を使い、ファイル名を"keisan.txt"として、書き込みモードにして開きます。

```python:式の書き込み
answer = []
for cnt in range(10):
        num1 = random.randint(1,9)
        num2 = random.randint(1,9)
        question = str(num1) + " + " + str(num2) + " = "
        answer.append(num1+num2)
        f.write(question+"\n")
    f.write("\nA. ")
```
ここでは実際の足し算を書き込んでいます。答えの出力もするので、リストを用意します。randomモジュールの整数を生成する<b>randint関数</b>を使い、1~9の自然数を生成しています。questionには問題文を格納するのですが、<b>演算子を使うと勝手に計算されてしまいます</b>ので文字列に変換して格納しています。答えの方は<b>append</b>メソッドを使い、リストに加えていきます。そして、questionに格納された計算式を<b>write</b>メソッドで書き込んでいます。見やすいように改行しつつ出力します。

```python:答えの書き込み
 for ans in answer:
        f.write(str(ans) + " ")
```
最後に、answerに格納された答えのリストをfor文で順番に出力していきます。

##振り返り
過去にC言語を使った、テキストファイルの書き読み込みをしたことがありますが、pythonだとwith文を使うことでファイルのクローズを意識しなくなるのでとても楽ですね。
このコードは足し算の二項演算だけなので、今後はもっとこの計算ドリルを演算を自由に選べたり桁数を指定したりと機能を拡張していきたいと思います。なにかご意見、質問などありましたら気軽にコメントして下さい。
RHEL 7.7へのcompat-libstdc -33のインストール

Oracleのインストールの一部として、compat-libstdc -33-3.2.3（x86_64）パッケージをインストールする必要があります。しかし、yumを使ってインストールしようとしているパッケージの種類が変わっても、見つかりません。

```
[root@ip-xxx-xx-x-xxx ~]# yum install compat-libstdc++-33
Loaded plugins: amazon-id, langpacks, rhui-lb
No package compat-libstdc++-33 available.
Error: Nothing to do
[root@ip-xxx-xx-x-xxx ~]#
```

RHEL 7.6までは下記のオプションチャンネルや追加チャンネルを有効にすれば、問題なくインストールできますが。。

```
yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional
```
RHEL 7.7以降は下記二つのリポジトリがなくなった。
>rhui-REGION-rhel-server-extras
>rhui-REGION-rhel-server-optional

解決案は下記
---

RHELの新リポジトリを有効にする必要があります。

```
yum-config-manager --enable rhel-7-server-rhui-optional-rpms
```

**説明：**
無効:yum-config-manager --disable リポジトリ
有効:yum-config-manager --enable リポジトリ

**確認：**

```
[root@ip-10-1-2-3 ~]# yum search compat-libstdc++-33
Loaded plugins: amazon-id, search-disabled-repos
============================================================== N/S matched: compat-libstdc++-33 ==============================================================
compat-libstdc++-33.i686 : Compatibility standard C++ libraries
compat-libstdc++-33.x86_64 : Compatibility standard C++ libraries

  Name and summary matches only, use "search all" for everything.
```

**repolist確認：**

```
yum repolist all
```
【コスパ重視】 寝っ転がって進捗生産 【環境構築】

#用意するもの

- **タブレット** <br>
AmazonFireでok.10インチで1万円〜
- **タブレットアームスタンド**(1000円くらい)
- **Bluetoothマウス** <br>
タブレットに刺せるなら有線でも可.

#環境構築

1. **ベッドを壁につける** <br>利き手側を壁につけるのがオススメ.

2. **タブレットにPDFリーダーを導入** <br>AdobeReaderが無難. 勿論無料. FireはGoogleアプリストアが使えないが、Adobe公式サイトからapkファイルをダウンロードすればok.

3. **タブレットとBluetoothマウスをペアリング**

#使い方

利き手側を下にして横になる。腕の体重を敷布団に預けつつ、壁を使ってマウス操作。ページ送りもハイライトも文字打ちもマウスで可能！ <br>
![167445D6-2437-4F1E-88A2-6D399C9626E9.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314370/a541ff3f-366b-c00d-dca4-6543b810c1f1.jpeg)
<br>
![C41E9F96-DE45-4804-9811-C631D825CF6E.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314370/37a184be-e1c5-33d4-a951-bbc8a4f691cc.jpeg)



#欠点
- マウスがすぐどこか行ってしまう. 
- マウスで文字打ちはしんどい.

#妙案あればコメントください
ゲノム編集

# ゲノム編集とは

ゲノム編集とはゲノム上で任意の遺伝子を改変する技術。人工ヌクレアーゼというDNA切断酵素を用いて、目標とする遺伝子を破壊したり、挿入したりすることを指す。
遺伝子治療や農畜産物の育種に応用する研究が進められている。

# ゲノム編集の仕組み

[サイエンスZERO(NHK)](https://www.youtube.com/watch?v=wKijBLBsxpQ)

# ゲノム編集の紹介

[クローズアップ現代(NHK)](https://www.nhk.or.jp/gendai/articles/4331/index.html)
・遺伝子を編集する事で食材の改善を図る
・遺伝子組み換え非表示の問題

[マネー現代](https://gendai.ismedia.jp/articles/-/67631)
・iPS細胞の山中伸弥が語る

# ゲノム編集入門

https://www.cosmobio.co.jp/product/detail/crispr-cas.asp?entry_id=14354
Regexのいろは

#はじめに
この記事は、Regexとはなんぞやということを、自分の理解のために整理してみたものです。

##Regexとは?
Regex=Regular expressions　のことで、
__正規表現__を意味します。

正規表現とは、
__パターンを使ってより細かい検索をかける__ことで、
様々な言語で使用することができます。

検索をかける書き方のパターンは、
基本的に言語を通して共通しています。

ここからは、
実際に正規表現をいくつか紹介していきます。



##メタ文字
※正規表現に使える、
特別な文字のことを__メタ文字__と言います。
※このメタ文字自体を文字として検索したい場合は、「\」を用いれば良いです。

###ドット.
「なんでもいいけど１文字」を表す。（改行以外、空白もドットも入る）

###かぎかっこ[]
「いずれかの文字」ということ。
例)
```[ABC]```
なら、AかBかCということです。

否定の場合は、
```[^ABC]```
と書きます。

これは、「いずれかの文字でない」ということです。
ABCでなければなんでも良いので、空白なども入ります。

###ハイホン-
文字の範囲指定ができます。
```[A-Z]``` ```[0-9]```のような感じです。

```[a-zA-Z0-9]```と書くと、小文字のa~z, 大文字のA~Z,　数字の0~9のいずれかに当てはまるということです。


###ワード文字　\w
```\w``` は ```[a-zA-Z0-9_]```と同じ意味です。(アルファベットか数字かアンダースコア）
```\W```　だと、否定の　```[^a-zA-Z0-9_]```と同じ意味になります。
（小文字か大文字かの違い）

###数字Digit
```\d``` は ```[0-9]```　と同じ意味です。
ワード文字と同様に、```\D``` の時は否定になります。

###Space
　```\s```　は、「空白、タブ、改行文字」を意味します。
「空白、タブ、改行文字」以外を表す時は、```\S```　です。

###プラス＋
「直前の文字の１回以上の繰り返し」という意味です。

###アスタリスク＊
「直前の文字の０回以上の繰り返し」という意味です。

###クエスチョンマーク?
「直前の文字の０回または１回の登場」という意味です。

Lazyとして、「最小限のマッチに強制」という意味合いも持っています。

###{ }
「繰り返し回数」を表します。
```{1,3}```なら、１回以上３回までということです。

例)
```b\w{2/3}``` なら、
bee, beer, beeersなどが引っかかります。

```{2,}``` なら２回以上、
また```{3}```　は、限定回数を表します。

###選択 ｜
「いずれかの文字(文字列）を指定」という意味です。
例）
```b(l｜e｜i)d```

###行末・行頭の条件
```^``` で、「行頭である」という条件をつけることができます。
```$``` で、「行末である」ということの条件付けです。
```^Hello$```　のように両用することもできます。


###ワード境界
```\b``` で、「他のワードとの境界」にマッチします。

###グループ化（）
```(ha)+``` などとすると、
グループ'ha'の繰り返しを表します。

この()は、勝手にキャプチャリングされ、
後々、\1,\2,\3...というように、

指定し、参照することができます。
例えば、```(\w)a\1```　とすれば、
⚫︎a⚫︎、のようなaを同じ文字で挟んだものという指定ができます。

⚠️$1, $2, $3はまた別⚠️

キャプチャリングを防ぐには、
```(?:ha)+``` というように、
?:を追加すれば良いです。

###フラグ
「大文字小文字を区別しない」とき、
insensitiveのiを用いて書きます。

###gグローバルマッチ
グローバルマッチをオフにすると、
最初にヒットした時点で、
検索をやめてしまいます。

###mマルチライン
マルチラインをオフにすると、
複数行の検索をしなくなります。





##参考
YouTUbe チュートリアル道場　正規表現入門
AIで画像からテキストを引いてみた 

# やってみた
PCにあるたくさんの画像を分類したくなったので、画像解析AIをちょっと試してみました。
自分の画像を世界に晒すのはなんなので、本記事内での検証は[写真AC](https://www.photo-ac.com/)様の画像をお借りして実施しました。

# 画像解析AI
すぐにトライできそうなのはこの辺りです。

|名称  |会社名  |概要  |
|---|---|---|
|[Google Cloud Vision](https://a3rt.recruit-tech.co.jp/product/imageSearchAPI/)|Google  |ローカル画像を英語で解析可能 準備が比較的簡単  |
|[Amazon Rekognition](https://aws.amazon.com/jp/rekognition/)|Amazon|英語で解析可能 ローカル画像もOK |
|[A3RT Image Search API](https://a3rt.recruit-tech.co.jp/product/imageSearchAPI/)|リクルート  |リモート画像URLをパラメータに設定すれば日本語で解析可能  |
|[Computer Vision](https://azure.microsoft.com/ja-jp/services/cognitive-services/computer-vision/) |マイクロソフト  |リモートでもローカル画像でも英語であれば解析可能  |
|[Einstein Vision](https://github.com/heroku/einstein-vision-node) |Salesforce | 英語で解析可能　Herokuで動かせるサンプルアプリあり　 |


# Google Cloud Vision を試してみる
画像を分類したい、つまり画像からキーワードを抽出したい。本当は日本語で抽出したかったのですがいいけど、まずは英語で試すことにしました。

# APIを使用するための準備
1. Googleアカウント作成を作成してください。
2. [無料トライアル登録](https://console.cloud.google.com/freetrial/)してください。
3. [プロジェクトを作成](https://console.cloud.google.com/marketplace)してください。
4. プロジェクト上でAPIキーを有効化、APIキーを取得、メモしておいてください。



# APIの使い方
エンドポイント… https://vision.googleapis.com/v1/images:annotate
メソッド： GET

|パラメータ  |内容  |例  |
|---|---|---|
|key|事前準備で受け取ったAPIキー |xxxxxxxxxxxx  |


# 手っ取り早くGUIで確認してみる
[Try the API](https://cloud.google.com/vision/?hl=ja)でどんなテキストが引けるか試してみます


## 野天風呂
<img width="818" alt="野天風呂" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459555/1c7bf368-0e71-e159-5974-2555e35d7b07.png">


## 屋根付き露天風呂
![スクリーンショット 2019-11-15 17.33.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459555/1f97c0e9-b1d5-a803-01e7-3e352380abd5.png)



## 和室1
![スクリーンショット 2019-11-15 17.36.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459555/956bf1b0-24bb-3ba3-08f8-92293c37e4db.png)

## 和室２
![スクリーンショット 2019-11-15 17.37.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459555/29fd314e-3a3c-efb5-1aeb-3424acefc48f.png)

## イタリアン
![スクリーンショット 2019-11-15 17.39.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459555/a278cb32-8f83-ec27-a6b0-e9ed4ad7cd93.png)

## お寿司
![スクリーンショット 2019-11-15 17.38.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459555/59689e20-85ad-c068-69c0-8928b55289c4.png)





# 結果まとめ
実績のあるGoogleだけに、思っていた以上に適切に判断されていました。「野天風呂」で「Hot Spring」がありました。「屋根付き露天風呂」の「House」辺りは屋根から判断されているのだと思います。
和室については流石に「Japanese-style room」とはなりませんでしたが「Room」はありましたので分類することはできそうです。
イタリアンについては「Food」は当然として「Chinese Food」「Thai Food」「Spaghetti」辺りが抽出できましたので、食事という判断はできますね。お寿司については「Sushi」が抽出されましたので完璧です。
このレベルであれば、Google Cloud Vision 処理後、翻訳をかければ自動的に振りわけられそうです。
同じ画像を使って、他のAPIについても今後試してみたいと思います。
Cookie属性 HttpOnlyとSecure

ごっちゃになりがちなのでメモ。

# HttpOnly
Cookie属性としてこれを付与すると**JavaScriptからアクセスできなくなる。**
→　Cookieに格納されたセッションIDをJSで盗もうとするのを防げたりする。
→　Httpでしか送信できないとか、そういう意味ではない。

# Secure
これが付与されると**HTTPSの通信の場合のみ送信される**ようになる。
→　常時SSLのサイトでは基本的にこれを使うべき。
vue.config.js で webpackの設定を使えるようにする方法

import時代についていけないエンジニアがvueで四苦八苦してると出会うwebpackの設定。

参考になるgithubやblogには、こういうやつが書いている。が、使い方がわからない。

```js
module.exports = () => {
        plugins: [
            new webpack.IgnorePlugin(...),
        ],
```

これは `webpack.config.js`（相当のファイル）に書くのが前提なarticle。注意点は、これは vue-cli ではなくてwebpack-dev-serverの話ということ。

```js
// webpack.config.jsとか、いろんな名前で使われてるけどとりあえずconfigぽいもの
const webpack = require('webpack');           <------ よく省略されてる
module.exports = () => {
        plugins: [
            new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
        ],
```

vue-cliの `vue.config.js` でどう書くかというと、 `module.exports` の中にあった第1階層を `configureWebpack` の中に移動するとよい。

```js
// vue.config.js
module.exports = {
  configureWebpack: {                  <----------- これでくくる
    plugins: [
            new webpack.IgnorePlugin(...),
    ]
  }
}
```

参考： https://cli.vuejs.org/guide/webpack.html

簡単なことだけど、webpackをすっ飛ばしてる開発者にはこれがわからんのですよ。
docker/git credential helperの使い方（一覧）

## docker

- https://docs.docker.com/engine/reference/commandline/#credentials-store
- https://github.com/docker/docker-credential-helpers/releases
- storeだけjson、get/eraseはホスト名を入力として取ります

```
$ docker-credential-pass store
> {"ServerURL":"__HOST__","Username":"__USERNAME__","Secret":"__PASSWORD__"}
$ docker-credential-pass list
{"__HOST__":"__USERNAME__"}
$ docker-credential-pass get
> __HOST__
{"ServerURL":"__HOST__","Username":"__USERNAME__","Secret":"__PASSWORD__"}
$ docker-credential-pass erase
> __HOST__
```

## git

- https://git-scm.com/docs/gitcredentials
- /usr/share/doc/git/contrib/credential や /usr/local/opt/git/share/git-core/contrib/credential/ 配下とかにあるらしいです。なければ https://github.com/git/git/tree/master/contrib/credential から取れます(cf https://stackoverflow.com/a/40312117/2641271)
- HTTPに近く、入力は行単位、空行で入力終了です

```
$ git-credential-libsecret store
> protocol=https
> host=__HOST__
> username=__USERNAME__
> password=__PASSWORD__
>
$ git-credential-libsecret get
> protocol=https
> host=__HOST__
>
username=__USERNAME__
password=__PASSWORD__
$ git-credential-libsecret erase
> protocol=https
> host=__HOST__
>
```
python3 datetime replaceで20分もはまった

# 悩み

```python
from datetime import datetime as dt
now = dt.now()
print('{0:%-M}'.format(now))
now.replace(minute=8)
print('{0:%-M}'.format(now))
```

42
8
と出力されてほしかったが、
42
42
と出力されてしまった。

# 答え

```python
from datetime import datetime as dt
now = dt.now()
print('{0:%-M}'.format(now))
now = now.replace(minute=8)
print('{0:%-M}'.format(now))
```

くだらなかった。。。
git cloneしたものとは違うブランチを見たい場合の対処法

## たとえばこんなケースです
- Aさん「私のコードをチェックして。masterブランチよ」
- わたし

```bash
$ git clone https://github.com/a_san/test.git
```

- Aさん「ごめん！developブランチだったわ！」
- わたし 😩

## 対処法
①リモートのブランチ一覧を確認する

```bash
$ git branch -r
```
たとえばこんな感じになる

```bash
$ git branch -r
  origin/HEAD -> origin/master
  origin/master
  origin/develop  # 今回はこれが目的のブランチ
```
②該当のブランチに切り替える

```
$ git checkout [リモートブランチ名]
```
```bash
$ git checkout develop 
```

## 結論
cloneすることで、全ブランチの情報が手元に存在することになる
#Rails + #rspec OPTIONS request test by ActionDispatch::Integration::Session.proccess

# example

```rb
  describe 'options' do
    subject { process :options, '/' }

    before { subject }

    it { ... } 
  end
```

# Ref

[Perform HTTP OPTIONS request from Rails 5 for CORS pre-flight or otherwise - Stack Overflow](https://stackoverflow.com/questions/39840077/perform-http-options-request-from-rails-5-for-cors-pre-flight-or-otherwise)

[ActionDispatch::Integration::Session](https://api.rubyonrails.org/v5.1.1/classes/ActionDispatch/Integration/Session.html#method-i-process)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Gradleで任意のファイル名で.apkを無警告で書き出す (2019/11版)

# TL;DR
AndroidのGradle Buildで出力される.apkのファイル名を好きに決めたかったので，何年か前にいろいろググって`build.gradle`を設定してあったのですが，最近のGradleのVersion UpでWarningが出るようになってしまいました．．．

なので，最新Verでも無警告で気持ちよく任意名の.apkを出力できるようにします．

# 環境

```
Android Studio : 3.5.2
Android Gradle Plugin Version : 3.5.2
Gradle Version : 5.4.1
```

# 何が問題だったか
もともとの`build.gradle`では ↓ のような処理で.apkの名前を差し替えていましたが，
`output.outputFile.name`の処理が内部でDeprecatedなAPIを使っているらしく，
`API 'variantOutput.getPackageApplication()' is obsolete and has been replaced with 'variant.getPackageApplicationProvider()'.`
という警告が出るようになっていました．
(replaceしろと言われましても，そもそもそんなAPI使っとりませんがな．．．)

```gradle:app/build.gradle
applicationVariants.all { variant ->
    variant.outputs.all { output ->
        if (variant.name == 'release') {
            if (output.outputFile != null && output.outputFile.name.endsWith('.apk')) {
                outputFileName = "hoge-fuga-piyo.apk"
            }
        }
    }
}
```

しばらく放置してましたが，直すことにします．


# できあがったもの

```gradle:app/build.gradle
applicationVariants.all { variant ->
    variant.outputs.each { output ->
        if (output.outputFileName.endsWith(".apk")) {
            switch (variant.name) {
                case "debug":
                    output.outputFileName = "DEBUG.apk"
                    break
                case "release":
                    output.outputFileName = "RELEASE.apk"
                    break
            }
        }
    }
}
```

これで`Build APK`でも`Generage Signed APK`でも好きな名前で.apkを書き出すことができるようになります．

# さいごに
AndroidがGradle Buildに対応したころ，任意APK名とかそのうち公式で対応するでしょ，と思ってたんですが，いまだに無いのは解せんですよ．

# TODO:
.apk名にVersion Nameを入れたいような気もするので，そのうち追加します．
(これに関してはぐぐるといっぱいでてきますが)

---///
laravel サーバ環境構築基礎


```
少なくとも一つのフレームワークを覚えようと思って、複数のフレームワークの中ララベルに興味ありました。
いろいろ調べたところ、テスト環境の情報が多い、サーバ環境構築の情報が少ない、バラバラです。
一応、苦戦二日間やっと構築成功しました、以下に纏めます。共有致します。
```

この手順で恐らく一発でできそうな感じ。
```
OS CentOS 6.10 32bit
php5.6.40
laravel5.4
mysql5.6/40
Apache2.2.15
```

■ composer　インストール
```
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
composer
```

■ laravel インストール
```
composer global require "laravel/installer"
```

■ プロジェクトを作成
```
composer create-project --prefer-dist laravel/laravel laravelapp
(laravelapp   プロジェクト名です)
```

■ 権限変更
```
chmod 777 storage -R
chmod 777 bootstrap/cache -R
```

■ httpd.conf 編集
```
<Directory "/var/www/html">
AllowOverride None  ->  AllowOverride All
(ご自身の環境合わせ設定)
```
■ config/app.php 編集
```
timezone = 'Asia/Tokyo',
locale　= 'ja',
'fallback_locale' => 'en',
```

■ laravelapp/.env 編集
```
DB_DATABASE=mydb
DB_USERNAME=root
DB_PASSWORD=test
(必要応じて)
```
■ laravelapp/app/Providers/AppServiceProvider.php 編集
```
   public function boot()
 ｛
   Schema::defaultStringLength(191); //追加
```
■ httpd 再起動
```
リモートサーバのURLでlaravelの起動画面と任意の
web.phpの指定のパスで動作確認ＯＫ。
```

(完了)

次は関連のＡＰＰ作成予定です。
Deeplearning on AWS をやってみたの巻き

#目的
Deep Learning を学ぶ

#目標
よくある犬の学習をやってみる
学習させてみる
Deep Learning 周辺ツールを使ってみる

#結果
sage maker を使うと学習効率がいいね！

機械学習を学びたい人にとって、環境設定やAPI 連携などの"機械学習を使うための環境構築" は、障壁になりそう。
最初は、AWS トレーニング等を通じて、1回教えてもらうと学びたいところへジャンプしやすそう。

周辺ツールとして、
コンテナ やLambda などのオンプレミスサーバ構築と比べ、高速化を実感しながら、機械学習を体験できた。
今までより、OS起動、OS設定でつまずかない分、気楽でした！ 

#できたこと
よくある画像認識のスコアリング。今回は、ビーグル犬を判定！
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184724/099572ca-b427-b46c-dd27-9294f4e4a0cf.png)

#やったこと
サンプル画像とサンプルコードで、コンテナ作ったり、機械学習のトレーニングと推論を実際にやってみた。
CPU と GPU の応答速度の差を体験できたのも良かったかも。GPU だと3分でもCPUだと20分ぐらいかかっちゃう。
![model.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184724/fcbb0f61-f9fb-ce68-5280-1d35bf899782.png)
Rで作ったsvgがLibreOffice Draw でインポートされない時

## 問題

<img width="564" alt="png_v_svg.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145500/0c35342c-f1a1-d12f-fdde-e05ef78cf540.png">

学会ポスター作りにはLibreOffice Drawが簡単でいいですよね。しかし、Rで作ったsvgをLibreOffice Drawにインポートすると文字が消えてしまう怪現象に悩まされました。さらによくわからないのが、Rで作ったsvgでもうまくインポートされるものと、そうでないのがあるのです。

## 解決

R内蔵のグラフィックデバイスであるsvgを使うと問題ないのですが、svgliteで書き出したものは字が変になることが分かりました。ggplot2::ggsave()はsvglite::svglite()をsvgの書き出しに使うため、LibreOfficeで変になるのです。というわけで、ggsave()に以下の引数を加えたら、LibreOfficeで読めるようになりました。

`ggplot2::ggsave(“hoge.svg”, device = svg)`

## 環境
MacBook Pro (2015)
macOS 10.14.6
LibreOffice 6.3.3.2

R 3.6.1
svglite 1.2.2
とりあえずDaggerを動かしてみる&詰まったところの解決

# はじめに
Daggerのことググってもとりあえず動かしたいくらいの解説があまりなかったので、とりあえず動く物を。
あと、インジェクションするオブジェクトにactivityを引数として渡さないといけない時の方法で詰まったのでそれも書きます。

ソースは[こちら](https://github.com/kkt-yu/Dagger-Practice)
# Daggerについて
ググってください

# Daggerの下準備
Gradle(app)に下記追加

```gradle
// Dagger
implementation "com.google.dagger:dagger:$dagger_version"
annotationProcessor "com.google.dagger:dagger-compiler:$dagger_version"
implementation "com.google.dagger:dagger-android-support:$dagger_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version"
kaptTest "com.google.dagger:dagger-compiler:$dagger_version"
kapt "com.google.dagger:dagger-android-processor:$dagger_version"
```

Syncして完了

# Injectするオブジェクトを作成
```kotlin
class Thermometer @Inject constructor(val activity: SecondActivity) {
    fun getTemperature(): String {
        return activity.getString(R.string.temperature)
    }
}
```
```@Inject constructor```が肝っぽい
### string.xmlにtemperatureを追加
```xml
<string name="temperature">30℃</string>
```
# Componentを作成
```kotlin
@Component
interface Room {
    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(activity: SecondActivity): Builder

        fun build(): Room
    }

    fun inject(activity: SecondActivity)
}
```
# インジェクトされる側を作成
```kotlin
class SecondActivity : AppCompatActivity() {
    lateinit var binding: ActivitySecondBinding
    private val viewModel = SecondViewModel()
    private lateinit var room: Room

    @Inject
    lateinit var thermometer: Thermometer

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_second)

        room = DaggerRoom.builder().application(this).build()

        room.inject(this)

        viewModel.textView = thermometer.getTemperature()

        binding.textView.text = viewModel.textView
    }
}
```
# 完成
こんな感じでstring.xmlの内容が表示されてると思います。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476234/549eb08f-397f-6797-ef6b-2b0d5269a283.png" width=400">

# activityの引き渡し
Componentに

```kotlin
@Component.Builder
interface Builder {
    @BindsInstance
     fun application(activity: SecondActivity): Builder

      fun build(): Room
}
```
があるが、Daggerでactivityを引数として入れる時に必要になる。
これがない場合、

```
SecondActivity cannot be provided without an @Inject constructor or from an @Provides-annotated method. This type supports members injection but cannot be implicitly provided.
```
というエラーが発生する。
基本的に、Daggerでインジェクションするオブジェクトの引数には```@Inject```等で値を入力されたものしか渡せないらしい。。。

####ついでに
activityが必要ないタイプの例もMainActivityに書いてある。
AndroidManifestの

```xml
<intent-filter>
    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
```
を変更すれば表示が切り替わる

おわり
Android でパスワード表示/非表示できる EditText を実装する

# 概要
![スクリーンショット 2019-11-15 12.39.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34926/fc09a53a-2ab8-d15b-2810-9ecdfac9b88d.png)
![スクリーンショット 2019-11-15 12.39.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34926/3a71d41a-9be9-be9a-6ec1-294b03661a3c.png)

こういうフォームを実装します。

「Android パスワード 表示 非表示」のようなキーワードでググると結構ヒットするのですが、
MATERIAL DESIGN ではなく
`android.support.design.widget.TextInputLayout`
の内容が多かったので書き残しておきます。

# 手順

1.プロジェクトレベルの build.gradle に以下を追加します（[コチラを見るのが確実です](https://material.io/develop/android/docs/getting-started/)）

```gradle:build.gradle
allprojects {
    repositories {
        google()
        jcenter()
    }
}
```

2.モジュールレベルの build.gradle に以下を追加します（[コチラを見るのが確実です](https://material.io/develop/android/docs/getting-started/)）

```gradle:build.gradle
dependencies {
    implementation 'com.google.android.material:material:1.0.0'
}
```

3.EditTextを以下のようにします

```xml:activity_main.xml
<com.google.android.material.textfield.TextInputLayout
    style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="パスワード"
    app:passwordToggleEnabled="true">

    <com.google.android.material.textfield.TextInputEditText
        android:id="@+id/password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPassword" />
</com.google.android.material.textfield.TextInputLayout>
```

以上で [概要](#概要) のようなフォームができます！簡単ですね！

# 補足

```xml
app:passwordToggleEnabled="true"
```

この部分が 目👁 のアイコンを表示するかどうか、です。

また

```xml
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
```

この部分は EditText のスタイルを指定している部分で、`OutlinedBox` と `FilledBox` があります。
（`OutlinedBox.Dense` と `FilledBox.Dense` もあるようですが違いがわかりませんでした…）
それぞれ見た目は以下のようになります。

- OutlinedBox

![スクリーンショット 2019-11-15 17.16.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34926/e42662d8-587a-5e82-c5c6-af8656ac81c0.png)

- FilledBox

![スクリーンショット 2019-11-15 17.17.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34926/b9af3196-ab75-85b1-432b-0a275a74d1de.png)

他にもいろいろとできるようなので [公式 MATERIAL DESIGN Text Fields](https://material.io/develop/android/components/text-input-layout/) をみてみてください🙂
Pythonによる二値化画像処理の基本

#画像処理
画像の加工、解析を行うためによくされる画像処理である。おぼえておくと、画像ファイルの減少などもできるので覚えておくとよい。

#二値化画像
グレースケール画像ともいう。白黒することである。画像処理の基本となる。

#環境
・jupyternotebook
・python version == 3.7.4
・sample.jpg(from  http://free-photo.net/archive/entry10252.html)
![sample1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533115/b2498ac3-4179-a31b-3409-1e3265b750e5.jpeg)

#ソースコード
```python

#opencvとnumpyのimport
import cv2
import numpy as np

#画像の読み込み
img = cv2.imread("sample1.jpg")

#グレースケール変換
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

#閾値の設定
threshold_value = 150

#配列の作成（output用）
threshold_img = gray.copy()

#実装(numpy)
threshold_img[gray < threshold_value] = 0
threshold_img[gray >= threshold_value] = 255

#Output
cv2.imwrite("C:\\Users\\[username]\\python\\sample1-2.jpg",threshold_img)

```

#出力画像結果
![sample1-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533115/b3edc7e4-f60e-e06a-87f2-d43d695ec721.jpeg)

閾値の設定のところで、"150"ではなく、ほかの数字で試してみると白黒の位置変化がみられる。
imageJ(URL:"https://imagej.nih.gov/ij/")
などのソフトを使うとそういった変化もリアルタイムで見ることができるので、使ってみるとよい。
「Kaggleで勝つ」を読んでみた。🤗

# 本全体の感想
実際に上位のkagglerが使用した手法が記載されていて面白い。また数学的知識や数学に嫌悪感のある人でもかなりわかりやすく説明してくれている。また機械学習をしない人でも知見として軽く読むには適していると感じた

# 本の構成
1. はじめに
2. 分析コンペとは
3. タスクと評価指標
4. 特徴量の作成
5. モデルの作成
6. モデルの評価
7. モデルのチューニング
8. アンサンブル

## 1 はじめに
目次を読んで好奇心をあげるために読んだ。あらかじめ機械学習をちょろっと知ってる人なら好奇心あげあげ

## 2 分析コンペとは
この辺は分析コンペのモラルとかルールとかが記載されている。コンペに参加する場合は読んでみて損はない

## 3 タスクと評価指標
kaggle側がどのような評価指標を使っているか知れる。もちろんこの辺は実務的なことに使えてくるのでここから読み始めるのがおすすめ。評価指標を知ることは自分の見解だと機械学習を行う上で二番目に大事なことだと思います。

## 4 特徴量の作成
この本は後半モデル（学習器）の話が多いけどここが一番大事。ここだけでかなりの知見を得ることができた。この本は機械学習の本じゃなくてコンペ専用の本なのでここが詳しくなるのは必然かな。。すなわち機械学習を行うので一番大事なのは前処理ってことです。（個人的な意見です）

## 5 モデルの作成
数学的でなく直感的にモデルどんなものか知れる。使うだけなら非常に便利。特にGBDTに詳しく書いてある。ここ読むだけで機械学習の話ができるようになるかも

## 6 モデルの評価
三番目に大事なのがここの章かもしれない。なぜかというと後述のアンサンブルは実務的ではなくコンペで気持ちよくなるのが目的と言った印象
簡単にいうとバリデーションが[でぇーじ](https://www.youtube.com/watch?v=39JfUYnJvkw)、時系列データのバリデーションの注意点も教えてくれる

## 7 モデルのチューニング
ここの読んだ時の印象は「え、もっと早く教えてくんね？」って感じです。今まで読んだ本の中でもかなり効率よく見やすく教えてくれる。（そんな読んだことないけど）ありがとうございました

## 8 アンサンブル
みんな気になるアンサンブル。スタッキングについて全体像を理解するのにかなり助かった。正直ここ読むまでスタッキングが何かわかった気になっていた。数学的知識も不要。
また実際にkaggleで使われた例を何個もあげてくれているので想像がとてもしやすい


かなり雑に書いたので誤字脱字がたくさんあると思います。
## 追記
思ったよりたくさんの人にみてもらったので、この本の感謝も込めてリンクを追加しておきます。
[kaggleで勝つ](https://www.amazon.co.jp/Kaggle%E3%81%A7%E5%8B%9D%E3%81%A4%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E6%8A%80%E8%A1%93-%E9%96%80%E8%84%87-%E5%A4%A7%E8%BC%94-ebook/dp/B07YTDBC3Z)みなさんもぜひ読んでみてください。
Minecraft 1.14.4 Forge Modの作成 その9 【レシピの追加】

# はじめに
ツールや防具のクラフトレシピ、鉱石の精錬レシピの追加をしてみます。

![2019-11-15_17.01.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/eae887d9-3047-d66b-271c-94c1b1698fa3.png)
![2019-11-15_16.59.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/eb34aaea-4cf9-b372-8d49-b0d39a4379bd.png)

参考
[Crafting / Smelting Recipes & Tags / Ore Dictionary - Minecraft Modding Tutorial for MC 1.14/1.14.3](https://www.youtube.com/watch?v=N2q0nAE-iQ4)

# 💻開発環境
ここでは環境は以下のようにします。

- Windows 10
- JDK 8u211
- Minecraft 1.14.4
- Minecraft Forge 1.14.4 (28.1.0)
- IntelliJ IDEA 2019.2.3

# フォルダの作成
`resources/data/biwako_mod/recipes`フォルダを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/2944e258-499c-05a8-50e7-35195cb6555e.png)

# クラフトレシピの追加
レシピの追加方法は最近バージョンと変わりなくJsonファイルを用いて行います。
ファイル名は何でもいいようなので、分かりやすい名前をつけて作成します。
ここでは、`琵琶湖の斧`のレシピを追加しようと思うので、`biwako_axe_recipe.json`を作成しました。

## 記述するコード
斧のレシピを追加するコード例を以下に記載します。

```json:biwako_axe_recipe.json
{
    "type": "minecraft:crafting_shaped",
    "pattern": [
        "II",
        "IS",
        " S"
    ],
    "key": {
        "I": {
            "item": "biwako_mod:biwako_ingot"
        },
        "S": {
            "item": "minecraft:stick"
        }
    },
    "result": {
        "item": "biwako_mod:biwako_axe"
    }
}
```

## 解説

**type**
作業台でクラフトできるレシピを追加する際には`"minecraft:crafting_shaped"`を指定します。

**pattern**
クラフトする際のアイテムの配置の仕方を記述します。
アルファベットとアイテム名を関連付けさせるため、アルファベットは何でもOKです。

**key**
ここで、アルファベットとアイテム名を関連付けします。

**result**
クラフトした結果、得られるアイテムをここに記述します。

メタデータ、クラフト時に得られるアイテムの個数もこのJsonファイルに記述しますが、
今回は、変更する必要が無いため省略します。

# 精錬レシピ
精錬レシピもクラフトレシピ同様にJsonファイルを用いて追加します。

## コード
琵琶鉱石の精錬レシピを追加するコード例を以下に記載します。

```json:biwako_ore_smelting.json
{
    "type": "minecraft:smelting",
    "ingredient": {
        "item": "biwako_mod:biwako_ore"
    },
    "result": {
        "item": "biwako_mod:biwako_ingot"
    },
    "experience": 3.0,
    "cookingtime": 200
}
```

## 解説

**type**
精錬レシピを追加する際には、`"minecraft:smelting"`を指定します。

**ingredient**
精錬レシピの場合はクラフトレシピのように、配置の仕方を記述する必要はありません。
材料、という形でレシピにアイテムを追加します。

**result**
精錬した結果、得られるアイテムをここに記述します。

**experience**
精錬時に得られる経験値量を指定します。

**cookingtime**
精錬にかかる時間を指定します。

# 別のアイテムから同じアイテムをクラフト or　精錬する場合


```json:biwako_ore_smelting.json
{
    "type": "minecraft:smelting",
    "ingredient": [
        {
            "item": "biwako_mod:biwako_ore"
        },
        {
            "item": "biwako_mod:biwako_quartz_ore"
        }
    ],
    "result": {
        "item": "biwako_mod:biwako_ingot"
    },
    "experience": 3.0,
    "cookingtime": 200
}
```

精錬レシピで説明しましたが、クラフトレシピの場合も同じです。
アルファベットとアイテム名を関連付けるときに、同じように複数のアイテムを指定すればできます。

# Minecraftの起動
最初は左側の一覧に表示されませんが、一度作成すると表示されるようになるようです。

クラフトレシピ
![2019-11-15_17.01.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/eae887d9-3047-d66b-271c-94c1b1698fa3.png)
精錬レシピ
![2019-11-15_16.59.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336583/eb34aaea-4cf9-b372-8d49-b0d39a4379bd.png)

---
[Github](https://github.com/Hiroya-W/biwakoMC/tree/1.14.4)にてプロジェクトを公開しています。
Jupyter Notebookの拡張機能、nbextensionsの設定について　自分用

タイトル通り、nbextensionsの個人的の設定について。

# 導入
参考にしたサイト
[https://www.pynote.info/entry/jupyter-notebook-nbextensions](https://www.pynote.info/entry/jupyter-notebook-nbextensions)

```
#インストール
pip install jupyter-contrib-nbextensions
(pip install jupyter-nbextensions-configurator) #上記の時点であるっぽい？

#有効化
jupyter contrib nbextension install --user
jupyter nbextensions_configurator enable --user
```

アンインストール、無効化したい場合は以下の通り。
参考にしたサイト
[https://github.com/ipython-contrib/jupyter_contrib_nbextensions/issues/1012](https://github.com/ipython-contrib/jupyter_contrib_nbextensions/issues/1012)

```
#無効化
jupyter contrib nbextension uninstall --user
jupyter nbextensions_configurator disable --user

#アンインストール
pip uninstall jupyter-contrib-nbextensions
pip uninstall jupyter-nbextensions-configurator
```

# nbextensionsの設定
参考にしたサイト
[https://qiita.com/simonritchie/items/88161c806197a0b84174](https://qiita.com/simonritchie/items/88161c806197a0b84174)

![nbextensionsの設定.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493197/465fc151-6a9b-a9c4-1c0b-3973a4d5ea4a.png)
AWSソリューションアーキテクトアソシエイトに不合格だったので勉強法をまとめます

#本記事の結論
・始めて試験を受けるのであればどんな問題がでるか確認のためAWS模擬試験を受けてみる。
・模擬試験を参考にどの教材があっているか決める

#教材
・Udemy-これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（初心者向け21時間完全コース）
・AWS模擬試験

#学習方法
・通勤時間を使って毎日Udemyの模擬試験を10問解く
Udemyではハンズオンもありましたがハンズオンを行わずに模擬試験のみを2か月した。
Udemyの模擬試験が90％程とれるようになったのでAWSの模擬試験を受ける

・AWS模擬試験を受けたがスコアが思うようにならなかった。
Udemyの模擬試験とAWSの模擬試験にレベルの違いがあった。
↓AWS模擬試験の結果

```
総合スコア: 52%
トピックレベルスコア:
1.0  Design Resilient Architectures: 44%
2.0  Define Performant Architectures: 71%
3.0  Specify Secure Applications and Architectures: 33%
4.0  Design Cost-Optimized Architectures: 50%
5.0  Define Operationally-Excellent Architectures: 100%
```

##本試験
AWS模擬試験が52%で不安だったがとりあえず本試験を受けてみた。
結果は不合格

受験者スコア: 612 結果: 不合格

合格に必要な最低スコアは 720 なので半分ぐらいはとれたイメージ

##やっておけばよかったと思ったこと
勉強をどのようにすればよいかわからないのでとりあえずUdemyをやったが問題を覚えて解けるようになったという感じです。
問題を解くだけでは試験は厳しいと感じました。
始めて試験を受けるのであればどんな問題がでるか確認のためAWS模擬試験を受けてみてテストのイメージを掴んでいたほうが良いと思います。
AWS模擬試験に似たような問題が教材にあればそれを中心に勉強をすれば良いですね。
AWS Elastic Beanstalkで定期処理実行(cron)

## Heroku Schedulerでできたことを、Elastic Beanstalkでも行いたい
運用しているRailsアプリの本番環境を、HerokuからElastic Beanstalkに移行させました。
その際タスクの定期処理を行う方法で少し苦労したので、メモ的にシェアしておきます。

以前はHeroku Schedulerでrakeコマンドを呼び出せましたが、EBでそれを行うにはEC2内でcronを使うか、ワーカー環境でPOSTメソッドを呼び出す方法があるみたいです。今回は安く済ませたいので、前者を選びました。
後者の方法はこちらが参考になります。
https://qiita.com/tomoeine/items/38a9b2123e3afa1d5cd0

## 方法
このファイルを.ebextensionsに置くだけでOKです。あとは`eb deploy`すれば、自動でcronのファイルを作成し自動実行してくれます。
`eb ssh`で/etc/cron.dを確認してみてください。

```configuration:.ebextensions/cron-sample.config
files: # filesは、EC2上にファイルを作成する。パスはアプリのルートではなくLinuxのルート。
    "/etc/cron.d/hello_world":
        mode: "000644"
        owner: root
        group: root
        content: |
            0 4 * * * root /usr/local/bin/hello_world.sh
 　　　　　　# 指定した頻度で、↓で作成するシェルスクリプトを実行。これは毎日午前4時

    "/usr/local/bin/hello_world.sh":
        mode: "000755"
        owner: root
        group: root
        content: |
            #!/bin/bash
 
            . /opt/elasticbeanstalk/support/envvars # アプリの環境変数読み込み
            cd /var/app/current
 
            /opt/rubies/ruby-2.5.7/bin/bundle exec /opt/rubies/ruby-2.5.7/bin/rake hello_world >> /var/log/hello_world.log 2>&1
            # rakeコマンド打つ。例ではhello_worldというrakeメソッドをすでに定義しているとする。
            # ログも出力。
 
            exit 0
 
commands:
    remove_old_cron:
        command: "rm -f /etc/cron.d/hello_world.bak" # バックアップを削除

```

## 参考
Linux サーバーでのソフトウェアのカスタマイズ
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/customize-containers-ec2.html#linux-files

Ruby on Railsの環境構築をElastic Beanstalkで行う
https://qiita.com/yuyasat/items/4d93b4ad4f86a6e13d50#cron%E3%81%A7rails-runner%E3%82%84rake%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99
Swift Package Managerで'No Such Module'した時の対処法

# はじめに

iOSアプリ開発において、Xcode11からSwift Package Manager(以下、SPM)を公式に使えるようになりました。
導入を検討している人も多いかと思いますが、躓いた箇所があったので対処法の一例としてメモ程度に残しています。


なお、今回の対処法は「[Getting 'no such module' error when importing a Swift Package Manager dependency - Stack Overflow](https://stackoverflow.com/a/58307605)」に記述がありました。

# What

新しくライブラリを導入するにあたりSPMで管理していく方針にしました。

Xcodeで`File → Swift Packages → Add Package Dependency...` と順当にライブラリを取り入れるも

*.swiftファイルで`import Hoge`と書いてもbuildできず、`No such Module`のエラーが出るばかりでした。


# How

以下のスクリプトを`Targets → Build Phases → New Run Script Phase`で`Compile Sources`の手前に記述します


```shell
if [ -d "${SYMROOT}/Release${EFFECTIVE_PLATFORM_NAME}/" ] && [ "${SYMROOT}/Release${EFFECTIVE_PLATFORM_NAME}/" != "${SYMROOT}/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}/" ] 
then
  cp -f -R "${SYMROOT}/Release${EFFECTIVE_PLATFORM_NAME}/" "${SYMROOT}/${CONFIGURATION}${EFFECTIVE_PLATFORM_NAME}/"
fi
```

今回は`Fix SPM`という名称にしました。

<img width="571" alt="Screen Shot.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69911/0d765296-9f86-17dc-07f9-1342dfe1d893.png">


# Why

SPMは暗黙的にXcodeプロジェクトのConfigurationを利用しており現状でデフォルトの`Release`と`Debug`にしか対応していないようなので、ビルドしようとしているConfigurationと異なれば、Release用をコピーすることで解決しています。


Xcodeとしては既知の仕様らしいです。
参考: [Custom build configuration names](https://forums.swift.org/t/custom-build-configuration-names/29167/5)


また、上記サイトでは他の解決策も紹介されていたので是非参考にしてください
参考: [Swift Package Hack - Álvaro Royo - Medium](https://medium.com/@alvaroroyo/swift-package-hack-e75ad56c1a5a)

現状はなんとかなりましたが、もっと最適な解決策があれば教えていただきたいです！
ありがとうございました！
link_to  をブロックで囲って each で回す方法(link_to do ~ end)

```Rails:user/index.html.rb
<% @users.each |user| do %>
　　<%= link_to user_path(user) do %>
　　　	<%= @user.name %>
　　<% end %>
<% end %>

```

上記のように、link_to do〜end で囲えば良い。
docker-composeで簡単に環境構築Apache2.4+PHP7.1+PostgreSQL9.6

# 仕事で上記の環境が必要になったので~~もうやりたくない~~備忘録として残す

## 環境

- Mac for Docker
- Apache2.4
- PHP7.1
- PostgreSQL9.6

## 構成

ディレクトリ構成はこんな感じです。

![スクリーンショット 2019-11-15 16.19.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293438/2993d77c-06f3-6e2c-fc3a-61db24de6bae.png)

## Dockerfile

`docker/web` に `Dockerfile` という名前のファイルを作成し以下の内容で記述

> PHPのバージョンを変えたければFROMの `php:7.3-apache` という風に変えればいけるはず。

```Dockerfile:docker/web/Dockerfile
FROM php:7.1-apache

COPY ./php.ini /usr/local/etc/php/
 
RUN set -ex apk --no-cache add postgresql-dev libpq-dev && \
    apt-get update && apt-get install -y libpq-dev \
    vim \
    less \
    && docker-php-ext-install pdo pdo_pgsql pgsql mbstring
```

同階層で `php.ini` ファイルを作成します。

```php.ini:docker/web/php.ini
[Core]
display_errors = On
error_reporting = E_ALL
error_log = /var/log/apache2/error.log
log_errors = On
 
[Date]
date.timezone = 'Asia/Tokyo'
 
[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = auto
mbstring.http_input = auto
mbstring.http_output = auto
mbsting.encoding_translation = Off
mbstring.detect_order = auto
```

## docker-compose.yml

PostgreSQLのバージョン変えたければ `image: postgres:9.3` の部分を変更してください。
またはポートを変えたいときは `ports: -8110:80` を変更してください。

```yml:docker-compose.yml
version: '3'
 
services:
  web:
    build: ./docker/web/
    ports:
      - 8110:80
    volumes:
      - .:/var/www/html
    depends_on:
      - db
  db:
    image: postgres:9.3
    ports:
      - 5433:5432
    volumes:
      - ./docker/db:/docker-entrypoint-initdb.d
```

## 公開ファイルを編集

適当に今回は `index.php` を上げるので `phpinfo` を表示させよう

```php:index.php
<?php

phpinfo();
```

## 実行

実行してみる

```terminal
docker-compose up -d
```

立ち上がってるか確認してみる

```terminal
$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
0e5271d55548        4b77e94c903a        "docker-php-entrypoi…"   38 minutes ago      Up 38 minutes       0.0.0.0:8110->80/tcp     test_web_1
d7ae129bf106        postgres:9.3        "docker-entrypoint.s…"   38 minutes ago      Up 38 minutes       0.0.0.0:5433->5432/tcp   test_db_1
```

## ブラウザ確認

先ほどのdocker-compose.ymlをそのまま使用している人なら以下のリンクから飛べるはず
[localhost:8110](http://localhost:8110/)

下の画面が表示されていれば成功

![スクリーンショット 2019-11-15 16.39.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293438/31053bbc-8aab-9f6a-b7c1-84bd8f122112.png)

## マシン接続

コンテナ内に入ってみる

```terminal
$ docker exec -it test_web_1 bash

# ls
# docker  docker-compose.yml  index.php
```

## 最後に

**docker-compose.ymlが便利すぎて辛い。**