OmniAICreator/Qiita-1.07M huggingface dataset:
PHPで帳票(PDF)をExcel(テンプレート)から生成するクラスを作ってみた

#はじめに
このところコロナの影響で暇になってしまったので、
昨年(2019)の10月頃にWebの業務アプリを作る事になった時のライブラリを公開したいと思います。

業務アプリなので、帳票がいくつかあって「TCPDF」などでゴリゴリ書いてもよいのですが、保守性を考えてレイアウトをExcelファイルで作成したいなと。
ところが、いろいろライブラリを探しても使えそうなものが、なかなか見つかりません。
そこで「PHPExcel」の後継の「PhpSpreadsheet」が結構使えそうたったので、「TCPDF」と組み合わせて作ってみました。

#概要
このクラスでは、エクセルファイルを読み込んで、セルの修飾情報などを読み込みます。
使う人は、必要に応じてシートオブジェクトに対して各種データのセットを行い、PDF出力メソッドによりWebページにPDFが出力されます。
基本的な使い方はこんな感じ↓


```php:MainController.php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use \App\Lib\excel2pdf;
use \PhpOffice\PhpSpreadsheet\IOFactory;
/**
 * テスト（メインコントローラ）
 */
class MainController extends Controller
{
	/*
	 *	テスト１
	 */
	public function index()
	{
		$ex	=new excel2pdf();
		$fname	= '..\storage\app\public/test.xlsx';	//帳票のレイアウトのエクセル
		
		$ex->setExcelFilename($fname);
		$book	= $ex->getBook();			//ブックオブジェクトも取得出来るよ

		$sheet	=null;
		if($book != null) {					//念のため
			$sheet = $ex->getSheet();		//シートオブジェクトを取得
			//セルに値をセットなどを行う
			$sheet->setCellValue('A18', 'まつもと');
			$sheet->setCellValue('D18', 15);		//数量
			$sheet->setCellValue('E18', 1200);		//単価
			//・・・・
			//・・・・
			
			$ex->setSheet($sheet);		//出力するシートを指定(ここでセルの修飾情報を取得していたと思う)
			
			$ex->writePDF();			//PDF出力・・・この後 exit()?
		}
	}
}
```

基本的な考え方は、出力するシート内の値と修飾情報を解析してセル単位でPDFに出力します。
ただし、PhpSpreadsheetにも不具合と思われる現象もいくつか見られ、バージョンによっては、レイアウトが思い通りにいかないことがあるかもしれません。
例えば、デフォルトのままだとセルの幅が取得出来ないとか。

あと、レイアウトの反映がうまくいかないときは、エクセルのセル等の設定を更新してみてください。
時々、それで修飾情報が取得できるようになる事があります。
１枚ものの帳票は、Excelファイルの設定に注意すれば、ほぼ問題なくPDF化できると思います。
あと、ソースコードを見て頂くと分かると思いますが「PhpSpreadsheet」でのセル情報へのアクセスの方法などが参考になると思います。
ただ、完全にエクセルのレイアウトを再現するのは難しいのがよく分かりました。（文字単位の設定など）
自分で使える程度の再現ができれば良しとしました。
罫線の太さなども適当ですよ。

##「excel2pdf.php」の主な制約
・セルの配置の「自動」には対応していません。
・オブジェクト・図形などは対応していません。(印鑑など出力されません)
・セル内の文字単位での修飾には対応していません。
・フォントの指定は適当に代替えフォントにします。
・ユーザ定義の罫線などには対応してません。
等々


##PDF出力の例は、こちら
![excel.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103847/44f7a34f-83b4-b093-8d05-46d8ffbdb9ea.jpeg)
![pdf.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103847/93e27122-0936-904d-451e-27cf8126df9b.jpeg)



#サンプルコードの説明
ララベルのプロジェクトになっています

◆テスト部分(メインコントローラ)
\xls2pdf\app\Http\Controllers\MainController.php

◆ライブラリ
\xls2pdf\app\lib\excel2pdf.php

◆レイアウトのエクセルの場所
\xls2pdf\storage\app\public

##環境
　OS:Windows10 CentOS など
　PHP7,composer がインストール済みである事


##お試し手順
①Gitからソースを取得
https://github.com/pheasant99/xls2pdf

②「xls2pdf」フォルダへ移動して
　composer install --ignore-platform-reqs
　↓でもいいけどエラーが出るかも(設定ミス？)
　composer install 

③「.env」ファイルの準備
　（.env.exampleをコピーしてリネーム）

④キーを生成(ララベルのため)
　php artisan key:generate

⑤サーバ起動
　php artisan serve
　
　ブラウザから
　http://localhost:80

#最後に
なお、ソースコードは改良した場合や流用した時は、連絡を頂きたく思います。
一応、著作権は放棄しないけど勝手に参考にしてください。

以上です。
【LPIC 101】GRUBの設定ファイルにおけるディスク・パーティション番号の指定の仕方

#はじめに
LPIC 101の勉強の中で「GRUBの設定ファイルにおけるルートパーティションの指定時のディスク・パーティション番号の指定の仕方」の問題が出てくるが、GRUB1と2で数え方が違い混乱したため、個人のメモとして残そうと思う。

#GRUB1
GRUB Legacy（GRUB1）ではディスク番号、パーティション番号ともに0から数える。
ルートパーティションを指定するには、「root(hdディスク番号,パーティション番号)」のように指定。
例）

1番目のディスクの1番目のパーティション　→　root(hd0,0)
1番目のディスクの2番目のパーティション　→　root(hd0,1)
2番目のディスクの2番目のパーティション　→　root(hd1,1)

#GRUB2
GRUB2でディスク番号は0から、パーティション番号は1から数える。
ルートパーティションを指定するには、「set root=(hdディスク番号,パーティション番号)」のように指定。
例）
1番目のディスクの1番目のパーティション　→　set root=(hd0,1)
1番目のディスクの2番目のパーティション　→　set root=(hd0,2)
2番目のディスクの2番目のパーティション　→　set root=(hd1,2)

参照
ping-t
https://ping-t.com/mondai3/kakumon_histories/view/59

Linux教科書 LPICレベル1 スピードマスター問題集
https://www.amazon.co.jp/dp/B01701BLCC/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
GitHub Actions の環境変数についてメモ



GitHub Actions (yaml) 上の環境変数の定義

```yaml:
env:
  HOGE: ''
  FUGA: ""
  PIYO:
  # HOGERA: ABC
```

これらは、GitHub Actions (yaml) 上ではすべて同じ定義(未定義と空文字の両方の性質を持つ存在)として扱われる。

GitHub Actions の step の実行条件である `if:` エリアでは、未定義でないかの判定はどれも

```yaml
# ...
steps:
  - name: HOGE
    if: env.HOGE != null
# ...
```

または

```yaml
# ...
steps:
  - name: HOGE
    if: env.HOGE != ''
# ...
```

で判定でき（ちなみに job の実行条件 では env は使えない）、`run:` のシェルエリアでは

```bash
if [[ -n $HOGE ]]; then
# ...
```

または

```bash
if [[ $HOGE != '' ]]; then
# ...
```

で判定できる。

GitHub Actions (yaml) 上で

```
AA${{ env.HOGE }}BB
```

は

```
AABB
```

のように展開される。（何も展開されない、という表現の方が正しいかもしれない。）

このように、冒頭の4パターンの `env` の定義はどのパターンを使おうが同一であるが、この環境変数 を別の言語であつかう場合は注意が必要である。（結論を先にいうと、`HOGERA` は未定義、それ以外は長さゼロの文字列として扱われる。）

例えば Ruby の場合、

```ruby
p ENV['HOGE'] # => ""
p ENV['FUGA'] # => ""
p ENV['PIYO'] # => ""
p ENV['HOGERA'] # => nil
```

となる。

## おまけ

GitHub Actions (yaml) 上の環境変数の定義

```yaml:
env:
  HOGE: 'ABC D'
  FUGA: "ABC D"
  PIYO: ABC D
```

はどれも同じであるので、好みの書き方でどうぞ。
【laravel】データベースの操作：DBファサード編

# 概要
laravelではデータベースを操作するにはいくつかの方法がります。

・DBクラスによる操作
・クエリビルダによる操作
・Modelクラス（Eloquent ORM）による操作

DBクラスもクエリビルダも`Illuminate\Support\Facades\DB`クラス（ファサード）による記述方法ですが、Modelクラスは`Illuminate\Database\Eloquent\Model`クラスを継承するため仕組みが異なります。

そのため、DBクラスとModelクラスで投稿を分けて記述します。
[【laravel】データベースの操作：Elequent編]
(https://qiita.com/gone0021/items/951cd63a7e591e18cd2a)

余談ですがエディタでVSCodeを使用している場合は、拡張機能によりSQL文を大文字で記述することにより色が変わり見やすくなります。


# DBクラス共通の記述
DBクラスでもクエリビルダでもDBファサードによる記述のため`Illuminate\Support\Facades\DB`をuseします。

```php:
use Illuminate\Support\Facades\DB;
```

#DBクラスによる操作
`DB::SQL値(SQL文、パラメータ配列)`で記述する方法でデーターべースを操作します。
SQL文をそのまま使用するイメージで記述できるためわかりやすいですが他の記述方法よりSQL文を理解する必要があります。

例）usersテーブルのselectとupdateとdelete

```php:全てをselect
public function select(Request $request) {
 $items = DB::select('SELECT * from users');
 return view('sample.index',['items' => $items]);
}

// 記述方法：DB::select('SELECT文')
```

```php:特定のIDをselect
public function select(Request $request) {
 $items = DB::select('SELECT * from users where id =:id', ['id'=>$request->id]);
 return view('sample.index',['items' => $items[0]]);
}

// 記述方法：DB::select('SELECT文', 'パラメータ')
// returnする際は、配列の0番目であることを記述すること
```

```php:特定IDのレコードをupdate
public function update(Request $request) {
 $param = [
  'id' => $request->id
  'name' => $request->name,
  'age' => $request->age,
 ];
 DB::update('UPDATE users set name=:name, email=:email where id=:id', $param);
}

// 記述方法：DB::update('UPDATE文', 'パラメータ')
```

```php:特定IDのレコードをdelete
public function dalete(Request $request) {
  $param = ['id' => $request->id];
  DB::delete('DELETE from sample where id =:id', $param);
}

// 記述方法：DB::dalete('DELETE文', 'パラメータ')
```


#クリエビルダによる操作
SQL文を生成するためのメソッドをメソッドチェーンで記述することによりデーターベースを操作します。
`DB::table('テーブル名')->DBメソッド`のように記述して操作します。
DBクラスのメソッドですが、ほぼSQL文と同じように記述できるためSQL文がある程度理解できていれば違和感なく使用できると思います。

例）usersテーブルのselectとupdateとdelete

```php:全てをselect
public function select(Request $request) {
 $items = DB::table('users')->get();
 return view('hello.index',['items' => $items]);
}

// 記述方法： DB::table('テーブル名')->get(['フィールド名', )
// getメソッドの引数を指定しなければ全てのフィールドが取得される
```

```php:特定のIDをselect
public function select(Request $request) {
 $items = DB::table('users')->where('id',$request->id)->first();
 return view('hello.index',['items' => $items]);
}

// 記述方法：DB::table('テーブル名')->where('フィールド名',パラメータ)->first();
```

```php:特定IDのレコードをupdate
public function update(Request $request) {
 $param = [
  'id' => $request->id
  'name' => $request->name,
  'age' => $request->age,
 ];
 DB::table('users')->where('id',$request->id)->update($param);
}

// 記述方法：DB::table('テーブル名')->where('フィール名',パラメータ)->update(パラメータ);
```

```php:特定IDのレコードをdelete
public function dalete(Request $request) {
  DB::table('samole')->where('id', $request->id)->delete();
}

// 記述方法：DB::table('テーブル名')->where('フィール名',パラメータ)->delete(パラメータ);
```



# 参考
[データベース：利用開始]
(https://readouble.com/laravel/6.x/ja/database.html)
[データベース：クリエビルダ]
(https://readouble.com/laravel/6.x/ja/queries.html)
ALBに設定したサブネットにインターネットゲートウェイがアタッチされていないことでサイトの表示が遅くなっていた。


#発生した問題  
AWS（EC2、RDS、ALB等）を使用し本番環境を構築したが、サイトにアクセスする際、1分以上時間がかかっていた。

#原因
私の場合は、ALBにパブリックサブネットを２つ指定していたが、片方のサブネットにインターネットゲートウェイがアタッチされていなかったことが問題だった。

#解決した方法
###デベロッパーツールでどこに問題があるか確認
chromeのデベロッパーツールでNetworkをみて、どこに時間がかかっているか調べた。
<img width="1675" alt="スクリーンショット 2020-05-08 10.10.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633846/642f6d7c-8bf0-81f3-228d-f1de7457093e.png">

<img width="404" alt="スクリーンショット 2020-05-08 10.10.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633846/980acc1f-28b3-822f-e8c0-76b3d9836fd8.png">

Initial connectionに時間がかかっていた。

参考になる記事がないか探したらあった。

Chrome + ELB(ALB)で接続が遅い問題
https://qiita.com/TakenoriHirao/items/a3ace404d785e6a4db22

###ロードバランサーを確認
EC2ダッシュボード→ロードバランサー→ロードバランサーを選択→アベイラビリティーゾーン→
サブネットの編集をクリック

すると、この画面が表示され、

<img width="931" alt="スクリーンショット 2020-05-08 12.33.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633846/57e3e5de-7200-bf8b-4af9-7b6c2e17f738.png">


ここに「subnet-*******にアタッチされたインターネットゲートウェイが存在しません」と書いてあった。

###サブネットにインターネットゲートウェイをアタッチする
VPC→ルートテーブル→先ほど表示されたインターネットゲートウェイがアタッチされていないサブネットを選択
→ルートテーブル→ルート→ルートの編集
からインターネットゲートウェイを追加

###デベロッパーツールで再度確認
<img width="1654" alt="スクリーンショット 2020-05-08 12.53.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633846/409b0b7a-b685-1f5c-1c7d-d1bc979bc7bd.png">

すぐに表示されるようになった。

初学者ですので間違い等あれば指摘してください。
Railsチュートリアル：12章(わからないとこメモです)

もはや最後までいったんいくことのみが目標になってしまった

#第12章パスワードの再設定

やることまとめ。

- ユーザーがパスワードの再設定をリクエストすると、ユーザーが送信したメールアドレスをキーにしてデータベースからユーザーを見つける
- 該当のメールアドレスがデータベースにある場合は、再設定用トークンとそれに対応するリセットダイジェストを生成する
- 再設定用ダイジェストはデータベースに保存しておき、再設定用トークンはメールアドレスと一緒に、ユーザーに送信する有効化用メールのリンクに仕込んでおく
- ユーザーがメールのリンクをクリックしたら、メールアドレスをキーとしてユーザーを探し、データベース内に保存しておいた再設定用ダイジェストと比較する (トークンを認証する)
- 認証に成功したら、パスワード変更用のフォームをユーザーに表示する

##12.1 PasswordResetsリソース

ブランチを作成後、

```ruby
rails generate controller PasswordResets new edit --no-test-framework
```

実行しようとすると

```ruby
FATAL: Listen error: unable to monitor directories for changes.
Visit https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers for info on how to fix this.
```

調べてみるとよい解決策を公開されている方が。

[rails consoleが起動できない時の対処法（「FATAL: Listen error」エラー編）](https://qiita.com/yn-misaki/items/c850a07f7858437e4d26)


言われたとおりにやるとすぐ解決しました。

##12.1.2 新しいパスワードの設定

##12.1.3 createアクションでパスワード再設定

ここは意外と理解できる
コードとしてというよりは構造として。

##12.2 パスワード再設定のメール送信

##12.2.1 パスワード再設定のメールとテンプレート

##12.2.2 送信メールのテスト

この辺は前章の復習に近い。全勝が理解できてれば問題ないとおもう。

##12.3 パスワードを再設定する

##12.3.1 editアクションで再設定

このリンクを機能させるためには、パスワード再設定フォームを表示するビューが必要です。このビューはユーザーの編集フォーム (リスト 10.2) と似ていますが、今回はパスワード入力フィールドと確認用フィールドだけで十分です。

ただし、今回の作業は少しだけ面倒な点があります。というのも、メールアドレスをキーとしてユーザーを検索するためには、editアクションとupdateアクションの両方でメールアドレスが必要になるからです。例のメールアドレス入りリンクのおかげで、editアクションでメールアドレスを取り出すことは問題ありません。しかしフォームを一度送信してしまうと、この情報は消えてしまいます。この値はどこに保持しておくのがよいのでしょうか。今回はこのメールアドレスを保持するため、隠しフィールドとしてページ内に保存する手法をとります。これにより、フォームから送信したときに、他の情報と一緒にメールアドレスが送信されるようになります。実際のコード (リスト 12.14) を見てみましょう。

↑これはわかりやすい説明。概念的には。


##12.3.2 パスワードを更新する

updateアクションでは、次の４つのケースを考慮する必要があります。

- パスワード再設定の有効期限が切れていないか
- 無効なパスワードであれば失敗させる (失敗した理由も表示する)
- 新しいパスワードが空文字列になっていないか (ユーザー情報の編集ではOKだった)
- 新しいパスワードが正しければ、更新する

##12.3.3 パスワードの再設定をテストする

##12.4 本番環境でのメール送信 (再掲)

とくにコメントなくおわってしまった。
InheritedWidgetをざっくり理解する

Flutter学習中に、InheritedWidgetがとっつきにくかったので、
その特徴等、超ざっくり書き留めておこうと思います。
PJ内初心者メンバーに手短に説明する際に役立てば良いなと。

※以下の記事を自分なりに噛み砕いた内容になっています。
[InheritedWidget を完全に理解する](https://medium.com/flutter-jp/inherited-widget-37495200d965)
分かりやすく具体的に書かれており大変参考になりました。

##InheritedWidgetの特徴
- child Widgetから、上位のWidgetに高速にアクセスできる。

- 変更を特定のchild Widgetのみに伝番させる（リビルドさせる）ことが出来る。

前者については、InheritedWidgetでなくても、
BuildContext.findAncestorWidgetOfExaxtTypeを使ってアクセスは可能だが、
これはツリーを順に走査するため、計算量がO(N)となり高速とはいかない。
InheritedWidgetではO(1)でアクセスできる。

後者については、InheritedWidgetには、自身を返す機能が大きく以下の2つあるので、
child widgetから、そのどちらを呼ぶかを使い分けて実現できる。

- dependOnInheritedWidgetOfExactType
Widgetの変更を監視して、変更があったときに最新の状態を伝番することが出来る。
なお、変更の監視を行うため、didChangeDependencies以降のタイミングでしか呼べない。

- getElementForInheritedWidgetOfExactType
単にInheritedWidgetビルド時点のElementを取得する。
なお、監視しないので、initSateでも呼べる。

#使い方
上位WidgetをInheritedWidgetを継承して作り、
それに、自身を返す(引数にBuildContextを持つ)のようなFunctionを用意する。
自身を返す際には、
context.dependOnInheritedWidgetOfExactType()　もしくは、
context.getElementForInheritedWidgetOfExactType()　で返すようにする。
変更がある度に最新ものを伝番したい場合は、前者で返すようにする。
変更があっても伝番したくない場合は、後者で返すようにする。

そして、その上位Widgetのchildに設置したWidgetから、
上位widgetで実装した自身を返すFunction　を呼ぶ事で、
上位Widgetが取得でき、そのプロパティを取得できる。

そんな感じ。
次はProviderのお勉強かな。
【開発ログ②】有給休暇を管理するアプリを作ろうと思うので、思いついた仕様を載せる

# 前提について
はじめまして、いりふねと申します。
現在プログラミングスクールにてアプリケーション開発の勉強をしております。３２歳独身A型、さそり座です。

この記事は、スクールの課題である個人開発アプリの記録であり、私自身のアウトプットの場として設定しております。未熟な点も多いと思いますが、見かけてくださった方にどんどん指摘をしてほしいと思っております。

また、開発するアプリケーションについては、実際にデプロイまでは行う予定ですが、サービスとしてリリースするわけではありません。アプリケーションの性質上、高いセキュリティを求められるものであり、短期で仕上げるようなものではないと思っているからです。完成品には「注意書き」も入れようと思いますが、くれぐれも完成品を見かけても個人情報を書き込まないで下さい。

では、本題へどうぞ。


# そもそも仕様の書き方よ
もっというと「仕様」って何よ？ってところにいます。
そもそも私がこの記事に書きたいのは「どんなアプリケーションにしますよ」「こんな機能がありますよ」「こんなページを作るよていですよ」といった完成形のイメージです。
それ「仕様」で合っているのか、私の認識が間違っているのか。。。

# 今回の仕様の定義
[こちらの記事](https://monstar-lab.com/dp/blog/howto-specification/)を参考にさせていただきました。

>「仕様書」は完成イメージを明確にした資料であるのに対し、「設計書」は完成するまでの制作工程を明確にした資料。

>つまり「こんなWebサービスやアプリを作りたい」という要求に対し、仕様書は着地・結果を示すもので設計書は制作過程を示すものということです。

今回は、こちらの定義で「着地・結果」を表現する
アプリケーションの仕様を書いていきます。

# 仕様書のフォーム
[こちらの記事](https://qiita.com/ko1/items/9f5f1a2683ea54f12362)を参考にしました。
今回は、画面仕様と機能仕様について書いていきますが、
その前に大枠を把握していただきたいので、
アプリ名の他、5W1Hを書いた「表紙」をつけることにしました。
データベースの定義等は、次回以降に書きます。

# 仕様書
## 表紙 5W1H
アプリ名：バックヤード（英表記:backyard）

●どんなアプリか(What)：
有給休暇管理ツール

●誰のためのアプリか(Who):
複数の店舗や支店の人事を一手に担う中小企業の管理者。
具体的には、コンビニオーナーさんなど。

●なぜ作りたいのか(Why):
小規模かつ他店舗の管理者には以下のような悩みがあると考えた。

　①営業活動と管理業務を並行で行うプレイングマネージャー的な
　　動きを要求されており、管理業務に専念することができない。
　②利益を優先するため、管理や事務的な業務の改革が進まない。
　③年５日の有休取得が義務となり、
　　社員の残日数をリアルタイムで把握しなければならなくなった。
　④例え、社会保険労務士などの専門家を雇っていたとしても、
　　有給日数の残日数の問合せがあればすぐに返答しなければならない。

上記のような悩みを解決するために開発する。

●いつまでに完成させるのか(When):
最終完成日：5月１９日(火) 14:00まで

●どのように提供するか(How)：
ブラウザからアクセスするWebページとして提供する。

## 画面仕様
PowerPointで簡単に書きました。
ちゃんとしたビューができたらまたアップします。
<img width="764" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614723/1c14460c-1ed6-e76c-33cd-384b9a783878.png">

## 機能仕様
- ユーザー登録、ログイン、ログアウト
- 支店登録と社員登録
- 有休休暇一覧の表示
- 社員の名前で検索
- 年間5日間の未消化社員を判別するアラート
- 有給の消化を登録する入力フォーム
- 誰がいつ何日、消化したかを調べる消化ログの表示
- 有休申請の届出PDFの表示

以上です。
書いていて、できるのだろうかと思うのは内緒。。。

# 今日の積み上げ
画像の貼り付けは、ドラッグ＆ドロップでOK。
リンクは、文字列を大括弧[]で囲い、直後に括弧()でURLを書けばOK。
箇条書きは、行頭にハイフンと半角空白でOK。
Laravelで必要なコマンドなど備忘録

## 設定を日本に変更する

```config/app.php
'locale' => 'en' -> 'locale' => 'ja'
'timezone' => 'UTC' ->  'timezone' => 'Asia/Tokyo'
```

## キャッシュの作り直し 
```
php artisan config:cache
```

## .envのAPP_KEY自動生成
No application encryption key has been specified. 
のエラーが出たときは、.envのAPP_KEYが未設定だと思われる。

```
php artisan key:generate
```

## Laravelのhelperインストール
```
composer require laravel/helpers
```
Oracle Database SE向け高可用性ソリューションStandard Edition High Availabilityがリリースされたよ

# SE向け高可用性ソリューションStandard Edition High Availabilityがリリース
2020年3月にSE/SE2向け高可用性ソリューションの記事を書いたけれど、ついにリリースされたようだ。

**こちらが今回のニュースリリースブログ**

* [Standard Edition High Availability Released - See What's New](https://blogs.oracle.com/maa/standard-edition-high-availability-officially-released)

**こちらが以前わたしが書いた記事**

* [SE2 RACユーザーに朗報。SE2用の新たな高可用性ソリューションが近日リリース？](https://qiita.com/yamada-hakase/items/c13974ee55d709172891)

# Standard Edition High Availabilityとは

おそらく[「オラクルエンジニア通信」](https://blogs.oracle.com/oracle4engineer/)に邦訳が出ると思うけれど、要点をかいつまんで紹介しよう。

* **Oracle Grid Infrastructureを利用したactive/passiveフェイルオーバーソリューション**
* **Oracle Database 19c release update (RU) 19.7以降で対応**
* **10日間フェイルオーバールールが適用。待機系ライセンスは不要だが、使っていいのは年間10日まで**
* **今回Linux x86-64版がリリースされ、Windows版とSolaris版は今後リリース予定**

基本はこんなところ。もう少し掘り下げると、↓このくらいだろうか。

* **2台のサーバーと1台のストレージ（iSCSI, SCSI, SAN）が必要**
* **Release Update 19.7 以降の機能なので（パッチで提供）、セットアップは「19.3をインストール」「Release Updateを適用」の順で実施**
* **<font color="red">新規インストールか既存のシングルインスタンスに追加設定する。SE RACから直接移行する方法はない</font>**
* **データファイルはOracle ASMかOracle ACFSに配置**
* **RAC One Nodeとの違いは、オンライン・リロケートやローリング・アップグレード、アプリケーション・コンティニュイティなどの可用性を高める機能が無いこと**

# おわりに

Standard Edition High Availabilityのリリースは、SE2で高可用性を組むときの新たな選択肢が増えたと言える。サードパーティー製品が不要になるのも、サーバー構成によってはメリットと感じる人もいるだろう。

しかし、SE/SE2 RACから直接アップグレードできないのは既存ユーザーにはつらいところ。SE/SE2 RACは18cまでしかサポートされない。そのため19cに移行するには、もう1セットサーバーを用意する必要がある。また同じOracle Grid Infrastructureを使っているとは言え、運用手順の見直しも必要だ。

日本では、パッチをあまり適用しないことが多い。そのことを考えると、サポートの問題はあっても既存のSE2 RACはシステム更改まで使い、次期システムでStandard Edition High Availabilityに移行するならば移行コストは無視できるかもしれない。

まあシステム更改となると、いつまでOracle Databaseを使うのかとか、クラウドに移行するのかなど、もっと選択肢は増えるだろうが。

またWindowsにおける高可用性ソリューションOracle Fail Safeは19c以降は非推奨（deprecated）なので、その代替ソリューションになるだろう。
Processing - 15 - マウス座標と円の移動

<img width="318" alt="スクリーンショット 2020-05-08 12.13.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45520/7456c50d-56be-1a5c-9279-672268dea325.png">



```java:
void setup(){
  size(320,480);
  noStroke();
}

void draw(){
  background(124,235,235); 
  ellipse(50 ,mouseY-100,40,40);
  ellipse(100,mouseY-50 ,40,40);
  ellipse(150,mouseY    ,40,40);
  ellipse(200,mouseY+50 ,40,40);
  ellipse(250,mouseY+100,40,40);  
}

```
Scrum开发 

Scrum 是一个框架,在这个框架中人们可以解决复杂的自适应问题,同时也能 高效并有创造性地交付尽可能高价值的产品。

Scrum 是:轻量级的、容易理解的 、难以精通的

Scrum 不是开发产品的一种流程或一项技术,而是一个框架,在这个框架里可以应用各种流程和技术。
Scrum能使产品管理和开发实践的相对功效(relative efficacy) 显现出来, 以便进行改进。

Scrum 框架由 Scrum 团队及其相关的角色、事件、工件和规则组成。框架中的每个模块都有其特定的目的, 对Scrum的成功实施和运用都至关重要。

Scrum 基于经验型流程控制理论, 或者称为经验主义。经验主义主张知识源于经验, 而决策基于已知的事物。Scrum采用迭代增量式的方法来优化可预测性和管理风险。

透明性、检视、调整是经验型流程的三大支柱,支撑起每个经验型控制流程的实施。

Scrum组成人员
<img width="483" alt="scrum team.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593810/099e924a-9106-f793-58a2-1afb43d01968.png">

Scrum流程
<img width="586" alt="scrum work.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593810/66420324-75ea-d9b4-226d-1a571c614065.png">

1.我们首先需要确定一个 Product Backlog（按优先顺序排列的一个产品需求列表），这个是由 Product Owner 负责的；

2.正式开始一个 sprint 开始之前，产品、研发、测试需要一同开一次 sprint planning meeting，共同讨论本次 sprint 的功能点，需求讨论或技术讨论；成员预估需求所需开发时间；团队输出是否满足需求，排入 sprint backlog；

3.planning meeting 下来之后每个团队成员对自己在这个sprint中的工作进行整理，拆分小任务，预估开发完成时间，自己排自己的优先级；

4.进行 Daily Scrum Meeting，这个环节在 agile 中非常关键，是 agile 的日常修炼，控制在15分钟左右，每个人都必须发言，并且要向所有成员当面汇报你昨天完成了什么，并且向所有成员承诺你今天要完成什么，同时遇到不能解决的问题也可以提出来寻求帮助。完了以后SM负责根据结果更新 burndown chart；

5.当一个 Sprint 结束时，我们要进行 Sprint Review Meeting，也称为评审会议，产品负责人和客户都要参加，每一个Scrum Team的成员都要向他们演示自己完成的软件产品（这个会议非常重要，一定不能取消）；

6.最后就是 Sprint Retrospective Meeting，复盘这个 sprint，以轮流发言方式进行，每个人都要发言，总结并讨论做得好的地方、需要改进的地方；根据实际情况进行下一个 sprint 的任务安排。

这样周而复始，按照同样的步骤进行下一次Sprint.


Scrum 关键词汇解释
1.product backlog: 可以预知的所有任务， 包括功能性的和非功能性的所有任务。

2.sprint: 一次跌代开发的时间周期，一般最多以30天为一个周期.在这段时间内，开发团队需要完成一个制定的backlog,并且最终成果是一个增量的，可以交付的产品。

3.sprint backlog: 一个 sprint 周期内所需要完成的任务。

4.Scrum Master: 确保团队合理的运作 Scrum，并帮助团队移除实施中的障碍。

5.PO (Product Owner): 即产品负责人，确定产品的方向和愿景，定义产品发布的内容、优先级及交付时间，为产品负责。

6.scrum team(开发团队): 一个跨职能的小团队，包括开发测试，人数5-9人为佳，团队拥有交付可用软件需要的各种技能。

7.time-box: 一个用于开会时间段。比如每个 daily scrum meeting(每日站立会议) 的time-box为15分钟。

8.sprint planning meeting: 在启动每个sprint前召开。该会议需要制定的任务是：PO 和团队成员将 backlog 分解成小的功能模块,决定在即将进行的 sprint 里需要完成多少小功能模块，确定好这个 Product Backlog 的任务优先级。另外，该会议还需详细地讨论如何能够按照需求完成这些小功能模块。制定的这些模块的工作量以小时计算。

9.Daily Scrum meeting：开发团队成员召开，一般为15分钟。每个开发成员需要向 team 汇报三个项目：
     ①昨天完成了什么，完成了百分之多少，还剩百分之多少？
　　 ②今天你打算做什么？
     ③完成你的目标是否存在什么障碍？
    

10.Sprint review meeting：在每个 Sprint 结束后，这个Team将这个 Sprint 的工作成果演示给 Product Owner，客户，老板和其他相关的人员。

11.Sprint retrospective meeting：对刚结束的Sprint进行总结。会议的参与人员为团队开发的内部人员。一般该会议为1小时。

Scrum 三大角色
Scrum“角色”–无规矩不成方圆
PO
必须有一个项目持有者，制定规划并把握项目走向，一般就是产品经理。
SM
敏捷教练。一般由对技术开发以及当前项目明晰的技术经理担任。
TEAM


Scrum 的特性
不断交付软件以满足客户需求，每个迭代版本都是可运行的
欢迎需求的变化
及时沟通，拒绝过度设计
量化了工作项目的进度和团队的产出
流程简单，沟通顺畅
Goで簡単なHTTPサーバーとSystemdの自動起動の設定

本ページではGoで簡単なHTTPサーバのコードを掲載し、systemdでLinux(Ubuntu, Archlinux)のサービスのプログラムの自動起動を行います。


# Goで簡単なHTTPサーバのコード
```sh
$ pwd
$HOME/go/src/SimpleHttp

$ cat SimpleHttp.go
package main

import (
        "fmt"
        "net/http"
)

func SimpleHttpHandler(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Simple HTTPサーバー & Systemd Serviceの設置")
}

func main() {
        http.HandleFunc("/", SimpleHttpHandler)

        // 8080ポートで起動
        http.ListenAndServe(":8080", nil)
}
```

# SimpleHttpのビルド
```sh
$ pwd
$HOME/go/src/SimpleHttp

$ tree
.
└── SimpleHttp.go

0 directories, 1 file

$ go build SimpleHttp.go

$ tree
.
├── SimpleHttp
└── SimpleHttp.go

0 directories, 2 files
```

# ユニットファイルSimpleHttp.serviceの内容

```sh
$ cat /lib/systemd/system/SimpleHttp.service 
[Unit]
Description = SimpleHttp.service daemon

[Service]
Environment="GOPATH=$HOME/go"
ExecStart=$HOME/go/src/SimpleHttp/SimpleHttp
Restart=always
Type=simple
User=ubuntu
Group=ubuntu
# Other directives omitted
# (file size)
LimitFSIZE=infinity
# (cpu time)
LimitCPU=infinity
# (virtual memory size)
LimitAS=infinity
# (open files)
LimitNOFILE=64000
# (processes/threads)
LimitNPROC=64000

[Install]
WantedBy = multi-user.target
```


# SimpleHttpサービスのリロード
新規のユニットファイルSimpleHttp.serviceの作成または変更後に常に以下のコマンドを実行します。

```sh
sudo systemctl daemon-reload
```

# SimpleHttpサービスの有効
```sh
$ sudo systemctl enable SimpleHttp.service
```

# SimpleHttpサービスの起動
```sh
$ sudo systemctl start SimpleHttp.service
```

# SimpleHttpサービスの停止
```sh
sudo systemctl stop SimpleHttp.service
```

# SimpleHttpサービスの無効化
```sh
$ sudo systemctl disable SimpleHttp.service
```

# ArchLinuxのバージョンの確認
```sh
$ uname -a
Linux arch.local 5.6.10-arch1-1 #1 SMP PREEMPT Sat, 02 May 2020 19:11:54 +0000 x86_64 GNU/Linux

$ lsb_release -a
LSB Version:	1.4
Distributor ID:	Arch
Description:	Arch Linux
Release:	rolling
Codename:	n/a
```


# Ubuntuのバージョンの確認
```sh
$ uname -a
Linux ip-172-31-8-186 5.3.0-1017-aws #18~18.04.1-Ubuntu SMP Wed Apr 8 15:12:16 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.4 LTS
Release:	18.04
Codename:	bionic
```
オブジェクト指向とは

>C#はオブジェクト指向と呼ばれる考え方に基づいて作られています。 C#に限らず、最近のプログラミング言語のほとんどがオブジェクト指向に基づいた設計になっています。
>>プログラムを作るときにはまずデータ構造を決める。
オブジェクト指向: データ構造を中心に考える。
データ構造は、中身を隠す（カプセル化する）と、必要なところだけ見えて分かりやすい。
継承と多態性という概念もあります。


##手続きとデータ構造
>代入文や条件分岐、反復処理、構造体などの機能は**`手続き`（procedure：プログラムの動作の手順）**を書くためのものです。
プログラムを作るとき、まず**`データ構造`（data structure：プログラム中で使うデータをどのようにして記憶しておくか）を決めなければなりません**。 データ構造が決まって初めて、そのデータをどのように処理していくかという手続きが決まるわけです。

データから処理していくという設計がオブジェクト指向。

##オブジェクト
>前節で述べたように、手続きを中心とするのではなく、データを中心としてそのデータに対する操作として手続きを書いていくのが自然なプログラム作成手法なわけです。 
このような、**操作の対象としてのデータ構造のことを`オブジェクト`(object : 対象、物体)**といい、**オブジェクトを中心としてプログラムを設計していく手法のことを`オブジェクト指向`（object oriented）といいます。**

データ構造のことをオブジェクト,
オブジェクトからプログラムを設計していくのをオブジェクト指向。

###中身の隠蔽（カプセル化）
>オブジェクト指向の考え方では、 **オブジェクトは`中身（内部実装）`がどうなっているのかを隠蔽し、` 可能な操作と属性（外部仕様）`のみを公開すべきだと言われています 。**
**可能な操作のことを`メソッド`(method : 方法、手段)といい、属性のことを`プロパティ`(property : 所有物、属性)といいます。**

中身は見れずに、外でできるのは操作することとそれの機能をみることだけ。

###継承
>オブジェクトには継承という概念があります。

機能を引き継ぐこと。

###多態性
>継承を使うと、同じ属性・同じ操作でも、オブジェクトごとに異なる振る舞いになる場合があります。

よくわからん？・

###まとめ

データから設計するプログラミング手法。
中身を見せず、外では操作させ、見せる。
潜在意識を操作する

> こちらの記事は、[Luis Cuende](https://luisivan.net/) 氏により2014年8月に公開された『 [Subconscious manipulation](https://luisivan.net/posts/subconscious-manipulation-ef397dca934b)』の和訳です。
> 本記事は原著者から許可を得た上で記事を公開しています。

私は子供の時にどんな質問を両親にしたかを今でも覚えています。５才から７才の時が一番質問していました。父に宇宙の起源を聞いたこともあります。

もちろん父は私に納得のいく答えをくれませんでした。「ビッグバンはどこから来たんだろう?」と自問してからはビッグバンについても納得できなくなりました。答えが見つからず、私の物理学やその類の興味関心はどんどん高まっていきました。

何にも知らないただの子供が宇宙のことを聞くなどおかしな話だと思うかもしれません。しかし問題はその答えを理解できるかどうかではなく、社会的に「当たり前」とされていることを問うことだと思います。

私たち人間は社会的な存在です。私たちは他の人に影響を与え、他の人も私たちに影響を与えられます。高校生活ではそれが顕著に現れます。誰もが普通でいたいので、縁取りをすることはあまりないでしょう。異質でいたいかって？いいやイケてる子の言うことを聞いて、その子の着ているものを真似して、その子がやってるゲームをしていればいい。最後には典型的な高校生になっているはず。しかしながらこの恐ろしい行動は高校に入る前から、それどころか私たちの人生のとても早い段階からはもうすでに始まっているのです。

私には3歳と2歳になる姪っ子が二人います。最近の子供達と同じように、いつもテレビや映画を見ています。私もたまにしますけどね。好きだからじゃありません。本当はテレビが大嫌いです。それでも見るのは脅威を感じるからです。

これらの映画やテレビのシリーズの多くは中世の王や女王を題材にしています。しかし、歴史とは裏腹に、中世の世界は魔法があって素晴らしい時代であり、王は人民の英雄であると考えられています。 **なぜなら彼らは王であり、他を支配する力を与えられているからです。** 

朝９時から５時まで働いて、車を持っていて、猫を飼っていて、奥さんがいるような男性や、自分自身の為に何かをするのではなく、人々を救うヒーローをよく見かけます。自然を見かけることがどんどん少なくなり、その代わりにピンク色をした牛や、運転をする豚や人を襲う狼などが出てきました。そして残念なことに私の姪っ子達は狼に似ているからという理由だけで私の犬のSiraという名のアラスカンマラミュートを怖がっています。それは青は男の子、ピンクは女の子の色といったようなシンプルな理由です。

現実世界ではこれを **ステレオタイプ** や **偏見** と言います。

私はつい最近Brave New World by Aldous Huxleyという本を読み終えました。もし読んだことがないなら **絶対に** 読むべきです。その本は、皆が幸せで、全てが造り物で、政府によって慎重にコントロールされている闇の社会の事が書かれています。

Brave New Worldでは睡眠学習を使っています。睡眠学習とは、誰かが寝ている間に何度も同じ文章を読み聞かせ、それを信じ込ませる事です。テレビや映画と、この睡眠学習には共通しているものがあります。それは **全てを無意識に学んでいるという事** です。人々は知らないうちに学んでいるという事です。

そしてこれは実際に気付く事はとても難しいのです。 **これらの思考は人々の思考にくっついて離れず、そして人々はこれに対して何の疑問も持ちません。** 


無力感が漂い、人々は何に頷いているのかも分からず適当に相槌をしている。私は何年か前にこの社会に違和感を持ち始めました。

![eye.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407975/e28cef74-da65-de5b-c1e9-6fca408631ae.jpeg)


しかしこの疑問が何年か前に解消されました。

パラノイア（被害妄想）と呼ぶこともできますが、私はそうは思いません。社会というものはこういうもので、これが現実なのです。人々は様々なメディアを介して操られてきました。私には目に見えてわかるような操りは怖くありません。怖いのは、ほとんどの人が気付かないで **無意識に操られる事** です。

そしてその **無意識に操られていることに気付いた人たちは、異常者としてのレッテルを貼られます** 。ですがここで問題なのは、メディアVS気付いた人々ではなく、操られていることに気付いていない人VS気付いている人です。なぜなら、新たな思考が自分の気付かないうちに頭に入ってくると、 **ふとした瞬間にそれを疑問に思うまで** 、自分の中の一つの考えであると混乱するからです。しかし **正しいと思い込んでいるその思考が、操作されたものかどうかを疑問に思う事はほぼないでしょう** 。

それによって多くの人々は、自分たちの、すなわちメディアの考えを信じはしませんが、それを必死に擁護しようとします。ここで私が言いたい事は、自分の考え方を信じられなくても、いつか無力感と現実の中で、自分が持っている考えが自分のものではないと気付くでしょう。

なので、 **無力だと思わないで** 下さい。

  **私たちが創り上げたこのおかしな世の中を止めて下さい**。 

 **目を見開いて真実を見極めて下さい** 。 

最後に、 **全ての事柄に対して疑問を持って下さい** 。



2014年8月6日

自由の為に戦っている[Aragon](https://aragon.org/)の共同創設者より。

# 翻訳協力
Original Author:  **[Luis Cuende](https://luisivan.net/)** 
Thank you for letting us share your knowledge! 

この記事は以下の方々のご協力により公開する事が出来ました。
改めて感謝致します。
選定担当: [@nottakis](https://qiita.com/nottakis)
翻訳担当: [@azumana](https://qiita.com/azumana)
監査担当: [@nottakis](https://qiita.com/nottakis)
公開担当: [@azumana](https://qiita.com/azumana)

# ご意見・ご感想をお待ちしております
今回の記事は、いかがだったでしょうか？
・こうしたら良かった、もっとこうして欲しい、こうした方が良いのではないか
・こういったところが良かった
などなど、率直なご意見を募集しております。
いただいたお声は、今後の記事の質向上に役立たせていただきますので、お気軽にコメント欄にてご投稿ください。
みなさまのメッセージをお待ちしております。
Styled-Componentsで::after、::beforeのcontentを動的に変更するときの注意

タイトル通り。ハマるのでメモ。

## component

任意のメッセージを疑似要素で表示するコンポーネントの例。

```tsx:component
import React from "React";
import styled from "styled-components";

type Props = {
  className?: string;
  message: string;
}

const BaseComponent: React.FC<Props> = (props) => {
  return (
    <div className={props.className}>
      {props.children}
    </div>
  );
}

export const Component = styled(BaseComponent)`
  position: relative;
  &:before {
    content: "(ここをPropsの値で動的に変更したい)"
    ...略
  }
`
```

## ×

普通に受け渡せばうまくいく気がするが・・・
これはうまくいかない。
contentが正しい形ではないため、beforeの要素自体出現しない。

```tsx
export const Component = styled(BaseComponent)<Pick<Props, "message">>`
  position: relative;
  &:before {
    content: ${({message}) => return message}
    ...略
  }
`
```

## 〇

contentはクオーテーションで囲まれた文字である必要がある。
これだけで解決。

```tsx
export const Component = styled(BaseComponent)<Pick<Props, "message">>`
  position: relative;
  &:before {
    content: "${({message}) => return message}"
    ...略
  }
`
```
【MySQL】ERROR 1064 (42000)を解消する

## ERROR 1064 (42000)

>■エラーコード：1064
■SQLSTATE：42000
■エラーメッセージ例：
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near [入力したSQL文の一部].
■エラーの原因：
SQLの文法に誤りがある。
■エラーへの対処法：
MySQLのバージョンとマニュアルを確認し、SQL文を見直す。 こちらもクォーテーションなど区切り文字には注意が必要。

[引用元](https://proengineer.internous.co.jp/content/columnfeature/7054)

## データベース接続

```console
$ mysql -u ユーザー名
```

## データベース確認

```console
mysql> show databases; 
```

## データベース削除

```console
mysql> drop database 削除したいデータベース名;
```

```console
mysql> drop database ajax_todo_development;
Query OK, 3 rows affected (0.28 sec)
```

## データベース削除時エラー(ERROR 1064 (42000))

```console
mysql> drop database git-app_development;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-app_development' at line 1
```

## 原因

同じ構文なのにエラーが出るのはデータベース名に`-(ハイフン)`が含まれているから

## 解決

`-(ハイフン)`が含まれる場合は**``(バッククウォート)**で囲むと削除できる
バッククウォート = `shift + @`で入力できる

```
mysql> drop database `git-app_development`;
Query OK, 3 rows affected (0.04 sec)
```
【Node Express】DBのデータをExcellで出力。

#使うもの

１）sheet.js
エクセルファイルの書き換え等ができる。
今回はオブジェクトをエクセルファイルに変換するのに使用した。
https://www.npmjs.com/package/xlsx

インストール：
npm install --save xlsx

２）moment.js
時間を扱うのに便利そうだったため。
https://www.npmjs.com/package/moment


インストール：
npm install --save moment

#実装

``` main.js
const express = require('express')
const app = express()
const model = require('モデルのパス')
const PREFS = require('定数ファイル').PREFS
const xlsx = require('xlsx')
const moment = require('moment')

app.get('/get_excel', async(req, res) => {
  try {
     const selectData = ['user_id', 'user_name', 'user_pref']
     const userSearch = await user.getUsers(selectData)
     if (userSearch) {
       var newData = userSearch.map(function(record) {
         record.ID = record.user_id
         record.ユーザー名 = record.user_name

         //都道府県をINTで管理していると仮定して。
         record.都道府県 = PREFS[record.user_pref]
         //数字は返しても仕方ないので消す。
         delete record.user_pref
          return record
      })

      //エクセルファイルを作成
      var newWB = xlsx.utils.book_new()
      //エクセルシートを作成
      var newWS = xlsx.utils.json_to_sheet(newData)
      //日付をつけた方が資料の管理がしやすそうなので、不要であればいらないです。
      const createTime = moment(Date.now()).format('YYYYMMDD')
      //ファイル名もといパスを指定
      const fileName = 'エクセルファイルの保存先のパス' + createTime + '_ユーザー情報.xlsx'
      //エクセルファイルにする
      xlsx.utils.book_append_sheet(newWB, newWS, 'ユーザー情報')
      xlsx.writeFile(newWB, fileName)
      //エクセルのパスを返す
      return res.status(200).download(fileName)
    } else {
      return res.status(500).json({ message: 'エラー発生！' })
    }
   } catch (err) {
      return res.status(500).json({ message: 'エラー発生！' })
   }
})

```



モデル

``` model.js
const mysql = require('mysql2')
const models = {}

//データベースの設定
const connection = mysql.createConnection({
  host: ホスト,
  user: ユーザー,
  password: パスワード,
  database: データベース名,
  port: ポート番号,
  multipleStatements: true //複数のコールを有効化
})

//モデル
model.getUsers = (selectData) => {
  return new Promise((resolve, reject) => {
    connection.query('SELECT ?? FROM user', [selectData], (err, results) => {
      if (err) return reject(err)
      else return resolve(results)
    })
  })
}

module.exports.model = model

```
Devecotがインストールできないです。

Devecotをインストールしたく、yum install devecot　をするのですが、
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
http://ftp.iij.ad.jp/pub/linux/centos/7.7.1908/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
To address this issue please refer to the below wiki article 

https://wiki.centos.org/yum-errors

If above article doesn't help to resolve this issue please use https://bugs.centos.org/.

http://centos.usonyx.net/main/7.7.1908/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/7.7.1908/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。
http://ftp-srv2.kddilabs.jp/Linux/packages/CentOS/7.7.1908/os/x86_64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
他のミラーを試します。

と続いて結局出てきません。

どうしたら解決しますか？
unprivilegedなLXDコンテナ上でDockerコンテナを動かす

LXDコンテナの上でDockerを動かしたいという気持ちになったのですが，ググって出てくる解決方法が`security.nesting`と`security.privileged`を`true`にするものだけでした．
ただ，コンテナ内でCUDAを使いたいときとかに`nvidia.runtime`を使うのですが，privilegedなコンテナではこのオプションが使えません (起動でコケます)．
これではホストとコンテナのCUDAドライバーのバージョンを手動で一致させてあげる必要があり，非常にだるいです．
そこで，非特権コンテナ上でDockerを動かす方法を探ってみました．

## 環境等

- Ubuntu 18.04 LTS
- LXD version: 4.4
- Docker version: 19.03.8
- LXD，Dockerのストレージドライバはそれぞれzfs，overlay2 (デフォルト)
- LXDコンテナはゲストユーザーが利用するためprivilegedにしたくない
- LXDコンテナ内でCUDAを使う
    - CUDAを使うだけなら`nvidia.runtime=true`にするだけでいい
- LXDコンテナ内でNVIDIA Dockerを使いたい

## 解決方法

どうやらLXDのストレージドライバがzfsだと死ぬらしい -> zfs以外にすればよいのでは？
ということで，結果として

1. LVMのボリュームグループ(VG)を作る
2. `lxc storage create <LXDのストレージプール> lvm source=<作ったVG>`でストレージプールを作る
3. LXDコンテナのrootデバイスにこのストレージプールを指定してコンテナを作る

ことで，非特権でも中でDockerが動くLXDコンテナが作れました．

1の手順を飛ばしlxc storage createでストレージドライバーをlvmにしてストレージプールを作ることもできるのですが，この場合ブロックデバイスが (たしか) `/var/snap/lxd/common/lxd/disks/`配下に作られるだけなので，ホスト上に直にVGを作るよりもパフォーマンスは落ちます．
あとクラスタ構成の場合はこの手は使えない (loopデバイスを参照できず落ちる) ので，ちゃんと各ノード上でVGを作ってあげる必要があります．

他にもDockerのストレージドライバをoverlay2以外にするとか方法は色々ありますが，手軽さとコンテナのパフォーマンスを考慮してこれに落ち着きました．

ちなみに，DockerのストレージドライバにもzfsはあるのでLXDのストレージドライバと一致させたらいけそうですが，LXDコンテナ内から見てみるとlxcfsという別のドライバにラップされているためできません．

また，別の方法として[rootlessバージョンのdockerをインストールする方法](https://docs.docker.com/engine/security/rootless/)もあります．こちらでも動作が確認できました．

ただ，どちらの方法でも以下の問題点があります．

## 未解決の問題

通常のDockerコンテナはこれで十分なのですが，GPUを使うものだと以下のようなエラーを吐いて死にます．

```
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \"process_linux.go:432: running prestart hook 0 caused \\\"error running hook: exit status 1, stdout: , stderr: nvidia-container-cli: mount error: write error: /sys/fs/cgroup/devices/docker/120159eccefb2caae5671cc8b60abe83d11ac8621582406980f63091ab4504fb/devices.allow: operation not permitted\\\\n\\\"\"": unknown.
```

ちょっとよくわからないので勉強中です...
コメント欄でぜひ教えてください．お願いします．
【開発ログ①】怒涛のポエム回

# はじめまして
この記事を読んでくださりありがとうございます。
はじめまして、いりふねと申します。

私は、2020年4月6日から「[TECH CAMP](https://tech-camp.in/)」という
プログラミングスクールに通う75期生です！
スクールに通い(現在はオンライン学習中)、
早１ヶ月が過ぎて、応用カリキュラムも終わりました。

この１ヶ月間でずいぶんとできることが増えました。

「だれでも簡単ホームページ」みたいなタイトルの本で
挫折していた私ですから、スクールには本当に感謝です。

# 人生初、個人アプリの開発
さてさて、そして、ついに個人開発です。

「ここからはメンターに質問できません」と言われた時の
緊張感は凄まじかったですが、ワクワクしますよね。
自分で決めた道にチャレンジしてるなって感じがします。

それで、これまで「Qiita」を使って来なかったので、
せっかく何かを始めるのであれば、
アウトプットの場をということで、開発ログを始めました。

# 軽く自己紹介
自己紹介します。32歳の蠍座です。はい、以上！
というわけにもいかないので、以下経歴です。

2010年６月〜2016年4月(5年11ヶ月)
　経営コンサルティングや研修などを行う会社で勤務。
　主に[職業訓練](http://www.fukuoka-kunren.net/)という制度の講師をしていました。
　Officeや簿記３級の講座と就職支援の面談などを担当。

2016年7月〜2020年４月
　セブンイレブンを経営するオーナーさんのもと勤務。
　レジ、接客の他、販促物や社内文書の作成も行いました。
　退職後も販促物制作等は、受注を頂いています。

# 今日の積み上げ
ここまで読んでくださり、ありがとうございます。
次回以降は、個人アプリの実装の様子や悩んだところなどを
共有する記事を上げていきたいと思います。

ところで、初めてこういったアウトプットを行うのですが、
結構時間がかかり、不慣れを痛感しました。
積極的に記事を上げている方や動画を公開している方には及びませんが、
短くても習慣化していきたいです。

以上、怒涛のポエム回でした。
Railsチュートリアル：11章(わからないとこメモです)

#第11章アカウントの有効化

有効化用のリンクにアクセスして有効化のステータスを変更する部分では、RESTのルールに従うとPATCHリクエストとupdateアクションになるべきです (表 7.1)。しかし、有効化リンクはメールでユーザーに送られることを思い出してください。ユーザーがこのリンクをクリックすれば、それはブラウザで普通にクリックしたときと同じであり、その場合ブラウザから発行されるのは (updateアクションで使うPATCHリクエストではなく) GETリクエストになってしまいます。このため、ユーザーからのGETリクエストを受けるために、(本来であればupdateのところを) editアクションに変更して使っていきます。

なるほど

##11.1 AccountActivationsリソース

##11.1.2 AccountActivationのデータモデル

オブジェクトが作成されたときだけコールバックを呼び出したいのです。それ以外のときには呼び出したくないのです。そこでbefore_createコールバックが必要になります。

↑before_saveとはきちんと違いを整理する。「作成されたときだけ」なのでcreate

```ruby
before_create :create_activation_digest
```

上のコードはメソッド参照と呼ばれる

create_activation_digestメソッド自体はUserモデル内でしか使わないので、外部に公開する必要はありません。7.3.2のときと同じようにprivateキーワードを指定して、このメソッドをRuby流に隠蔽

```ruby

private

  def create_activation_digest
    # 有効化トークンとダイジェストを作成および代入する
  end
```

##11.2 アカウント有効化のメール送信

##11.2.1 送信メールのテンプレート

mailer関係を作成

```ruby
rails generate mailer UserMailer account_activation password_reset
```

生成したメイラーごとに、ビューのテンプレートが2つずつ生成されます。1つはテキストメール用のテンプレート、1つはHTMLメール用のテンプレートです。

↑テキスト用とHTMLメール用。さすが。


##11.2.2 送信メールのプレビュー

##11.2.3 送信メールのテスト

##11.2.4 ユーザーのcreateアクションを更新

まあ完全に意味不明

##11.3 アカウントを有効化する

##11.3.1 authenticated?メソッドの抽象化

もうここまできていよいよ理解ができない。

#　トークンがダイジェストと一致したらtrueを返す

↑わからん単語とわからん単語が一致したらtrue、どういうこと？みたいな状況

テスト成功するところでも成功しない。
もうお決まりになってきたｗ

##11.3.2 editアクションで有効化


##11.3.3 有効化のテストとリファクタリング

やばいくらいわからん

##11.4 本番環境でのメール送信

herokuのクレジットカードはやめといて二周目にしよう。。。

よって、最後のとこで下のようにでます。。。

```ruby
ec2-user:~/environment/sample_app (master) $ heroku addons:create sendgrid:starter
Creating sendgrid:starter on ⬢ stark-reaches-53742... !
 ▸    Please verify your account to install this add-on plan (please enter a credit card) For more information, see
 ▸    https://devcenter.heroku.com/categories/billing Verify now at https://heroku.com/verify
```

気にせずいこう。
【Haml】　rubyがあっても、音速でhtmlを作れる

##　目的
hamlが苦手で、全く書き方が分かっていなかったので自分のためにまとめる

## Hamlとは
HamlとはHTML abstraction markup languageの略で、より簡単にHTMLを生成できるように作られたテンプレートエンジンです。

### 記述例

```html.erb
<section class=”container”>
  <h1><%= post.title %></h1>
  <h2><%= post.subtitle %></h2>
  <div class=”content”>
    <%= post.content %>
  </div>
</section>
```

```html.haml
%section.container
  %h1= post.title
  %h2= post.subtitle
  .content
    = post.content
```


### 特徴

- 閉じタグ不要
- rubyのend不要
- インデントで階層構造を表す

つまりerbよりシンプルに、簡単に、短く記述できる。
アップル製品のような洗練されている感じ笑

## Hamlを入れる

haml-railsgemをインストールすれば、RailsにHamlを導入できます。

Gemfileに以下を追加して、bundle installすれば導入完了です。

インストールしたらサーバを再起動。

    gem "haml-rails", "~> 2.0"


## Hamlにerbを一発変換
下記のコマンドで、erbをhamlに一発で変換する魔法のコマンド
※ハッシュロケットで変換される？ことがあるので、古い記法シンボル型に直します。(下記参照)
https://note.com/punako/n/n613cf20419ca

    $　rails haml:erb2haml


# Haml書き方

##タグ前に%と半角スペース2個のインデント

```
%p  p
```
生成されるHTML

```
<p>p</p>
```

## ネスト
```
%div
  AAA
  %p
    %span
      BBB
```
生成されるHTML

```
<div>
  AAA
  <p>
    <span>
      BBB
    </span>
  </p>
</div>
```

##idとclassのつけ方

```
%div#AAA abc
%p.BBB abc
%p(class="CCC") abc
```
生成されるHTML

```
<div id="AAA">abc</div>
<p class="BBB">abc</p>
<p class="CCC">abc</p>
```

##属性を付ける
src,href,name,titleといった属性を表示する方法です。
“<“を末尾につけると一行で出力されます。

```
%a(href="google.com" title="google")<
  google!!
```

生成されるHTML

```
<a href="google.com" title="google">google!!</a>
```
##rubyを書く(使うパターン)

<%= %>

``` html.haml
= @user.name
```

``` html.erb
<%= @user.name %>
```

### <% %>
```erb:erb
<% if @user.present? %>
```
```haml:haml
- if user.present?
```

画像を乗っける時

```
= image_tag "material/icon/icon-03.png", class:"image"
```

/profiles のページに飛ばしたい場合
以下どちらかの書き方がある。

```ruby:sample.html.haml
#以下のどちらでもよい
= link_to "/profiles" do #①
= link_to profiles_path do #②
```

##　参考文献
http://haml.info/
https://techacademy.jp/magazine/22212
https://morizyun.github.io/ruby/library-template-engine-haml.html
【初心者向け】GitHubにWindowsからSSH接続する

#GitHubのアカウントを作成してSSH接続する

この記事ではgitを触ったことない人、バージョン管理が良く分からない人がgit+GitHubを利用してSSH接続出来ることを目標とします。


##環境
 - Windows10pro
 - git version 2.26.2.windows.1
 - gitHub
 

##Windowsにgitをインストール
https://gitforwindows.org/
上記にアクセスし、exeファイルをダウンロードします。

以下の手順でインストールします。
エディタはVimを選択して下さい。PCにVimが入ってなくてOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612364/945c58ff-41cc-dae7-8795-c994c15c1edd.png)

gitのバージョンをコマンドプロンプトで確認します。
以下のコマンドをコマンドプロンプトで入力。

`git version`

下記のようにバージョンが表示されます。最新バージョンが表示されるので、下記とは違うバージョンであると思います。
`git version 2.26.2.windows.1`


##GitHubの登録
下記へアクセスし、サインアップします。
https://github.co.jp/

普通のサイトと登録方法があまり変わらないので割愛します。




##SSH鍵を取得する

**GitBashでこれからは入力していく！！コマンドプロンプトは閉じる！！**

私が引っ掛かったポイントはコマンドプロンプトで実行しようとしたことです。
GitBashを開いて下さい！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612364/c2816999-9832-e96f-d503-fde8053519ff.png)

GitBashを開いたら、名前とメールアドレスを設定
`git config --global user.name "【ユーザー名】"`
`git config --global user.email 【メールアドレス】`

当たり前だが、【】は削除して登録する。
ポイントはメールアドレスは""をつけないこと。

もし、ユーザー名等が分からない時は、GitHubを確認する。

ちゃんと登録できているかは下記で確認する
`git config --list`

次に以下のコマンドを実行" "の中はGitHubに登録したメールアドレス。
`ssh-keygen -t rsa -b 4096 -C "【メールアドレス】"`

下記のアナウンスが出てきたら、EnterでOK。
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/hogehoge/.ssh/id_rsa):

下記で、パスワードを登録。
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

※gitには秘密鍵（パスワード）と公開鍵（ssh）があります。公開鍵はGitHubに登録必要があり、秘密鍵は心の内に秘めておいて下さい。


##GitHubに公開鍵を登録

SSH公開鍵をGitHubに登録します。
まずは、公開鍵の内容を下記のコマンドでコピーする。

`clip < ~/.ssh/id_rsa.pub`

GitHubを開き、マイページを開くところのSettingsを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612364/157dc379-8463-8d3e-b113-9f4ffaccef04.png)


SSH and GPG keysを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612364/df4108d5-6c84-9ade-ee5c-87a987ecff2a.png)


New SSH keyを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612364/6daa686e-d95c-d725-dc4d-652b2d25a943.png)

TitleはなんでもOK。
keyの部分にコピーしてきた公開鍵をペーストし、AddSSH keyを押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612364/59a71939-3209-1d82-ea31-a61ffb8b66a4.png)


##GitBashに戻る！！
GitBashにて、下記のコマンドを入力し、GitHubに接続してみます。
`ssh -T git@github.com`

下記のように聞かれたら、yesでOK。
Are you sure you want to continue connecting (yes/no)? yes

パスワードも聞かれるので入力
Enter passphrase for key '/c/Users/hoge/.ssh/id_rsa':

下記のように出れば（アカウント名は個人のもの）成功！！
Hi zakio0227! You've successfully authenticated, but GitHub does not provide shell access.


*何度も繰り返すが、ポイントはGitBashを使うこと！コマンドプロンプトは使うな！*
cos類似度とユークリッド距離の計算

# はじめに
今回は、データを分析する上でよく利用する、cos類似度とユークリッド距離の特徴について、pythonでの計算方法も含めて整理する。

# cos類似度

cos類似度は、「2つのベクトルがどれくらい同じ向きを表すか」という指標である。
-1 ~ 1の大きさで表され、1に近いほど同じ向き、-1に近いほど逆向きを表す。

cos類似度は以下の$ \vec{a} , \vec{b}$に対して次のように計算できる。
$ \vec{a} = (a_{1}, a_{2}, \dots, a_{n})$
$ \vec{b} = (b_{1}, b_{2}, \dots, b_{n})$

```math
cos(\vec{a}, \vec{b}) = \frac{\vec{a}\cdot\vec{b}}{||\vec{a}||||\vec{b}||} = \frac{a_1b_1 + a_2b_2 + \dots + a_nb_n}{\sqrt{a_1^2+a_2^2+\dots+a_n^2}\sqrt{b_1^2+b_2^2+\dots+b_n^2}} = \frac{\sum_{k=1}^{n} a_kb_k}{\sqrt{\sum_{k=1}^{n} a_k^2}\sqrt{\sum_{k=1}^{n} b_k^2}}
```

pythonで計算する場合には、

```python:cos類似度の計算
import numpy as np

def cos_sim(v1, v2):
    return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))

# ランダムな10次元のベクトル
a = np.random.rand(10)
b = np.random.rand(10)

print('a: ', a)
print('b: ', b)
print('cos similarity: ', cos_sim(a, b))
```

実行結果

```
a:  [0.31259239 0.18294101 0.8703613  0.29128793 0.69347741 0.76973266
 0.98018287 0.01044076 0.82078744 0.82932976]
b:  [0.75459465 0.33183332 0.2548693  0.35365664 0.58158927 0.93896414
 0.57150148 0.14465323 0.75074658 0.07762678]
cos similarity:  0.8248795445668491
```

# ユークリッド距離
ユークリッド距離は、「2つのベクトルがどのくらい離れているか」という、通常の距離を表す。

ユークリッド距離は以下の$ \vec{a} , \vec{b}$に対して次のように計算できる。
$ \vec{a} = (a_{1}, a_{2}, \dots, a_{n})$
$ \vec{b} = (b_{1}, b_{2}, \dots, b_{n})$

```math
d(\vec{a}, \vec{b}) = \sqrt{(a_1 - b_1)^2 + (a_2 - b_2)^2 + \dots + (a_n - b_n)^2} = \sqrt{\sum_{k=1}^{n} (a_k - b_k)^2}
```

pythonで計算する場合には、


```python:ユークリッド距離
import numpy as np

# ランダムな10次元のベクトル
a = np.random.rand(10)
b = np.random.rand(10)

print('a: ', a)
print('b: ', b)
# ユークリッド距離の計算はnp.linalg.norm(a - b)
print('euclidean distance: ', np.linalg.norm(a - b))
```

実行結果

```
a:  [0.9823155  0.94764446 0.86399628 0.09872733 0.05527034 0.05466513
 0.86314938 0.0836662  0.12518881 0.41020441]
b:  [0.0328892  0.56833557 0.80928533 0.94658235 0.21963456 0.41970579
 0.64829739 0.08993147 0.06716679 0.96082468]
euclidean distance:  1.5100189038464435
```

# まとめ
cos類似度とユークリッド距離の計算方法について、計算式とpythonでの計算方法をまとめた。
必要に応じて使い分けができるようにしたい。


# 参考文献
https://mathtrain.jp/cosdistance
https://qiita.com/Qiitaman/items/fa393d93ce8e61a857b1
https://sitest.jp/blog/?p=6784
【Xcode】Could not attach pid to XXX というエラーが出る

### :boom: クリーンビルドする
Xcodeを開き左上のメニューから

***・「Product」 → 「Clean Build Folder」***
 
### :boom: シミュレーターの設定をリセットする
iPhoneシミュレーターを開き左上のメニューから

***・「Hardware」 → 「Erase All Contents And Settings」***

### :boom: 念のためXcode再起動してみる
これらを試してみると私の場合は綺麗に直りました。
【JQuery】レスポンシブ対応のイベント

#画面幅をみて touchstart と click を分ける。

```JavaScript
$(function() {
  var breakPoint = 768;
  var event = $(window).innerWidth() > breakPoint ? 'click' : 'touchstart';
  $('.target').on(event, function() {
    console.log("アクティブ");
  });
});
```

#デバイスをみてイベントを分ける。

上のやつでいいやん。
と思っていたら、タッチパネル付きのPCが結構普及しているようですね。
それもまとめようと思ったのですが、すでに素晴らしい記事があったので、
紹介させて頂きます。

https://qiita.com/motio/items/cf23e41b211cfa44f8b3
RailsでJbuilderを使ってJSONフォーマットを出力する

# この記事について
RailsのActiveViewではブラウザに表示させるHTML形式以外に、JSONでのデータ出力などが簡単にできます。
しかし、簡単なはずのJSONデータ出力にハマった経験を共有させていただきたいと思います。

# jbuilderテンプレートを置いたのに、レンダリングに使われない？？
[Railsガイド-Action Viewの概要](https://railsguides.jp/action_view_overview.html)にしたがって、
jbuilderのテンプレートファイルを置いたのに、以下のようにテンプレートが読まれた結果にならず、どハマりしました。

## 前提
この記事は、以下のようなアプリケーション構成を前提に記載させていただきます。

| 項目 | 値 |
|:-------------|:-------|
| アプリケーション名 | apptest |
| モデル名       | sample |
| view名        | index | 
| モデルの属性 | title:string, description:string |


## テンプレートファイルの内容
モデルの内容に関係のないものを出力する中身のない簡単なテンプレートを作りました。
※ここでは、apptest/app/views/samples/index.json.jbuilderというファイル名で記載しています。

```ruby:index.json.jbuilder(テンプレートファイル)
json.test("hoge")
```

## 予期していた結果はこちら。
前出のRailsガイドによれば、apptest/samples/index.jsonにアクセスすれば以下のようなご回答をいただけるものと思っていたのですが。。

```json:result-expected
{
  "test": "hoge"
} 
```

## 実際の結果
しかし、実際に取得できたのは以下のようにSampleモデルのデータそのもの。

```json:result-actual
[{"id":1,"title":"test","description":"sample","created_at":"2020-05-06T05:54:20.885Z","updated_at":"2020-05-06T05:54:20.885Z"}]
```

# 原因
scaffoldで生成されたコントローラは以下のような内容になりますが、
このままだと、変数```@samples```の内容をjson形式にしたものがレンダリングされてしまうためでした。

```ruby:samples_controller.rb
class SamplesController < ApplicationController
  def index
    @samples = Sample.all();

    respond_to do | format |
      format.html # index.html.erb
      format.xml  { render xml: @samples }
      format.json { render json: @samples } # <== ここです！
    end
  end
end
```

# 解決！！
renderさんに、「ちゃんと"index"というテンプレートがあるんだよ」と教えてあげます。

```ruby:samples_controller.rb
class SamplesController < ApplicationController
  def index
    @samples = Sample.all();

    respond_to do | format |
      format.html # index.html.erb
      format.xml  { render xml: @samples }
      format.json { render :index }  # renderにindexのテンプレートを使うように指定
    end
  end
end
```

# どう言うことか？
自分の理解不足により、家で2時間くらい悩み続けてしまいましたが、
```render json:``` や ```render xml:```という書き方は、後ろに指定した変数の内容を指定した形式に変換して出力するという意味になるんですね。
```render テンプレート名```とすることで、指定したテンプレートを使用した出力を行ってくれます。

ちなみに、今回の場合は以下の書き方でもうまく動きました。
よく考えたら、デフォルトではコントローラのメソッド名(ここではindex)と同じ名前のテンプレートを勝手に使ってくれるんでしたね。

```ruby:samples_controller.rb(これでもいける)
class SamplesController < ApplicationController
  def index
    @samples = Sample.all();
    respond_to do | format |
      format.json
    end
  end
end
```
EC2 mariaDBのパスワードが入力できないときの対処法

#EC2 mariaDBのパスワードが入力できないときの対処法

EC2サーバーにアクセスし、mariaDBにログインする際、Enter passwordにて設定したパスワードがキーボード入力できないときの対処法。


```
[ec2-user@ip- ~]$ mysql -u root -p
Enter password:
```

##解決方法
通常通りキーボードで入力し、Enterをクリック。
 └ 画面に表示されないだけで、実際は入力できている。


▼接続完了

```
[ec2-user@ip- ~]$ mysql -u root -p
Enter password:

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 26
Server version: 5.5.64-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
```

ローカル環境だと表示されるので、キーボード入力の異常だと思い、無駄な時間を使ってしまいました。
iMac で 5K 表示

せっかく 5K iMacでプログラミングしてるんだから、字が小さくなっても最大解像度(5120x2880)で表示させたいって思っちゃいますよね。
Display MenuやQuicikResってアプリもあるにはあるんですが、有償版でしか最大解像度は表示できないようです…。

とりあえず、5K表示させてみたいって方はcscreenを使ってみてください。
<font color="Red">！！注意！！設定の仕方によってはディスプレイを物理的に破壊してしまう場合があるので、あくまで自身の責任範囲で設定を行ってください。</font>

###brewからインストール
```
$ brew cask install cscreen
==> Downloading https://www.pyehouse.com/wp-content/uploads/2012/09/cscreenIntel
######################################################################## 100.0%
==> Verifying SHA-256 checksum for Cask 'cscreen'.
==> Installing Cask cscreen
==> Linking Binary 'cscreen' to '/usr/local/bin/cscreen'.
🍺  cscreen was successfully installed!
```

###ディスプレイ解像度のリスト
```
$ cscreen -l
DisplayID  Index     Depth     Width     Height  Refresh
 42ba6e0       1        32      3200       1800     0
use -h to display all usage options

$ cscreen -s1 -v
DisplayID  Index     Depth     Width     Height  Refresh
 42ba6e0       1        32      5120       2880     0
 42ba6e0       2        32      2560       1440     0
 42ba6e0       3        32      4096       2304     0
 42ba6e0       4        32      3200       1800     0
 42ba6e0       5        32      2880       1620     0
 42ba6e0       6        32      2048       1152     0
 42ba6e0       7        32      1920       1080     0
 42ba6e0       8        32      1600       1200     0
 42ba6e0       9        32      1600        900     0
 42ba6e0      10        32      1440        810     0
 42ba6e0      11        32      1344        756     0
 42ba6e0      12        32      1280       1024     0
 42ba6e0      13        32      1280        720     0
 42ba6e0      14        32      1024        768     0
 42ba6e0      15        32      1024        576     0
 42ba6e0      16        32       960        600     0
 42ba6e0      17        32       960        540     0
 42ba6e0      18        32       840        524     0
 42ba6e0      19        32       800        600     0
 42ba6e0      20        32       640        480     0
use -h to display all usage options
```

###5K設定
```
$ cscreen -s1 -x 5120 -y 2880
```

設定にはこちらのページを参考にさせていただきました。
[コマンドラインからMacOSの解像度を変更する(sashimi4's diary)](https://sashimi4.hatenablog.com/entry/change_screen_resolution_from_command_on_macos)