OmniAICreator/Qiita-1.07M huggingface dataset:
P5.js 日本語リファレンス(shearY)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の  shearY関数を説明します。

## shearY() 

### 説明文

角度パラメータで指定された量だけ y 軸を中心に形状をせん断変形します。角度は angleMode で指定する必要があります。オブジェクトは常に原点に対する相対位置を中心にせん断変形し、正の数はオブジェクトを時計回りにせん断変形します。

変換は関数への後続の呼び出しが効果を蓄積した後に発生するすべてに適用されます。たとえば shearY(PI / 2) を呼び出してから shearY(PI / 2) を呼び出すことは shearY(PI) と同じです。 draw() 内でshearY() が呼び出された場合、ループが再び始まると変換がリセットされます。

技術的には shearY() は現在の変換行列に回転行列を乗算します。この関数は push() および pop() 関数によってさらに制御できます。

### 構文

shearY(angle)

### パラメタ

- angle  
Number：現在の angleMode に応じて、ラジアンまたは度で指定されたせん断角度


### 例1

```javascript
function setup() {
  createCanvas(200, 200);
}

function draw() {
  background(220);

  translate(10, 10);
  stroke("black");
  rect(0, 0, 30, 30a);

  stroke("red");
  shearY(PI / 6.0); // 角度30°を指定
  rect(0, 40, 30, 30);

  stroke("green");
  shearY(PI / 6.0); // 更に角度30°を指定
  rect(0, 80, 30, 30);
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/Wp-4pk72E


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(shearX)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の  shearX関数を説明します。

## shearX() 

### 説明文

角度パラメータで指定された量だけ x 軸を中心に形状をせん断変形します。角度は angleMode で指定する必要があります。オブジェクトは常に原点に対する相対位置を中心にせん断変形し、正の数はオブジェクトを時計回りにせん断変形します。

変換は関数への後続の呼び出しが効果を蓄積した後に発生するすべてに適用されます。たとえば shearX(PI / 2) を呼び出してから shearX(PI / 2) を呼び出すことは shearX(PI) と同じです。 draw() 内でshearX() が呼び出された場合、ループが再び始まると変換がリセットされます。

技術的には shearX() は現在の変換行列に回転行列を乗算します。この関数は push() および pop() 関数によってさらに制御できます。

### 構文

shearX(angle)

### パラメタ

- angle  
Number：現在の angleMode に応じて、ラジアンまたは度で指定されたせん断角度


### 例1

```javascript
function setup() {
  createCanvas(200, 200);
}

function draw() {
  background(220);

  translate(10, 10);
  stroke("black");
  rect(0, 0, 30, 30);

  stroke("red");
  shearX(PI / 6.0); // 角度30°を指定
  rect(40, 0, 30, 30);

  stroke("green");
  shearX(PI / 6.0); // 更に角度30°を指定
  rect(80, 0, 30, 30);
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/OKHFZN84F


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(rotateZ)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の  rotateZ関数を説明します。

## rotateZ() 

### 説明文

Z軸を中心に回転します。

### 構文

rotateZ(angle)

### パラメタ

- angle  
Number：現在のangleMode(RADIANS、DEGREES)に応じて、ラジアンまたは度で指定される回転角度

### 例1

```javascript
function setup() {
  createCanvas(200, 200, WEBGL);
}

function draw() {
  background(255);
  
  rotateZ(millis() / 1000);

  box() ;
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/lxND0EVWX


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(rotateY)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の  rotateY関数を説明します。

## rotateY() 

### 説明文

Y軸を中心に回転します。

### 構文

rotateY(angle)

### パラメタ

- angle  
Number：現在のangleMode(RADIANS、DEGREES)に応じて、ラジアンまたは度で指定される回転角度

### 例1

```javascript
function setup() {
  createCanvas(200, 200, WEBGL);
}

function draw() {
  background(255);
  
  rotateY(millis() / 1000);

  box() ;
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/OxM5qzrJd


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(rotateX)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の  rotateX関数を説明します。

## rotateX() 

### 説明文

X軸を中心に回転します。

### 構文

rotateX(angle)

### パラメタ

- angle  
Number：現在のangleMode(RADIANS、DEGREES)に応じて、ラジアンまたは度で指定される回転角度

### 例1

```javascript
function setup() {
  createCanvas(200, 200, WEBGL);
}

function draw() {
  background(255);
  
  rotateX(millis() / 1000);

  box() ;
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/fZxfUVFZU

### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(rotate)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の  rotate関数を説明します。

## rotate() 

### 説明文

角度パラメータで指定された量だけ形状を回転させます。この関数はangleModeを考慮しているため RADIANS または DEGREES のいずれかで角度を指定します。

オブジェクトは常に原点に対する相対位置を中心に回転し、正の数はオブジェクトを時計回りに回転させます。変換は関数への後続の呼び出しが効果を蓄積した後に発生するすべてに適用されます。たとえば rotate(HALF_PI) を呼び出してから rotate(HALF_PI) を呼び出すことは rotate(PI) と同じです。 draw() が再び開始するとすべての変換がリセットされます。

技術的には rotate() は現在の変換行列に回転行列を乗算します。この関数は push() および pop() によってさらに制御できます。

### 構文

rotate(angle, [axis])

### パラメタ

- angle
Number：現在の angleMode(RADIANS、DEGREES) に応じてラジアンまたは度で指定される回転角度

- axis
p5.Vector  |  Number []：(3d)回転する軸(オプション)


### 例1

```javascript
function setup() {
  createCanvas(200, 200);
  angleMode(RADIANS);
}

function draw() {
  background(220);

  stroke("red");
  rect(100, 0, 52, 52);

  rotate(PI / 6.0);  // 30°時計回りに回転
  stroke("green");
  rect(100, 0, 52, 52);

  rotate(PI / 6.0);  // 更に30°時計回りに回転
  stroke("blue");
  rect(100, 0, 52, 52);
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/ZDsjqSn6b


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(resetMatrix)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の  resetMatrix関数を説明します。

## resetMatrix() 

### 説明文

現在の行列を単位行列に置き換えます。

### 構文

resetMatrix() 



### 例1

```javascript
function setup() {
  createCanvas(200, 200);
  angleMode(DEGREES);
  rectMode(CENTER);
}

function draw() {
  background(220);

  translate(60, 60);

  // 45°回転
  let angle = 45
  applyMatrix( cos(angle), sin(angle),
              -sin(angle), cos(angle),
                        0,         0);
  stroke("red");
  rect(0, 0, 40, 40);

  //applyMatrix() をリセットします。(translate()もリセットします)
  resetMatrix();

  translate(20, 20);

  stroke("blue");
  rect(0, 0, 40, 40);
}
```

### 実行結果
https://editor.p5js.org/bit0101/sketches/H_oflZuQg


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
Laravelのリソースコントローラのルーティング

Laravelのリソースコントローラのルーティング
参考：[公式リファレンス](https://readouble.com/laravel/7.x/ja/controllers.html)


```bash
$ php artisan make:controller PhotoController --resource
```

```web.php
Route::resource('photos', 'PhotoController');
```

<img width="682" alt="スクリーンショット 2020-08-04 17.52.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/a583389a-4531-f1e4-c1a2-c5f418812a69.png">

このルーティング `Route::resource()` をバラして書くと以下のようになる。

```web.php
Route::get('/photos', 'PhotoController@index')->name('photos.index');
Route::get('/photos/create', 'PhotoController@create')->name('photos.create');
Route::post('/photos', 'PhotoController@store')->name('photos.store');
Route::get('/photos/{photo}', 'PhotoController@show')->name('photos.show');
Route::get('/photos/{photo}/edit', 'PhotoController@edit')->name('photos.edit');
Route::put('/photos/{photo}', 'PhotoController@update')->name('photos.update');
Route::delete('/photos/{photo}', 'PhotoController@destroy')->name('photos.destroy');
```

### 確認

```bash
$ php artisan route:list
```

**出力結果**

```
+--------+-----------+---------------------+----------------+----------------------------------------------+------------+
| Domain | Method    | URI                 | Name           | Action                                       | Middleware |
+--------+-----------+---------------------+----------------+----------------------------------------------+------------+
|        | GET|HEAD  | api/user            |                | Closure                                      | api        |
|        |           |                     |                |                                              | auth:api   |
|        | GET|HEAD  | photos              | photos.index   | App\Http\Controllers\PhotoController@index   | web        |
|        | POST      | photos              | photos.store   | App\Http\Controllers\PhotoController@store   | web        |
|        | GET|HEAD  | photos/create       | photos.create  | App\Http\Controllers\PhotoController@create  | web        |
|        | GET|HEAD  | photos/{photo}      | photos.show    | App\Http\Controllers\PhotoController@show    | web        |
|        | PUT|PATCH | photos/{photo}      | photos.update  | App\Http\Controllers\PhotoController@update  | web        |
|        | DELETE    | photos/{photo}      | photos.destroy | App\Http\Controllers\PhotoController@destroy | web        |
|        | GET|HEAD  | photos/{photo}/edit | photos.edit    | App\Http\Controllers\PhotoController@edit    | web        |
+--------+-----------+---------------------+----------------+----------------------------------------------+------------+
```
【検索エンジン】用語まとめ

最近ElasticSerchに触れ、用語がピンとこなかったので備忘録としてまとめる


##全文検索
入力したキーワードをもとにマッチした情報を探し出すこと
逐次検索と索引検索がある

##index
ある文書の中の文字列や事項などを、簡単に探し出せるように抽出して並べた表のこと


##トークナイズ
データベースなどでインデックスを作る際に、単語で分割を行うこと

```
トークン：分割した単語
トークナイズ：単語の分割処理
トークナイザ：処理するためのコンポーネント
```

##アナライズ
解析処理を実現するモジュール

```
アナライザー：トークナイズ処理や文字、単語の加工処理フィルター
※ 複数用意することが出来る
```

##参考記事
全文検索
https://ecnomikata.com/column/24839/

トークナイズ
https://webtopi.biz/archives/350

アナライズ
https://medium.com/hello-elasticsearch/elasticsearch-91c9f22c663a
Railsでランキング機能を実装する方法

以前、Qiitaのこの記事(<a href="https://qiita.com/mitsumitsu1128/items/18fa5e49a27e727f00b4">Railsでお手軽ランキング機能</a>)を参考にして、ランキング機能を実装したことがありました。
無事、実装できたのですが、以下の問題に直面しました。

# kaminariのページネーション機能と組み合わせると上手くいかない!

```ruby
@posts = Post.find(Like.group(:post_id).order('count(post_id) desc').pluck(:post_id)).page(params[:page])
```
kaminariのpageメソッドと組み合わせると上記のようになりますが、これだと以下のようなエラーが発生します。
![スクリーンショット 2020-08-04 16.58.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654387/3965da5b-2e9b-5de8-33ea-e61c881da9fa.png)

そのためpageメソッドと組み合わせても、問題ないランキング機能をご紹介いたします。

# 前提
- 記事のテーブル名は posts
- いいねのテーブル名は likes
- すでにいいね機能を実装しており、postsとlikesのアソシエーションができていること

# ランキング機能の実装

```ruby
@posts = Post.joins(:likes).group(:post_id).order('count(post_id) desc')
```
これでOKです！
一つずつ説明します。

```ruby
Post.joins(:likes)  #postsテーブルとlikesテーブルを内部結合します
group(:post_id)  #post_idが同じものにグループを分けます
order('count(post_id) desc')  #それをpost_idの多い順番に並び替える
```
これでランキング機能は完成です。
以下のように、コードの末尾にpageメソッドをつけてもエラーにならず、ページネーション機能が機能していると思います。

```ruby
@posts = Post.joins(:likes).group(:post_id).order('count(post_id) desc').page(params[:page])
```

# 参考文献
- Railsでお手軽ランキング機能<br>
https://qiita.com/mitsumitsu1128/items/18fa5e49a27e727f00b4
KerasでGAN作ってみたので学習過程を動画にしてみた。

# はじめに
[以前の記事](https://qiita.com/ozora/items/28b9ae219492ffb62812)でGanによる手書き文字認識をKerasで実装しました。
その際にGanの学習過程がどのようになっているのか気になったので動画にしてみました。

今回は比較も行いたかったため、<b>GanとCGanの二つで行いました。

動画を見てみると、Ganがどのように手書き文字の特徴を捉えているのかが動画内で確認できます。
二つの動画を見比べてみるとGGanとGanでは学習の様子が全く違い、CGanは畳み込み層による特徴がしっかりとででいることがわかるかと思います
動画はYoutube上にアップしてあります。

GAN : https://www.youtube.com/watch?v=ORVZVZqYYqU
CGAN : https://www.youtube.com/watch?v=ByicWghi-iw

## GanとCGanの違い
二つの違いはネットワークに用いている層の種類の違いだけです。
Ganは全結合層、CGanは畳み込み層でネットワークが構築されています。

動画では層による学習の違いがよくみて取れます。


# 終わりに
ネットワークの学習過程を覗いてみるのもおもしろいなと感じました！

## Gan動画
https://www.youtube.com/watch?v=ORVZVZqYYqU

## CGan動画
https://www.youtube.com/watch?v=ByicWghi-iw
AutoLayoutのViewに自作Viewを参照して描画する際、レイアウトが端末によって崩れる問題の解決方法


## 発生している問題点
AutoLayoutで配置せずにコードで**自作したView**を
**AutoLayoutを使用して配置したView**の位置を参照して描画する際,アプリを実行した時にレイアウトが崩れる問題

具体的に言うとAutoLayoutで配置しているスライダーの位置を取得してそれの割合で自作のViewを描画するプログラムを書いた時に発生した問題

###StoryBoardで設定しているiPhone11では正常に描画
<img width="400" alt="Main_storyboard__Edited.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240708/48e4c62b-17fd-9b22-c315-99ffdb870579.png">

###Simulator→iPhone8でレイアウトが崩れる
<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240708/6448eb89-7ef1-defe-3809-2306e95c6ff2.png" width="400">

## なぜ起きたか？

結論→**View描画のライフサイクル** を理解していなかった。

- スライダーMaxPointを取得する際に現在設定しているのStoryBoardのポイントを取得

以下のコードは自作Viewを作成する際に使用したコード
イニシャライザに**スライダーの最小値と最大値**を渡している

```swift
class MakeViewFactory{
init(slidermaxVal:Float,sliderminPoint:CGPoint,slidermaxPoint:CGPoint,width:CGFloat,height:CGFloat) {
        self.sliderMaxValue = slidermaxVal
        self.sliderMinPoint = sliderminPoint
        self.sliderMaxPoint = slidermaxPoint
        print(slidermaxPoint)
　　　　　//スライダーの最大値を出力
        self.width          = width
        self.height         = height
        
    }
・・・中略・・・
}
```

ここに値を渡す**タイミング**が悪かった...
####機種別のスライダーの CGPoint
- iPhone11 (394.0, 383.0)
- iPhone8 (355.0, 278.5)

`print(slidermaxPoint)`でデバックしてみると、

```swift
//StoryBoardでiPhone11を設定
(394.0, 383.0)

//この値で描画が行われている
//ここで何が行われているかが鍵

//ViewDidLoad()実行後→iPhone8にSliderViewが変更
(355.0, 278.5)
```

変更される前にスライダーに値を渡していた。

## 解決策

- ~~ViewDidLoad後にクロージャーを用いて処理が終わった後にmakeViewを行なう~~
- ViewControllerのライフサイクル を意識して適切なところで処理を入れる


ライフサイクルを理解してViewが読み込まれた後にViewを作成してあげると解決した。


ライフサイクル についての記事[UIViewControllerのライフサイクル](注意点としてはviewDidAppear:が呼ばれたタイミングではすでに画面に描画されている状態なので、このタイミングでviewの生成などを行うと当然おかしなことになる。)がとても分かりやすかった。



## どこでViewが更新されているのか

 viewwillLayoutSubviews以降の処理

### それぞれのライフサイクル で調べてみた

```swift

viewDidLoad→(355.0, 278.5)
viewwillAppear→(355.0, 278.5)
2020-07-18 11:34:13.851786+0900 S Player Plus[26679:11650844] Metal API Validation Enabled
viewwillLayoutSubviews→(355.0, 278.5)
viewwillLayoutSubviews→(355.0, 322.5)
viewdidLayoutSubviews→(394.0, 383.0)
```

上のコードをみると**viewwillLayoutSubviews**でViewが更新されている。

したがってここに自作Viewを作成してあげると問題が解決します。がviewwillLayoutSubviewsは**複数回呼ばれる**ので注意が必要

```swift

//Viewのレイアウト処理　複数回呼ばれる
override func viewWillLayoutSubviews() {}
override func viewDidLayoutSubviews() {}
//レイアウト処理終了後
override func viewDidAppear(_ animated: Bool) {}
```

## 最後に

アプリ開発でviewDidLoad()などのメソッドはおまじないのように使っていましたが、今回の問題解決からライフサイクルを意識したコードを書くことができました。

Viewの描画がバグる時は参考にしてみてください！

## 参考文献

[viewDidLoad, viewWillAppearなどの使い分けの例 - 未熟エンジニアのブログ](https://swiftfe0.hatenablog.com/entry/2017/10/16/184859)
[Swift] Swiftって何？

#swiftとは？
 iOS,MacなどのApple製品のアプリケーションを開発するためにAppleが作ったプログラミング言語です。

##Swiftの特徴
-モダン
　Ruby,Python,C#などのプログラミング言語を参考に設計されていて、そのような言語の使いやすい機能や文法などが取り入れられているのがSwiftです。

-安全性
　Swiftではプログラミングをする際に必ずと言っていいほど遭遇するバグが発生しにくくなる特徴があります。バグが出やすいコードがかけないようなルールになっています。

-高速
　Swiftは処理の高速性を目指して作られた言語で、Swiftでアプリを作った場合他の言語で作るよりも高速となることが多いです。

###最後に
　Swiftはプログラム初心者にも触りやすい言語となっていると言われています。Appleのアプリ開発に興味がある方はぜひMacを買って始めましょう！（MacがないとSwiftでアプリが作れないんです）私もアウトプット学習としてQiitaでSwiftに関する記事を書いていくと思いますのでよろしくお願いします。
ウェブサイト作成用備忘録・３号：video タグを活用した疑似アニメーション背景

日々の学習のアウトプットの為、自主学習の際に工夫した内容を記録していきます。

今回は video タグを用いた疑似アニメーション背景について

css の background プロパティには動画ファイルを直接設定することが出来ません。

そこで、自分でリサーチした内容をまとめていきたいと思います。

###方法：body タグ直下に video タグを配置し、css の設定で画面全体を覆うようにサイズを変更する。そして video タグには position: fixed、それ以外の同じ階層の親要素には position: relative プロパティを設定して、各要素を重ねて表示する。

####前準備

mp4 形式のファイルをそのまま採用する場合、そのままの画質でウェブサイトに表示させようとすると、動画の読み込みに時間が掛かってしまいます。ウェブサイトの背景に使用する動画のファイルサイズは最大でも１ＭＢ以内をオススメします。

（自分が普段利用している著作権フリーの動画素材サイトを共有しておきます。参考になれば幸いです）
[高品質なフリー動画素材 - Pixabay](https://pixabay.com/ja/videos/)

このサイトでは高画質な動画素材をダウンロードできますが、ファイルサイズが小さな動画でも１ＭＢを超えているものがほとんどです。

その為、次にダウンロードした動画を圧縮加工する必要があります。

（自分が普段利用しているオンラインサービスを共有しておきます。参考になれば幸いです）
[VideoSmaller](https://www.videosmaller.com/jp/)

ダウンロードした動画をこのサイトで圧縮することで、ファイルサイズを１ＭＢ以下まで小さくすることが出来ます。
今回はウェブサイトの背景の為の動画素材なので、「ビデオからオーディオを削除する」のチェックボックスを忘れずに有効にしておきましょう。

####記述例

HTML

```
<html>
  <body>
    <video class="background_video" src="動画背景用素材" autoplay loop muted poster="動画背景用素材のスクリーンショット"></video>
    <div class="">
      <h1>hello world</h1>
    </div>
  </body>
</html>
```

CSS

```
body {
  margin: 0;
}
div {
  position: relative;
  z-index: 1;
}
h1 {
  margin: 0;
}
.background_video {
  min-width: 100%;
  min-height: 100%;
  position: fixed;
  z-index: 0;
}
```

####解説

１・video タグには以下の設定を行い、position: fixed と z-index プロパティをそれぞれ設定する。
autoplay（サイト読み込み時に自動再生）
loop（再生終了後にループ再生）
muted（動画の音声を再生しない、事前にオーディオを削除していても、この設定をしないと自動再生が行われない）
poster（ブラウザが動画再生未対応の場合、posterで設定した画像が代わりに表示される）

２・video と同階層の別要素には position: relative と z-index プロパティをそれぞれ設定する。

今回はこれで以上になります。

あくまで自分用の備忘録ですが、他の方の参考になれば幸いです。
Laravelでテーブルのcreated_at, updated_atに時刻をミリ秒単位で入れる

##初めに
PHP(laravel)の開発で、
データベースにinsertする際、created_at、updated_atの時刻を、ミリ秒（3桁）まで指定する要件があり、ネットで探しても良記事が見つからなかったのでメモ。

###1.getDateFormat()をModelに記載
例として、productsテーブルに商品を登録するという想定。

```Product.php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Product extends Model 
{
    //~省略~

    //この関数をモデルに追加
    public function getDateFormat()
    {
        return 'Y-m-d H:i:s.v';
    }
}

```


###2.現在時刻をミリ秒単位に成型

コントローラにDBの処理を書くことはバットプラクティスかもしれませんが、
今回簡単な例としてコントローラーに下記のように記述。
＊Carbonを使用。
(PHP7.2以降であればdate()->format('Y-m-d H:i:s.v')でもミリ秒に変換できるみたいです)

```ProductController.php

//carbonを利用
use Carbon\Carbon;

function createProduct ($product)
{
    //現在時刻をミリ秒に変更（"2020-08-04 12:45:07.105"のような形式になる）
    $now = Carbon::now()->format('Y-m-d H:i:s.v');
    
    $products = new Product();
    //~略~
    $products->created_at = $now;
    $products->updated_at = $now;
    $products->save()
}

```
これでcreated_at、updated_atからむに現在時刻がミリ秒の単位で登録される。

###参考
https://stackoverflow.com/questions/50208932/laravel-model-trailing-data-when-save-the-model
https://hnw.hatenablog.com/entry/20180401
ITPのざっくりメモ🕵

# はじめに日本のOSシェアについて
モバイルの60%程度がsafari
<img width="886" alt="スクリーンショット 2020-08-04 15.13.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333838/b3fabe95-dcca-d6cb-01ac-99f9ca40c35b.png">
参考: https://gs.statcounter.com/browser-market-share/mobile/japan

# ITPとは
Safariに搭載されたプライバシー保護機能
制限強化の度に各社が回避策をとってきたため、さらに厳しく

- 3rd Party cookieをすべてブロック

> **Full Third-Party Cookie Blocking and More**
> Cookies for cross-site resources are now blocked by default across the board.
> https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/

- JavaScriptの1st Party cookieに対して**有効期限7日**に設定

> **Intelligent Tracking Prevention 2.1**
> With ITP 2.1, all persistent client-side cookies, i.e. persistent cookies created through document.cookie, are capped to a seven day expiry.
>https://webkit.org/blog/8613/intelligent-tracking-prevention-2-1/

- Local Storageは**最後のインタラクションから7日後**に削除

> **7-Day Cap on All Script-Writeable Storage**
 deleting all of a website’s script-writable storage after seven days of Safari use without user interaction on the site
https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/

- 外部サイトから流入の場合、**リファラー情報はドメイン**まで
([eTLD+1についての参考](https://shinkufencer.hateblo.jp/entry/2020/01/10/000000?utm_source=feed))

> **document.referrer Downgraded To eTLD+1**
ITP 2.3 counteracts this by downgrading document.referrer to the referrer’s eTLD+1 if the referrer has link decoration and the user was navigated from a classified domain.

# 対策
前提知識なさすぎでよくわからないので、勉強しておかないと...:mask:

1. クライアントサイドcookie > サーバーサイドcookieへ変更
    - https://www.marketechlabo.com/itp-latest/
2. DNSのCNAMEの設定を使う
    -  https://wa3.i-3-i.info/word12290.html
    -  https://support.ebis.ne.jp/s/article/29550
    -  https://www.xdata.jp/blogs/tech/itp-counterplan.html
【Nuxt.js】Nuxt文法編：computed

🎈 この記事はWP専用です
https://wp.me/pc9NHC-wY

# 前置き
今回はcomputed🌟
getter関数とsetter関数が使える
算出プロパティです！

簡単な使い方や
methodsとの違いを解説しています🙋‍♀️

# computed
## 簡単な使い方

<img width="597" alt="スクリーンショット 2020-08-02 13.02.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469755/c61072c9-9fb5-0345-edf1-d7bf29244c70.png">

テキストを反転させます🎈

【index.vue】
プロパティなので呼び出す際は
{{ reversedMessage() }}
ではなく
{{ reversedMessage }}
でOKです🌟

```index.vue
<template>
 <div class="page">
   <p>message: {{ message }}</p>
   <p>reversed message: {{ reversedMessage }}</p>
 </div>
</template>

<script>
export default {
 data () {
   return {
     message: 'Hello Nuxt.js!',
   }
 },
 computed: {
   reversedMessage () {
     return this.message.split('').reverse().join('')
   },
 },
}
</script>
```

### methodsを使った場合のコード
呼び出す物が関数になるので
{{ reversedMessage() }}

```index.vue
<template>
 <div class="page">
   <p>message: {{ message }}</p>
   <p>reversed message: {{ reversedMessage() }}</p>
 </div>
</template>

<script>
export default {
 data () {
   return {
     message: 'Hello Nuxt.js!',
   }
 },
 methods: {
   reversedMessage () {
     return this.message.split('').reverse().join('')
   },
 },
}
</script>
```

## thisコンテキストを使う
thisコンテキストが使えます。
this.messageを平仮名にしてみます。

<img width="646" alt="スクリーンショット 2020-08-02 13.05.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469755/0ab29bff-b9ab-cadf-a6c9-9feda027ca79.png">

```index.vue
<template>
 <div class="page">
   <p>message: {{ message }}</p>
   <p>reversed message: {{ reversedMessage }}</p>
 </div>
</template>

<script>
export default {
 data () {
   return {
     message: 'Hello Nuxt.js!',
   }
 },
 computed: {
   reversedMessage () {
     let message = this.message = 'あいうえお'
     return message.split('').reverse().join('')
   },
 },
}
</script>
```

# methodsとの違い
computedはプロパティ
methodsはメソッドなので
そもそも土台が違うのですが
似ていますよね👭

🎈 続きはWPでご覧ください👀
https://wp.me/pc9NHC-wY
競技プログラミング練習記 No.64【ABC100練習】

初回 -> [はじめに](https://qiita.com/easychoco/items/a9ae28aca97cfe47091f)

[ABC100](https://atcoder.jp/contests/abc100)を解きました。
4完です！

|問題|時間|アルゴリズム|実行時間
|:-:|:-:|:-:|:-:|
| A | 3min |鳩の巣原理| 10ms|
| B | 5min |-| 10ms|
| C | 3min |約数| 12ms|
| D | 28min |全探索| 7ms|

# まとめ
先にまとめを載せます。これ自体は最後に書いてます。

入力が3つ以上のまとまりの時はタプルを使うと便利です。
`vector<tuple<ll, ll, ll>> cake(n)` で宣言して、
`cake[i] = make_tuple(xin, yin, zin)`でタプル化して、
 `tie(x, y, z) = cake[i]` でタプルから変数に戻します。


これ以降は個人的なことですが、、、
キリのいいABC100ということもあり、勉強方法をかえようと思います。
これに伴って、記事の投稿頻度が落ちる見込みです。
解いた問題をしっかり復習したいときに投稿する形にしようと思っています。

これまでは過去のコンテストを解いて、復習としてQiitaに投稿する形をとっていました。
これを毎日やっていました。
ですが、解く問題の難易度が安定しなくてあまり勉強にならない回もありました。
もっと効率よく勉強したいので、自分に合った難易度の問題を解く方式にします。

もし記事を楽しみにされている方がいましたらすみませんが、よろしくお願いいたします。

## A - Happy Birthday!
```c++
  int a, b;
  cin >> a >> b;
  cout << (a > 8 || b > 8 ? ":(" : "Yay!");
```
ケーキは16等分されているので、隣り合うケーキをとらない場合は最大で8ピースとれますね。
9ピース以上を取ろうとするとあふれてしまうので条件を満たせません。
この考え方は[鳩の巣原理](https://www.google.com/search?biw=1857&bih=1009&ei=EjcmX9mODNLKmAX5-afADA&q=%E9%B3%A9%E3%81%AE%E5%B7%A3%E5%8E%9F%E7%90%86&oq=%E9%B3%A9%E3%81%AE%E5%B7%A3%E5%8E%9F%E7%90%86)とも呼ばれていますね。

## B - Ringo's Favorite Numbers
``` c++
  int d, n;
  cin >> d >> n;
  n += n / 100;
  int ans = pow(100, d) * n;
  cout << ans;
```
求める値は「`100` で ちょうど `D` 回割りきれる正の整数」のうち `N` 番目の数字です。
これは $N \times\ 100^D$ で求まります。

ですが、`N=100` のときは`100`で割り切れる数が`D + 1`になってしまうので注意です。
「`100` で ちょうど `D` 回割りきれる正の整数」のうち `100` 番目の数字は $101 \times\ 100^D$ になります。

## C - *3 or /2

``` c++
  int n, a;
  cin >> n;
  int ans = 0;
  for(int i = 0; i < n; ++i)
  {
    cin >> a;
    while(a % 2 == 0)
    {
      a /= 2;
      ans++;
    }
  }
  cout << ans;
```
数列に「`*3`」「`/2`」の演算を適用する回数を最大化するという問題ですね。
`*3`は全ての整数に対して演算可能です。
また、`/2`は2の倍数に対して演算可能です。

`*3`は回数に上限がなくて、`/2`には回数に上限があります。
これをもとに適用回数を最大化することを考えると、毎回1回ずつ`/2`をしていけばいいですね。

つまり、数列内の数値を素因数分解したときの`2`の個数が答えになります。

## D - Patisserie ABC
``` c++
  ll n, m, xin, yin, zin;
  cin >> n >> m;
  vector<tuple<ll, ll, ll>> cake(n);
  for(int i = 0; i < n; ++i)
  {
    cin >> xin >> yin >> zin;
    cake[i] = make_tuple(xin, yin, zin);
  }

  ll ans = 0;
  for(int mask = 0; mask <= 8; mask++)
  {
    vector<ll> points;
    for(int i = 0; i < n; ++i)
    {
      ll x, y, z;
      tie(x, y, z) = cake[i];

      ll point = 0;
      point += ((mask & 0b001) > 0) ? x : -x;
      point += ((mask & 0b010) > 0) ? y : -y;
      point += ((mask & 0b100) > 0) ? z : -z;
      points.emplace_back(point);
    }

    sort(points.rbegin(), points.rend());
    auto st = points.begin();
    auto de = next( points.begin(), m);
    ans = max( ans, accumulate(st, de, 0LL) );
  }
  cout << ans;
```

`x,y,z`の3入力に対して、和の絶対値が点数になります。
つまり、和が正値だったらそのまま、負値だったら符号を反転させます。

この符号をまえもって固定することを考えます。
つまり、`x,y,z`の3入力について正の場合と負の場合で計算します。
これは $2^3=8$ 通りですね。
コードではbit演算で書いていますが、`x,y,z`について3重の`for`文を書いても同じです。
ネストを深くしたくなかったのでbit演算で書きました。

こうすると、絶対値を考えなくても各ケーキの点数がわかります。
出た点数をソートして、大きい順に`M`個とったときの合計点を求めれば最大点数がわかります。

入力をタプルで受けています。
入力が3つ以上のまとまりの時はタプルを使うと便利です。
`vector<tuple<ll, ll, ll>> cake(n)` で宣言して、
`cake[i] = make_tuple(xin, yin, zin)`でタプル化して、
 `tie(x, y, z) = cake[i]` でタプルから変数に戻します。

以上です。ありがとうございました。
EC2でWebサーバーを立ち上げる

# EC2とは

EC2とは、Amazonが提供している仮想サーバー構築サービスのこと。EC2を利用することで、OSを乗せた仮想環境をクラウド上にすばやく作ることができる。 
サーバーの構築が数分ででき、スペックの変更も柔軟に対応できる。クラウドすごい。

# やりたいこと

EC2インスタンスを新規に立ち上げ、Apacheを入れて、ブラウザにHello,World!！を出力する。
Macでやってます。

# 早速やってみる

## 1.EC2インスタンスの起動

AWSマネジメントコンソールよりEC2を選択する。

<img width="1167" alt="EC2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563494/71553ea7-a2a3-518a-0084-b8eab404e98a.png">

インスタンスを起動をクリックし、インスタンスの作成を始める。

<img width="1167" alt="インスタンスを起動.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563494/03312fec-cb5c-7dbb-199e-5c0779a02be5.png">

AMIイメージの設定。AMIイメージは、要するにOSのセッティングで、Linuxや、WindowsやAmazonが無料で提供しているものから有料のものまである。今回は一番上の無料枠を使って作成する。選択したら次の設定へ

<img width="1804" alt="マシンイメージ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563494/391be0c4-02a5-2787-1c46-aa3de1ff2a7a.png">

インスタンスタイプの設定。インスタンスタイプは、CPU・メモリなど、サーバーリソースの性能を選択できる。いいものほど料金は高くなる。今回は無料枠を選択。次の設定へ

<img width="1804" alt="インスタンスタイプ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563494/22163cf3-95d7-5315-43c3-12ed38a635b4.png">

（タグの設定はそのまま次へ）

セキュリティグループの設定。ルールの追加から、HTTPとHTTPSをそれぞれ追加しておく。次の設定へ

<img width="1804" alt="セキュリティグループ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563494/c9e345f7-f7f4-2a8b-ce8c-3fd6eb4c932b.png">

確認画面に写るので、内容を確認の上作成する。キーペアについて聞かれるので、作成していなければ作成してダウンロードしておく。すでにあるのであれば別に新しく作る必要はないので、既存のキーペアを使う。

<img width="705" alt="keypair.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563494/da3614a1-faed-e174-9a72-0613b56bce2d.png">

インスタンスを作成できたら、一覧画面からIPアドレスをコピーしておく。

<img width="1639" alt="インスタンスIP確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563494/84257bef-a052-3d4c-8efd-db960d1a8f17.png">



## 2.インスタンス内に接続する

ここからターミナルで作業する。

```bash:
$ ssh ec2-user@[コピーしたIPアドレス] -i [インスタンス作成時に指定・作成したキーペアのパスを指定]
```

うまくいくとインスタンス内に接続できる。接続を確認したら、ここからルートユーザで処理をしていくので、以下のコマンドをうつ。

```bash:
[ec2-user@ip-xxx-xx-xx-xx ~]$　sudo su
```

ec2-userがrootに変わっていることを確認する。Apacheをインストールする。

```bash:
[root@ip-xxx-xx-xx-xx ~]$ yum install httpd -y
```

インストールできたら、サーバーを立ち上げる。

```bash:
[root@ip-xxx-xx-xx-xx ~]$ service httpd start
Redirecting to /bin/systemctl start httpd.service
```

index.htmlを作成する。

```bash:
[root@ip-xxx-xx-xx-xx ~]$ cd /var/www/html/
[root@ip-xxx-xx-xx-xx ~]$ vim index.html
```

```html:index.html
<html>
  Hello,World!!
</html>
```

作成できたら、ブラウザからEC2インスタンスのIPアドレスに接続する。

<img width="1987" alt="hello.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563494/1b70d23f-33e4-c5cc-5659-84fb33c8cf29.png">

成功！

EC2インスタンスの作成からサーバーの立ち上げまで、本当に簡単にできました。
今のままだと、EC2インスタンスを停止してまた立ち上げたときにIPアドレスが動的に変わるので、Elastic IPの割り当て・インスタンスへの設定をすることでIPアドレスが停止しても変わらなくなります。（今回は割愛）

# 参考
今回の記事にあたり、参考にさせていただきました。
[MacのターミナルでEC2にSSHでログインする](https://qiita.com/ai-2723/items/eb156cd4dd3ccfac8791)
【UFT】ユーティリティまとめ　～Wait(待機)編～


テスト自動化ツールである、UFT(Unified Functional Testing)

今回は"待機"について、公式リファレンスを参考にしながら使い方などをまとめたいと思います。

※公式リファレンスは英語のみです。日本語記事がないので、作成をしてみました。

# Wait関数
Wait関数を記述することで、特定の処理後に一定時間待ち時間を発生することが可能です。

```VB:Wait関数
print "Before"
Wait 5 '数字は秒数を記述します。この場合は5秒待機します。
print "After"
```

# WaitPropertyメソッド

指定したオブジェクトプロパティが指定した値に達するまで、または指定したタイムアウトが経過するまで、
テストの実行を一時停止します。

```VB:WaitProperty
' waitPropery(プロパティ名、プロパティの値、(オプション)タイムアウト:ミリ秒）　タイムアウトはデフォルト20秒

'メモ帳の"text"プロパティ名の値が"無題-メモ帳"になるまで30秒待機する
Window("メモ帳").WaitProperty "text", "無題-メモ帳", 30000

```

# 応用
待機とは違うが、要素が見つかったら処理を継続する方法を紹介します。

## Existメソッドを使用した待機
Existメソッド：対象オブジェクトの存在確認
存在していたらTrue,なかったらFalseを返す。

```VB:Exist
' Exist(time)：timeにはTimeOut値を秒数で指定する
If Window("メモ帳").Exist(30) Then  
	Msgbox "メモ帳が存在します"
ELse	
	Msgbox "メモ帳は存在しません"
End If
```

*********************** 
# 参考・参照
・UFT One Object Model Reference（公式ページ）
https://admhelp.microfocus.com/uft/en/15.0-15.0.1/UFT_Help/Subsystems/OMRHelp/Content/OV_Supp_Util/Utility_ReservedObj.htm?tocpath=Object%20Model%20Reference%20for%20GUI%20Testing%7CUtility%20Objects%7C_____0
hugoで’hugo server'でプレビューしようとしたらError: listen tcp ***: socket: too many open filesが出た時の対処方法

### hugo serverコマンド使用時の注意点
hugo serverで作っているwebページを確認しようとしたらこんなエラーがでた。

```
Serving pages from memory
Running in Fast Render Mode. For full rebuilds on change: hugo server --disableFastRender
Web Server is available at //localhost:49744/ (bind address 127.0.0.1)
Press Ctrl+C to stop
ERROR 2020/08/04 13:36:01 Error: listen tcp 127.0.0.1:49744: socket: too many open files
```
エラーをググるとファイル数を一気に開けないことで上記の症状が起こる模様


調べてみると、自分が作っているサイトに関しては
<img width="256" alt="スクリーンショット 2020-08-04 13.46.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546003/51c4ca8d-629b-0d54-9a63-efec743f9485.png">
14000オーバー。
これが原因。

### 自分の設定の確認方法

```
keineme% ulimit -n
12800
```

```
keineme% ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 12800←ここが足りてない
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 65532
cpu time               (seconds, -t) unlimited
max user processes              (-u) 2784
virtual memory          (kbytes, -v) unlimited
```

### 対応方法
`/Library/LaunchDaemons/limit.maxfiles.plist`
ここにファイルを作成する。

```limit.macfikes.plist
<?xml version="1.0" encoding="UTF-8"?>  
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"  
          "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
    <dict>
      <key>Label</key>
      <string>limit.maxfiles</string>
      <key>ProgramArguments</key>
      <array>
        <string>launchctl</string>
        <string>limit</string>
        <string>maxfiles</string>
        <string>65000</string> // ここの数字は扱う数より大きければよい
        <string>65000</string> // 同様
      </array>
      <key>RunAtLoad</key>
      <true/>
      <key>ServiceIPC</key>
      <false/>
    </dict>
  </plist>
```

このファイルを保存してOS再起動。
再起動して再度コマンド入力。

```
keineme% ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65000
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 65532
cpu time               (seconds, -t) unlimited
max user processes              (-u) 2784
virtual memory          (kbytes, -v) unlimited
```

再度`hugo server`を入力してプレビューがうまくいくことを確認する。

Linuxでも同様の状況が発生するとのことで同じ項目あたりで調べてみるとよいみたい。
RESTとは何でしょう？

# RESTとは
- RESTとはRepresentational State Transferの略語
- WWWのような分散ハイパーメディアシステムのためにあるソフトウェア・アーキテクチャの一つ
- Webに存在しているすべての資源（イメージ、動画、DB資源等）に固有URIを与えて活用することで、資源を定義し資源のアドレスを指定する方法論

> ※URI：「Uniform Resource Identifier」の略で、Web上にあるあらゆるファイルを認識するための識別子の総称で、URNとURLで構成されています。

上記のようなREST式のシステムはRESTfulと呼ばれています。

# CRUDオペレーションとHTTPメソッド
- Create : POST (リソース登録)
- Read : GET (リソース照会)
- Update : PUT (リソース更新)
- Delete : DELETE (リソース削除)


# RESTの構成
- 資源（Resource）、 URI
    - 全てのリソースは固有IDを持っていてIDはサーバーに存在し、クライアントは各リソースの状態を操作するため、リクエストを送る。HTTPでこういったリソースを識別するIDは「Students/1」のようなHTTP URI です。
- 行為（Verb）、HTTPメソッド
    - クライアントはURIを使用してリソースを指定しリソースの操作するためにメソッドを使います。HTTP プロトコルではGET、POST、PUT、DELETEのようなメソッドを提供しています。
- 表現（Representations）
    - クライアントがサーバーにリクエストを送ったときレスポンスとして送られてくるリソースの状態をRepresentationといいます。RESTで一つのリソースはJSON、XML、TEXT、RSSなどのいろいろな形のRepresentationで表現できます。

# RESTの特徴
1．Uniform（ユニフォーム・インターフェース）
Uniform Interfaceは、URIで指定されたリソースへの操作を統一して、限定的なインタフェースで実行するアーキテクチャスタイルを指します。

2．Stateless（ステートレス）
RESTはステートレスの属性を持ちます。言い換えると、作業の状態情報を別途保存して管理することはしません。セッション情報やCookie情報を保存して管理していないため、APIサーバーは受信したリクエストだけを単純に処理すればよいでしょう。これによってサービスの自由度が高くなり、サーバーで不要な情報を管理しないことから、実装が簡単になります。

3．Cacheable（キャッシュ可能）
RESTの最大の特徴の1つは、HTTPという既存のWeb標準をそのまま使用して、Web上で使用する既存のインフラをそのまま活用できるということです。したがってHTTPが持つキャッシュが適用できます。HTTPプロトコル標準で使用するLast-ModifiedタグやE-Tagを使うと、キャッシュの実装が可能です。

4．Self-descriptiveness（自己表現構造）
REST APIメッセージだけ見ても簡単に理解できる独自の表現構造になっています。これはRESTのもう1つの大きな特徴です。

5．Client – Server構造
RESTサーバーはAPIを提供し、クライアントはユーザー認証やコンテキスト（セッション、ログイン情報）などを直接管理する構造になっています。それぞれの役割が確実に区別されており、このため、クライアントとサーバーで開発すべき内容が明確になり、相互依存関係が低減されます。

6．階層型構造
RESTサーバーは複数レイヤで構成され、セキュリティ、負荷分散、暗号化レイヤなどを追加できる柔軟性のある構造になっています。プロキシ、ゲートウェイなどのネットワーク基盤の中間媒体を使用できます。

# RESTのメリット・デメリット
#### メリット
- 使いやすい
    - HTTPプロトコルのインフラをそのまま使用するので、別途インフラこうつくが必要ないです。
- クライアントとサーバーの役割が明確に分離されている
    - クライアントはREST APIを使ってサーバーと情報のやり取りを行います。RESTの特徴の中で「Stateless」によるサーバーはクライアントのContextを保持する必要はないです。
- 特定データ表現が使える
    - REST APIはヘッダー部分にURI処理メソッドを明示して必要なデータは「body」に表現できるように分離されているのでJSON、XMLなど使いたいRepresentation言語で使用可能です。

#### デメリット
- メソッドが限られている
    - HTTPはHTTPメソッドを使ってURIを表現します。こういった表現は使いやすいメリットがありますが、逆にいうとメソッドが決められていることがデメリットです。
- 標準がない
    - RESTは設計ガイドだけで標準ではありません。明確な標準がないのもデメリットだと思います。


# 参考
https://qiita.com/TakahiRoyte/items/949f4e88caecb02119aa
https://meetup-jp.toast.com/931
laravelを使ったときにハマったエラーの解決方法

## 状況

```
laravel new laravelapp
```

Macでlaravelをインストールして上記のlaravelコマンドを使おうとするとこんなエラーが出た。

```
[RuntimeException]                                                       
The Zip PHP extension is not installed. Please install it and try again. 
```

こちらのエラーの解消に大分時間を費やしたので、同じエラーにハマってる人のために記事を残しておこうと思う。

## 解決方法

### composerのインストール

まずはcomposerをインストールする
下記をターミナルで実行する

```
brew install composer
```

### composerコマンドを代わりに使う

```
laravel new laravelapp
```

macの場合これでは無理なので代わりに,composer経由で行う。

```
composer create-project --prefer-dist laravel/laravel test_app
```

test_appは作りたいアプリ名。

このコマンドが使えない場合はパスが通ってない可能性があるので、下記を実行してください。

```
echo "export PATH=~/.composer/vendor/bin:$PATH" >> ~/.zprofile
source ~/.zprofile
```

## 解決方法2

composerコマンドを使って自分の場合は解決できたのですが、それでは解決できないこともあるかもしれません。

そういう場合はdockerを使うことを勧めます。

https://github.com/hiroto2929/laravel_docker

こちらを参考に環境構築してください。



## 参考記事

エラーについて調べた際に出てきた記事
https://qiita.com/endeavor/items/77f7017473c95c42fc29
https://iiiso.ti-da.net/e8647248.html
本番環境とcredentials.yml.enc

#この記事で伝えたいこと
production環境の秘匿情報をcredentialsで扱う前に**しっかり調べましょう**。


#基礎知識 暗号化と復号について
**〜開発環境〜**
```$ rails new```した時config/master.keyと共にcredentials.yml.encは作成されるようです。
そしてこのmaster.keyを使用して暗号化、復号します。
(master.keyは大切に保管しましょう)

秘匿情報の編集には以下のコマンドを実行します。

```
$ rails credentials:edit          #master.keyが存在しない時実行すると新たに作成する
```


**〜本番環境〜**
暗号化と復号にはsecret_key_baseも必要になります。
ローカルで```$ rails secret```コマンドを実行し作成します。
事前にローカルのmaster.keyをサーバーにも配置しておくこと。

#本番環境で気をつけること
credentials.yml.encの暗号化、復号にはmaster.keyを使用すると先ほど書きました。このmaster.key、デフォルトでgitignoreに登録されているためGitの管理対象外となっています。

ここからが大切です。
EC2でgitのリポジトリをクローンしてもこのmaster.keyは当然サーバー上にやってきません。
その事を忘れて本番環境の秘匿情報を追加しようと思い```$ rails credentials:edit```コマンドを実行すると...サーバー上にはmaster.keyが無いので新たに生成されてしまいます。

この時点ではローカルのmaster.keyとサーバーのmaster.keyが異なりcredentials.yml.encの復号ができなくなります。

```
Couldn't decrypt config/credentials.yml.enc. Perhaps you passed the wrong key?
```
こんなエラーや、

```
ActiveSupport::MessageEncryptor::InvalidMessage
```

こんなエラーが発生します。

##もう一度credentialsの復号がしたい
ローカルのmaster.keyをサーバーに置いてあげれば良いです。


master.keyを紛失した場合は、config/credentials.yml.encを削除してから以下のコマンドで
新たなものを生成してくれるようです。
ただしcredentialsの中身は全て吹き飛びますのでご注意を。

```
$ sudo EDITOR=vim rails credentials:edit
```

#Rails6以降とcredentilas.yml.enc
6以降は環境ごとに秘匿情報を分けられるようになりました。(祝)

本番環境で情報を追加したい時以下コマンドを実行します。
環境に応じてenvironment以降を変化させます。

```
$ rails credentials:edit --environment production
```

このコマンドはconfig/credentials/production.yml.encと、config/credentials/production.keyを作成します。ファイル名とキーの名前にそれぞれ該当する環境が記載されます。
サーバーにはproduction.keyのみを上げれば良い。

この場合でもmaster.keyやsecret_key_baseの扱いには注意。




#参考
[Rails 5.2 で ActiveSupport::MessageEncryptor::InvalidMessage](https://qiita.com/scivola/items/cc06ddbfd94d3118f693)

[Rails5.2から追加された credentials.yml.enc のキホン](https://qiita.com/NaokiIshimura/items/2a179f2ab910992c4d39)

[Rails5.2の新機能credentials等でパスワード等を管理する](https://thr3a.hatenablog.com/entry/20180408/1523156956)

[【Ruby/Rails】デプロイ作業をCapistranoで自動化する](https://shikiyura.stars.ne.jp/blog/mac/ruby_rails-automate-deployment-by-capistrano/)

[Add support for multi environment credentials.](https://github.com/rails/rails/pull/33521)


[Rails6から入ったmulti environment credentialsを使う](http://saku.hatenadiary.com/entry/2019/11/05/093755)
（レポート）完全にアジャイル開発理解した2020～東京工業大学 情報理工学院 IT特別教育プログラム 成果発表会～

# イベントについて

東京工業大学のIT特別教育プログラムの結果発表をオンラインで一般公開して行う、というイベントでした。
https://connpass.com/event/182960/

M1の学生4～6名からなるチームが、4か月間でプロダクトのDiscovery, Deliveryを行います。
3つのチームから、それぞれプロダクトと開発のプロセスについて説明していただきました。

イベントの参加風景について、簡単なレポートです。

# Togetterまとめ

https://togetter.com/li/1570841

# 授業の目的

- アジャイル開発を理解する
- プロダクト開発の楽しさや難しさを知る

# 授業の進め方について

- フルオンライン
- 教員のバックログを採用すると、加点
  - 顧客のフィードバックを取り込むことをエミュレートしたかった

# チーム「W8.5F」／プロダクト「citemap」

- プロダクトについて
  - 論文の依存関係をグラフで表示できるツール
- 開発の進め方について
  - 180分スプリント
  - Tシャツサイズでの見積もり
    - 見積に慣れていないため、こちらのほうがやりやすかった
  - フルリモート・モブでの開発
    - COVID-19の影響
    - VS Code LiveShareを利用
  - ふりかえりはKPT
    - Wiki上に表形式で書き加えていく形
- oops
  - **開発スタート後、似たようなサービスがリリース**
    - 開発の厳しさを知った

個人的にはかなり使えるツール。書籍書く時に使えるなぁ…。元論文辿っていくの結構面倒なんですよね。

開発プロセスも、「学生とか社会人とか関係ない」と思わせてくれる、よくあるアジャイル開発の姿でした。途中、デモのビデオが流れましたが、ニーズや使い方が分かるよいデモでした。

# チーム「絵文字のみ（読めない）」／プロダクト「タブノキ」

- プロダクトについて
  - Google Chromeの拡張機能としてリリース済み
  - https://chrome.google.com/webstore/detail/tabnoki/cbdklpckiafghnomalngdchnimkjghcm/related?hl=ja 
  - Chromeのタブを親子構造で表現してくれる
    - タブから開いた子タブの関係を表現
    - タグを付けられる
    - タブをキーワード・タグで検索できる
    - 不要タブを親子で一括削除できる
- 開発の進め方について
  - 見積はStory Pointで
  - モブプロ＋ペアプロ
  - バックログがとてもインクリメンタル

早速入れて使ってます。これは便利。
勉強会の際に色々関連タブを開いておいて、タブノキベースで発表する、みたいなやり方が出来そうです。私は結構事前にタブを開いておく派なので、迷うことなく進められそう。日々の業務の中でも重宝するツールだと思います。
UIも説明不要なレベルで直観的なのがとてもよいです。

# チーム「LaboHouse」／プロダクト「LaboHouse」

- プロダクトについて
  - 「ひま度」を4段階で設定・自動判定
- 開発の進め方について
  - デイリースクラム＝「日々の反省会」というパワーワード

既存のアプリ（Slack, Discord）ではどれくらい暇にしているのか分からないから、というところから始まったプロダクト。「声かけていいかなー」というのは業務中でもあるあるなので、着眼点がよいなーと感じました。
既存のアプリにbotを仕込める形でやれると、もっといろんな人に使ってもらえそう。

（別件の作業しつつだったので話半分しか聞けてないです）

# 交流会

Discordチャンネルに学生・社会人入り混じっての質疑応答会でした。
息子の相手をしながらだったので途中から入りましたが、テキストでの交流がメインでボイスチャットはあまりない感じでした。
普段のアジャイル系コミュニティとは違って、場の設計が難しかったのかなーと想像。

# 授業のふりかえり

参加できず。残念。

# 感想

途中途中で抜けてしまって情報が抜けてしまった部分はありますが、どの発表も楽しそうに開発して、色々な問題を乗り越えてきた、ということが分かる発表でした。すべてのプロダクトが、「これいいじゃん！」と思えるようなものばかりで、Discoveryにもしっかり力を入れたのが分かります。

私も大学時代にソフトウェア開発の授業はありましたが、自分たちで新しいプロダクトを作るものではなく、既存のプロダクトのリバースエンジニアリングによる「プロジェクト体験」でした。それはそれで非常に有意義な体験でしたが、この授業のような「プロダクトを0から自分たちで作る」という体験が学生のうちに出来るのは羨ましくもあります。こういった「アジャイルネイティブ」の学生が社会人になったとき、とても大きな力や流れを生み出してくれるはずと期待しています。

私も負けないように頑張ろう！と活力を貰えるとてもよいイベントでした。
【Kotlin】スクロールと連動させつつ動的にFABを表示したり隠したりする

##はじめに
FloatingActionButtonを使うときはCoordinatorLayoutやRecyclerViewと一緒に使ったりして、スクロールに合わせて表示・非表示を切り替えるかと思います。
この場合は、レイアウトファイルのFABに「app:layout_behavior="com.google.android.material.behavior.HideBottomViewOnScrollBehavior"」と書けばスクロールにあわせていい感じにやってくれます。
しかし、これだと何らかの理由でスクロールができなくなった時にFABが隠れたままになってしまうことがあります。

##どうするか
HideBottomViewOnScrollBehaviorにはslideUp/slideDownメソッドがあるのですが、protectedなメソッドのため外部から呼ぶことはできません。
なので継承したクラスでオーバーライドします。

```Kotlin:ListActivity.kt
class ListActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_list)

        fab = findViewById<FloatingActionButton>(R.id.fab)
    }

    class FabScrollBehavior<V:View>(context: Context?, attrs:AttributeSet?):HideBottomViewOnScrollBehavior<V>(context,attrs){

        public override fun slideDown(child: V) {
            super.slideDown(child)
        }

        public override fun slideUp(child: V) {
            super.slideUp(child)
        }
    }
}
```

それと、app:layout_behaviorも自作したクラスに変更します。

```xml:activity_list.xml

<androidx.coordinatorlayout.widget.CoordinatorLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.test.ListActivity">

        <androidx.recyclerview.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

        <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            app:layout_behavior="com.test.ListActivity$FabScrollBehavior"<!--自作したクラスにする--
            android:layout_gravity="bottom|end"
            android:layout_marginBottom="15sp"
            android:layout_marginEnd="15sp"
            android:src="@android:drawable/ic_input_add"/>

</androidx.coordinatorlayout.widget.CoordinatorLayout>
```
あとは好きな時にslideUpやslideDownを呼ぶだけです。

```kotlin:ListActivity.kt
class ListActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_list)

        fab = findViewById<FloatingActionButton>(R.id.fab)
    }

    private fun showFab(){//FABを表示する
        val behavior = (fab.layoutParams as? CoordinatorLayout.LayoutParams)?.behavior as? FabScrollBehavior?: return
        behavior.slideUp(fab)
    }

    class FabScrollBehavior<V:View>(context: Context?, attrs:AttributeSet?):HideBottomViewOnScrollBehavior<V>(context,attrs){

        public override fun slideDown(child: V) {
            super.slideDown(child)
        }

        public override fun slideUp(child: V) {
            super.slideUp(child)
        }
    }
}
```

##おしまい
FABにはhide()やshow()メソッドがあっても、HideBottomViewOnScrollBehaviorとは共存できないっぽく、今のところこれが一番楽でいい感じかなーと思いました。
なにかおかしなことしてたら教えて頂けると嬉しいです。
【Xcode】ビルドエラー「Code Signing Error: Code signing is required for product type 'Application' in SDK 」の対処法

Unityで書き出したXcodeプロジェクトを実機ビルドした際に、以下のエラーで失敗してしまったため、その対処法備忘録です。

>Code Signing Error: Code signing is required for product type 'Application' in SDK 'iOS 13.6'

## Development Teamが空になっていた

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/75c32c6f-9dec-5b4c-d056-2734362cbc86.png" width=450 />

Xcodeの**Development Teamが空になっていたのが原因**でした。
適切にTeamを設定してあげるとビルドは成功しました。

## Unity側で予め設定しておく

もう1つの解決方法としてUnity側でTeamIDを設定しておく方法です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/7fe92d9f-f95a-bd24-876c-70f7e90f7475.png" width=450 />

PlayerSettingsの`Signing TeamID`に予め入力しておけば書き出されたXcodeプロジェクトに反映されます。

確認方法は以下のページから`Membership`から確認できます。
https://developer.apple.com/account/#/membership


## 環境

- iPhone6s iOS 13.6
- Unity2019.4.4f1
- Xcode 11.6


## 参考

- https://horigood.hatenadiary.org/entry/20171019/1508421077
- https://baba-s.hatenablog.com/entry/2019/04/03/213000
【簡単】RaspberryPi 起動時に任意のプログラムを実行する【ShellScript】

## はじめに

Raspberry Pi を起動時に、任意のプログラムをシェルスクリプトによって実行する方法を紹介します。また、実際に実行ができているか確認するため、シェルスクリプトでpythonファイルを実行してみました。シェルを書き換えればpython以外のプログラムも実行可能です。

## 読んでほしい人
・ラズパイ(もしくはLinux)起動時に何らかのプログラムを実行させたい人
・シェルってなに？って人、もしくはあまり詳しくない人
(シェルについては、3分ほどで読める[この解説](https://wa3.i-3-i.info/word11221.html)を読んでもらえるといいかと思います。)

## 環境

ハード : Raspberry Pi 3 Model B+
(OSが同じであれば、以下の方法で実行可能かと思います)
OS : Raspbian GNU / Linux 10
(Windowsだと以下の方法ではできないので注意!!)

## 実装

### 1. シェルスクリプトファイルの作成

/usr/local/bin/ に autostart.sh を作成する。

```visual-basic
pi@raspberrypi:~ $ sudo nano /usr/local/bin/autostart.sh
```

今回は /home/pi/ ディレクトリにある hello.py(3. で後述)を実行したいため、autostart.shは以下のように変更を加え保存(ctrl + s)する。変更・保存ができているか心配な時は再度↑のコマンドを入力するとよい。

```bash
#!/bin/sh
python3 /home/pi/hello.py
```

加えて、シェルスクリプトに実行権限をを与える。

```visual-basic
pi@raspberrypi:~ $ chmod 755 /usr/local/bin/autostart.sh
```

### 2. rc.localの変更

rc.localに変更を加え、autostart.shを起動時に実行できるようにする。
(rc.localは/etc/rc.localにあります。)

具体的な変更は以下のように成っている。rc.local の最後の部分のみ変更を行っている)

- 変更前

```bash
fi

exit 0
```

- 変更後

```bash
fi

autostart.sh

exit 0
```

### 3.  pythonファイルの作成

 /home/pi/ ディレクトリに hello.py を作成する。

```python
print("hello, ivrc")
```

### 4. 再起動して確認

GUIからでも、terminalからsudo rebootでもよいので再起動して確認してみてください。


## おわりに
今回はRaspberry piで行いましたが、シェルの書き方を少し変えればRaspbian以外のUnix系OS・Python以外の言語でも同じことができます。シェルは私も勉強中なので、少しずつ自力で書けるように頑張ります。

## 参考記事

[ラズパイ起動時にスクリプトを実行したい - Qiita](https://qiita.com/ikemura23/items/6f9adce99a3db555a0e4)

[ラズパイ（Raspbian）でシェルスクリプトを作成する](http://www.sasapy.com/raspi/make_shellscript/)
[SQL]SQLでのデータベース・テーブル作成

#SQLとは？
「SQL（エスキューエル）」は、データベース内のデータを操作するプログラム言語です。
データベースへのデータ挿入や参照の際は、SQLを介して行うのが一般的です。

僕が学習しているRailsでは、SQLを意識することなく、データベースにデータを挿入したり参照できるように設計されています。
代わりにRails内部で、SQLを用いてデータベースへのデータ挿入や検索、削除などの操作を行っています。

#データベースを作成
「CREATE DATABASE データベース名」でデータベースを作成できます。

```
mysql> CREATE DATABASE Test;
Query OK, 1 row affected (0.18 sec)
```

「SHOW DATABASES」でデータベースが作成されたことを確認。
このデータベースの中にテーブルを作成していきます。

```
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| Test               |
| innodb             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.16 sec)
```

#データベースを指定
「USE データベース名」で指定。

```
mysql> USE Test;
Database changed
```

#テーブルを作成
Userテーブルを以下のように作成したいと思います。
「CREATE TABLE テーブル名(カラム名 データ型, カラム名 データ型);」でテーブル作成が可能です。
「Query OK」と出力されると成功です。

| 項目内容 | カラム名 | カラム型 |
|:--|:--|:--|
| ID | id | INT |
| 名前 | name | VARCHAR(100) |

```
mysql> CREATE TABLE user (id INT, name VARCHAR(100));
Query OK, 0 rows affected (0.78 sec)
```

#テーブルを確認
「SHOW TABLES」でテーブル一覧を確認できます。

```
mysql> SHOW TABLES;
+--------------------------+
| Tables_in_Test           |
+--------------------------+
| users                    |
+--------------------------+
1 row in set (0.18 sec)
```

「DESC テーブル名」でテーブルのカラムを確認できます。

```
mysql> DESC user;
+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| id         | int(11)      | YES  |     | NULL    |       |
| name       | varchar(100) | YES  |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+
2 rows in set (0.17 sec)
```
WSL 2 イメージファイルの圧縮

# Windows WSL2 イメージファイル

WSL2 (Windows Subsystem for Linux) は、Linux ディストリビューションをインストールすると、ディスクイメージファイルが作成されます。

このようなディスクイメージファイルは、ファイルの作成や削除を繰り返しているうちに、利用していない領域が発生してしまいます。

このような領域を除いてコンパクトにすることで、ディスクイメージファイルを圧縮することが出来ます。

## イメージファイルの在処

ディスクイメージファイルは、以下のような場所にあります。

ウインドウズドライブ:\Users\ユーザ名\AppData\Local\Packages\ディストリビューション名\LocalState\ext4.vhdx

ここで、ディストリビューション名は、Ubuntu は CanonicalGroupLimited で始まり、Debian は TheDebianProject で始まる名前で、ファイルエクスプローラーなどで実機にて調べる必要があります。

## ディスクイメージの圧縮の仕方

スタートメニューからコマンドプロンプトを開きます。

起動している WSL のディストリビューションを停止させます。

    > wsl --shutdown

続いて、コマンドプロンプトから DISKPART を起動します。

    > diskpart

起動すると別の画面が自動的に開きます。

開いた DISKPART の画面から、ディスクイメージファイルを **select vdisk file=ファイル名** コマンドで選択します。
ユーザ名やディストリビューション名などは、実機にあわせてください。

```
DISKPART> select vdisk file="C:\Users\ユーザ名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_???????????\LocalState\ext4.vhdx"

DiskPart により、仮想ディスク ファイルが選択されました。
```
続いて、**compact vdisk** コマンドでディスクイメージを圧縮します。

```
DISKPART> compact vdisk

  100% 完了しました

DiskPart により、仮想ディスク ファイルは正常に圧縮されました。
```

## 参考

+ Linux ディストリビューション イメージファイルの圧縮
  + https://www.eqq.jp/kw/singularityon10.html