OmniAICreator/Qiita-1.07M huggingface dataset:
MacBook Airのリカバリーに何度も失敗した原因

#研修環境を新たに作成するためにOSをクリーンインストールしたい

##何度も行なった流れ
<kbd><kbd>command</kbd>+<kbd>R</kbd></kbd>を押下しながら再起動すると macOSユーティリティが起動します。
1. 「ディスクユーティリティ」でSSDをフォーマットします。
2. 「macOSを再インストール」を使って順次進んでいき再インストールします。
3. 完了！
となるはずでしたが、最後の最後で「インストールの準備中にエラーが起きました。このアプリケーションをもう一度実行してください」と表示され何度行ってもそこから先に進みませんでした。

Googleでこのエラーメッセージを検索すると、「日付の設定が2001年などになっているのでターミナルから現在時刻に戻すとOK」という記事がいくつかヒットします。もしくはおきまりのNVRAMやPRAMのリセットもでてきます。どれもうまくいきませんでした。

##現状の環境
実は、このMacBook AirにはHigh SierraをインストールしていてAPFSでフォーマットしていました。なのに<kbd><kbd>command</kbd>+<kbd>R</kbd></kbd>で再起動すると何度もSierraのインストーラが起動しています。インストーラログを確認するとインストール先のドライブ（私の環境ではdisk2s1)などにエラーが発生していました。この内容を残していなかったのが残念ですが
GUID 〜　と表示されています。

##原因の推測
確証はありませんが、APFSでフォーマットしていたSSDをSierraのインストーラではきちんと再フォーマットや取り扱いできないようです。最初から、クリーンインストールするOSを決めていればよかったのですがひとまずリカバリしてからOSのアップデートを考えていました。

##リカバリーのショートカット
Sierra以降をインストールしたことがある場合は３つの復元が選べるようです。
<kbd><kbd>command</kbd>+<kbd>R</kbd></kbd> 
お使いのMacにインストールされていた最新のmacOSをインストールします。

<kbd><kbd>option</kbd> + <kbd>command</kbd> + <kbd>R</kbd></kbd>
お使いのMacと互換性のある最新のmacOSにアップグレードします。

<kbd><kbd>shift</kbd> + <kbd>option</kbd> + <kbd>command</kbd> + <kbd>R</kbd></kbd>
お使いのMacに当初付属していたmacOS、またはそのバージョンに一番近い、現在も利用可能なバージョンをインストールします。
参考：[macOS 復元から macOS を再インストールする方法](https://support.apple.com/ja-jp/HT204904)

##成功した方法
本来私のMacにはHighSierraを入れていたので<kbd><kbd>command</kbd>+<kbd>R</kbd></kbd> でも High SierraがインストールされるはずなのですがなぜかSierraになっていました。それで<kbd><kbd>option</kbd> + <kbd>command</kbd> + <kbd>R</kbd></kbd>で復元を行いました。そうするとMojaveのインストーラが実行され無事に起動しました。
もともとの「インストールの準備中にエラーが起きました。」で検索して解決された方々もレアな症状と書かれていたのでそれで対応できなかったこの状況はさらにレアかもしれません。
Laravel Dusk + AngularJSで自動テスト

# きっかけ
現在フロントをAngularJS、サーバサイドをLaravel開発しています。
サーバサイドには自動テストを導入していますが、画面のテストは未導入だったので、試してみました。
私はサーバサイドを作っており、AngularJSを全く理解していないので、ご了承ください。

# 環境
Laravel5.6 + PHP7.2
AngularJS
Vagrant(AmazonLinux2)

# ログインテストを作る
## インストール
インストールは下記を参照しました。
https://laravel.com/docs/5.6/dusk#installation

## AppServiceProviderに追記

```  AppServiceProvider.php
class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     * @see \Clockwork\DataSource\EloquentDataSource::createRunnableQuery()
     * @see LoggerCustomize
     */
    public function boot()
    {
        // 'local' または 'develop' の場合
        if (app()->isLocal() || app()->environment() == 'develop') {
            $this->app->register(DuskServiceProvider::class);
        }
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}
```

bootメソッドに`$this->app->register(DuskServiceProvider::class);`を追記しないとphp artisan duskが使えませんでした。
laravel duskは本番環境では使用しないため、環境が`local`または`develop`の場合のみ適応されるようにしています。
`app/config`の`app.php`に記載しても動くと思いますが、本番環境では動かさないようにするため、`AppServiceProvider.php`に記載しています。

## テストを記述する
下記のコマンドを叩いてテストを作成します。

```
 php artisan dusk:make LoginTest
```

はじめにLoginTest.phpには下記のテンプレが入っています。

``` LoginTest.php
<?php

namespace Tests\Browser;

use Tests\DuskTestCase;
use Laravel\Dusk\Browser;
use Illuminate\Foundation\Testing\DatabaseMigrations;

class LoginTest extends DuskTestCase
{
    /**
     * A basic browser test example.
     *
     * @return void
     */
    public function testBasicExample()
    {
        $this->browse(function (Browser $browser) {
            $browser->visit('/')
                    ->assertSee('Laravel');
        });
    }
}
```

こんな感じで書き換えてみます。

``` LoginTest.php
<?php

namespace Tests\Browser;

use Tests\DuskTestCase;
use Laravel\Dusk\Browser;
use Illuminate\Foundation\Testing\DatabaseMigrations;

class LoginTest extends DuskTestCase
{
    /**
     * A basic browser test example.
     *
     * @return void
     */
    public function testLogin()
    {
        $this->browse(function (Browser $browser) {
            $browser->visit('/login')
                ->pause(5000)
                ->assertSee('ユーザーID')
                ->assertSee('パスワード')
                ->screenshot('login_1')
                ->type('input.ss-input[type="text"]', 'ユーザー名')
                ->type('input.ss-input[type="password"]', 'パスワード')
                ->press('ログイン')
                ->pause(5000)
                ->assertSee('ダッシュボード')
                ->screenshot('login_2');
        });
    }
}
```
`type`の第一引数には入力フィールド、selectorを指定できます。

`value`というメソッドでvalueを直接入れることもできますが、AngularJSで制御している部分に引っかかってログインできませんでした。
`type`を使うと実際にキーボードからタイピングしているような動きをするらしく、うまくいきました。

`pause(5000)`は画面が表示されるまで待つために入れています。
このselectorが出るまで待つという方法もあります。(`waitFor`メソッド)

# やってみて
便利ですね。AngularJSだけでなく、何で書かれていてもテストできるみたいなので、レガシーなwebアプリでも使えそうです。
画面もちゃんとテストコードを書いて、テスト自動化できたらいいなと思っています。
laradockではまだうまく言っていないので、次はlaradockで動かしてみたいなと思っています。

コメント、編集リクエストいただけると嬉しいです。
ローカルからリモートホストのJMXへSSHポートフォワーディング経由で接続する

## Tomcatへの設定追加
catalina.shに対して以下の設定を追加します。
※改行せず、1行でつなげます。

```
CATALINA_OPTS="$CATALINA_OPTS  -Dcom.sun.management.jmxremote=true 
-Dcom.sun.management.jmxremote.port=8180 
-Dcom.sun.management.jmxremote.rmi.port=8181 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false 
-Djava.rmi.server.hostname=localhost"
```

## SSHポートフォワーディング設定
Teratermの場合は、以下の通り設定します。
1つ目：ローカルのポート：8180 リモート側ホスト：JMXを参照したいホスト ポート：8180
2つ目：ローカルのポート：8181 リモート側ホスト：JMXを参照したいホスト ポート：8181

![image.png](https://qiita-image-store.s3.amazonaws.com/0/64876/e1587372-f6cc-47cc-b92d-5e7a7f2d915c.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/64876/38157ffe-bd3f-44a0-b742-d085be76f46c.png)


## jconsoleからJMXへ接続

jconsoleを起動します。
次に、「リモートプロセス」を選択し、「localhost:8180」と入力し、「接続」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/64876/ff48b453-9e66-24df-66ee-7ff153512d4f.png)
GolangのDefer, Panic, Recoverについて、自分なりに理解したことを書く

最近趣味でGoを触り始めたSE。
表題のエラー処理（Panic, Recover, Defer）について自分なりに理解したことを残す。

# Defer

呼び出されたときに、最後に必ず実行されるべき処理を書いておく。
（DB ConnectionのClose処理とか）

```golang
package main

import (
	"fmt"
)

func main() {
	fmt.Println("Begin main")
	DeferFunc()
	fmt.Println("End main")
}

func DeferFunc() {
	defer func() {
		fmt.Println("End func")
	}()
	fmt.Println("Begin func")
}
```

実行結果

```bash
$go run ./main.go
Begin main
Begin func
End func
End main
```

# Panic

`panic("HogeHoge")` すると、deferの処理を呼び出してcloseする。

```golang
func DeferFunc() {
	defer func() {
		fmt.Println("End func")
	}()
	panic("HogeHoge")
	fmt.Println("Begin func")
}
```

```bash
$go run ./main.go
Begin main
End func        # Panicすると、以降の関数内の処理が呼ばれない
panic: HogeHoge # Panicの内容が表示され、

goroutine 1 [running]:
main.DeferFunc()
        /opt/recover/main.go:17 +0x5c
main.main()
        /opt/recover/main.go:9 +0x6d
exit status 2
```
`panic("HogeHoge")` 以降の処理が実行されず、deferを実行してRuntimeエラーを起こして死ぬ。

# Recover

deferの処理内で、errorを扱うときに使用？また、Recoverを実行すると、プロセスは死なない模様。

```golang
func DeferFunc() {
	defer func() {
		fmt.Println("End func")
		if err := recover(); err != nil {
			fmt.Println("Runtime Error:", err)
		}
	}()
	panic("HogeHoge")
	fmt.Println("Begin func")
}
```

```bash
$go run ./main.go
Begin main
End func
Runtime Error: HogeHoge  # Recover処理の中身
End main                 # End mainが呼ばれている
```

# 分からなかったこと

- Recoverしたけど再度Panicでプロセスを殺したい場合（Exceptionの種類に応じてRecoverするか、Errorにして落とすかみたいなことができるのか）

以上
アロー関数を世界一わかりやすく説明

##アロー関数とは
最近導入された、関数の新しい書き方。
ざっくりいうと関数が簡単にかけるよってこと。

##実際のコードの違い
function式 (今までの書き方)：

```js
const test = function(x) {return x * 2}
```
アロー関数 (新しい書き方)：

```js
const test = (x) => x * 2  //本体が単一の式
//または：
const test = (x) => { return x * 2 } //本体が文
```

##補足
- 引数が一つの時は、

```js
const test = x => x * 2
```
このように（）を省略しても良い

- 引数がない場合は、（）を省略してはいけない。

```js
const test = () =>  {console.log(this)}
```
##終わりに
thisの取り扱いの注意とかもありますが難しいので別記事で取り上げます。
ActiveRecordのEnumの取り扱い方

## 概要
ActiveRecordを継承したモデルへの値の格納の仕方や、値を入力した際にどのバリデーションに反応したのか調べた


### 前提条件

Rails: 5.2
Ruby: 2.6.1

# 本題
サンプルのユーザテーブルの定義


```
create_table :users do |t|
  t.string :name
  t.integer :state
  t.timestamps
end
```

ユーザモデルの定義

nameの空文字チェックのバリエーションがある

```
class User < ApplicationRecord
  validates :name, presence: true
  enum state: { show: 0, hide: 1 }
end
```


モデルを一つ取得し、これをもとに説明する

```
> u = User.first
  User Load (0.2ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<User id: 2, name: "テスト1", created_at: "2019-01-29 03:56:08", updated_at: "2019-03-11 02:52:09", state: "hide">
```

### stateを単純に出力すると、DBに格納されている数値ではなく、enumで定義した文字列が表示される

```
> u.state
=> "hide"
```

### 代入方法

enumで定義したシンボルでも、文字列でも、DBに実際に格納される数値でも代入できる


シンボルの場合

```
u.state = :hide
=> :hide
irb(main):038:0> u.state
=> "hide"
```

文字列の場合

```
u.state = "show"
=> "show"
irb(main):046:0> u.state
=> "show"
```

数値の場合

```
> u.state = 0
=> 0
> u.state
=> "show"
```

### 定義外の値を代入すると
enumで定義した範囲外の数値を代入しようとするとエラーになる

```
> u.state = "show2"
ArgumentError ('show2' is not a valid state)

irb(main):047:0> u.state = "show2"
Traceback (most recent call last):
        1: from (irb):47
ArgumentError ('show2' is not a valid state)

> u.state = :show2
ArgumentError ('show2' is not a valid state)

> u.state = 2
ArgumentError ('2' is not a valid state)
```

### 格納されている実際の値を参照する

デバッグやテストのときなど`u.state`とすると実際にどの値が格納されているか確認したい場合は
`read_attribute_before_type_cast`や`属性名_before_type_cast`を使う

```
> u.state
=> "hide"

 u.read_attribute_before_type_cast(:state)
=> 1
irb(main):070:0> u.state_before_type_cast
=> 1
```
VirtualBox 上にマウントした共有フォルダ内でシンボリックリンクを利用する

共有フォルダで npm install 等を行う際に必要となったのでメモ

# 環境

* ホストOS ： Windows 10 pro
* ゲストOS ： Ubuntu 16.04
* Oracle VM VirtualBox 5.2.24 r128163 (Qt5.6.2)

# 手順

1. VirtualBox は閉じておく

1. ホスト側でコマンドプロンプトを立ち上げる
2. VM 名リストを取得

    ```
    $ "C:\Program Files\Oracle\VirtualBoxVBoxManage" list vms
    ```

3. 対象 VM の設定を変更

    ```
    $ "C:\Program Files\Oracle\VirtualBoxVBoxManage" setextradata [VM名] VBoxInternal2/SharedFoldersEnableSymlinksCreate/[共有フォルダ名] 1
    ```

    例：

    ```
    $ "C:\Program Files\Oracle\VirtualBoxVBoxManage" setextradata Ubuntu16.04 VBoxInternal2/SharedFoldersEnableSymlinksCreate/share 1
    ```

4. SharedFoldersEnableSymlinksCreate を確認

    ```
    $ "C:\Program Files\Oracle\VirtualBoxVBoxManage" getextradata [VM名] enumerate
    Key: GUI/LastCloseAction, Value: SaveState
    Key: GUI/LastGuestSizeHint, Value: 1072,866
    Key: GUI/LastNormalWindowPosition, Value: -1079,-201,1072,908
    Key: VBoxInternal2/SharedFoldersEnableSymlinksCreate/share, Value: 1
    ```

5. VirtualBox を管理者として実行（右クリック => 管理者として実行）

以上
ビット演算を覚えればlinuxのパーミッションの数字が理解できる

# TL;DR

linuxでパーミッションを変更したい場合数字で指定することが多いですよね。
でもエンジニアなりたての人等は、パーミッションの意味は理解してても、パーミッションの数字については訳分からん状態だと思います。
例えば↓とか

- `777 (rwxrwxrwx)`
- `755 (rwxr-xr-x)`
- `744 (rwxr--r--)`
- `644 (rw-r--r--)`

**( ﾟДﾟ)ﾊｧ?**　　
って感じですよね。

そんな人でもビット演算の方法を学べば、パーミッションの数字が理解できます！

# ビット演算とは？
ざっくり言うと2進数の計算です。

## 2進数って？
`0`と`1`で表す数字です。

例えば10進数の`0～9`を2進数で表す場合は以下

|10進数|2進数|
|---|---|
|0|0|
|1|1|
|2|10|
|3|11|
|4|100|
|5|101|
|6|110|
|7|111|
|8|1000|
|9|1001|

## 2進数の法則
上の表でお気づきの方もいるかと思いますが、2進数にはある法則があります。
それは **2の累乗は一番左の値のみ1になり、0が1つずつ増えていく** というものです。
例えば上の表から2の累乗を抜き出したものが以下の表

|10進数|2進数|
|---|---|
|2|10|
|4|100|
|8|1000|

位が1つずつ増えてますよね。

## ビット演算の方法
ビット演算ではこの2の累乗を基準に計算をします。

例えば以下の2進数があったとします。
- `1111`

これを10進数に直す計算として、まずは分かりやすく2進数を分解してみます。

```
# 頭の0は計算に関係ありません。桁数をそろえるために分かりやすくしています。
1000
0100
0010
0001
```

それぞれを10進数に直すと

```
1000 => 8
0100 => 4
0010 => 2
0001 => 1
```

ですね。
あとは10進数に直した数字を足すと……

```
1	1	1	1  ←2進数
8	4	2	1  ←10進数
```

となり`1111`は`15`ということが分かります。

## で、それが何になるんや？
はい、本題はlinuxパーミッションの数字の意味でしたね。

linuxのパーミッションは`rwx`で表されます。
これはある言葉の一文字を取ったものです。

|文字|意味|
|---|---|
|r|read（読み込み）|
|w|write（書き込み）|
|x|exec（実行）|

`ls -al`でディレクトリをのぞいてみると、`drwxrw-r-x`みたいな文字が左部にあると思います。
全部つながっているので分かりづらいですが、区切るとこんな感じ。

```
d/rwx/rw-/r-x
```

|文字|意味|
|---|---|
|d|ディレクトリを表す（ファイルなら`-`）|
|rwx|rootのパーミッション|
|rw-|グループのパーミッション|
|r-x|その他ユーザーのパーミッション|

**※rootやグループ等のパーミッション範囲については割愛します。**

先ほどからちらほら出ていますが、`-`という表記がありますよね？
これはパーミッションがない状態を表しています。
そして実はこれ、2進数を表しています。

各パーミッションがついている状態を2進数で表すと

|パーミッション|2進数|10進数|
|---|---|---|
|r--|100|4|
|-w-|010|2|
|--x|001|1|

ここまで見ていただいた方はピンときたのではないでしょうか。
そうです、`chmod`では2進数を使い、パーミッションを指定しているのです。

例えば、rootに全権限を持たせる場合は`rwx => 4 + 2 + 1`で`7`。
その他ユーザーには読み込み権限だけ与える場合は`r-- => 4 + 0 + 0`で`4`となります。

# 最後に
慣れるまでは、`rwx`は2進数で`111`、`r-x`は2進数で`101`という風に変換し、あとはビット演算で計算する、という風にビット演算で慣れつつもパーミッションの数字を覚えてもらえればと思います。
stm32f4-discoveryの作法 その3

#概要

stm32f4-discoveryの作法、調べてみた。
Lチカやってみた。

#サンプルコード


```
#include "stm32f4_discovery.h"

GPIO_InitTypeDef GPIO_InitStructure;
void Delay(__IO uint32_t nCount)
{
	while(nCount--)
	{
	}
}
int main(void)
{
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOD, &GPIO_InitStructure);
	while (1)
	{
		GPIO_SetBits(GPIOD, GPIO_Pin_12);
		Delay(0x3FFFFF);
		GPIO_SetBits(GPIOD, GPIO_Pin_13);
		Delay(0x3FFFFF);
		GPIO_SetBits(GPIOD, GPIO_Pin_14);
		Delay(0x3FFFFF);
		GPIO_SetBits(GPIOD, GPIO_Pin_15);
		Delay(0x7FFFFF);
		GPIO_ResetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
		Delay(0xFFFFFF);
	}
}

```

以上。
ブロックチェーン初心者がブロックチェーンエンジニアになるまで

#このサイトの目的
ブロックチェーンに関して全くの初心者である私がブロックチェーンエンジニアになるために必要だと思ったことを記録して行こうと考えています。
スマートコントラクトとは？スマートコントラクト開発、DAppsとは？DApps開発の環境設定や設計、DAppsの開発などを投稿していきたいと考えています。

#参考図書
「[試して学ぶスマートコントラクト開発](https://www.amazon.co.jp/%E8%A9%A6%E3%81%97%E3%81%A6%E5%AD%A6%E3%81%B6-%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%82%B3%E3%83%B3%E3%83%88%E3%83%A9%E3%82%AF%E3%83%88%E9%96%8B%E7%99%BA-%E5%8A%A0%E5%B5%9C-%E9%95%B7%E9%96%80/dp/4839966885)」 DMM.comブロックチェーン研究所

上記の図書を自分なりにまとめる形で勉強していこうと思います。
Blockchainの最前線で活躍されている方々が書かれた本なので
皆さんもよかったら購入してみてください。

本を読んでみて自分なりにまとめたので参考にしてみてください。

１：[スマートコントラクトとブロックチェーン](https://qiita.com/YosukeAramaki/items/e76e64d44d602fd9143c)
２：[スマートコントラクト開発の基本](https://qiita.com/YosukeAramaki/items/bfeb29b5a627bb2bb320)
３：[DApps開発におけるUX](https://qiita.com/YosukeAramaki/items/fae3bbcc0c3a98b20377)
４：[DApps開発環境](https://qiita.com/YosukeAramaki/items/99a1435f6b8f220247d0)
*5~ は要約のような形になっています
５：[クエストの設計](https://qiita.com/YosukeAramaki/private/34d13807f8a3b18b0866)
６：[テストの手法](https://qiita.com/YosukeAramaki/private/e5aad8ed61fc8e25e7d8)
７：[DAppsのWebアプリケーション](https://qiita.com/YosukeAramaki/private/6e4ce127a31306a5149d)
８：[テストネットへのデプロイ](https://qiita.com/YosukeAramaki/private/46760218b17501376051)
・・・・

#追加学習
本で学んだことをもとにプロトタイプを作成しようとしましたが、

・コントラクトの設計（コーディングの仕方）
・フロントエンドとブロックチェーンの繋ぎ方
などは本に記載が少なく、勉強が必要だなと感じました。

主に[dApps University](https://www.youtube.com/channel/UCY0xL8V6NzzFcwzHCgB8orQ)をもとに勉強しました。
コントラクトの開発からフロントエンドまで一貫して説明してあり、かなり理解が深まりました。

１から説明されていた下記の２つのサイトで自分は勉強しました。

[How to Build Ethereum Dapp (Decentralized Application Development Tutorial)](https://www.youtube.com/watch?v=3681ZYbDSSk&t=148s)
[Code Your Own Cryptocurrency on Ethereum](How to Build Ethereum Dapp (Decentralized Application Development Tutorial))(ERC20を使ってTokenを発行するまでの動画ですが基礎力は身につくと思います。)

自分はReactも勉強したかったので、Reactを使ったTodo Listの作成の動画でも勉強しました。
[Ethereum Dapp with React JS - Ethereum/React Todo List](https://www.youtube.com/watch?v=AiWkkj8lSTc)


ブロックチェーンエンジニアの道のり（随時サイトを追加していきます）
可変サイズ・複数行にも対応 Flexboxを使った上下左右中央揃え

ベンダープレフィックス(-webkit-)は古いsafariやiOS・AndroidでFlexboxを効かせるために書いてます

```css
.center_box {
    display: -webkit-flex;
    display: flex;
    -webkit-flex-direction: column;
    flex-direction: column;
    -webkit-justify-content: center;
    justify-content: center;
    -webkit-align-items: center; /* 左右中央揃えにしたくない場合は削除 */
    align-items: center; /* 左右中央揃えにしたくない場合は削除 */
}
```
```html
<div class="center_box">
<h1>center_boxで囲ったこれらの要素は上下左右中央揃えで表示されます</h1>
<p>複数行でも大丈夫です</p>
<img src="hoge.jpg" alt="画像もOK">
</div>
```
## こんなときに

- メインビジュアルの上にテキストを乗せたい
- 画像を真ん中に置きたい
Laradockでlaravel入門

## ディレクトリを作成する

```shell
$ mkdir project
$ cd project
```

## Laravel のインストール(最新版)
```shell
composer create-project --prefer-dist laravel/laravel src
```

## Laradockをgithub からクローン

```shell
$ git clone https://github.com/Laradock/laradock.git
$ cd laradock
```

## .env(Laravel)修正

```diff:src/.env
- DB_HOST=127.0.0.1
+ DB_HOST=mysql
- DB_DATABASE=homestead
+ DB_DATABASE=default
- DB_USERNAME=homestead
+ DB_USERNAME=root
- DB_PASSWORD=secret
+ DB_PASSWORD=root
```

## .env(Laradock)の編集

```shell
$ cd laradock
$ cp env-example .env
```

```diff:laradock/.env
- APP_CODE_PATH_HOST=../
+ APP_CODE_PATH_HOST=../src
- NGINX_HOST_HTTP_PORT=80
+ NGINX_HOST_HTTP_PORT=8001
- MYSQL_VERSION=latest
+ MYSQL_VERSION=5.7
```

## docker-compose up

```shell
docker-compose up -d nginx mysql workspace
```

設定が完了したら、`localhost:8001`にブラウザからアクセスしてみましょう！
↓の画面が表示できていると思います。

これで、開発環境の構築は終了です。

![スクリーンショット 2019-03-18 11.40.52.png](https://qiita-image-store.s3.amazonaws.com/0/129444/401c7493-6fab-a890-a2e5-80e0cc0ab3c4.png)


# おまけ
Laravelで認証機能(ログイン機能)を実装するときの手順もまとめておきました。

## 認証機能の作成

```shell
# workspaceコンテナに入る
docker-compose exec workspace bash

# 認証機能のための準備
php artisan make:auth

# マイグレーション実行
php artisan migrate
```

認証機能(ログイン機能)が実装されました！
![スクリーンショット 2019-03-18 13.04.59.png](https://qiita-image-store.s3.amazonaws.com/0/129444/a812d1cb-c447-f4e3-664d-9b454010063d.png)
GCP上でPostgreSQLインスタンスをさくっと構築する

# 概要
2019/3/11時点でGCP上でPostgreSQLインスタンスを構築する手順を紹介します。

# ナビゲーションメニューから「スタートガイド」を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/367069/1cbb8615-4646-6ed2-5a5e-3dba509cc5f0.png)

# スタートガイドから「Cloud SQL」を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/367069/dad88719-2567-eae7-431e-252fbf8e1288.png)

# Cloud SQL インスタンスから「インスタンスを作成」を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/367069/4a19ce03-a295-971a-8aec-3126fc793c7e.png)


# データベースエンジンの選択から「Choose PostgreSQL」を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/367069/c2348ed2-8e55-f8af-7a18-0fcedf666e96.png)

# Create a PostgreSQL instanceの選択から「Choose PostgreSQL」を選択
* 1.インスタンス IDの入力
* 2.デフォルトのユーザー パスワードの入力
* 3.ロケーションの選択
* 4.上記以外は全てデフォルト(設定オプションの変更はなし)
* 5.作成ボタンを選択
 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/367069/7c24d0bb-0d70-1e1a-4ac5-66dbda8dbecd.png)

# インスタンスが作成されたことを確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/367069/7ebbaf89-4bcd-5fed-9e11-ee70084d53c6.png)

# まとめ
* 数ステップの手順で簡単にPostgresSQLインスタンスを構築することができました。
* インスタンスの作成の待ち時間を含めて、2,30分で簡単に作れてしまうので便利ですね。
【Bracketsのカスタマイズ】「作業中ファイル」の邪魔な高さ制限を突破

知名度はあまり高くないけど、個人的に愛用しているエディタ、[Brackets](http://brackets.io/)についての自分用メモ。
知名度低さからか、いくらググってもHowToのブログとか日本語文献が殆どないので、ここに残すよ (`・ω・´)

#問題

（やや重いという点を除いて）とても素敵なエディタなのだが、1点、どうしても不便を感じる仕様が。
複数ファイルを開くタブのような機能である「**作業中ファイル**」欄。
![sagyochu.png](https://qiita-image-store.s3.amazonaws.com/0/240702/27399cb1-2d45-75b2-6cea-f0603d613d3d.png)


これ、ファイルをたくさん開きすぎると**邪魔な高さ制限**がついていて地味に不便なのだ。
![sagyochu2.png](https://qiita-image-store.s3.amazonaws.com/0/240702/fd080495-57f8-411f-1f2a-1c76eab118f2.png)
スクロールしないとファイル群全体を見渡せないし、なんかファイル続けて複数閉じる時急に順番変わって閉じ間違えるし…　※Bracketsユーザならきっとわかる。


#解決…？

Bracketsの先進的で凄い所でもあるのだが、実は**エディタ自体がHTML、CSS等で実装**されていて、エディタを開いた状態で`F12`キーを押すと、見慣れた画面が出る。ここをいじれば、実はカスタマイズもできる。
![sagyochu3.png](https://qiita-image-store.s3.amazonaws.com/0/240702/49cdf6d3-b8e1-c045-691c-23ede980375f.png)
でも、私が知らないだけか、この`F12`で変更した結果は、**次回起動時、維持されない**。なんか「Sources」タブから「Save」できそうなボタンもあったが、押しても何も起こらなかった (´・ω・`)

だったら、**Brackets内臓のCSSファイルを直接編集しちゃおう！**
（もちろんBrackets自身でもできるし、他のでもOK！　~~でもメモ帳はBOMがこわいからイヤ~~ 自己責任で！）


#解決！！
BracketsのCSSは、`brackets.min.css`というファイルが司ってるみたい。
DevToolsを探してみると、そのパスが載っていたから、それを直接開くよ！

私の場合は
`C:\Program Files\Brackets\www\styles\brackets.min.css`
だった(`・ω・´)みんなも似たような場所にあると思う…



##まずアクセス権
いきなり`C:\Program Files\Brackets\www\styles\brackets.min.css`を編集・保存しようとすると、
アクセスが許可されていないので保存できません。そりゃそうよね…
だから、まずファイルに一般ユーザのアクセス権を与える。

1. そのファイルを**右クリック**
2. **プロパティ→セキュリティ→編集→一般Userのアクセス権許可**（フルコントロールとか与える）


##いよいよ編集

問題の高さ制限箇所は、セレクタ`.open-files-container`の中の、`max-height:200px`が原因みたい。
こいつめ！

**`.open-files-container` のCSSを、より大きいpx等お好みの値に書き替えよう！**

【例】
　－: `max-height:200px`
　＋: `max-height:500px`

そして、忘れず保存。
ていうか一緒に`resize: vertical`も付けると強力(\`；ω；´)

#あとがき
あ、Bracketsでも`vh`（viewport units）とか使えるのかな…　試してないや(´・ω・\`)

ともあれ、これでホラ！！　大成功！！！
![sagyochu4.png](https://qiita-image-store.s3.amazonaws.com/0/240702/e93b2559-33a2-65ad-364f-7286b35efb9a.png)
（会社のWin7パソコン、圧倒的ペイントマウスクオリティ…）

アプデしたら戻っちゃいそうだから、もし戻っちゃったらまたここ見よう。
とりあえずこれで様子見。



#追記：そもそもなんでこんな仕様？
私は個人趣味でファイルを1つずつちまちま書く程度の一般素人なのだけど、
IT企業が大規模開発で実用する時は、プロジェクトの**フォルダをまるごと開く**ことが多いみたい。

Bracketsには、フォルダをまるごと「Brackets project」として開く機能がついていて、開いたフォルダは「作業中ファイル」欄の下に表示される。

公式にはそっちの機能の方を推しているようで、そっちの欄の方がメインになることを想定して、「作業中ファイル」欄は小さく表示される設計にしてあるのだろうな、と思ふ(´・ω・`)
言語処理100本ノックにElixirでチャレンジ！　5

縁あって、東京ですけど、fukuoka.ex でElixir癒されるぅー！と叫んでる[YOSUKENAKAO.me](https://twitter.com/YOSUKENAKAO)です。

普段は、ハッカソン等のイベントの運営をしたり、新規事業が中々うまく進まないといった悩みに対して、バックキャスティング思考のプロセスを導入する事で、社員とチームの生産性を高める教育をし、その後、企業の文化にあったオリジナル教材を開発して定着化させる事の支援をしています。

現在は、世界で活躍できるエンジニアの育成を目指して事業を仕込み中です。
仲間募集中なので、是非、今の日本に一石を投じたい方はDMください。

fukuoka.exのpiacereさんが書かれたElixirのチュートリアル[Excelから関数型言語マスター1回目：データ行の”並べ替え”と”絞り込み”
](https://qiita.com/piacere_ex/items/6714e1440e3f25fb46a1)は非常に入りやすい教材なのでお勧めです。第７回まであるので、まだやっていない方は是非トライしてみてください。

## 言語処理100本ノック
東北大学の 乾・岡崎研究室のトレーニング教材である「言語処理100本ノック」というものを見つけて、学習教材として良さげだったので、Elixirで挑戦して見ました。
[言語処理100本ノック](http://www.cl.ecei.tohoku.ac.jp/nlp100/)
長いので、ちょっとずつ進めて行きます。

ぜひ、皆さん、チャレンジして見てください。そして、こんなやり方もあるよーと教えてください。

1-4までやったのはこちらに書いてあります。[言語処理100本ノックにElixirでチャレンジ！ 1-4まで](https://qiita.com/Yoosuke/items/46c057f9f44f08c9dfce)

今回はその続きを挑戦！

## 第1章: 準備運動

### 05. n-gram
与えられたシーケンス（文字列やリストなど）からn-gramを作る関数を作成せよ．この関数を用い，"I am an NLPer"という文から単語bi-gram，文字bi-gramを得よ．

---
はい、今回は正直これでいいのかな？と悩みながら、というのもn-gramというのを初めて知ったもので、何それ？
美味しいの？というレベルからの挑戦ですw

という事で、こんなやり方あるよーとか、こう書いたらもっといいよーというのがありましたら、是非教えて下さい。

```elixir

defmodule N_gram do

  def gram(sequence) when is_list(sequence) do
    sequence
    |> word_to_char
  end

  def gram(sequence) when is_binary(sequence) do
    string_to_list(sequence)
    |> char
  end

  def char_bigram(sequence) do
    list = gram(sequence)
    [ _head | bigram ] = Enum.zip([["*BOS*"]++list,list])
    |>Enum.map( fn x -> (Tuple.to_list(x))end)
    bigram
  end

  def word_bigram(sequence) do
    list = word(sequence)
    [ _head | bigram ] = Enum.zip([["*BOS*"]++list,list])
    |>Enum.map( fn x -> (Tuple.to_list(x))end)
    bigram
  end

  defp word(sequence) do
    case is_binary(sequence) do
      true -> string_to_list(sequence)|>String.split
      false -> sequence
    end
  end

  defp char(sequence) do
    string_to_list(sequence)
    |> String.split("",trim: true)
    |> word_to_char
  end

  defp word_to_char(list) do
    Enum.reduce(list,fn (x, acc) -> acc <> x end)
    |> String.codepoints
    |> Enum.take_every(1)
  end

  defp string_to_list(sequence) do
    String.replace(sequence,~r/[,.]/,"")
  end

end
```

今回作ったのは、N_gramモジュールに3つの関数を作りました。

1. gram関数
2. char_bigram関数
3. word_bigram関数

## gram関数の実行

```elixir
 input = "I am an NLPer"
 N_gram.gram(input)
 ["I", " ", "a", "m", " ", "a", "n", " ", "N", "L", "P", "e", "r"]

```

## char_bigram関数の実行

```elixir
N_gram.char_bigram(input)
[
  ["I", " "],
  [" ", "a"],
  ["a", "m"],
  ["m", " "],
  [" ", "a"],
  ["a", "n"],
  ["n", " "],
  [" ", "N"],
  ["N", "L"],
  ["L", "P"],
  ["P", "e"],
  ["e", "r"]
]
```

## word_bigram関数の実行

```elixir

N_gram.word_bigram(input)
[["I", "am"], ["am", "an"], ["an", "NLPer"]]
```

## 言語処理って面白い！

さて、言語処理系に縁がなかったので、今回まだ５ですが、面白いなぁ、と実感しつつ、
同時に大変！w

と思っていた所、なんでも、自然言語処理系が簡単に扱えるCOTOHA APIというものがあるらしいぞ！という事を知ったので、言語処理100本ノックを続けつつ、COTOHA APIをElixirから動かすのもチャレンジして行きたいと思います。

[COTOHA API](https://api.ce-cotoha.com/contents/community/)についは以下、参照してください。僕もこれから勉強します。
LISTAGG関数の新機能を試す（Oracle Database 19c）

# LISTAGG関数
行列の入れ替えを行う関数としてLISTAGGがあります。この関数は取得した行データを単一の文字列に連結します。以前、結果の文字列が桁あふれした場合の対応方法について、[Oracle Database 12c の新機能] (https://qiita.com/plusultra/items/fc0ccc88490761b206fe) として書きました。

# Oracle Database 19cの新機能
Oracle Database 19cでは、この関数にDISTINCT句を指定して、出力データに一意性を指定できるようになりました。省略時は従来通りすべてのデータを出力します。この動作を明示するために、ALL 句を指定することもできます。

[Oracle Database 19c新機能ガイド](https://docs.oracle.com/en/database/oracle/oracle-database/19/newft/new-features.html#GUID-CFB4F552-9E21-474D-A93C-DDB32651D711)


## 元データ
簡単なデータを用意します。Oracle Database 19cはまだオンプレミス版が提供されていないため、[LiveSQL](https://livesql.oracle.com/)　を使っています。data1テーブルのc2列を行列変換します。

![全データ](https://qiita-image-store.s3.amazonaws.com/0/181284/00c7ba38-9d2b-ec2a-3f87-cc2f8b32a04e.png)


## DISTINCT句
DISTINCT句を使ってc2列の値を一意にまとめて出力しています。

![DISTINCT](https://qiita-image-store.s3.amazonaws.com/0/181284/4d83298a-d37e-e34a-19dc-79fddcab6b91.png)


## ALL句
DISTINCT句の替わりにALL句を指定するか省略すると従来通りの出力になります。
![LISTAGG03.png](https://qiita-image-store.s3.amazonaws.com/0/181284/65138fd8-58ea-6ac1-255d-0846eb0a532c.png)



## ソート順
WITHIN GROUP (ORDER BY)句と組み合わせることで出力順序を指定することもできます。これは従来と同じ動作です。

![WITHIN GROUP (ORDER BY)](https://qiita-image-store.s3.amazonaws.com/0/181284/e2bac2d3-322d-2365-d5fb-5b3b073e68fa.png)
Airflow における CeleryExecutor

## はじめに

- このエントリーでは Airflow の Executor のうち CeleryExecutor の概要について扱います
- Airflow 1.10.2 の CeleryExecutor では当稿執筆現在依存性の問題が発生しています
    - Airflow では以下のように指定されています `celery>=4.1.1, <4.2.0`
    - Celery 4.1.1 では以下のように指定されています `redis>=2.10.5`, `kombu >= 4.0.2`
    - kombu の最新版である 4.4.0 では以下のように指定されています `redis>=3.2.0`
    - kombu にも事情があるようなので状況的にしかたないのかもしれません
    - この問題を回避するためには `pip install apache-airflow[celery]` した後に `pip install 'kombu==4.3.0'` してダウングレードする必要があるようです
    - 別件ですが、webserver が依存している tornado も非互換の変更があったようで `pip install 'tornado>=5.1.1,<6'` してダウングレードする必要があります
- celery のドキュメントは v4.1.1 がなく v4.1.0 と v4.2.0 があるので v4.1.0 を参照します


## Celery とは

> Celery communicates via messages, usually using a broker to mediate between clients and workers. To initiate a task the client adds a message to the queue, the broker then delivers that message to a worker.

Celeryはメッセージを介して通信し、通常はブローカーを使用してクライアントとワーカーの間の仲介を行います。 クライアントがタスクを開始するためにメッセージをキューに追加すると、ブローカーはそのメッセージをワーカーに配信します。

http://docs.celeryproject.org/en/v4.1.0/getting-started/introduction.html#what-s-a-task-queue

Celery は broker としては以下が利用可能です

- RabbitMQ
- Redis
- Amazon SQS
- Zookeeper (Experimental)

http://docs.celeryproject.org/en/v4.1.0/getting-started/brokers/index.html


## Google Cloud Composer における CeleryExecutor

Redis を broker として採用しています

Scheduler, Redis, Worker の関係は以下のリンクにある図を見ていただくと一目瞭然です

Scheduler が Redis に message を送り、それが queue となって Worker が処理します

https://cloud.google.com/composer/docs/concepts/overview?hl=ja#architecture

Celery の monitoring tool として Flower がありますが、Google Cloud Composer では通常の手順で構築した環境で Flower は起動していません

以下の手順で Worker 上に起動することで利用可能です

https://cloud.google.com/composer/docs/how-to/using/installing-python-dependencies?hl=ja#connecting_to_the_flower_web_interface
https://flower.readthedocs.io/en/latest/

## CeleryExecutor の実行

各 Executor の実行時は execute_asyn メソッドが呼び出されますが、SeleryExecutor では内部的に Celery の task デコレーターを利用し、最終的に apply_async メソッドが呼び出されています

これにより message が queue に積まれます

https://github.com/apache/airflow/blob/1.10.2/airflow/executors/celery_executor.py#L46-L86
http://docs.celeryproject.org/en/v4.1.0/reference/celery.app.task.html?highlight=apply_async#celery.app.task.Task.apply_async
Spek2のgherkin形式でテストをスキップする

Spek2をGherkin形式で書いててテストをスキップしたいが、公式でその実装がないっぽいので拡張関数で実現した

``` kotlin
fun FeatureBody.Scenario(description: String, skip: Skip, body: ScenarioBody.() -> Unit) {
    delegate.group("Scenario: $description", skip = skip, defaultCachingMode = CachingMode.SCOPE, preserveExecutionOrder = true) {
        body(ScenarioBody(this))
    }
}
```

こんな拡張関数を追加すれば、 `Scenario("スキップさせる", Skip.Yes("not impl"))` とSkipを指定できるようになる。
ただし、 `Skip.No` を指定した場合、おそらくIntelliJのプラグインがパースに失敗して、
シナリオを指定しての実行ができなくなる。


``` kotlin
object SkipTest : Spek({

    Feature("テストのスキップ") {
        Scenario("スキップしない", Skip.No) {
            Given("ほげ") {
            }

            When("ふが") {
            }

            Then("もげー") {
            }
        }

        Scenario("スキップさせる", Skip.Yes("not impl")) {
            Given("ほげ") {
            }

            When("ふが") {
            }

            Then("もげー") {
            }
        }
    }
})

```

上記のコードで実行すればこんな感じにignoreされる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/16612/f2231c32-8ef0-a14d-c490-07eb388d7976.png)
php-master-changes 2019-03-10

今日は Win32 版でのテスト実行時の opcache の扱い修正と、Win32 版で readlink() がシンボリックリンクをうまく扱えない問題の修正があった！

# 2019-03-10
## weltling: Don't use Opcache with the master test process
- https://github.com/php/php-src/commit/44b7126c6d86a4cde6d3c2b81161041cf0173743
- [7.4~]
- Win32 版のテストの親プロセスで opcache を使わないよう修正
- ファイルベース opcache 利用時のディレクトリ指定もされている？よくは分からず

## johnstevenson: Fix bc break in Windows readlink
- https://github.com/php/php-src/commit/b37a6aafce721d289cfa004bfc8120796e01de60
- [7.4~]
- Win32 版で [readlink()](http://php.net/manual/ja/function.readlink.php) がシンボリックリンクをうまく扱えない問題の修正
- [PR:3825](https://github.com/php/php-src/pull/3825)
[Flutter] Codemagic の flavor 対応

---
**追記**

[Codemagic 自体に機能が追加された](https://docs.codemagic.io/building/specifying-custom-ios-scheme/) ので、今はそれを使うべきです。
(この記事は、ログとして一応残しておきます)

---

## 参考
[CodemagicでFlutterアプリのビルド・配信をする — iOS編](https://medium.com/flutter-jp/codemagic-a0f494c6244a)
Codemagic のアプデを受け、上記の素晴らしい記事に補足で行った対応です。

## 手順
### 1. Script を準備
```codemagic/pre_build.sh
#!/bin/sh

# NOTE: codemagic の UI から以下の環境変数をセットすること
#       • FLAVOR: "development" / "staging" / "release"
#       • CONFIGURATION: "Debug" / "Release"

set -e # exit on first failed commandset
set -x # print all executed commands to the log

echo "----- Using Environment Variables -----"
echo "CONFIGURATION: ${CONFIGURATION}"
echo "FLAVOR: ${FLAVOR}"

# Provisioning Profile の解決をする際に合致しないIDを取ってきてしまう件の対策
/usr/bin/plutil -replace CFBundleIdentifier -string "com.done.sensuikan1973.sample.${FLAVOR}" ios/Runner/Info.plist

# xcodebuid の際に決め打ちで -scheme Runner -config Release のオプションが与えられちゃってる件の対策
cp "ios/Flutter/${CONFIGURATION}-${FLAVOR}.xcconfig" ios/Flutter/Release-production.xcconfigs
```

同じ内容で `codemagic/pre_test.sh` も作っておく。 integration test のための build でこけてしまうのを防ぎたいから。

## 2. Codemagic の UI から設定

環境変数のセット
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159680/5d5e8675-2098-c299-129f-5d0fb1d47f6c.png)

pre_test.sh の指定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159680/c961093a-a2c2-ae5b-ebbf-039e6065d9bd.png)

pre_build.sh の指定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159680/f7a6a07d-92cc-2704-85ee-6094f03036fb.png)

## 3. 完了
もっと良い方法などありましたら🙏
Swiftのデリゲートメソッドでデフォルト引数ぽく書く方法

# 概要

コードレビューの時にデリゲートメソッドの部分で指摘を受けて修正しようと思ったのですが、
なかなかすぐに思いつかなかったので記事として残してみることにしました。
自分への備忘録です。

記事にまとめてみると復習の意味でも結構いい勉強になりました。

## 問題となっているポイントについて

Swiftで書いているときにprotocolのメソッドで引数にデフォルト値を設定したくなる時があると思います。
例えば、こんな感じのコードですね。

```Sample.swift
protocol CustomContentViewDelegate: AnyObject {
    func customContentViewDidTouchUp(_ view: CustomView, text: String? = nil) // コンパイルエラー
}
```

現状の仕様だとこのように`text: String? =nil`というのはprotocolでは持てない仕様である。
ですが仮にこれができた場合にはdelegateを呼び出し側で


```Sample.swift
protocol CustomContentViewDelegate: AnyObject {
    func customContentViewDidTouchUp(_ view: CustomView, text: String? = nil)
}

class CustomView: UIView {
    weak var delegate: CustomContentViewDelegate?

    func sampleMethod() {
        // デフォルト引数発動
        delegate?.customContentViewDidTouchUp(self) 
        // 引数指定
        delegate?.customContentViewDidTouchUp(self, text: "テスト実装")
    }
}
```

という風に`text`の引数を省略できて保守性が上がるというわけです。
この命題について考えたいと思います。

## 回答

いきなり回答に入りますが`extension`でprotocolを拡張すれば良いわけです。

```Sample.swift
protocol CustomContentViewDelegate: AnyObject {
    func customContentViewDidTouchUp(_ view: CustomView, text: String?)
}

// protocol extension でデフォルト引数を設定する
extension CustomContentViewDelegate {
    func customContentViewDidTouchUp(_ view: CustomView) {
        customContentViewDidTouchUp(view, text: nil)
    }
}

class CustomView: UIView {
    weak var delegate: CustomContentViewDelegate?

    func sampleMethod() {
        // デフォルト引数発動
        delegate?.customContentViewDidTouchUp(self) 
        // 引数指定
        delegate?.customContentViewDidTouchUp(self, text: "テスト実装") 
    }
}
```

これも一つのprotocol extensionの使い方かなと思い記事にしてみました。
ただ、コードレビューで指摘された時だと実際どんな風にしたら丁寧で見易いようになるかを2~3時間ぐらいかかりましたので
このような指摘をする場合には「protocol extensionで実装したらデフォルト引数ぽくなりますのでいいと思いますよ」と
指摘して頂ければすんなり解決した話しだったりします。

## 追記

個人の技術ブログをはじめました。
先月はこの個人ブログの設定やら記事の更新ならでQiitaへの投稿がおろそかになりました。

https://blog.tamappe.com

どうぞ宜しくおねがいします。
stm32f4-discoveryの作法 その2

#概要

stm32f4-discoveryの作法、調べてみた。
開発環境、作ってみた。

#環境

debian 6.0.7


#クロスコンパイラ

gcc 4.4.1 (sourcery)
gcc 4.7.3 (gnu)

#ライブラリー

cmsis
spl


#ローダースクリプト

cmsis付属


#Makefile


```
PROJECT = test18
HEAP_SIZE = 8192
STACK_SIZE = 2048
LDSCRIPT = ./cmsis/link.ld
FULL_PRJ = $(PROJECT)
UDEFS = 
UADEFS = 
SRC = ./src/main.c \
	./src/syscalls.c \
	./src/printk.c \
	./drv/src/stm32f4_discovery.c \
	./drv/src/misc.c \
	./drv/src/stm32f4xx_adc.c \
	./drv/src/stm32f4xx_dac.c \
	./drv/src/stm32f4xx_dma.c \
	./drv/src/stm32f4xx_exti.c \
	./drv/src/stm32f4xx_gpio.c \
	./drv/src/stm32f4xx_i2c.c \
	./drv/src/stm32f4xx_rcc.c \
	./drv/src/stm32f4xx_rng.c \
	./drv/src/stm32f4xx_rtc.c \
	./drv/src/stm32f4xx_spi.c \
	./drv/src/stm32f4xx_syscfg.c \
	./drv/src/stm32f4xx_tim.c \
	./drv/src/stm32f4xx_usart.c \
	./src/stm32fxxx_it.c \
	./cmsis/system_stm32f4xx.c
ASRC = ./cmsis/startup_stm32f4xx.S
UINCDIR = ./src/ ./drv/inc/ ./cmsis/
ULIBDIR =
ULIBS = 
OPT = -O2
TRGT = /home/ore/arm-4_7/bin/arm-none-eabi-
#TRGT = /home/ore/arm-2010q1/bin/arm-none-eabi-
CC = $(TRGT)gcc -std=gnu99
CP = $(TRGT)objcopy
AS = $(TRGT)gcc -x assembler-with-cpp
BIN = $(CP) -O ihex 
SZ = $(TRGT)size
MCU = cortex-m4
DDEFS = -D__arm__ -D__ASSEMBLY__ -DUSE_STDPERIPH_DRIVER -DSTM32F4XX -DHSE_VALUE=8000000 -D__FPU_PRESENT=1  -D__FPU_USED=1 -DSTM32F407VG -DUSE_USB_OTG_FS
DADEFS = -D__arm__ -D__ASSEMBLY__ -DUSE_STDPERIPH_DRIVER -DSTM32F4XX -DHSE_VALUE=8000000 -D__FPU_PRESENT=1  -D__FPU_USED=1 -DSTM32F407VG
DINCDIR = ./ 
DLIBS = -lgcc -lc -lm
INCDIR = $(patsubst %,-I%,$(DINCDIR) $(UINCDIR))
LIBDIR = $(patsubst %,-L%,$(DLIBDIR) $(ULIBDIR))
DEFS = $(DDEFS) $(UDEFS) -DRUN_FROM_FLASH=1
ADEFS = $(DADEFS) $(UADEFS) -D__HEAP_SIZE=$(HEAP_SIZE) -D__STACK_SIZE=$(STACK_SIZE)
OBJS = $(ASRC:.S=.o) $(SRC:.c=.o)
LIBS = $(DLIBS) $(ULIBS)
MCFLAGS = -mthumb -mcpu=$(MCU) $(FPU)
ASFLAGS = $(MCFLAGS) $(OPT) -g -gdwarf-2 -Wa,-amhls=$(<:.S=.lst) $(ADEFS)
CPFLAGS = $(MCFLAGS) $(OPT) -gdwarf-2 -Wall -Wstrict-prototypes -fverbose-asm 
CPFLAGS += -ffunction-sections -fdata-sections -Wa,-ahlms=$(<:.c=.lst) $(DEFS)
LDFLAGS = $(MCFLAGS) -nostartfiles -T$(LDSCRIPT) -Wl,-Map=$(FULL_PRJ).map,--cref,--gc-sections $(LIBDIR)
CPFLAGS += -MD -MP -MF .dep/$(@F).d
all: $(OBJS) $(FULL_PRJ).elf $(FULL_PRJ).hex $(FULL_PRJ).bin size
%.o : %.c
	$(CC) -c $(CPFLAGS) -I . $(INCDIR) $< -o $@
%.o : %.S
	$(AS) -c $(ASFLAGS) $< -o $@
$(FULL_PRJ).bin: $(FULL_PRJ).elf
	$(CP) -O binary $(FULL_PRJ).elf $(FULL_PRJ).bin
%elf: $(OBJS)
	$(CC) $(OBJS) $(LDFLAGS) $(LIBS) -o $@ 
%hex: %elf
	$(BIN) $< $@
size : $(FULL_PRJ).elf
	$(SZ)  --format=berkeley -t $(FULL_PRJ).elf
clean:
	rm -f $(OBJS)
	rm -f $(FULL_PRJ).elf
	rm -f $(FULL_PRJ).map
	rm -f $(FULL_PRJ).hex
	rm -f $(SRC:.c=.c.bak)
	rm -f $(SRC:.c=.lst)
	rm -f $(ASRC:.S=.S.bak)
	rm -f $(ASRC:.S=.lst)
	rm -fR .dep
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)


```

#ライター

openocd


以上。
AWSのLambdaのデプロイ運用設計

# ■概要
- Lambdaをデプロイする際のパターンを洗い出したので、適宜プロジェクトに合っているものを組み合わせて利用する

# ■使えるアーキテクチャ
- CI/CDツール(CodePipeline,Jenkins)
- CloudFormation(Sam,ServerlessFramework)
- AWS_CLI
- AWS_SDK(各プログラミング言語)

# ■悩めるポイント
- メタ情報(不随するもの)が多すぎて、単純にLambdaのソースだけを相手にするわけにはいかない。
  - 少なくともIAMロール、環境変数、イベント、メモリ、タイムアウト値などなどの様々なメタ情報を一緒に管理しなければならない。
- 対象Lambdaをデプロイする際に、他のリソースの影響範囲も考えなければならない。
  - 例えばバッチ処理でLambdaを利用している際、影響範囲によっては数か所の変更のためにバッチ全体を止めなければならない状態になってしまったりする。

※これらのポイントを考慮してデプロイ運用のパターンをいくつか考えてみる。

# ■デプロイ運用のパターン
1. 手動で全て行うパターン
2. CloudFormationで全てのリソースを管理するパターン
3. code兄弟(CI/CDツール)を使って自動化するパターン


### ◆手動で全て行うパターン

- そのプロジェクトのリソースが少ない時や、マネージメントコンソールに頼りきってしまっている時に使われるパターン。
  - 他の環境に横展開する際の手間や、手順書を作る工数を考えると、ツールを使った方が効率が良くなるのであまりお勧めしない。


### ◆CloudFormationで全てのリソースを管理するパターン

- 後述のCI/CDなどは特に行う必要がなく、リソースだけプロジェクト単位などで管理したい場合に使われるパターン
  - 新規作成も更新もコマンド一発で出来るので環境差分などパラメータ化すれば汎用的に利用できる
  - Sam,ServerlessFrameworkなどのツールを使えばローカル環境から簡単にデプロイができる(shellで実装しても良い)

#### ●CloudFormationを使ってLambdaをデプロイする時の注意点
1. IAMロールのRoleNameを固定にすると上手く設定が行かずはまるので注意
2. Lambdaをzipでアップロードするときに、ファイル名を固定にすると、ソースを更新する際に「変更なし」とされて、更新されないので毎回zip名は変える事

### ◆code兄弟(CI/CDツール)を使って自動化するパターン

- gitにソースコードを載せておけば、圧縮からデプロイ、さらにテストやエイリアスの切り替えまで出来るので、フルセットで自動化する場合に使われるパターン
  - CloudFormationを使うこともできるので上記のCloudFormationのパターンを内包しているともいえる
  - Aws側でバージョン管理等している場合($LATESTではなく、ALIASを使っている)は、そこも込みでデプロイしないといけないのでこちらを使う

# ■最後に
　以上、フィードバックやご指摘等いただけると大変ありがたいです!!よろしくお願いいたします!!
#Twitter で いいねの履歴が検索しづらいので #IFTTT 連携させて #Slack に送る活用例

# URL

https://ifttt.com/create

# Twitterのいいねをトリガーにする

New liked tweet by you を選ぶ

![image](https://user-images.githubusercontent.com/13635059/54092527-9430de80-43d0-11e9-8e5b-027c1939c780.png)

# Slack のチャンネル投稿をアクションにする

![image](https://user-images.githubusercontent.com/13635059/54092535-a3179100-43d0-11e9-84b6-a6aea2dac191.png)

# Twitterでいいねをつける



# Slackに送られる

IFTTTの仕様で15分ぐらいはかかる

# 以上

それだけ。

# 注意

Twitterでのあなたのいいね基準が変わってしまうかもしれない


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Vue/NuxtでESLintを活用(ファイルセーブで自動化編)

# はじめに
この記事では、エディタの設定を行い、エディタ上でLintに引っかかる部分を簡単に見つけられるように設定して行きます。

> 1. [ひとまず導入編](https://qiita.com/yfujii1127/items/16f48237c401219c460b)
> 2. [vueスタイルガイド導入編(vue/recommendの活用)]()
> 3. ファイルセーブで自動化編(エディタ自動校正機能) <font color="red">←本記事</font>
> 4. [コミット度にlintを走らせる編(lint-stagedとhuskey)](https://qiita.com/yfujii1127/items/bf70cf62d2800aeeff7b)
> 5. [Circle CIでESLint導入編](https://qiita.com/yfujii1127/items/70438b26d53dbeaf607a)

前回の、vueスタイルガイド導入編でVueファイルまで検知対象としましたが、このままでは毎回`npm run lint`を走らせないとどこがスタイルガイドに反しているかわからないのは不便です。エディタの設定を行い、もっと簡単に目視で確認できるようにします。

VS Codeを使って行きます。各自お好みのエディタにも設定方法あると思います。
(エディタプラグインに`ESLint`と`Vetur`が入っている前提で進めます)

# 設定
## vueスタイルガイドに反しているコードを目視確認
まず、ルートディレクトリに`.vscode`フォルダを作成しましょう。
<img width="490" alt="vscodeディレクトリの作成.png" src="https://qiita-image-store.s3.amazonaws.com/0/252687/313c95dd-a94b-dbf1-3ef3-d3342d7c82c6.png">

次に、中に`settings.json`を作成し、以下のコードを書きます。
<img width="860" alt="settings-jsonの作成.png" src="https://qiita-image-store.s3.amazonaws.com/0/252687/8e3b55ec-bd6c-ff0e-41c6-74f57df6eefb.png">


`"files.associations"`を書くことで、**VSCodeで特定のファイルを言語に関連付ける**ことができます。今回は`.vue`ファイルは`vue`言語ですよと紐づけています。`"eslint.validate"`では、eslintで走らせる対象を設定しています。

さて、それでは`pages/index.vue`をみてみましょう。

<img width="1092" alt="vscodeで目視確認.png" src="https://qiita-image-store.s3.amazonaws.com/0/252687/8f3dc3cb-b04b-6ec9-7814-09634b214429.png">


緑の波線が表示され、カーソルを合わせると注意の内容が出ています！
これはすごくわかりやすいですね！

## ファイル保存で自動校正
さて、もう一歩進んで、セーブするたびに自動構成をかけましょう。
先ほど触れなかった`"eslint.autoFixOnSave"`を**true**にします。

<img width="720" alt="自動校正設定.png" src="https://qiita-image-store.s3.amazonaws.com/0/252687/1a6ac5fc-7a80-1b2c-7db6-1b0da65adeae.png">

それでは、もう一度`pages/index.vue`に戻って、`command`+`s`で保存して見ましょう。

<img width="608" alt="自動校正前.png" src="https://qiita-image-store.s3.amazonaws.com/0/252687/4ac9fbf0-acc4-b244-0e48-08c7fe5ae694.png">

保存してみると

<img width="606" alt="自動校正後.png" src="https://qiita-image-store.s3.amazonaws.com/0/252687/2db8d861-0531-33c5-f4d4-4efafa245959.png">

いかがでしょう？
<font color="red">とても便利じゃないですか？</font>

この自動校正は先ほどの設定でJavaScritも対象にしているので、`.js`ファイルや`.vue`ファイルの`<script>`タグ内にも同じく校正をかけてくれます。

## `.gitignore`に追記を忘れずに
このままだと、git管理するときに、`.vscode`ディレクトリまで含まれてしまいます。これは個別のエディタ設定なので`.gitignore`に書いて含まれないようにしておきましょう。

<img width="487" alt="スクリーンショット 2019-03-09 15.24.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/252687/7484945d-c115-8a7e-bba0-edacbd218664.png">

【追記】
ちなみに、`/node_modules/`も書いておきましょう。JavaScriptのライブラリはここに入っており、プロジェクトの管轄外なことがほとんどであるから。
参考: http://bashalog.c-brains.jp/16/10/25-101200.php


## 注意
自動校正は<font color="red">完璧ではありません</font>。コンポーネントタグを普通のタグと間違えて認識したり、以下のように`==`は自動で`===`に直したりまでは対応していません。
<img width="175" alt="スクリーンショット 2019-03-09 15.09.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/252687/39ab19b6-4005-cfbc-ebcc-e10f9365792f.png">

既存プロジェクトに導入したり、大きなファイルに適用するときはくれぐれも注意しながら行ってください。


# 最後に
これで、スタイルガイドにあったコードを維持しながらの開発がスムーズにできますね！ :v:

先ほどの自動校正では拾いきれない漏れを防ぐために、次は、`git commit`するたびにlintが走るように設定をして見ましょう！

https://qiita.com/yfujii1127/items/bf70cf62d2800aeeff7b
Reactのinput（単一inputで成功）

https://qiita.com/y_ohr/items/3edf241c5ac1952afd05 の続きです。

# 環境
```
Ubuntu 18.04.2 LTS
node v8.10.0
npm 3.5.2
create-react-app v2.1.5
```

# ３行まとめ
- Reactのjsxで、inputのtextにprop.valueを設定した
- しかし、動かしてみたらUIからinputの値を変更できなかった
- stateを使用したら、変更できるようになった

# 調べる
公式ドキュメントのフォーム項を読む。
https://ja.reactjs.org/docs/forms.html

- 制御されたコンポーネント

>HTML では `<input>`、`<textarea>`、そして `<select>` のようなフォーム要素は通常、自身で状態を保持しており、ユーザーの入力に基づいてそれを更新します。React では、変更されうる状態は通常はコンポーネントの state プロパティに保持され、`setState()` 関数でのみ更新されます。

>React の state を “信頼できる唯一の情報源 (single source of truth)” とすることで、上述の 2 つの状態を結合させることができます。そうすることで、フォームをレンダーしている React コンポーネントが、後続するユーザー入力でフォームで起きることも制御できるようになります。このような方法で React によって値が制御される入力フォーム要素は「制御されたコンポーネント」と呼ばれます。

なるほど。つまり・・・

- inputのvalueはstateから設定する
- stateを変更するとvalueに反映される
- inputのonchangeでstateを変更する
- stateは`setState()`で設定する

という理解。

# inputのvalueをstateで設定するように修正
```diff:src/index.js
diff --git a/src/index.js b/src/index.js
index 8d285cc..7f4962d 100644
--- a/src/index.js
+++ b/src/index.js
@@ -2,12 +2,18 @@ import React from 'react';
 import ReactDOM from 'react-dom';

 class Square extends React.Component {
+    constructor(prop) {
+        super(prop);
+        this.state = { value: prop.value };
+    }
+
     render() {
         return (
             <input
                 type="text"
-                value={this.props.value}
+                value={this.state.value}
                 className="square"
+                onChange={e => this.setState({ value: e.target.value })}
             >
             </input>
         );
```

上記で動かしたら、UIから値を変更できるようになりました:tada:

# 感想

- 次は複数のinputを連動させたい
- 親子コンポーネントでそれぞれonChange()をハンドルしていると、両方発火する？発火する場合、順番は？
- 今回は未使用だけど、[公式のフォームDocs例](https://ja.reactjs.org/docs/forms.html#controlled-components)にある、コンストラクタの`this.handleChange = this.handleChange.bind(this)`と`<input type="text" value={this.state.value} onChange={this.handleChange} />`は、一見冗長に見える
- ReactのDocsやTutorialの公式日本語があるのを知らなかった・・・

以上
殻台本(shell script)一覧(list)


#基礎(basic)

記事にするほどではないけど便利な自作ShellScriptまとめ
https://qiita.com/mamepon2580/items/609bca0eea41fbe369ce

ShellScriptの基本
https://qiita.com/su-kun1899/items/0f5eacea2334f18ff306

ShellScriptで使えるメソッドまとめ
https://qiita.com/kenju/items/a318686d82ce6ea65223

Bashで便利なフレームワーク
https://qiita.com/syui/items/b859a57ed7bbda5d74b5

簡単なシェルスクリプトの備忘録
https://qiita.com/hirotaka-tajiri/items/d0def8ff5abc03e6afc4

bashでCSVを読み込み1行ずつループ処理する
https://qiita.com/SoarTec-lab/items/4475ba6de612fba3f163

Shell Scriptの基本
https://qiita.com/tsukasa_wear_parker/items/c129541654308f0ee505

たまにつかうシェルスクリプトのメモ
https://qiita.com/Utree/items/095a952f943c22c482d2

ShellScriptでよく使う表現
https://qiita.com/catus_tech/items/986e8ee732730606622b

Linuxコマンドの連結の挙動
https://qiita.com/da-sugi/items/c8c6889c2b9c59180399

ShellScriptまとめ
https://qiita.com/dante/items/3661d1bb26601219c2b7

ShellScriptをつくる手順
https://qiita.com/utano320/items/f89f0c33bc272fea8be3

ShellScript note #bash #zsh
https://qiita.com/howling_wolf/items/906a365e89c97eb89575

【初心者向け】シェルスクリプトの作り方
https://qiita.com/atelier/items/7d24ebe6f7bde5bedddc

unix & linux command and shellscript
https://qiita.com/yumin/items/c5bbd3fcbacbbf2c99bd

UNIX/ShellScript
https://qiita.com/ct-7/items/123ad4c022a4c4cbf33f

ShellScript 基礎知識
https://qiita.com/TaikiFnit/items/dd598f7cabc1758c2c78

#応用8application)

shell でディレクトリ内のファイルに対してループ処理
https://qiita.com/elzup/items/e839a8c4e815808fb4bc

Dockerでrails開発環境を構築するShellScript
https://qiita.com/yusaku_uchida/items/b6e617c2d8dba42e82e8

readコマンドなどを使って、txtファイルを読み込み、HTMLファイルを作成する！要はshellscriptを使って流し込みをする。
https://qiita.com/masanorifunaki/items/43af2d8179e650dfb491

#自己参照資料(self reference)

コンパイル用shell script C版(clangとgcc)とC++版(clang++とg++)
https://qiita.com/kaizen_nagoya/items/74220c0577a512c2d7da

The Template のソースをCmakeするスクリプト群を作成するにあたって(未完)
https://qiita.com/kaizen_nagoya/items/d32b6c3b5dfe1f1e7bb5


どうやって MISRA Example Suiteをコンパイルするか
https://qiita.com/kaizen_nagoya/items/fbdbff5ff696e2ca7f00

C++ N4606 のコード断片をコンパイルするためにしていること
https://qiita.com/kaizen_nagoya/items/a8d7ee2f2e29e76c19c1

shellスクリプトをgithubにあげ失敗した事項と成功した事項のまとめ
https://qiita.com/kaizen_nagoya/items/e2d748fe4dab28bb4c40

cmake Cmakelists.txt
https://qiita.com/kaizen_nagoya/items/c109c3a0c7fb18cb9dbd

#文書履歴(document history)
ver. 0.01 初稿 20190312
PHPの関数の書き方を質問されたので、サルでもわかるように説明してみた

プログラミングを学んでいる知り合いが関数の使い方を理解していなかったので教えました。

今回、せっかくなのでQiitaにアップすることにします。



```

function test($x) {
    $sum = $x + 3;
    return $sum;
}

echo test(4);


```

このように記載すると test(4)の答えは7 となリます.


![IMG_4252.jpg](https://qiita-image-store.s3.amazonaws.com/0/274625/d6e384b3-2fc5-0baf-ab41-4cb6ced879ec.jpeg)

functionで定義をしてあげてtest($x)で関数を呼びだすことができます。

なお、test($x)の$x=5を入れてあげるとtest(5)の値は「5+3」で8となります。

初心者でもわかりやすいように手書きでの画像を入れてみましたのでぜひ参考になればと思います。
Nginxの「400 The plain HTTP request was sent to HTTPS port」の対処

# 概要
 - Nginxでリバースプロキシなサーバを作った
 - 「https://〜」(443ポート)へのアクセスは正常に処理される
 - 80番ポートがなぜかhttpsなポートとして処理されてしまう
 - 結果的に「400 The plain HTTP request was sent to HTTPS port」が出て困る

# 前提
 - ${内容}は変数的なものです
 - サーバOS: Ubuntu 18.04.02 LTS
 - Nginx: 1.14.0

# したいこと
ドメイン名のみのリンクをクリックされた場合に、ブラウザに関係なくHTTPSなサイトに誘導する

# 症状

ドメイン名のみのリンクの場合、

 - Chrome (72.0.3626.119(64-bit)) はうまく解釈してくれました
 - Firefox (65.0.1 (64-bit)) はhttpとして解釈され以下の症状が出ました


|リクエスト内容|curlレスポンス(*1)|requestsレスポンス(*2)|
|:---|:---|:---|
|http://${ドメイン名}:80|301|400(*3)|
|http://${ドメイン名}:443|301|400(*3)|
|https://${ドメイン名}:80|x|200|
|https://${ドメイン名}:443|200|200|

*1)

```sh:request.sh
curl ${リクエスト内容} -k # kオプションで証明書エラーを無視
```

*2)

```python:request.py
import requests
requests.packages.urllib3.disable_warnings() # 証明書warningを無視
a = requests.get(${リクエスト内容}, verify=False) # verfy=False: 証明書errorを無視

```

*3)
![nginx-bad-request-error.png](https://qiita-image-store.s3.amazonaws.com/0/206426/8010c021-88da-f72d-b7ea-e54429266497.png)


# 対処
とりあえず設定箇所を全文

```nginx:/etc/nginx/sites-enable/default
server {
    listen 80;
    listen 443 ssl;
    server_name ${domain};

    ssl_certificate      ${キーファイルのパス}/2019.crt.pem;
    ssl_certificate_key  ${キーファイルのパス}/2019.key.pem;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;

    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-NginX-Proxy true;

    location / {
        proxy_pass http://127.0.0.1:8000; # localhostにすると色々ハマる
    }

    error_page 497 /497.html;
    location = /497.html {
        root /var/www/html;
        internal;
    }
}
```

(※)エラー内容は400で、レスポンスも400だが、実際には497エラーを400にリダイレクト(?)している模様(´・ω・｀)
参考: [nginx でエラーページ出すなや〜 "400 The plain HTTP request was sent to HTTPS port"](https://kihi.blog.so-net.ne.jp/2018-03-30-2)
(※)ポート番号はバックで動いてるアプリのポート番号で。

```html:/var/www/html/497.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
    <head><meta charset="utf-8"></head>
    <body>
        HTTPアクセスはできません。トップページにリダイレクトします。
        <script type="text/javascript">
            setTimeout(function(){ window.location.href = 'https://${ドメイン名}'; }, 100);
        </script>
    </body>
</html>
```
(※)`/var/www/html`の所有者・グループが`www-data`にする(`sudo chown -R www-data:www-data /var/www/html`)のを忘れないように

# その他

割と場当たり的な対処になってしまいました。
調べていると「ssl onをコメントアウトする」対処が多かったですが今回はうまく動作しませんでした。

挙動から察するに
NginxはマウントしたポートをデフォルトでHTTPSなポートとして解釈してしまってるような気がします。
大元の設定ファイルである`/etc/nginx/nginx.conf`も確認しましたが、それらしい記述はなさそう。
もう一つ謎なのは、SSLが完全に無い状態で80番ポートのみをマウントすると、ローカルからのリクエストは受け付けるのに、リモートからのリクエストは弾かれました。iptablesの設定は確認したのでAppArmorな気もしますが、ちょっとよく分かりません。。
分かるひと教えて下さい(´・ω・｀)