OmniAICreator/Qiita-1.07M huggingface dataset:
子モデルで親モデルの関連データがバリデーションができない問題

作ろうとした機能は、タグに応じて投稿フォームの種類を切り替えるやつ。

モデルの関係はこんな感じ(子モデルの名前は適当です)
![スクリーンショット 2021-02-14 15.36.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1003839/d023c6e4-107f-515c-5830-bf9803f5a26d.png)


タグに応じて子モデルが変わり、投稿フォームも変わるようになっています。
しかしこのモデル設計だと、タグの種類によってバリデーションが変えられない問題が生じました。

例えば、子モデルでバリデーションをする場合

```ruby:One.rb
class One < ApplicationRecord
    belongs_to :post

    with_options if: :one? do |one|
        one.validates :url, presence: true
    end

　  def one?
        tag_id == 1
    end
end
```
このようなエラーがでます。

```ruby:
undefined local variable or method `tag_id' 
```

tag_idが見つからないと怒られてしまいました。
いろいろ調べたところ、上のコードが機能するようにするためには、子モデルが親モデルを継承する必要があるそうです。

しかし、機能追加・機能変更のための継承はよくないとのこと。
参考：https://qiita.com/tonluqclml/items/c0110098722763caa556

そこで、Postモデルを消す形でモデルを修正しました。
Postモデルの子モデルは全て並列の関係になっていたので、モデル設計的にも正しいと思います。
![スクリーンショット 2021-02-14 16.35.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1003839/e819e080-8e7a-62f4-0ac7-32bb0e1673ed.png)

##モデルを書き換えない方法
とはいえ、モデルを書き換えるのは大変なので、緊急的に動作するコードも書いてみました。
結論から言うとカスタムバリデーションを用いると実装できます。
ただ、バリデーションが増えると重複コードが増えて汚くなってしまいます。

```ruby:app/validtors/three_valiator.rb
class ThreeValidator < ActiveModel::EachValidator
    def validate(record)      
    #先生の紹介のバリデーション
      if record.tag_id == 4
        unless record.teacher.name.present?
            record.errors[:base] << "名前を入力してください"
        end

        unless record.teacher.job.present?
            record.errors[:base] << "職業を入力してください"
        end
      end
    end
  end
```

##
もっと良い方法とかあれば、教えてください。

##参考文献
https://railsguides.jp/active_record_validations.html
https://qiita.com/tonluqclml/items/c0110098722763caa556
https://qiita.com/kikunantoka/items/61ab74c7f50dedace211
TeXの使い方メモ

Ubuntu 20.04でTeXからpdfを作るためのメモ。

# 使い方
## TeXをインストール
```bash 
sudo apt install texlive-lang-cjk texlive-fonts-recommended \
  texlive-latex-recommended \ # ctable.sty
  texlive-latex-extra \ # mathdots.sty
  texlive-science # algorithm2e.sty
```

## .tex から .pdf を生成
### lualatex
TikZを使うならこれを使う必要がある。pdfが直接生成されて便利。

```bash
lualatex foo.tex
```

### platex
```bash 
# foo.dvi を作成
platex foo.tex

# foo.pdf を作成
dvipdfmx foo.dvi
```

# 文法
## 改行
`\\` と書く。

## インデント
`\indent` と書く。

## アクセント
通常モードでは `\'a` や <code>\\\`a</code>、mathモードでは `\acute{a}` や `\grave{a}` を使う。

## インライン数式
`$数式$` と書く。

## ブロック数式
```text 
\begin{align*}
  x
  &= y \\
  &= z \tag{1}
\end{align*}
```
という感じにすると=が揃えられ、一部にのみタグがつけられる。

## 分数
```tex
\frac{x}{y}
```

## δx
```tex
\partial x
```

## 太字
```tex
\mathbf{x}
```

## 添字
```tex
x_i
\mathbf{x}_i
```

## log
```tex
\log n
\log_x y
```

## 点リスト
```tex
\begin{itemize}
  \item foo bar
  \item baz
\end{itemize}
```

## 数字リスト

```tex
\begin{enumerate}
  \item foo bar
  \item baz
\end{enumerate}
```

## オーマトン

TiKZを使う。 https://tex.stackexchange.com/questions/20784/which-package-can-be-used-to-draw-automata

**LuaTeXじゃないと動かない。** `lualatex foo.tex` でコンパイルする。

```tex
\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{automata,positioning}
\begin{document}
\begin{tikzpicture}[shorten >=1pt,node distance=2cm,on grid,auto] 
   \node[state,initial] (q_0)   {$q_0$}; 
   \node[state] (q_1) [above right=of q_0] {$q_1$}; 
   \node[state] (q_2) [below right=of q_0] {$q_2$}; 
   \node[state,accepting](q_3) [below right=of q_1] {$q_3$};
    \path[->] 
    (q_0) edge  node {0} (q_1)
          edge  node [swap] {1} (q_2)
    (q_1) edge  node  {1} (q_3)
          edge [loop above] node {0} ()
    (q_2) edge  node [swap] {0} (q_3) 
          edge [loop below] node {1} ();
\end{tikzpicture}
\end{document}
```

## リファレンス
http://www27.cs.kobe-u.ac.jp/~masa-n/misc/cmc/j-kiso2001/iabasic/jlshort/node34.html

http://www.ic.daito.ac.jp/~mizutani/tex/special_characters.html

| 記号 | TeX |
|:----|:----|
| ≤ | \leq |
| ≥ | \geq |
| ∞ | \infty |
wemosでspiffs その2

#概要

wemos d1 r1でspiffsやってみた。
バイナリー書いてみた。

#サンプルコード

```
#include <Arduino.h>
#include <FS.h>

uint8_t buf[100];

void setup() {
	char i;
	Serial.begin(115200);
	for (i = 0; i < 100; i++)
	{
		buf[i] = i;
	}
	bool res = SPIFFS.begin();
	if (!res)
	{
		Serial.printf("SPIFFS error \n");
		while (true) {};
	}
	Dir dir = SPIFFS.openDir("/");
	while (dir.next())
	{
		String fn,
			fs;
		fn = dir.fileName();
		fn.remove(0, 1);
		fs = String(dir.fileSize());
		Serial.printf("%s\t%s\n", fn.c_str(), fs.c_str());
	}
	String s = "/ss.ore";
	File fd = SPIFFS.open(s, "w");
	if (!fd)
	{
		Serial.println("open error1");
		return;
	}
	fd.write(buf, 100);
	fd.close();
	Serial.println("ok0");
	File fileToRead = SPIFFS.open(s, "r");
	if (!fileToRead)
	{
		Serial.println("Failed to open file for reading");
		return;
	}
	fileToRead.readBytes((char *) buf, 100);
	fileToRead.close();
	Serial.println("ok1");
	for (i = 0; i < 100; i++)
	{
		Serial.println(buf[i], HEX);
	}
}
void loop() {
	delay(10);
}



```

以上。
微分方程式 - 変数分離法解法

[戻る](/items/9018de6d81100fc7e47d#変数分離形)

# 解法

```math
\begin{array}{l}
\frac{dy}{dx} = f(x)g(y) \\
\\
g(y) \ne 0 (g(y) が恒等的に0でないとする)のとき、両辺を g(y) で割ると \\
\frac{1}{g(y)} \frac{dy}{dx} = f(x) \\
\\
積分すると、 \int{\frac{1}{g(y)} \frac{dy}{dx}dx} = \int{f(x)dx}  \\
\\
置換積分から、 \int{\frac{1}{g(y)} dy} = \int{f(x)dx} \\
\Rightarrow yとxの関係式を求める \\
\end{array}
```

## 置換積分

```math
\begin{array}{l}
\int{ f(x) }dx = \int{ f(g(t)) \frac{dx}{dt} }dt \\
\\
ex)　\int{\sqrt{x+1}(x + 2)dx} \\
\\
t = \sqrt{x+1} として両辺２乗する。 \Rightarrow　t^2 = x + 1　\\
xで整理して、 x = t^2 - 1 \\
両辺をtで微分すると、\frac{dx}{dt} = 2t \\
\\
\therefore \int{\sqrt{x+1}(x + 2)dx} = \int{t((t^2 + 1) + 1)2tdt} = \int{t(t^2 + 2)2tdt} \\
\end{array}
```

# 例題

- ex1)　$ y' = 2xy, y(0) = 1 $

```math
\begin{array}{l}
\frac{dy}{dx} = 2xy　\cdots ① \\
\\
y = 0 は①を満たす解である。 \\
y \ne 0 のとき両辺yで割って、 \frac{1}{y}\frac{dy}{dx} = 2x \\
\int{\frac{1}{y}}dy = \int{2x}dx \\
log|y| = x^2 + C \\
|y| = e^{x^2 + C} \\
y = \pm e^C e^{x^2} \\
y = C' e^{x^2} (C' = \pm e^C) \cdots ② \\
\\
y = 0 は②でC' = 0 とすれば表せるので、改めてCとおけば求める一般解は、\\
y = Ce^{x^2} (Cは任意の定数)
\end{array}
```

- ex2)　$ y' = 1 - y^2 $

```math
\begin{array}{l}
\frac{dy}{dx} = (1-y)(1+y) \cdots ① \\
\\
y = 1，-1 は①を満たす解である。 \\
y \ne \pm 1 のとき\\
\int{\frac{1}{(1 - y)(1 + y)}dy} = \int{dx} \\
\\
\int{\frac{1}{(1-y)(1+y)}dx} \\
= \int{ \frac{1}{2} \left( \frac{1}{1 + y} + \frac{1}{1 - y} \right) dy} \\
= \frac{1}{2} \int{ \left( \frac{1}{1 + y} + \frac{1}{1 - y} \right) dy} \\
= \frac{1}{2} \left( \int{ \frac{1}{1 + y} dy} + \int{ \frac{1}{1 - y} dy} \right) \\
= \frac{1}{2} \left( log \left| 1+y \right| - log \left| 1-y \right| \right) \\
= \frac{1}{2} \left( log \left| \frac{1+y}{1-y} \right| \right) \\
\\
\therefore \frac{1}{2} \left( log \left| \frac{(1 - y)}{(1 + y)} \right| \right) = x + C \\
\\
※ \int { \frac{1}{1-x} dx} について。置換積分を使う \\
\\
1 - x = t として両辺を微分すると、- \frac{dx}{dt} = 1　\therefore \frac{dx}{dt} = -1 \\
\int { \frac{1}{1-x} dx} = \int{ \frac{1}{t} \frac{dx}{dt} dt} = \int{ \frac{1}{t} (-1) dt} = -\int{ \frac{1}{t} dt} = -log \left| t \right| = -log \left| 1-x \right| \\
\end{array}
```
Nest.jsのコンポーネント概要 ~~ コントローラ・プロバイダ編 ~~

## Nest.js概要
Node.jsのフレームワーク
typescriptで構成され、Httpサーバとして[Express](https://expressjs.com/)を使用している。
オプションで[Fastify](https://github.com/fastify/fastify)も使用可能。
Babelを使用することで、JavaScriptでも書けるようになる(らしい)

## 記事の目的
Nest.jsを使う必要が出てきたため、フレームワーク自体と各コンポーネントにおける思想の確認。
使ってみると便利なので、数少ない日本語ドキュメントの助けになれば幸いです。

## 主なコンポーネント一覧
- Controllers
- Providers
- Modules
- Middleware
- Exception filters
- Pipes
- Guards
- Interceptors
- Custom decorators

今回は、コントローラ(Controllers)とプロバイダ(Providers)に絞って記載します。

## ファイル構造(イメージ)
```
 cats--- cats.controller.ts
     |
     |-- cats.service.ts
     |
     |-- cats.module.ts
     |
     |-- interface -- cats.interface.ts
                    
```

## コントローラ(Controllers)
### 概要
***
`コントローラは受け取ったリクエストとクライアントへレスポンスを返すことに責任を持つ。`
Controllersより抜粋。
***


- アプリケーションへの特定のリクエストを受け取ることを目的とするプレゼンテーション層のコンポーネント。
- 各コントローラは一つ以上のルートを持つ。
- ルーティングメカニズムによってどのコントローラにリクエストが受け渡されるかが決まる。
- ファイル名は`オブジェクト名.controllers.ts`
- nest-cliの `nest g co コントローラ名` で生成できる

### サンプルコード
```cats.controller.ts
import {Controller, Get} from '@nestjs/common'
import {CatsService} from './cats.service'

// デコレータで最上位階層を指定する。
@Controller('cats')
export class VatsController{
  // 次項目のプロバイダで解説。
  constructor(private catsService: CatsService){}

  // http://example.com/cats に来たgetがルーティングされる。
  @Get()
  findAll(): string {
     return 'このアクションはこの文字列を返す。'
  }

  // http://example.com/cats/create に来たpostがルーティングされる。
  @Post('create')
  // リクエストボディは@Bodyで取得可能
  async create(@Body() body){
    // サービス(Services)については次項目に記載。
    // Dtoを作ればもっと簡略化が可能。(今後記事を書くかもしれません。)
    return this.catsService.create({
       name: body.name,
       age: body.age,
       breed: body.breed
    })
  }
}
```

### イメージ図
![Controllers_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/727542/bf11dcab-a0aa-a16b-0f4b-a84d5c4f93a1.png)
公式ドキュメント`Controllers`の記事より

## プロバイダ(Providers)
### 概要
- Nestの基本的な概念で、`Injectable()`でデコレートされたもの。
- サービス、リポジトリ、ファクトリ、ヘルパーなどがプロバイダとして扱われる。
- プロバイダの特徴として、依存関係を注入(Inject)できることにある。
　
### サンプルコード(Service)

```cats.service.ts
import { Injectable } from '@nestjs/common'
import { Cat } from './interfaces/cat.interface'

@Injectable()
export class CatsService{
  // Catインターフェイスの配列を初期化
  private readonly cats: Cat[] = []

  create(cat: Cat){
    this.cats.push(cat)
  }
    
  findAll(): Cat[] {
     return this.cats
  }
}
```

```interfaces/cat.interface.ts
  
  export interface Cat {
     name: string;
     age: number;
     breed: string;
  }
```

```cats.module.ts
import { Module } from '@nestjs/common'
import { CatsController } from './cats.controller'
import { CatsService } from './cats.service'

@Module({
  imports:[],
  controllers: [CatsController],
  providers: [CatsService],
  exports: []
})
```

### 解説(ざっくり)
```ts
  constructor(private catsService: CatsService){}
```
コントローラのサンプルコードの上記部分でコントローラにサービスクラスを注入している。
また、そこのリレーションをつなげるためには、Moduleファイルにリレーションを登録しておく必要がある。

### イメージ図
![Components_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/727542/e9956a9a-d248-ae62-7ee1-47696da80512.png)
公式ドキュメント`Providers`の記事より

## 参考
- [Nest公式ドキュメント Introduction](https://docs.nestjs.com/)
dockernginxで443も使えるようにする

## オレオレ証明書
```
openssl req -x509 -nodes -new -keyout server.key -out server.crt -days 365
```

## nginx.conf

```nginx.conf
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80 ;
        listen [::]:80;
        server_name _
    }

    server {
       listen 443;
        listen  [::]:443;
        server_name _;

        ssl on;
        ssl_certificate /etc/nginx/server.crt;
        ssl_certificate_key /etc/nginx/server.key;

        location / {
            proxy_pass https://vamdemicsystem.black/;
        }
    }

}
```

## Dockerfile

```
FROM nginx


# RUN apk add --no-cache openssl

# ドキュメントルート
COPY nginx.conf /etc/nginx/nginx.conf
# COPY default.conf /etc/nginx/conf.d/default.conf

# SSL証明書
COPY server.crt /etc/nginx/server.crt
COPY server.key /etc/nginx/server.key

EXPOSE 80 443
```

## 起動
```
docker build -t nginx443 .
docker run --name nginx -d -p 80:80 -p 443:443 nginx443:latest
```
【備忘録】zshインストール&最強の補完機能を装備

#zsh めちゃくちゃ優秀らしい
＊まだ何が優秀なのかはわかってない
とにかく、早速インストールしてみます。

##環境
MacBook Pro (13-inch, 2017)
macOS Big Sur (Version11.1)
Homebrewインストール済み：[インストール方法 @zaburoさんの記事を拝借
](https://qiita.com/zaburo/items/29fe23c1ceb6056109fd)

##インストール
ターミナルに早速打ち込む
zshは元からMacにはいってるけど、一旦アップデートしてやります
```zsh-completions```がzshコマンドを補完してくれるので併せてやります。

```
$ brew install zsh
$ brew install zsh-completions
```

##brewでzshを登録
インストールしたzshをviコマンドで登録します。

```
$ vi /etc/shells

# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/zsh　#これを追記します
```

####「E45: ‘readonly’ option is set (add ! to override)」の対処
Vi編集時にファイルが読取専用になっていることがあるみたいで、
ちょっと困ったので簡単に対応策を書いておきます。

```
１：w !sudo tee %
１：Press ENTER or type command to continue　#何も入力せず次のコマンドで強制終了
１：q!
```

これで上書きされたので、強制終了したら次行ってOKです


###デフォルト設定を変更
パスワード入力求められたら、入力してつぎへ。
プロンプトが表示されたらこの設定は完了です。

```
chsh -s /usr/local/bin/zsh
```

###.zshrcに最強の補完機能を追加！
あらゆるコマンドオプションを保管してくれる最強の矛を装備
コマンド、オプションを無駄に覚えたり、Help参照したりする手間が一切省ける・・・とのことで早速実行

```~/.zshrc
autoload -U compinit
compinit
```
何をできるか詳しくはmollifierさんの[こちらの記事](https://mollifier.hatenablog.com/entry/20110207/p1)をご参照ください

####＊.zshrcの表示 もしくは作成
備考として書いておきます。
ホームディレクトリ下にあるフォルダ```zshrc```を開きます。

```~/.zshrc

```

私の場合はファイルがなかったので、作りました。

```terminal
$ touch ~/.zshrc
```

作ったファイル```zshrc```は、ホームディレクトリにありますが隠しファイルになっているので、```Command + Shift + .```で表示してあげましょう。


　
ここまでで、一旦zshインストールと最強の補完機能の装備が完了です！
AndroidStudioのFlutter環境でログ/Printが出ない時

#FlutterProject作って実機デバックしたけどPrint文がでない


たとえば、以下のようなコードでプレスイベント時にIDEのコンソールに何か文字が表示したい時。

    onPressed: () => print("hogehoge")
    onPressed: () => debugPrint("hogehoge")
    onPressed: () => log("hogehoge")

AndroidStudioでLogcatを参照できれば表示されるかもですが、
私の環境ではLogcatが表示できなかったので ~~(FlutterProjectだとgradleの設定に一手間必要でめんどくさかった)~~
手っ取り早く ターミナルで「 flutter logs 」を実行し表示できました～。
みんなのiOS講座 ゼロからSwiftで学ぶiPhoneアプリ開発の基礎：作業メモ②

本日も[みんなのiOS講座 ゼロからSwiftで学ぶiPhoneアプリ開発の基礎](https://www.udemy.com/course/ios-apps/)の学んだことメモ。
今日からSwiftの基礎。

#定数と変数の概念
letを用いて定義した定数は後から変更することはできない。

```
let a = 123
```

varは変数なので、後から中身を変更することができる。

```
var b =123
```

```
var str ="Hello, playground"
```
のように文字が入ることもあり、この文章の形式を文字列という。文字列はダブルクオーテーションで囲む。

cmd+/でコメントアウトできる。
コメントアウトされるとコードに影響しなくなるため、コードにメモを書くことが可能。


#四則演算
swiftではたす、ひく、かける、わるの計算ができる。

```
let a = 4
let b = 5
let c = a + b
```

またprintを使って特定の結果を取り出して表示することもできる。

```
print(c)
```

割り算の場合は余りを出したり、少数同士であれば少数で回答をえることができる。


#nilとオプショナル型

- swiftは、型の後に?をつけてオプショナル型にすることで、変数の中身を空（nil）にすることができる。
- その後変数に数字を入れたりすることができる。
- !（エクスクラメーションマーク）をつけることで、オプショナル型だが中身はnilではないことを明示する。
- オプショナル型の変数を使うことで、中身が空である変数を効率よく使うことができる。


変数と型がよくわからなかったが、下記の記事が参考になった（実際どう活用できるのかのイメージはまだわいていない）。
[【Swift】データ型簡易まとめ](https://qiita.com/jag_507/items/0e42cda67f43954e9fdc)


#文字列
- 数字と同様に文字列も足し合わせることができる。
- ```\()```を使うことで、整数を文字列にすることができる。

```
let g = d + "\(f)" + e
私は20歳です
```

#Bool値と比較演算子
- ```==```で変数を比較をすることができる。
    - aとbが等しければcにはtrueが入り、aとbが等しくなければcにはfalesが入る。
このようにtrueとfalesの２通りで表される値をBool値という。

```
let c = a == b
```

- ```!=```は上記と逆で、aとbが等しくなければtrue、等しければfalesが入る。

```
let d = a != b
```

- &&は両方満たされている場合trueが入る。この両方が満たされているかどうかを判定する演算子をアンド演算子という。

- ||はどちらかが満たされていればtrueを返す。この演算子をオア演算子という。


#メモ
Swift Playgroundsでやっていたものと一緒だったので、入ってきやすかった。
ただ、実際にアプリつくるときに、どのように使うのかのイメージが湧いていない。
久々reactでの個人的ハマったポイント備忘録

reactとreduxを一気に学習すると最初はわかったつもりでも
忘れたり、こんがらがったりすることがありました。
その中での備忘録です。

# getElementByIdでオブジェクトが取れない
自分の場合はコンポーネントのライフサイクルを完全に忘れてしまっていました。
コンポーネントのライフサイクルをざっくり書くと

コンポーネントがマウントされて
↓
再レンダーされて
↓
アンマウントされる

というものです。

```errorCompleteGet.jsx

const ButtonText = () => {
    const buttonName = document.getElementById("button").innerText;

    const getButtonName = () => {
        alert(buttonName)
    }

    return (
        <section>
            <button onClick={() => {getButtonName()}} id="button">ボタン</button>
        </section>
    )
}

```

getElementByIdの１行はreturnの前に実行されてしまうので例外が走って

```error

TypeError: document.getElementById(...) is null
```

となってしまいます。
こうなるとreturnの後、つまりコンポーネントライフサイクルでいうと
マウントされた後に実行したいとなるわけですが
そこで最近であればuseEffect※１を使う場面となります。
※１react hooksの関数

```CompleteGet.jsx

const ButtonText = () => {
    
    let buttonName = ""; //1

    const getButtonName = (buttonName) => {
        alert(buttonName) //4　クリックされた時点で実行。クリックされなければ実行されない
    }

    useEffect((event) => {
        buttonName = document.getElementById("button").innerText; //3
    },[]);

    return ( //2
        <section>
            <button onClick={() => {getButtonName(buttonName)}} id="button">ボタン</button>
        </section>
    )

}

```

useEffectの詳細は割愛させていただきますが
上記のようにuseEffectのコールバック関数で実行することで
コンポーネントマウント後にgetElementByIdが実行されるので
オブジェクトが取得できるようになります。
コメントアウトの番号は実行される順番になります。

# 無限ループが起こる
関数でコンポーネントを定義していてreturnの中でクリックイベントを発生させたい時。
具体的には以下のような形で書くと無限ループが発生するようになりました。

```errorCounter.jsx

const CounterComponent = () => {

    let [count, counter] = useState(0);

    const countUp = () => {
        counter(count + 1);
    }

    return (
        <section>
            <button onClick={countUp}>カウント|{count}</button>
        </section>
    )
}

export default CounterComponent

```

以下エラーメッセージです。

```error.console

Too many re-renders. React limits the number of renders to prevent an infinite loop.
```

ここでポイントとなるのが前述ソース内の

```onClick.jsx

onClick={countUp}
```

この書き方だとcountUp関数はクリックしなくても最初コンポーネントマウント時に実行されてしまうんですね。
するとsetStateする関数であるcounterが走る
そうなるとstateが変化したので再レンダー処理が走る（上記ソース内でのreturn文)
つまり
countUp
↓
counter(stateがセットされ再レンダーの合図)
↓
return（再レンダー）
↓
countUp
・
・
・

となりめでたく無限ループが完成します。
そこで対策として


```okOnClick.jsx

onClick={() => {countUp}}

```

として即時関数でラップしてあげると
クリックされて初めてcountUpが実行されます。

# 所感
学習時は理屈がわかって、写経して動いても
実際自分で組み立てて使う時にハマり
わかってないところが浮き彫りになりますね。
１つ１つ丁寧に理解することも復習時には大事だと実感しました。

# 参考サイト
[無限ループのところで参考にさせていただきました。ありがとうございます。](https://qiita.com/katsuomi/items/5a062dc1e4d0ab64ae21)
M5Stack Core2を工場出荷時のファームに戻す

# M5Burnerを使ってみる

ファームを書き換えたM5Stack Core2を工場出荷時のファームに戻す方法です。
ファームの書き換えなのでUIFlowのファーム書き換えも同じ方法で実行できます。

## M5Burnerのダウンロード
[M5Stackのダウンロードサイト](https://m5stack.com/pages/download)からM5BurnerのMacOS版をダウンロードする。

|![スクリーンショット 2021-02-14 15.38.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/f4be90d5-67ce-00af-77de-a69724947657.png)|
|:-:|

## M5Burnerを起動する
M5Stack Core2を接続して、M5Burnerを起動する。
App Storeからダウンロードしたものではないので、警告が出るので1回目はキャンセルを押して、2回目の起動で開くを押します。

1回目

|![Screenshot 2021-02-14_15-43-03-705.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/d9bd1ec4-02ed-929c-ad99-dc0d1162aff6.png)|
|:-:|

2回目

|![Screenshot 2021-02-14_15-43-28-057.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/bc6740aa-ebd4-e0a0-b420-3ad1d46ae160.png)|
|:-:|

起動すると以下の画面になる。

|![Screenshot 2021-02-14_15-50-05-626.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/14b8bc73-a15a-5c06-43cb-82e737836540.png)|
|:-:|

COM（シリアルポート）で、M5Stack接続しているポートを選択する。
今回は、「/dev/tty.usbserial-0202E72E」選択。

|![スクリーンショット 2021-02-14 15.53.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/acf49db7-94d9-833c-8523-fd5c2fc541d2.png)|
|:-:|

## ファームの書き換えをする。
今回は、出荷時に戻すので、「Core2FactoryTest」のDownloadを押します。

|![Screenshot 2021-02-14_15-56-24-790.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/6150294c-f8da-9b70-5300-35e04d7190a3.png)|
|:-:|

Downloadのボタンを押下すると、「Burn」ボタンが表示されるので押下します。

|![Screenshot 2021-02-14_15-59-14-662.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/54cf0840-4b77-606c-bcb1-1500a581d0ac.png)|
|:-:|

ファームが焼き終わると、以下のような画面になります。

|![Screenshot 2021-02-14_15-59-53-561.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/8a7cc4f3-d0bd-4259-85d6-4a4cbd303a3f.png)|
|:-:|

M5Stack Core2の方は、このように工場出荷時のファームに戻りました。

|![150362960_747263699509458_2971209735375439016_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/ac859234-7d01-7f6f-2009-23e6202d7831.jpeg)|
|:-:|

## UIFlowのファームを焼く場合

同じ方法でUIFlowのファームも焼けます。
その場合に選択するのは、「UIFLOW(CORE2)」となります。

|![Screenshot 2021-02-14_16-13-21-548.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28184/022565c3-20c6-d36a-5b5b-3af853f942e6.png)|
|:-:|
Flaskメモ書き

# 説明できる程度にサーバーサイドを学ぶ
ハンズオンなどはネットに転がっているサイトを参考に....
あくまで自己理解のために記事を作成しているため、自分が理解している部分は大幅カット

個人的な目標としては、Flaskを用いてUSBカメラで取得した映像データをFlaskで表示することである

# webアプリケーション開発で知っておくべきこと

### webアプリケーション開発には2つのやり方がある
方法1：webサーバーにhtmlファイルとpythonスクリプトをアップロードし、レンタルサーバーを借りる
方法2：pythonでwebで動くアプリケーションそのものを記載し、クラウドサービスを利用する

方法１では、webサーバーの管理が利用者側にないため、レンタルサーバーに用意されている機能しか使えない。一方で方法２では、利用者が高い自由度、柔軟なメンテナンスの中で、サーバー管理をすることができる。


### pythonにはwebサーバーを簡単に作成できるモジュールがある

http.serverやFlaskモジュール。これらのモジュールを使用することで、簡単にwebサーバーを起動し、「webアプリの原型」を作ることが可能。サーバー側の複雑な設定は必要ない。

+ http.server
    + 参考：https://blog.serverworks.co.jp/tech/2020/02/11/python-http-server/
+ Flask
    + 参考：https://qiita.com/kiyokiyo_kzsby/items/0184973e9de0ea9011ed
  
### http.serverの限界
http.serverの問題点は頭に入れておく。

1. 複数のアクセスがあると途端にHttp.serverの動作は遅くなる
2. 基本的にwebサーバーは受け身である

httpサーバーでは、ユーザーからリクエストされた時のみ、レスポンスを返す。必要な情報を拡充したい時は、クライアント側が動く必要がある。
このような問題点があることで、http.serverは試験用でしか利用価値がない。


そこで現れたのが、**Flask**や**Django**といったwebフレームワークであり、webアプリケーション開発が容易になり、受け身のシステムを打破した。
pythonの多種多様なモジュールを導入しやすく、サーバーサイドのシステム組み込みが容易になった。

# Flask

### Flaskとは
しっかりと文章で説明できる程度に頭に入れておく。

OSSのwebフレームワークであり、Djangoと同じ立ち位置。Djangoは**webアプリケーション開発に必要となる機能を全て備えている**のに対し、flaskは**最低限の機能しか拡充していない**。
flaskは必要となる外部モジュールを簡単に追加できるという構想を採用しており、例えば、DBが必要な時は対応したDBモジュールを入れれば良い。必要最小限な機能しかないので、軽量なwebフレームワークである。

### テンプレートの考え方

htmlファイルはtemplatesフォルダ内に拡充することを決まりとする。
注意すべき点は、htmlファイルのことを**テンプレートファイル**と呼ぶことである。
flaskには**Jinja**というテンプレートエンジンが用意されており、これはテンプレートを元にhtmlソースコードを生成してくれる。

### postとgetの使い分け

GETでフォームを送信した場合、クエリパラメータがURLに追加されて送信される。
POSTはHTTPのボディ部分にフォーム情報が追加される。これはURLが同じであっても同じ結果は得られない。

GETはURLをコピーすれば何度でも同じフォームを送信することができる。かつ、クエリパラメータを変えることで異なるフォームを送信することができる。
これは外部から何度でも自由にフォームを送信できるという怖い点もあり、例えばECサイトにてアカウントの違う人の購入カートを変更できたりすることができる。大袈裟な話だが、、、、



# 基本用語
**クライアント** : webサイトにアクセスしてくる相手のこと

**ルーティング** : アドレスに応じた処理の割り振り

**クエリパラメータ** : **http://xxxxxxx/?a=xxx&b=yyy**といういうようにURL内で変数定義

**GET** : アクセスすると予め用意していたコンテンツを返す

**POST** : フォームなどユーザーが書き込む情報にしたがってgetする情報を更新しなければならない。更新情報を送信することをPOSTと呼ぶ

**GETとPOSTの違い**
- GET：サーバーから情報を取得する
- POST:サーバーに情報を追加する
- たくさん参考記事があるので調べて下さい
    - https://qiita.com/Sekky0905/items/dff3d0da059d6f5bfabf

**フレームワーク** : プログラミングにおいて、アプリケーションプログラム等に必要な一般的な機能が、あらかじめ別に実装されたもの。自分が必要としていない機能も拡充されていることに注意
FirebaseAuthのログイン状態によって起動画面を切り替えていく

備忘録

#はじめに
タイトルにも書いてあるようにFirebaseAuthのログイン状態によって起動画面を切り替える方法を
備忘録として書いていきます。

FirebaseAuthの説明や導入方法などは沢山、参考記事がありますので省きます。
そして、ログイン機能も実装している前提で書いていきます。

#実装する前に
Xcodeで最初にプロジェクトを立ち上げると`Storyboard起点`でアプリの画面が表示されます。

このデフォルトのままだと起動画面の切り替えはできないので
まずは`コードベースでアプリの画面を表示させないといけません`。

コードベースでアプリの画面を表示する方法は
私が記事にしていますので良かったら参考にしてみて下さい↓
[画面遷移に関係あるコードの記述を別ファイルに分けて実装する](https://qiita.com/reo0612/items/4235bdf51c3dadd256cb)

#実装コード
まずは、`ユーザー認証を行うメソッド`を準備します。

ViewControllerからFirebase関連のコードを分離させる為に`AccountManager.swift`を新しく作ります。
それと同時に、ここにメソッドを書いていきます。

```swift:AccountManager.swift
import Firebase

final class AccountManager {
   static let shared = AccountManager()
    private init() {}

   // ユーザー認証を行うメソッド
    func authenticationStatusCheck(complition: ((Bool) -> Void)? = nil) {
        Auth.auth().addStateDidChangeListener { (_, user) in
            // ユーザー情報があるかどうかをBool値で判断する
            if user == nil {
                // 新規ユーザーの場合
                complition?(false)

            }else {
                // ログイン済みユーザーの場合
                complition?(true)
            }
        }
    }
}
```
次は`Bool値に応じてViewControllerを返すメソッド`を準備します。

UIViewControllerのextentionファイルを作って、そこで場合分けをしていきましょう。

```swift:UIViewController+
extension UIViewController {
    // Bool値に応じてViewControllerを返すメソッド
    static func getRoot(isLogined: Bool) -> UIViewController {
        // ログイン済みユーザーの場合
        if isLogined {
            let mainVC = MainViewController()
            return mainVC

        // 新規ユーザーの場合
        }else {
            let registerVC = RegisterViewController()
            return registerVC
        }
    }
}
```
次は`アプリの初期画面を表示するメソッド`を準備します。

そして、ここで先ほど準備したメソッドを呼び出していきます。

```swift:Router.swift
import UIKit

final class Router {
    // アプリの初期画面を表示するメソッド
    static func showRoot(window: UIWindow) {
        // ユーザーのログイン状態を取得する
        AccountManager.shared.authenticationStatusCheck { (bool) in
            // ログイン状態に応じたViewControllerを取得する
            let rootVC = UIViewController.getRoot(isLogined: bool)
            // アプリの初期画面に反映させる
            window.rootViewController = rootVC
            window.makeKeyAndVisible()
        }
    }
}
```
このままでは、まだアプリ起動時の画面には反映されていないので
`AppDelegate.swift`内で実装していきます。

```swift:AppDelegate.swift
import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        let window = UIWindow(frame: UIScreen.main.bounds)
        self.window = window
        // ここでアプリの初期画面を端末に反映させる
        Router.showRoot(window: window)

        return true
   }
```
これでログイン状態によって起動画面を切り替えることが出来ました。

#おわりに
かなり雑に書いてしまいましたが、これでログイン状態によって起動画面が切り替えれます。
因みに、このように正しく起動時に画面を出し分けることを`起動経路`と言います。

もし、何かあれば遠慮なくコメントして下さると有り難いです。
Android &Kotlin：アプリを開いた時にロゴが一瞬出てくるやつ(スプラッシュ画面)を実装する

#記事の内容
Androidアプリのスプラッシュ画面をKotlinで実装していきます。
そもそもスプラッシュ画面って何？という方もいらっしゃると思いますが、スプラッシュ画面とは例えばあなたのスマホでツイッターのアプリをタップすると、タイムラインが表示されるまでの間ツイッターのロゴがしばらく表示されたりしませんか？あんな感じでアプリが起動するまでの時間をいい感じにごまかす画面がスプラッシュ画面と言われています。

#実装手順
・activity_splash.xmlの構成
・SplashActivity.kt実装
・SplashActivityをManifestに追加

#activity_splash.xmlの構成
`activity_splash.xml`では、スプラッシュ画面として表示したい画像やロゴを指定します。

まず、表示したい画像を`res -> drawable`に名前をつけて保存してください。
私は`splash_image`という名前で保存しました。

保存した画像を画面いっぱいに表示します。
コードは以下の通りです。

```activity_splash.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    android:background="@drawable/splash_image"
    tools:context=".SplashActivity">

</androidx.constraintlayout.widget.ConstraintLayout>
```

#SplashActivity.ktの実装
次に、`SplashActivity.kt`を実装していきます。
コードは以下の通りです。

```SplashActivity.kt
package com.iroha168.gamancounter

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Handler
import com.google.firebase.auth.ktx.auth
import com.google.firebase.ktx.Firebase

class SplashActivity : AppCompatActivity() {

    private val handler = Handler()
    private val runnable = Runnable {

        // ログイン済か未ログインかを判定
        val user = Firebase.auth.currentUser
        if (user != null) {
            val intent = Intent(this, CountPageActivity::class.java)
            startActivity(intent)
            finish()
        } else {
            val intent = Intent(this, AuthenticationActivity::class.java)
            startActivity(intent)
            finish()
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setTheme(R.style.SplashTheme)
        handler.postDelayed(runnable, 1000)
    }

    override fun onStop() {
        super.onStop()
        handler.removeCallbacks(runnable)
    }
}
```

上記のコードは、スプラッシュ画面を表示した後に、ユーザーがログイン状態であればホーム画面的なところに画面遷移し、ログイン状態でなければGoogle認証画面(ログイン画面)に画面遷移するというロジックです。


#SplashActivityをManifestに追加
Manifestに以下を追加

```AndroidManifest.xml
<activity
            android:name=".SplashActivity"
            android:theme="@style/SplashTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
```

以上でなんとかなるはずです。
Swiperを使ってスライダーアニメーションを実装する〜使い方編〜

## はじめに

タイトルについて記事にしました。
この記事で得る内容は以下の通りです。

・ Swiperの各クラスの役割やオプションについて

■ 関連記事
・ [Swiperを使ってスライダーアニメーションを実装する〜導入編〜](https://qiita.com/s79ns/items/08a7775f47122acbdcff)
・ [Swiperを使ってスライダーアニメーションを実装する〜ページネーションやナビゲーションのカスタマイズ編〜](https://qiita.com/s79ns/items/ab8af933b538fd53fd54)

## HTML

以下は公式の『Add Swiper HTML Layout』よりコピー＆ペーストしたものです。
それぞれのクラスの役割について順に説明します。

```html:index.html
<!-- Slider main container -->
<div class="swiper-container">
  <!-- Additional required wrapper -->
  <div class="swiper-wrapper">
    <!-- Slides -->
    <div class="swiper-slide">Slide 1</div>
    <div class="swiper-slide">Slide 2</div>
    <div class="swiper-slide">Slide 3</div>
    ...
  </div>
  <!-- If we need pagination -->
  <div class="swiper-pagination"></div>

  <!-- If we need navigation buttons -->
  <div class="swiper-button-prev"></div>
  <div class="swiper-button-next"></div>

  <!-- If we need scrollbar -->
  <div class="swiper-scrollbar"></div>
</div>
```

基本的に全てdivタグで書かれていて、クラスと役割については以下の通りです。

| クラス | 役割 |
|:-----|:-----|
| swiper-container | swiperに関することを記述していく全体を囲む |
| swiper-wrapper | その下のswiper-slideを囲む |
| swiper-slide | 実際にスライドさせるコンテンツ<br>...はその後に追記できるという意味 |
| swiper-pagination | コンテンツの下にある丸がたくさん並んでいる部分<br>現在どのスライドが表示されているか情報を表示 |
| swiper-button-prev<br>swiper-button-next | コンテンツ左右両端の矢印<br>prevが前に戻る（左）、nextが次に進む（右） |
| swiper-srollbar | 現在どの位置にあるかスクロールバーとして表示 |


```

## JavaScript

こちらは公式の『Initialize Swiper』よりコピー&ペーストしたものです。
連想配列になっており、スライダー全体に関わる部分と、ページネーション・ナビゲーション・スクロールバーの設定を変更することができます。
尚、el（EL）はエレメントの略で、paginationであればswiper-paginationクラスと紐付けられており、
navigationのnextElであれば、swiper-button-nextクラスと紐付けられています。

```javascript
const swiper = new Swiper('.swiper-container', {
  // Optional parameters
  direction: 'vertical',
  loop: true,

  // If we need pagination
  pagination: {
    el: '.swiper-pagination',
  },

  // Navigation arrows
  navigation: {
    nextEl: '.swiper-button-next',
    prevEl: '.swiper-button-prev',
  },

  // And if we need scrollbar
  scrollbar: {
    el: '.swiper-scrollbar',
  },
});
```

#### オプション

公式の[デモ一覧](https://swiperjs.com/demos)がありますので、デモの動きとソースコードを見ながら自身で調整して使います。
使用頻度が高そうなそれぞれ設定できる項目をコメントアウトしてまとめます。

```javascript
const swiper = new Swiper('.swiper-container', {
  // Optional parameters
  direction: 'horizontal', // スライド方向(verticlal=縦方向)
  loop: true, // ループ設定
  speed: 1000, // 何秒かけてスライドを切り替える（ミリ秒:1000=1秒）
  effect: 'fade', // ふわっとアニメーションさせてスライドを切り替える
  slidesPerView: 1, // １度に表示するスライド数
  centeredSlides: true, //現在のスライドを中央に表示
  spaceBetween: 10, // スライド同士の余白

  // 自動再生
  autoplay: {
    delay: 2000 // 次のスライドに切り替わる時間の設定（ミリ秒:1000=1秒）
  },

  // レスポンシブ
  breakpoints: {
    // 画面幅が769px以上の設定
    769: {
      slidesPerView: 3,
    }
  },

  // If we need pagination
  pagination: {
    el: '.swiper-pagination',
  },

  // Navigation arrows
  navigation: {
    nextEl: '.swiper-button-next',
    prevEl: '.swiper-button-prev',
  },

  // And if we need scrollbar
  scrollbar: {
    el: '.swiper-scrollbar',
  },
});
```
ぶっ壊れた社内オンプレサーバーを暫定対応としてNested-HyperVで稼働さす

あとできちんと書くけど忘れないようにまずは参照サイトだけ

停電対応後にお亡くなりになったサーバーをディスクからVHDファイル作成してQnapで仮想マシンとして復活させようとして苦労して
ディスク→VHD→VMDK→VMXに変換したのにVmwareでは動かせないのでVHDからAzureVMも無理そうだったのでAzureVM上にHyper-V立てるNested-Hyper-Vでなんとかしてみた話

# 参照サイト
* Nested-HyperV立てた後のネットワークの設定
    * https://blog.engineer-memo.com/2017/07/30/azure-%E3%81%AE-nested-vm-%E3%81%AE%E5%BE%8C%E3%81%A7%E8%A6%8B%E3%82%8B%E7%94%A8%E3%81%AE%E3%83%A1%E3%83%A2/
* VHDを色々変換する時に見たやつ
    * 履歴から探し中
S3内のオブジェクトの更新をすぐに反映したい

## はじめに
作業中S3に保存されているhtmlファイルを更新した後、すぐにブラウザで確認したところ更新が反映されませんでした。
オブジェクトに対してCache-Controlを設定することで解決したので、手順を以下に記載します。
## 手順
#### ①メタデータの編集を開く
Cache-Controlを設定するオブジェクトを選択し「アクション」から「メタデータの編集」を選択する。
![スクリーンショット 2021-02-14 15.03.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388694/f5607137-9097-45ac-1ee6-47aee2be8112.png)
#### ②メタデータを追加する

メタデータの追加を押下後、キーでCache-Controlを選択し、値に以下を入力する。

| ケース | 値 |
|:-:|:-:|
| キャッシュさせない  |　no-cache　|
| 時間を指定する | max-age=秒数 |

![スクリーンショット 2021-02-14 15.05.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388694/0ec01f9e-9b25-6739-69dd-5e87e731f5b2.png)
## 参考資料
https://qiita.com/suzuki-koya/items/42fa6699134bd8b73b85
https://qiita.com/hkusu/items/d40aa8a70bacd2015dfa
【mac】homebrewから始めるnode、pythonインストール

個人の備忘録

基本的に先人方のqiitaを引用

#Homebrewのインストール
[Homebrewのインストール](https://qiita.com/zaburo/items/29fe23c1ceb6056109fd)

[[brew update]Error:homebrew-core is a shallow clone.で失敗するのを解決](https://qiita.com/digitalhimiko/items/81184819f6555d4eaa75)
エラーが出たら参照

あとはhomebrewのパッケージマネージャにNodejsやらPythonをインストールして終わり、蛇足だが続ける

#Pythonのインストール
[⭐︎初心者でも分かる仮想環境構築](https://qiita.com/Taka20200105/items/20cebb42a20301203d2e)
pyenvを使うといいらしい

[pyenv install 3.x.x で error: C compiler cannot create executables](https://qiita.com/taku-0728/items/64147574efd7a4a7807d)
最新のバージョンをインストールしようとすると出るらしい。
最新のXcode beta版をインストールしてCommand Line Toolsを最新にすれば良き。

#Nodeのインストール

[MacにNode.jsをインストール](https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09)

```
nodebrew setup
```
で"export PATH=$HOME/.nodebrew/current/bin:$PATH"を環境PATHに設定すると
ええで！
と言われるので設定


```:コマンド
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile
```

それか
```open ~/.bash_profile```

から編集してもよろしい

<br/>

詰まるポイント的には、

```:コマンド
node -v
command not foundと怒られるが、
nodebrewのバージョンを指定。または、別バージョンを指定すれば更新される
nodebrew use v7.1.0
```
Watson Studio(Could Pak for Data): デプロイメント・スペースの作成

Watson Studio(Could Pak for Data)でAutoAIで作成したモデルをWebサービスから利用するためには、**デプロイメント・スペース**へのデプロイが必要です。以前はプロジェクト内で全てできていたのですが、モデルと作る人とそれを使う人は別チーム、みたいな考え方からなのか、「**デプロイメント・スペース**へデプロイして使う」という方法に変わったようです。
この**デプロイメント・スペース**の作成方法を説明します。

#0. 前提

 - Watson Studio(またはCloud Pak for Data)でプロジェクト作成済み
   - 未作成場合は以下を参考に作成してくだい
      -  [Watson Studio サービスとプロジェクトの作成](https://qiita.com/nishikyon/items/ba698b638300848b746e)
      -  プロジェクトの作成は必須ではありませんが、オブジェクト・ストレージが必須のため、プロジェクトを作成して何らかのオブジェクト・ストレージが使える状態であることを前提としています。

 - AutoAIで作成したモデルを使う場合：　Watson Studio(またはCloud Pak for Data)と同じリージョンでMachine Learningサービス作成済み
   - 未作成場合は以下を参考に作成してくだい
      -  [Watson Studio(Cloud Pak for Data)からサービスを作成](https://qiita.com/nishikyon/private/feff6467e1f75fcc0dfd)

#1. デプロイメント・スペースを表示する
左上のナビゲーションメニューをクリックし、`デプロイメント・スペース`の下の`すべてのスペースの表示`をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/b9cf3982-768e-3ec8-4162-c016dc21a653.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/261ca998-288d-0298-184b-2b4f74ae138c.png)

#2. `新規デプロイメント・スペース+`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/ebf0ddd8-9c75-a207-0648-0c60460634b0.png)

#3. 必要事項をセットします
- 名前：　任意の名前
- ストレージ・サービスの選択：　値が入っていることを確認
- 機械学習サービスの選択 (オプション): AutoAIのモデルをデプロイする場合は、ドロップダウンから選択してセットする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/53d991c4-d615-b143-0858-a96c71559c96.png)

#4. `作成`をクリックして作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/d561d7ee-89e0-f1fc-0ebd-6633b61b1862.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/407f28a4-9d49-46ea-0b4c-d59dc38e2469.png)

以下の画面が表示されたら、`閉じる`をクリック:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/5e096a09-d38c-b1c5-86a9-b0b40ed3582d.png)

作成したスペースが表示されていることを確認します:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/9bb20334-aa43-b4ab-e82c-d95ef9c0a4ce.png)

以上です。
PlantUMLの作図方向をleft to rightに変更した場合の矢印方向指定

PlantUMLのユースケース図で矢印の方向指定(-left-など)ができ、ドキュメントには使いすぎには注意との一文がありますが、やはり見た目をなんとかしたくて、ついつい方向指定で試行錯誤を繰り替えしています。

この矢印方向のキーワード(leftやup等)は作図方向がtop to bottomが基準となっています。
このtop to bottomは、クラスやユースケースなどの登場する要素が増えると、画像全体が横方向に広がってゆきます。
ただ、私は主にREADME.mdなどに埋め込んでブラウザで表示させることを目的としているため、縦スクロールで図が見えるようにleft to rightを使用することが多いです。

そうなると矢印のキーワードがどの方向に変わるのか、いつも混乱するので以下に整理してみました。

# top to bottom
まずはデフォルトの作図方向で、矢印方向を指定した図を作成します。

```
"左-l" -left- "l-右": left
"左-r" -right- "r-右": right
"左-u" -up- "u-右": up
"左-d" -down- "d-右": down
```

![](
http://www.plantuml.com/plantuml/png/KtgwVPbkZfA2RavgMeckWbAExjF-pKfM2Y0kbn98iWWeMPIPdW6IBOBAWlaGwLAWT6a1KAuKAbTQ09580Kgav9Vd0QLIe58WBW00)

これで矢印の右側の図形が、矢印方向のキーワード通りの位置に配置されることが確認できました。

|矢印方向|矢印の右側の図形の位置|
|---|---|
|left|左|
|right|右|
|up|上|
|down|下|


# left to right
上記の図をleft to rightに変更すると以下のようになります

```
left to right direction

"左-l" -left- "l-右": left
"左-r" -right- "r-右": right
"左-u" -up- "u-右": up
"左-d" -down- "d-右": down
```

![](http://www.plantuml.com/plantuml/png/BSkx3O0m34NHFbDOxhq0w-00aI8IMR4OWorOW8A9iWVEfxmwxqM_5IW99En70GxYrnBIwHpMxw68GD4M11YftYykq7AW6FQRgKpjFLYDDPlfDCq3s83JTHhnf9O_)

整理すると以下の通りです。

|矢印方向|矢印の右側の図形の位置|
|---|---|
|left|上|
|right|下|
|up|左|
|down|右|

leftが左から上に、upが上から左に変わっています。
ちょっと意外でした。top to bottomからleft to rightへの変更は、図を右に90度回転させるだけでなく、左右裏返した配置になるんですね。
リストが二つ表示される時の解決方法

このように書くと**リストが二つ**できてしまいます。

```js:jQuery
$('.modal').find('ul').append('<li><li>');
```
下記のように、二つ目の「li」を「/li」に修正（スラッシュを加える）と解決します。

```js:jQuery
$('.modal').find('ul').append('<li></li>');
```

このように、一つだけ書いたつもりが二つ表示される時には、スラッシュが書かれてるか確認すると良いです。
herokuへのデプロイでfailed to push some refs to …のエラー

#環境
PHP : 7.1.3
Laravel : 5.7
docker-compose.yml

```
#docker-compose.ymlのバージョン
version: '3'
#docker volumeの設定
volumes:
  docker-volume:

#services以下に各コンテナの設定を書く
services:
  #Webサーバーのコンテナ
  web:
    image: nginx:1.18
    ports:
    - '8000:80'
    volumes:
    - ./server:/var/www
    - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
    - php

  #アプリケーションのコンテナ
  php:
    build: ./docker/php
    volumes:
    - ./server:/var/www

  #データベースのコンテナ
  db:
    image: mysql:5.7
    ports:
    - '13306:3306'
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: password
      TZ: 'Asia/Tokyo'
    volumes:
    - docker-volume:/var/lib/mysql
```


#エラー内容
```
xxx@MacBook-Pro ponshuki % git push heroku master
Enumerating objects: 1653, done.
Counting objects: 100% (1653/1653), done.
Delta compression using up to 8 threads
Compressing objects: 100% (1600/1600), done.
Writing objects: 100% (1653/1653), 6.16 MiB | 2.15 MiB/s, done.
Total 1653 (delta 1033), reused 0 (delta 0), pack-reused 0
remote: Compressing source files... done.
remote: Building source:
remote: 
remote: -----> Building on the Heroku-20 stack
remote:  !     No default language could be detected for this app.
remote: 			HINT: This occurs when Heroku cannot detect the buildpack to use for this application automatically.
remote: 			See https://devcenter.heroku.com/articles/buildpacks
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: !	Push rejected to rocky-ravine-27668.
remote: 
To https://git.heroku.com/rocky-ravine-27668.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/rocky-ravine-27668.git'
xxx@MacBook-Pro ponshuki %  git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   server/.env.example

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	Procfile

no changes added to commit (use "git add" and/or "git commit -a")
```

##原因
ディレクトリ構造が問題だった
dockerを使用していたため、直下のデイレクトリにcomposer.jsonがなくてはいけない。
↓
phpをherokuが認識できない

##解決方法
```
git subtree push --prefix server/ heroku master
```
できたー！
ActiveadminでCommentモデルを生成するとエラーが出る

# はじめに
`バージョン`
ruby 2.7.2
Rails 6.1.1

## Activeadminでcommentモデルを生成するとエラーが起こる

管理者画面にCommentモデルを追加するため以下を実行する

```ruby:ターミナル
$ rails g active_admin:resource Comment
```

ファイルの作成は生成は問題なくできるものの、管理者画面を起動するとエラーが出てしまう
どうやらCommentというネーミングが悪さをしてバグを吐いているらしい...
そのため生成したファイルに以下のような記述を行い、ネーミングを変更する

```ruby:app/admin/comments.rb
ActiveAdmin.register Comment, :as => "ReviewComment" do

end
```

`ReviewComment`としているが各々好きな名前をつけましょう！
Python, R で作成したApache Arrow ファイル を Typescript で読み込み

## この記事の目的。

ふとした疑問。Python or R にて feather format で保存したファイルを Typescript から読み込みは問題なくできるのだろうか。（面倒なのでRからは省略）

## Prerequisite

一連のファイルを [github repository](https://github.com/koizumihiroo/apache-arrow-py-ts-example) にあげた。なお、自分は Typescript の予備知識がほぼゼロなので、 Dockerfile に書いた npm のコマンドは適当なので、改善提案を頂けるとありがたいです。

## 考察および得た知識


- 結論: できる。 Apache Arrow は `.feather`, `.arrow` と異なる拡張子が与えられることがあり、実体としてのフォーマットが一体何なのかよくわかっていなかったが、実は同じことが確認できた。
- ただし、 Javascript (Typescript) での feather format の読み込みは、 python 側での作成で `compression='uncompressed'` を指定したファイルでないと読み込めない。
- JS example で `table.toString()` によりテーブル内容表示されるとあるが、自分の実行環境では `[object Object]` しか表示されず悲しみ。自分で markdown 表示の関数作って何とかしのぐ必要があった。
- JS側の Table object が Iterable ではなかったので、そのまま map できずに不便。ここは型宣言を見たがよくわからず。

## 今後の課題
- Typescript側での `Date32` 型が一体何なのか不明のまま。

## References:

- https://github.com/apache/arrow/tree/master/js
- https://www.npmjs.com/package/apache-arrow
- https://observablehq.com/@theneuralbit/introduction-to-apache-arrow
MetaData APIを使ってプロファイルを読む（準備）

どうも、メタデータでの名前と通常目にするプロファイル名は違うみたいです。

[https://salesforce.stackexchange.com/questions/159005/listing-of-all-standard-profiles-and-their-metadata-api-names](https://salesforce.stackexchange.com/questions/159005/listing-of-all-standard-profiles-and-their-metadata-api-names)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/84f881c4-2e50-7714-6b5f-abd5298e7e2d.png)



#readMetadataが例外をスローしないのはなぜですか？
前の例では、readMetadata操作を使用しています。この操作に指定されたフルネームのいずれかが無効な場合（カスタムオブジェクトが存在しない場合など）、この操作は例外をスローしません。代わりに、空のレコードが返されます。たとえば、次の例は、無効なカスタムオブジェクトのフルネームを使用してもメタデータレコードが返されるが、フルネームがnullであることを示しています。したがって、ここでのアドバイスは、readMetadataから返された情報の内容を信頼する前に、FullNameがnullでないことを確認することです…

```
MetadataService.CustomObject customObject =
   (MetadataService.CustomObject) service.readMetadata('CustomObject',
      new String[] { 'DoesNotExist__c' }).getRecords()[0];
System.assertEquals(customObject.FullName, null);

```
【Go】文字列から数値への変換、数値から文字列への変換

## 準備
`strconv`と言うpackageを使用する為、まずはimportする。
（`strconv`に変換する為の色々な関数が存在。詳細は下記URL参照。）
https://golang.org/pkg/strconv/

```go:import
import "strconv"
// 以下でも良い
import ("strconv")
```

## 文字列から数値への変換
文字列から数値への変換には`Atoi関数`を使用。

```go
var str string = "100"
fmt.Printf("型：%T", str, str) // => 型：string

// string -> int
var num int
num, _ = strconv.Atoi(str)
fmt.Printf("型：%T", num) // => 型：int
```

<details>
<summary>`Atoi関数`が変数を2つ(`num`と`_`)を取っている理由</summary>ドキュメントに`func Atoi(s string) (int, error)`と書かれている。
つまり、引数にstring型の値を取る。（例では`str`にあたる。）
返り値はint型とerror型の2つが返ってくる。
その2つの返り値の変数で受け取っている。（例では`num`と`_`にあたる。）
</details>


## 数値から文字列への変換
数値から文字列への変換には`Itoa関数`を使用。

```go
var num int = 100
fmt.Printf("型：%T", num) // => 型：int

// int -> string
var str string = strconv.Itoa(num)
fmt.Printf("型：%T", str) // => 型：string
```
【PHP】無名関数内でスコープ内の変数を使いたい場合

PHPを書いているときに、無名関数内で該当スコープで使用している変数を使用したいケースがあったので、まとめておきます。


## ダメな例
下記のように記述するとNULLが出力されてしまいます。

```php
$hoge = 1;
$hoge_func = function () {
    var_dump($hoge);
};
$hoge_func();
```

```php:出力結果
NULL
```

これは、無名関数内のスコープでは、$hogeが定義されていないからです。

## 正しい例
無名関数のスコープ外で使用されている変数を使用したい場合には、下記のように書きます。

```php
$hoge = 1;
$hoge_func = function () use($hoge) {
    var_dump($hoge);
};
$hoge_func();
```

```php:出力結果
int(1)
```

## まとめ
PHPだからよしなにやってくれるだろうと高を括らず(?)、きちんと使用する変数はuseで定義するようにしましょう。
子供向け自動車安全（ソフトウェアに何ができるか）安全(32)

子供向け自動車安全の冊子を作るにあたって、
ソフトウェアで何ができるかを記録します。

# 止まっている車の周りで遊ばない
自動運転自動車は、中に人が乗っていなくても動き始めるかもしれません。

子供は自動車の周りであそばないようにしましょう。

## 付加機能1 出発合図 
動き出す前に、動き出しますよという音声を３言語以上で発声し、
動き始めは低速で、周囲に猫などの小動物や、人間の赤ちゃん、子供がいないかを確認してから高速に切り替える。

# 歩道以外を歩くときは周囲を見渡す
電気自動車は、エンジン自動車よりも静かで、音がしたら避けるというわけにはいきません。
自動運転車の大半が電気自動車の可能性があり、エンジン音は自動車の接近を意味しなくなりつつあります。

##付加機能2 接近合図
人間などが近づいたら、自動車が近づいたことを知らせる合図を送る。

音声だけでなく、bluetooth, Wi-Fi機器に対して、位置情報に基づき10m以内の機器に知らせる。ただし、屋内に設置した機器には知らせないような設定を設ける。

# 横断歩道
横断歩道以外ではなるべく渡らない。
片側１車線以上で両側に歩道が付いた道で、500m 以内に横断歩道がない場所には、横断歩道を設置するか、歩道橋、地下道などを設置する。

## 付加機能3 停止合図
横断歩道で停止した場合に、歩行者が渡るのを待っている場合には、待っているよ信号を送る。この信号を送っている間は、発進できない。

# 横断歩道以外
横断歩道以外を渡る歩行者、自転車を確認した場合には、徐行に減速する。

## 付加機能4 音声案内
片側１車線以上で両側に歩道が付いた道で、横断歩道以外を渡ろうとしている歩行者がいる場合には、どこに横断歩道があるかを教える音声案内を流す。

# 参考資料
ロアルド・ダールの鉄道安全読本。鉄道(13)　安全(42)　https://qiita.com/kaizen_nagoya/items/7ae2e0266352c362be15

子供向け自動車安全（ソフトウェアに何ができるか）。安全(32)　https://qiita.com/kaizen_nagoya/items/a6e922b6630cd05cd244

猫中心設計。仮説（25)。安全(34)　
https://qiita.com/kaizen_nagoya/items/d409c1185df30f660adc


仮説（0）一覧（目標100現在40）
https://qiita.com/kaizen_nagoya/items/f000506fe1837b3590df

安全（0）安全工学シンポジウムに向けて: 21
https://qiita.com/kaizen_nagoya/items/c5d78f3def8195cb2409

Error一覧 error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

Ethernet 記事一覧　Ethernet(0)
https://qiita.com/kaizen_nagoya/items/88d35e99f74aefc98794

Wireshark 一覧 wireshark(0)、Ethernet(48) 
https://qiita.com/kaizen_nagoya/items/fbed841f61875c4731d0

線網（Wi-Fi）空中線(antenna)(0) 記事一覧(118/300目標)
https://qiita.com/kaizen_nagoya/items/5e5464ac2b24bd4cd001

OSEK OS設計の基礎　OSEK(100)
https://qiita.com/kaizen_nagoya/items/7528a22a14242d2d58a3

官公庁・学校・公的団体（NPOを含む）システムの課題、官（０）
https://qiita.com/kaizen_nagoya/items/04ee6eaf7ec13d3af4c3

Error一覧(C/C++, python, bash...) Error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

C++ Support(0)　
https://qiita.com/kaizen_nagoya/items/8720d26f762369a80514

Coding Rules(0) C Secure , MISRA and so on 
https://qiita.com/kaizen_nagoya/items/400725644a8a0e90fbb0

なぜdockerで機械学習するか 書籍・ソース一覧作成中 (目標100)
https://qiita.com/kaizen_nagoya/items/ddd12477544bf5ba85e2

言語処理100本ノックをdockerで。python覚えるのに最適。:10+12
https://qiita.com/kaizen_nagoya/items/7e7eb7c543e0c18438c4

プログラムちょい替え（0）一覧:4件
https://qiita.com/kaizen_nagoya/items/296d87ef4bfd516bc394

TOPPERSまとめ　#名古屋のIoTは名古屋のOSで
https://qiita.com/kaizen_nagoya/items/9026c049cb0309b9d451

自動制御、制御工学一覧（０）
https://qiita.com/kaizen_nagoya/items/7767a4e19a6ae1479e6b

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

小川清最終講義、小川清最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
### 文書履歴(document history)
ver. 0.01 初稿 　 20210214
ver. 0.02 ありがとう追記 20230617
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Active Storageを用いた画像読み込みが遅い問題を解決（リサイズとJOINが原因でした）

Active Storageを使って画像投稿をしていたら、ページ読み込みが遅くなる問題が発生しました。それの解決策です。

##画像のリサイズがサーバー負荷になっている
画像をアップロードしてからサーバーでリサイズをしていると、サーバー負荷がかかって読み込み速度が遅くなってしまいます。
つまり、画像を送信する前に、フロント側でjsや[MiniMagick](https://github.com/minimagick/minimagick)を使ってリサイズをするのが理想的です。
個人的にはJSよりもMiniMagickを使う方が開発が早くておすすめです。

```ruby:posts_controller.rb
  def create    
    @post = current_user.posts.build(post_params)
    if @post.images.present?
      resize_image(800,800)　
      @post.images.attach(params[:post][:images])
    end
       #--------省略-------
   end

  def resize_image(width = 1280,height = 1280)
    if post_params[:images].present?
        post_params[:images].each do |image|
          image.tempfile = ImageProcessing::MiniMagick.source(image.tempfile).resize_to_fit(width, height).call
      end
    end   
  end

```

ちなみに、このようにViewでリサイズをする方法がよく記載されていますが、自分は読み込み速度が遅くなりました。

```ruby:view.rb
<%= image_tag user.avatar.variant(resize: "100x100") %>
```
参考：https://railsguides.jp/active_storage_overview.html

##データモデルで勝手にjoinされている
私の場合は、Tagモデルで外部キー制約をつけていたせいでActive Storageの関連モデルと勝手にJOINされていました。JOINしていると、情報量が多くなりすぎてサーバー負荷が大きくなってしまいます。
これについては、binding pryを使って、データをどのようにとってきてるのか確認しましょう。

##おわり
初心者で至らない点が多々あると思います。間違えていたり、より良い方法がある場合は気軽にご連絡ください！！楽しいプログラミングライフを⭐️

参考文献：
https://vitobotta.com/2020/09/24/resize-and-optimise-images-on-upload-with-activestorage/
https://qiita.com/komakomako/items/8efd4184f6d7cf1363f2
https://railsguides.jp/active_storage_overview.html
Noxをandroid emulatorとして使う手順

- https://jp.bignox.com/
- Noxはandroid 7を利用

## インストール


```bash
➜  ~ brew install noxappplayer
```


## 初回起動できない

![ 2021-02-14 at 14.30.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66521/d5c4ff75-2eb6-c3a8-39fb-6520b6be66c7.png)

`Open Anyway` ボタン押す


## 初回起動時に99%で止まる

![ 2021-02-14 at 14.32.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66521/cc674488-9390-3819-7e42-fef47163910c.png)

- 裏側で動かすvirtualboxの連携がうまくいってない


### virtualbox起動

- noxが動かしてるVMを選び起動させる

### 起動したが、adbから見えない

adbから見えるようにする

```bash
adb connect 127.0.0.1:62001
```
Mac：VScode上でcommand + Y を有効にする

こんにちは！
コードを書いていく中でトライアンドエラーの高速化は大事ですよね（まだまだコード書きたてなので、ベテランの方は違うかもしれません、笑）

Macを使っている方なら、Command + Z で直前の操作を取り消したけど、やっぱりCommand + Yで戻したいっていう時がたまにあります。

しかし、VScode(Visual Studio Code)ではCommand + Yで戻すという操作ができないケースがあります。

そこで、VScode上でCommand + Yで戻すという操作を有効にする方法を共有したいと思います！
二つの手順で完了するので、簡単です！

#有効にする方法

**①vscodeの検索欄で検索する**

VSCodeを開いた状態でCommand + Shift + Pを押して下さい。すると検索欄が現れるので、その中で「Preferences: Open Keyboard Shortcuts (JSON)」を検索してクリック！

**②開いたファイルに設定する**

①で開いたファイルの中に、以下のコードを加えて下さい！
（外側の括弧も忘れずにコピーして下さい）


```
{
    "key": "cmd+y",
    "command": "redo",
    "when": "editorTextFocus"
}
```

加えた内容を保存すれば、Command + Yが効くようになります！


以上、ありがとうございました！