OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu 20.04 に asdf をシステムワイドにインストールする

## はじめに
Ubuntu 20.04 LTS (WSL2) に [asdf](https://github.com/asdf-vm/asdf) をシステムワイドにインストールします。
asdf は [anyenv](https://github.com/anyenv/anyenv) に似ており、Python や Node.js など複数の環境を一貫したコマンドで導入できます。
asdf で導入可能な環境は[こちら](https://asdf-vm.com/#/plugins-all)。

## 前提

- OS: Ubuntu 20.04 LTS (WSL2)
- Shell: Bash

## インストール

基本的に [通常の手順](https://asdf-vm.com/#/core-manage-asdf) に沿って進めます。

#### 1. curl とgit のインストール

```bash
sudo apt install -y curl git
```

#### 2. GitHub から asdf (v0.8.0) のクローン

今回は `/usr/local` 直下に置きます。

```bash
sudo git clone https://github.com/asdf-vm/asdf.git /usr/local/asdf --branch v0.8.0
```

#### 3. 管理グループの設定

管理者権限がなくても asdf を利用できるように管理グループ `asdf` を作成し、`/usr/local/asdf` の操作権限[^1]を付与します。
[^1]: 一部のファイル (asdf/lib/commands/以下のファイル) に実行権限を付与すると、`asdf_version: command not found` 等のエラーが発生する可能性があるため、`g+rwXs` にしています。
その後、管理グループに実行ユーザ (foo) を追加します。

```bash
sudo groupadd asdf
sudo chgrp -R asdf /usr/local/asdf
sudo chmod -R g+rwXs /usr/local/asdf
sudo gpasswd -a foo asdf
```

再ログインまたは `exec bash -l` で設定を反映します。

#### 4. 環境変数の設定

通常は `~/.bashrc` に `. $HOME/.asdf/asdf.sh` を追加する箇所になります。
今回は `/etc/profile.d/asdf.sh` に必要な環境変数等を書いています。

```bash
sudo vi /etc/profile.d/asdf.sh
```

```bash:/etc/profile.d/asdf.sh
export ASDF_DIR=/usr/local/asdf
export ASDF_DATA_DIR=$ASDF_DIR

ASDF_BIN="${ASDF_DIR}/bin"
ASDF_USER_SHIMS="${ASDF_DATA_DIR}/shims"
PATH="${ASDF_BIN}:${ASDF_USER_SHIMS}:${PATH}"

. "${ASDF_DIR}/lib/asdf.sh"
. "${ASDF_DIR}/completions/asdf.bash"
```

再ログインまたは `source /etc/profile.d/asdf.sh` で設定を反映します。

#### 5. 動作の確認

```bash
asdf --version
```

```bash:結果
v0.8.0-c6145d0
```

バージョン情報が出力されればインストール完了です。
asdf で任意の環境をインストールしていきましょう。

## Tips

sudoで実施すると `sudo: asdf: command not found` になる可能性があります。
その場合は、sudo の `i` オプションを利用します。

```bash
sudo -i asdf --version
```

または、以下の環境変数を引き継ぐことでも実行可能です。
(個人的には `sudo -i` の利用を推奨したいですが。)

* PATH
* ASDF_DIR
* ASDF_DATA_DIR

```bash
sudo visudo
```

```text:/etc/sudoers
Defaults exempt_group = "asdf"
Defaults env_keep += "ASDF_DIR ASDF_DATA_DIR"
```

## おわりに
asdf をシステムワイドにインストールする記事がありそうでなかったので書いてみました。
asdf 自体は最近知ったのですが、導入可能な環境の種類が多いので重宝するかもしれないです。

## 参考文献

* [asdf: GitHub](https://github.com/asdf-vm/asdf)
* [RubyとRuby on RailsをRbenvでインストール(システムワイド編)](https://www.rough-and-cheap.jp/linux/ruby_rbenv_install_systemwide_on_ubuntu18_04/)
【Java】文字列の一部を抜き出す

#プログラミング勉強日記
2020年12月6日
文字列の一部を抜き出せるsubstringメソッドについて学んだので使い方をまとめる。

#substringメソッドとは
　substringメソッドは文字列の一部を取得するためのメソッドである。文字列のbegin+1~end文字目を抜き出すことを抜き出すことができる。引数endを省略するともでき、省略した場合はbegin+1文字目から最後の文字列の末尾まで抜き出す。新しい文字列を返している。

```java
public String substring(int begin [,int end])
// begin：開始位置
// end：終了位置
```

#サンプルコード


```java
public class Main {
  public static void main(String[] args) {
    String str = "Good Morning Everyone.";     // String型の変数strに文字を代入
    System.out.println(str.substring(5));      // 6文字目から最後までを取得して出力
    System.out.println(str.substring(5, 12));  // 6文字目から12文字目まで取得 
  }
}
```

```:実行結果
Morning Everyone.
Morning
```

#参考文献
[substringメソッド](https://java-code.jp/795)
[1分でわかる文字列の一部を切り出しするsubstringの使い方【Java Stringクラス】](https://eng-entrance.com/java-string-substring)
Markup と Markdown 

####Markup も Markdown もテキストを装飾する為の記法の事

#Markup （ マークアップ ）
テキストやデザインなどの情報をコンピューターが正しく理解出来るように、<b>タグ</b>と言う目印をタイトルや見出しなどの構成要素に使い、意味付けを行うものです。例えば、見出し・段落・表・リストなど、文書の中で各部分が果たしている役割が分かるように表す。

主に4種類の言語があります。　`SGML`　　`XML`　　`XHTML`　　`HTML`
　

 - <b>SGML</b>　 ・・・・　紙媒体の文章や資料をコンピューターに移しましょうとして出来たマークアップ言語。マークアップ言語の礎を作ったもの。自由にあれこれ使える分、構造が複雑になりインターネット上で扱うのには不自由という部分がある。

　　*Standard Generalized Markup　Language*　を略して SGML　
　　『標準的な一般化されたマークアップ言語』　（ 拡張子は　.sgml ）
　


 - <b>XML</b>　　 ・・・・・　 HTMLと並んで人気のあるマークアップ言語。SGMLが元に作られたが、インターネットを通してのWebアプリケーションのデータ管理などに活躍。タグの名前を自由に決められる。

　　*Extensible Markup Language*　( E<b>`x`</b>tensible　<b>`M`</b>arkup　 <b>`L`</b>anguage )　 の略
　　『拡張されたマークアップ言語』　（ 拡張子は　.xml ）

 - <b>HTML</b>　 ・・・・・　Webページを作成するのに一番多く使われている言語。データのある場所を示す事が出来るためWebページ上に画像や動画、音声などを表示させる事が可能。

　　*HyperText Markup Language* の略　
　　『ハイパーテキストマークアップ言語』　（ 拡張子は　.html ）

　※ `ハイパーテキスト`とは他のページに飛ぶリンクを埋め込む事が出来る高機能テキストのこと
　

 - <b>XHTML</b>　・・・・・　HTML を XML構文のもと再定義し直した言語。今は開発されていない。

　　*Extensible HyperText Markup Language* の略　（ 拡張子は　.xhtml ）
　

#Markdown （ マークダウン ）
タグを使わず、記号などで文章を囲ったり文頭におくことでテキストの文章をHTMLやXHTMLへ変更出来る。
「マークアップ」をより簡単にしたものが「マークダウン」になります。
その手軽さシンプルさから「軽量マークアップ言語」と呼ばれる事もある。　( 拡張子は　.md )
　

<b>マークアップとマークダウンの記法を比べて見ましょう</b>
　
###Fail.html
　\<h1> 見出し \</h1>
　　\<ul> リスト
　　　\<li> リスト１ \<li>　
　　　\<li> リスト２ \<li>
　　　\<li> リスト３ \<li>
　　\</ul>　
###Fail.md
　\#見出し
　　リスト
　　　\-リスト１
　　　\-リスト２
　　　\-リスト３
　　
　
どちらも同じ出力結果になります。これだけ見ると圧倒的にマークダウン記法の方が楽ですね。
マークダウン記法はオフラインで使え簡単に書けることからメモなんかで使われることも多いみたいです。

マークダウン記法で書いた物を変換ツールを使いHTMLに変えるなんて事も出来るみたいですので、使い勝手が良さそうですね:smiley:


##参考
https://aqcg.jp/html-2/　
http://www.ic.daito.ac.jp/~mizutani/document/markup.html　
https://backlog.com/ja/blog/how-to-write-markdown/　
https://www.asobou.co.jp/blog/bussiness/markdown　
https://standards.mitsue.co.jp/resources/mm_comic/#entry-adactio
rem でエラー？

バッチファイルで rem コメント入れようと思ったらエラーになった。
：： だとエラーにならない。
なんで？

```
C:\>rem  https://aa.com/?bb=cc
cc の使い方が誤っています。
C:\>::  https://aa.com/?bb=cc
C:\>
```

rem /? と解釈されたようです。

```
C:\>rem  /?
バッチ ファイルまたは CONFIG.SYS にコメント (注釈) を記録します。

REM [コメント]
```

#### (Windows10, Windows7, DOS, CMD, ...)
Ruby attr_accessorってなんぞぉ？？

#attr_accessorっなんすか？

rails チュートリアルのsessionあたり？トークン発行してのあたりで少し詰まったので

attr_accessorって何ぞってなったから調べたことをここに残しておこうと思う。


initialize　クラスインスタンス生成　俗に言うnewされた際に１度だけ実行されるメソッド
Javaで言うコンストラクタと同じ意味っすね

```sample.rb
 def initialize(name)
  
    # インスタンス変数@usernameに引数を代入
    @name = name
  end
```
##本題
ゲッターとセッターを同時に定義してくれるメソッドです。


```test.rb
class User
  def initialize(name)
    @name = name
  end
end

user  = User.new('Alice')
user.name


# => 当然エラーですよねメソッド定義してないっすもいんね・・・・

#def name
#
#end

```


```test２.rb
class User
  def initialize(name)
    @name = name
  end

  def name # ゲッターメソッド
    @name
  end

  def name=(name) # セッターメソッド
    @name = name
  end
 
end


user = User.new('Alice')

user.name # => Alice

```
##getter setter

getter,setterって言葉耳にしたことあるかもしれないですが
railsで書くとこんな感じです。
  getter : attr_reader :name
  setter : attr_writer :name


```test3.rb
class User
  attr_reader :name # @name ゲッターメソッド
  attr_writer :name # @name セッターメソッド

  def initialize(name)
    @name = name
  end
end

user = User.new('Alice')

user.name # => Alice

```

実は更に短くなるんすよね・・・・
## attr_accessor
```test4.rb
class User
  attr_accessor :name

  def initialize(name)
    @name = name
  end
end

user = User.new('Alice')

user.name # => Alice

```
Canvas手書き・描画・お絵描きリンク集

あまり探しても見当たらなかったのでメモ。

https://www.yoheim.net/blog.php?q=20120426
https://www.otwo.jp/blog/canvas-drawing/
https://sekika.github.io/2020/01/07/CanvasEvent/?
http://mate.fuk.u-tokai.ac.jp/~yahiro/jquery.rip.js/?page=handwriting ※教材
http://tokidoki-web.com/2015/08/html5%E3%81%A8javascript%E3%81%A7%EF%BD%90%EF%BD%83%E3%83%BB%E3%82%B9%E3%83%9E%E3%83%9B%E3%81%AE%E3%83%9E%E3%83%AB%E3%83%81%E3%82%BF%E3%83%83%E3%83%81%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%A6%E3%82%84/
[Rails] コントローラー作成方法

コントローラーの役割は**「受け取ったリクエストを、モデル・ビューと連携しながらレスポンスとして返す」**です。

作成
---
```
rails　g　controller　コントローラー名　
```

rails g(generate)コマンドで、コントローラーと付随するファイルを一度に生成します。
命名規則は**複数形を使用する**です。
例えば、商品の情報を処理する場合はproductsと書きます。





アクションを定義する
---

コントローラーは、リクエストに対応する処理を記述する場所です。実際に処理を用意しましょう。


**７つのアクション**

アクション名　　　　　|役割
----------------|------------------------------------------
index	　　　　　|一覧表示ページを表示するリクエストに対応して動く
new	　　　　　|新規投稿ページを表示するリクエストに対応して動く
create	　　　　　|データの投稿を行うリクエストに対応して動く
show	　　　　　|個別詳細ページを表示するリクエストに対応して動く
edit	　　　　　|投稿編集ページを表示するリクエストに対応して動く
update	　　　　　|データの編集を行うリクエストに対応して動く
destroy	　　　　　|データの削除を行うリクエストに対応して動く


アクションとは、コントローラー内における処理のカテゴリーのことです。
コントローラーに、インスタンスメソッドとして定義します。

**インスタンスメソッド**は下記のように書きます。

```products_controller.rb
class ProductsController < ApplicationController

  def index      # indexアクションを定義した
  end

end

```

削除
---
作成したファイル、もしくはコントローラー丸ごとを削除したい場合は下記のコマンドを実行します。

```
rails　d　ファイルの種類　削除するファイル名

rails　d　controller　コントローラー名
```

rails d(destroy)コマンドは、rails gで作成したファイル一式を全て削除するコマンドです。
terraform 0.14.0 terraform.lock.hclはレビュー時に理解必須なので要約してみた


# terraform.lock.hclとは

[0.14.0がGAになった記事](https://www.hashicorp.com/blog/announcing-hashicorp-terraform-0-14-general-availability)にあるように、`terraform init`時に作成されるようになったファイルです。

役割は、Terraform が作業ディレクトリの .terraform サブディレクトリにキャッシュする様々なアイテムのロックファイルとのこと。

まず思ったのがこの新しいファイルはバージョン管理に含めるべきなのか？ですが、必要とのことでした。

>The dependency lock file launching with Terraform 0.14 is generated automatically when Terraform init is run. The generated lockfile should be committed into version control systems so that Terraform can guarantee to select exactly the same provider versions on future runs.

和訳

>Terraform 0.14で起動する依存性ロックファイルは、Terraform initの実行時に自動的に生成されます。生成されたロックファイルはバージョン管理システムにコミットされ、Terraformが将来の実行時に完全に同じプロバイダのバージョンを選択できるようになります。

## 構造

terraformファイル内のprovider requirement(verison指定など)が存在する場合、このロックファイルに記録される。

- `version`: 決定されたプロバイダーバージョン

- `constraints`: terraformが実際には参照しない値。人間向けに、version決定についての制限を示す。

- `hashes`: `New provider package checksums`という機能のhash値。

## New provider package checksums

https://www.terraform.io/docs/configuration/dependency-lock.html#new-provider-package-checksums

- providerのブロックの変更がないにもかかわらず、以前は記録されていなかった新しいチェックサムが追加されることがあります。
- `h1`, `zh`の接頭辞は、異なるハッシュスキームを示している
    - 新しいチェックサムが追加されることは、Terraformが異なるハッシュ方式の間で徐々に移行していることを表しています
        - なぜこれが発生するかというのは詳しい内部仕様理解が必要っぽいが、とりあえず都合が良い場合に新しいハッシュスキームを導入するらしい

- 新しいハッシュスキームが導入されるのが都合が悪い場合は、`terraform providers lock`にて、事前に追加設定など可能。
    - この詳しい挙動は、[terraform providers lockのコマンド説明](https://www.terraform.io/docs/commands/providers/lock.html)を参照する
    - ちらっと見ると、異なるプラットフォーム上での操作(Mac or Windows)を想定しているよう。そういったユーザーがいないチームにはあまり関係がないのかも。

## プロバイダーのアップデート

https://www.terraform.io/docs/configuration/dependency-lock.html#new-version-of-an-existing-provider

- provider requirementに例えばバージョン指定がある場合に、そのバージョンをアップデートする場合には、`terraform init -upgrade`を実行する必要がある
    - これによって、ロックファイル内にある`version`に新しいバージョンでのロックを記録する

(実行の様子)

```
$ terraform init -upgrade

Upgrading modules...

- s3 in modules/aws/s3
- security_group in modules/aws/security_group
- vpc_endpoint in modules/aws/vpc_endpoint

Initializing the backend...

Initializing provider plugins...
- Finding latest version of hashicorp/template...
- Finding hashicorp/aws versions matching "~> 3.20.0"...
- Installing hashicorp/template v2.2.0...
- Installed hashicorp/template v2.2.0 (signed by HashiCorp)
- Installing hashicorp/aws v3.20.0...
- Installed hashicorp/aws v3.20.0 (signed by HashiCorp)

Terraform has made some changes to the provider dependency selections recorded
in the .terraform.lock.hcl file. Review those changes and commit them to your
version control system if they represent changes you intended to make.
```

ロックファイルの差分例

```
  provider "registry.terraform.io/hashicorp/aws" {
-  version     = "3.17.0"
-  constraints = "~> 3.17.0"
+  version     = "3.20.0"
+  constraints = "~> 3.20.0"
```
Linuxって何？【初学者がまとめてみた】

こんにちは、うったむです。今日は__Linux__についてまとめてみました。よくわかっていなかったので、記事にしてみました。初学者の方の役に立ったら嬉しいです☺️

##Linuxとは

オープンソースとして__無料__で利用でき、ウイルスやマルウェアの影響を受けにくいオペレーティングシステムのこと。

ユーザーが変更をほどこし、独自の商品として再配布することが可能。

##CUIとGUIの違いやシェルについて

###GUI（Graphical User Interface）

マウスで操作するスタイル。
		
基本的にはLinuxは__CUI__を使って操作するが、GUIだけで操作することも可能。

###CUI（Character User Interface）

キーボードにて黒い画面にコマンドを打って操作するスタイル

###なぜCUIが必要なの？

####①CUIでしか操作できないPCがあるから

__サーバー用PC__はLinuxというOS。ほとんどの場合コマンドでしか操作できない。昔PCができた当初はCUIでしかパソコンは操作できなかった。

LinuxというOSは無料で使える。マウス（GUI）をつけて使いやすくしたものがWindowsやMac。GUIは有料...。プログラマーは必然的にコマンドを使って操作する必要がある。

####②プログラム化ができるから

一つ一つを手動で作業する必要なし。自動化できる。1時間かかるものを数秒で終えられる。	


##DosとLinuxコマンド

* Windowsは、Dosコマンド（rmdir）を使う
* Mac/Linuxは、Linuxコマンド（rm）を使う

MacはLinuxと親和性があるのでプログラマーは__Mac__を使うことが多い。Googleで検索する際、DosコマンドとLinuxコマンドは異なるので注意すべし。

##シェルの種類

シェルは「OSのインタフェースを受け持つソフトウェア」のこと。OSの中心部分を覆う「殻（shell）」をイメージさせるのでシェルと呼ばれる。

シェルはサーバーにアクセスした時やコマンドでしかできない操作をする時に利用する。

OSに対して命令を出す「黒い画面（ターミナル）」に二種類のプログラム（シェル）がある。

* Bash（バッシュ）
* zsh（ゼットシェル。

最近のMacは__zsh__に設定されている。zshの方がカスタムすると色々なことができるので便利。保存するファイルの場所がBashとzshが異なるので注意。
0→1 の toC プロダクト開発やってみて思ったこと

[CBcloud Advent Calendar 2020](https://qiita.com/advent-calendar/2020/cbcloud) の 6 日目を担当します。

今年は個人的に 「[PickGo 買い物](https://pickgo.town/shopping/)」に携わった一年だったので、いろいろなこと振り返っていこうと思います。

ちなみに「PickGo 買い物」とは、今年の 4 月にローンチした **プロのドライバーさんが買い物を代行してくれるサービス** です。
只今（12月6日現在）キャンペーン中で、 3km 圏内の店舗での買い物が配送料 0 円になるので良かったら使ってみてください！

キャンペーン LP
https://pickgo.town/shopping/cp/freeshipping-202009/

# 開発フローの改善は早めにやったほうがよい
プロダクトとしてもチームとしても立ち上げたばかりだったため、当時は実装できたら誰かが確認してリリースみたいな流れで開発していました。
ただ不思議なものでシステムが複雑化していくと、ある時期を境に不具合が多発してしまうようになりました。

また、企画段階の施策が開発側に見えていないという問題もあり、急な変更や施策の意図、技術的な調査の先回りができないみたいなことも起きていました。

これらの問題を解決すべく現在は PBL の作成と開発タスクの見える化、開発フローの見直し、それらの定期的な振り返りに取り組んでいます。
使っているツールは Asana で PBL 用のリストと開発タスク用のボードをそれぞれ作って運用しています。以下の記事がすごくイメージに近いです。
https://qiita.com/xoyo24/items/246fa5e9ad5d01273b56

また必ず実機でテストするようにしているのですが PdM やデザイナーの方々もテストに参加してもらっています。
toC アプリなので操作性や UI/UX にはこだわってて、エンジニアが気づけない FB などが上がってきたときに非常にありがたさを感じています。

# 技術選定や設計の自由度高めだが影響範囲が広い
立ち上げ当初だと人数も少なく自動的に裁量権が大きくなり、技術選定や設計などはチームの少人数で決めることが多いです。
ここらへんを魅力に感じる人も多いと思いますが、当然ですが技術選定や設計ミスると技術負債として溜まっていきます。
実際にミスったなという選定はいくつかあって、施策が続くとなかなか改修できず放置状態が続きます。

技術負債を生み出さないためにやってることとしては他プロダクトでの設計や選定をパクるようにしています。
PickGo 買い物は社内でも一番若いプロダクトでありがたいことに他のプロダクトが踏んだ負債や成功と言えるような設計を参考にすることができます。

真似をすることで [去年のアドベントカレンダー（マイクロサービス化に踏み出せない人々の代わりに踏み出してみた）](https://qiita.com/T-Tokumori/items/45b93007b3b402f5dd3b)にも記されていますが、プロダクト間で同じような機能を持ってしまうというデメリットを認識しつつも、
設計や機能を拝借しながら開発が進められるのはスピードが求められる場面においてメリットに成り得ます。

真似ばかりじゃなく、社内で運用経験のない Elasticsearch や Flutter の導入など攻めた選定もやってきました。
来年は逆に他プロダクトへここらへんのノウハウを還元できる機会があればと思っています。
特に Flutter を採用することでモバイルエンジニアが 1 人という状況でも Android と iOS ユーザーに差分なく機能を提供できています。
この選定がなければ今のスピードを維持できていなかったと思います。

一方でエンジニア市場に Flutter エンジニアはまだまだ少なく、採用に困ってしまうことに後々気付かされました。
だからといって Flutter をやめることはないと思いますが、エンジニア採用にも影響を及ぼしてしまうので技術選定はやっぱり大切です。

# アライアンスはチャンスだが運用保守に気をつける
※ 最初に言っておきますがアライアンスが悪いと言っているわけではなく、僕にとってアライアンスとは、他企業の他アプリと連携してお互いの課題解決になり得るチャンスと捉えています。

サービスを立ち上げるとありがたいことにいろいろな引き合いが存在し、中にはそれ専用の機能を開発するみたいなことも有りました。
そういった開発を行っていく上で既存ドメインを汚さないようにと意識はしつつも、修正しづらいコードになってしまうみたいなケースが多少生じてきました。
先輩エンジニアに教えてもらった DDD の腐敗防止層の考え方が直接の解決策となりえそうなので改めて勉強してみようと思います。

また連携における運用にも注意が必要です。
機能拡充やデータ連携のやり方はどちらがどの部分を担当するかなど手順や仕組み化を見越したルールを作っておかないと、こちらの作業工数を大幅に使ってしまう羽目になります。
ここらへんの取り決めは営業さんと通して行うことが多いと思うので相談して進められる関係性を構築するのも大切です。

# ドラスティックな変更を恐れない
個人的に今までにプロダクトの立ち上げをやったことがなく、またスタートアップという環境もあってか急な方針変更やドラスティックな改善をこれまでに経験したことがありませんでした。
正直言うと疲れますし、大きな変更加えたらテストがかさむし、不具合が起きたらどうしようみたいにネガティブに捉えがちでした。
これは今でも思いますしまだ克服できていないのですが、最終的には立ち上げ当初でユーザーも少ないしそれよりも PMF 達成のためにチームで頑張ろうという気持ちに切り替えるようにしています。

またドラスティックな変更を可能にするという面でモバイル開発において API のバージョン管理が大切なことにも気付かされました。
あるバージョンのアプリでは v1 を叩いているが、新バージョンだと v2 にしないと互換性が保てないなんて場面が結構あります。
Web の開発を行っていると API のバージョンをあまり意識していなかったのですが、ここらへんアプリ開発やらないとわからないノウハウなのかなと思います。

# まとめ
思いつくことをまとめてみましたが、
結論、立ち上げ当初は過激な改善や新規機能の開発がつきもので、先を見越した技術選定や設計だったりが問われます。
これは成熟したプロダクトでのそれと比べて、影響範囲が大きいので非常にリスキーだし責任ある仕事です。
やっているうちに現場の変更に対して柔軟に対応していくエンジニアとしての問題解決力がついてきます。

また 0→1 のプロダクトを開発していくということは同時にチームも立ち上げ期であることが多いです。
チーム開発する上での決まり事や運用方法も模索しながら作っていけるのでチームビルディングなどに興味がある人におすすめの環境だと思います。

チームもプロダクトもまだまだ改善の途中で完璧とは言い難いですが、0→1 やスタートアップがよくわからないという人の参考になると幸いです :pray:
【Portfolio】laravelでサイトを構築（設計→実装→デプロイ）

##成果物
[★こちらクリック! →　Go To "tiny-happiness"★](http://www.tiny-happiness.com/)
[★こちらクリック! →　Go To GitHub★](https://github.com/Yuchan-He/tiny-happiness)
[★こちらクリック! →　Go To dockerで環境構築/GitHub★](https://github.com/Yuchan-He/adminPanel)

##実装環境
インフラ：AWS
環境構築：docker
サーバー側：PHP、Laravel 5.8
ソート管理：Git
フロント側：Html,CSS,JavaScript,jQuery

##機能一覧
～RESTful設計原則に則る～
■記事一覧表示
■記事詳細表示
■記事投稿/コメントをつける
■ユーザー新規登録
■ユーザーログイン/ログアウト
■DB操作：Create（生成）、Read（読み取り）、Update（更新）、Delete（削除）
■[DBテーブルのリレーション操作](https://qiita.com/Yuchan-He/items/99d27b73e578839d8e21)
■権限分け（RBAC｜ロールベースアクセス制御）
■Ajax機能(jQuery)
■画像アップロード

##機能の詳細
■記事一覧表示
　・Laravelのページネーションを使い、configの中にページ数を定義することで、一括で修正することは可能　
■記事詳細表示
　・登録済みのユーザーが記事の中でコメントできる
　・記事と記事のコメントをすべて表示する
■記事投稿/コメントをつける
　・ユーザーのログイン状態を確認してから、登録済みのユーザーがコメントできる
　・画像アップロードできる(下記の【画像アップロード】にご参照)
■ユーザー新規登録
　・新規登録するとき、提出前に、ユーザー名の使用状況を確認(下記の【Ajax機能(jQuery)】にご参照)
■ユーザーログイン/ログアウト
　・ログインするとき、ユーザー名とパスワードのバリデーションを検証する
　・ログアウトしない限り、ログイン情報がSessionに保存し、2時間以内再度ログインする必要がない
■DB操作：Create（生成）、Read（読み取り）、Update（更新）、Delete（削除）
　・Create（生成）とき、正規表現とバリデーションでデータの有効性を確認
　・Read（読み取り）、キーワードによりの検索
　・Update（更新）、登録済みのデータが表示されたうえで更新する
　・Delete（削除）、論理削除と物理削除を分ける
■[DBテーブルのリレーション操作](https://qiita.com/Yuchan-He/items/99d27b73e578839d8e21)
　・ユーザーのIDから役割を取得(1対多の逆関係　→　belongsTo)
　・役割から権限を取得(多対多　→　belongsToMany)
　・記事からすべてのコメントを取得(1対多　→　hasMany)
　・記事のIDから記事のユーザーを取得(1対多の逆関係　→　belongsTo)
　・コメントのIDからコメントのユーザーを取得(1対多の逆関係　→　belongsTo)
■権限分けで管理操作（RBAC｜ロールベースアクセス制御）
　・Middlewareを設定して、ログインしていないユーザーは管理画面へアクセスできない
　・管理者:すべての権限を持つ
　・スタッフ：管理者から付与した権限範囲内で操作
　・一般ユーザー：自分のデータしか操作できない
　・権限以外の画面が表示しない
■Ajax機能(jQuery)
　・新規登録するとき、ユーザー名が存在するかどうか
　・crud操作する時、Ajaxで送信
■画像アップロード
　・API(Webupload)を使って、画像アップロードする
　・画像がアップロードしないとき、ディフォルトの画像を使う
■単体テスト

##紹介動画(作成中)
完全版：
分割版(一本/1min以内)
変数名の力

# CODECOMPLETEの変数名の力を読んで。

## きっかけ
プログラムを書く過程で、誰もが悩んだことがあるだろう変数名について改めて学んでみようと思った。
有名な書籍としてリーダブルコードがあるが、CODECOMPLETEの '変数名の力'は、良い名前、悪い名前について丸々一章割かれている稀有な本です。

## 良い変数名とは
本書の章末を要約したものである。

- 変数名は出来る限り具体的なものにする。曖昧な名前は通常悪い名前である。
- ループ変数や、状態変数のような特殊な変数には注意すること。
- 読み手のことをイメージし命名すること
- 命名規則を採用すること

言葉で書けば単純であるが、ではどうやって、良い変数名の精度を高めていくのか。
その手法と注意点を書いていく。


### 変数名の的確な長さ
変数名の長さは重要である、
短すぎれば、意図が汲みとれず、長過ぎれば、可読性が落ち、コーディングの負担が増加する

本書では、明確な意図を伝えつつ、可読性を損なわない範囲として
変数名に概ね8~20文字程度の長さが良いと示されている。

もちろん、これは変数名を必ずこの長さにしないといけない。というわけではない、
文字数が少ない変数名があれば、それが必要な明確さを保っているか確認する指針として使うをこと推奨している。

極端に短い変数名として、```i j k ``` などが上げられる。
ループ変数など寿命が短いものであれば、暗黙的な了解として使用しても良いが、
その他の場面や、ループがネストする場合、その値をさらに加工する場合はにおいては、具体的な名前を振っておくことが良いとされている。

### 変数名を無闇に省略しない
下記のような省略された名前は意味を持たない。
また、数字などを使用すると可読性が落ちる。

```
Current 
Date
X1 x2 x3 
Temp
CurrentDate → cd
linesPerPage -> lpp
```

### Boolの変数名

Boolを変数名にする場合は　変数名 = true or falseで意図が伝わるか注意する必要がある。
本書の一例として下記の名前がBoolに適しているとされている。

```
done
error
found
success
available
```

逆に``` status , sourceFile ``` などは不適切である。
状態 = true or false とはどういうことか。そもそも良い状態と悪い状態とは何を表すのか明確でない。

では、適切ではない値を扱うにはどうするか。
本書では以下のパターンが紹介されている。

```
statusSuccess
sourceFileAvailable
```

上記の要領でBoolに適した値を末尾につける。
そうすることでBoolには適していない名前を、適したものに置き換えているのである。


#### 否定的な変数名は避ける
否定的な名前は、否定されるとわかりにくい。

```
notFound
empty
```
よく使われている例として```notFoundなどは　if not !notFound```などになっている場合可読性が落ちる


### 正しい反意語を使用する
反意語は理解しやすく、一貫性を保つことが出来る。

```
begin/end
first/last
start/end
old/news
source/target
```

#### 命名規則を作る　（まとめ）
本書後半では、プロジェクトやチーム単位の大小に関わらず、命名規則を作ることを強く推奨しており、
その作成方法に多くのページが割かれていました。
人によっては命名規則をチームで持つことは難しく、困難である場合もあるかもしれません。
しかしそのような状況においても、<b>命名規則を自身で持つ</b>ことは有用であると感じました。
反意語やBoolに使用できる名前を収集し、語彙力を高めておくことが良い変数名をつける第一歩なのではと、思います。

もちろん今回まとめた以外にも有用な情報が多く記載されているので、気になった方は手にとってみてはいかがでしょうか。

www.amazon.co.jp/dp/489100455X
Google PlayのUSランキングの上位層のアプリを見ながらゲームを考えてみる #1


#はじめに#
就活用にUnityでなにかハイパーカジュアルゲームを作ろうと思ったのですが、せいぜい十個くらいしかやったことがないのでそこまでこのジャンルについて知りません。
なのでこの記事ではGooglePlayのアメリカの無料ゲームのランキングを見ながらアプリの企画について考えていこうと思います。
餅は餅屋といいますし、上位に入ってるアプリの良い所を参考にすれば共通点やDL数をあげるコツが分かるのでは？という発想です。
なんでアメリカなの？かというとそっちのほうがユーザーが多く、ユーザー数をより多く欲しい場合は対応せざるを得ないと思うからです。

#見ていくアプリ#
URL:https://play.google.com/store/apps/collection/cluster?clp=0g4cChoKFHRvcHNlbGxpbmdfZnJlZV9HQU1FEAcYAw%3D%3D:S:ANO1ljJ_Y5U&gsr=Ch_SDhwKGgoUdG9wc2VsbGluZ19mcmVlX0dBTUUQBxgD:S:ANO1ljL4b8c&hl=us&gl=us
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293139/cada0e9d-2027-c77f-8f31-35623c34b5bd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293139/00984523-eb63-94ec-4e00-029ae12b124b.png)

#Among Us#
いわゆる宇宙人狼ですね。
人狼をグラフィカルにしたようなゲームです。
海外はいまいちわかりませんが、日本ではこのゲームは実況者とかVtuberがやってたから流行ったイメージがありますね。
同じようなゲームでいうと、ProjectWinterを2DにしてSFチックにした感じでしょうか。

https://www.famitsu.com/news/202011/09208954.html

こちらの記事によると海外でもTwitchの大手ストリーマーが取り上げて、それで流行ったようです。
ルールが単純かつ有名で、実況映えしていて、見ているだけでも楽しいし、実際にプレイしてもすぐに楽しめます。

パブリックで見知らぬ人とやるときは大体が海外の方とマッチングしますし、そもそも日本語は入力できないので
英語だけで話して人狼を特定していく感じになります。
人狼側は一人killしてから次のkillまでに長めのクールタイムがあったりで、レベルデザインがすごいなと思います。

昔からの遊びを別の形にしてゲームにするというのは結構やってる所が多い気がしますが、いい成功例だと思います。
世界共通とはいわずとも、やっているところが多い遊びを調べて何かのジャンルと掛け合わせるというのはよさそうですね。

あそびと言って思い出しましたが、世界のアソビ大全とかいうゲームがありましたね。
テーブルゲームが基本ですが、あれも同じような発想なのかな。
#Project Makeover#
パズル＆着せ替えゲームという感じでしょうか。
レビューを見ていると難易度高め＆運要素高め＆要求ゲーム内通貨が多い＆回復手段が少ない、みたいなマゾゲーな印象を感じます。
パズルゲームは基本やらないので参考にしづらいですが、着せ替え要素が一つのゲームの面白さの形としてあるゲームは多いですよね。
#Roof Rails#
VOODOOさんのハイパーカジュアルゲームですね。
キャラが持っている棒を大きくして、その棒でアイテムを拾ったりアクションしたりするゲームです。
棒が擦り切れたら失敗するようです。
ハイパーカジュアルゲームは結構持っているものを大きくしてなにかするゲームがある気がしますね。


#Sushi Roll 3D - Cooking ASMR Game#
寿司を作って提供するゲームです。
どこかで見たようなデザインの客が要望してくるメニューを色々なアクションで作っていきます。
#オブジェクトハント#
隠れん坊オンラインですね。これ。
#ショートカットラン#
VOODOOさんの作品ですね。
最近の広告だとこれが一番見る気がします。
道でブロックを集めて、そのブロックの分だけ海をショートカットできる。
アイコン、名前、ストアの画像全てで分かり易いですね。
プレイしていなくてもゲームの内容が伝わってきたので、分かりやすさが如何に大事なことなのかと思わされますね。
ぱっと見で内容を伝えるっていうのは凄いことだよなあ、とつくづく思います。
#Imposter Solo Kill#
Among Usに寄せた暗殺ゲーですね。
#Chat Master!#
チャットアプリのようですがいまいち500万ダウンロードされている理由が分かりません。
Google Playは謎が多いですね...
#BMX Space#
BMXができるゲームですね。オンラインプレイにも対応しています。
同じデベロッパーの作品を見るとこれとは別に自由にBMXが楽しめるゲームがあったので、
そちらからの流入が多そう。
一つのジャンルを専門的につくっていくスタイルも一部のユーザーには刺さりそうです。
#まとめ#
個人的にはスマホゲーは横持ちのほうが好きなものが多いのですが、ランキングで見ると無料ゲームで横持ち要求しそうなのはほとんどないですね。レースゲームであっても縦持ちで作られているものがあります。こういうジャンルで横持ちは人権無さそう。
あと見るからにパクリって分かるレベルでも消されないのも発見ですね。する気もないですが。

自分はレースゲームが好きなので、こういうハイパーカジュアルを作るとしたら車要素やレース要素を含めたいですね。

今回はこの辺で一回終わりにします。
つづきはまた別で投稿することにします。
あの人はどんなことが好きなんだろう・・と気になる人と遊んでみよう！ウェブサービス「１０の質問」を公開しました。

# はじめに

本日（2020-12-6）、個人サービスとして「１０の質問（β版）」を公開しました。

開発期間は約２週間、平日もお仕事が終わってから深夜までカチャカチャ作ってました。

コロナで人と会わなくなって、人との交流が少なくなって、でもその分人への興味が湧いてきて、そんな気持ちでスタートしたプロジェクトです。

そんな感じで作ったサービスについて、サービス概要やら使った技術やら書いていこうと思います。

よろしくお願いします。

# 「１０の質問(β版)」

https://tenq.kai-lab.com/

## 一言で言うとどういうサービス？

- リアルタイム相性診断サービス

## こんな人に遊んで欲しい

- どんなことが好きなんだろう、と気になる人がいる
- いつも遊んでいる仲間のことをもっと知りたい
- 久しく会っていない友達と話す話題が欲しい

## 遊び方

- 代表者が「ルーム」を作ります
- 代表者は招待URLを一緒に遊びたい人に送ります
- 一緒に遊びたい人がルームに集まったら診断スタートです
- １０個の質問が順に出てきます
- １０問終わったら結果が出ます
- 結果を見てみんなでわちゃわちゃしてください

##### 注意: 

- 一人で遊ぶ用のサービスではありません
- 遊ぶには `２人以上`のユーザがルームにいる必要があります

## 制限

- ルームは１０人まで入ることができます
- １問５秒の制限時間があります
- ルームは未使用のままだと１０分で削除されます

## どうして作ったの？

- コロナ禍で人と会う機会が減りました
- いつも会ってた人はどうしてるかな、と思うことが増えました
- そう言えばあの人はどんなことが好きなんだっけ？と思うことが増えました
- みんなでリアルタイムに遊べて、かつみんなのことがわかるサービスがあったらいいなと思いました
- 何か話題のネタになるようなサービスを作ろうと思いました

という感じです。

## こだわったところ

### リアルタイム制

リアルタイム制にはこだわりました。一緒に楽しむ、がテーマの一つだったので、同じ時間に同じ物を見て、答えて、一緒に結果を見る、をリアルタイムに行うところは一番のこだわりです。

そのために今まであまり使ってこなかったWebSocketを使ってリアルタイム処理を実現させています。

## 募集

- 質問は現在１００個用意されています
- 質問を作っていると、結構主観的な物が多くなってくるなと思いました
- いろんな人から質問を募集したいという思いがあります
- ということで、こんな質問をサービスに入れて欲しい、というのがありましたらこちらの記事のコメントか[Twitterのこちらのアカウント](https://twitter.com/youkinaengineer)までジャンジャンお寄せください

## 使った技術

### フロント

- VueJS
- Vuex
- Vuetify

### バックエンド

- Python
- Django
- Django-Channels（これでDjangoでWebSocketを使えるようになる）
- MySQL
- Redis

### インフラ

- AWS EC2
- docker-compose
- Firebase

## 今後こうしていきたい

- サーバ処理をAWSに寄せたい
    - 今はDjangoで作っているが最終的にはLambdaに集約したい
    - サーバの管理コストを減らしていきたい
- 質問の数をどんどん増やしていきたい
    - 現時点で１００個質問を用意しています
    - とりあえずの目標は１０００個まで増やしたい
- レイアウト改善
    - デザインが苦手なエンジニアです。。
    - もっとサイトデザイン、レイアウトを綺麗にしていきたい

以上です。

最後までお読みいただきありがとうございました。
Composeのライフサイクル (onActive, onCommit, onDispose) についてメモ

割とすぐ忘れるので。

以下のようになっていた場合。


```kotlin
@Composable
fun Screen() {
    var selectedTab by remember<MutableState<Tabs>>{ mutableStateOf(Tabs.Tab1) }

    println("no wrap $selectedTab")
    onActive {
        println("onActive")
        onDispose {
            println("onDispose in onActive")
        }
    }
    onCommit {
        println("onCommit 1")
        onDispose {
            println("onDispose in onCommit 1")
        }
    }
    onCommit(selectedTab) {
        println("onCommit 2")
        onDispose {
            println("onDispose in onCommit 2")
        }
    }
    onDispose {
        println("onDispose")
    }
...
```

## onActive()
基本的に**一回だけ呼ばれる**が、このComposable関数自体が使われなくなればonActive内のonDispose()が呼ばれ、またこのComposableが使われた時にonActive()が呼ばれる。
また外側のActivityがdestroyなどになってもonDispose()が呼ばれる。

## onCommit()
基本的に**変更ごとに毎回呼ばれる**。そのたびに以前にonCommitされていれば、onDispose()が呼び出される。
引数なしでは、基本的にこの外に書くのと違いがなさそうで、引数無しで呼び出されることはなさそう。(そういうパターンがあれば教えていただきたいです。タイミングが違ったりする？)

## onCommit(argment)
onActive同様のタイミングと**引数が変わったタイミングで呼ばれる**。また引数がわかったときにはonDisponseも呼ばれる。


# 動作を見てみる

### 起動するだけ
```
I/System.out: no wrap Tab1
I/System.out: onActive
I/System.out: onCommit 1
I/System.out: onCommit 2
```

### selectedTabの変更

```
I/System.out: no wrap Tab2
I/System.out: onDispose in onCommit 2
I/System.out: onDispose in onCommit 1
I/System.out: onCommit 1
I/System.out: onCommit 2
```

### selectedTab以外の変更があったとき

```
I/System.out: no wrap Tab2
I/System.out: onDispose in onCommit 1
I/System.out: onCommit 1
```

### Screen()自体が使われなくなったとき

```
I/System.out: onDispose
I/System.out: onDispose in onCommit 2
I/System.out: onDispose in onCommit 1
I/System.out: onDispose in onActive
```

### アプリ終了時

```
I/System.out: onDispose
I/System.out: onDispose in onCommit 2
I/System.out: onDispose in onCommit 1
I/System.out: onDispose in onActive
```
Docker を使った Mysql接続(JDBC + Kotlin + spring Boot)

# spring Boot（JDBC)とDocker で「DB接続」を行う(今回はMysqlを採用）

## 記事としての立ち位置

- 本記事は、Macを使っています。
- とりあえず、動かすことをメインに考えています


## １. docker-compose.yml への記述

```
version: "3"
services:
  db:
    image: mysql:5.7
    restart: always
    ports:
      - 3317:3317
    command: --port 3317
    volumes:
      - ./sql:/docker-entrypoint-initdb.d
    environment:
      - MYSQL_ROOT_PASSWORD=「root」で入るためのパスワード
      - MYSQL_DATABASE=新しいDBのなまえ

  adminer:
    image: adminer
    restart: always
    ports:
    - 8000:8000
```


## 2, dockerコンテナの起動のコマンド（これでDBが作成される）

```
docker-compose up -d
```

###  確認方法

#### Docker コマンド

```
docker-compose exec db bash  
mysql> show databases;
```




## 3.  application.properties に記述する

```yml
spring.datasource.url=jdbc:mysql://localhost:3317/{作成をしたDB名}
spring.datasource.username=mysqlにログインをするユーザー名
spring.datasource.password=mysqlにログインをするパスワード
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.initialization-mode=always
spring.jpa.hibernate.ddl-auto=update
```

※　port番号は適当です！（3317でも良いですし、9999でもOKです）

### 必須項目

```
spring.datasource.url=jdbc:mysql://localhost:3317/{作成をしたDB名}
spring.datasource.username=mysqlにログインをするユーザー名
spring.datasource.password=mysqlにログインをするパスワード
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
```


## 4. build.gradle ファイルに、ライブラリを追加

```kotlin
implementation("org.springframework.boot:spring-boot-starter-jdbc")
implementation("mysql:mysql-connector-java")
```

## 接続完了！！　のはず・・・・
- curlなどでデータを挿入してみる **(完了方法)**
【サルが書く】Lazy Eager loadingでもキャストしたい


わきゃ!!

GIGアドベントカレンダー9日目になります！
GIGメンバーの投稿はこちら👇 から見てみてね！
https://qiita.com/organizations/gig-inc

```php
$test = Test::where(['test' => 'test'])->get();

$test->load(['table_name' => function ($query) {
            $query->orderByRaw('CAST(table_name.column_name AS signed) ASC');
}]);
```

これでいけると思います。
CLOVAスキル開発で「すいませんわかりませんでした」を解決した記録

#発話履歴

という箇所で発話の履歴を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/56f0d522-3537-63d2-27b4-c61f704de49d.png)

スキルに登録している発話を正確に認識しているのに、「すいませんわかりませんでした」となっている。
解決出来ないかもと思いきや

#正確に認識という部分の勘違い！

私が呼び出し名で登録していたのは「夕飯出来るよ」
いつの時からか「夕飯出来たよ」と呼び出し名で登録していたと自分が勘違いをしていた事が原因。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/1ab4a454-7dbe-07e6-7ba8-904de90b9a38.png)

#対策
今後、自分で利用していくにあたってこの間違いは起こしやすいと思ったので
呼び出し名(サブ)にバリエーションを登録。

（注）呼び出し名(サブ)には4パターンしか登録できないという事も判明

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/f51ed364-1ea9-3a91-705e-bbd232f58a0b.png)
Tensorの型を変換する方法【Pytorch】

#はじめに
多層パーセプトロンのネットワークを使ったシンプルなモデルで自分が用意したデータを学習してほしかった。
そうしたら、エラーがでてきた。
#実行環境
- Windows10 64bit
- Anaconda(Spyder)
- Python 3.6.12
- Pytorch 1.7.0
- torchvision 0.8.1

#エラー


```
RuntimeError: Expected object of scalar type Long but got scalar type Double for argument #2 'target' in call to _thnn_nll_loss_forward
```

上のエラーはだいたいこんなかんじ
「私はLONG型を扱いたいのに渡されてきたのがDouble型でした」
pytorchは基本このLong型を用いるらしい。

学習データのことを指摘しているということは察したのだが、これだけだと一体「入力データ」がDouble型なのか「ラベル」がDouble型なのかわからないので、`dtype`を使う

```
net.train()#訓練モード
for i, (images, labels) in enumerate(train_loader):#学習データを読み込んだ
    print(images.dtype)#追加　imagesの型を表示
    print(labels.dtype)#追加　labelsの型を表示
```

imagesは入力データ、labelsはラベルを示している。

ここにはコードを記載していないが、train_loaderは`torch.utils.data.DataLoader`の戻り値(?)である。

先ほどの構文を追加して実行すると、imagesのほうは「torch.float32」と表示した。
これはいわゆるFloat型だ。Doubleではない。

一方、labelsのほうは「torch.float64」と表示。
こっちはDouble型だ。こいつが悪い！


#解決方法

```
for i, (images, labels) in enumerate(train_loader):#学習データを読み込んだ
　　　　labels = labels.long()#追加　Long型に変換
```

単刀直入に書くと、上のコード`labels.long()`を追加するだけ。

この「long」の部分をほかの型（intやfloat等）に変えてあげれば好きな型に変換される。

#考察

　自分がラベルとして用意したデータはただの整数（具体的に0,1,2の3種類）であったのが、いつの間にかDouble型になっていた。番号を記載したテキストファイルを読み込んでラベルデータを作成したのだが、その際にDouble型にされたのかもしれない。
　そう思って、このデータ作成の時点でLong型にするべく、コードを見直した。

　numpyの配列（array）にデータが入っているのでこれをLong型に変換する

```
#yがラベルデータ（numpyのarray）
y = np.dtype('int64').type(y)#追加
```
yをreturnする前にこの構文を追加した。
`int64`としているが`long`でもOK

そうしたら普通にうまくいった。
`torch.utils.data.DataLoader`を行う前でも後でも型変換できると分かった。

#おわりに
型を変換することについてググったのだが、どのサイトも「作成時に型を指定する方法」しか書いておらず、肝心なもう出来上がっているデータを型変換する方法が載っていなかった。
そのせいなのか、こんな単純なコードのために数日犠牲になったのだが、それもよい経験なんだと思う。
この記事が「サンプルコードを使えば今すぐにオリジナルデータを学習出来るんじゃね？」と思った少年少女達の助けになってくれれば幸いである。

#参考文献

第2回　PyTorchのテンソル＆データ型のチートシート：PyTorch入門 - ＠IT
[https://www.atmarkit.co.jp/ait/articles/2002/13/news006.html](https://www.atmarkit.co.jp/ait/articles/2002/13/news006.html"https://www.atmarkit.co.jp/ait/articles/2002/13/news006.html")
App Store Small Business Programを申請してみた

# App Store Small Business Programとは？

年間収益が100万ドル以下のデベロッパーに対して、有料AppおよびApp内課金への手数料が、30％から15％に引き下げられるプログラムです。

Apple Developer ニュースとアップデート
[App Store Small Business Programを発表](https://developer.apple.com/jp/news/?id=i7jzeefs)
[App Store Small Business Programへの登録受付開始](https://developer.apple.com/jp/news/?id=6lyxewwp)

# 申請手順

App Store Connectにサインインします。
![スクリーンショット 2020-12-06 9.43.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/48cdc1b0-1ea7-008e-6b72-4e5b8e5dc211.png)
「Review the updated Paid Applications Schedule.」の警告が表示されている場合は「Agreements, Tax, and Banking」をクリックして同意を行います。
これは、今までにも有料アプリの規約が変更になった際に行っていた手続きです。

上の警告が表示されなくなったら「Learn More」をクリックします。

---
App Store Small Business Programの概要説明ページが表示されます。
スクロールしていくと以下の画面にたどり着きます。
![スクリーンショット 2020-12-06 9.44.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/32d2a63f-486e-d82e-081b-7d1342b1cc9e.png)
「Enroll」をクリックします。

---
![スクリーンショット 2020-12-06 9.45.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/e583f351-f8fb-e2ef-cce8-b16e1a7abf8c.png)
冒頭の警告表示に対する確認項目と思われます。
「Yes, I have accepted.」チェックボックスをオンにします。

---
続いて、「他の関連する開発者アカウントを保持しているか」に関する確認項目があります。
![スクリーンショット 2020-12-06 10.09.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/1652a9ea-6302-1e42-9c90-3a90b2a3ad23.png)
いくつかの項目があります。

以下のような背景に基づく確認項目のようです。

[TechCrunch Japan](https://jp.techcrunch.com/2020/12/04/2020-12-03-developers-can-now-enroll-in-apples-small-business-program-for-reduced-app-store-fees/)より引用：
>12月31日以降にプログラムが開始されると、参加デベロッパーは他のアカウントとの間でアプリを移せなくなる。
>これはおそらく、開発者による「このアプリは儲かりすぎたため、早く他のアカウントに切り替えてしまおう」といった行為を防ぐためだ。
>「2020年12月31日以降にアプリを移そうとした場合、または2020年12月31日以降に開始されたアプリの移転を受け入れた場合、プログラムに参加する資格がなくなります」と、アップルは記述している
>
>複数の開発者アカウントを管理している場合、それらを特定するようにアップルは求めている

私の場合は個人の開発者であり他に関連するアカウントはないため、全て「No」を選択しました。

---
![スクリーンショット 2020-12-06 9.49.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/3d4f3244-11fb-340b-183a-50fdcb64e7b6.png)
チェックボックスをオンにして「Submit」をクリックします。

---
![スクリーンショット 2020-12-06 9.51.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122917/8dbf73eb-5bc6-6087-44eb-76937a375a95.png)
上の画面が表示されます。

---
以上で手続きは完了のようです。

Apple Developerから「We’ve received your request to join the App Store Small Business Program.」というタイトルのメールが飛んできます。

>We’ll review your details and let you know your enrollment status by December 30, 2020.

メール本文によると、2020年12月30日に審査結果が出るようです。

**ご注意：**
~~本記事執筆時点ではまだ審査が終わっていませんので、上記が正しい手順であることを証明できません。~~
申請の際は自己責任でお願いします。
（2020/12/24 追記）
審査が無事に通ったようですので、結果を別記事として書きました。
[続・App Store Small Business Programを申請してみた→結果が出ました](https://qiita.com/y-some/items/2cc6ea3ee8cd9920577c)
小学生でも解けるベイズの定理の問題（ベイズの定理を使わない解法）How to Solve Bayes' Theorem Problems without Bayes' Theorem

<B>ベイズ則の定理<B>
P(X=x|Y=y)P(Y=y)=P(Y=y|X=x)P(X=x)

ベイズの定理といえば、確率では有名な定理だが、これを小学生は解くことが出来るだろうか？最近、ベイズの定理を使わずベイズの定理を解く方法を考えた。以前はベイズの定理を使わず、解こうなんて事は考えなかったが、たまたま考えてみることになった。そうすると５分以内で解法を思いついた。


(問題）ある街の子どもたちは毎日1/4の確率で飴玉をもらうことができ，飴玉をもらうと1/2の確率で笑顔になるという。その街の，笑顔な子どもが飴玉をもらっている確率を求めよ。(ただし，この街の子どもたちが笑顔でいる確率は1/3である。)

（解法）別にベイズの定理を知らなくても、小学生でも解ける解法を発見したので書いておく。ある街の子どもたちは毎日1/4の確率で飴玉をもらうことができ、飴玉をもらうと1/2の確率で笑顔になるということは、1/8 = 3/24 の確率で、飴玉をもらい笑顔になる。この街の子どもたちが笑顔でいる確率は1/3であるということは、子供の 1/3 - 1/8 = 5/24 が飴玉を貰わなくて笑顔。つまり 3/(3+5) = 3/8 が答えである。
PHPの無名関数を使ってみた

### 無名関数とは？

公式ドキュメントの引用です。
>無名関数はクロージャとも呼ばれ、 関数名を指定せずに関数を作成できるようにするものです。 callable パラメータとして使う際に便利ですが、用途はそれにとどまりません。

https://www.php.net/manual/ja/functions.anonymous.php

### callableパラメータ
callableパラメータとしての使い方を見てみます。

```php
<?php

// 使用方法1

// クロージャ
$double = function($number) {
    return $number * 2;
};

$numbers = [1, 2, 3, 4];

// 各値を2倍にしていく
$new_numbers = array_map($double, $numbers);

// 結果
[2, 4, 6, 8]


// 使用方法2

$numbers = [1, 2, 3, 4];

$new_numbers = array_map(function($number) {
    return $number * 2;
}, $numbers);

// 結果
[2, 4, 6, 8]
```

### 変数の使用
次に、外部から変数を使用する場合の使い方を見てみます。

**エラー例**

```php
<?php
$numbers = [1, 2, 3, 4];

// 倍率を指定する。
$magnification = 3;

$new_numbers = array_map(function($number) {
    return $number * $magnification;
}, $numbers);

// 結果
PHP Notice:  Undefined variable: magnification in......

```

そのまま、変数を使用しようとするとエラーとなります。
そこで、`use`を使用します。

```php
<?php
$numbers = [1, 2, 3, 4];

// 倍率を指定する
$magnification = 3;

$new_numbers = array_map(function($number) use ($magnification) {
    return $number * $magnification;
}, $numbers);

// 結果
[3, 6, 9, 12]
```

もちろん参照渡しにすると、変数の値を変更できます。

```php
<?php
$numbers = [1, 2, 3, 4];

// 倍率を指定する
$magnification = 3;

$new_numbers = array_map(function($number) use (&$magnification) {
    // loopごとに倍率に1を足す
    $magnification++;
    
    return $number * $magnification;
}, $numbers);

// 結果
[4, 10, 18, 28]
```

### 型指定
型を指定することができます。
指定していないからといってエラーにはならないですが、安全性、保守性の向上を考えると指定しておいたほうが良いです。
例としてLaravelのEloquentsを使用します。

```php

<?php

$persons = App\Person::all();

array_filter($persons, function(Person $person) {
    // IDEによってはgenderに補完が効き、定義元へジャンプできるようになる。
    return $person->gender == '男子';
});
```

### Laravel使用例
最後にLaravelのCollectionでよく使うので紹介します。


```php

collect(['太郎', null, '次郎'])
    ->reject(function ($name) {
        // 名前がない要素を除外
        return empty($name);
    })
    ->map(function ($name) {
        // 末尾に「さん」をつける
        return $name . 'さん';
    })
    ->values();

```

※`values()`を使うことでキーをリセットしてくれます。

公式ドキュメントのweb内検索で`function()`と検索するとどのような場面でfunction()を使用しているかわかるので参考になります。
https://readouble.com/laravel/5.8/ja/collections.html
Xcode 12でのビルドが2021年4月から必須になる件と、Xcode 11から12への移行事例

# 情報

**2021年4月移行、アプリ審査の提出時にはXcode 12ビルドが必須**になります。

https://developer.apple.com/jp/ios/submit/

>2021年4月以降、App Storeに提出するiOS AppとiPadOS Appはすべて、Xcode 12およびiOS 14 SDKでビルドしなければなりません。

# 事例

私が現在担当しているアプリでも移行を実施しましたので、結果を共有します。
移行作業は例年に比べると軽微でした。

## 移行環境

- Xcode 11.3 → 12.1

## アプリ概要

- ファイナンス系
- 画面数：約120
- Swiftステップ数：約85,000
- 使用Framework
    - WebKit
    - StoreKit
    - LocalAuthentication
    - PassKit
    - WatchConnectivity
    - UserNotifications

## ライブラリ

### ライブラリ管理ツール（Carthage）への影響

- **CarthageビルドがXcode 12で失敗する問題**があります。**公式リポジトリで[回避方法](https://github.com/Carthage/Carthage/blob/master/Documentation/Xcode12Workaround.md)が公開されています**ので、それを使うことにしました。
- Xcode 12でビルドするためのシェルスクリプトが公開されているので、それを使うという回避方法で、ソースの修正等は必要ありませんし、Cartfileや導入ライブラリに対しての作業は特にありませんでした。

### 導入済みライブラリへの影響

11.3時代のバージョンそのままでも、特に問題はありませんでした。

- Firebase Analytics - 6.32.0
- Firebase Crashlytics - 6.32.0
- Lottie - 3.1.4
- KeychainAccess - 3.2.0
- RealmSwift - 3.18.0

### ソースコードへの影響

Xcode 12のサジェスチョンに従って自動FIXした箇所が数カ所ありました。
以下のような、「再代入していないvar変数をletに変更」といった軽微なもので、コンパイルはさくっと通りました。

```diff
-        var foo = self.bar
+        let foo = self.bar
```
GitHubのReadmeにGif動画埋め込み（QuickTimeで画面収録→ffmpegでgifへ変換→issueにアップロード）

# はじめに
ポートフォリオのデモ動画を載せたいと思い、GitHubのReadmeにGif動画を埋め込んでみました。

# 前提
・macOS Catalina10.15.7
・Ruby2.7.0
・Ruby on Rails6.0.3
・MySQL8.0

# 流れ
1. ` QuickTime`で画面収録（ここでは省略します）
1. ` ffmpeg`をインストール
2. ` ffmpeg`で` mov`を` gif`に変換
3. ` issue`にアップロード

# ` ffmpeg`をインストール
## ffmpegとは
・あらゆる画像・動画のフォーマットを変換してくれるフリーソフト。
・Githubはmov形式に対応していないため、ffmpegでmov形式の画像をgif形式に変換する必要あり。
・ホームディレクトリでインストール。

```ruby:ターミナル 
brew install ffmpeg
```

# ` ffmpeg`で` mov`を` gif`に変換
・動画データのあるディレクトリに移動し、下記コマンド実行。
・` sample.mov`に動画ファイル名記載。
・` scale`は表示サイズ、今回は横幅720、高さはアスペクト比を維持して自動設定。

```
ffmpeg -i sample.mov -vf scale=720:-1 -r 10 sample.gif
```

# ` issue`にアップロード
・Githubにgif動画をあげる方法はいくつかあるみたいですが、今回はissueにアップロードする方法で。
・issueを新しく作り、先ほど作ったgifファイル（sample.gif）をドロップ。
・上限が10MBまでのなので注意！
・すると下のURLがでるのでそのままReadmeにコピー、埋め込み完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/905803/73caa078-92e8-841b-7e65-257c5dca7a78.png)

# 終わりに
以上３つの手順で、簡単にReadmeにGif動画を埋め込むことができました！
imagemagickを使うと、スクリーンショットや画像の圧縮、変換もできるみたいなので、色々使ってみたいと思います。

初学者のため、理解不足な点が多々あると思います。気になった点やアドバイスなどありましたら、教えていただけますと幸いです！


# 参考サイト
・[MacのQuickTime Playerで画面を収録する](https://support.apple.com/ja-jp/guide/quicktime-player/qtp97b08e666/mac)
・[画像・Gif動画を使ってReadmeを彩ろう](https://qiita.com/athlaliel/items/91adb2ac4bc229a2069a)
・[githubのREADMEに埋めるgif動画の作り方決定版](https://qiita.com/noppefoxwolf/items/9b930b1724387902e244)
・[【ffmpeg】動画の解像度を指定してリサイズ、アスペクト比を維持したまま解像度を変更する、回転する](https://qiita.com/riversun/items/d09d8e596a20ec1798f3)
・[GithubのReadmeに荒くないgifを作成から貼り付けまで](https://qiita.com/kosuke0820/items/ebeb0c59b603c7224eac)
terraformの差分をカッコよく表示するサービスを作ったので使って欲しい

## はじめに
この記事は[terraform Advent Calendar 2020](https://qiita.com/advent-calendar/2020/terraform)の16日目です。
早速お詫びですが、熱心に旬のネタを書くというよりはzennやtwitterで既に発信しているものをここでも宣伝するだけの記事です。

12月になっても16日、25日の枠が余っていて、いまだに25日が埋まっていないので...ご容赦頂ければ幸いです。

## terraformの差分をカッコよく表示するサービスをつくりました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562066/2c41d8ad-95dc-ad77-3bc8-61c7a1739b70.png)

[こちらです](https://maito1201.github.io/terradiff.github.io/)、`terradiff`という名前を付けました。
ありきたりな名称なので名前被りが迷惑をかけるような事案があったら変更せねば...

紹介記事は[zennで書いた](https://zenn.dev/ito/articles/753b3117a171fec6d2da)ので割愛します。

## 使い勝手

具体的に仕事での差分を貼るわけにはいかないので、こんな時良かった、と言いづらいですが...
variablesの中身が1個変わる程度の細かい変更で、注意して見なくても何が変わったのか見落とすことが無くなりなりました。

## 反響

zennの記事は2いいねでした、かなしい。
twitterではもう少しだけ反応があったので一切見向きもされない物では無いと思うのですが...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562066/f5a41ba1-8836-fc61-41a0-fa90113cd4d6.png)

せっかく作ったので使っていただけた方が嬉しいなと思っています、というわけで宣伝でした。
Ansible playbookを書くときに PyCharmを利用する

# はじめに
皆さまはPlaybook書く時、どの様な環境をご利用でしょうか?
わたしは業務でPython用のIDE `PyCharm`を利用しているのですが
AnsibleのPlaybookを書くのにも便利だと感じたのでご紹介します

# 良いところ
以下が気に入っているところです
1. Ansible plug-inでmodule等の入力補完ができる
2. Jinja2 templateのサポート

## 1. 入力補完について
事前準備として、以下のAnsibleの無料PlugInがあるのでこれを入れます
https://plugins.jetbrains.com/plugin/14893-ansible

例えば`co`と入力すると、該当するmoduleリストが出てきます
![スクリーンショット 2020-12-06 11.17.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122764/2414c159-f36b-1f61-c697-e4a7a7bfd39b.png)

パラメータも補完してくれます(型も表示してくれる:thumbsup:)
![スクリーンショット 2020-12-06 11.20.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122764/edb250aa-a0d6-17ba-888e-f7e1129d1ef1.png)

## 2. Jinja2のサポートについて
Jinja2はPyCharmで最初からサポートされていました
以下の様に、Jinja2 templateを使うときにも入力補完や静的解析してくれます
![スクリーンショット 2020-12-06 11.48.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122764/87111d34-0813-7c22-f0d5-dc9f921f426c.png)

## その他
以下のOrchidEという有料のプラグイン使うともっと便利で静的解析などもしてくれます
https://www.orchide.dev/index.html
※お金ないので使えないですが :cry: 

# おわりに
簡単ですが、以上です。
PyCharmはTypoチェック機能なども使いやすいので重宝しています。

他のいい環境などあれば教えてほしいです :bow:
(vscodeが人気なのかな)
[Vue warn]: Avoid mutating a prop directly警告の解消の仕方

## [Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders.
vueの警告についての説明とその対処法についてまとめる。
親コンポーネントから子コンポーネントに値を渡して以下のような実装をすると警告が出た。（クリックをするたびに警告が出ていることがわかる。）

```vue:App.vue
<template>
  <div>
    <Prop :number="number"></Prop>
  </div>
</template>

<script>
import Prop from './components/Prop'

export default {
  data: function() {
    return {
      number: 0,
    }
  },
  components: {
    Prop,
  }
}
</script>
```

```vue:Prop.vue
<template>
    <div>
        <button @click="increment">+1</button>
        <p>{{ number }}</p>
    </div>
</template>

<script>
export default {
    props: ["number"],
    methods: {
        increment() {
            this.number += 1;
        }
    }
}
</script>
```

![スクリーンショット 2020-12-06 11.38.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574301/b807c665-aa1a-542b-ddc5-9e5b47c44461.png)


親コンポーネントからnumberを取ってきてクリックをするたびに値を+1するというコードになっている。一見このコードには問題がないように見えるが、、

![スクリーンショット 2020-12-06 11.39.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574301/72d00209-36e1-4635-526d-45ee2abcc1a7.png)


クリックをするたびに警告が出ていることがわかる。警告の内容を見ると、Avoid mutating a prop directly,,,と書かれている。mutateは「変化する」という意味で解釈すると、「直接プロップを変更しないで」という意味にとることができる。

今回、親コンポーネントからnumberを取ってきて、それをクリックするたびに+1,つまり値を変更している。ここに問題があったということがわかる。

#### 解決策

直接値を変更しなければいいのだから、子コンポーネントに渡ってきたnumberを新しくなんらかの変数に入れて定義しなおせばいい。

```vue:Prop.vue
<script>
export default {
    props: ["number"],
    data: function() {
        return {
            num: this.number
        }
    },
    methods: {
        increment() {
            this.num += 1;
        }
    }
}
</script>
```

このように渡ってきた値を子コンポーネントの方で新しく変数に入れて定義すると、警告がなくなる。

![スクリーンショット 2020-12-06 11.46.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574301/294f2c67-f089-fb2f-24b4-68dc4c0d393c.png)
Mapbox-GL.jsのCanvasをテクスチャにして遊ぶ



最初はベクトルタイルのpbfを読み込んでCanvasに描画してテクスチャにするという面倒な事をやっていたのですが、Mapbox-GL.jsにgetCanvasというメソッドがあるのを知り、こっちのほうがお手軽に出来るな。。。ということでやってみました
こんな感じです

https://northprint.net/webgl/mapbox-getcanvas/
![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2788/94f59162-1da9-d067-7975-acf4265c8d12.gif)


利用ライブラリーは

- Mapbox-GL.js
- three.js

の２つです

以下のような感じでcanvasをPlaneのテクスチャーに設定しています

```javascript:index.js
(略)
        geometry = new THREE.PlaneGeometry( 5, 5, 32 );
        plane = createMesh(geometry);
        scene.add(plane);
(略)
function createMesh (geometry) {
    const canvas = new THREE.Texture(map.getCanvas()); // canvas要素を読み込む
    const material = new THREE.MeshBasicMaterial({side: THREE.DoubleSide});
    material.map = canvas;
    return new THREE.Mesh(geometry, material);
}
```

ソースコードはこちらに置いておきます
https://github.com/northprint/mapbox-getcanvas-sample
ちなみにmapのタイルURLは設定していないので自分の好きなものを設定してください
おすすめはこちら→https://maptiler.jp/
AtCoder Regular Contest 110


##LCM
2つの正整数(a, b)の積は、それらの最大公約数(GCD)と最小公倍数(LCM)の商に等しくなります。
2つの正整数の最大公約数は ユークリッドの互除法 を使えば求まります。

###ユークリッドの互除法

```C++:C++
int gcd(int x, int y){
    if(x<y) swap(x, y);

    while(y>0){
        int r = x % y;
        x = y;
        y = r;
    }

    return x;
}
```

2つの積をgcdで割る。

###[A - Redundant Redundancy](https://atcoder.jp/contests/arc110/tasks/arc110_a)

```C++:C++
#include <bits/stdc++.h>

#define rep(i,n) for(int i=0; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9

using namespace std;
using ll =long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }
const long long INF = 1LL << 60;

int gcd(int x, int y){
    if(x<y) swap(x, y);

    while(y>0){
        int r = x % y;
        x = y;
        y = r;
    }

    return x;
}

int main(int argc, const char * argv[]) {
    int n;
    cin >> n;

    ll res = 2;
    for(int i=3; i<=n; i++){
        res = (i * res / gcd(i, res));
    }
    cout << res + 1 << endl;

    return 0;
}
```

###まとめ
arcは難しすぎる
BigQueryでコサイン距離やユークリッド距離を計算

[BigQuery Advent Calendar 2020](https://qiita.com/advent-calendar/2020/bigquery)の6日目の記事です。

下記のようなテーブルデータで、各アイテム同士のコサイン距離やユークリッド距離をさくっとBigQueryで計算する方法を解説します。（セルフジョインっぽいやり方をしていて、BigQuery的に良いやり方ではないかもしれません..少量のデータでサクッと計算したいときにご参考ください。もっと良いやり方がありましたら、教えて下さい。）
![ss 2020-12-06 11.59.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538103/2c84395d-0084-c4a3-56da-fda2aed8d1df.png)


今回のデータは、各アイテムに３つの属性値が付いていて、それを元に似ているをアイテムを抽出したい場合を考えます。また、各アイテムの属性は今後増えていくことも想定して、その場合でも対応できるクエリを考えます。

```sql
WITH
  item_vectors AS (
  SELECT
    item_id,
    ARRAY_AGG(attribute_value
    ORDER BY
      attribute_index) AS attribute_values
  FROM
    `xxx-yyy-zzz.sandbox.items`
  GROUP BY
    item_id )
SELECT
  item_vectors1.item_id,
  item_vectors2.item_id,
  (
  SELECT
    1-SUM(value1 * value2)/ SQRT(SUM(value1 * value1))/ SQRT(SUM(value2 * value2))
  FROM
    UNNEST(item_vectors1.attribute_values) AS value1
  WITH
  OFFSET
    pos1
  JOIN
    UNNEST(item_vectors2.attribute_values) AS value2
  WITH
  OFFSET
    pos2
  ON
    pos1 = pos2 ) AS cosine_distance,
  (
  SELECT
    SQRT( SUM((value1 - value2)*(value1 - value2)))
  FROM
    UNNEST(item_vectors1.attribute_values) AS value1
  WITH
  OFFSET
    pos1
  JOIN
    UNNEST(item_vectors2.attribute_values) AS value2
  WITH
  OFFSET
    pos2
  ON
    pos1 = pos2 ) AS euclidean_distance
FROM
  item_vectors item_vectors1
JOIN
  item_vectors item_vectors2
ON
  item_vectors1.item_id != item_vectors2.item_id
ORDER BY
  item_vectors1.item_id,
  item_vectors2.item_id

```
まずは、各アイテムごとに集約して、属性値をArrayとして持ちます。その後に、セルフジョインして、アイテム×アイテムの類似度を計算していきます。

コサイン距離やユークリッドの計算には、UNNESTとOFFSETを利用することで、計算を簡単にすることができます。
MySQLが起動しない（Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)）

#開発環境
- Ruby 2.5.8
- Rails 5.2.1
- MySQL 8.0.22

#新規開発をしようと「rails db:create」をした時のこと・・・
ポートフォリオの大方の設計が出来上がってきたので、アプリの大枠だけでも作成しようと`rails new`をして新規アプリを作成し、`rails db:create`でDBを作成しようとしたところ、エラーで止まった。

```terminal
rails db:create

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
Couldn't create 'myPF_development' database. Please check your configuration.
rails aborted!
Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```

1週間ほど前に、実際の開発工程に入ってから躓くのは嫌だと思い、同じバージョンのRuby,Rails,MySQLで確りとテスト開発して確認したのになぜなのか…
<br>
1週間前は動いた`mysql -u root -p`を打っても、

```terminal
mysql -u root -p

Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```

となるばかりでまるで反応はなく…。またか…先週MySQL周りの設定で2日潰れたというのにまたなのか…MySQL君…、といった気持ちで調べてみるとやはりこの状況になる方は多いようで様々な記事が見つかりました。
その中でも、今回解決に導いてくれた記事を以下に貼っておきます。この記事のお陰で無事MySQLが動いてくれました。とても助かりました。

■ 参考にした記事
[mysqlが起動できない（Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)）](https://qiita.com/carotene4035/items/e00076fe3990b9178cc0)



解決はしましたが、今後もちょくちょくMySQL周りのエラーは起きそうな気がするので、Qiita記事を書く練習も兼ねてまとめておきます。上の記事と殆ど同内容にはなってしまいますがご容赦下さい。

#mysql.sockファイルを作成する
エラー文にも書いてあるとおり、`mysql.sock`というファイルを通してローカルのMySQLサーバーに接続しているらしいのですが、その`mysql.sock`ファイルがないと言われています。
そして厄介なことに、このファイルがなんらかの原因で消えることがあるらしいと。なので、以下のコマンドを通して`mysql.sock`ファイルを作成します。

```
sudo touch /tmp/mysql.sock
```

#MySQLの再起動をする
`mysql.sock`ファイルを作成したら、MySQLを起動し直します。

```
sudo mysql.server restart

Starting MySQL
... SUCCESS!
```

やった！

#再度rails db:createしてみる
```
rails db:create

Created database 'myPF_development'
Created database 'myPF_test'
```

いけた！よかった！


#おわりに
これからもMySQL関連を触る時はお祈りしながらコマンドを打つことになりそうです…笑
先人のQiita記事に大感謝。

<br>
おまけ（個人的メモ）
MySQLの起動：`mysql.server start`
MySQLへの接続：`mysql -u root -p`
npm-check-updates (ncu) v10 の引数まとめ

# はじめに
[npm-check-updates](https://github.com/raineorshine/npm-check-updates) は、package.json に書かれている依存性を、特定されているバージョンを無視して最新版へと書き換えます。通常は`ncu`と`ncu -u`でそれぞれ更新のチェックと書き換えを行ってくれるのですが、引数を付けて細かい設定をしたい場合があります。引数については日本語の記述が無かったり、古いバージョンに対する記述があったりするので、まとめました。

用いた ncu のバージョンは`10.2.2`です。

# 使い方
グローバルインストールする

```shell
npm i -g npm-check-updates
```

基本的な使い方

```shell
ncu # 更新の確認するが、package.jsonの書き換えはしない
ncu -u # 更新を確認して、package.jsonを書き換える
npm i # 書き換えたpackage.jsonを元にインストールする

ncu -v # バージョンの表示
ncu -h # ヘルプの表示
```

同時接続数をデフォルトの8から1へと変更する（手元の環境ではHTTPリクエストが詰まってタイムアウトする事があった）。

```shell
ncu --concurrency 1
```

メジャーバージョンを固定して、マイナーバージョンのみ更新する。

```shell
ncu --target minor
# ncu --semverLevel major # semverLevelは廃止された
```

マイナーバージョンを固定して、パッチのみ更新する

```shell
ncu --target patch
# ncu --semverLevel minor # semverLevelは廃止された
```

# 参考リンク
- [公式GitHub](https://github.com/raineorshine/npm-check-updates)
- [package.jsonのnpmのバージョンを一括で書き変えてくれるncuが便利だった](https://tacamy.hatenablog.com/entry/2016/08/10/193603)
    - 2016年の記事で記述が古かった