OmniAICreator/Qiita-1.07M huggingface dataset:
STM32のタイマだけを使ってLチカする

　STマイクロエレクトロニクスのSTM32 MCUのタイマ機能を使ってLチカする。
　32ビットのARM系組み込みチップは、8ビットのPICやAVRに比べて、CPUが高性能になっているばかりでなく、ペリフェラルも高性能なものが組込まれていて、CPUを介さず独立してI/O制御を行えるだけの機能を持っている。しかし、mbedやarduino IDEといった汎用組み込みOSは、このようなペリフェラルを直接制御するAPIを持っておらず、CMSIS（Cortex Microcontroller Software Interface Standard）やSTM32Cube HAL（Hardware Abstraction Layer）といった、低レベルAPIを使用して制御しなければならない。
　STM32 MCUに関しては、STM32CubeMXというツールが提供されており、GUIを使用して直感的な操作でペリフェラルの初期化コードを自動生成することができる。これは初期化コードのみであるから、追加のコードを書き加えて、プログラムを完成させる。

## STM32CubeMXの設定

　まず、STM32CubeMXを立ち上げ、プロジェクトを設定する。以下で、ペリフェラルを選択し、ソースコード生成を行う。細かな操作方法については、他の記事を参照していただきたい。

### Pinoutタブ

　ここではTIM3を選択した。Lチカのために、タイマのPWM機能を使用する。同じ機能を持つなら他のタイマでも使用できる。
　PeripheralsのTIM3の中から、Internal Clockをチェックし、Channel1にPWM Generation CH1を選択する。タイマにクロック信号を供給し、クロックのカウント数を設定してパルス幅を決める。

![Pinout設定](https://qiita-image-store.s3.amazonaws.com/0/119076/5723288e-d54e-06de-2915-940abac5fef7.png "Pinout設定") ![ピン割り当て](https://qiita-image-store.s3.amazonaws.com/0/119076/8fa09a5f-f0e0-e81d-9a23-0a9b66aa5d8d.png "ピン割り当て")

内容については後述する。

### Clock Configurationタブ

クロック関係は、ここではデフォルトのままで設定する。タイマに供給されるクロックは、このMCUでは、APB1 Timer clocksに示されるクロックで、ここでは8MHzが設定されている。

![クロック設定](https://qiita-image-store.s3.amazonaws.com/0/119076/167bb76b-cb3f-a8f8-09d1-03b033c23696.png "クロック設定")

### Configurationタブ
　TIM3ボタン→Parameter/Settingsタブを選択する。

![タイマ設定](https://qiita-image-store.s3.amazonaws.com/0/119076/c1bf77bc-a3d7-d98e-dcfc-e018dd9d1ba2.png "タイマ設定")

　レファレンスマニュアル（RM0091）に書かれているタイマの構成図を示す。

![ハードウェア模式図](https://qiita-image-store.s3.amazonaws.com/0/119076/ab31a745-02a7-b953-402a-5f930cd8ed2f.png "ハードウェア模式図")

　Pinoutタブで「Internal Clock」をチェックしているので、CK_PSCには、CK_INTが供給されるよう設定される。
　CK_PSC信号は、PSC prescalerで分周される。クロックが8MHzなので、8MHz ÷ (7999 + 1) = 1KHz で、1KHzのクロック信号CK_CNTが、CNT counterに供給されるよう設定される。
　CNT counterは、Upカウンタモードに設定されるので、0から始まり、Auto-reload registerに設定される値 999に一致するまでカウントアップする。auto-reload preloadをEnableに設定しているので、CNT counterの値は、999の次は0に戻る。
　PWM Generation CH1の設定では、PWM Generation Channel 1のPulseに記述した値がCapture/Compare 1 registerに設定される。PWM mode 1では、CNT counterの値が、Capture/Compare 1 registerの値より小さいと、Channel 1がアクティブになり、CNT counterの値がCapture/Compare 1 registerの値以上になると、インアクティブになる。アクティブになるとCH Polarityの設定に従って、Highレベル信号がピンに出力される。従って、1KHzのクロック信号によって、CNT counterが0から199をカウントしている間はTIM3_CH1ピンがHighになり、200から999まではLowになる。

## プログラミング

　STM32CubeMXで、Generate Code を実行すると、ここまでの初期設定を行うCのソースコードが出力される。初期設定直後は、タイマが起動されていないので、起動するためのコードを追加する。

```
    HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_1);
```

 上記のコードでタイマを起動すると、停止するまでTIM3_CH1ピンにパルスを出力し続ける。

![TIM3_CH1ピン タイミングチャート](https://qiita-image-store.s3.amazonaws.com/0/119076/784e9f37-d0d1-26ba-afa6-9539093f1fb9.png "TIM3_CH1ピン タイミングチャート")

TIM3のチャネルでは、出力はCH​*n*のみであるが、TIM1では、CH​*n*とCH​*n*​Nの2系統の出力がある。しかし、HAL_TIM_PWM_Start ()関数は、CH​*n*​への出力の設定しかできない。CH​*n*​Nを出力に選択した場合は、現時点では（STM32CubeMX バージョン4.24.0）、HALライブラリには対応APIが存在せず、CMSISのAPIに直接アクセスしなければならない。

## 次回

LEDの点灯時間をDMAを使って書き換え、CPUを介さず点滅間隔を変化させるサンプルを作成する。→[STM32のタイマとDMAを組み合わせてLチカする](https://qiita.com/kanehara/items/119b554703bf4273d35b "STM32のタイマとDMAを組み合わせてLチカする")
固定長をカンマ区切りに変換して、カラムを並び替えて、カラム指定でゼロパディングを解除する方法(bash)

## はじめに
以前の記事で「[固定長をカンマ区切りに変換する方法(bash)](https://qiita.com/woadachi/items/0eb64b23236762d1169c "固定長をカンマ区切りに変換する方法(bash)")」を
紹介させていただきましたが、記事投稿後、業務中に下記要望を受けました。

「やり方わかりませんが今すぐこのファイルを変換して
こんなレイアウトのファイルを作りたいです！」

・固定長をカンマ区切りに変換する
・カラムを並び替える
・ゼロパディングされている特定のカラムはゼロパディングを解除したい。
・ゼロパディングされている特定のカラムはゼロパディングを解除したくない。

良い機会だと思いましたので、忘れないようにqiitaに
方法をまとめようと思います。

## 前提
文字コード：ASCII
改行コード：LF
とする。

## 対処方法
一つずつコマンドを実行しても対応可能ですが、
ワンライナーでも対応可能ですので、ワンライナーで記載。
(一つのコマンドでもできそうな気がしましたが、
思いつきませんでしたのでとりあえず下記で)


例えばtest.csvのデータを

00013005920170901XXX-XXXX-XXXX000000290

とする。上記を

20170901,000130059,XXX-XXXX-XXXX,290

としたい場合、下記コマンドで可能である。

```
gawk 'BEGIN{FIELDWIDTHS="9 8 13 9"}{print $2","$1","$3","$4}' test.csv|awk -F, '{gsub("^0*","",$4);print $1","$2","$3","$4}'  >output.csv
```

前回の記事で説明した部分は割愛。

パイプで連携する前側の「print」の\$数字でカラム(厳密には\$数字に割り当てられている
文字列ですが)を並び替えています。

パイプで連携する前では

```
20170901,000130059,XXX-XXXX-XXXX,000000290
```

という結果になっています。
この結果をパイプで後続のコマンド「awk」に引き渡しています。

「-F,」でデリミタをカンマ指定し、
gsubコマンドで「第四カラムにおいて、先頭が0から始まり任意の数連続する0という
文字列」を「(空)」に置換しています。
カラム指定ですので、指定したカラム以外(例えば第二カラムの「000130059」)は
ゼロパディングを解除しません。


```

gawk 'BEGIN{FIELDWIDTHS="9 8 13 9"}{print $2","$1","$3","$4}' test.csv|awk -F, '{gsub("^0*","",$4);print $1","$2","$3","$4}'  >output.csv

cat output.csv
20170901,000130059,XXX-XXXX-XXXX,290

```

これで少しはデータが見やすくなったでしょうか？

ちなみに正規表現で文頭を表す「^」は「キャレット」と読みます。
一年くらい前に「^は何と読むんだ！？」と業務中に聞かれたため覚えました。


## おわりに
人に聞かれたことは纏めておく精神で記事にしています。
今後、似たような異なる要望を受けた場合はそれも記事にしていこうと思います。
Redis with rails. You need to reconnect to Redis after forking error.の解決方法

2年間運用しているRailsアプリケーションにRspec高速化のために`spring-commands-rspec`gemを追加したところ発生。

- エラーメッセージ

```
Redis::InheritedError:
       Tried to use a connection from a child process without reconnecting. You need to reconnect to Redis after forking or set :inherit_socket to true.
```

エラーメッセージを見ると、Springがフォークしてできたプロセスが、Redisとのコネクションが取れていないということらしい。Springのドキュメントを見てみると、フォークした後タイミングのコールバックが用意されていたので利用。

https://github.com/rails/spring#running-code-after-forking

```config/spring.rb
Spring.after_fork do
  begin
    Redis.current = Redis.new(hogehoge)
    Redis.current.ping # 接続チェック
  rescue => err
    Rails.logger.info(err)
  end
end
```

上記エラーが発生した環境はそれぞれだと思いますが、参考になれば幸いです。
AWS Greengrass のローカル Lambda ライフサイクル別の最小コード


AWS Greengrass では Greengrass Core 上で動くローカル Lambda のライフサイクルが選べるようになりました

![image.png](https://qiita-image-store.s3.amazonaws.com/0/22754/881842ec-6459-c0a4-6c11-3b39db83cba8.png)

それぞれの最小コードを紹介します

# ローカル Lambda のライフサイクル

* [オンデマンド Lambda 関数](https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/on-demand.html)
    * Publishメッセージをトリガーに実行されるタイプ
* 存続期間が長く無制限に稼働する関数
    * Arduino の `loop()` のような永続的に実行されるタイプ

## オンデマンド関数

Publishメッセージをトリガーに実行されるタイプです。一般的であり、また AWS Lambda っぽいコードでもあります

このサンプルコードは受け取ったオブジェクトを `DEBUG:root:Receive message: ...` とログに出力します

```lambda_function.py
import logging

def lambda_handler(event, context):
    logging.debug('Receive message: {}'.format(event))
    return
```

コーディングのポイント;

* ローカルのログに出力するだけなら `import greengrasssdk` は不要なんです
    * MQTT Publish がやりたくなったら `import greengrasssdk` が必要となります

※「ユーザの Lambda ログ」 でレベルを _デバッグ_ にしておいてください
※ログレベルの変更やログの場所は [AWS Greengrass (1.3.0) を Ubuntu server (16.04 x86_64) で動かし、とりま開発する環境まで考える](https://qiita.com/ma2shita/items/22b56c6b6f7d11758880#greengrass-%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AE%E3%83%AD%E3%82%B0%E8%A8%AD%E5%AE%9A%E3%81%A8%E5%87%BA%E5%8A%9B%E5%85%88) で解説しています

## 存続期間が長く無制限に稼働する関数

Arduino の `loop()` のような永続的に実行されるタイプで、[存続期間の長い Lambda 関数](https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/long-testing.html)と呼ばます
Greengrass Core 起動時に一緒に実行されて、永続的に動き続けます

このサンプルコードは5秒毎に `DEBUG:root:Hello world! loop counter is x` という文字列をログに出力し続けます

```lambda_function.py
import logging
from threading import Timer
	
loop_counter = None

def setup():
    global loop_counter
    loop_counter = 1

def loop():
    global loop_counter
    logging.debug('Hello world! loop counter is {}'.format(loop_counter))
    loop_counter += 1
    Timer(5, loop).start()

setup()
loop()

def lambda_handler(event, context):
    return
```

コーディングのポイント;

* [`threading` の `Timer`](https://docs.python.jp/3/library/threading.html#timer-objects) を利用すると簡単に実現できます
    * loop対象のpython関数内で `Timer(待機秒, 自身のpython関数名).start()` でループさせられます
    * AWS Greengrass Core 起動時に一緒に起動される永続的なコンテナで動くため、グローバル変数である `loop_counter` の中身は保持され続けることが確認できます
* `lambda_handler()` の実装は空(= return を返すだけ)で構いません
    * もちろん中身を実装してオンデマンドLambda関数として実装することも可能ですが、オンデマンドLambda関数は都度コンテナが起動するため、変数の共有などできません
* `setup()` は Arduino のコードに似せるために作っただけですので、とくにこのような実装である必要はありません

※「ユーザの Lambda ログ」 でレベルを _デバッグ_ にしておいてください
※ログレベルの変更やログの場所は [AWS Greengrass (1.3.0) を Ubuntu server (16.04 x86_64) で動かし、とりま開発する環境まで考える](https://qiita.com/ma2shita/items/22b56c6b6f7d11758880#greengrass-%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AE%E3%83%AD%E3%82%B0%E8%A8%AD%E5%AE%9A%E3%81%A8%E5%87%BA%E5%8A%9B%E5%85%88) で解説しています

## AWS IoT Core への Publish

AWS IoT Core への Publish は `greengrasssdk.client` を使います

```python
import greengrasssdk
client = greengrasssdk.client('iot-data')

def any_func():
    client.publish(topic='my_topic/foo/bar', payload='Hello world!')
```

となります

## あとがき

こんな話を書いている場合じゃないのだが。進捗 0 バイト。

EoT
JPEG形式で画像のサムネイルを生成する

何かしらのシステムでサムネイル画像を生成するとき、元の画像形式によらずサムネイル画像はJPEGで生成したい場合がある。(ファイルハンドリング、ファイルサイズ圧縮)
ポイントは4行目の```.convert('RGB')```

```python:thumbnail.py
THUMB_SIZE = 250  # 生成したいサムネイル画像のサイズを指定
ORIGINAL_DIR = "/resource/path/original"
THUMB_DIR = "/resource/path/thumbnail"

img = Image.open(ORIGINAL_DIR, 'r').convert('RGB')

img.thumbnail((THUMB_SIZE, THUMB_SIZE), Image.ANTIALIAS) #　長辺が指定したサイズに収まるようにサムネイル画像を生成
img.save(THUMB_DIR + "/" + hash_name + ".jpg", format="JPEG", quality=75, optimize=True)
```

## 実行結果

画像貼ってて気づいたんですけど、画像をアップロードするとS3のアドレスを直に表示するQiitaの仕様、なかなかアグレッシブですね。

### 透明箇所を含まないJPEG以外の画像
北斎にしようと思ったのですが北斎ちゃん引けなかったので歌川広重です。
形式はgifです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/158440/9b809b13-5817-262d-c3c7-4ca4db687591.gif" style="zoom:0.1;">

<img src="https://qiita-image-store.s3.amazonaws.com/0/158440/561c2885-d667-8360-75bc-7cdf3a680941.jpeg" style="zoom:0.1;">

オッケーオッケー。
この他BMPでも問題なく出力された。

### 透明箇所を含むPNG画像

<img src="https://qiita-image-store.s3.amazonaws.com/0/158440/4ddcb024-efa6-be31-93ab-be95d3614cd7.png" style="zoom:0.1;">
<img src="https://qiita-image-store.s3.amazonaws.com/0/158440/8993aec3-d8d6-b500-06d0-60835b78764c.jpeg" style="zoom:0.1;">

<b><font color="Red">グワーッ！</b></font>
どうやら透明レイヤーの下に隠されている色が見えてしまう模様。
Ansibleのsysctlモジュールのabsentの挙動をみた

CentOS7で増えてたっぽいdisableが名前に入ってるやつをAnsibleのsysctlモジュールでabsentにしたらどういう挙動なんかなと思ってやってみたところこんな感じだったという備忘録です。

まず初期状態の値は、`net.ipv6.conf.all.disable_ipv6 = 0`です。
これは値が1だとipv6無効化できるやつ。

```
# ansible localhost -c local -m sysctl -b -a "name=net.ipv6.conf.all.disable_ipv6 state=absent" 

localhost | SUCCESS => {
    "changed": false
}
```
absentって指定してみても`"changed": false`でかわらない。つまりabsentは0にしてくれるやつみたいですね。

```
# sysctl -a |grep net.ipv6.conf.all.disable
net.ipv6.conf.all.disable_ipv6 = 0
```
次にvalueを指定してみるとちゃんとその値になっていました。

```
# ansible localhost -c local -m sysctl -b -a "name=net.ipv6.conf.all.disable_ipv6 state=present value=1" 

localhost | SUCCESS => {
    "changed": true
}
# sysctl -a |grep net.ipv6.conf.all.disable
net.ipv6.conf.all.disable_ipv6 = 1
```

結論的には値を指定しないとだめなやつでした。以上。
AOSで動く距離を変える

[Animate On Scroll Library/AOS](http://michalsnik.github.io/aos/)

HTMLタグ中に

```html
<div data-aos="fade-up"></div>
```

と書くことで、スクロールイベントに応じて簡単にアニメーションできるjQueryのライブラリ。便利。
ただ、移動距離が大きいのが不満というか、大味になってしまう。

オプションやパラメータで変更できないか調べたが、
offsetやdelay,durationは変更できるが、distanceは変更できないぽい。

AOSのGitHubよりリポジトリをクローンしてきて、

```scss:_animation.scss
$aos-distance: 100px !default;
```

を、

```scss:_animation.scss
$aos-distance: 50px !default; // 希望の移動距離
```

変えてcssを出力すればOK。
pythonでvSphere操作　その1　必要なパッケージ編

インターネットに繋がっていないサーバ環境なので、手動で入手。

- vCenter操作ライブラリ
python2-pyvmomi-6.5-1.el7.noarch.rpm

- HTTPライブラリ
python-requests-2.6.0-1.el7_1.noarch.rpm

- python互換性ライブラリ
python-six-1.9.0-2.el7.noarch.rpm

- エンコード検知ライブラリ
python-chardet-2.2.1-1.el7_1.noarch.rpm

- 同じくHTTPライブラリ（POST？）
python-urllib3-1.10.2-3.el7.noarch.rpm

- python3のssl.match_hostname()関数のライブラリ
python-backports-ssl_match_hostname-3.4.0.2-4.el7.noarch.rpm

- python3の機能をバックポートするためのライブラリ
python-backports-1.0-8.el7.x86_64.rpm

結構入りますな。
俺言語 その17

#概要
俺言語をやってみた。
avrにアセンブラで実装してみた。
sg90を回して見た。
3台にした。

#環境
avr studio 4
attiny85 1mhz
tera term
usb-serial

#写真
![MVC-003F.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/45165ec7-4e01-4961-5cf4-6973ceb11e63.jpeg)

#拡張
変数e,f,gを導入。
eは、PB2に、値/256*20msのpwmを放出する。
fは、PB3に、値/256*20msのpwmを放出する。
gは、PB4に、値/256*20msのpwmを放出する。

#仕組み
タイマー0をCTCモードで起動。80usでcompa割り込み発生するように設定。
割り込み内で、e,f,gを比較、pb2,pb3,pb4をコントロールする。
割り込みは、無限ループ内で許可。


#サンプルコード

```
10 e=10
20 #=10

```

以上。
7030 Service Control Manager エラー

毎回サーバーのエラーを表記して失礼します。
```
FileZilla Server FTP server サービスは、対話型サービスとしてマークされています。しかし、システムは対話型サービスを許可しないように構成されています。このサービスは正常に機能しない可能性があります。
```
と
7030 Service Control Manager エラー
の解決方法をメモるっ

FileZilla Server FTP server　は
https://qiita.com/moitaro/items/fbb92558dedc90f54bad
でサックリ使えるようになったんだけどエラーが気になったのですっ
C++ Builder XE4 > TComboBox > N番目の項目文字列を取得する > ComboBox1->Items->Strings[2]

```txt:動作環境
C++ Builder XE4
```

### 処理

TComboBoxのItemsで定義した項目のうち、N番目の項目の文字列を取得する。

### 参考

[Delphi Beginner's Tips]
http://u670.com/delphi_tips/tips0086.html
by ohishiさん

情報感謝です。

> 選択した項目を取得する
> `Label1.Caption:=ComboBox1.Items.Strings[ComboBox1.ItemIndex];`

### code 

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	ShowMessage( ComboBox1->Items->Strings[0] );
	ShowMessage( ComboBox1->Items->Strings[1] );
	ShowMessage( ComboBox1->Items->Strings[2] );
}
//---------------------------------------------------------------------------
```

### 失敗

`ComboBox1->Items[2]->Text`のように取得しようとしていた。

ItemsはTStringsなので[Strings[]プロパティ](http://docwiki.embarcadero.com/Libraries/Tokyo/ja/System.Classes.TStrings.Strings)を持っている、という理解をすれば記憶に残りやすいかもしれない。

ItemsがTStringsがであるということは実装中に明示される。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/07839bc3-066c-6a8e-3bba-8f3f63e7a87c.png)
Read the Docs > PDF Generation

http://docs.readthedocs.io/en/latest/features.html

> PDF Generation
> When you build your project on RTD, we automatically build a PDF of your project’s documentation. We also build them for every version that you upload, so we can host the PDFs of your latest documentation, as well as your latest stable releases as well.

SphinxとRead the Docsで生成されたページを見ていると、ドキュメントのPDF取得が可能だった。

Read the Docsの機能によりPDF出力しているようだ。

Web上のドキュメントとPDFを同時に更新できるというのは便利そうだ。
swiftでのJSONの扱い方

#書いた理由
JSONの扱い方が僕には複雑だったのでまとめ
#JSONの扱い方
```swift:jsonPractice.swift
//Stringスタート
let initJSONStr = "[{\"question\":\"str\",\"answers\":[\"Str1\",\"Str2\"]},{\"question\":\"str\",\"answers\":[\"Str1\",\"Str2\"]}]"
//StringからDataへ
let data = initJSONStr.data(using: .utf8)!
//DataからJSONObjectへ
let json = try? JSONSerialization.jsonObject(with: data, options: [])
//JSONObjectからArrayへ
var array:Array<Dictionary<String,Any>> = []
//jsonの中身がちゃんとarrayにできるかを確認
if let checkArray = json as? [Dictionary<String,Any>]{
        array = checkArray
}
//arrayを適当に編集
array[0]["question"] = "aaa"
var newQuestion:Dictionary<String,Any> = ["question":"new","answers":["答え１","答え２"]]
array.append(newQuestion)
//ArrayからData
let data2 = try JSONSerialization.data(withJSONObject: array, options: [])
//DataからString
let jsonStr = String(bytes: data2, encoding: .utf8)!
print(jsonStr)//[{"question":"aaa","answers":["Str1","Str2"]},{"question":"str","answers":["Str1","Str2"]},{"answers":["答え１","答え２"],"question":"new"}]

```
PyMieScatt > Online user's guide | Sphinx | Read the Docs

Online user’s guide for the Python Mie Scattering package (PyMieScatt)

http://pymiescatt.readthedocs.io/en/latest/index.html

The link includes followings (as of Mar. 09, 2018):

- Install PyMieScatt
- Revision Notes - version X.X.X
- Revision History
- Revivions in Progress
- Documentation To-Do List
- PyMieScatt To-Do List
- Publications Using PyMieScatt
- Auther Contact Information

The page is built with [Sphinx](http://www.sphinx-doc.org/en/master/) using [a theme](https://github.com/rtfd/sphinx_rtd_theme) provided by [Read the Docs](https://readthedocs.org/).

Documentation To-Do List (as of Mar. 09, 2018):
> - More example scripts, I guess?
> - As a few function names and parameter names get updated, there may be some typos in old examples. I’ll catch those as they crop up.
【2018年3月時点】iTunes Connectでプライマリ言語を変える方法

ハマったのでメモしておきます．まず，Statusが緑(Rady for Sale)じゃないと変更できません．アップデートを行ったタイミングで変更しましょう．

1. iTunes Connectにプライマリ言語にしたい言語のスクリーンショットをアップロードした上でバイナリを提出（重要）
2. Statusが緑になったらApp情報からプライマリ言語を変える（審査不要で即座に変更されます）

私の場合は，スクリーンショットを世界共通のものにしていたので，1.の手順で詰んでいました．（iTunes Connectのヘルプをちゃんと読むと，1.のことも書いてあります）

cf. https://help.apple.com/itunes-connect/developer/#/deve6f78a8e2?sub=devb34f436a9
本の管理アプリを作るときに見た記事

#メモです
### guard文の使い方
http://hajihaji-lemon.com/smartphone/swift/guard文/
要約:guard文を使うと処理を続ける条件に合わないから脱出するというイメージがしやすくなる。
書き方は以下のよう

```swift

 guard 条件式 else { //外側に進むための条件
     処理 //条件に合わなかったとき
     return または break または throw //脱出
 } 
```

ちなみにbreak,return,throwの違いは次のよう
break: 処理をguardの中の処理を行わないで抜けるだけ(そこだけ終わりで次へ)
return: この処理が入っている関数自体を終わらせる(そこで終了)
throw: errorを投げる

### debugの時の変数の中身などの確認の仕方
https://www.bhnt.co.jp/blog/ツール/xcode/xcode5デバッグ時にプロパティや変数の値を確認する/
要約: xcode右下のconsoleに次のように書くと変数の中身の値が見れる

```
po 変数名

po [変数名 メソッド名]

po 変数名.プロパティ名
```

### TableViewCellの大きさをCellの中身に応じて変える方法
https://www.raywenderlich.com/129059/self-sizing-table-view-cells
要約:
TableViewのプロパティのrowHightにUITableViewAutomaticDimensionを代入するとcellの高さがcellの中のオブジェクトの大きさとそれらのオブジェクトのAutoLayoutの二つのみに依存したものになる。

```swift
//大きさをcellの中のobjectのconstrainsに依存させる
tableView.rowHeight = UITableViewAutomaticDimension
//なんか書かなきゃらしいが右辺の数字は適当な数字でいいらしい。予想の高さ？を代入
tableView.estimatedRowHeight = 20
```
#####その他得た知識: UILabelの行数をtextの量に合わせて増やす方法
main.storyboadで対象のLabelを選択してIdentity Inspectorの中のLinesを0にする

### UILabel, UITextField, UITextView の違い
https://ja.stackoverflow.com/questions/2378/uilabel-uitextfield-uitextview-の違いは何ですか
要約: 
・UILabel 　表示専用
・UITextField 　キーボードによる入力が可能
・UITextView 　キーボードによる入力が可能 　複数行可

### ER図の書き方
http://it-koala.com/entity-relationship-diagram-1897#i-6

### 何度やってもAlamofireでのGETリクエストのresponseがnilの理由
https://stackoverflow.com/questions/41581030/alamofire-response-is-allways-nil
要約：処理が非同期(順番ではなく)行われているので、早く止めすぎるとだめ。待てば返ってくる。

### URLからUIImageViewに画像を表示させる方法
http://swift-salaryman.com/uiimage.php
要約:下のように書けばできる。

```swift
@IBoutlet var let testImageView = UIImageView
let url = URL(string: "http://books.google.com/books/content?id=xxNQngEACAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api")
let data = try? Data(contentsOf: url!)
let img = UIImage(data:data!);
testImageVIew.image = img
```
### 画面の幅、高さを所得する方法
http://systemengineer.site/archives/17155480.html
要約:下のように書けばできる

```swift
let width = UIScreen.main.bounds.size.width
let height = UIScreen.main.bounds.size.height
```

### present modally でのsegueで下の画面を取る方法
http://www.opuappnavi.com/takka/2014/06/09/ios7%E3%81%A7%E3%81%AE%E8%A6%AA%E3%81%AE%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%AE%E5%8F%96%E5%BE%97%E6%96%B9%E6%B3%95/
要約: 下のようにやれば取れる

```swift:ModallyViewController.swift
self.presentingViewController as! ViewController
```

NavigationControllerを使っているときはNavigationControllerが取れるので注意。

### カメラロールから画像取得
https://picolica.com/2017/04/25/swift3-choose-from-cameraroll/

### イメージからデータへ
https://gist.github.com/trilliwon/5af1abe1a113148c23ecde8c08e181a6
要約: 下のようにやればできる

```swift
var imageData: Data = UIImagePNGRepresentation(image)
var imageUIImage: UIImage = UIImage(data: imageData)
```

### iOSの権限周り
http://c-geru.com/as_blind_side/2016/10/useuserdata.html
日常使っているMacの環境を外付けHDDにコピーして起動

ようやくMacの内蔵ハードディスクの暗号解除が、完了しました。
そして、外付けのハードディスクから起動に成功しました。
![スクリーンショット 2018-03-08 23.25.17.png](https://qiita-image-store.s3.amazonaws.com/0/20977/c68e39ba-070d-2d43-c418-8eefaeb8bc6d.png)

##今回分かったこと
ハードディスクを暗号化している状態では、コピーできても起動できない。
APFSは、容量の変更ができない。
ディスクユーティリティでは、APSFのパーテーションを指定して、復元を行うことができない。

##今回の手順
こちらの記事の中にあるコマンドの例を使い、Recovery HDのパーテーションを作ります。
http://blog.niw.at/post/38869084107

ディスクユーティリティを使い、今作ったパーテーションを指定して内蔵HDDのRecovery HDを復元します。
再起動します。
command＋Rで、macOSのユーティリティを起動します。
メニューの一番下のディスクユーティリティを選択して起動します。
外付けHDDの空きパーテーションを指定して、内蔵HDDのコンテナDiskを復元します。

##これで完了
オプションキーを押しながら再起動して、起動ディスクを選択します。
そして、USBのアイコンのMacintosh HDを指定して起動すると立ち上がります。

USB３.０であれば、違和感も感じないと思います。
私も、新しい環境で、この記事を書いていますが問題ないです。

APSFでパーテーションを作るときは、複数別のフォーマットでパーテーションを作っておきましょう。
そうしないと、Recovery HD以外の空きスペースが、全部APFSになってしまい容量の変更ができな苦なり困ることになります。
Python軽量フレームワークFalconでAPI開発 入門(その2)

# 概要
この記事はPythonフレームワークの一つである[Falcon](http://falcon.readthedocs.io/en/stable/index.html)の扱い方についてまとめた記事です。今回の記事は[前回](https://qiita.com/shimakaze_soft/items/166071b17dd286e8913b)のその2になります。
Falconは非常にシンプルな構成であり、多機能では無いもののいくつかの機能を備えています。

今回は`リクエストパラメーターの取得`方法と`Hooks`という機能の扱い方について解説します。

# パラメーターの取得
GETやPOSTのリクエストを受けた際、パラメーターの取得は以下のようにして行えます。

```python
class AppResource(object):

    def on_get(self, req, resp):
        params = req.params
        resp.body = json.dumps(params)
```

`req.params`でパラメーターの取得を行うことができます。


例えば以下のようなGETパラメーターを指定してリクエストを送ったとします。
以下の場合はkeyがtestであり、valueがhogeになります。

- key: test
- value: hoge


```Terminfo
$ curl -v 127.0.0.1:8000?test=hoge
```

シェルのHTTPクライアントはcurlを使うのが一般的ですが、HTTPieの方が便利です。
HTTPieの扱い方は以下に載せてあります。
https://qiita.com/ytabuchi/items/02fa15ac209823a4d19f

```Terminfo
$ http -v GET 127.0.0.1:8000 test==hoge
```

実際にコマンドを叩いてリクエストを送ってみると、`req.params`の中身は以下のような感じになっています。中身は辞書型となっているため、`req.params['test']`でキーを指定するとvalueである`hoge`を取り出すことが可能です。

```
{'test': 'hoge'}
```

# Hooksの機能
Hooksは指定した__リソースの前後に任意の処理を追加できる__ことの機能です。
リソースのクラス、又はメソッドに以下のデコレーターを指定することでHooksを使うことができます。Hooksには以下のように2種類のデコレーターがあります。

- @falcon.before 指定したリソースの直前で呼び出される
- @falcon.after 指定したリソースの直後に呼び出される

## 実装例
それでは実際にHooksを使用してみます。[前回](https://qiita.com/shimakaze_soft/items/166071b17dd286e8913b)作成したapp.pyに追記していきます。

```python:app.py
.
.
(省略)
import hooks.py

@falcon.before(hooks.before_resource)
@falcon.after(hooks.after_resource)
class AppResource(object):

    def on_get(self, req, resp):

        msg = {
            "message": "Welcome to the Falcon"
        }
        resp.body = json.dumps(msg)

```

Hooks用のメソッドを定義したファイルを作成します。
ここでは`AppResource`クラスに対して処理が飛ぶと、`AppResource`が呼び出される前にデコレーター@falcon.beforeで指定した`hooks.py`の`before_resource`メソッドが呼び出されます。
その後、`AppResource`内で処理が行われた後に、デコレーター@falcon.afterで指定した`hooks.py`内の`after_resource`メソッドに処理が飛びます。

```python:hooks.py
def before_resource(req, resp, resource, params):
    print('hook: before_resource')
    print(req)
    print(resp)
    print(resource)
    print(params)

def after_resource(req, resp, resource):
    print('hook: after_resource')
    print(req)
    print(resp)
    print(resource)
```

## 処理の順番
つまり処理の順番は上から以下のようになります。

1. (falcon.before) before_resource
2. (Resource) AppResource (on_****) on_get
3. (falcon.after) after_resource

# まとめ
今回紹介したのは以下の二つです。

- パラメーターの取得方法
- リソースの前後に任意の処理を挟むことができる機能

次回はミドルウェアの機能について紹介していきます。

参考
http://falcon.readthedocs.io/en/stable/api/hooks.html
LuaRocksに自作モジュールを登録する手順

[lua-resty-woothee](https://github.com/woothee/lua-resty-woothee) というモジュールをメンテナンスしているのですが
ありがたいことに割と利用されているようですし、Luaのパッケージマネージャーである[LuaRocks](https://luarocks.org/)に登録しておくと利用者がもっと便利に使えるかな〜と思いましたので対応してみました。
以下その手順メモです。

## Ref: モジュールを公開する手順に関するドキュメント

https://github.com/luarocks/luarocks/wiki/Creating-a-rock

## 手順サマリー

1. rockspecを書く 
2. ローカルでテスト
3. Githubなどにソースコード公開
4. LuaRocksにアカウント登録
5. LuaRocksにrockファイルをアップロード

### 1. rockspecを書く

rockspecとはモジュールの情報、ビルド方式、ソースの場所などを書いたspecファイルです。  
手動で書くでも良いですし、 [luarocks write_rockspec](https://github.com/luarocks/luarocks/wiki/write_rockspec) コマンドを利用する、でも良いです。
他のモジュールを参考にコピペでも良いかも。ちなみにlua-resty-wootheeでは[こんな感じ](https://github.com/woothee/lua-resty-woothee/blob/master/lua-resty-woothee-1.7.0-1.rockspec)です。
rockspecの詳しい説明については[公式ドキュメント](https://github.com/luarocks/luarocks/wiki/Creating-a-rock#writing-a-rockspec)を御覧ください。

### 2. ローカルでテスト

`luarocks make` コマンドでビルドしてみましょう。
エラーが出なければOKです。

### 3. Githubなどにソースコード公開

公開されていれば、GithubではなくBitbucketなどでも良いでしょう。

### 4. LuaRocksにアカウントを登録

https://luarocks.org/register

こちらのURLから情報を入力してアカウント登録を行います。

### 5. LuaRocksにソースコードアップロード

.rockspecファイルと.rockファイルの両方をアップロードするとLuaRocksに公開されます。  
アップロードはファイルを作成して管理画面から登録する方法と、
uploadコマンドを利用する方法があります。

.rockファイルは packコマンド で作成できます。
uploadコマンドを利用する場合はpackコマンドも自動で実行されるため前もってファイルを作っておく必要はありませんが、テストのために実行しておきましょう。

```
luarocks pack <rockspecファイル>
```

そして uploadコマンド でLuaRocksにアップロードされます。
APIキーは管理画面から入手可能です。

```
luarocks upload <rockspecファイル> --api-key=<your API key> 
```

以上！簡単ですね。

## 補足: バージョン管理について

Wikiを見る限り、基本的にはrockspecファイル内のバージョンとソースコードを更新する手順が推奨されているようです。
githubのtagを利用する方法がわかりやすくて良いですね。
また、rockspec内のバージョンとファイルに含まれるバージョンが一致している必要があるためファイル名も毎回更新することになります。[^1]

たとえばバージョン2.0-1に更新したい場合、以下のような記述にすればよいでしょう。

```hogelib-2.0-1.rockspec
package = "hogelib"
version = "2.0-1"
source = {
    url = "git://github.com/hogesan/hogelib",
    tag = "v2.0.1"
}
...
```


[^1]: ただ、公開されているモジュールを見るとrockspecファイル変えずにバージョン上げる方法もありそうなんですよね。どうやってるんだろう。
capistranoのcurrent_path、shared_path

## capistranoのcurrent_pathとshared_pathという変数について


### 結論
current_path: deploy_toのpath/current
shared_path: deploy_toのpath/shared

### 例
deploy.rb内で
`set :deploy_to, "/var/www/rails/アプリケーション名"`
のように設定していれば、current_pathは
`/var/www/rails/アプリケーション名/current`
になります。

### current、sharedとは
capistranoを用いてdeployをするとサーバーのアプリのルートディレクトリに以下のようなディレクトリが作成されます。

```
├── current （releases内の最新のディレクトリ）
├── releases
│   ├── 20180308145927
│   ├── 20180308151719
│   └── 20180308154610
├── repo
├── revisions.log
└── shared
```


#### releases、current
releassesは過去にdeployしたものの積み重ねです。
そしてreleasesの中から最も新しいものがcurrentに反映されます。

ちなみにcurrentの中身は、以下のようにおなじみのrailsです。

```
├── app
├── bin
├── config
├── 

```

#### shared
sharedにはdeploy.rb内でlinked_files、linked_dirsに設定したファイルが含まれます。
deploy時に作成されるディレクトリを見ていただいたら分かるように、releasesやcurrentに影響を受けないので、database.ymlなどあまり変更のないようなファイル、ディレクトリに適用させるのが良いかもしれません。

#### repo
gitなどのバージョン管理に関するデータが入ってます。

#### revisions.log
deployやrollbackのlogが記入されています。


###参考
Structure - Capistrano
http://capistranorb.com/documentation/getting-started/structure/
Capistrano Variables - Freelancing Digest
https://www.freelancingdigest.com/articles/capistrano-variables/
Huawei Mediapad M3 Lite 10のUSBデバッグが繋がらない時の対処

備忘として

#経緯
2017年現在、Huawei端末でデバッグしようとするとなかなかUSBデバッグが繋がらないことがあります。更に、ようやくUSBデバッグが繋がって喜んだのも束の間、logcatが出ない！といったことがあります。

#環境
Huawei Mediapad M3 Lite 10
Android7(購入時のデフォルト)

#対処方法
##logcatが出ない問題
これはHuawei系のデバイス共通の仕様のようで、隠し設定画面によってlog出力を許可できます。

- 電話アプリを開いて `*#*#2846579#*#*`を入力

- Project Menu が表示されるので、Background settings > LOG settingsを選択
- 出てくる4つのすべてにチェックを入れて許可する

##USBデバッグが繋がらない問題
私の環境では

- PCからUSBケーブルをMediapadに差す。
- 開発者向けオプション>USBデバッグをonに
- 開発者向けオプション>USB設定を選択>ファイルMTPをタップ(既にMTPモードになっていてもタップする)
- USBデバッグをon>off>onに切り替えてみる

というステップを行うことで繋げることができました。

##最後に
根本的な原因がわかっていないので、必ずしもこれで繋がるかはわかりませんが、参考程度に。
充電モードとMTPモードの切り替えがうまくいってない印象。
Matzと浜松〜Ruby誕生について〜


[やさしいMatzの作り方](https://www.slideshare.net/kouji/matz)

浜松でRubyを作り、名古屋へ転職

[N高等学校ネットオープンキャンパス 「まつもとゆきひろ」氏 課外授業 - YouTube](https://www.youtube.com/watch?v=e6PvI_KGC8M)

本屋の子だった模様.
Tracの複数プロジェクトを管理する

(2018/06/20追記　ほぼ完成しました)
[設計とかをまとめた記事](http://yakipudding.hatenablog.com/entry/2018/07/15/155245)
ソース：https://github.com/yakipudding/mymy

Tracの複数プロジェクトを管理するプログラムの自分用メモ。
ASP.Net MVC5で作る予定です

# 要望
転職してきた今の会社が超絶Trac主義で、すべての仕事をチケット管理している
そのため複数プロジェクトにまたがっていて、追いにくい
チケットに自分用のメモ（これは〇〇だから放置、とか後でやる、とか）を残せないので、今どういう状態かを忘れがち
クローズ後に担当者が変わる運用の為、過去自分が行ったチケットがわからなくなって後からも追いにくい
自分用のチケット管理としてツールがほしい

# 要件
* 複数プロジェクトを管理したい
* 自分が担当のチケットを一覧で見たい
* ↑のクエリは任意で変更したい
* 任意で一覧に残すチケットを登録できるようにしたい
* チケットごとにメモとかリンクとか貼り付けたい
* プロジェクトごとに表示する項目を変えたい
* 自分が過去に担当したチケットを見れるようにしたい

# モデル
* チケット：プロジェクト×チケットIDがキー　メモ項目などを保持
* プロジェクト：プロジェクト名、URL、クエリ条件、取得列の設定
* プロジェクトカスタム項目：プロジェクト別のカスタム列の日本語名設定

## チケットモデル
* プロジェクトID
* チケットID
* カテゴリ
* ステータス
* メモ
* リンク
* 表示フラグ　→INDEX画面でOFFにできるボタン設置

# 画面・コントローラ
* INDEX：メインページ
* 過去チケット一覧
* 各種マスタメンテ

# INDEXページ
* メインのページ。自分が担当しているチケット一覧と過去に担当していたチケットを表示させることができる

## アクション>初期表示時
* 取得URLに保存されたURLにGETリクエスト→最新チケット一覧取得(csv形式）
* DB上のチケットと突合し、存在しなければDBに新規登録
~~* クローズしているものは表示しない（か条件付けるか…）~~ →クローズ後も表示し続けたいものもある
* 取得したチケット情報とDB上のチケットのメモ項目（コントロール）を一覧で表示
* 任意のタイミングで非表示にできる（非表示ボタン）

## アクション>新規登録ボタン押下
* INDEXに表示させる任意チケットの追加
* プロジェクト分類とIDを指定~~／またはURL入力でプロジェクト分類を逆設定する必要あり~~
* チケットに登録

## アクション>編集ボタン押下
* チケットのメモとかカテゴリとか登録できる

# 過去チケット一覧ページ
* 過去に担当していたチケットの一覧が見れる
* カテゴリ、タイトル、表示条件を指定して検索できる
* 表示・非表示にかかわらず表示できる（フィルタ可能）

# ソース
https://github.com/yakipudding/mymy
scrapyの導入と標準入出力で躓いたこと

# 結論
1. ライブラリのインスコ
2. Pythonの再インスコ
3. 環境変数の設定

# 環境
- CentOS 6
- Python 3.6.4
- Scrapy 1.5.0

# 経緯
Scrapyを仮想環境で試そうとしたところ、環境を整え直す羽目になったのでφ(..)メモメモと。

# 発生した問題
## ModuleNotFoundError: No module named ‘_sqlite3'
scrapy shellを実行したところ、以下のエラーが発生。
SQLite3の開発用ツールとPython3の再インスコが必要。

``` shell:ModuleNotFoundError
(略)
  File "/home/vagrant/.pyenv/versions/3.6.4/lib/python3.6/sqlite3/dbapi2.py", line 27, in <module>
    from _sqlite3 import *
ModuleNotFoundError: No module named '_sqlite3'
```

## 標準入出力の文字化け
cssセレクタを使い日本語の抽出を行ったところ、文字化けが発生。
こちらは環境変数でエンコーディングの指定が必要。

# 対応方法
## ModuleNotFoundError: No module named ‘_sqlite3'
SQLite開発用ツールを入れた後改めて、Pythonのコンパイル、インストール。

``` shell:
sudo yum install sqlite-devel -y
sudo rm -rf ~/.pyenv/shims/
/bin/bash -lc "pyenv install 3.6.4 && pyenv rehash && pyenv global 3.6.4"
```
## 標準入出力の文字化け
標準入力/標準出力/標準エラー出力用環境変数の上書き指定。
bashrcに追記。

``` bashrc:
export PYTHONIOENCODING=utf-8
```

# 参考
http://yoshida-ahiru.hatenablog.com/entry/2017/08/13/020007
https://qiita.com/methane/items/6e294ef5a1fad4afa843
https://docs.python.org/ja/3.6/using/cmdline.html#envvar-PYTHONIOENCODING
AWSとAlibabaCloudのインスタンスにUnixBenchをかけてみました

# はじめに
AWS と AlibabaCloudのインスタンスが気になって
UnixBenchをかけて検証してみました。

# ベンチマークシナリオ
シナリオはインスタンスの種類を基準に作成し、
結果はインスタンス情報と、ベンチマークの結果でまとめました。
UnixBenchのバージョンは、 **5.1.3** です。

各クラウドのインスタンスタイプの情報はこちらです。
AWS:[EC2インスタンスタイプ](https://aws.amazon.com/jp/ec2/instance-types/ "EC2インスタンスタイプ")
AlibabaCloud:[Instance type families](https://www.alibabacloud.com/help/doc-detail/25378.htm "Instance type families")

# ベンチマーク実施
## シナリオ1 (CPU最適化)
|  | AWS | Alibaba |
|:--|:--|:--|
| インスタンスタイプ | c4.large | ecs.sn1ne.large |
| CPUコア / メモリ | 2 / 3.75 GiB | 2-core, 4GB |
| リージョン | 東京 | 東京 |
| OS | Ubuntu Server 16.04 LTS | Ubuntu 16.04 64bit |
|<hr>|<hr>|<hr>|
|UnixBench結果シングル| 1184 | 1391 |
|UnixBench結果マルチ| 1910.4 | 3108.2 |

## 2 (汎用)
|  | AWS | Alibaba |
|:--|:--|:--|
| インスタンスタイプ | m4.large | ecs.sn2ne.medium |
| CPUコア / メモリ | 2 / 8 GiB | 2-core, 8GB |
| リージョン | 東京 | 東京 |
| OS | Ubuntu Server 16.04 LTS | Ubuntu 16.04 64bit |
|<hr>|<hr>|<hr>|
|UnixBench結果シングル| 1053.3 | 1424.1 |
|UnixBench結果マルチ| 1698.1 | 2239.1 |

## 3 (メモリ最適化)
|  | AWS | Alibaba |
|:--|:--|:--|
| インスタンスタイプ | r4.large | ecs.se1ne.large |
| CPUコア / メモリ | 2 / 15.25 GiB | 2-core, 16GB |
| リージョン | 東京 | 東京 |
| OS | Ubuntu Server 16.04 LTS | Ubuntu 16.04 64bit |
|<hr>|<hr>|<hr>|
|UnixBench結果シングル| 1048.4 | 1414.9 |
|UnixBench結果マルチ| 1701.8 | 3136.1 |

## 4 (CPU最適化)
|  | AWS | Alibaba |
|:--|:--|:--|
| インスタンスタイプ | c5.large | ecs.c5.large |
| CPUコア / メモリ | 2 / 4 GiB | 2-core, 4GB |
| リージョン | us-east-1 (バージニア) | 中国東部 1 (杭州) |
| OS | Ubuntu Server 16.04 LTS | Ubuntu 16.04 64bit |
|<hr>|<hr>|<hr>|
|UnixBench結果シングル| 1364.3 | 1440.1 |
|UnixBench結果マルチ| 2210.3 | 2352.1 |

## 5 (汎用)
|  | AWS | Alibaba |
|:--|:--|:--|
| インスタンスタイプ | m5.large | ecs.g5.large |
| CPUコア / メモリ | 2 / 8 GiB | 2-core, 8GB |
| リージョン | us-east-1 (バージニア) | 中国東部 1 (杭州) |
| OS | Ubuntu Server 16.04 LTS | Ubuntu 16.04 64bit |
|<hr>|<hr>|<hr>|
|UnixBench結果シングル| 1164 | 1410.3 |
|UnixBench結果マルチ| 1865.3 | 2317.8 |

## 6 (GPU Comp)
|  | AWS | Alibaba |
|:--|:--|:--|
| インスタンスタイプ | p3.2xlarge | ecs.gn5-c8g1.2xlarge |
| CPUコア / メモリ | 8 / 61 GiB | 8-core, 60GB |
| リージョン | us-east-1 (バージニア) | 中国東部 1 (杭州) |
| OS | Ubuntu Server 16.04 LTS | Ubuntu 16.04 64bit |
|<hr>|<hr>|<hr>|
|UnixBench結果シングル| 1158 | 1507.8 |
|UnixBench結果マルチ| 4295.9 | 5083.4 |

# まとめ
AlibabaCloudの方がAWSよりUnixBench結果（スコア）は高くなりました。
AlibabaCloudへの期待が高まりますね。
django アプリケーションの作成 　不具合

Python　に興味を持ち、PyQで独学でコツコツ進めてきました。

欲が出てきて、ゼロベースでアプリを作ってみたいと思い、早速、ブログを参考に挑戦中。
(https://qiita.com/OXamarin/items/c593487d86f2181da00b)

ヤル気とは裏腹に、初歩の段階で手詰まり。

経験者の皆様、お力を貸して頂けたら幸いです。

疑問点：
アプリケーションのコマンド指示が正しく実行されない。


![無題.png](https://qiita-image-store.s3.amazonaws.com/0/240318/ce3965a3-fde2-ae76-e5f2-7d835d3abc93.png)


正しく実行された場合

![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/240318/24e988fc-3221-504c-1793-5e2970ca1679.png)
VSCodeのプロジェクト内検索をパネルで行う

# 発端

最近AtomからVSCodeに移行してみたのですが、プロジェクト内検索を行う際のフォームの位置が両者で違うために違和感がありました。

- Atomは下部のパネルに検索フォームが表示

![Atom](https://qiita-image-store.s3.amazonaws.com/0/165779/3b65ecc3-e7ae-fea6-96e0-72621b0783e9.png)

- VsCodeはサイドバーに検索フォームが表示

![VSCode Before](https://qiita-image-store.s3.amazonaws.com/0/165779/6b7c3598-dbea-2cac-c04c-39f8c4dea3f2.png)

[VsCodeのリリースノート: 1.21.0](https://code.visualstudio.com/updates/v1_21)を斜め読みしていたところ、Atomのように下部のパネルに出せるようになったらしいので、早速試してみます。

# 設定方法

設定ファイルに下記を追加します。

```json
"search.location": "panel"
```

これだけ。
ちなみに、サイドバーに戻すには、

```json
"search.location": "sidebar"
```

とします。

# 結果

![VSCode After](https://qiita-image-store.s3.amazonaws.com/0/165779/86ffca06-be0b-9670-f8fe-c643ef986ff3.png)

検索フォームが下部のパネルに移動したことで、ある程度Atomに近くなり、違和感が少なくなりました。
この機能はまだプレビュー版らしいのですが、特に問題もなさそうなのでこのまま使ってみようと思います。
gistのファイル表示。600gist 180000 files まで表示する。

### 自分のuser名で、ページ付きで検索をする。
```js
let url = `https://api.github.com/users/${u}/gists?page=${i}`
//ex. u=gnjo,i = 1 ... 100
```
### ページが存在するかは headerの linkで見ることができるが、存在しないページを表示すれば、配列が[]で返ってくるので打ち切りがわかる。
```js
 if(d.length==0) return sol(ary)
```

### 1pageは30gistまで検索できる。20 loop とりあえずする。
1gistは truncatedなしで300fileまで表示できる。

```js
function searchall(sys,max=20){return new Promise(sol=>{
 let ary=[],i=1
 ,str =sys.auth
 ,url =`https://api.github.com/users/${sys.u}/gists`
 ,opt={method:'GET',mode:'cors',headers:{"Authorization":str}}
 ,f=()=>{
   let u=`${url}?page=${i}`
   ,loop =(d)=>{
      if(d.length==0) return sol(ary)
      ;[].push.apply(ary,d);
      if(i>max) return sol(ary)
      i++;
      return f()
   }
   ;
   return fetch(u,opt).then(res=>res.json()).then(loop)
 }
 ;
 f()///
 ;
})}

```

### 結果最大で180000filesまで表示可能。
これだけあれば十分だろう。
実際のデータは　raw_urlを表示するのみ。認証は必要なし。

```js
function read(raw_url){
  let log=(d)=>{console.log(d);return d}
  return fetch(raw_url)
    .then(d=>d.text())
    .then(log)
  ;
}
```
### 全部
pickを変更して、必要な情報の取捨をする。

```html
<button onclick="b()">go</button>
<pre></pre>
```
```js

function searchall(sys,max=20){return new Promise(sol=>{
 let ary=[],i=1
 ,str =sys.auth
 ,url =`https://api.github.com/users/${sys.u}/gists`
 ,opt={method:'GET',mode:'cors',headers:{"Authorization":str}}
 ,f=()=>{
   let u=`${url}?page=${i}`
   ,loop =(d)=>{
      if(d.length==0) return sol(ary)
      ;[].push.apply(ary,d);
      if(i>max) return sol(ary)
      i++;
      return f()
   }
   ;
   return fetch(u,opt).then(res=>res.json()).then(loop)
 }
 ;
 f()///
 ;
})}
;
function b(){
  var u= window.prompt('u?');
  if(!u) return;
  var p =window.prompt('p?');
  if(!p) return;
  var sys={};  
  sys.u =u
  sys.auth ='basic '+btoa(sys.u+':'+p)
  ;
  let draw =(d)=>{document.querySelector('pre').innerHTML = JSON.stringify(d,null,2);return d;}
  ,pick =(d)=>{
    let ary=[];
    d.forEach(d=>{
      Object.keys(d.files).forEach(key=>{
         let add ={id_url:d.url, id:d.id, description:d.description}
         ary.push( Object.assign({},d.files[key],add) )
      })
    })
    ;
    return ary;
  }
  ,log=(d)=>{console.log(d);return d}
  ;
  //30*20 =max 600gist 600*300files =max 180000 files
  searchall(sys,20)
   .then(log)
   .then(pick) //
   .then(draw)
  ;
}
//raw_url be the no-auth.
function read(raw_url){
  let log=(d)=>{console.log(d);return d}
  return fetch(raw_url)
    .then(d=>d.text())
    .then(log)
  ;
}
```
Goでポインター型のフィールドをもつ構造体の配列をforループする処理ではまった

JsonファイルをGoで処理するときにnull値と空文字との区別をしたいため、string型のポインター型のフィールド入った構造体を作って、その構造体の配列をfor文で回す処理を書いた。

このときはまったのが、単純にいえば、下のようなコードを実行したとき

```go
package main

import "fmt"

// Hoge struct for test
type Hoge struct {
	Foo *string `json:foo`
}

func main() {
	var hoges [4]Hoge
	values := []string{"君", "の", "名", "は"}
	for i, value := range values {
		// v := value
		// hoges[i].Foo = &v
		// 下の1行を結局上記2行に書き換えたら問題が直った。
		hoges[i].Foo = &value
	}

	for _, hoge := range hoges {
		fmt.Print(*hoge.Foo)
		fmt.Print(" ")
	}

}
```

"君の名は"が出力されると思いきや"はははは"が出力されることだ。[実行例](https://play.golang.org/p/C1QM-vcT9xt) 

`hoge`がfor文全体に共通する変数であり、最終的には`hoges[i].Foo(i=0,1,2,3)`を示すポインターのアドレスがすべて"は"を示すアドレスになり、結果hogesの全要素"はははは"が出力される、というロジックである。
リストの [ ] を取り除いて要素だけ表示する



```python:qiita.py
 a=[1,2,3,4,5]
>>>print(*a)
 1 2 3 4 5

>>>print(*a,sep="\n")
 1
 2
 3
 4
 5

```

競技プログラミングにおいて便利だと思ったので書かせてもらいました。
ThinkPad X1 Carbon で Red Hat Enterprise Linux のインストーラーを起動する

![boot-menu.png](https://qiita-image-store.s3.amazonaws.com/0/67627/f9547af4-5cb7-18e8-1aa1-8697f927145f.png)

ThinkPad X1 Carbon で Red Hat Enterprise Linux のインストーラーを起動する方法をメモっとく。[Fedora Media Writer を使用して Red Hat Enterprise Linux のインストール USB を作成する](https://qiita.com/takuya0301/items/29859708a04e48e0a6d3)の続き。

今回は ThinkPad X1 Carbon（2017モデル）のカスタマイズモデルを対象とする。なお [ThinkPad X1 Carbon 20HRCTO1WW Core i7・8GBメモリー・256GB SSD搭載 価格.com限定 ハイエンドパッケージ](http://kakaku.com/item/K0000956105/)をベースモデルとしてカスタマイズしている。

# ThinkPad X1 Carbon 詳細仕様

今回 Red Hat Enterprise Linux をインストールする端末は下記のような ThinkPad X1 Carbon（2017モデル）のカスタマイズモデルである。

* Machine Type: 20HR
* Processor: Intel Core i7-7500U
* Display: 14.0" WQHD (2560 x 1440) IPS anti-glare non-touch
* Graphics: Intel HD Graphics 620
* Camera: HD 720p
* Memory: 16 GB LPDDR3 1866 MHz
* Storage: 256GB SSD PCIe-NVMe OPAL2
* Keyboard: US layout

# Red Hat Enterprise Linux のインストーラーを起動する

1. Red Hat Enterprise Linux のインストール USB を接続する
2. ThinkPad X1 Carbon を起動する
3. ロゴ画面で F12 キーを押下する
4. Boot Menu が起動したら、カーソルキーで USB HDD を選択して Enter を押下する

これで Red Hat Enterprise Linux のインストーラーが起動する。

---

今回は Red Hat Enterprise Linux のインストーラーを起動するところまで説明した。次回は Red Hat Enterprise Linux をインストールする方法を説明する。

# 参考文献

http://kakaku.com/item/K0000956105/
https://support.lenovo.com/jp/en/solutions/x1-carbon-help
https://download.lenovo.com/pccbbs/mobiles_pdf/x1_carbon_5th_ug_ja.pdf
JSUG勉強会 2018年その2〜SpringとAPI時代の動く仕様への取り組み〜のメモ

### はじめに
チラシの裏です。

### Springのプログラムモデルと動く仕様～テスト編～

一人目の寺島さんの発表資料↓
[Springのプログラムモデルと動く仕様～テスト編～](https://www.slideshare.net/terahide/spring-89980737)

- テストでは事前条件(give)・操作(when)・結果(then)で書く。
- [Spock](http://spockframework.org/)というGroovyで書かれたテストライブラリが便利。
- 自動テストは動く仕様という位置づけ。

事例：

1. テスト項目書が複雑でフラグ管理の手順が不明瞭。マニュアルでDBを操作してフラグを立てる？
2. テストメソッドからテスト内容を判別できない。
↓
テストメソッド名をgive-when-thenにする。

カバレッジを満たすのがテストの目的ではない！
仕様レベルの話はコメントとして残し、本質ではない操作方法とかは明記しなくてもいい（隠蔽する）。
プロダクトコードからも仕様と関係ない部分は移譲する（Serviceクラスは業務処理に専念させるみたいな話？）。

DI containerにより、テスト観点以外の部分をstubやmockで解決できるようになった。

- Frameworkの親クラスの縛りからの開放
- 依存性の注入で依存関係を解決

テスト観点でない部分には、どんどんモックを導入する。

1. 状態中心のテスト　テスト前後でどう変わったか
2. 相互作用中心のテスト　どういうやり取りをしているか

モックに置き換えた部分は、別途テストを行い、最終的にモックに置き換えられないレベルまで階層を落とす。
当たり前だが、テスト観点のメソッドをモックにするのはNG!

E２Eテスト・シナリオテストから１つのメソッドのテストまで適用できる。
仕様の粒度には注意する必要がある。
テスト対象の使い方をテストするのが重要＝仕様をテストする。

粒度を書く際の注意として、XXフラグという表現はプログラマチックでビジネスとはかけ離れているので、ビジネスで使っている言葉を使う。

実際に社内でgive-when-thenで手動テストを書いてみた。

- テストを実行してエビデンスを取って最後にレビューをする。という流れから、事前にどういうテストを行うかレビューができたので、手戻りが減る。
- プログラマがテストを理解して進めるので、心理的安全。
- テストのやり方を変えたくらいでは、成果物の品質の差はない。
- ドキュメント作成のコスト増。

今後の展望
膨大な量の製品コードをどのようにテストするか。また品質保証するためには、リファクタリングでも高コスト。

- 散らばったテスト仕様を、一元管理したい。
- Spockの利用、E2Eの自動テストを活用した事例を作っていきたい。
- BDDやATDDなどアプローチはさておき、コードがリーダブルであることが大前提。

### API時代の仮説検証開発の提言とツール ～API編～

↓二人目の音森さんの発表資料
[API時代の仮説検証開発の提言とツール ～API編～](https://www.slideshare.net/kazukiotomori/jsug-2018-btc)

従来の開発：
序盤の「検討漏れや実装の段階で検証すると手戻りがある。仕様書や「コードのバージョン管理が必要

事例１：
半年設計・プロト、後に１年本開発。複数のベンダと連携が必要。
各ベンダで性質が異なる（設計書の有無・ソースを読めるかなど）。
APIを使う人と作る人で、どのレベルで疎通ができるかが大事。設計書、環境、ソース（環境：デプロイされてAPIを叩ける状態）。

ベンダが返却値を変更した場合、どのように連携するかが重要。
ベンダが提供する設計書と実際のソースに乖離がある場合も。

事例２：
対面で説明ができず、認識齟齬が起こる可能性。    

そこで、仮説検証開発

- 要望が正しいか
- 仕様が正しいか
- 成果物が正しいか

仮説・入出力確認・仮実装・本開発を回す。
それぞれを検証するためのツール↓。

#### [Swagger](https://swagger.io/)
粒度の齟齬を解決するにはSwaggerをつかうと実現できる。
作る側がSwagger editorでymlを記述するだけでAPIを叩ける。利用者がソースを見る必要がない。ただし、ソースとは連携していないのでソース変更があった場合はymlも修正が必要。

#### [SpringFox](http://springfox.github.io/springfox/)
ソースコードから仕様書を生成できる。
APIを使う人に仕様書を見せればいいので認識齟齬が減る。
実際に叩けるかどうかは別問題。

#### [Spring REST Docs](https://projects.spring.io/spring-restdocs/)
テストを実行すると成功したテストのドキュメントをAsciiDocに出力。Gradleでhtmlやpdfにもできるので、ドキュメントとソースの乖離をなくなる。
失敗したテストのドキュメントは出力されないので設計書の代わりになるわけではない。

結局はスピード感と粒度のバランスが重要。
yarnの二倍早いnpm ci登場。学習コスト０。ツールのインストール０

![alt](https://user-images.githubusercontent.com/26253721/39765058-e8d0eae4-531b-11e8-9305-4c852f269517.png)
詳細は以下の記事
http://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-reliable
まずnpm ciについて説明する。
packageのlockfileからのインンストールを爆速にしてくれるという者だ。
コマンドはnpm i の代わりに、npm ciとやるだけ。
そして必要なものは最新のnpmだけ
さあ、
npm install -g npm @latest
で、快適ハッキングライフを始めよう。

ただし問題点が一つある。

npm ci はpackage.lockがある状態でしか実行出来ないので、一番最初は、npm i  する必要があるのだ。

### パフォーマンスの比較
試しに適当なアプリをgithubから取ってきて、npmとyarnで比較してみた。

結果
lockFileがない状態の時
npm i 228秒
yarn install 91秒

lockFileがある時、
npm ci 62秒
yarn install 76秒

ちなみにほったらかしにしてたnpm4でnpm iすると、359秒だったw

yarnでもnpmでもどちらでもいい時代に来てるんだな。
Fortran の単項・二項演算子のオーバーロード

#Fortran での operator overload
Fortran90 で、単項演算子および二項演算子に対して、演算子オーバーロードが定義できるようになりました。組み込み型の単項演算子・二項演算子に対しては、組み込み型ですでに定義されている被演算子の型とダブらない必要があります。それは区別がつかなくなるためだと思います。

では、どのような組み込み型演算子に対してオーバーロードできるのか探してみました。素朴に考えて、正負の符号を与える単項演算子と加減乗除の二項演算子が思いつきます。このほかにべき乗の ** や、文字列結合の // も二項演算子としてオーバーロードできます。また、≧,≦,＞,＜,==,/= のような比較演算子や論理演算の二項演算子もオーバーロードできます。

単項演算子には、他に論理型を否定する .not. 演算子がありますが、前後に . の付いた演算子は、自由に定義できるので、それほど意味も無かろうかと思います。

演算子にはまだ見落としがあるかもしれません。
なおこれに加えるに、代入演算子 = もオーバーロードできます。

##ソース・プログラム
```fortran
module m_mod
  implicit none
! binary / dyadic  
  interface  operator (>=) !.ge.
    module procedure op2
  end interface
  interface  operator (>) !.gt.
    module procedure op2
  end interface
  interface  operator (<=) !.le.
    module procedure op2
  end interface
  interface  operator (<) !.lt.
    module procedure op2
  end interface
    interface  operator (==) !.eq.
    module procedure op2
  end interface
  interface  operator (/=) !.ne.
    module procedure op2
  end interface
  interface  operator (//) 
    module procedure op2
  end interface
  interface  operator (**)
    module procedure op2
  end interface
  interface  operator (.and.) !.or. .eqv. .neqv.
    module procedure op2
  end interface
 
! unary / monadic  
  interface  operator (.not.)
    module procedure op1
  end interface
  interface  operator (+)
    module procedure op1
  end interface
  interface  operator (-)
    module procedure op1
  end interface
contains  
  pure integer function op2(c1, i)
    character, intent(in) :: c1
    integer  , intent(in) :: i
    op2 = iachar(c1) + i
  end function op2    

  pure integer function op1(c1)
    character, intent(in) :: c1
    op1 = iachar(c1) 
  end function op1    
end module m_mod

program hello
  use m_mod
  implicit none
!  print *, 'c' >= 5, .not.'a'
  print *, .not. 'a'
  print *, +'b'
  print *, -'c'
end program hello
```
##実行結果
```
          97
          98
          99
続行するには何かキーを押してください . . .
```
CakePHP2系でComponentの単体テストを行って躓いた話

## 概要
CakePHP2系のアプリケーションに、新規でComponentを作成した。
そのComponentに対して、単体テストを行うとしたところ躓いたので残しておく。

## 内容
Componentに対して単体テストを作成し、[公式ドキュメント](https://book.cakephp.org/2.0/ja/development/testing.html#id27)を参考にsetUpに下記を記述。

```php5
public function setUp()
{
    parent::setUp();
    $CakeRequest      = new CakeRequest();
    $CakeResponse     = new CakeResponse();
    $this->Controller = new テスト用Controller($CakeRequest, $CakeResponse);
    $Collection       = new ComponentCollection();
    $this->Component = new テスト対象のComponent($Collection);
    $this->Component->startup($this->Controller);
}
```

これでテストケースを書いて実行したところ、テストケースが正常に走らなかった。
エラーログを確認したところ、下記が出力されている。

```
Error: Fatal Error (1): Call to a member function メソッド名() on a non-object
```

この出力されたメソッドはテスト用Controllerの親クラス（AppController）に定義されており、Webページとしてアクセスする分には問題なく利用できている。

何が原因なんだ…。

## 解決
テストケースのsetUp内に ` $Collection->setController($this->Controller); ` を追加することで解決した。

エラーログを見ると、メソッドがないと怒られているので ` テスト対象のComponent ` 内でControllerから受け取った値を見てみた（下記コードのgetController結果）。
すると、値がnullとなっており、Controllerがセットされていないことがわかった。

```php5
public function __construct(ComponentCollection $collection, $settings = array())
{
    $this->Controller = $collection->getController();
    parent::__construct($collection, $settings);
}
```
getがあるなら、setがあるだろうとCakePHPのコードを確認したところ、setControllerがあったのでビンゴ。
setControllerを呼び出すことで解決した。

```php5:最終型
public function setUp()
{
    parent::setUp();
    $CakeRequest      = new CakeRequest();
    $CakeResponse     = new CakeResponse();
    $this->Controller = new テスト用Controller($CakeRequest, $CakeResponse);
    $Collection       = new ComponentCollection();
    $Collection->setController($this->Controller);
    $this->Component = new テスト対象のComponent($Collection);
    $this->Component->startup($this->Controller);
}
```

以上、誰かのためになったら良いなと思い残しておきます。
最後まで読んで頂きありがとうございました。

## 参考
https://book.cakephp.org/2.0/ja/development/testing.html#id27
DOMをPNGに変換してリサイズしてからダウンロードする

## 必要なライブラリをインストール
```shell
yarn add dom-to-image
yarn add file-saver
```
- dom-to-image
    - https://github.com/tsayen/dom-to-image
    - 名前の通りDOMを投げると画像に変換してくれるすごいやつ。
    - ただリサイズとかはできないので別にやる必要あり。
- file-saver
    - https://github.com/eligrey/FileSaver.js/
    - 非対応のブラウザでもsaveAs()を使えるようにしてくれる。
    - blobとファイル名を渡してファイルをダウンロードする。

## 変換、リサイズ、ダウンロード
```javascript
import domtoimage from 'dom-to-image';
import FileSaver from 'file-saver';

// DOM要素をdomtoimageのtoPNGに渡すと結果がPromiseで返ってくる
domtoimage.toPng(element)
  .then(function (dataUrl) {

    // dataUrlが返ってくるのでImageを生成し生成した画像を読み込む
    const img = new Image();
    img.src = dataUrl;

    // 読み込みが終わったらリサイズのために、canvasを生成しimgを描画する
    img.onload = () => {
      const canvas = document.createElement('canvas');
      canvas.width = 128;
      canvas.height = 128;
      const ctx = canvas.getContext('2d');
      ctx.drawImage(img, 0, 0, canvas.width, canvas.height);

      // canvasをblobに変換し、FileSaverでダウンロードを行う
      canvas.toBlob((blob) => {
        FileSaver.saveAs(blob, "image.png");
      });
    };
  })
  .catch((error) => {
    console.log(error);
  });
```
- dom-to-imgaeは画像のリサイズに対応していないので、dataUrlを一度img要素に入れ、それをcanvasに描画することでリサイズを行なう。
Railsのソースコードで " ".freeze など文字リテラルにフリーズが多用されている理由

##Railsのソースコードで 文字リテラルにfreezeが多用されている理由は処理速度が早くなるから

railsのソースコードでこんな一文を見かけました。*1

```ruby:ruby

value.join(" ".freeze)
```

ここでvalueは配列です。

これはfreeze本来の意味では意味のないコードです。

joinした結果、freezeされていない新しい文字列が生成してしまいます。


ではなぜ「" ".freeze」と書いているのでしょうか。調べた所によると、freezeを書く理由は、次回以降の「" ".freeze」では文字列オブジェクトを生成しなくなるので処理速度がわずかに改善するからだそうです*2。


私はfreezeの意味を理解するために無駄に時間消費したのですが、
ソースコードを解りにくくしてまでfreezeする価値ってあるんでしょうかね。


<hr/>

*1:問題のコード
https://github.com/rails/rails/blob/3f2046f00ab0046f9252a5a7b52f617028bc4e0c/actionview/lib/action_view/helpers/tag_helper.rb#L268

*2:文字リテラルのfreezeに関して
http://d.hatena.ne.jp/ku-ma-me/20151004/p1
LaravelのMulti-Auth時のエラーページの出し分け

# エラーページの出し分け処理

裏画面を/backとする。

```php:app\Exceptions\Handler.php
public function render($request, Exception $exception)
{
    $blade_base = '';

    if ($request->segment(1) === 'back')
    {
        $blade_base .= $request->segment(1).'.';
    }

    if ($exception instanceof AccessAuthorizationException)
    {
        return response()->view('error.'.$blade_base.'403', [], 403);
    }

    if ($exception instanceof TokenMismatchException)
    {
        return response()->view('error.'.$blade_base.'419', [], 419);
    }

    if ( ! $this->isHttpException($exception))
    {
        return parent::render($request, $exception);
    }

    $status_code = $exception->getStatusCode();

    switch ($status_code)
    {
        case 403:
            return response()->view('error.'.$blade_base.'403', [], $status_code);
            break;
        case 404:
            return response()->view('error.'.$blade_base.'404', [], $status_code);
            break;
        case 500:
            return response()->view('error.'.$blade_base.'500', [], $status_code);
            break;
        case 503:
            return response()->view('error.'.$blade_base.'503', [], $status_code);
            break;
        default:
            return parent::render($request, $exception);
    }
}
```

# エラー用のテンプレートは以下のように置いておく

## 表画面のエラーテンプレート

```
resources\views\error\403.blade.php
resources\views\error\404.blade.php
resources\views\error\419.blade.php
resources\views\error\500.blade.php
resources\views\error\503.blade.php
```

## 裏画面のエラーテンプレート

```
resources\views\error\back\403.blade.php
resources\views\error\back\404.blade.php
resources\views\error\back\419.blade.php
resources\views\error\back\500.blade.php
resources\views\error\back\503.blade.php
```