OmniAICreator/Qiita-1.07M huggingface dataset:
一発で理解できる ~Ruby,Railsについて~

# Ruby概要

__日本人が作ったプログラミング言語__

* Rubyは、まつもとゆきひろ氏が開発したプログラミング言語です。日本で開発されたプログラミング言語
* Rubyは、非常にシンプルで書きやすいプログラミング言語であり、最初に学ぶプログラミング言語として最適

__名前由来__

名前の由来はまつもとゆきひろ氏の好きなプログラミング言語であるPerlをモデルに開発したことからその名称には『Perl（パール）に続ぐ』という意味が込められており6月宝石であるPerlの次月(7月)宝石のRuby（ルビー）という名称になったようです。

# Rubyの特徴

__シンプル__

Rubyは、なんといっても記述のシンプルさが売りです！
可読性（読みやすさ）を重視しています。Javaと比較してみましょう！
Hello World”という文字を表示するプログラムを比較してみて下さい。

```java:Java
public class Main {
  public static void main(String[] args){
    System.out.println("Hello World");
  }
}
```

```ruby:ruby
puts "Hello World"
```
記述のシンプルさを体感してもらえたかと思います。

***

__実行が簡単__

* Rubyは、「スクリプト言語」の1つです。
スクリプト言語とは、簡単に言うと、記述したプログラムをすぐに実行して、動きを確認できる言語です。



__Rubyの楽しさ__

Rubyは、他のプログラミング言語と比べて、コードを書く人の楽しさをとても重視して言語が設計されています。
開発者も以下のように述べています。
>Ruby には Perl や Python とは決定的に違う点があり、それこそが Ruby の存在価値なのです。それは「楽しさ」です。私の知る限り、Ruby ほど「楽しさ」について焦点を当てている言語は他にありません。Ruby は純粋に楽しみのために設計され、言語を作る人、使う人、学ぶ人すべてが楽しめることを目的としています。しかし、ただ単に楽しいだけではありません。Ruby は実用性も十分です。実用性がなければ楽しめないではありませんか。
（引用：まつもとゆきひろ氏　Ruby プログラミング入門 まえがき 監修者よりのページ）

# Ruby on Rails概要

__概要__
Ruby on RailsとはRubyに活用されるデビッド・ハイネマイヤー・ハンソン氏によって開発されたオープンソースWebアプリケーションフレームワーク。基本理念を『同じことを繰り返さない』と掲げております。特徴としては基本理念の名の下同じソースコードを何度も記述しなくて良い効率よく実装するための仕様となっております。

***

# Ruby on Rails 3つ特長

__生産性向上__
あらかじめ基本的な構造が組まれているので、必要最低限のプログラミングだけで済ませられます。
記述するコード量は、フレームワークを使わなかった場合とではまったく違います。よりコンパクトに記述できるので、機能開発の生産性も向上します。

__メンテナンスのしやすさ__
ルールに従ってコードを書くので、一貫性を保ちやすくなります。不具合や仕様変更があった場合も、どこに問題があるのか＆どこを変更すればよいのか特定しやすくなります。

__品質を維持できる__

Ruby on Railsは、オープンソースのウェブアプリケーションフレームワークです。
「オープンソース」とは、ソースコードが無償で公開されていて、誰でも自由に閲覧したり編集を行える状態のことです。世界中の大勢の人によって利用実績が積み上げられ、今も改善され続けています。最善の状態で品質を維持しやすいのも大きな特徴です。

***

__Webアプリケーション開発のフレームワーク__

Ruby on Rails（ルビーオンレイルズ）は、Rubyを使ったWebアプリケーションのフレームワークです。
フレームワークはWebアプリケーション開発に必要な機能をまとめて提供してくれるもの。

***

#　開発事例

https://kakaku.com/

https://tabelog.com/
PowerAutomateってどうなの？

#Microsoft公式！無償！RPAソフト "Power Automate Desktop"
数年前にUIpathやWinActerといった有償のRPAソフトが世（私の周り）を騒がせていたが、なんとあのMicrosoft社がレコーディング機能を搭載した無償のRPAソフトを出してしまった。。。

こちら提供開始からもう意外と時間が経っていて、2021年3月リリースの通称PAD（パッド）。

Microsoftで前々から提供していたものでは　Microsoft Power Automate（旧：Microsoft Flow）　があったが、PADとは何が違うのか？

ちなみに、
Microsoft Power Automateでつくられたオートメーションは、クラウドフロー、
Power Automate Desktopでつくられたものは、デスクトップフローと呼ばれる。


#Power Automate デスクトップフロー／クラウドフローそれぞれの強み
両方を触りだしてまだ数週間だが、所感はこんな感じ↓↓↓


#####デスクトップフローの強み
・ローカルファイルの読み込み
・webスクレイピング
・Powershellを使ったスクリプトの利用

ローカルで、そしてデスクトップ上で、マウスをカチカチしていた作業を自動化したいときに活躍しそう。
レコーディング機能もあるので、フロー実装もまあまあ簡素化されてる。


#####クラウドフローの強み
・グループメールアドレスからのメール送信
・Microsoftのクラウド上（sharepointなど）のファイルの読み込みや編集
・ある条件のメールを受信したらTeamsへ投稿するなどのソフト間連携

こちらはユーザー認証が必要な作業で大活躍。M365利用きていて、クラウドをしっかり使っている人たちには必須のツールだと思う。


#まとめ
デスクトップフローとクラウドフロー、それぞれ守備範囲が大きく異なるので、自身のインフラ環境と活用目的からどう作り込むのがベストか、しっかり考えてから手をつけた方がいい。
AWS SNS/SQSによるメッセージ送受信のサンプル(Go言語)

## 前準備

1. SNSのトピックを作る
  - 名前は適当
  - タイプは標準
  - 他はすべてデフォルト値でOK。
1. SQSのキューを作る。名前は適当、他は
  - 名前は適当
  - タイプは標準
  - 他はすべてデフォルト値でOK。
1. SQSを作ったら、そのSNSサブスクリプションに最初に作ったSNSを追加する

## SNSでメッセージを送信

```go
package main

import (
	"flag"
	"fmt"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/sns"
	"os"
)

func main() {
	profile := flag.String("p", "", "AWSの認証に使うProfile。未指定ならdefault")
	msgPtr := flag.String("m", "", "The message to send to the subscribed users of the topic")
	topicPtr := flag.String("t", "", "The ARN of the topic to which the user subscribes")

	flag.Parse()

	// Initialize a session that the SDK will use to load
	// credentials from the shared credentials file. (~/.aws/credentials).
	sess := session.Must(session.NewSessionWithOptions(session.Options{
		SharedConfigState: session.SharedConfigEnable,
		Profile:           *profile,
	}))

	svc := sns.New(sess)

	result, err := svc.Publish(&sns.PublishInput{
		Message:  msgPtr,
		TopicArn: topicPtr,
	})
	if err != nil {
		fmt.Println(err.Error())
		os.Exit(1)
	}

	fmt.Println(*result.MessageId)
}
```

## SQSでメッセージを受信

```go
package main

import (
	"flag"
	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/sqs"
	"os/signal"
	"syscall"

	"fmt"
	"os"
)

func main() {
	profile := flag.String("p", "", "AWSの認証に使うProfile。未指定ならdefault")
	queue := flag.String("q", "", "The name of the queue")
	flag.Parse()

	if *queue == "" {
		fmt.Println("You must supply the name of a queue (-q QUEUE)")
		return
	}

	// Initialize a session that the SDK will use to load
	// credentials from the shared credentials file. (~/.aws/credentials).
	sess := session.Must(session.NewSessionWithOptions(session.Options{
		SharedConfigState: session.SharedConfigEnable,
		Profile:           *profile,
	}))

	svc := sqs.New(sess)

	urlResult, err := svc.GetQueueUrl(&sqs.GetQueueUrlInput{
		QueueName: queue,
	})
	if err != nil {
		fmt.Println(err.Error())
		os.Exit(1)
	}

	go func() {
		queueURL := urlResult.QueueUrl
		timeout := int64(20)

		for {
			msgResult, err := svc.ReceiveMessage(&sqs.ReceiveMessageInput{
				AttributeNames: []*string{
					aws.String(sqs.MessageSystemAttributeNameSentTimestamp),
					aws.String(sqs.MessageSystemAttributeNameSenderId),
				},
				MessageAttributeNames: []*string{
					aws.String(sqs.QueueAttributeNameAll),
				},
				QueueUrl:            queueURL,
				MaxNumberOfMessages: aws.Int64(1),
				VisibilityTimeout:   &timeout,
				WaitTimeSeconds: &timeout, // ロングポーリング
			})

			if err != nil {
				fmt.Println(err.Error())
				os.Exit(1)
			}

			for _, message := range msgResult.Messages {
				fmt.Println(message)
				// 一度受け取ったメッセージはキューから削除。そうしないと何回も受信してしまう
				_, _ = svc.DeleteMessage(&sqs.DeleteMessageInput{
					QueueUrl:      queueURL,
					ReceiptHandle: message.ReceiptHandle,
				})
			}
		}
	}()

	sig := make(chan os.Signal, 1)
	signal.Notify(sig, syscall.SIGTERM, syscall.SIGINT)
	s := <-sig

	fmt.Printf("Signal received: %s \n", s.String())
}
```
【Docker】docker imageの大きさを小さくする (その1)


# はじめに

Docker を使っていますが、イメージの大きさを削減しなくてはならない場面が出てきました。
今回その１にしたのは、後日その２がある予定なので。^^)/

### C言語で書いたプログラム

今まで、Linuxマシンで動かしていたものをdocker image にするには、基本的に

1. ソースをコピーする
1. build する
1. コンテナ起動時に呼び出して使えるようにする

というのをDockerfile の中に記述していました。単純ですがこれで動いていたので、今まで良しとしてきました。なのですが、よく考えると、これをコンテナとして実行するときには、実行ファイルと動的に読み出すライブラリだけあれば十分なはずです。コンパイラ、静的ライブラリ、ヘッダファイルなどは、build するときにだけ必要です。

### ビルド環境をイメージに含めない

今回、調べたら、分かり易いが説明がいくつもありました。

https://docs.docker.jp/develop/develop-images/multistage-build.html#

↑これで使われているサンプルのプログラムは、こちらにあります。

https://github.com/alexellis/href-counter.git


これはGO言語での例ですが、分かり易く、そのまま動かすことができました。勉強になりました。感謝感激です。

以下は、私なりの理解です。私はC言語で動かしています。

1. 一度docker image の中で動く実行ファイルを作る。これはコンテナとしてはrun させることはなく、実行ファイルを作るためだけにdocker build される
1. コンテナとして run するために使うイメージを作る。ここでは、必要なbase image に、先の作った実行ファイルをコピーする。実行物をコピーするだけなので、build に必要な環境は含まれないので、image の大きさが小さくてすむ。
1. 以前は、dokcer cp コマンドを使って実行ファイルをbuild コンテナから取り出していたようだが、昨今では、docker build 実行時にbuild container 内でコピーすることができる。

ということのようです。二つのコンテナを作っても良いのですが、これを一つのDockerfile で行うことができます。次のサイトは、build の高速化の説明ですが、前半にmulti-stage build をC言語を例に行っていたので、参考になりました。

https://pythonspeed.com/articles/faster-multi-stage-builds/

# 実行例

### 用意するもの

種も仕掛けもありません。今回の実験では、ファイルは３つ。

```
├── Dockerfile.multi-stage
├── Dockerfile.single-stage
└── hello.c
```

C言語のhello world。心が和む。

```hello.c
#include <stdio.h>
int main()
{
  printf("hello.\n");
  return 0;
}
```

普通のDockerfile。コピーしてコンパイルする。build-essential をapt-get する。

```single-stage.Dockerfile
FROM ubuntu:18.04
RUN apt-get update
RUN apt-get install -y --no-install-recommends gcc build-essential

WORKDIR /root
COPY hello.c .
RUN gcc -o helloworld hello.c
CMD ["./helloworld"]
```

それから、今回の目玉のmulti-stage でbuild する Dockerfile。WORKDIR を経由して、実行ファイルだけコピーしているところがポイント。

```multi-stage.Dockerfile
# This is the first image:
FROM ubuntu:18.04 AS compile-image
RUN apt-get update
RUN apt-get install -y --no-install-recommends gcc build-essential

WORKDIR /root
COPY hello.c .
RUN gcc -o helloworld hello.c

# This is the second image.
FROM ubuntu:18.04 AS runtime-image

COPY --from=compile-image /root/helloworld .
CMD ["./helloworld"]
```

### ビルドして大きさを比較してみる

これをいざビルドしてみよう。

```terminal
$ docker build -f single-stage.Dockerfile -t c-hello .
$ docker build -f multi-stage.Dockerfile -t c-hello2 . 
```

image の大きさを比べてみると、、、

```
$ docker
 images
REPOSITORY                    TAG               IMAGE ID       CREATED
             SIZE
c-hello2                      latest            c8470180dd3f   5
seconds ago        63.1MB
c-hello                       latest            0db6a6cf73e5   About a
minute ago   295MB
```

結構差がありますね。^^;　もちろん、動きます。

```
$ docker run --rm c-hello2
hello.
```

# まとめ

とりあえず、Cをソースからビルドするdocker image を作る時、image size を小さくする方法を一つ理解した。

- build するときは build-essentials を apt でインストールして使う。
- Dockerfileの途中で、build が終わった後であらためてbase image を定義し、実行用のイメージ作成には必要なバイナリだけコピーしてくる。

### 今後

実は python ではどうなるのじゃ、ということを調べています。同じように考え方で行けそうなのですが、動作確認できたらメモします。ふー。

2021/08/23 から日付が変わって0:48
SQLの基本

#SQLとは？
SQLとは簡単にいうとデータベースを操作するための言語
データベースのデータを挿入したり、データを書き換えたり、データを検索したりするための言語です。
SQLは国際標準化化されているため、さまざまなデータベースを利用することができます。
有名なデータベースとしては、MySQL,PogreSQl、SQLiteなどがいずれもSQLで操作可能です。


#そもそもデータベースとは何か？

そもそもデータベースとは何なのか、について確認してみましょう。データベースとは、検索や蓄積が容易にできるよう整理された情報の集まりのこと（Wikipediaより引用しました）

#SQLの種類

SQLを使ってデータベースを操作する際に、覚えておきたい３つの種類を紹介したいと思います。

###データ操作言語（Data Manipulation Language）
略してDMLと呼ばれ、データベースに対してデータを追加・更新・削除などを行うためのSQL命令文です。
以下４つはDMLの中でも特に利用頻度が高いものなので、覚えておくと良いでしょう

* SELECT(データ検索)
* INSERT（データ追加）
* UPDATE（データ更新）
* DELETE（データ削除）


###データ定義言語（Data Definition Language）
略してDDLと呼ばれ、テーブルを作成・削除・設定を変更したりするためのSQL命令文です。
代表的なモノだと以下のようなものが存在します。

* CREATE（テーブル作成）
* ALTER（テーブル設定変更）
* DROP（テーブル削除）
* TRUNCATE（テーブルデータ削除）


###データ制御言語（Data Control Language）
略してDCLと呼ばれ、DMLや、DDLの利用を制御するためのSQL命令文です。
DMLやDDLと比べると利用頻度が下がりますが、こちらも覚えておいて損のない命令文です。
以下が代表的なDCLになります。

* GRANT（権限付与）
* REVOKE（権限剥奪）
GithubFlow 基本の流れ

#GithubFlow
1.ローカルブランチを最新にする
↓
2.作業ブランチを作成
↓
3.作業ブランチで作業を行う
↓
4.作業ブランチをコミット
↓
5.作業ブブランチをリモートにpush
↓
6.マージリクエストを出してマージする
↓
7.作業ブランチを削除

## 1.ローカルブランチを最新にする
```
git pull 
```
## 2.作業ブランチを作成
```
git switch　-c ブランチ名
```
## 3.作業ブランチで作業を行う
```
作業ブランチで開発、修正等を行う。
```
## 4.作業ブランチをコミット
```
git add 
git commit
```
## 5.作業ブランチをリモートにpush
```
git push origin 作業ブランチ名
```
## 6.マージリクエストを出してマージする
```
GitHub上でmain(master)にマージリクエストを行う。
```
## 7.作業ブランチを削除
```
リモートリポジトリとローカルリポジトリの作業ブランチを削除する
git branch -d ブランチ名
```

...１.に戻りローカルを最新にする。
VRC SDK3とUdonSharpの環境でIntaractを使ってオブジェクトのON OFFを切り替える

前提知識が以下のレベルでなんとなくVRC SDK3とUdonSharpを試してみた。
プログラミング : 少しできる。
Unity : VRChatの買ってきたアバターアップロードとかギミックがほとんどないワールド作るぐらい
C# : さわったことない
VRC SDK3 : さわったことない
## できたもの
ありふれたミラーのスイッチ。SDK2とやり方が結構違う。
![mirrorswitch.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332214/80ec0959-7916-9c4f-ece7-4951547cc6e9.gif)

## 環境
Unity : 2019.4.29f1
VRChat SDK : VRCSDK3-WORLD-2021.08.11.15.16_Public
UdonSharp : v0.20.2


## 環境作成
- Unityのインストール
    - 参照(https://keiki002.com/vr/vrc-unityver4/)
- VRCSDK3-WORLDのインポート
- [UdonSharp最新版](https://github.com/MerlinVR/UdonSharp/releases/tag/v0.20.2)のインポート


## 今回の例
CubeにIntaractしてミラーのONとOFFを切り替えられるようにする



## Unityエディタ上の操作
1. Assets > VRCHat Examples > Prefabs にある VRCMirror をScene上に設置する。
2. ミラーのスイッチとするキューブを作る
3. 作ったキューブにAdd Component で Udon Behaviour を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332214/76298c3b-1295-b182-48c2-f9cfbc27f80f.png)
3. Program Source が Udon C# Program Assetになっていることを確認し、 New Programをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332214/40f72997-ed02-c779-ac26-be66093866ec.png)
3. Create Scriptをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332214/e70489f7-0295-ab94-2cb9-103d247a4e0a.png)
3. スクリプトのファイルを保存
3. 作成したスクリプトに以下の内容を書き込む

~~~C#
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;

public class mirrorSwitch : UdonSharpBehaviour
{

    //publicの変数やオブジェクトはUnityエディタから直接アクセスできるように表示される
    public GameObject mirror;

    //public override void Interact() でオブジェクトにInteract時の処理を記述できる
    public override void Interact()
    {
       // SetActive(true)でオブジェクトを有効化
       // activeSelfには現在のオブジェクトの無効化か有効化の状態が格納されている
       mirror.SetActive(!(mirror.activeSelf));
    }

}

~~~

Unityエディタ上に戻ると自動でコンパイルされる。
Mirrorという項目が追加した Udon Behaviourコンポーネントにできているのでそこにシーン上に置いたVRCMirrorをドラッグアンドドロップする。
Interaction Textにはゲームプレイ時にキューブにカーソルを合わせたときに表示するメッセージを記述する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332214/60816095-cd25-79e7-a739-90254e40430b.png)
これで完成。


## 感想
UnityやVRCSDKで使えるオブジェクト等についての理解がないと何が使えるのかわからないのでつらい。
オブジェクト間のやり取りはpublicを用いてエディタ上でやるというのが前提知識がないと全然わからんかった。
【Java】ジェネリクスの型パラメータTでインスタンス化してみる

## 型パラメータのインスタンス化に関して
Javaでジェネリクスを使ったクラスやメソッドを、定義する時があると思います。定義の概要については[Java ジェネリクス（クラス、メソッドを定義する）](https://qiita.com/rodentia6/items/b36d134fa24867ba4d63)の記事をご参照頂ければと思います。
さて、このジェネリクスでの型パラメータの制約ですが、上記の記事にもある通り「new T()できない」や「new T[]できない」といった制約があります。つまり以下のようなコードはコンパイルでエラーとなります。

```java
class TypeParamTest<T> {
    public T tObject;
    TypeParamTest() {
        this.tObject = new T(); // コンパイルエラー
    }
}
```

[Javaのジェネリクスで，T.class や new T() ができず悩んだ話　（型パラメータのインスタンス化に関し、フレームワーク設計からケーススタディ）](https://language-and-engineering.hatenablog.jp/entry/20120502/p1)の記事にある通り、そもそもこういうケースは設計がイケてないという話なのですが、どうしてもやりたいというケースもあると思うので対応方法を少し調べてみました。

## 対応方法
[Instantiating object of type parameter](https://stackoverflow.com/questions/299998/instantiating-object-of-type-parameter)の記事に、いくつか対応方法が紹介されています。個人的には、Supplierで該当の型のコンストラクタを受け取って、それでインスタンス化するという方法が分かりやすくて良いかなと思いました。

## 実装サンプル
Supplierでコンストラクタを受け取る実装のサンプルです。

```java
package sample;

import java.util.function.Supplier;

class TypeParamTest<T> {
    public T tObject;
    TypeParamTest(Supplier<? extends T> ctor) {
        this.tObject =  ctor.get();
    }
}

public class TypeParamSample {
    public static void main(String[] args) {
        TypeParamTest<String> test = new TypeParamTest(String::new);
    }
}
```
LaravelでJSのAjaxを使って非同期通信を行う

#laravelでの基本的な非同期通信の仕方です。

ほぼ下記の記事の内容になりますが個人的な補足説明です。

参考記事
https://qiita.com/kakudaisuke/items/01816910b7b9ecba0486


流れ的にはviewにある値をjsに投げてajax通信で定義したroute-からcontrollerに値を飛ばして処理した内容をまたjsonでjsに返してあげます。





例

まずはdata-review-idの値をjsに投げます。

```php:index.blade.php 

  <td>
   <!--いいね-->
     @if (!$box->isLikedBy(Auth::user()))
       <span class="likes">
         <i class="fas fa-thumbs-up like-toggle" data-review-id="{{ $box->id }}"></i>
         <span class="like-counter">{{$box->likes_count}}</span>
       </span><!-- /.likes -->
      @else
       <span class="likes">
         <i class="fas fa-thumbs-up heart like-toggle liked" data-review-id="{{ $box->id }}"></i>
         <span class="like-counter">{{$box->likes_count}}</span>
         </span><!-- /.likes -->
      @endif
  </td>
```





data-review-idの値がlikeReviewIdに入ります。
そこから$.ajax内のdata:でPOSTでしてしたurlの/likeに飛ばします。
POSTの場合にはheaders:でcsrf対策をする必要がありますのでheader等で定義している

```php:app.blade.php
<meta name="csrf-token" content="{{ csrf_token() }}">
```

を入れてあげます。


```javascript:like.js 
  let like = $('.like-toggle'); //like-toggleのついたiタグを取得し代入。
  let likeReviewId; //変数を宣言（なんでここで？）
  like.on('click', function () { //onはイベントハンドラー
    let $this = $(this); //this=イベントの発火した要素＝iタグを代入
    likeReviewId = $this.data('review-id'); //iタグに仕込んだdata-review-idの値を取得
    //ajax処理スタート
    $.ajax({
      headers: { //HTTPヘッダ情報をヘッダ名と値のマップで記述
        'X-CSRF-TOKEN' : $('meta[name="csrf-token"]').attr('content')
      },  //↑name属性がcsrf-tokenのmetaタグのcontent属性の値を取得
      url: '/like', //通信先アドレスで、このURLをあとでルートで設定します
      method: 'POST', //HTTPメソッドの種別を指定します。1.9.0以前の場合はtype:を使用。
      data: { //サーバーに送信するデータ
        'review_id': likeReviewId //いいねされた投稿のidを送る
      },
    })
```



コントローラーで処理を行いreturn response()->json($param);で$paramで値をjsに返してあげます。

```php:LikeController.php 
public function like(Request $request){
        $u_id = Auth::user()->id; //1.ログインユーザーのid取得
        $box_id = $request->review_id; //2.投稿idの取得
        $already_liked = Like::where('u_id', $u_id)->where('box_id', $box_id)->first(); //3.
        
        if (!$already_liked) { //もしこのユーザーがこの投稿にまだいいねしてなかったら
            $like = new Like; //4.Likeクラスのインスタンスを作成
            $like->box_id = $box_id; //Likeインスタンスにreview_id,user_idをセット
            $like->u_id = $u_id;
            $like->save();
        } else { //もしこのユーザーがこの投稿に既にいいねしてたらdelete
            Like::where('box_id', $box_id)->where('u_id', $u_id)->delete();
        }

        //5.この投稿の最新の総いいね数を取得
        $review_likes_count = Box::withCount('likes')->findOrFail($box_id)->likes_count;
        $param = [
            'review_likes_count' => $review_likes_count,
        ];
        return response()->json($param); //6.JSONデータをjQueryに返す
    }
```

帰ってきた値がdataとして入ってくるため後は表示を変える処理を行います。

```javascript:like.js 
    //通信成功した時の処理
    .done(function (data) {
      $this.toggleClass('liked'); //likedクラスのON/OFF切り替え。
      $this.next('.like-counter').html(data.review_likes_count);
    })
    //通信失敗した時の処理
    .fail(function () {
      console.log('fail'); 
    });

```


#感想
最初はどうやってやるのか全く検討がつきませんでしたが想像していたものよりも簡単にできました。
swapファイルが起動して誠にテンパりました

# はじめに
swapファイルが起動して誠にテンパりました（おばか）ので、メモ。

#最終更新日
2021年8月23日

# 環境の情報
OS
ubuntu 20.04


# 経緯
ファイルを編集していたところ、誤って何かキーボードを押してしまったようで、変な状態で終了したかと思われます。


# 実際に 

swapファイルが起動したようです。
しかし、終わることが出来ません。

```
E325: ATTENTION
Found a swap file by the name "/etc/php/7.4/mods-available/.xdebug.ini.swp"
          owned by: root   dated: Fri Aug 13 07:34:36 2021
         file name: /etc/php/7.4/cli/conf.d/20-xdebug.ini
          modified: YES
         user name: root   host name: ubuntu2004.localdomain
        process ID: 1466 (STILL RUNNING)
While opening file "20-xdebug.ini"
             dated: Fri Aug 13 07:48:17 2021
      NEWER than swap file!

(1) Another program may be editing the same file.  If this is the case,
    be careful not to end up with two different instances of the same
    file when making changes.  Quit, or continue with caution.
(2) An edit session for this file crashed.
    If this is the case, use ":recover" or "vim -r 20-xdebug.ini"
    to recover the changes (see ":help recovery").
    If you did this already, delete the swap file "/etc/php/7.4/mods-available/.xdebug.ini.swp"
    to avoid this message.

Swap file "/etc/php/7.4/mods-available/.xdebug.ini.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort: 
```
↓

```
[O]pen Read-Only, →終わらない
(E)dit anyway, →終わらない
(R)ecover,→終わらない
(Q)uit,→終わらない
(A)bort: →終わらない
```

何を押しても、永遠に出てきてしまう状態になりました(´･ω･`)
ls -laで見ても見当たらず。（何故？！）

↓

```
ど゛う゛し゛て゛な゛ん゛だ゛よ゛お゛お゛ぉ゛お゛！゛！゛！゛
ん゛あ゛あ゛あ゛あ゛あ゛ぁ゛ぁ゛あ゛あ゛！゛！゛！゛！゛
```
↓
落ち着いて再起動してみました。
↓

```
vagrant@ubuntu2004:/etc/php/7.4/mods-available$ ls -la
total 104
drwxr-xr-x 2 root root  4096 Aug 13 07:54 .
drwxr-xr-x 5 root root  4096 Aug 13 02:55 ..
-rw-r--r-- 1 root root   279 Aug 13 07:54 xdebug.ini
-rw-r--r-- 1 root root 12288 Aug 13 07:59 .xdebug.ini.swp
```

しれっと出てきました。（なんだお前は）

↓

```
Swap file "/etc/php/7.4/mods-available/.xdebug.ini.swp" already exists!
"20-xdebug.ini" 10L, 278C
Using swap file "/etc/php/7.4/mods-available/.xdebug.ini.swp"
Original file "/etc/php/7.4/cli/conf.d/20-xdebug.ini"
E308: Warning: Original file may have been changed
E309: Unable to read block 1 from /etc/php/7.4/mods-available/.xdebug.ini.swp
```
↓
rmでさよならしました。ばいばい！元気でね！


# 参考さま
https://sukota.hatenablog.com/entry/2018/11/06/174859
UUB (Uniformly Ultimately Bounded) について

[論文](https://engineering.louisville.edu/wp-content/uploads/2020/05/LARRI_pub_Model-FreeOnlineNeuroadaptiveControllerWithIntentEstimationForPhysicalHuman%E2%80%93RobotInteraction.pdf)を読んでいて，UUB (Uniformly Ultimately Bounded) という有界性の指標が出てきたので勉強して理解したことをメモします．

## UUBの定義

$\exists{b, c}>0, a\in(0,c)$ とし，初期時刻 $t_0$ に依存しない $T=T(a,b)$ を用いて以下が成立するとき， $x$ はUUBであるという．
$$\parallel{x(t_0)\parallel}\leq{a}\Rightarrow\parallel{x(t)\parallel}\leq{b},\quad\forall{t}\geq{t_0+T}$$

## UUBのイメージ

Uniformly（一様に：初期時刻に非依存）+ Ultimately（最終的に：あるタイミングから（初めからである必要なし））+ Bounded（有界）

![image-20210823182549917](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696594/e4025e78-63bd-9854-50e8-5c7e336d31f9.png)

完全に0に収束するわけではないが，有限時間である0の近傍の領域内に収まりそこから永遠に抜け出すことはないというイメージ
（もし領域外に出ても，領域外では変数はノルムが単調減少する方向に変化するため，また領域内に入る）

注）

- $a<b$ のとき "uniformly bounded"（初めから満たしているので）
- $a$ が十分大きいと "globally" がつく
  - "globally" uniformly bounded 
  - "globally" uniformly ultimately bounded 

## UUBの具体例
次のノンオートノマス（ $\dot{x}=f(x,t)$において $f$ が $t$ の陽なる関数）な非線形システムの初期値問題を考える．

$$\dot{x}=-x+\delta \sin t, \quad x\left(t_{0}\right)=a>\delta>0$$

（このシステムは平衡点を持たない．）
リアプノフ関数 $V$ を次のようにおく．

$$V(x)=\frac{x^2}{2}$$

$t$ で微分すると

$$\dot{V}(x)=x \dot{x}=x(-x+\delta \sin t)=-x^{2}+\delta x \sin t \leq-x^{2}+\delta|x|=-|x|(|x|-\delta)$$

以上より

$$\dot{V}(x)<0, \quad \forall|x|>\delta$$

よって，領域 $B_\delta=\lbrace|x|\leq\delta\rbrace$ の外では $\dot{V}<0$となる．

ここで， $V$ は $x$ に関する最小値0の凸関数なので， $\dot{V}<0$ のとき $x$ は $|x|$ の値が減少する方向に単調に変化する．

すなわち，$x$ の初期値が $B_\delta$ の外にあった場合も有限時間で $B_\delta$ の内部に入り，以降 $B_\delta$ 内に留まり続ける．← (globally) UUB


実際MATLABで描画すると確かにglobally UUBである．

- $\delta=0.1,\quad x_0=10$
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696594/f119fff4-c001-e612-cf16-49526c9b077e.png" width="600">

- $\delta=5,\quad x_0=10$
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696594/822d8d74-102b-bc49-a3cd-5e2364039732.png" width="600">


<details><summary>コード</summary><div>

4次ルンゲクッタによる数値計算のコード

```solver.m
clear
syms t x(t);

d = 5;
t0=0;x0=10;te=100;n=10001;
t=linspace(t0,te,n);
x=zeros(1,n);
dt=(te-t0)/(n-1);
x(1)=x0;
for k=2:n
    k1=f(x(k-1),t(k-1),d);
    k2=f(x(k-1)+dt/2*k1,t(k-1)+dt/2,d);
    k3=f(x(k-1)+dt/2*k2,t(k-1)+dt/2,d);
    k4=f(x(k-1)+dt*k3,t(k-1)+dt,d);
    x(k)=x(k-1)+(k1+2*k2+2*k3+k4)/6*dt;
end
plot(t,x,'-');grid('on');
title(['Division Number= ',num2str(n-1)]);
xlabel('t');ylabel('x');

function dx = f(x,t,d) 
    dx = -x + d * sin(t);
end

```



</div></details>

## リアプノフの安定性解析を用いたUUBの示し方

- リアプノフ関数 $V$ を，UUBを示したい変数 $x$ に関する凸関数 $V(x)$ として定義
- $\dot{V}(x)<0$ を $x$ に関する[positive definite function](https://en.wikipedia.org/wiki/Positive-definite_function)（ノルム等）で上から抑えることで証明（成立条件付き可）



## リアプノフの意味の安定 (SISL[^1])とUUBの違い

- SISLは平衡点近傍で留まり続けることを保証するが，UUBは平衡点は無関係
  - UUBは単純に有界性を示すのみ
- SISLは平衡点近傍からスタートして平衡点近傍で留まり続けることを示さなければならず，これは未知の外乱等が存在する実機ではかなり厳しい要件
- UUBは平衡点や原点近傍からスタートする必要がない
  - UUBはSISLより"甘い"が実用的

[^1]: Stable In the Sense of Lyapnov

## 参考文献
- http://www.cds.caltech.edu/archive/help/uploads/wiki/files/218/CDS270-I_Lecture2.pdf
GitHubのIssuesとプルリクエストを使い、疑似チーム開発をする方法

#はじめに
railsチュートリアルを1周してみて、それを参考にポートフォリオを作り始めたのですが、どうやらGitHubで「疑似チーム開発」を行っていると後々役に立つそうなので、自分の記録用兼これからポートフォリオを作り始める方向けに手順を説明します。

###行う作業に対応するIsuuesを作成する
Issuesの「New issue」をクリックし、タイトルとコメントを書いて、「Submit new issue」でIsuueを作成する。
###先ほど作ったIsuueに対応するbranchを作成する
```git checkout -b ブランチの名前 ```　-bでトピックブランチを作成し、作成したブランチに移動
そして、そのブランチで行うべき作業をする。
###GitHubにpushする
作業が終わったら```git add -A```でファイルをリポジトリに追加し、```git commit -m "コメント"```でコミットし、最後に```git push origin HEAD```でGitHubにpushする。
###GitHubでプルリクエストを作成する
GitHubのプルリクエストの「Compare & pull request」をクリックし、タイトルとコメントを書いて「Create pull Request」をクリックする。
###プルリクエストをmaterブランチにmergeする
そして、「Merge pull request」をクリックし、「Confirm merge」をクリックすることで無事、maserブランチにプルリクエストをmergeすることができる。
最後に```git pull```でローカルにも変更を反映させてあげる。

#おわりに
この方法でポートフォリオを作っていきたいと思います。疑似チーム開発をによって、自然にやるべきタスクを考えて細分化するという癖がつくので初学者にとってもよい方法だと思いました。

参考
Ruby on Rails チュートリアル（第6版）/1.4Gitによるバージョン管理
cloudfrontのフィールドレベル暗号化とは

## 勉強前イメージ

フィールドレベルということはhttpの分野別の暗号化してるって感じ？

## 調査

### フィールドレベル暗号化 とは

cloudfrontの機能のフィールドレベル暗号化は
個人を特定できる情報などの機密データのセキュリティをより強化できるようになりました。
ユーザが決めたフィールド固有の暗号化キーを使用して、
リクエストがオリジンに転送される前にhttps内で機密データを更に暗号化します。

### フィールドレベル暗号化の設定

以下の手順でフィールドレベル暗号化を行います。

- 1. RSA キーペアの作成

フィールドレベル暗号化の前のパブリックキーの設定を行います。

- 2. パブリックキーを CloudFront に追加する

設定したパブリックキーをcloudfrontに追加します。

- 3. フィールドレベル暗号化のプロファイルを作成する

フィールドレベル暗号化のプロファイルで暗号化するフィールドの定義を行います。

- 4. 設定を作成する

特定のデータフィールドの暗号化に使用するプロファイルを指定します。
いろんなシナリオでオプションのを選択することもでき、
リクエストされたURLの引数で指定されたプロファイル名がcloudfrontに存在しない場合の動作も設定できます。

- 5. キャッシュ動作に設定を追加する

ディストーションのキャッシュ動作にリンクして、
いる暗号化するかの指定を行います。

## 勉強後イメージ

暗号化on暗号化的な感じ？
そんな単純なものじゃなくて特定の情報を追加に..って感じがする

## 参考

- [アマゾン ウェブ サービスのホームページに戻るには、ここをクリック
Amazon CloudFront でのフィールドレベル暗号化のご紹介](https://aws.amazon.com/jp/about-aws/whats-new/2017/12/introducing-field-level-encryption-on-amazon-cloudfront/)
- [フィールドレベル暗号化を使用した機密データの保護](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/field-level-encryption.html)
相対パスでimageファイルを参照できなかったのでimage-urlを使ってみた

# 実現したいこと
ヘッダーとフッターの背景に画像を挿入したい。
こんな感じ↓
![8d282698316537846d69fbcf999da008.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784617/341dfdcd-e96e-03eb-85c5-aa4be0d697ad.jpeg)


# 開発環境
- OS：macOS Big Sur 11.2.2
- Ruby：2.6.5
- Ruby on Rails：6.0.0
- Sass：3.7.4
- テキストエディタ：Visual Studio Code

# つまづいたこと
ヘッダー/フッターのCSSセレクタに

```app/assets/stylesheets/style.css
background-image: url("../images/checks.jpg");
```

と指定して、「checks.jpg」をapp/assets/imagesの配下に格納。
が・・・ページを読み込むと404 Not Foundエラーに。

試しに他の画像ファイルに置き換えてみたが変化なし。
「checks.jpg」をapp/assets/stylesheets配下に（cssファイルと同じところに）置いてみると正しく表示される。

パスが誤っているのかと思い、VScodeで参照して確かめてみるが正しい。しかし404エラーを辿ってみると全然違うところを参照し行っている模様。
少し前に誤ってapp/assets配下のファイル構成をいじくってしまったのが悪さをしているのか・・・結局原因はわからず。

# 解決方法
###SCSSのimage-urlに置き換えた。
学習中のカリキュラムの中にしれっと「image-url」という記述があったので調べてみた。
SaasというCSSを拡張し扱いやすくしたものがあり、image-urlを初めとした様々なヘルパーを利用できる。

利用したrailsのバージョンではSaasがプリセットされていたので早速CSSファイルからSCSSファイルへ拡張子を変更し（Saasの中でもよりCSSに近い書き方ができるSCSSを選択）、以下のようにコードを変更。

```app/assets/stylesheets/style.scss
background-image: image-url("checks.jpg");
```
すると問題なく画像が読み込みできた。
指定している場所としては同じなので不思議だが、やり方は一つではないということで勉強になった。

[Saasの解説はこちらを参考にしました](https://udemy.benesse.co.jp/design/web-design/sass.html)
pythonのdatetimeでファイル名を作成するとき

## 何これ？
Pythonのプロジェクトでファイルを保存するときに自動でファイル名を生成する処理をdatetimeライブラリでよく書くと思うが、いちいち調べるのがめんどくさいのでメモとしてまとめる。
ちなみに、日本時間JSTで出力できるようにしている。


## 実装

例えば、機械学習モデルを作成して保存する時に重複がないように秒数までdatetimeで生成してファイル名に含める。
今回は例えば、kerasでDeepLearningのモデルを生成したときに使うようなパターンで。
モデルやオブジェクトなどの保存は適宜変更ください。

```python
import keras
from hogehoge import fugafuga
...


def filename_time():
    # これは上にまとめた方がいいかも
    import datetime as dt
    import pytz

    # "20210711T111304"のような文字列が出力される
    return dt.datetime.now(pytz.timezone("Asia/Tokyo")).strftime("%Y%m%dT%H%M%S")


# data前処理
・・・
# 学習の層を構築
・・・
# kerasでモデルを学習
batch_size = 128
epochs = 15
validation_split = 0.2

model.fit(X_train, y_train_categorical, batch_size=batch_size, epochs=epochs, validation_split=validation_split, callbacks=[TensorBoard(log_dir="log")])

# モデルの保存
filename_time = filename_time()
model.save(f"/path/to/save/dir/model_name_{filename_time}.model")

```

終わり。
BNFCチュートリアル

字句解析/構文解析/ASTの生成までをやってくれるフレームワークBNFCを試してみた

BNF構文を書くだけで字句解析/構文解析/ASTの生成までをやってくれるらしい。

- 検証環境Debian11(bullseye)

```shell
$ sudo apt-get install haskell-stack
$ stack install BNFC
```
- PATH=$PATH:~/.local/bin にパスを通しておく

### BNFCを呼び出す

[BNF Converter Tutorial](http://bnfc.digitalgrammars.com/tutorial/bnfc-tutorial.html)

- バージョンが出れば成功

```shell
$ bnfc --version
2.9.2
```

- C++でlexer/parser/astを出力するには

```
$ bnfc -m -c       FILE.cf      # to generate C
$ bnfc -m -cpp_stl FILE.cf      # to generate C++ with STL
```

### 計算機

以下のファイルを用意する

```bnf:Calc.cf
    EAdd. Exp  ::= Exp  "+" Exp1 ;
    ESub. Exp  ::= Exp  "-" Exp1 ;
    EMul. Exp1 ::= Exp1 "*" Exp2 ;
    EDiv. Exp1 ::= Exp1 "/" Exp2 ;
    EInt. Exp2 ::= Integer ;

    coercions Exp 2 ;
```

コンパイル

```shell
$ bnfc -m -cpp_stl Calc.cf
$ make
```

お試し

```shell
$ echo "23 + 4 * 70" | ./TestCalc

Parse Successful!

[Abstract Syntax]
(EAdd (EInt 23) (EMul (EInt 4) (EInt 70)))

[Linearized Tree]
23 + 4 * 70 
```

やるじゃん
nuxt + typescriptのtransitionのv-onイベントでdatasetを追加した時のエラー

# コード
```ts
  beforeEnter(el: HTMLElement) {
    console.log(parseInt(el.dataset.index, 10))
  }
```



# エラー

```zsh
(property) HTMLOrSVGElement.dataset: DOMStringMap
Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
  Type 'undefined' is not assignable to type 'string'
```


死んだ、、、、

いろいろ調べた挙句、こうしたら解消した

```ts
  beforeEnter(el: HTMLElement) {
    console.log(parseInt(el.dataset.index as string, 10))
  }
```




その後気づいた。

# 結論
`parseInt`で数字と型推論されてたので、
エラーが出てたことに。。。

これで行けたやん。。。

```ts
  beforeEnter(el: HTMLElement) {
    console.log(Number(el.dataset.index))
  }
```


時間よおさらば
【AtCoder】ABC215をPython3で解説（ABCD）


ABC215のA-D問題の解説。

https://atcoder.jp/contests/abc215

## A - Your First Judge
### 解説

条件分岐の問題。
問題文のとおりに`if`を書いてあげると`AC`。

### コード

```python
s = input()

if s == 'Hello,World!':
    print('AC')
else:
    print('WA')
```

## B - log2(N)
### 解説

$2^k \leq N$となる最大の$k$を求める問題。

$k$に1ずつ足していき、$N$を超えたら、`break` でループを回す。

### コード
```python
n = int(input())
k = 0

while True:
    if 2 ** k > n:
        print(k-1)
        break

    k += 1
```

# C - One More aab aba baa
### 解説

文字列Sの各文字を並べ替えて、作成可能な文字列を辞書順にすべて列挙するというもの。
今回、最大値が$8!$なので、十分全探索できる数である。

Pythonでは、`itertools.permutations()`というライブラリ関数があるので、これを用いることでかんたんに実装することができる。

### コード
```python
from itertools import permutations

s, k = input().split()
k = int(k)-1
s = sorted(list(s))
ans = set()

for w in permutations(s):
    word = ''.join(w)
    ans.add(word)

ans = sorted(list(ans))
print(ans[k])
```

## D - Coprime 2

### 解説

$gcd(A_i, k) = 1$、つまり、互いに素数になる$k$を求めるという問題。

このとき、$A_i$の最大長が$10^5$なので、普通にやると間に合わないので、工夫が必要だ。

どのようにするかというと、2ステップある。

1. Aに含まれる素因数を全列挙
2. エラトステネスの篩的操作

まず、1についてだが、Aの数列の素因数を全列挙する。全列挙するのは、例えば、Aが3と互いに素であるものを判別したいときに、Aが`4, 6, 2`とする。このとき、`6`に3が素因数として含まれているので、これは条件を満たさない。したがって、1つでも何かの倍数となるものは予め取り除いておく必要がある。したがって、これに関するリストを先に作成する。

次に、2についてだが、エラトステネスの篩的操作をする。エラトステネスの篩というのは、例えば、1-100までの数字があったとして、1を除き、2から順番にその倍数を取り除いていき、素数を見つけるというものだ。くわしくはこちらの記事をみていだきたい。

https://club.informatix.co.jp/?p=13457

この操作はどのようにしていくかを解説する。まず、`ok`というリストにあらかじめ`True`をいれておく。つまり、値がまだリストに存在しているということだ。そしてそこに、先ほど求めた素因数をもちいてひとつずつみていく。m以下の整数で、素因数とその倍数を含むものをひとつずつ取り除いていくと、やがて、それ以外の数字が`True`として`ok`に存在することとなる。したがって、これらの整数がAと互いに素となる整数となる。

上記の説明をコードで書き記したものが以下のようになる。コードに解説も書いているので、デバッグなど行いながら少しずつ噛み砕いていただきたい。

### コード

```python
n, m = map(int, input().split())
nlist = [False]*100001
alist = map(int, input().split())

for a in alist:
    nlist[a] = True

dlist = []

# A全体の素因数を求める
for i in range(2, len(nlist)): # 2から順番に
    flag = False # flagの設定
    for j in range(i, len(nlist), i):
        if nlist[j]: # もしAのなかにiの倍数のものがあれば
            flag = True # フラグを立てる
    if flag: # Trueであれば、dlistに追加
        dlist.append(i)

ok = [True]*(m+1) # m以下の数値の保存場所

# エラトステネスの篩的操作
for d in dlist:
    for j in range(d, m+1, d): # m以下でdの倍数にあたるもののflagを壊していく
        ok[j] = False

cnt = 0

for i in range(1, m+1): # 出力する数、つまり、okのTrueの数をカウントして出力
    if ok[i]:
        cnt += 1

print(cnt)

for i in range(1, m+1): # okでTrueになっているところを出力
    if ok[i]:
        print(i)
```

## 編集後記
こんな解説記事書いていますが、今回に至ってはC問題も解けない阿呆になってました。（）
基本情報技術者試験勉強0823

本日の積み上げ結果
基本情報技術者試験勉強
平成26年春過去問
平成26年秋過去問
平成27年春過去問
間違えた問題の復習
AWSの本を読む

SCM 調達から販売までの複数の企業や組織にまたがる情報を統合的に管理することによって，コスト低減や納期短縮などを目的とする。

PCへの侵入に成功したマルウェアがインターネット上の指令サーバと通信を行う場合に，宛先ポートとしてTCPポート番号80が多く使用される理由　
　Webサイトの閲覧に使用されることから，通信がファイアウォールで許可されている可能性が高い。

リファクタリング　ソフトウェアの保守性を高めるために，外部仕様を変更することなく，プログラムの内部構造を変更する。

要求の分析・設計時に使用する状態遷移図の説明として，適切なもの　時間の経過や制御信号の変化などの，状態を変化させるきっかけと，変化に伴って実行する動作を記述する。

IPv6アドレスの特徴　複数のアドレス表記法があり，その一つは，アドレスの16進数表記を4文字(16ビット)ずつコロン":"で区切る方法である。

MDM 会社や団体が，自組織の従業員に貸与するスマートフォンに対して，セキュリティポリシに従った一元的な設定をしたり，業務アプリケーションを配信したりして，スマートフォンの利用状況などを一元管理する仕組み。

瑕疵(かし)担保責任　ソフトウェア開発を外部業者へ委託する際に，納品後一定の期間内に発見された不具合を無償で修復してもらう根拠となる項目として，契約書に記載するもの。

ヒューマンインタフェースの機能のうち，定型的な作業を頻繁に行う利用者の操作数を少なくする目的で用いるもの　一連のコマンドをひとまとめにしたマクロ機能。

モーションキャプチャ　アニメーションの作成過程で，センサやビデオカメラなどを用いて人間や動物の自然な動きを取り込む技法はどれか。

オプティマイザ　SQL文を実行する際に，効率が良いと考えられるアクセス経路を選択する関係データベース管理システム(RDBMS)の機能。

開発計画　システム管理基準において，情報システムの費用，スケジュール，開発体制，投資効果などを明確にする計画はどれか。

労働者派遣における派遣元の責任　派遣先での時間外労働に関する法令上の届出。

アクセス管理機能の検証　システム管理基準に基づいて，システムの信頼性，安全性，効率性を監査する際に，システムが不正な使用から保護されているかどうかという安全性の検証項目として，最も適切なもの。

ポートスキャナ　Webサーバで稼働しているサービスを列挙して，不要なサービスが稼働していないことを確認する。

ディレクトリトラバーサル攻撃　パス名を含めてファイルを指定することによって，管理者が意図していないファイルを不正に閲覧する。

リスクアセスメント　損失額と発生確率の予測に基づくリスクの大きさに従うなどの方法で，対応の優先順位を付ける。

関係を第3正規形まで正規化して設計する目的　冗長性を排除することによって，更新時異状を回避する。

加減乗除を組み合わせた計算式の処理において，スタックを利用するのが適している処理　計算の途中結果を格納し，別の計算を行った後で，その計算結果と途中結果との計算を行う処理

バランススコアカード　財務，顧客，内部ビジネスプロセス，学習と成長の四つの視点ごとの課題，施策，目標の間の因果関係を表現したもの。

WAF(Web Application Firewall)を利用する目的　Webサーバ及びアプリケーションに起因する脆(ぜい)弱性への攻撃を遮断する。

NTP  TCP/IPのネットワークにおいて，サーバとクライアント間で時刻を合わせるためのプロトコル。

バリューチェーン分析　企業の事業活動を機能ごとに主活動と支援活動に分け，企業が顧客に提供する製品やサービスの利益は，どの活動で生み出されているかを分析する手法。

FTP TCP/IPネットワークで，データ転送用と制御用に異なるウェルノウンポート番号が割り当てられているプロトコル。

オーバライド　多相性を実現するときに，特有のもの。

システムの費用を表すTCO(総所有費用)の意味　システム導入から運用及び維持・管理までを含めた費用の総額。

桁落ち　値がほぼ等しい浮動小数点数同士の減算において，有効桁数が大幅に減ってしまうことである。

クライアントサーバシステムにおいて，クライアント側からストアドプロシージャを利用したときの利点として，適切なもの　クライアントとサーバ間の通信量を削減できる。

平均サービス回復時間　ITILでは，可用性管理における重要業績評価指標(KPI)の例として，保守性を表す指標値の短縮を挙げている。この指標に該当するもの。

テクスチャマッピング　物体の表面に画像を貼り付けることによって，表面の質感を表現する。

再入可能プログラム　複数のタスクからの呼出しに対して，並行して実行されても，それぞれのタスクに正しい結果を返す。

刑法　他人が作成したウイルスを発見し，後日これを第三者のコンピュータで動作させる目的で保管した。

ITに係る内部統制を評価し検証するシステム監査の対象となるもの　販売部が行っているデータベースの入力・更新における正確性確保の方法。

共通フレームによれば，企画プロセス　経営・事業の目的，目標を達成するために必要なシステムに関係する経営上のニーズ，システム化，システム改善を必要とする業務上の課題などの要求事項。

AES データベースで管理されるデータの暗号化に用いることができ，かつ，暗号化と復号とで同じ鍵を使用する暗号化方式。

DBMSが，3層スキーマアーキテクチャを採用する目的として，適切なもの　データの物理的な格納構造を変更しても，アプリケーションプログラムに影響が及ばないようにする。

キュー　最初に格納されたデータが最初に取り出される。

コンカレントエンジニアリング　製品開発において，設計，生産計画などの工程を同時並行的に行う手法。
【エラー備忘録】laravelコマンドを使用するためのパスを通す　-bash: laravel: command not found

##状況
laravelをインストールし、プロジェクトを作成しようと以下のコマンドを実行したところ、エラーに。

```
$ laravel new laravel_app
```

####エラー文

```
-bash: laravel: command not found
```

##原因

パスが通っていないため、コマンドが見つからないという状況が起きている。

* **PATHとは**
環境変数。実行ファイル（アプリケーション）の格納場所をメモしたもの。

* **「PATHを通す」の意味**
特定のプログラムを、フルパスを指定しなくても、プログラム名だけで実行できるようにすること。

##対処方法

以下のコマンドを実行すると、PATHが通る。

```
$ export PATH=$HOME/.composer/vendor/bin:$PATH
```
※exportコマンドは、環境変数を表示・設定するコマンド。


変更状態を反映させるため、続けてsourceコマンドも実行する。

```
$ source ~/.bash_profile
```
これでlaravelコマンドが使えるようになる。


<br>
・・・と思ったが、問題発生。
ターミナルを一度閉じて再度起動すると、またlaravelコマンドが使えなくなっている。

.bash_profileに、通したいPATHを直接記入しておく必要があるらしい。

<br>

「.bash_profile」をターミナル上で開く。

```
$ vi ~/.bash_profile
```

iと入力して入力モードに移行し、以下を書き込む。

```
export PATH=$PATH:~/.composer/vendor/bin
```
escで入力モードを終了し、:wで保存、:qでviエディタを終了する。


.bash_profileを更新する。

```
$ source ~/.bash_profile
```

これで、ターミナルを一旦閉じて再度起動しても、どこからでもlaravelコマンドが使えるようになりました。
UITabBarController  カスタム　復習

#今回の内容
<img width="150" alt="3F023247-7BA7-4C4C-A930-3F264ADFDE89_1_201_a.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/18f42522-af51-5945-1c5d-807dd7ed6508.jpeg"> 

#コードと簡単解説

* Main.storyboardで`TabBarController`を作成します。

* Main.storyboardでTabBarItemの画像などを設定しておきます。

##全てのコード

* `tabBar.unselectedItemTintColor`は未選択アイコンの色を設定しています。

* `override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {}`内で、アイコン画像が`UIImage(systemName: "arrow.up.and.down.circle")`の時はtabBarを画面から見えない位置まで下げます。そして、2秒後に元の位置に戻る様にしています。

```Swift:TabBarController
import UIKit

class TabViewController: UITabBarController,UITabBarControllerDelegate {

    
    override func viewDidLoad() {
        super.viewDidLoad()

        tabBarController?.delegate = self
        
        tabBar.barTintColor = .systemIndigo
        tabBar.unselectedItemTintColor = .white
        tabBar.tintColor = .systemGreen
        
        tabBar.layer.borderWidth = 1.0
        tabBar.layer.borderColor = UIColor.systemGreen.cgColor
        
        tabBar.layer.cornerRadius = 45.0
        tabBar.layer.masksToBounds = true
        
        
        
    }
    
    override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {

        if item.selectedImage == UIImage(systemName: "arrow.up.and.down.circle") {

            UITabBar.animate(withDuration: 0.5, delay: 0, options: .curveEaseInOut, animations: {self.tabBar.frame.origin.y = self.tabBar.frame.origin.y + self.tabBar.frame.size.height}, completion: nil)

            DispatchQueue.main.asyncAfter(deadline: .now() + 2) {

                UITabBar.animate(withDuration: 0.5, delay: 0, options: .curveEaseInOut, animations: {self.tabBar.frame.origin.y = self.tabBar.frame.origin.y - self.tabBar.frame.size.height}, completion: nil)

            }

        }

      }
      
}
```
#終わり
ご指摘、ご質問などありましたら、コメントまでお願い致します。
macOS アプリ開発 tint color の変更

# 環境
- M1 MacBook Pro
- macOS Big Sur 11.5.2
- Xcode 12.5.1

### 問題
iOS で UIKit の tint color を変更するのは容易だが、macOS では tintColor のプロパティがない。。

### 結論
アプリ全体の `AccentColor` を変更するしかなさそう。

`① Assets.xcassets`
`② AccentColor`
`③ Universal を選択状態にする`
`④ Content から色を設定` 
![スクリーンショット_HOGE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1289687/d679615d-1f2d-0e4f-b6c3-e3321dd4eb81.png)
![スクリーンショット 2021-08-23 21.31.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1289687/1bcfb4a6-61b9-ac79-6934-fd71ea3ada34.png)
![スクリーンショット 2021-08-23 21.46.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1289687/41726dd7-9aa3-8f99-280f-0d2e169f756e.png)

### 注意点
- Mac の [設定] -> [一般] でアクセントカラーを固定している場合は反映されません。  

[Apple 公式ドキュメント accentColor](https://developer.apple.com/documentation/swiftui/color/accentcolor)  

```
Note

In macOS, SwiftUI applies customization of the accent color only if the user chooses Multicolor under General > Accent color in System Preferences.

```
Laravel Factoryで範囲指定のあるダミーデータを作成

いつからいつまでとか、◯◯のうちいずれか等、範囲指定のあるダミーデータを作成する。

## Fakerを日本語化する
```config/app.php
'faker_locale' => 'ja_JP', 
```
ダミーデータに日本語が含まれる場合はapp.phpの`faker_locale`を日本語にする。

## Factoryを作成する
```
% php artisan make:factory RecordFactory --model=Record
```
ファクトリを作成する。
モデルを指定しておけば、ファクトリファイルに`use App\Models\モデル名;`が自動で書き足される。


## ファクトリファイルを編集（Fakerを使用）
```database/factories/RecordFactory.php
use App\Models\Record;
use Illuminate\Database\Eloquent\Factories\Factory;
.
.
.
    public function definition()
    {
        return [
            //
            'date' => $this->faker->dateTimeBetween($startDate = '-3 week', $endDate = 'now'), //追記
            'sum' => $this->faker->randomElement([180,150,120,90,60,30,15]), //追記
            'subject' => $this->faker->randomElement(['国語','数学','英語','国語,数学','国語,英語','国語,数学,英語','数学,英語']), //追記
            'user_id' => $this->faker->numberBetween(1,3), //追記
        ];
    }
```

数字の範囲指定は`numberBetween`、日付の範囲指定は`dateTimeBetween()`、◯◯のうちいずれか、という選択は`randomElement([])`を使用する。

## DatabaseSeeder.phpを編集する
```database/seeders/DatabaseSeeder.php
    public function run()
    {
        // \App\Models\User::factory(10)->create();
        //Recordモデルを使って15個のデータを登録する
        \App\Models\Record::factory(15)->create(); //←ここ追記
    }
```

## php artisan db:seedを実行する。
```
% php artisan db:seed
```
これで範囲指定のあるダミーデータ作成ができる。
色々な会社のエンジニア向け新人研修資料

#はじめに

最近は色々な企業がエンジニア向けの新人研修資料を公開しています。
基本は自分用の備忘録です。
※気がついた時に更新する程度なので、最新版などをお求めの方は別途調べてもらえるとmm

#資料リンク
##株式会社リクルート
[株式会社リクルート　エンジニアコース新人研修の内容を公開します！（2021年度版）](https://recruit-tech.co.jp/blog/2021/08/20/recruit-bootcamp-2021/)

##サイボウズ株式会社
[2021年のエンジニア新人研修の講義資料を公開しました](https://blog.cybozu.io/entry/2021/07/20/100000)

##株式会社ミクシィ
[ミクシィの21新卒技術研修の資料と動画を公開します！](https://mixi-developers.mixi.co.jp/21-technical-training-a0bcdbf9bca0)

##株式会社サイバーエージェント
[新卒エンジニア研修の講義資料を公開！技術力も圧倒的に成長するチーム開発研修とは](https://developers.cyberagent.co.jp/blog/archives/30024/)

##GMOペパボ株式会社
[ペパボの新卒研修で利用した資料を公開します](https://tech.pepabo.com/2020/09/09/newbie-training-2020/)

##東京大学
[Pythonプログラミング入門](https://sites.google.com/view/ut-python/resource/%E6%95%99%E6%9D%90%E8%AC%9B%E7%BE%A9%E5%8B%95%E7%94%BB)

##京都大学
[プログラミング演習 Python 2019](https://repository.kulib.kyoto-u.ac.jp/dspace/handle/2433/245698)

##筑波大学大学院 システム情報系 情報工学域教授 三谷純氏
[Python ゼロからはじめるプログラミング](https://mitani.cs.tsukuba.ac.jp/book_support/python/)

##Amazon
[セキュリティオンライントレーニング](https://learnsecurity.amazon.com/)
AtCoderログ：0090 - ABC 215 A

# 問題

https://atcoder.jp/contests/abc215/tasks/abc215_a

## 問題文
> 文字列 $S$ が与えられるので、この文字列が Hello,World! と完全に一致するなら AC 、そうでないなら WA と出力してください。

## 制約
> ・$1 \le |S| \le 15S は英大小文字, ,, ! のみからなる

# 回答
## 回答1 (AC)
文字列を読み込んで、それが "Hello,World!" という文字列と等しければ AC, 等しくなければ WA を出力すれば良いでしょう。コードは以下のようになりました。

```C++:abc215a-1.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  string s;
  cin >> s;
  
  if ( s=="Hello,World!" ) {
    cout << "AC" << endl;
  } else {
    cout << "WA" << endl;
  }
}
```

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc215/tasks/abc215_a/editorial) → [公式解説](https://atcoder.jp/contests/abc215/editorial/2479)
回答1と同じ方針でした。

## [AtCoder の解説](https://atcoder.jp/contests/abc215/tasks/abc215_a/editorial) → [ユーザ解説](https://atcoder.jp/contests/abc215/editorial/2520)
COBOL による実装例が紹介されていますが、残念ながら COBOL は全くわかりませんでした。

# リンク
## 前後の記事
- 前の記事 → [AtCoderログ：0089 - ABC 215 に参加しました](https://qiita.com/RoadLynton/items/60ad97a2ca8b24a446e9)
UnityのSceneビューでドラックして設定した回転方向（local）とInspectorの値を一致させる方法

#問題：
Unityで3Dオブジェクトを回転させるときにSceneビューで赤青緑の線をマウスでドラックすると，任意の方向に回転（local座標）させることができます．
一方，1軸のみの回転を行っているのに関わらず，Inspectorの値はXYZの3つの値が変化します．
これは，オイラー座標の回転順序に起因する問題です．
UnityはZXYの順序でオブジェクトを回転させています．
しかし，Sceneビューで回転させる場合，指定したい角度に設定することが困難です．

#解決法1：
回転順序の逆順でInspectorで回転させると，Sceneビューでの回転軸と対応します．
具体的には，
Y軸，X軸，Z軸の順でInspectorで回転させると一致します．（Unityでの回転順序（ZXY）の逆順）

#解決法2:
最初にX軸を回転させてから他の軸を回転させたい場合があります．
その場合はScriptで順序を指定しましょう．
例えば，X軸，Y軸，Z軸の順で回転させたい場合，TypeをZYXに設定します．

Script参考元
https://light11.hatenadiary.com/entry/2019/01/24/223705

```cs:rot.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class rot : MonoBehaviour
{
	public enum RotationType
	{
		ZXY,
		ZYX
	}
	
	[SerializeField, Range(-180, 180)] private float _x;
	[SerializeField, Range(-180, 180)] private float _y;
	[SerializeField, Range(-180, 180)] private float _z;

	[SerializeField] private RotationType _type;
	
	private void Update()
	{
		// X軸回転
		var rotX = Quaternion.AngleAxis(_x, new Vector3(1, 0, 0));
		// Y軸回転
		var rotY = Quaternion.AngleAxis(_y, new Vector3(0, 1, 0));
		// Z軸回転
		var rotZ = Quaternion.AngleAxis(_z, new Vector3(0, 0, 1));

		var quaternion = Quaternion.identity;

		if (_type == RotationType.ZXY)
		{
			quaternion = rotY * rotX * rotZ;
		}
		else if (_type == RotationType.ZYX)
		{
			quaternion = rotX * rotY * rotZ;
		}
		transform.rotation = quaternion;
	}
}
```

#注意：
今回はオイラー角を用いることで生じる問題の一つであるジンバルロックを考慮しないものとします．
ジンバルロックについてはこちらの動画や他サイトを参照してください．
<iframe width="400" height="300" src="https://www.youtube.com/embed/zc8b2Jo7mno" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

####修正ログ：
2021/08/23：自身の備忘録用に簡単にまとめた

####Todo：
数学的な説明
図の挿入
JUnitでIOExceptionをテストする方法

Javaでファイルの出力を行うクラスを作成して、JUnitのテストを作成するときに、IOExceptionが発生するテストを実施する必要があります。IOExceptionを発生する方法を調べましたので、ここでそのやり方を説明します。

以下のファイル出力クラスを例として説明します。

```java
public class FileIOExample {
    public boolean writeFile() {
        File file = new File("c://temp//a.txt");

        try (OutputStream outstream = new FileOutputStream(file)) {
            String data = "text to write\n";
            outstream.write(data.getBytes()); // ①
            return true;
        } catch (IOException ex) {
            ex.printStackTrace();
            return false;
        }
}
```
ファイルをオープンして出力する簡単なクラスですが、①の所でIOExceptionを発生させるテストケースを作成したい場合、以下のようにテストケースを記述します。

```java
public class FileIOExampleTest {
    @Test
    public boolean writeFileTestForIOException() {

        File file = new File("c://temp//a.txt");
        try(RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw")){
            // lock file
            FileChannel channel = randomAccessFile.getChannel();
            FileLock tryLock = channel.lock();

            // テストの実行
            FileIOExample fileIOExample = new FileIOExample();
            boolean ret = fileIOExample.writeFile();
            // 戻り値の確認
            assertFalse(ret);

            // release lock
            tryLock.release();
        }catch(IOException ex) {
            ex.printStackTrace();
            fail();
        }
    }
}
```

ここでのポイントは、ファイルをRWモードでオープンしてロックしても、new FileOutputStream(file)でファイルをオープンできるところです。その後のoutstream.write()の呼び出しで、ロックを検知したため、IOExceptionがスローされます。

また、テスト対象クラスでファイルを先にオープンして、テストコードでロックをかけることもできます。outstream.write()メソッドが実行される前に、ファイルをロックする必要があるため、Mockitoのモッククラスが利用します。モッククラスの戻り値を設定するテストコードにMockito.doAnswer()メソッドを利用します。doAnswer()メソッドで、戻り値を返す前に、ファイルにロックをかけるコードを記述できます。
Unity(iOS)で ローカルネットワーク上のデバイスの検索および接続を求めています。 って出ても気にすんな

# tl; dr
- Development builds of the Player contain the PlayerConnection class that allows remote debugging and other things across the local network. **This is expected behaviour**, and PlayerConnection is not used on release builds.
- https://issuetracker.unity3d.com/issues/ios-pop-up-message-would-like-to-find-and-connect-to-devices-on-your-local-network-appears-when-app-is-launched-on-ios-14

# 要は
少なくとも `Development build` が有効だと出ます。無効にしても出る場合はサードパーティーのプラグインなどを疑ってみてください。
コンテナで稼働しているzabbix server本体の監視をlocal agentでやりたい時の注意点

```
$ docker ps
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                              NAMES
************        ZabbixServer   "/sbin/tini -- /usr/…"   1 months ago        Up 21months         0.0.0.0:10051->10051/tcp           zabbix-server
```

```
$ systemctl status zabbix-agent.service
● zabbix-agent.service - Zabbix Agent
   Loaded: loaded (/usr/lib/systemd/system/zabbix-agent.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2021-08-23 14:38:15 JST; 6h ago
  Process: 2427 ExecStop=/bin/kill -SIGTERM $MAINPID (code=exited, status=0/SUCCESS)
  Process: 2429 ExecStart=/usr/sbin/zabbix_agentd -c $CONFFILE (code=exited, status=0/SUCCESS)
 Main PID: 2459 (zabbix_agentd)
    Tasks: 6
   Memory: 4.8M
   CGroup: /system.slice/zabbix-agent.service
           ├─2459 /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
           ├─2463 /usr/sbin/zabbix_agentd: collector [idle 1 sec]
           ├─2464 /usr/sbin/zabbix_agentd: listener #1 [waiting for connection]
           ├─2465 /usr/sbin/zabbix_agentd: listener #2 [waiting for connection]
           ├─2466 /usr/sbin/zabbix_agentd: listener #3 [waiting for connection]
           └─2468 /usr/sbin/zabbix_agentd: active checks #1 [idle 1 sec]

Aug 23 14:38:15 zbx-server001 systemd[1]: Starting Zabbix Agent...
Aug 23 14:38:15 zbx-server001 systemd[1]: PID file /run/zabbix/zabbix_agentd.pid not readable (yet?) after start.
Aug 23 14:38:15 zbx-server001 systemd[1]: Started Zabbix Agent.
```

状況はこんな感じ。
zabbix-server側からzabbix-agentに接続する時の接続元IPが異なっている場合、そのIPも入れてやらないといけない。
今回でいうと

zabbix-agent.confのserverのIPを
・local IP
・コンテナ内のsubnet
・127.0.0.1

以上3つ記載。

```
##### Passive checks related

### Option: Server
#       List of comma delimited IP addresses, optionally in CIDR notation, or DNS names of Zabbix servers and Zabbix proxies.
#       Incoming connections will be accepted only from the hosts listed here.
#       If IPv6 support is enabled then '127.0.0.1', '::127.0.0.1', '::ffff:127.0.0.1' are treated equally
#       and '::/0' will allow any IPv4 or IPv6 address.
#       '0.0.0.0/0' can be used to allow any IPv4 address.
#       Example: Server=127.0.0.1,192.168.1.0/24,::1,2001:db8::/32,zabbix.example.com
#
# Mandatory: yes, if StartAgents is not explicitly set to 0
# Default:
# Server=

Server=〈ココ〉
```

コンテナ内のsubnetを確認する方法は以下
lsで対象のネットワークを確認して、

```
$ docker network ls
$ docker network inspect 〈コンテナID〉
```

inspectの実行結果の中からコンテナのsubnetを確認できる。
今回だと172.15.0.0/16

```
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.15.0.0/16",
                    "Gateway": "172.15.0.1"
                }
            ]
```

最終的に

```
Server= local IP,172.15.0.0/16,127.0.0.1
```

これでコンテナのzabbix serverとlocalのagentと疎通ができる。