OmniAICreator/Qiita-1.07M huggingface dataset:
【Java】Spring BootでWebアプリ開発するためのサンプルプロジェクト

Java(Spring Boot)を使ってWebアプリ開発を進める際のテンプレートです。
下記にサンプルプロジェクトを作りました。
https://github.com/hrk-okd/spring-sample

# ソースコードの説明

## 作成環境
- Windows 10
- jdk-12.0.1
- IntelliJ IDEA Community Edition 2019.1.3 x64

## ソース作成の思想
サンプルなので思想というほどのものではありませんが、一点だけ意識して書いたのは「コンストラクタインジェクション」でDIする方法を採用していることです。

## サンプルプロジェクトのライブラリ構成
サンプルプロジェクトのライブラリは以下の通りです。

＜引用元＞
https://github.com/hrk-okd/spring-sample/blob/0710e4585767eb3dc260054b57d7607a9543bb60/spring-mvc/build.gradle#L18-L44


```gradle
dependencies {
    // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot
    compile group: 'org.springframework.boot', name: 'spring-boot', version: '2.1.6.RELEASE'
    // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter
    compile group: 'org.springframework.boot', name: 'spring-boot-starter', version: '2.1.6.RELEASE'
    // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.1.6.RELEASE'

    // https://mvnrepository.com/artifact/org.projectlombok/lombok
    compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.8'

    // junit 5
    // https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine
    testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.5.1'

    // mockito 全般
    // https://mvnrepository.com/artifact/org.mockito/mockito-core
    testCompile group: 'org.mockito', name: 'mockito-core', version: '3.0.0'

    // mockito ExtendWith
    // https://mvnrepository.com/artifact/org.mockito/mockito-junit-jupiter
    testCompile group: 'org.mockito', name: 'mockito-junit-jupiter', version: '3.0.0'

    // mockito assertThat().isEqualTo
    // https://mvnrepository.com/artifact/org.assertj/assertj-core
    testCompile group: 'org.assertj', name: 'assertj-core', version: '3.13.0'
}

```

### spring-boot/spring-boot-starter/spring-boot-starter-web
基本のライブラリです。
Spring Bootを使用するなら、深く考えずに入れておきましょう。
Webアプリケーションを作らない場合、spring-boot-starter-webは除外しても問題ないでしょう。|

### lombok
クラスやメソッドに `@Getter` や `@Setter` のアノテーションを付けることによって、getterやsetterを書く必要がなくなります。これは本当に便利です。

現場によっては余計なプラグインはインストールするなというところもあるでしょう。
でも、僕個人としては、開発効率UPのために全現場で導入必須と考えています。

### junit-jupiter
こちらはJUnit5に対応するためのライブラリです。JUnit4で使いにくかった点が改善されているので、可能ならばこちらに対応しておくのが良いでしょう。

### mockito-core/mockito-junit-jupiter
mockitoはユニットテストで使用するライブラリで、モックを使用することが可能です。モックのライブラリもいくつかありますが、僕が現場で知って良いと思ったので、こちらを取り込んでいます。

mockito-junit-jupiterは入れなくてもモックを使用することは可能です。ただし、このライブラリで使用できる `@ExtendWith` アノテーションを使用すると、フィールドにアノテーションを付けることでモックを作ることが可能。
テストコードの手間も削減できます。

### assertj-core
こちらもユニットテストで使用するライブラリで、検証用のメソッドassertとそれに関するメソッドが豊富に揃えられています。
通常のJUnitでは書きにくい内容も楽に検証することが可能です。

# まとめ
Spring Bootで開発を行うためのサンプルプロジェクトを用意しました。

実際に開発を行う上ではもっと多くのライブラリが必要になると思いますが、ミニマムから構成して徐々に機能を追加していくには、こういったサンプルを用意しておいた方が良いでしょう。

近年はgithubの台頭もあり、個人でも多くのリポジトリを持てるし公開することも可能。
会社でリポジトリが用意されると思いますが、個人のリポジトリもあらかじめ用意して、必要な情報を素早く取り出せるようにしておくのが良いですね。

客先常駐型のエンジニアは、自分のPCは持ち込めない現場が多いですが、githubのソース取得を制限されることは稀です。
自分が気持ち良く仕事ができるようにしておく上でも、情報をまとめたソースをアップしておきましょう。
[C++/CLI] キャリブレーション

```CPP
#pragma once

#ifdef _DEBUG
#pragma comment(lib, "..\\build\\x64\\vc15\\lib\\opencv_world440d.lib")
#else
#pragma comment(lib, "..\\build\\x64\\vc15\\lib\\opencv_world440.lib")
#endif

#include "opencv2\opencv.hpp"
#include <vector>

using namespace System;

using namespace std;
using namespace cv;

namespace OpenCvCppLib {
	public ref class OpenCvCppClass
	{
	public:
		int Calibrate()
		{
			auto gray = imread(".\\dot_Bobbin_img.png", IMREAD_GRAYSCALE);

			Size patternSize(18, 13);
			vector<Point2f> centers;
			auto found = findCirclesGrid(gray, patternSize, centers, CALIB_CB_SYMMETRIC_GRID);

			Mat points_img;
			cvtColor(gray, points_img, COLOR_GRAY2BGR);
			drawChessboardCorners(points_img, patternSize, centers, true);

			imshow("points", points_img);
			waitKey(0);

			int left_margin = 26;
			int top_margin = 18;
			int interval = 44;

			vector<Point3f> object_point;
			for (int j = 0; j < patternSize.height; j++)
			{
				for (int i = 0; i < patternSize.width; i++)
				{
					object_point.push_back(Point3f(left_margin + i * interval, top_margin + j * interval, 0));
				}
			}
			
			vector<vector<Point3f>> object_points;
			vector<vector<Point2f>> image_points;
			
			object_points.push_back(object_point);
			image_points.push_back(centers);

			auto imageSize = Size(points_img.cols, points_img.rows);

			vector<Mat> rvecs, tvecs;
			Mat_<double> cameraMatrix(3, 3); // CV_64F
			Mat_<double> distCoeffs(8, 1); // CV_64F
			calibrateCamera(object_points, image_points, imageSize, cameraMatrix, distCoeffs, rvecs, tvecs);

			Size newImageSize;
			Rect validPixROI;
			auto newCameraMatrix = getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, 1, newImageSize, &validPixROI);

			//
			auto data = imread(".\\dot_Bobbin_img.png", IMREAD_GRAYSCALE);

			Mat temp_img;
			undistort(data, temp_img, cameraMatrix, distCoeffs, newCameraMatrix);

			Mat rotation;
			Rodrigues(rvecs[0], rotation);

			Mat_<double> transRot(3, 3); // CV_64F
			rotation.col(0).copyTo(transRot.col(0));
			rotation.col(1).copyTo(transRot.col(1));

			Mat translate = (Mat_<double>(3, 3) << 0, 0, tvecs[0].at<double>(0), 0, 0, tvecs[0].at<double>(1), 0, 0, tvecs[0].at<double>(2));
			translate.col(2).copyTo(transRot.col(2));

			Mat dst_img;
			auto m = newCameraMatrix * transRot;
			warpPerspective(temp_img, dst_img, m, newImageSize, WARP_INVERSE_MAP);
			
			imshow("temp", temp_img);
			waitKey(0);

			imshow("dest", dst_img);

			return 0;
		}
	};
}
```

![dot_Bobbin_img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662099/e5caaa61-fe74-386c-0ae9-b63b2bb61dcf.png)

[[C#/OpenCvSharp] キャリブレーション](https://qiita.com/u4xi/items/f7d6989a49c7dad7e1ae)
TerraformでSet of objectsをfor_eachとfor式で走査する

## 問題

[aws_acm_certificate.domain_validation_options](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/acm_certificate#domain_validation_options)は、v2系のProviderでは `A list of attributes ~` とのことでリストが返却されていましたが、v3系では `Set of domain validation objects ~` の示すようにオブジェクトのセットが返却されるようになり、 [こちら](https://qiita.com/y-ohgi/items/b823b6bd078ce8e11546)の記事などで紹介されているように、リストとしてそのまま走査して値を設定することができなくなった模様です

一般的なプログラミング言語と同様、セットは順序を持たないから走査できない...的な考え方からでしょうか？

```tf:domain_validation_optionsのイメージ
Outputs:

domain_validation_options = [
  {
    "domain_name" = "example.com"
    "resource_record_name" = "_xxxxx.example.com."
    "resource_record_type" = "CNAME"
    "resource_record_value" = "_yyyyy.zzzzz.acm-validations.aws."
  },
]
```


```text:エラーのイメージ
Error: Invalid index

  on ./xxx/route53-record.tf line 17, in resource "aws_route53_record" "domain_validation":
  17:   name    = lookup(aws_acm_certificate.example.domain_validation_options[count.index], "resource_record_name")
    |----------------
    | aws_acm_certificate.example.domain_validation_options is set of object with 1 element
    | count.index is 0

This value does not have any indices.
```

## 解法

これについて、Terraform v0.12系で利用できる[for_each](https://www.terraform.io/docs/configuration/resources.html#for_each-multiple-resource-instances-defined-by-a-map-or-set-of-strings)と[for式](https://www.terraform.io/docs/configuration/expressions.html#for-expressions)を使うと、いい感じできたので備忘録です✍️
for_eachは`list`以外にも`map`を走査することができるため、forで変換してあげて渡すとエラーとならず参照できます

```tf:route53-record.tf
resource "aws_route53_record" "domain_validation" {
  # domain_name をキーにしたmapに変換する
  for_each = { for el in aws_acm_certificate.example.domain_validation_options : el.domain_name => el }

  # 値はeach.valueで参照できる
  name    = each.value.resource_record_name
  type    = each.value.resource_record_type
  records = [each.value.resource_record_value]

  zone_id = aws_route53_zone.example.zone_id
  ttl     = 30
}
```

従来の書き方より冗長さが減って、スマートな感じがしますね...！

## 参考

というか以下に書いてある通りのことです...

https://github.com/hashicorp/terraform/issues/23354
Bludit

## インストール

https://www.bludit.com/

```sh
git clone https://github.com/bludit/bludit.git
```

```sh
apt install -y \
  php-cli \
  php-mbstring \
  php-gd \
  php-xml
```

```sh
php -S localhost:8001
```

* http://localhost:8001

## 検索の有効化

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/68abfcbc-2ba6-aeb4-f501-ff016518381c.png)

## remote content プラグイン 面白そう

* https://docs.bludit.com/en/how-to/how-to-setup-remote-content
Python de 3DCAD

仕事柄3DCADを使うことも数値計算(主にPythonを使って)を行う機会が多く、数値計算をもとに3D用のデータ(STEP, IGES, STL)を生成したい(しないといけない)という要求が増えていった中での解決策です。

## 結論

結論としては[OpenCASCADE](https://www.opencascade.com/)を使います。

[C++と死の秘宝OpenCascade Technology](https://qiita.com/_EnumHack/items/577b087c071e4e9cd3b3)で有名な、OpenCASCADEですが、オリジナルはC++で100万行で構成されたライブラリのため、使おうとするととっても大変です。  
そこで、OpenCASCADEをほぼすべてPythonにWrapした偉大なコード[pythonocc-core](https://github.com/tpaviot/pythonocc-core)を使います。

## Install方法

```bash
# Python 3.8
conda install -c conda-forge pythonocc-core
# Python 3.7 or 3.6
conda install -c dlr-sc pythonocc-core
```

追加で入れておくと良いコード群です。

- https://github.com/tpaviot/pythonocc-core
- https://github.com/tpaviot/pythonocc-demos
- https://github.com/tpaviot/pythonocc-utils

## 使い方

ごく簡単な使用例です。

```Python
from OCC.Display.SimpleGui import init_display
from OCC.Core.gp import gp_Pnt, gp_Vec, gp_Dir
from OCC.Core.gp import gp_Ax1, gp_Ax2, gp_Ax3
from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_MakeEdge
from OCC.Extend.DataExchange import write_step_file, read_step_file

display, start_display, add_menu, add_function = init_display()


display.DisplayShape(gp_Pnt())

p1 = gp_Pnt(0, 0, 0)
p2 = gp_Pnt(0, 0, 10)
edge = BRepBuilderAPI_MakeEdge(p1, p2)
result = edge.Edge()
write_step_file(result, "pythonocc-core.stp")
display.DisplayShape(result)

display.FitAll()
display.View.Dump("pythonocc-core.png")
start_display()
```

実行すると3D ViewerとそのViewerの写真とpythonocc-core.stpというSTEP fileが出てきます。

![pythonocc-core.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688859/2eb1737f-f3af-0516-afd1-92d9564aef49.png)

使い方はこれからです。あとは、3D Viewerをぐりぐり動かすもよし、STEP以外のファイル(IGES, STL, BRep)を吐き出すもよし、好きな形状を作るもよしです。

サンプルは[demo](https://github.com/tpaviot/pythonocc-demos)にたくさんあります。

## 利点

3D Viewerとしてもそこそこ優秀(STEP, IGES, STLが表示できる)ということもありますが、なによりお仕事上有用な点はSTEPの吐き出しができる点です。これがあることで商用CADとの互換性がぐんとあがります。

ほかにも、Vector演算や座標系の変換、SpilneやBooleanが使えたりといわゆるCADとして最低限必要な演算機能が実装されているため、CADというより基本的な幾何演算ライブラリとして優秀という側面があります。

もちろん、変換の演算程度であれば、ちまちまコードを書いていけば実装は難しくないのですが、ほぼすべての幾何演算が実装済みというのは非常にありがたいです。

## 余談

使い始めて数年経ちますが、正直3D Viewerについてはどうやって動いているのかわかりません。
OpenCASCADEの描画機能をQt(PyQt)に埋め込んでいるんだろうな～程度の理解です。

普段はWindowsを主に使っていますが、WindowsのNative環境でQtで3Dがconda installを実行するだけで動いたときは、かなり衝撃的でした。(そして、描画まで含めてC++でやるのは私の技量では無理だなとも悟りました)
Pythonを試す

# はじめに
気になっていたPythonを試します。環境はWindows10です。

# 準備
## Anaconda3
Pythonのディストリビューション。
Python単体でDLしてもいいですが、ちょっと調べてみると
よく使うライブラリ等をすでに含んでいるAnaconda3の方がよさそうでしたのでこっちをいれてみます。
以下の64-Bit Graphical Installer (466 MB)をダウンロードしてすべてデフォルトでインストールしました。
https://www.anaconda.com/products/individual

インストール後、環境変数にバイナリファイルの場所を追加します。
C:\Users\xxxxxx\anaconda3

## VS code
VSCodeで検索してダウンロード。
インストール後、左メニューの拡張機能から以下を追加。

- 「Python Extension Pack」
- 「Japanese Language Pack for Visual Studio code」（日本語化したい場合）


コマンドプロンプトから以下のコマンドを打ってバージョン表示できれば環境設定完了。

```powershell:
C:\Users\xxxxxx> python -V
Python 3.8.3
```

# 実装
testディレクトリを作成してその中に「test.py」的なファイルを作ってみます。

```python:test.py
print("test!!")
```


# 実行
View(表示)から「ターミナル」を選択し、ターミナルを表示させます。
開いているpyファイルのディレクトリでPowerShellが起動するので以下のコマンドを実施。
すると、「test!!」が表示されます。

```powershell:powershell
PS C:\Users\xxxxx\workspace\test> python test.py
test!!
```

スクレイピングを試してみます。
BeautifulSoupを使用すると便利なようです。
**スクレイピングする前に許可されているかを必ずrobots.txtと利用規約で確認してください！！**

```python:test.py
import requests
import pandas as pd
from bs4 import BeautifulSoup
#スクレイピングするURL
url = 'xxxxxxxx'
response = requests.get(url)
response.encoding = response.apparent_encoding
#BeautifulSoup オブジェクトに変換
bs = BeautifulSoup(response.text, 'html.parser')
#class属性にclass123が指定されているh2タグを取得
tags = bs.find_all('h2', attrs={'class': 'class123'})

for tag in tags:
    print(tag,end='\n')
```

もし「numpyが見つからない」みたいなエラーが出る場合はパスが不足しているので
環境変数に以下のライブラリディレクトリを追加してVScodeを再起動します。
C:\Users\xxxxx\anaconda3\Library\bin

# あとがき
スクレイピングはJavascriptよりもとても簡単にできました。
Typecho を日本語化 (超軽量ブログ)

* https://hub.docker.com/r/80x86/typecho

```sh
docker run -d \
 --name=typecho \
 --restart always \
 --mount type=tmpfs,destination=/tmp \
 -v $(pwd)/data:/data \
 -e PHP_TZ=Asia/Tokyo \
 -e PHP_MAX_EXECUTION_TIME=600 \
 -p 8086:80 \
 80x86/typecho:latest
```

* http://localhost:8086
* http://localhost:8086/admin/


## 確認したこと

* themeが豊富
* [プラグインも豊富](https://github.com/typecho-fans/plugins)
* 中国語
* 超軽量
* 記事の検索はイマイチ。pluginで改善するか要確認


## 日本語化

* https://github.com/typecho/languages
    * ja_JP.po をダウンロードし変換
    * `/data/langs/ja_JP.mo` に配置。

```sh
apt install -y gettext

msgfmt ja_JP.po -o ja_JP.mo
```

管理画面で変更

* http://localhost:8086/admin/options-general.php

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/fdde1e95-3b8f-96f3-2e0d-ac1a60db7f75.png)

無事日本語化された

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/8a6a1ff9-2639-417c-159b-6f56d0504744.png)

ところどころ中華っぽいのは、themeに直書きしているためっぽい

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/b4500ab7-1305-6ac2-9cd8-f9848bf5ae22.png)
Mac ruby 2.0.0におけるDEFAULT_CERT_FILEのディレクトリ情報

過去記事でopenssl、curl、rubyをソースビルド、インストールしたMacとは別のMacがある。
MacOSX 10.11はhomebrewが動作するが削除し概ねクリーンにした。

ruby 2.0.0に戻る。すると
$ ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE"
"/System/Library/OpenSSL/cert.pem"

OpenSSL $ ls -la
total 8
drwxr-xr-x   6 root  wheel   204B  2  5  2016 .
drwxr-xr-x  82 root  wheel   2.7K  8 28  2018 ..
drwxr-xr-x   2 root  wheel    68B  2  5  2016 certs
drwxr-xr-x   8 root  wheel   272B  2  5  2016 misc
-rw-r--r--   1 root  wheel   9.2K  2  5  2016 openssl.cnf
drwxr-xr-x   2 root  wheel    68B  2  5  2016 private
OpenSSL $ cd certs
certs $ ls -la
total 0
drwxr-xr-x  2 root  wheel    68B  2  5  2016 .
drwxr-xr-x  6 root  wheel   204B  2  5  2016 ..
certs $

以上、メモ書き。
Terraform で AWS VPC の環境づくり[入門]

# やりたいこと

terraform の大まかな流れが知りたい。
とりあえず AWS VPC の環境を作成して、確認後廃棄。

# 各種ファイルの用意

## VPC 本体

### vpc.tf

```tf
variable "aws_region" {}

provider "aws" {
  version = "~> 3.1"
  region  = var.aws_region
}

variable "project_prefix" {}
variable "vpc_cidr" {}

resource "aws_vpc" "vpc" {
  cidr_block       = var.vpc_cidr
  instance_tenancy = "default"

  enable_dns_support   = true
  enable_dns_hostnames = true

  tags = {
    Name = "${var.project_prefix}-vpc"
  }
}
```

## 変数の設定

### test.tfvars

```tfvars
project_prefix = "tftest"
vpc_cidr       = "10.0.0.0/16"
aws_region     = "ap-northeast-1"
```

## Git ignore

ref: https://github.com/github/gitignore/blob/master/Terraform.gitignore

### .gitignore

```
# Local .terraform directories
**/.terraform/*

# .tfstate files
*.tfstate
*.tfstate.*

# Crash log files
crash.log

# Exclude all .tfvars files, which are likely to contain sentitive data, such as
# password, private keys, and other secrets. These should not be part of version
# control as they are data points which are potentially sensitive and subject
# to change depending on the environment.
#
*.tfvars

# Ignore override files as they are usually used to override resources locally and so
# are not checked in
override.tf
override.tf.json
*_override.tf
*_override.tf.json

# Include override files you do wish to add to version control using negated pattern
#
# !example_override.tf

# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan
# example: *tfplan*

# Ignore CLI configuration files
.terraformrc
terraform.rc
```

# 実行

## init

```bash
$ terraform init
```

## 差分の確認

```bash
$ terraform plan -var-file=test.tfvars
```

## 適用

```bash
$ terraform apply -var-file=test.tfvars
```

AWS Console 上からでもリソースが確認できる。

## 実行結果の表示

```bash
$ terraform show
```

## 破棄

```bash
$ terraform destroy -var-file=test.tfvars
```

# おまけ

## Makefile

今回は env という変数で呼び出すファイルを制御したが、workspace を使った方が良さそう(?)

```Makefile
env=test

clean:
	rm -rf ./.terraform

init:
	terraform init

plan:
	terraform plan -var-file=$(env).tfvars

apply:
	terraform apply -var-file=$(env).tfvars

show:
	terraform show

deploy: init plan apply show

destroy:
	terraform destroy -var-file=$(env).tfvars
```

# 次やりたいこと

- Docker 化
- リソース間連携
  - VPC に IGW 生やして Attach みたいな
- module 分割
- workspace の活用
openssl、curl、ruby、homebrew、rbenvインストールについての印象や覚え

●備忘録　メモ書き　証拠のログは殆ど無し

2020年08月上旬にautoconfからopenssl、curl、rubyまでソースインストール出来た。
openssl curl（wget）Ruby等々のSSL通信に悩まされてきたが殆ど解消したかもしれない。

kindai.rbを使い始めた時期（2015〜2017？）は記憶にない。
qiitaでの質問は2017年が最初。（他に5chで質問したかも？）2020年07月までに行ったopenssl curl（wget）Ruby等の環境構築でログが全て残ってないが、覚えていることを書いておく。

●事象

homebrewのImageMagick インストールをみていると大量のコマンドとライブラリがインストールされる。依存関係もあるらしく自分ではソースビルドが出来ないと考えていた。
ー＞実際は簡単だった。手間と時間がかかるだけ。

homebrewはリンク切れや不具合を起こす。数年に一回程度。homebrewの再インストールの経験が「たしか３，４回数／一台のMac」ある。

openssl又はcurlインストールにおいて、homebrewビルドでもソースビルドでもSSL通信の不具合が起きた。バージョンアップだけでも起きた。
証拠のログがない。
ー＞homebrewビルドのほうが成功率は高かった。

rbenvインストールにおいて、homebrewビルドでもソースビルドでも不具合が起きた。
証拠のログが一部ある。
今回（08月上旬）も問題が起きた。
ー＞不具合が嫌でstowで管理した。
ー＞stowではruby切り替えを行うのにリンク変更とパス変更、source bash_profile やsource .zshrcが必要なのでやや手間だが、stow管理の方がopensslやcurl連携しSSL通信出来るようになるまで短時間で済む気がする。

●印象や覚え

rbenvがするrubyインストールにおいて、./configureオプションはネット上であまり検証されてないように思う。
homebrewがするrubyインストールにおいて、./configureオプションはネット上で検証されてないように思う
homebrewがするcurlインストールにおいて、./configureオプションはネット上で検証されてないように思う
homebrewがするopensslインストールにおいて、./configureオプションはネット上で検証されてないように思う

全てソースビルドされた場合。
openssl作者の意図（./configureオプション）
curl作者の意図
ruby作者の意図
（rbenv、ruby-buildなし）
最も問題が少なそう？

だけならともかく、加えてhomebrewの理解と意図がある場合。
homebrew作者が上記の意図を理解した（かもしれないので間違いがあるかも？）上での
opensslの./configureオプション
curlの./configureオプション
rubyの./configureオプション
（rbenv、ruby-buildなし）

さらに加えて、rbenv（ruby-build）ビルドされた場合。
rbenv（ruby-build）作者が意図する
opensslの./configureオプション理解（インスト済みの環境を把握する）
curlの./configureオプション（インスト済みの環境を把握する）
rubyの./configureオプション

さらに場合分けで、全てhomebrewビルドされた場合。
rbenv（ruby-build）の意図する
opensslの./configureオプション理解（インスト済みの環境を把握する）
curlの./configureオプション（インスト済みの環境を把握する）
rubyの./configureオプション
この場合だけは二番目に問題が少なそうではあるが、疑問が残った結果だ。

ツールが多ければ問題の切り分けが難しいのは分かってもらえると思う。

一番下の全てhomebrewに任せる場合も不具合がある。
組み合わせはともかく、kindai.rb動作に至るまでにSSL関連の失敗、不具合（不明瞭？）今までopenssl、curl、ruby、rbenvのインストールを何度やり直したか分からない。

インストール（configureオプション）と使い方で
opensslの質問
curlの質問
rubyの質問
等々、それぞれがネットに大量にある状態だ。（ありすぎて問題だ。）

数年間、筆者はqitta以外でもインストール記事を読んできたが、今まで上記の点を指摘か注意した記事を一つも見当たらなかった。（linuxでなくMacだからかもしれないが。）

openssl、curl、ruby、rbenvのインストールを何度もやり直し失った時間を考えると
今回で筆者はソースビルドが一番早いと考えを改めるようになった。

記憶と推測だけで申し訳ない。
過去のインストールログが全て残っておらず突っ込み所は多数があるが、ご容赦を。

以上
ferenOSの導入2（インストール後の設定、日本語入力の設定）

##インストール後の設定
インストール完了後、システムの再起動を行います。（インストール時に使用したメディアは取り出します。）
**Feren OSセットアップへようこそ画面**
![setup1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/d4c3ef0e-6582-104e-cb1f-6d70ef464387.png)
セットアッププログラムが立ち上がりますので、「ようこそ」画面の言語を日本語に設定したあと、「ロケーション」、「キーボード」、「ユーザー情報」を適宜設定します。
設定後、「Welcom to Feren OS」が立ち上がります。

**Welcom to Feren OS画面**
![setup5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/ce56eaac-229f-1461-945f-ccaf24caf478.png)
好きなデスクトップレイアウトを選んでください。英語ですが、感覚的に選べると思います。
![desktopLayout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/1a24e1d8-946f-268f-1090-e8404e12be96.png)
テーマとカラーを選んでください。
![theme.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/d1151a99-4bc8-3706-a859-4debf5d4bc64.png)
動画や音楽のサードパーティのコーデックをインストールできます。
![installCodec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/0a6f46f1-1715-08ed-767a-2db547fb0875.png)
その他、KDEConnectやNightCoulorなどの設定ができます。




##日本語入力の設定
インストール直後には、すでに日本語化されているferenOSですが、日本語入力はまだできない状態です。そこで、日本語入力できるように設定を行います。この作業もアプリケーション上で行えます。
![installJa1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/133d0e1d-0bfd-f416-5ec4-46b69388db3b.png)
デスクトップ上の「Welcom Screen」アイコンから
[Main Menu]>[Getting started]>[Language & Input]へと進み設定を行います。
インプットメソッドのFcitxをインストールし、[Input Method]のボタンから設定を行います。
![installJa2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/ba2ca435-ee4d-3c35-6906-7234fa02bb08.png)
画像の右側ウィンドウにあるように、言語サポートパッケージをインストールすることで日本語入力が可能になります。インストール後、再度ログインして入力方式フレームワークをFcitxに切り替えることで日本語入力可能です。変換システムはmozcになります。また、Ibusでも日本語入力は可能ですし、変換システムにanthyも導入可能です。
Amazon Personalize では Role だけではなく S3 バケットにもポリシーを書く必要がある

# 概要
Amazon Personalize にデータをインポートするときに S3 のバケットポリシーも記載する必要があり、少しはまったので共有します。

# やり方
## Role のポリシー

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::バケット名"
            ]
        },
        {
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::バケット名/*"
            ]
        }
    ]
}
```

## バケットポリシー

```json
{
    "Version": "2012-10-17",
    "Id": "PersonalizeS3BucketAccessPolicy",
    "Statement": [
        {
            "Sid": "PersonalizeS3BucketAccessPolicy",
            "Effect": "Allow",
            "Principal": {
                "Service": "personalize.amazonaws.com"
            },
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::バケット名",
                "arn:aws:s3:::バケット名/*"
            ]
        }
    ]
}
```

参考
https://docs.aws.amazon.com/personalize/latest/dg/data-prep-upload-s3.html
SoxとPythonでステレオをモノラルに一括変換


#ステレオモノラル一括変換
pythonでフォルダ内のファイル全て取得して、
soxでステレオモノラル変換させる。



```terminal
brew install sox
````


```python
# USAGE
#python streo2mono.py input output
#python streo2mono.py FOLDER_PATH
import subprocess
import sys
import os


file_path = sys.argv[1]
output_path = sys.argv[2]
file_list = os.listdir(path=sys.argv[1])

cmd_mkdir = "mkdir %s" % (output_path)
subprocess.call(cmd_mkdir, shell = True)

for i in range(len(file_list)):
	if(file_list[i]==".DS_Store"):
		print("find DSSTORE")
	else:
		input_file = file_path + file_list[i]
		output_file = output_path  +file_list[i]
		cmd = "sox %s %s remix 1,2" % (input_file, output_file)
		subprocess.call(cmd, shell = True)
		print("s --> m ::"+file_list[i])

print("done")
````
[Rails][React]Module not found: Error: Can't resolve '../bundles/HelloWorld/components/HelloWorld' 解決法




# 起こったこと

既存のRails プロジェクトに`React on Rails` を入れる。


`rails generate react_on_rails:install`
を実行するも

どうやら Webpackerのbuild が通らない。


```
ERROR in ./app/javascript/packs/hello-world-bundle.js
Module not found: Error: Can't resolve '../bundles/HelloWorld/components/HelloWorld' in '/home/vagrant/dev/rails-proj/app/javascript/packs'
 @ ./app/javascript/packs/hello-world-bundle.js 2:0-69 5:14-24
...
```

# 解決法

どうやら別途、以下コマンドで設定ファイル生成が必要だったよう。

```
$ bin/rails webpacker:install:react
Copying babel.config.js to app root directory
       force  babel.config.js
Copying react example entry file to /home/vagrant/dev/rails/udr-tinder/app/javascript/packs
      create  app/javascript/packs/hello_react.jsx
Updating webpack paths to include .jsx file extension
      insert  config/webpacker.yml
Installing all react dependencies
         run  yarn add react react-dom @babel/preset-react prop-types babel-plugin-transform-react-remove-prop-types from "."
..
```






# 参考

https://www.chrisblunt.com/rails-and-react-fixing-module-not-found-errors-for-jsx-files/

https://github.com/shakacode/react_on_rails/

https://shakacode.gitbooks.io/react-on-rails/content/docs/tutorial.html


https://www.botreetechnologies.com/blog/how-to-add-react-js-to-your-ruby-on-rails-app-with-webpacker
AtCoder Beginner Contest 170 A問題「Five Variables」解説(C++,Python,Java)

AtCoder Beginner Contest 170 A問題「 Five Variables 」の解説を行います。

>問題URL : 
https://atcoder.jp/contests/abc170/tasks/abc170_a

#問題概要
5つの変数$x_1,x_2,x_3,x_4,x_5$が与えられる。
もとの変数は$x_i = i$であったが、1つのみ$0$が代入された。では、$0$が代入された変数がどれであったかを答えよ。

##制約
・入力の$x_1,x_2,x_3,x_4,x_5$は、代入された後のものとしてありえる組み合わせである。

#解説
##解法1
全ての値に対して$0$であるかどうかの条件分岐を行う方法です。
これにより、$0$が代入された変数がどれであるかを求めることが出来ます。
##解法2
$x_1,x_2,x_3,x_4,x_5$の数列を数列$(X)$とおきます。
実は、最初の5つの変数の総和が$15$であることを利用すると、
<b>15から$X$の総和を引いたもの</b>
が$0$が代入された変数の値であることが分かります。よってこれを計算して出力すればよいでしょう。

以下、Python3,C++,Javaでの解答例を示します。(解法2の解法を利用しました)
##各言語解答例
<details><summary>Python3での解答例</summary><div>

```{A.py}
x = list(map(int,input().split()))
print(15 - sum(x))
```

</div><details>

<details><summary>C++での解答例</summary><div>

```{A.cpp}
#include<bits/stdc++.h>
using namespace std;
int main(){
  int ans = 15;
  for (int i = 0; i < 5; i++){
    int x;
    cin >> x;
    ans = ans - x;
  }
  cout << ans << endl;
}

```

(改行を忘れないこと!!)
</div></details>

<details><summary>Javaでの解答例</summary><div>

```{A.java}
import java.util.Scanner;
public class Main{
  public static void main(String[] args){
    Scanner scan = new Scanner(System.in);
    int ans = 15;
    for (int i = 0; i < 5; i++){
      int x = scan.nextInt();
      ans = ans - x;
    }
    System.out.println(ans);
  }
}

```

</div></details>
Automation Anywhere 「落ちないBot」を作るための開発標準フレームワーク/テンプレートの紹介

RPAにおいて、24時間自動で稼働させるなど、人間が監視しなくても自律的に業務をこなしてくれるBotにするためには、「エラーを出さないBot」「落ちないBot」を作る必要があります。そしてこの**「落ちないBot」**を作るには、プログラミングの知識がある程度必要になってきます。

「え～、RPAってプログラミングの知識がなくてもできるんじゃなかったのー」って思うかもしれません。一人で使って、常に人が監視している環境で動くロボット (Attended Bot)はそれが成り立ちますが、サーバーに管理を任せる自律型のBot (Unattended Bot)はそうはいきません。作成したBotはITに詳しい人のレビューを受けた上で運用をすることになります。

# 「落ちないBot」で重要な要素

その際、レビューポイントとして一番重要なのが**「エラー処理がきちんとやられているか」**です。エラーが起こる主なパターンを想定して、その対策が取られているかどうかです。v11.xなら「Begin Error Handling」コマンドが適切に使われているか、A2019ならtry/catch/finally処理が適切に行われているか、になります。

また、複数人でレビューをするため、アクションリストの見やすさや規約に従って作られているかも重要になってきます。気を付けるべき主な点をリストにすると以下の通りです。

* エラー処理が適切に行われているか
* コメントが適切に入っているか、(A2019の場合) ステップを使って整理されているか、変数の命名規則
* Botを動かす前後処理 (Excelや関連プログラムを閉じる、一時フォルダーのクリーンアップなど)が行われているか
* PC環境固有の設定値が切り出されているか
* アクションリスト行数の制限 (多い場合は別のBotに分離)、DRY原則、循環的複雑度最小原則を守っているか
* デバッグに必要な適切なログが出力されるようになっているか

# Bot開発テンプレートのダウンロード
これらのことに対応したBotテンプレートがBot Store等で配布されているので活用してください。

* v11.xの場合: [TaskBot を構築するためのフレームワーク](https://botstore.automationanywhere.com/jp/bot/taskbot-template-with-best-practices/)
    * @zamaezaaa さんが日本語に翻訳したものが使いやすい ([ダウンロード](https://app.box.com/s/d8cribp2xo6wwbhu4spg4ie2i3sld78j))
* A2019の場合: [Bot Starter Template](https://botcenter.automationanywhere.com/Bot+Starter+Automation+Anywhere+-+readme.pdf?_ga=2.234765470.1252204731.1588991895-702156195.1577675044)
    * [Botの入ったZIPファイルのダウンロード](https://botcenter.automationanywhere.com/Bot+Starter+Automation+Anywhere.zip?_ga=2.234765470.1252204731.1588991895-702156195.1577675044)

### (v11.x) TaskBot を構築するためのフレームワーク
80行ほどのアクションリストになっており、エラーハンドリング、設定値の外出し、前後処理などが既に作られた状態になっている。69行目以降から本体を作り始める。

構築した.atmxファイルを置くメインフォルダーの下に、「Config」「Input」「Output」「Logs」「Template」「Temp」という名前のサブフォルダーを作成しておくことが想定されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/10ad5e46-0163-ef0b-0dcd-d3d090f9b879.png)

また、これは1つのTaskBotファイルのプロジェクトの場合のテンプレートですが、複数のBotファイルが必要なプロジェクトを作成する場合に、「Solution Design」ファイルと呼ばれる以下のようなExcelファイルに必要事項を読ませてProcess Structure Creation.atmxを実行すると、必要な.atmxと、その中のコメントや構造をテンプレートに従って整えた状態で作成してくれるようなツールもBot Storeにあがっているので、試してみるとよいでしょう。(⇒[Bot Framework 構造を作成](https://botstore.automationanywhere.com/jp/bot/create-bot-framework-structure/))
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/64aabfd3-72d1-c9b7-560f-15d0ae6ed695.png)


### (A2019) Bot Starter Template
Bot Storeにはあがっていないのですが、Community EditionにインポートできるBotファイルの一覧の中に、A2019 Bot開発用テンプレートもあります。「Bot+Starter+Automation+Anywhere.zip」というファイルをA2019 Control Roomでインポートすると、「Bot Starter Template」という名前のBotが作成されます。中身は50行のアクションリストです。Bot本体は36行目の部分に挿入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/6990049a-14b8-3bc4-5dc6-4dfcec65ca06.png)



# 参考記事

* [Automation AnywhereでのBot作成時にオススメのテンプレート](https://qiita.com/zamaezaaa/items/debacd95f2732be5e66c) by @zamaezaaa さん
* [Automation Anywhere A2019で、より良いアクションリストを作るための7つの方法](https://qiita.com/RPAbot/items/3292fe27b3e97f9f71a1)
【Twitter・レプリカ作成日記】

◆今日でアプリケのーション作成のカリキュラムは終了。
・まだ未完成みたいだが一通りのMOVの流れ、格メソッドやインスタンス変数の使い方、おおよそは学習できた。
※ただ、出てくるメソッドが多すぎてインプットが追いつかない、特にアソシエーションしてからの各MOVファイルの記述がカリキュラムに頼りすぎていて現場に出た時、対応できるか不安。
、、、、おそらくまだ、、まだまだ片足が入ったくらいの場所だと思うので変に詰まらず自作アプリケーション作成まではどんどんカリキュラムを進めて行こうと思う。

・週の初めに決めた目標は達成できたのでこのまま、学習を進めて行こうと思う。
明日は、スクールのキックオフで学習方針やスクールが今後のビジョンを共有してくれるみたいなので楽しみにしています。

・来週には１項目のカリキュラムを終わらせて次のカリキュラムまで突入できるように学習していきます。
AtCoder Beginner Contest 174 B問題「Distance」解説(C++,Python,Java)

AtCoder Beginner Contest 174 B問題「Distance」の解説を行います。
>問題URL : https://atcoder.jp/contests/abc174/tasks/abc174_b

#問題概要
2次元平面上に$N$個の点があり、$i$個目の点の座標は$(X_i , Y_i)$である。
これらのうち、原点からの距離が$D$以下であるような点は何個あるかを求めよ。
ただし、座標$(p,q)$にある点と原点との距離は$\sqrt{p^2+q^2}$である。
##制約
・$1\leq N \leq 2×10^5$
・$0\leq D \leq 2×10^5$
・$|X_i|,|Y_i| \leq 2×10^5$
・入力は全て整数
#解法
この問題ですが、以下のようなことを実行するコードを書けばACできます。
<blockquote>
・$N,D$を入力する
・変数$ans$をカウンターとして宣言し、0で初期化する
・$N$回以下のことを繰り返す
<blockquote>
・$(X_i,Y_i)$の情報を受け取り、$\sqrt{{X_i}^2+{Y_i}^2}$を求める。もしそれが$D$以下であれば$ans$に1を加算する
</blockquote>
・$ans$が、$D$以下である点の個数なのでこれを出力すればよい
</blockquote>
(以下のコードはPythonでの解答例です)

```{B.py}
N,D = map(int,input().split())
ans = 0
for i in range(N):
  x,y = map(int,input().split())
  if (x**2+y**2)**0.5 <= D:
    ans += 1
print(ans)
  
```

このコードでもACは出来るのですが、"誤差を気にする"という方は以下のように書き換えた方が良いかも知れません。

```{B2.py}
N,D = map(int,input().split())
ans = 0
for i in range(N):
  x,y = map(int,input().split())
  #ここを書き換える!!
  if (x**2+y**2) <= D**2:
    ans += 1
print(ans)
```

$\sqrt{{x_i}^2+{y_i}^2} \leq D$ではなく 
${x_i}^2+{y_i}^2 \leq D^2$で$D$以下かどうかを判定しています。
制約より、$0 \leq D$なので、このように不等式の条件を<b>言い換える</b>ことができます。
また、${x_i}^2+{y_i}^2$で単純に比較すると, $\sqrt{{x_i}^2+{y_i}^2}$で比較するよりも誤差があまり出ない(整数の2乗同士を足すので)ので、<b>誤差</b>を気にせず条件分岐することが出来ます。

以下、C++,Javaでの解答例を示します。
※($x_i^2+y_i^2 \leq D$)で解いたコードです
<details><summary>C++での解答例</summary><div>

```{B.cpp}
include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    long long int d;
    cin >> n >> d;
    int ans = 0;
    for (int i = 0; i < n; i++){
        long long int x,y;
        cin >> x >> y;
        if (x*x+y*y <= d*d){
            ans++;
        }
    }
    cout << ans << endl;
}
```

</div></details>
<details><summary>Javaでの解答例</summary><div>

```{B.java}
import java.util.Scanner;
public class Main {
	public static void main(String[] args){
		Scanner scan = new Scanner(System.in);
		int n;
		long d;
		n = scan.nextInt();
		d = scan.nextLong();
		int ans = 0;
		for (int i = 0; i < n; i++) {
			long x,y;
			x = scan.nextLong();
			y = scan.nextLong();
			if (x*x+y*y <= d*d) {
				ans++;
			}
		}
		System.out.println(ans);
	}
}
```

</div></details>

ちなみに、C++では計算時間が<b>101ms</b>だったのに対し、Javaは<b>634ms</b>であったので、C++の計算速度が速いのが一目瞭然ですね。
AWSのt2.2xlargeをhibernationしながら常用する

AWSは、2018年末辺りから、[インスタンスの休止（ハイバネーション）](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/Hibernate.html)ができるようになりました。
しばらくは、Amazon Linuxでしか使えなかったのですが、[2019年にUbuntuでも使えるようになり](https://aws.amazon.com/jp/about-aws/whats-new/2019/07/amazon-ec2-hibernation-now-available-ubuntu-1804-lts/)、必要な時だけ立ち上げ、終わったら休止というのができるようになりました。

たとえば、時間のかかるビルドをするときに、ビルドが終わったら休止しておけば、コストを抑えられますし、シャットダウンと違って、エラーの確認も再開後すぐにできます。

しかし、休止をAWS Consoleからするのでは面倒です。そのため、実行中のインスタンスから休止できるコマンドを作成します。

```hibernate.sh
#!/bin/sh
aws ec2 stop-instances --instance-ids `curl -s 169.254.169.254/latest/meta-data/instance-id/` --hibernate
```

上記を実行中のインスタンスに置いて、パスを通してください。そして、`hibernate.sh`を実行すると休止します。

これで、例えば、

```shell
$ make; hibernate.sh
```

などとすれば、ビルド後、休止します。`make && hibernate.sh`とすると成功時にしか休止しないので、`make; hibernate.sh`とすべきです。

ただ、上記だと、makeが一瞬で失敗してしまったときも、休止します。そのため、sleepを入れましょう。単にsleepを入れると分かりにくいのでカウントダウンのコマンドを作ります。

```countdown.sh
secs=$1
while [ $secs -gt 0 ]
do
        sleep 1 &
        printf "\r%02d:%02d:%02d" $((secs/3600)) $(( (secs/60)%60)) $((secs%60))
        secs=$(( $secs - 1 ))
        wait
done
echo
```

そして、hibernate.sh でcountdown.shを呼びですようにします。以下では10分待っています。

```hibernate.sh
#!/bin/sh
countdown.sh 600 && aws ec2 stop-instances --instance-ids `curl -s 169.254.169.254/latest/meta-data/instance-id/` --hibernate
```
自宅室内監視ツールを作ってみた

MESH x Node-RED x CosmosDB x Laravel で自宅室内監視ツールを作ったお話。

詳細は後日書きますが、とりあえず成果物をドン！
https://home-room-monitor.herokuapp.com

グラフ化や収集データの追加などこれから行っていこう思います。
Swift：ただ音を鳴らすだけ

# 方法

`AVAudioUnitSampler`を用いてMIDIと同種のノートを鳴らすことができる。複雑なことはしたくないけど、とにかく単音を任意の時間鳴らしたいという場合に有効。ただし、SoundFontを使わないと音の停止時に微妙にノイズが入る。

```swift
import AVFoundation

class Sampler {
    let audioEngine = AVAudioEngine()
    let unitSampler = AVAudioUnitSampler()

    init() {
        audioEngine.attach(unitSampler)
        audioEngine.connect(unitSampler, to: audioEngine.mainMixerNode, format: nil)
        try? audioEngine.start()
    }

    deinit {
        if audioEngine.isRunning {
            audioEngine.stop()
            audioEngine.disconnectNodeOutput(unitSampler)
            audioEngine.detach(unitSampler)
        }
    }

    func play() {
        // 一つ目の引数はMIDIのNote番号60は基本のド
        // withVelocityは音量に関係する値 0 ~ 127
        // onChannelはチャンネルを構成しないなら基本0
        unitSampler.startNote(60, withVelocity: 80, onChannel: 0)
    }

    func stop() {
        unitSampler.stopNote(60, onChannel: 0)
    }
}
```

```swift
let sampler = Sampler()

// 音を再生
sampler.play()

// 音を停止
sampler.stop()
```

# SoundFontを使う場合

音質は使うSoundFontファイルに依存するが、基本的には終了時のノイズはなくなるので綺麗に音を鳴らすことができるようになる。例えば、よくあるピアノ音源のSoundFontファイルは100MB〜300MBくらいあるので、アプリの容量を抑えたい場合は軽量なSoundFontを探すか、自作するといいかもしれない。

```swift
init() {
    audioEngine.attach(unitSampler)
    audioEngine.connect(unitSampler, to: audioEngine.mainMixerNode, format: nil)
    if let _ = try? audioEngine.start() {
        loadSoundFont()
    }
}

func loadSoundFont() {
    guard let url = Bundle.main.url(forResource: "SoundFontファイル名", withExtension: "sf2") else { return }
    try? unitSampler.loadSoundBankInstrument(
        at: url, program: 0,
        bankMSB: UInt8(kAUSampler_DefaultMelodicBankMSB),
        bankLSB: UInt8(kAUSampler_DefaultBankLSB)
    )
}
```
ヘッダーを固定する

#画面上の要素を固定する
`position: fixed;`を使うと、常に要素を画面上の指定した位置に固定させておくことができます。
位置は、`top`、`left`、`right`、`bottom`を使って指定します。

```index.html
<header></header>
```

```style.css
header {
 position: fixed;
 top: 0px;
 left: 0px;
}
```

#要素の重なり順
`position`を使用すると要素の重なりが生じます。
その結果、コンテンツ部分とヘッダーが重なった時に、ヘッダーが隠れてしまいます。
重なり順を指定して、ヘッダーが上に表示されるようにしましょう。

##要素の重なり順を指定する
`z-index`プロパティは、要素の重なりの順序を指定する際に使用します。
`z-index`は整数値で指定し、値が大きいほど上に表示されます。
`z-index`プロパティは必ず`position`プロパティと併用する必要があるので、注意しましょう。

```style.css
header {
    position: fixed;
    top: 0px;
    left: 0px;
    z-index: 10;
}
```
立体的なボタンを作ってみる

#立体的なボタンを作る
`<a>`タグで立体的なボタンを作ってみます。
ボタンに影をつけることによって、立体的に見えるようにします。
また、ボタンにカーソルを当てた時の、カーソルの形も変更してみます。

## 影をつける
ボックスに影を付けるためには`box-shadow`プロパティを用います。
「影の位置」と「影の色」を指定します。


```style.css
.box {
 box-shadow: 10px 10px #000000; /* 水平方向 垂直方向 色 */
}
```

垂直方向のみつけると立体っぽくなる

```style.css
.btn {
 box-shadow: 0px 6px #000000;
}
```

##`cursor`
`cursor`プロパティを用いることでマウスのカーソルが要素に乗ったときのカーソルの形を変えることができます。
タグによって`cursor`が初期状態で設定されているものもあり、例えば`<a>`タグは初期状態で`pointer`が設定されています。


```style.css
.box {
 cursor: pointer; /* text, pointer, default */
}
```
##ボタンを押したらへこむようにする
ボタンを押したときに以下の処理をすると、へこんで見えるようになります。
・影を消す
・ボタンの位置を影の分だけ下げる

###`active`
セレクタに`active`を用いることで、要素がクリックされている間だけCSSを適用することができます。
`セレクタ:active`というように指定します。

```style.css
div:active {
 background-color: red;
}
```

###CSSを打ち消す
`box-shadow: none;`とすると、影を消すことが出来ます。
このように多くのプロパティは`none`を指定することによって消すことができます。

```style.css
.btn:active {
 box-shadow: none; /* 影を打ち消し */
}
```

###`position: relative;`による位置の変更
要素の位置を変更する方法を学びましょう。
前回`position: relative;`は`position: absolute;`の基準位置を決めるために使っていましたが、要素の位置を変更するためにも使うことが出来ます。
`position: relative;`を`top`や`left`と併用すると、その要素を本来の位置からずらせます。

```style.css
.btn:active {
 position: relative;
 top: 6px;
 left: 10px;
}
```

###ボタンを凹ませる
クリック時に、以下の処理をすることによって、ボタンがへこんで見えるようになります。
・`box-shadow`を`none`にする
・`position: relative;`と`top`によって影の分だけ位置を下げる

```style.css
.btn:active {
 position: relative;
 top: 6px;
 box-shadow: none;
}
```
Blender 複数のアニメーションを持つglTFを書き出す方法

#概要
Blender上で、1つのオブジェクトに対して複数のアニメーションが存在するようなglTFファイルの書き出し方が分からなかったのでメモ

#結論
Nonlinear Animation Editor上で複数NlaTrackを追加すればいいです。

#解説
結論は上記の通りですが、味気ないので書き出しまでの手順を記します。

Nonlinear Animation Editorを開きます
<img width="1392" alt="スクリーンショット 2020-08-08 20.22.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323576/81b6df17-930f-1cff-7724-96cf476e9273.png">

適当にAction Editor上でActionを追加し、「Push Down」を押して Nonlinear Animation Editor に追加します。
<img width="1392" alt="スクリーンショット 2020-08-09 0.39.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323576/186fe3e3-f337-666d-2b66-aca8e6b3aaf2.png">

あとは、File > Export > glTF 2.0 でオブジェクトを書き出せばOKです。

書き出したglTFの中身にもちゃんと"animations"が存在していました。

```json
    "animations" : [
        {
            "channels" : [
                {
                    "sampler" : 0,
                    "target" : {
                        "node" : 0,
                        "path" : "translation"
                    }
                }
            ],
            "name" : "Location",
            "samplers" : [
                {
                    "input" : 2,
                    "interpolation" : "LINEAR",
                    "output" : 3
                }
            ]
        },
        {
            "channels" : [
                {
                    "sampler" : 0,
                    "target" : {
                        "node" : 0,
                        "path" : "rotation"
                    }
                }
            ],
            "name" : "Rotation",
            "samplers" : [
                {
                    "input" : 2,
                    "interpolation" : "LINEAR",
                    "output" : 4
                }
            ]
        },
        {
            "channels" : [
                {
                    "sampler" : 0,
                    "target" : {
                        "node" : 0,
                        "path" : "scale"
                    }
                }
            ],
            "name" : "Scale",
            "samplers" : [
                {
                    "input" : 2,
                    "interpolation" : "LINEAR",
                    "output" : 5
                }
            ]
        }
    ],
```

また、[glTF Tools Extension for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=cesium.gltf-vscode)で動作確認もしたところ無事再生もできました。
![gltf-animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323576/a66f38eb-f0e9-33d0-6d2e-927f4a6eb27c.gif)
画像と文字を重ねる

#画像と文字を重ねる
通常、HTMLでは要素同士が重なって表示されることはありません。
しかし、CSSを用いることで要素同士を重ねることができます。

##`position: absolute;`
HTMLの要素同士は通常重なって表示されることはありませんが、`position: absolute;`を使うと、要素同士を重ねて表示することが出来ます。
サイト全体の左上部分を基準とし、そこからの位置を`top`と`left`を用いて指定します。また、`right`や`bottom`を併用することも可能です。

```style.css
.box1 {
 position: absolute;
 top: 50px;
 left: 70px
}

.box2 {
 position: absolute;
 top: 120px;
 left: 140px;
}
```

###基準位置の変更
`position: absolute;`の基準位置はサイト全体の左上部分ですが、この基準位置は変更することが出来ます。
基準としたい親要素に`position: relative;`と指定すると、その要素の左上部分が基準位置となります。

```index.html
<div class="parent">
 <img class="child" src="./assets/icon.jpg">
</div>
```

```style.css
.parent {
 position: relative;
}

.child {
 position: absolute;
 top: 20px;
 left: 15px;
}
```
相対的な大きさを指定する

#相対的な大きさの指定
ボックスの`width`や`height`を`px`ではなく`%`で指定すると、親要素に対してどのくらいの幅や高さを持つか指定することができます。

```index.html
<div class="parent">
 <div class="child"></div>
 <div class="child"></div>
</div>
```

```style.css
.child {
 width: 50%;
}
```
初心者がSlimをインストールしてみた！

Laravelで幾つかアプリケーションを作ったので、もう一つくらいフレームワークを触ってみようとSlimを導入してみました。

#Slimとは
Slimとは**軽量フレームワーク（マイクロフレームワーク）**の一種であり、アプリケーションが動くのに必要な機能を最低限のみ兼ね備えたフレームワークです。
ちなみに、LaravelやCakePHP等たくさんの機能を兼ね備えたフレームワークは**フルスタックフレームワーク**といい、マイクロフレームワークとは対照的なものになります。
その為、フルスタックフレームワークと比べ処理速度が速く、ファイル容量も軽くなります。
#インストール手順
##スペック
OS：Windows10 Home 64bit
php Version: 7
Composer version：1.8.6
##Composerのインストール
Slimをインストールする際は、Laravelと同様にComposerを予めインストールされてあることが必要になります。
今回は既にインストールした状態で行った為、こちらの記事をご覧になっている方でComposerをまだインストールしていない方は、以下のURLからインストールして下さい。
Composer：https://getcomposer.org/
##コマンド入力
Composerをインストールしたら、コマンドプロンプトでSlimを入れたいディレクトリまで移動し、以下のコマンドを入力します。

```
composer create-project slim/slim-skeleton:^3.* プロジェクト名
```
インストールは概ね3～5分程度で完了します。
以下のようになったら、インストール成功です！
![slim1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/67d3b522-918c-a73f-c6b4-9422462b88ee.png)

ディレクトリに、プロジェクト名(今回は「slim_test」)のフォルダが作成され、以下のファイルが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/77b21ff2-e5f3-80a9-258f-f4403a4429a6.png)
##Hello Worldしてみた
ローカルサーバーで「\templates\index.phtml」のサンプルページを表示させます。
インストールしたプロジェクトにディレクトリを移動させ、以下のコマンドを入力します。

```
php -S localhost:8888 -t public public/index.php
```
コマンド実行後、ブラウザで「localhost:8888/World」と打ち込むと、下図のサンプルページが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506986/310a2a39-2621-caec-3fa1-eda42fc0a07f.png)

#まとめ
今回はマイクロフレームワークであるSlimをインストールしました。
とりあえず何かしらのアプリケーションを作成し、Laravelとの比較を行ってみようと思います。

#参考文献
[軽量PHPフレームワークSlimを使ってサクッとWebアプリひな形を作ってみる](https://www.blog.danishi.net/2019/11/19/post-2362/)
文字の太さを指定する

`font-weight`プロパティを用いると文字の太さを変更することができます。`normal`または`bold`を指定します。
`<h1>`~`<h6>`の要素は初期状態で`font-weight: bold;`となっているので、`font-weight: normal;`と指定すれば文字が細くなります。

```style.css
h1 {
  font-weight: normal; /* デフォルトより細くなります */
}
```
<a>タグのクリックできる範囲

`<a>`タグはインライン要素なので、中身のテキストの部分しか大きさを持ちません。
その結果、`<a>`タグをクリックできる範囲はテキストの部分だけになってしまいます。
`<a>`タグをブロック要素にすると、大きさが親要素いっぱいに広がるので、全体をクリックできるようになります。

```style.css
.header-right a {
  display: block;
}
```
行間を指定する（line-height）

`line-height`プロパティを使うと、行の高さを指定することができます。
値が大きいほど行間が大きくなります。


```style.css
.text{
 line-height: 10px;
}
```

##`line-height`と縦の中央寄せ
`line-height`プロパティは本来行間を調整するためのプロパティですが、要素の縦方向の中央に文字を配置するのにも使えます。
`line-height`プロパティの「高さの中心」に文字が配置されるため、要素の高さと`line-height`プロパティを同じ値にすると、文字がちょうど中央に配置されるようになります。
【雑談】プログラミングのモチベーションが上がるかもしれない方法


#0.はじめに

プログラミングは好きだけれど、勉強として始めるまでになかなか腰が重い時があります。そんな時に、**「おぉ～コーディングしたい！」**と思わせるような**着火剤**になるようなものに出会いましたので紹介します。
#1.プログラミングの配信実況から刺激をもらう
Twitchという配信サービスをご存知でしょうか。ゲーム配信に強い配信プラットフォームです。
当然ながら、配信コンテンツは、ゲーム実況が多いのですが、Talk（雑談）のカテゴリのコンテンツも多いです。その中のサブカテゴリの一つに**「サイエンス＆テクノロジー」**があります。このカテゴリの中でも様々なコンテンツがあり、その一つに「プログラミング」があります。配信者がコーディングをする姿をその画面を映しながら配信しています。配信者によって開発しているものもアプリも使用している言語も、当然ながら、動機も違います。

最近、知ったこのカテゴリの配信者がいます。
https://www.twitch.tv/georgehotz
(YouTubeにもチャネルがあります https://www.youtube.com/c/commaaiarchive/videos)

**"George Hotz"** という方です。
Wikipediaによると、security hacker だそうです。
（数々の実績はWikipediaを参照してください、その道では有名なひとなのかもしれません）

**George Hotz**
https://en.m.wikipedia.org/wiki/George_Hotz

たまたま観た配信では、**画像認識に関するプログラミングしており、ネットで難しそうな論文（と思われるもの）とリファレンスを調べながら、タイピングをしていました。**

何をしているのかは、英語なのではっきりわからないものの（ただ明らかに難しそうな内容なのは間違いない）、**笑顔でトークをしながら、楽しそうにガツガツ調べながら、ドンドンコーディングしている姿を観ていると、こちらにまでコーディングをしたい気持ちになってきます（私だけ？）**

ちなみに、最近（2020年8月）は、関数型プログラミング言語であるhaskellにチャレンジしていました。楽しそうに。

※今回はここまで。他にもよいものがあれば随時追記していきます！
【Rails】Mongoidでembeds_manyの子要素の数を条件付き取得する

## 概要
以前に[【Rails】Mongoidでembeds_manyの子要素の数を取得する](https://qiita.com/someone7140/items/55c750301764b6d2608a)の記事で、MongoDBにて配列要素の項目数を取得する方法を記載しました。今回は配列の項目数を取得するときに条件付きで取得する方法を書きます。

## サンプル例題
前回の記事とほぼ同じですが、今回はCommentクラスに日付項目（created_at）を追加し、日付の条件で絞るような例題にします。

```article.rb
class Article
  include Mongoid::Document
  field :_id, type: String
  field :title, type: String
  field :contents, type: String
  embeds_many :comments
end
```

```comment.rb
class Comment
  include Mongoid::Document
  field :user_id, type: String
  field :post_comment, type: String
  field :created_at, type: DateTime
  embedded_in :article
end
```

## 対応方法
MongoDBでaggregateのクエリ時に使用できる[$filter句](https://docs.mongodb.com/manual/reference/operator/aggregation/filter/)を使います。これで配列要素を、条件に一致したものみで抽出できます。

```sample.rb
# コレクションの取得
db = Mongoid::Clients.default
articleCollection= db[:article]
# 日付条件（30日前）
before30day = Time.now.utc - 30.days
# aggregateの実行
articleCollection.aggregate([
  {
    "$project" => {
      _id: 1,
      title: 1,
      contents: 1,
      # 30日以内のもののみでカウント
      comments_count: { "$size": { '$filter' => {
        'input' => '$comments',
        'as' => 'comments',
        'cond' => { '$gte' => ['$$comments.created_at', before30day] }
      } } }
    }
  }
]).to_a
```
アニメーションをつける（transition）

`transition`を使うとアニメーションをつけることができます。
「変化の対象」や、「変化にかかる時間」などを指定できます。
「変化の対象」には`color`などのプロパティを指定しますが、`all`を指定すると全てのプロパティに適用出来ます。
`transition`は多くの場合`hover`と組み合わせて使います。

```index.html
<div>
 <h1> ゆっくり背景がつくよ</h1>
</div>
```

```style.css
div {
 transition: all 1s; /* 変化の対象 変化の時間 */
}

div:hover {
 background-color: red;
}
```
背景だけを透過させる

要素を透明にするには`opacity`が利用できますが、
`opacity`には要素の中身全てを透明にするという性質があります。
背景のみを透明させたい時とかは、`rgba`を利用しましょう。

##rgb
`rgba`を学ぶには、まず`rgb`というものを理解する必要があります。
`rgb`は色の指定の仕方の1つで、3つの値の組み合わせで表示する色を決めます。色を指定するときは`#ffffff`のようなカラーコードを使っても`rgb`を使っても構いません。

```style.css
.box {
 background-color: rgb(255, 147, 30);
}

.box{
 background-color: #ff931e;
}
```

##rgba
色を透明にしたいときは色を`rgba`で指定します。`rgba`は4つの値をコンマ（,）区切りで入れます。4つ目の値が透明にする度合いで、`0 ~ 1`の数値で指定します（値が小さいほど透明になります）。
`opacity`プロパティは要素全体を透過させますが、`rgba`を使うとその色だけを透明にすることが出来ます。

```index.html
<div class="rgba-sample">
 <p>rgbaの透過</p>
</div>
<div class="opacity-sample">
 <p>opacityの透過</p>
</div>
```

```style.css
/* 背景だけ透過される */
.rgba-sample {
 background-color: rgba(84, 190, 238, 0.5);
}

/* 要素の中身も透過される */
.opacity-sample {
 background-color: rgb(84, 190, 238);
 opacity: 0.5;
}
```
[Rails]ActionDispatch::Cookies::CookieOverflow 解決法




# 起こったこと

Rails で 突然出るエラー。

`ActionDispatch::Cookies::CookieOverflow`



主な原因としては
session 変数に多くのデータを保持する場合、
や
flash など view 関連のhelper で Objectやtextなど多くの文字列
を渡している場合、
に出るよう。

(CookieStore: session 情報を全てsecret_key_baseで暗号化し、クライアント側のCookie に保持。)


https://qiita.com/shota_matsukawa_ga/items/a21c5cf49a1de6c9561a


``` :example.rb
flash[:success] = User.inspect # こんな原因
```


# 解決法

flash などhelper に渡すデータを減らす。(session に入れているため)

また、
session storeを変更するなど。

# 参考


https://stackoverflow.com/questions/9473808/cookie-overflow-in-rails-application

https://site-builder.wiki/posts/4587

http://kgmx.hatenablog.com/entry/2014/08/14/092710

https://qiita.com/kazuph/items/feb135cda2c6ece24574
エクセルのアドレス形式A:Eを入力するとき列名A,B,C,D,Eを出力する

PowerShell とエクセルを連携したいときに時々ほしいやつ。

```powershell
function New-XlColumnRange {
    param (
        [Parameter(Mandatory=$True)]
        [ValidatePattern("^[a-zA-Z]+:[a-zA-Z]+$")]
        [string]$Address
    )
    $ALPHA = Write-Output A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z

    $S = $Address.Split(":")[0].ToUpper()
    $E = $Address.Split(":")[1].ToUpper()

    # アドレスを一旦数値に戻す
    $toIndex = {
        $ret = 0
        $len = $_.Length
        for($i = 0; $i -lt $len; $i++){
            $n = $ALPHA.indexOf($_[$i]) + 1
            $ret += $n * [Math]::Pow(26, $len - $i - 1)
        }
        return $ret
    }
    $start = $S | ForEach-Object -Process $toIndex
    $end   = $E | ForEach-Object -Process $toIndex

    # 入力チェック
    if ($start -lt 1) { throw 1 }
    if ($end -le $start) { throw 1 }

    # アドレスに戻す
    $toColumn = {
        $ret = ""
        $i = $_
        do {
            $i = $i - 1
            $ret = $ALPHA[$i % 26] + $ret
            $i = [Math]::Floor($i / 26)
        } while ($i -gt 0)
        return $ret
    }

    $start .. $end | ForEach-Object -Process $toColumn
}
```

例えば以下のような使い方ができる。

```powershell
$SheetData | Select-Object (New-XlColumnRange "A:D")
```

`$SheetData` は適当に用意する。
Mac docker-compose up でエラーが発生した話

# 目的

- dockerのコンテナを起動しようとした時にエラーが発生し解決した話をまとめる

# 実施環境

- 下記の方法でDocker Desktop for Macをインストールした。
    - [Docker Desktop for Mac をインストールする](https://qiita.com/miriwo/items/b4d41c45a12b1ae7f91e) 

# 問題までの経緯

1. dockerファイルが存在するディレクトリに移動し下記コマンドを実行してコンテナの起動を試みた。

    ```terminal
    $ docker-compose up -d
    ```

# 問題

1. 下記のエラーが発生した。

    ```terminal
    ERROR: for コンテナ名  Cannot start service php: Ports are not available: listen tcp 0.0.0.0:80: bind: address already in use

    ERROR: for php  Cannot start service php: Ports are not available: listen tcp 0.0.0.0:80: bind: address already in use
    ERROR: Encountered errors while bringing up the project.
    ```

# 解決までの経緯

1. 下記コマンドを実行して使用されているポートを調べた。apacheが動いている様である。

    ```terminal
    $ sudo lsof -i -P | grep ":80"
    > httpd      339            _www    4u  IPv6 0x666e8ad53dfbd5c3      0t0  TCP *:80 (LISTEN)
    ```
1. 下記コマンドを実行してhttpdを止めようとした。(皆さんは下記コマンドでhttpdを止められるはずである。)

    ```terminal
    $ sudo service httpd stop
    ```
1. 先のコマンドを実行したがhttpdはすでに停止している旨の出力が得られた。
1. Macローカルのhttpdは現在使用しておらず強制停止しても問題ないこと、Dockerのコンテナ起動を急いでいたことから下記コマンドを実行してヒットしたプロセスをkillした。

    ```terminal
    $ kill -l 339
    ```
1. 下記コマンドを実行したら正常にコンテナが起動した。

    ```terminal
    $ docker-compose up -d
    ```

1. コマンドだけではなく、アクティビティモニターにてhttpdを検索して強制終了する方法も実施することができる。