OmniAICreator/Qiita-1.07M huggingface dataset:
Java　標準入力

#はじめに
学習用のメモになります。

#標準入力とは？
もともとはLINUXなどのUnix系OSで用意されていた仕組みです。
標準入力に対応するようにプログラムを作っておけば、プログラム実行時に、ファイルを読み込んだり、キーボードからデータを読み込んだり、パラメータを指定したりというように、入力先を切り替えることができます。


#標準入力から文字列の読み込み
```Main.java
// 標準入力
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); //Scanner クラスは標準入力を取得するのに必要
        String line = sc.next();    //1行分入力を取得する：nextLine()
        System.out.println(line);
    }
}

```

```
Scanner sc = new Scanner(System.in);
```
標準入力を読み込むために必要

```
String line = sc.next();
```
標準入力された値をline変数に代入している

#標準入力から数値の読み込み
```Main.java
// 標準入力
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int line = sc.nextInt();            //データ型をintで数値に変換
        System.out.println(line);
    }
}
```


#複数データを読み込む
入力値

```
3
Java
Ruby
HTML
```

```Main.java
// 標準入力とループ処理
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int count = sc.nextInt();
        System.out.println("データ個数 "+count);
        
        String data;
        for(int i =0;i<count;i++){
             data = sc.next();
             System.out.println("hello " + data);
        }
       
    }
}
```

出力値

```
データ個数 3
hello Java
hello Ruby
hello HTML
```


#１行に複数要素がある場合
`split`メソッドで`,`区切りで要素を配列（array)に代入する

```Main.java
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String data = sc.nextLine();
        
        String[] array = data.split("、");
        System.out.println(array[0]);
    }
}
```

#複数行の要素を出力する場合
```Main.java
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        while (sc.hasNextLine()) {
            String data = sc.nextLine();
            System.out.println(data);
        }
    }
}
```
`hasNextLine`メソッドは入力する行がまだあるかみているメソッド

```
while (sc.hasNextLine())
```
Nginxで「could not build server_names_hash...」エラーが出た時の対処方法

AWSの自動的に割り当てられるPublic DNSでアクセスできるようにNginxに設定してエラーがでたときのメモです。

## 環境
- AWS
- Ubuntu: 20.04.1 LTS (Focal Fossa)
- Nginx: 1.18.0

## エラーメッセージ
```
nginx: [emerg] could not build server_names_hash, you should increase server_names_hash_bucket_size: 64
```

## 原因
- `server_name`が長すぎる。

## 対応方法
- `/etc/nginx/nginc.conf`の以下の箇所を修正してNginx再起動

```
#        server_names_hash_bucket_size 64;
        server_names_hash_bucket_size 128;
```

## 参考
- [まかあそてっく](https://makaaso-tech.com/nginx-server-names-hash-error/)
Laravel6 Unitテスト時に「Maximum function nesting level~」のエラーが出た

## 目的

- しょーもないミスで時間を費やしてしまったので反省の意味も含めてエラー原因などをメモ的にまとめる

## 前提情報

- LaravelのUnitテストを実行したところ「Error: Maximum function nesting level of '256' reached, aborting!」というエラーが出た。
- テストではServiceを呼び出し、紐付いたRepositoryからデータを取得する事ができるかを確認していた。

## 原因

- Serviceクラスの依存注入でそのServiceクラス自体を依存注入してしまっていた。
- さらにServiceクラス内のメソッドでそのメソッドを呼び出す処理を記載していた。
- わかりにくいと思うので下記に図を記載する。
    - 理想

        ![mermaid-diagram-20201127145744.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b4ee4d2b-5f5e-7adb-8beb-a0d4982f9549.png)

    - 今回
    
        ![mermaid-diagram-20201127145729.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/2b6b9084-34bb-783b-8c04-690073b354cd.png)


- 上記でなんとなくご理解いただけたと思うがUnitテストで呼び出しているServiceクラスのメソッドが自身を呼び出すようになってしまっていた。
- 当該ループが256回に達したため、エラーを出力して処理が停止した。

## 改善策

- ServiceクラスでRepositoryクラスが依存注入できているかを確認する。
- 下記画像の流れを意識しながら実装する。

    ![mermaid-diagram-20201127145744.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/8503f1cc-c47a-3254-b6c7-78bc00515f40.png)
Python 3 エンジニア認定データ分析試験 受験体験記

# 受験した資格

* [Python 3 エンジニア認定データ分析試験](https://www.pythonic-exam.com/exam/analyist) （一般社団法人Pythonエンジニア育成推進協会）
* 費用: 11,000円（税込）（後述するキャンペーンで書籍と受験チケットのセットを購入）

# 内容

[出題範囲](https://www.pythonic-exam.com/exam/analyist) にありますが、[翔泳社「Pythonによるあたらしいデータ分析の教科書」](https://www.amazon.co.jp/dp/4798158348)の内容から出題されて、データ分析に必要となる数学の知識やnumpy、pandas、matplotlib、scikit-learn等のライブラリについて出題される。

# 受験方法

事前に日時を予約してテストセンターで受験する方式です（CBT）。
60分。
（[詳細はこちら](https://cbt.odyssey-com.co.jp/pythonic-exam.html#python3basic_beta)）

# 受験のきっかけ・目的

[【1万人達成キャンペーン】Python試験 受験チケット＋対策教材セット割引](https://www.pythonic-exam.com/archives/news/20200914-2)のキャンペーン（現在は終了しています）を見て、興味を持った。試しに基礎試験の模擬試験を受験したが、基礎試験のほうは簡単に感じられたことと、自分自身が機械学習やディープラーニングに興味があったため、データ分析試験を受験することにした。
また、エンジニアの採用を行なう時に、資格試験の内容を把握しておくことが役に立つと考えたためである。

# 学習方法

[翔泳社「Pythonによるあたらしいデータ分析の教科書」](https://www.amazon.co.jp/dp/4798158348)を一通り読み、ダウンロードできるJupyter Notebook形式のファイルも一通り実行して確認した。期間としては2週間程度。特に理解するのに苦労するようなものはなかった。模擬試験もオンラインで受験した（90%以上正答できるレベル）。

# 結果

**合格**
（975点。1000満点、700点以上が合格。）

# 所感

私はPythonを使用している某オープンソースソフトウェアのContributorとして何年も活動してきているので、Pythonの文法などに不安はなく、numpy、pandas、matplotlib、scikit-learn等のライブラリの使用方法を学習するだけで合格できた。比較的易しい部類の資格試験だと思う。そういう意味で（Pythonを使用してデータ分析を行なう）初心者向けの資格だと思う。ただ、易しいからといって存在価値がないわけではなく、データ分析に用いるライブラリなどの使用方法の基本などの基礎ができているかを確認するには有用だと思う。一般的に言われることだが、**基礎がしっかりしていないと応用はできない**と思う。
また、**オープンソースのContributorの中には他の人に書いてもらったコードをSubmitしている人もいる**ので、それらのソースコードを見ても本人が書いているのか分からないケースもあるが、受験時に本人証明書（運転免許等）での本人確認があり、本人の知識・スキルが確認できているので、採用などでの時間の節約になると思う。

※ 2020年11月現在の情報に基づいて記載しております。受験の際は必ず公式サイトで最新の情報をご確認ください。
【React】React Storybook v.6 導入　サンプル

#はじめに

"React Storybook" の導入について簡単にまとめたメモとして残します。

<br/>

##Storybook とは

Storybook を使用することで、UI コンポーネントをビジネスロジックやコンテキストから切り離して開発できるようになります。また可視化することができるので提案、打ち合わせなどにも活用できます。

<br/>

##はじめ方

さっそくですがまずは、Reactのアプリケーションを作成します。

```
npx create-react-app React-Story-Book
```
<br/>

RCAで作成したアプリにStorybookを追加します。


```
npx -p @storybook/cli sb init
```
コマンドの実行には基本的に yarn となりますが、 yarn ではなく npm を使用したい場合には、上記のコマンドの末尾に` --use-npm `つけることで、npmコマンドを使用することができます。
(今回は`--use-npm`をつけてnpmで実行しました)

<br/>


処理が完了したら下記コマンドを実行します。

```
npm run storybook
```

これでポート 9009でStorybookのデフォルトのエクスプローラーが表示されたと思います🚀

<br/>


##簡単なボタンの作成

最後に簡単なボタンコンポーネントの例を作っていきたいと思います。

###準備

* 上記コマンドによりjsonファイルに各Storybookの追加された記述と
 アプリケーションフォルダ内にstorybookディレクトリとsrcディレクトリ直下にstoryディレクトリが作成されているのが確認してください。

* 今回は新たにディレクトリを作成していくので、src直下のstoryディレクトリを削除します。

* srcディレクトリ直下にcomponentsディレクトリを作成してさらにButtonディレクトリを作成し、その中に以下3つのファイルを作成します。
 
　・Button.js
　・Button.stories.js
　・Button.css
![ディレクトリ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637128/1954cc47-8108-104a-eba3-d0ff036ad4fd.png)


<br/>

##ソースコード

###Button.js

```Button.js
import React from 'react';
import './Button.css'

function Button(props) {
  const { variant = 'primary', children, ...rest} = props
  return (
    <button className={`button ${variant}`} {...rest} >
      { children }
    </button>
  )
}

export default Button
```

###Button.css

```Button.css
.button {
  border: none;
  color: white;
  padding: 15px 32px;
  text-align: center;
  text-decoration: none;
  display: inline-block;
  font-size: 16px;
  border-radius: 4px;
  cursor: pointer;
}

.primary {background-color: #008CBA;}
.secondary {background-color: #e7e7e7; color: black;}
.succcess {background-color: #4CAF50;}
.danger {background-color: #f44336;}

```

###Button.stories.js

```Button.stories.js
import React from 'react';
import Button from './Button';


export default {
  title: 'Button',
  component: Button
}

export const Primary = () => <Button variant='primary'>Primary</Button>
export const Secondary = () => <Button variant='secondary'>Secondary</Button>
export const Succcess = () => <Button variant='succcess'>Succcess</Button>
export const Danger = () => <Button variant='danger'>Danger</Button>
```

<br/>

上記ソースコードを実際に出力するとこのようになると思います。

![storybook](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637128/d3420e5f-1f6b-48fa-ef87-c8d3b4aeb844.png)
<br/>

- Button.jsで左のサイドバーの親となるButtonの作成。
- Button.stories.jsでその子となるコンポーネントを記述。
- Button.cssでそれぞれの見た目を記述。

<br/>


#終わりに

簡単な導入方法と１例の紹介でした！
さらに掘り下げる場合は公式サイトなどを見てみると良いと思います！

[Storybook の公式ドキュメント]("https://storybook.js.org/docs/react/get-started/introduction")
touchesbeganによるダブルタップ

備忘録メモ
少し詰まったので！

ダブルタップしたときの位置座標を取得したかった。
TapGestureRecognizerだとsenderとかが色々めんどくさそうだったので、
touchesbeganで実装

```swift
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let touch = touches.first{
            if touch.tapCount == 2{
              print("double tap!")
            }
        }
    }
```
【VSCode】PHPの関数が未定義とのエラーが発生。原因は拡張機能のバージョンだった。

#【VSCode】PHPの関数が未定義とのエラーが発生。原因は拡張機能のバージョンだった。

###使用環境
* windows 10 Home
* VSCode
* PHP intelephense 1.5.4

##背景
ふとVSCodeを立ち上げたら、開発途中のソースコードでPHPに関連する関数が未定義だとエラーが発生。つい最近までそんなことはなかったのに！
なんだか最近、VSCodeに振り回されています...

##解決方法
調べてみたところ、VSCodeの拡張機能**PHP intelephense**のバージョンが原因とのこと。
下記記事にもある通りバージョンを**1.5.4→1.2.3**まで下げてみたら解決。

[【VSCode】PHPで関数のインテリセンスが効かない問題を解決](https://www.otomata01.com/entry/php-intelephense-error)
1リンクアームの動力学

[ラグランジュの運動方程式](https://qiita.com/tomoyakamimura/items/0390b60aef3e396652bd)を用いて，2次元平面に拘束された1リンクアームの運動方程式を求めてみる．

# 定義

![OneLinkArm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669185/cc6d12ee-26e5-57cb-6a94-676bb61d787c.png)

一様とは限らない剛体リンクが，ジョイントを介して慣性座標系の原点に固定されている．剛体振り子と考えても良い．

リンクの質量と長さは$m$, $l$とする．原点から質量中心までの距離を$l_{g}$とする．質量中心まわりの慣性モーメントを$I$とする．リンクと$x$軸とがなす角度を$\theta$とする．リンクの質量中心の位置を$(x, y)$とする．ジョイントにはモーターが接続されていて，トルク$\tau$を発揮することができる．$y$の負の向きに重力$g$がかかる．

# エネルギー関数の計算

系の運動エネルギーとポテンシャルエネルギーを求める．

まず運動エネルギー$T$を求めよう．
ここで，並進の運動エネルギーについてはデカルト座標を用いて書き下すのが簡便である．
$$
    T = \frac{m}{2}(\dot{x}^2 + \dot{y}^2) + \frac{I}{2}\dot{\theta}^2
$$
ここではまだジョイントによる拘束は考えていない．**リンクは独立なものとして運動エネルギーを求め，あとから拘束条件を考える**ことで思考を単純化することができる．

ジョイントによる拘束条件は以下のように書ける．
ジョイントは幾何的な拘束であり，これは位置の関係式で完全に表すことができるので，**ホロノミックな拘束**であるといえる．ホロノミック拘束は**独立な変数を減らし計算を簡単にしてくれる**ので，ありがたい条件である．

```math
    x = l_{g}\cos\theta\\
    y = l_{g}\sin\theta
```
位置拘束条件の時間微分を行い，$\dot{x}$と$\dot{y}$を$\theta$と$\dot{\theta}$で表す．すなわち，

```math
    \dot{x} = -l_{g}\dot{\theta}\sin\theta\\
    \dot{y} =  l_{g}\dot{\theta}\cos\theta
```
である．これを上記で求めた運動エネルギーに代入して，
$$
    T = \frac{m}{2}l_{g}^2\dot{\theta}^2 + \frac{I}{2}\dot{\theta}^2
    =\frac{1}{2}(I + m l_g^2)\dot{\theta}^2
$$
となる．
ホロノミック拘束によって，$x,y,\theta$の3つの座標を用いて表されていた系が$\theta$のみで表されるようになるということを覚えておこう．

```
この程度の運動エネルギーであれば，このような回りくどい考え方をせずにいきなり最後の形で書けるだろう．
今回は説明のため，今後応用しやすい形で計算を行っている．
```

次にポテンシャルエネルギー$U$を求めよう．$y=0$を重力ポテンシャルの原点として，
$$
    U = mgy = mgl_g\sin\theta
$$
となる．

これで，ラグランジアン$L$を求める準備はできた．
$$
    L = T- U = \frac{1}{2}(I + m l_g^2)\dot{\theta}^2 - mgl_g\sin\theta
$$

# 運動方程式を求める

ラグランジアンが導出できたので，微分操作を行い運動方程式を求める．
ラグランジュの運動方程式は

```math
    \frac{{\rm d}}{{\rm d}t}\left(\frac{\partial L}{\partial \dot{q}_i}\right) - \frac{\partial L}{\partial q_i} = Q_i
```

である．ラグランジアンは一般化座標$\theta$のみを用いて表されているので，

```math
    \frac{{\rm d}}{{\rm d}t}\left(\frac{\partial L}{\partial \dot{\theta}}\right) = \frac{{\rm d}}{{\rm d}t}\left\lbrace(I + m l_g^2)\dot{\theta}\right\rbrace = (I + m l_g^2)\ddot{\theta}\\
    \frac{\partial L}{\partial \theta} = -mgl_g\cos\theta
```
を得る．

次に一般化力について考える．
ジョイントは$\theta$を直接変化させるトルク$\tau$を発揮するので，今回は
$$
    Q = \tau
$$
である．座標変換の必要はなかった．

以上から，この系の運動方程式は
$$
    (I + m l_g^2)\ddot{\theta}+mgl_g\cos\theta = \tau
$$
となる．

## 得られた運動方程式の検証

上記で得られた運動方程式は本当に正しいのだろうか．複雑な系ではこの問題に関して検証を行うことは難しい．しかし，今回は非常に単純な系を用いているので，オイラーの運動方程式と比較して検証を行ってみよう．

ジョイント周りのモーメントの釣り合いを考えてオイラーの運動方程式を立式する．まず，リンクのジョイント周りの慣性モーメント$I_O$は$I_O=(I + m l_g^2)$となることから，慣性力は
$$
    -I_O\ddot{\theta} = -(I + m l_g^2)\ddot{\theta}
$$
となる．
リンクにかかっている外力は，モータートルク$\tau$と重力である．重力は質量中心にかかっていると考えて，その力が及ぼすトルクは
$$
    -mgl_g\cos\theta
$$
と表せる．
以上のトルクの([ダランベールの原理](https://qiita.com/tomoyakamimura/items/a5b0827a037dcfe8c43e)の意味で言う)釣り合いは，
$$
    -(I + m l_g^2)\ddot{\theta} -mgl_g\cos\theta + \tau = 0
$$
となる．これはラグランジュの運動方程式で求めたものと完全に一致している．

# まとめ

ラグランジュの運動方程式を用いると，思考を単純化し機械的に運動方程式を求めることができる．はじめはできるだけ物理的な意味を考えず，淡々とすべてのエネルギーを書き出し，そのあとで拘束条件などを入れていくことがコツである．この方法を用いれば，系がどれだけ複雑であっても，いつも同じような作業を行うことで運動方程式を得ることができる．

ただし，機械的に求める以上，出現したそれぞれの項がどのような物理的意味を持っているかは計算過程から明らかではない．このようなことを知りたい場合は，系をよく観察し，各項がどのような意味を持っているのか，作業者自身が頭を使って考える必要がある．
【Semantic Segmentation】DeepLab(v2) : DeepLab(v1)との違いは？

<h1>背景</h1>
[DeepLab(v1)](https://qiita.com/minh33/items/8eb31d16a975d2a87de5)を調べたから次はDeepLab(v2)だ！と思い探していると、恐らくそれっぽい論文が見つかったのだが、タイトルがほぼ一緒で戸惑った。ちょっと文字足しだけやんけ

<h3>DeepLab(v1)</h3>
SEMANTIC IMAGE SEGMENTATION WITH DEEP CONVOLUTIONAL NETS AND FULLY CONNECTED CRFS

<h3>DeepLab(v2)</h3>
DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution,and Fully Connected CRFs

<h1>version1からのupdate</h1>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/03a139d4-0375-3036-7307-7cce183f8fdc.png)

Spatial Pyramid Poolingを知っている人なら簡単に分かると思うのが、ASPPではPoolingで解像度を落とさず、代わりにAtrous(Dilated) Convolutionで全体の特徴を取りに行くので特徴量Mapが小さくならずに済む。
downsampleしたりupsampleせずに情報が得られるから、個人的に結構すごいと思う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/033429fc-a2fa-d8d4-1164-d1e77ce34835.png)

<h2>Atrous(Dilated) Convolutionの凄さ</h2>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/8a73a6db-91a5-4546-5e01-ee71c7531702.png)

図からみて分かるように
downsample->convolution->upsampleするより
Atrous Convolutionする方が特徴がDenseに取れる。

上の方法だとSmoothingする為のLayerもう一枚追加する必要がありそう。

<h2>結論</h2>
ASPP Moduleが追加された事
これは大きな貢献だと思う

<h1>参考文献</h1>
DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution,and Fully Connected CRFs
https://arxiv.org/pdf/1606.00915.pdf
curl: Google Cloud Translation API がサポートする言語の一覧を取得

参考ページ
[Method: projects.getSupportedLanguages](https://cloud.google.com/translate/docs/reference/rest/v3/projects/getSupportedLanguages?hl=ja)

```bash
export GOOGLE_APPLICATION_CREDENTIALS=./***.json
#
curl \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
 https://translation.googleapis.com/v3/projects/project-translation/supportedLanguages
```

実行結果

```json
{
  "languages": [
    {
      "languageCode": "af",
      "supportSource": true,
      "supportTarget": true
    },
    {
      "languageCode": "am",
      "supportSource": true,
      "supportTarget": true
    },
    {
      "languageCode": "ar",
      "supportSource": true,
      "supportTarget": true
    },
（省略）
```
【Nuxt.js】Nuxt実践編：パンくずリストを作ろう

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

#前置き
![スクリーンショット-2020-11-16-20.01.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469755/640db413-99dd-bb62-8276-b84ea92e4634.png)


今回はパンくずリストを作成します🍞
すごくシンプルに、
コンポーネント作成のコツを
簡単に理解できるので
ぜひやってみてください✨💪

#構成
##アトミックデザイン
⬇️アトミックデザインや
分け方についてはこちら


他にもいくつか書いているので
ブログ内で検索してみてください🔍

パンくずリストはナビの役割なので
templatesに入れています🎈🧸

また、パンくずリストは
ヘッダーに入れたりするのが基本ですが、
今回は表示ができれば良いので
index.vueでimportしてもらえればOKです🙆‍♀️

```bash:file
components/
--| templates/
----| navs
------| NavBread.vue

pages/
--| index.vue
```

##使用するもの
###CSS

```NavBread.vue
fontsize: 12px;
color: rgba(0, 134, 231, 0.8);
```

paddingは大体で良いです💡

⬇️横並びはFlexboxにしましょう！
[【Nuxt.js】Nuxt実践編：Flexboxを使おう！](https://note.com/aliz/n/nbb8889844123)

###template
ABOUTページを開いている状態で、
TOPへのリンクをしてください🌟

また、画像はSVGを使用してみましょう！
できる方はSVGコンポーネントを作成しましょう🧙‍♀️
https://iconmonstr.com/arrow-25-svg/

#Let's try!
まずは答えを見ずにやってみましょう♪



#答え
🎈 続きはWPでご覧ください👀
https://wp.me/pc9NHC-S8
DBを使わず時間制限付きトークンを発行する

新規会員登録やパスワードリセットなどで、期間限定のトークンを発行することがあります。普通はトークンの発行時にトークン自身と有効期限をDBに登録し、トークン検証時にレコードの有効期限を確認します。

ですが、さまざまな事情でDBにトークンを記録したくないとか、そもそもDBが使用できないというような場合があります。そういうときにDBを使用せずに期間限定トークンを発行する方法を考えてみました。

クリティカルな用途には向かないと思いますので、実際に採用するかどうかは慎重にご検討ください。

## アイデア

アイデアとしては、トークン内にトークン発行日時を埋め込んでしまえばいいというものです。

トークンを解読して発行日時を書き換えられたら意味がないので、トークンは一方向ハッシュ化します。

一方向ハッシュ化したら発行側でもトークンを検証できませんが、そこは現在日時を使って再度トークンを生成しなおすことで対応します。

## 実装

実装は以下のようになります。

```php
function generate_token($salt)
{
  $epoch = time();
  return _generate_token($salt, $epoch);
}

function verify_token($salt, $token)
{
  $epoch = time();
  $new_token = _generate_token($salt, $epoch);
  return $token == $new_token;
}

function _generate_token($salt, $epoch)
{
  return crypt((string)$epoch, $salt);
}
```

これで有効期間1秒のトークンが実装できました。

有効期間1秒ではさすがに使い物になりません。有効期間を1時間にする場合、3600秒前までトークン検証を繰り返します。

```php
function verify_token($salt, $token)
{
  $epoch = time();
  for($i = 0; $i < 3600; $i++) {
    $new_token = _generate_token($salt, $epoch - $i);
    if($token == $new_token) {
      return true;
    }
  }
  return false;
}
```

検証のたびに3600回もループを回していては負荷が問題になりますので、エポック秒を 3600 で割って使います。

```php
function _generate_token($salt, $epoch)
{
  return crypt((string)floor($epoch / 3600), $salt);
}
```

しかしこれでは有効期間は1秒から3600秒のどれかになってしまいます。12時台であれば、12時0分でも12時30分でも12時59分でも、全部有効期限は12時59分59秒ってことですね。運良く12時直後にトークンを発行したら1時間近く有効ですが、12時59分付近だと有効期限は1分になってしまい、さすがに実用的ではありません。

そこで以下のように修正します。

```php
function verify_token($salt, $token)
{
  $epoch = time();
  $new_token = _generate_token($salt, $epoch);
  if($token == $new_token) {
    return true;
  }
  $new_token = _generate_token($salt, $epoch - 3600);
  if($token == $new_token) {
    return true;
  }
  return false;
}
```

これで有効期間は1時間から1時間59分59秒となりました。1時間有効なトークンと言いつつ最長で2時間近く有効になりますので、かなりいい加減な仕様になります。つまりは、その程度のいい加減さが許される程度の用途にしか使えないということです。

## 欠点

他にも欠点がありまして、トークンにユーザを特定する情報を埋め込むことができません。通常のトークン実装であれば DB をトークンで検索してレコードに紐づけてあったユーザIDなりを取得すればいいのですが、DB を使用していませんから取得できる情報はユーザから渡されるもののみになります。ですので、ユーザIDなどの情報を別パラメータで引き回しておく必要があります。

```
https://example.com/?token=xxx // ×
https://example.com/?userid=yyy&token=xxx // 〇
```
サーバーサイドエンジニアが知っておくべきiOSアプリのデプロイとかテスト周りの知識をメモる

他にもいろいろ方法あるかもしれない。


## firebase app distribution
- sandboxアプリやqaアプリなどのベータ版アプリのダウンロードはこれ経由で行う


## test flight

- test flightが登録されたアプリを触って試すことができる
- (ややこしい登録なしで)課金も試すことができる
- testerとして招待してもらうことが必要
【Laravel】routesのweb.phpでRouteが未定義になるのはVSCodeの拡張機能が原因だった

#【Laravel】routesのweb.phpでRouteが未定義になるのはVSCodeの拡張機能が原因だった

###使用環境
* windows 10 Home(COREi7)
* XAMPP 7.3.18
* Laravel 6
* VSCode

##背景
Laravelの学習に取り組んでいるとルーティングを行うroutesフォルダのweb.phpでRouteが未定義だとエラーが発生していた。

##原因
VSCodeの拡張機能**PHP intelephense**を使用しているとこのエラーが発生する模様。

##解決方法
調べてみると2パターンある模様。1つはVSCodeの拡張機能を使う方法。2つ目は定義づけする方法。

###1つ目 VSCodeの拡張機能を使う
　拡張機能の**intelephense**を使用し、intelephenseの設定から以下のチェックを外す。その後、VSCodeを再起動する。
詳しくは下記webサイトを参照。

>intelephense.diagnostics.undefinedClassConstants
intelephense.diagnostics.undefinedConstants
intelephense.diagnostics.undefinedFunctions
intelephense.diagnostics.undefinedMethods
intelephense.diagnostics.undefinedProperties
intelephense.diagnostics.undefinedTypes
[[VSCode] LaravelでRouteなどがエラーになるのを直す](https://www.searchlight8.com/vscode-laravel-code-error/)
[VSCode拡張機能Intelephenseの更新によるUndefined type 'Route'(他クラス)のエラー](https://qiita.com/AkiYanagimoto/items/047c3492749a407c2ace)

###2つ目 web.phpファイル内で定義付けする
　web.phpファイル内に```use Illuminate\Support\Facades\Route;```の1文を追加する。
ちなみに関連付けされたRoute.phpは次の場所にある。
```作成したLaravelプロジェクトフォルダ\vendor\laravel\framework\src\Illuminate\Support\Facades```

###注意事項
Routeの使用自体は```use Illuminate\Support\Facades\Route;```をわざわざ記述しなくても使用できるようになっている。

[web.phpでuse Illuminate\Support\Facades\Routeをしなくてよい理由](https://teratail.com/questions/202265)

>App\Http\Controllers名前空間をコントローラルート登録時に毎回指定しなくても済むように、デフォルトでRouteServiceProviderが名前空間グループの中でroutes.phpファイルを読み込み、指定していることを覚えておいてください。これにより、先頭のApp\Http\Controllers名前空間を省略でき、続きの部分を指定するだけで済みます。
[[公式]ルーティング 6.xLaravel](https://readouble.com/laravel/6.x/ja/routing.html)
【Nuxt.js】Nuxt実践編：Flexboxを使おう！

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

#前置き
![Frame-15 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469755/53ecac70-3a1a-81a2-315a-a0c2615c16de.png)

CSSでよく使う
flexプロパティを使ってみましょう🌟
横並びや中央揃えが
簡単にできるものですね💡

時と場合によりますが
floatより便利で高頻度で使います💕

⬇️こんな感じで使います❣️

```index.vue
display: flex;
justify-content: space-between;
align-items: center;
```

MDN: [CSS フレックスボックスレイアウト](https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Flexible_Box_Layout)

> FlexboxとはFlexible Box Layout Moduleのことで、
その名の通りフレキシブルで簡単にレイアウトが組めちゃう素敵ボックスです。
[日本語対応！CSS Flexboxのチートシートを作ったので配布します](https://www.webcreatorbox.com/tech/css-flexbox-cheat-sheet)

今までNuxtメインで
肝心のHTML,CSSを
あまりやっていなかったので
少しずつやっていきます🌱🙋‍♀️

#作る物
![Frame-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469755/ecb2ad30-80d9-afc7-2139-a267f442b249.png)

前置きにあった画像の
カード部分です🌟

ネイルデザインの
カードをイメージしてます💅❤️
四角◾️には画像が入ります。
ネイルの名前と画像、
紹介文とタグ、
ネイリストの他の作品も一覧で見る👀
といった感じにしています。

⬇️リンク先
ボタンを押すとネイリストのネイル一覧
同じくカードを押すしてもネイル一覧
タグを押すとタグに該当するデザインの一覧

#構成
では構成を考えていきましょう🤔💭
まずはディレクトリ 、コンポーネントから。

🎈 続きはWPでご覧ください👀
https://wp.me/pc9NHC-TP
quasar Icon Genie CLI をインストールしたときのエラー

##quasar Icon Genie CLI をインストールしたときのエラー


```
sudo npm install -g @quasar/icongenie
```

でIcon Genie CLIを入れようとしたら


```
ERR! sharp EACCES: permission denied, mkdir '/Users/smac/.npm/_libvips'

info sharp Are you trying to install as a root or sudo user? Try again with the --unsafe-perm flag

info sharp Attempting to build from source via node-gyp but this may fail due to the above error

info sharp Please see https://sharp.pixelplumbing.com/install for required dependencies

gyp WARN EACCES current user ("nobody") does not have permission to access the dev dir "/Users/smac/Library/Caches/node-gyp/14.14.0"

gyp WARN EACCES attempting to reinstall using temporary dev dir "/Users/smac/.npm-global/lib/node_modules/@quasar/icongenie/node_modules/sharp/.node-gyp"

gyp WARN install got an error, rolling back install

gyp WARN install got an error, rolling back install

gyp ERR! configure error

gyp ERR! stack Error: EACCES: permission denied, mkdir '/Users/smac/.npm-global/lib/node_modules/@quasar/icongenie/node_modules/sharp/.node-gyp'

gyp ERR! System Darwin 20.1.0

gyp ERR! command "/usr/local/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"

gyp ERR! cwd /Users/smac/.npm-global/lib/node_modules/@quasar/icongenie/node_modules/sharp

gyp ERR! node -v v14.14.0

gyp ERR! node-gyp -v v5.1.0

gyp ERR! not ok

npm ERR! code ELIFECYCLE

npm ERR! errno 1

npm ERR! sharp@0.25.4 install: `(node install/libvips && node install/dll-copy && prebuild-install --runtime=napi) || (node-gyp rebuild && node install/dll-copy)`

npm ERR! Exit status 1

npm ERR! Failed at the sharp@0.25.4 install script.

npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:

npm ERR!     /Users/smac/.npm/_logs/2020-11-27T04_37_14_145Z-debug.log

```

すげーたくさんエラー出たんですが、
一番上の--unsafe-permってやつをつけたら普通に大丈夫になった。
未経験で、なんじゃこれなエラーだったので、
エラーわかるようになったのはだいぶ進歩しました
quasarはエラー多い？？

```
sudo npm install -g @quasar/icongenie --unsafe-perm

+ @quasar/icongenie@2.3.3
added 575 packages from 477 contributors in 24.094s
```
[Kotlin]「Androidアプリ開発の教科書」のKotlin化の際に起きた「Unresolved reference: findViewById」エラー

Kotlin初めて２日目の新米です:rice:

「Androidアプリ開発の教科書」という本を参考に勉強しているのですが、
(この本に記載されているコードは[こちら](https://wings.msn.to/index.php/-/A-07/978-4-7981-5202-8/)で公開されています。)

私の手元にあるのが2018年版のものでKotlinに対応しておらず・・・

javaを自動変換を使いながらKotlinに直してやっているのですが、躓いたところがあるのでメモ:writing_hand:

### エラー：「Unresolved reference: findViewById」

```.java
private class HelloListener implements View.OnClickListener {
	@Override
	public void onClick(View view) {
		EditText input = findViewById(R.id.etName);
		TextView output = findViewById(R.id.tvOutput);
		String inputStr = input.getText().toString();
		output.setText(inputStr + "さん、こんにちは！");
	}
}
```

という処理を自動変換で直したところ、

```.java
private class HelloListener : View.OnClickListener {
    override fun onClick(view: View) {
        val input: EditText = findViewById(R.id.etName)
        val output: TextView = findViewById(R.id.tvOutput)
        val inputStr = input.text.toString()
        output.text = inputStr + "さん、こんにちは！"
        }
}
```

このようになりました。

しかし、こちらのコードだと
`Unresolved reference: findViewById`というエラーが出てしまいました。

調べてみたところ、

Kotlinでは内部クラスから外のメソッドや変数などを使用したい場合、innerクラスであることを明示しなければならないようです。

`findViewById`メソッドは親クラスの`AppCompactActivity.java`のメソッドなので、

使う際には、`HelloListener`クラスがinnnerである事を明示します。

```.java
private inner class HelloListener : View.OnClickListener {
    override fun onClick(view: View) {
        val input: EditText = findViewById(R.id.etName)
        val output: TextView = findViewById(R.id.tvOutput)
        val inputStr = input.text.toString()
        output.text = inputStr + "さん、こんにちは！"
        }
}
```

これで無事`findViewById`メソッドを使えるようになりました:sparkles:

理由について詳しく説明している記事↓
[Kotlin - 内部クラスとネストされたクラス](https://blog.y-yuki.net/entry/2019/05/23/003000)
モーダル遷移

###ストーリーボードによるモーダル遷移から、前の画面に戻る方法

```swift
self?.dismiss(animated: true, completion: nil)
```

####ストーリーボードによるモーダル遷移から、2つ前の画面に戻る方法
```swift
self.presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil)```
【画像処理】画像処理の基本(なにがすごいのか、なにが難しいのか)

画像処理の基本(なにがすごいのか、なにが難しいのか)
前回の記事→[「サルでもわかる画像処理講座　はじめに」](https://qiita.com/spc_ehara/items/e425b6dcc0398299c40d)

# 画像処理とは
そもそも画像処理とは、デジタル画像から何らかの情報を取り出す(または取得しやすくする)ために行う処理のことで、例えば、インスタグラムなどでよく見るような「人間の眼で美しく映えるようにする」ことや物体検出などで必要とされる「特定の物体をコンピュータに理解(処理)させやすくする」ことなど、様々な目的があります。

前者では、`もっと鮮やかになるような`処理をすることが必要です。

| 1.1 入力画像 | 1.2 処理画像 |
|:------:|:-----:|
| ![Mt.Fuji_org](https://user-images.githubusercontent.com/74283288/98917210-70139200-250f-11eb-9c74-1f1821b4656b.png) 暗い印象| ![Mt.Fuji_edited](https://user-images.githubusercontent.com/74283288/98917202-6ee26500-250f-11eb-8fbe-44d8a0a42ff2.png) 鮮やかな印象|

「1.2 処理画像」は、「1.1 入力画像」に比べるとだいぶ印象が変わると思います。

後者では、その`物体の特徴を強調するような`処理をすることが必要です。(ex. 人を数えたい場合)

| 2.1 入力画像 | 2.2 処理画像 |
|:------:|:------:|
| ![Mt.Fuji_org](https://user-images.githubusercontent.com/74283288/98917210-70139200-250f-11eb-9c74-1f1821b4656b.png) 人がよく見えない| ![bright_Mt.Fuji](https://user-images.githubusercontent.com/74283288/100410844-3c11a280-30b3-11eb-813c-99f6a55a308a.png) 人がよく見える|

「2.1 入力画像」では、よく見えなかった人の姿が、「2.2 処理画像」だとはっきりと見えるようになっていると思います。


さらに、服の色が赤と青の人だけを強調してみます。

| 3.1 入力画像 | 3.2 処理画像 | 3.3 処理画像 |
|:-----:|:-----:|:-----:|
| ![bright_Mt.Fuji](https://user-images.githubusercontent.com/74283288/100410844-3c11a280-30b3-11eb-813c-99f6a55a308a.png) 人がよく見える | ![Mt.Fuji_red](https://user-images.githubusercontent.com/74283288/100410848-3caa3900-30b3-11eb-881e-a9ea8ef761bf.png) 赤い服を着た人 | ![Mt.Fuji_blue](https://user-images.githubusercontent.com/74283288/100410842-3ae07580-30b3-11eb-8775-14082840267a.png) 青い服を着た人 |

少し見づらいですが、それぞれちゃんと取れていることがわかると思います。

ちなみに手前の緑色の草を強調してみると、こんな感じです。

| 3.4 処理画像 |
|:------:|
| ![Mt.Fuji_green](https://user-images.githubusercontent.com/74283288/100410845-3caa3900-30b3-11eb-8d92-16496ab1e561.png) 手前の緑色の草|

このように、目的に応じて様々な画像処理技術を使い分けることで、画像内から文字や物体を検出することができるのです。

# 画像処理のなにがすごいのか
やはり、1番のメリットは「`自動化できること`」です。
「10,000枚の画像内に赤い服を着ている人が何人いるか」を知りたい場合、画像処理でコンピュータが理解できる形に変換して処理することで、人の眼で行うよりも時間とコストが大幅に削減できます。

また、`一定の基準で判断する`ことができるので、人の眼で行うよりも`正確で品質が安定`します。
一定の基準で判断するということは、間違った判断をした時にもしっかりとした理由があるため、改善が素早く行えるということでもあります。

さらに、人間の眼には見えない(見にくい)ものをとらえることができたり、対象物に触れることなく計測することができます。
例えば、上記の「2.2 処理画像」で示したように、逆光で見えないものを可視化して計測することなどができるのです。

これらすべてが、時間とコストの大幅な削減を可能にしています。

# 画像処理のなにが難しいのか
やりたいことを実現するためにどの処理が適しているのか、`アルゴリズム・パラメータを考案・調整`することが最も難しいです。
例えば、上記の「3.2 処理画像」で示したように、赤い服の人のみを強調する場合、太陽の赤や手前にある橋の赤も一緒に取れています。これらの切り分けができないと自動化することはできません。

また、[前回の記事](https://qiita.com/spc_ehara/items/e425b6dcc0398299c40d)で示したように、いつもきれいに硬貨が並んでいたり、はっきりと文字が見えている画像ばかりとは限らないのです。
そのような状況でも、物体や文字を検出できるように処理を考える必要があります。


# さいごに
今回は、画像処理のすごいところ・難しいところを解説しました。
次回は、「そもそも画像とは(JPG,PNG,GIF,BMP)」をテーマに書いていきます。
それでは引き続きよろしくお願いいたします。

目次は以下の記事からご覧になれます。

https://qiita.com/spc_ehara/items/e425b6dcc0398299c40d#%E7%9B%AE%E6%AC%A1
AWS Lambda boto3でWAFのIP setsを更新する

# はじめに
AWS LambdaでWAFのIP setsを更新します。
ランタイムは`python`です。
WAFは`CLOUDFRONT`のものとなるため、AWSリージョンはバージニア北部の`us-east-1`となります。
WAFのIP Setsの更新は、渡したIPアドレスのリストで上書きされるので、登録・更新・削除が同じメソッドとなります。
リスト`ip_adresses`は重複していても問題なく、WAFに登録されます。

**Lambdaのスクリプト**

```python:Lambda
import boto3

waf = boto3.client('wafv2', region_name='us-east-1')

def handler(event, context):

    ip_set_name = 'IP Sets名'
    ip_adresses = ['IPアドレス']

    response = update_ip_addresses(ip_set_name, ip_adresses)

    return response

    def update_ip_addresses(ip_set_name, ip_adresses, scope='CLOUDFRONT'):
        """[指定したIPアドレスでWAFを更新する]

        Args:
            ip_set_name ([str]): [IP sets名]
            ip_adresses ([list]): [IPアドレス]
            scope ([str], optional): [スコープ]. Defaults to CLOUDFRONT.

        Returns:
            [dict]: []
        """

        try:
            # IP setsの更新情報を取得する
            ip_set_info = get_ip_set_info(ip_set_name)
    
            response = waf.update_ip_set(
                Name=ip_set_name,
                Scope=scope,
                Id=ip_set_info['IPSet']['Id'],
                Addresses=ip_adresses,
                LockToken=ip_set_info['LockToken']
            )
        except waf.exceptions.WAFOptimisticLockException:
            update_ip_addresses(ip_set_name, ip_adresses)

        return response

    def get_ip_set_info(ip_set_name, scope='CLOUDFRONT'):
        """[指定したIP setsの詳細情報を取得する]

        Args:
            ip_set_name ([str]): [IP sets名]
            scope ([str], optional): [スコープ]. Defaults to CLOUDFRONT.

        Returns:
            [dict]: [指定したIP setsの詳細情報]
        """

        response = waf.get_ip_set(
            Name=ip_set_name,
            Scope=scope,
            Id=get_filtering_ip_sets()[ip_set_name]['id'] 
        )
        return response

    def get_filtering_ip_sets():
        """[取得したIP setsの情報をフィルタリングする]

        Returns:
            [dict]: [フィルタリングしたIP setsの情報]
        """

        ip_sets_dict= {}
        for ip_set in get_all_ip_sets():
            ip_sets_dict[ip_set['Name']] = dict(
                id=ip_set['Id'],
                lock_token=ip_set['LockToken']
            )
        return ip_sets_dict

    def get_all_ip_sets(scope='CLOUDFRONT', limit=100, next_marker=None):
        """[全てのIP setsの情報を取得する]

        Args:
            scope ([str], optional): [スコープ]. Defaults to CLOUDFRONT.
            limit ([int]): [取得上限値]
            next_marker ([list]): [次の取得マーカー]. Defaults to None.

        Returns:
            [list]: [IP setsの情報]
        """

        all_ip_sets = []

        # 初回実行の場合
        if next_marker is None:
            ret = waf.list_ip_sets(Scope=scope, Limit=limit)
        # 次のデータが存在する場合
        else:
            ret = waf.list_ip_sets(Scope=scope, Limit=limit, NextMarker=next_marker)

        if 'NextMarker' in ret:
            all_ip_sets = ret['IPSets'] + get_all_ip_sets(next_marker=ret['NextMarker'])
        else:
            all_ip_sets = ret['IPSets']

        return all_ip_sets
```
Dockerコマンド　チートシート

## 前準備

```sh
# インストール
brew install --cask docker
# 再インストール
brew reinstall --cask docker

# ポートの使用確認
lsof -i:8080
# LISTENとして使用しているportを確認
lsof -i -P | grep "LISTEN"
# ポートの80にアクセス
curl http://localhost:80
# NginxのConfigファイルを見つける
find / -type d -name nginx | xargs grep -r html

# 使われているポートを殺す
sudo lsof -t -i tcp:8000 | xargs kill -9
```

## イメージ

```sh
# イメージの一覧を表示
docker images
# イメージの取得
docker pull nginx
# イメージの履歴を確認する
docker history nginx
# Dockerfileをビルドしてイメージの作成
docker build -t mycontainer:first .
```

## docker hub

```sh
# イメージ作成
docker build -t <image_name> .
# tagの設定
docker tag <IMAGE_ID> <user_name>/<image_name>:<version>
# hubにpushする
docker push <user_name>/<image_name>:<version>
```


## コンテナ

```sh
# 作動中のコンテナ一覧表示
docker ps
# 作動中のコンテナをリアルタイムで表示
watch "docker ps"
# ヘッダを表示しない。よりスッキリした画面になる
watch -t "docker ps"
# 時間間隔指定
watch -n 1 "docker ps" 
# 停止中のコンテナもすべて表示
docker ps --all
docker ps -a
# コンテナの起動
# docker run [オプション] イメージ[:タグ|@ダイジェスト値] [コマンド] [引数...]
# -p {コンテナのポート:ホストのポート} # コンテナのポートをホスト側に公開する
docker run --name {name} -p 80:80 {REPOSITORY/TAG}
# コンテナをバックグラウンドで起動
## バックグラウンドで起動する(Detachする)ので、inputができない、outputが表示されなくなる。
docker run --name nginx -p 80:80 --detach nginx
docker run --name nginx -p 80:80 -d nginx
# コンテナを起動させ続ける
docker run --name {name} -it -p 80:80 -d {REPOSITORY/TAG}
# 作動中のコンテナを停止する
docker stop CONTAINTER_ID
# 停止中のコンテナを再起動する
docker start CONTAINTER_ID
# コンテナのログを表示する
docker logs CONTAINER_ID
# 作動中のコンテナの中にシェルで入る
## - exec
##     - Run a command in a running container
## - exec -i (--interactive)
##     - Keep STDIN open even if not attached
## - exec -t (--tty)
##     - Allocate a pseudo-TTY
## execution 実行、 interactive 対話形式、 tty テレタイプライター => terminalのこと
docker exec -it CONTAINER_ID bash
# コンテナにホストからファイルをコピー
docker run -d --volume $(pwd):/home nginx
# 公式イメージをタグ指定して、build
docker pull nginx:1.18-alpine 
# runして入る
docker run -it <コンテナ名(IDじゃだめ)> sh

# しばらくsudo
sudo -i
```

## 消去系

```sh
# Dockerが使用するシステム容量の確認
docker system df
# Build cahcheの消去
docker builder prune
# イメージの消去
docker rmi IMAGE_ID
# 使っていないイメージ,ボリューム,ネットワーク等すべてを消去する
docker system prune -a --volumes
# 止まったコンテナを消去
dokcer rm CONTAINER_ID
# 停止したコンテナを一括消去
docker container prune
# すべてのコンテナを停止
docker stop $(docker ps -aq)
# すべてのコンテナを消去
docker rm $(docker ps -aq)
```

# docker-compose

## docker-composeとdockerコマンドの対応

```sh
docker run --name nginx \
    --env="env_key=env_value" \
    -p 80:80 \
    --volume $(pwd):/usr/share/nginx/html \
    nginx
```

```docker-compose.yml
version: "3.7"
services:
  nginx:
    image: nginx:latest
    container_name: docker_compose_nginx
    environment:
      - env_key=env_value
    ports:
      - "80:80"
    volumes:
      - ${PWD}:/usr/share/nginx/html:ro
```

```sh
# 起動
docker-compose --file docker-compose.yaml up
# 停止
docker-compose -f docker-compose.yaml down
# ログを監視 (followオプションでリアルタイム監視ができるようになります。)
docker-compose -f docker-compose.yaml logs --follow
# ログを見る
docker-compose logs コンテナ名
# Composeで立ち上げたコンテナにアクセスする。
docker-compose exec postgres bash
```

### 一部のコンテナだけ新しくする

```sh
docker-compose rm -fs backend
docker rmi development_backend
docker-compose up backend
```
vue.js 小数点が省略されたが、表示させたい！(例えば、10->10.0で表示したい)

jsは整数の場合、小数が自動的に省略されたことがついに気づきました。 

例えば、10ではなく、10.0で画面で表示したい場合、
postmanでPrettyだと、10で表示しています。「あれ？」と思って、Rawで確認すると、10.0になっています。

vue.jsでどうやって10.0で表示できるの？
色々調べて、下記のコードでできた！

```
// 負でない整数場合、小数一桁「0]を補足する
var getFloatStr = function (num) {
        if (!/\./.test(num)) {
          num += '.0'
        }
        num = num.match(/\d+\.\d{1}/)[0]
        // console.log(num)
        return num
      }
```

![スクリーンショット 2020-11-27 13.27.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181748/ecbc67e1-9489-6734-554a-3ed918d1430a.png)


コードの全文

```
<template>
    <b-card header="結果" bg-variant="light" class="text-center" style="margin-bottom:10px;">
       <b-card-text>
          <div>
          <input style="display:none" type="text" v-model="childrenMessage">
            <element-table
              ref="table"
              :data="data"
              :columns="columns"
              />
            </div>
      </b-card-text>
    </b-card>
</template>
<script>

export default {
  props: ['message'],
  data () {
    return {
      childrenMessage: '',
      columns: [
        [
          {
            title: '順位',
            field: 'ranking'
          },
          {
            title: '点数',
            field: 'score'
          },
          {
            title: '名前',
            field: 'name'
          },
          {
            title: 'メモ',
            field: 'memo'
          }
        ]
      ],
      data: []
    }
  },
  created () {
    this.childrenMessage = this.message
  },
  watch: {
    message (val) {
      const result = this.message

      const arrResult = []
      const objResult = {}

      // 負でない整数場合、小数一桁「0]を補足する
      var getFloatStr = function (num) {
        if (!/\./.test(num)) {
          num += '.0'
        }
        num = num.match(/\d+\.\d{1}/)[0]
        // console.log(num)
        return num
      }
      for (var i = 0; i < result.length; i++) {
        objResult['ranking'] = result[i]['ranking']
        objResult['score'] = getFloatStr(JSON.stringify(result['score']))
        objResult['name'] = result[i]['name']
        objResult['memo'] = result[i]['memo']
        arrResult.push(objResult)
      }
      this.data = arrResult
    }
  }
}
</script>
```

参考先：
1、[js 输入int类型数字后自动在后面加.00，输入double型保留小数点后两位](https://www.cnblogs.com/whtz/p/6206628.html)
Laravelでapiを叩いたときにjsonが返ってこない問題

確認時のLaravelバージョンは7.26.1

# apiを叩いたときにjsonが返ってこない問題

結論から言うとapiを叩く際に下記ヘッダーを付与しなければならない

```
Accept: application/json
or
X-Requested-With: XMLHttpRequest
```

個人的には`X-Requested-With: XMLHttpRequest`で良いかと思います。view側でaxios使用時に使われているので

resources/js/bootstrap.js

```js

window.axios = require('axios');

window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
```

## 原因調べてみた

ソースを追っていくとHandler::expectsJsonがfalseになってしまうのが原因

```
1. app/Exceptions/Handler::render
2. vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler::render
3. vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler::expectsJson
```

Handler::expectsJsonの実装を見るとこんな感じ

```php
    public function expectsJson()
    {
        return ($this->ajax() && ! $this->pjax() && $this->acceptsAnyContentType()) || $this->wantsJson();
    }
```

各メソッドを引っ張ってくるとこんな感じ

```php

    public function ajax()
    {
        return $this->isXmlHttpRequest();
    }

    public function isXmlHttpRequest()
    {
        return 'XMLHttpRequest' == $this->headers->get('X-Requested-With');
    }

    public function pjax()
    {
        return $this->headers->get('X-PJAX') == true;
    }

    public function acceptsAnyContentType()
    {
        $acceptable = $this->getAcceptableContentTypes();

        return count($acceptable) === 0 || (
            isset($acceptable[0]) && ($acceptable[0] === '*/*' || $acceptable[0] === '*')
        );
    }

    public function getAcceptableContentTypes()
    {
        if (null !== $this->acceptableContentTypes) {
            return $this->acceptableContentTypes;
        }

        return $this->acceptableContentTypes = array_keys(AcceptHeader::fromString($this->headers->get('Accept'))->all());
    }

    public function wantsJson()
    {
        $acceptable = $this->getAcceptableContentTypes();

        return isset($acceptable[0]) && Str::contains($acceptable[0], ['/json', '+json']);
    }
```

これ外部のapiクライアント使った時のハマりポイントですね
公式ドキュメントに乗っけて欲しい。。。
【Laravel】validationのエラーメッセージ「The given data was invalid.」をカスタマイズする

確認バージョンは Laravel 7.26.1

FormRequestのバリデーションを追って見るとこんな感じ

```
1. config/app.phpのproviders
2. Illuminate\Foundation\Providers\FoundationServiceProvider::class
3. vendor/laravel/framework/src/Illuminate/Foundation/Providers/FormRequestServiceProvider::boot
4. vendor/laravel/framework/src/Illuminate/Validation/ValidatesWhenResolvedTrait::validateResolved
5. vendor/laravel/framework/src/Illuminate/Validation/ValidatesWhenResolvedTrait::failedValidation
6. vendor/laravel/framework/src/Illuminate/Validation/ValidationException::__construct
```

vendor/laravel/framework/src/Illuminate/Validation/ValidationException::__construct
でexceptionのメッセージを`The given data was invalid.`でハードコーディングしているのが問題である

なので`app/Exceptions/Handler.php`をカスタマイズする。
Handlerは`Illuminate\Foundation\Exceptions\Handler`を継承しているので、そのソースを参考に下記メソッドをオーバーライド

```php
    /**
     * Convert a validation exception into a JSON response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Illuminate\Validation\ValidationException  $exception
     * @return \Illuminate\Http\JsonResponse
     */
    protected function invalidJson($request, ValidationException $exception)
    {
        return response()->json([
            'message' => $exception->getMessage() === 'The given data was invalid.' ? '指定されたデータは無効でした。' : $exception->getMessage(),
            'errors' => $exception->errors(),
        ], $exception->status);
    }
```

うーん…ハードコーディングしてる方が悪いと思う。
【Laravel】Eloquentのhasは1階層と2階層両方書く必要はない

確認バージョンは Laravel 7.26.1

例えばこんなモデルがあったとすると

```php
class User extends Authenticatable
{
    /**
     * Relations
     */
    public function posts()
    {
        return $this->hasMany(Post::class);
    }

    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
}
```

```php
class Post extends Model
{
    use SoftDeletes;

    /**
     * Relations
     */
    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
}
```

```php
class Comment extends Model
{
    const UPDATED_AT = null;

    /**
     * Relations
     */
    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function post()
    {
        return $this->belongsTo(Post::class);
    }
}

```

#### 一階層のhas

```php
    User::has('posts')->get();
```

```sql
select * from users
where exists (
    select * from posts
    where users.id = posts.user_id
    and posts.deleted_at is null
)
```

#### 二階層のhas

```php
    User::has('posts.comments')->get();
```

```sql
select * from users
where exists (
    select * from posts
    where users.id = posts.user_id
    and exists (
        select * from comments
        where posts.id = comments.post_id
    )
    and posts.deleted_at is null
)
```

#### 一階層＆二階層のhas

```php
    User::has('posts')
        ->has('posts.comments')
        ->get();
```

```sql
select * from users
where exists (
    select * from posts
    where users.id = posts.user_id
    and posts.deleted_at is null
)
and exists (
    select * from posts
    where users.id = posts.user_id
    and exists (
        select * from comments
        where posts.id = comments.post_id
    )
    and posts.deleted_at is null
)
```

**上記の通り、一階層と二階層両方書く必要はないです！**
jQueryを使ってスクーロル時にフワッと文字が浮き上がって出るやつ

## はじめに
今回はタイトルにある通りスクロール時にフワッと要素が浮き上がってくる機能を実装したので備忘録として記録していきます。
今回はjQueryを使っての実装になるのでそちらの準備をしてから実装に入って下さい
私自信プログラミング初心者なので間違いなどあればご指摘の程よろしくお願いします！


##ステップ１ フワッとさせたい要素を作る
```html
  <div class="container">
  </div>
  
  <div class="container2">
    <h1>フワッと現れる</h1>
  </div>
```

```css
.container {
  height: 100vh;
  width: 100%;
  background-color: aquamarine;
}

.container2 {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100vh;
  width: 100%;
  background-color: rgb(147, 147, 197);
}
```

こちらはなんの変哲もないhtmlとcssです。
h１タグの部分をスクロールと共に出現するように実装していきます！

##ステップ２　JavaScriptの記述
基本的にスクロールに応じてアニメーションを付けるためのJsの流れは
１、ブラウザの表示できる領域の高さを取得
２、スクロール位置を取得
３、アニメーションをさせたい要素のY軸（縦）の位置を取得
４、アニメーションさせる要素かどうかを判断する
５、アニメーションをさせる要素だった場合、クラス.fadeInを追加

これらをコードにすると

```javascript
$(function () {
  $(window).scroll(function () {
      const wHeight = $(window).height();
      const scrollPosition = $(window).scrollTop();
      $('.scroll').each(function () {
          const targetPosition = $(this).offset().top;
          if(scrollPosition > targetPosition - wHeight + 60) {
              $(this).addClass("fadeIn");
          }
      });
  });
});
```

まず1、２行目でスクロール時のアクションを定義します。
3行目でブラウザ表示領域の高さをconst wHeightに代入しています。
4行目でスクロール位置の高さをscrollPositionに代入しています。
5行目でクラスscrollが付与されてる要素を繰り返し処理を行っています。
6行目でアニメーションを行いたい要素の高さを取得しています。
7行目でif文でスクロール位置 > 対象となる要素の縦位置 – 表示領域の高さ + 60を定義
ここで+60などを指定しないと画面の下部でアニメーションが行われていて確認が難しくなるためです。
なのでここの値はお好みの値を指定して下さい。
8行目で条件式を満たした場合クラスfeadInを追加してます。



##ステップ３ cssでアニメーションを定義する

```css
/*1.フェードインアニメーションの指定*/
.scroll {opacity: 0;} /*一瞬表示されるのを防ぐ*/
.fadeIn {
    animation-name: fadeIn;
    animation-duration: 5s;
    animation-fill-mode: forwards;
}
@keyframes fadeIn {
    0% {
        opacity: 0;         
    }
    100% {
    opacity: 1;
    transform: translate(0);
    }
}
```
cssで実際にアニメーションを作っていきます。
まずfeadInクラスの説明をします
こちらでアニメーションの名前やかかる時間などの設定をしていきます！
animation-nameでアニメーションの名前を定義しています。
animation-duration: 5s;でアニメーションにかかる時間を設定しています。
animation-fill-mode: forwards;でアニメーション後そのままの状態を維持する記述です。

次に@keyframesでアニメーションの挙動を設定していきます
@keyframesのあとは上で設定したアニメーションの名前を記述して下さい。
実際にこの部分の記述でどのように要素を変化させるかを設定していきます。
今回は0%の時と100%の時の要素の状態を定義していますが、50%や75%など細かく設定する事ができるのでお好みで設定してみて下さい。

これで一通りの準備ができましたので挙動を確認してみましょう！

https://gyazo.com/c8e8aa5f59ec2226d79fcb479c9ed6f6

##最後に
僕自身フロント実装は苦手なのですが実際アニメーションを作ってみるととても楽しいですし、モダンなサイト作成には必須な技術かと思うので、今後も少しずつ扱えるようにしたいと思いました！！
まだまだプログラミング初心者のためご指摘などあればよろしくお願いします！
Microsoft365を導入する際に気を付けること

自社でテレワーク化を取り入れる為、Microsoft365を導入することになりました。
今回は、Microsoft365のOneDriveを導入する際に発生したトラブルを記録しておきます。

#初めにMicrosoft365とは
Microsoft365とは、Microsoft社が提供するクラウドシステムを含めたサブスクリプションサービスです。
ほぼ一緒のサービスにOffice365がありますが、こちらの違いについては下記の記事に詳しく記載しておりましたので気になる人はこちらを確認してください。

[Office 365とMicrosoft 365の違い](https://licensecounter.jp/microsoft365/introduction/difference/)

また、Microsoft365には**企業用アカウント**と**個人用アカウント**が存在しています。
二つの違いはプランによって切り替わり、企業用はTeamsやSheraPointなどの社内のコミュニケーションを円滑にするサービスも提供されています。

この企業アカウントと個人アカウントは手順によっては、**メールアドレスが競合できる**為、今回のトラブルが発生しました。

##企業アカウントと個人アカウント
企業がMicrosoft365に契約し、ドメインを登録すると個人アカウントを作成しても
そのドメインが会社のドメインの場合、企業アカウントに振り分けられます。
※その際アカウントは、フリーライセンスみたいのが付くので、
　後ほど管理者によって有償ライセンスを割当てる必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718459/32b10c63-1946-c90c-0c38-03a2aef64cae.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718459/48135c1a-e6af-b0a3-fb61-130b0ca2c3f2.png)

しかし、個人アカウントを先に作成し、後から企業アカウントを作成すると、
個人と企業の両方にアカウントを作成されてしまします。
その為、個人アカウントにTeamsを招待されていても、企業アカウントが作成されたことによって2つのアカウントが存在しTeamsが使用できなくなったり、システム不良が生じてしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718459/70b6c310-84b6-0149-8a6a-eed24f10929f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718459/1c4519cb-201d-b4b4-a296-3bab45b2015e.png)

自社では、個人アカウントを作っていた社員がおり、取引先とTeamsができないと連絡を受け本件のトラブルがわかりました。

##対応策
このまま2つのアカウントを存在させることは、Microsoft社も推奨していない為、以下の2つの方法で回避する必要があります。

###・アカウントを消す
　一つ目は個人アカウントを消すことです。
　これによりMicrosoftのシステム内にはアカウントが人しかなくなる為、システム不良は解消されます。
　しかし、アカウントを消すと以下のデータやサービスも消えます。。。
　　・保存されている OneDrive ファイル
　　・Xbox Live のデータとゲーマータグ
　　・Skype ID と連絡先
　　・NuGet.org アカウント
　　・Outlook.com、Hotmail、Live、およびMSN のメール アカウント
　　・口座残高、使用されていない特典ポイント、Microsoft サーティフィケーション (成功したテストおよび関連付けられたトランスクリプトを含む)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718459/256f95c9-5e15-917f-cb31-df7b168fa51f.png)
削除の手順については、下記のMicrosoftアカウントの使用を停止する方法を確認してください。
[Microsoft アカウントの使用を停止する方法](https://support.microsoft.com/ja-jp/account-billing/microsoft-%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%BF%E7%94%A8%E3%82%92%E5%81%9C%E6%AD%A2%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95-c1b2d13f-4de6-6e1b-4a31-d9d668849979)

###・メールアドレスを変更する
Microsoftのアカウント認識はメールアドレスで認識しているため、メールアドレスを変更することでも対応が可能です。
メールアドレスを変更すれば、アカウント削除で失うデータなどがない為こちらがおすすめです。
但し、変更メールアドレスが企業ドメインだと変更ができないので、ご注意ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718459/f64ff27b-8812-4c51-851a-12954e5b1450.png)
Railsの基本を振り返ってみる

今更ながら、Railsの基本をもう一度振り返っておさらいしてみる

##Railsとは
Rubyで作られたフレームワークのこと
「MVC」というアーキテクチャパターンを採用している

###アーキテクチャパターンとは
一言でいうならば、「ソフトウェアアーキテクチャで発生する問題の解決策」
を指す。似た表現である「アーキテクチャ `スタイル` 」も同意と考えてよさそう

###「MVC」とは
アプリケーションを以下の3つで考えること
`M Model`…主にシステムの処理を行う場所
`V View`…画面の描画を担当する場所
`C Controller`…ModelとView間の間にたち、データの受け渡しを行う場所

以下で更に詳しくみていきます。

##Modelとは
主に、DBとのやりとりを行ってデータを取得したり格納したりします。
役割としては、`ビジネスロジック`を担う
例)給与計算など

##Viewとは
アプリケーションの見た目を担う
Modelを介して、取得したデータを受け渡し用の変数等に格納して
動的にテンプレートで表示する
ロジック等も記述することができるが、うまくModelとControllerを活用する

##Cotrollerとは
ユーザーのリクエストを受けて、モデルに適切な動作を要求する
リクエストはURLとして届くため、届いたURLを分析し適切なアクションへと
導くのが役目
さらに、Webに関する一般的な仕事を受け持つという側面がある
例)
- セッション管理URLの解釈
- HTTPリクエスト
- レスポンスの処理
- クッキーの管理などを担当 

##参考記事
MVC
https://kitsune.blog/rails-summary
https://www.atmarkit.co.jp/ait/articles/1102/23/news109.html

アーキテクチャパターン
https://qiita.com/cocoa-maemae/items/f276fe14b9700fdae7bc