OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberrypi起動時に"Driver 'sdhost-bcm2835' already registered, aborting"'under-voltage' が出てログインできない問題

# 解決策
5V 2.5A のUSB電源ケーブルに変えると解決した。
（5V 1Aの変換プラグを使っていたことが原因だったと思われる）

> [Raspberry Pi 3 Model B Plus, Ubuntu Mate installation error: “driver ‘sdhost-bcm2835’ already registered, aborting](https://ubuntu-mate.community/t/raspberry-pi-3-model-b-plus-ubuntu-mate-installation-error-driver-sdhost-bcm2835-already-registered-aborting/19300/11)
>  I had the same issue with my Pi 3 B+ the first time I flashed the SD Card. The " Error: Driver 'sdhost-bcm2835' is already registered, aborting..." message and restarts.
> 
> As someone in this thread recommended, I flashed the card for the 2nd time. Now when I tried booting it up I got a new 'under-voltage' error.
> 
> I used a new power supply and it worked perfectly.
> 
> Hence from my experience:
> 
> Try flashing again.
Check if your USB is providing enough juice.
> [RPi3:2.5A必要らしいけどいろんな電源を試してみる](https://www.raspi.jp/2016/03/rpi3-try-powersupplies/)

# 意味なかったこと
Ubuntu Mate 18.04を使っているのが悪いかと思って、
Ubuntu Mate 16.04をつかってみたが解決せず。。回り道をしてしまった。

> [RaspberryPi 3B+にROSを導入する](http://hara.jpn.com/_default/ja/Topics/RaspPi3BPlusRos.html)
> [Raspberry Pi 3B+(Ubuntu Mate 16.04LTS)にROS kinetic をインストールしてturtlesimを動かす](https://qiita.com/seigot/items/ce88174c1123400fc2a4)

# 参考
[Ubuntu mate 18系で"Driver 'sdhost-bcm2835' already registered, aborting"なるエラーを吐いてログインからまともに進めなくなったら……諦めるのが早そう](http://shuzo-kino.hateblo.jp/entry/2019/08/15/222023)
[Raspberry Pi 3 Model B Plus, Ubuntu Mate installation error: “driver ‘sdhost-bcm2835’ already registered, aborting](https://ubuntu-mate.community/t/raspberry-pi-3-model-b-plus-ubuntu-mate-installation-error-driver-sdhost-bcm2835-already-registered-aborting/19300)
[Raspberry Pi 3 Model B Plus, UbuntuMate install error: "driver 'sdhost-bcm2835' already registered](https://www.raspberrypi.org/forums/viewtopic.php?f=56&t=237962&sid=584ded6c150bb07e41eaf61ac7b68d1f)
[Raspberry Pi 3 Model B Plus, Ubuntu Mate installation error: “driver ‘sdhost-bcm2835’ already registered, aborting](https://ubuntu-mate.community/t/raspberry-pi-3-model-b-plus-ubuntu-mate-installation-error-driver-sdhost-bcm2835-already-registered-aborting/19300/11)
[ラズパイの電源不足を調べてみました。](https://raspberrypi.mongonta.com/underpower/)
[RPi3:2.5A必要らしいけどいろんな電源を試してみる](https://www.raspi.jp/2016/03/rpi3-try-powersupplies/)
P5.js 日本語リファレンス(lightness)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の lightness関数を説明します。

## lightness() 

### 説明文

指定した色からHSL明度値を取得します。

### 構文

lightness(color)

### パラメタ

- color  
p5.Color | Number[ ] | String：p5.Colorオブジェクト、カラーコンポーネント、CSSカラー

### 戻り値

Number：HSL明度値


### 例

```javascript
function draw() {
  colorMode(HSL);
  let c = color(156, 100, 50, 1); // 緑色を設定
  fill(c);
  rect(15, 20, 35, 60);
  let value = lightness(c); // HSL明度値50を取得します
  fill(value);
  rect(50, 20, 35, 60);
}
```

### 実行結果

![lightness.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/1b161880-76f9-4350-a14f-911112f314bf.jpeg)


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
複数の Enumerable なオブジェクトで tally したい【結論】deep_each

# 前置き

これまで、複数の Enumerable なオブジェクトで tally するためにあれこれ考え、

[複数の Enumerable なオブジェクトで tally したい【追記あり】](https://qiita.com/kts_h/items/246a9af2834544ea0b24)

を書き、@obelisk68 さんと色々やり取りをして、こんな示唆もいただきました。

[Enumeratorを返すArray#flatten（Ruby）](https://qiita.com/obelisk68/items/2fbbf34c8a2e67febc3d)

# 現時点でのまとめ

それで、あれこれ考えてみたところ、結局、`deep_each` があればいいんじゃないか。

世の中にはいろんな実装例がありますが、簡単なのは、

```ruby
module Enumerable
  def deep_each(&block)
    return to_enum(__method__) unless block_given?
    each do |e|
      case e
      when Enumerable
        e.deep_each(&block)
      else
        block.call(e)
      end
    end
  end
end
```

これがあれば、Array 以外のオブジェクトにも対応可能です。

```ruby
enums = Enumerator.new(20) do |y|
  20.times do
    y << Enumerator.new(20) do |yy|
      20.times do
        yy << Enumerator.new(20) do |yyy|
          20.times do
            yyy << rand(1..5)
          end
        end
      end
    end
  end
end

enums.deep_each.tally
=> {4=>1579, 5=>1664, 2=>1564, 3=>1586, 1=>1607} 毎回答えは変わります。
```
Win10HomeのDockerでJupyterLab環境を構築する

# 概要

仮想環境ソフトウェアDockerを使うことで、OSに関係なく計算環境を構築・移行することが出来ます。Win10HomeでJupyterLab環境を構築する手順を示します。このJupyterLab環境では、Python, R, Juliaを使うことが出来ます。

# 各用語の説明

* 仮想環境 : ハードウェアやOSの異なる環境でも動作する仕組みのこと。これにより、ハードウェアやOSに依存せずに環境を動作させることが可能。
* Docker : 仮想環境ソフトウェアの一つ。「コンテナ」という仕組みを採用しており、従来の仮想環境ソフトウェアと比較し軽量であるのが特徴。オープンソース。
* Dockerhub : 様々なDocker環境がアップロードされているサーバー兼ウェブサイト。たった1つのコマンドでDocker環境を構築することが出来る。
* JupyterLab : Python, R, Juliaなどの言語をインタラクティブに実行出来る計算環境。ブラウザベースで動作するため、仮想環境ソフトウェアで簡単に構築することが出来る。今回はDockerhubにアップロードされているJupyter公式のDocker環境を用いる。

# 手順

1. Windows 10 Insider Preview ビルドをインストールする<br>[Windows Insider Program ユーザー ガイド - Microsoft](https://insider.windows.com/ja-jp/how-to-pc/)
1. Docker Desktop Edge 2.2.2.0をインストールする<br>[Docker Desktop for Windows Home is here! - docker official blog](https://www.docker.com/blog/docker-desktop-for-windows-home-is-here/)
1. PowerShellで`docker`コマンドが正常に動くことを確認する<br><img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278468/aded82dc-3c44-9e79-308a-a480bdfeb274.png width=400>
1. メニューバーのDockerアイコンを右クリックして「Linux containers」に切り替える<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278468/681a8fe7-ca3c-76f5-9408-cbc733c8436a.png)
1. メニューバーのDockerアイコンを右クリックして「設定」を選択する。Dockerと共有したいドライブにチェックを入れておく。この場合はCドライブにもDドライブにもチェックを入れておけば良い<br><img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278468/18002202-d5f3-d1a2-dd9a-a83a5a477474.png width=400>
1. Powershellで以下のコマンドを走らせる。以下の`d:/Desktop`では共有先ディレクトリとして「DドライブのDesktop」を指定している。各自の環境に合わせて適宜変更する。<br>`docker run -d --restart always -p 10000:8888 -e JUPYTER_ENABLE_LAB=yes -v d:/Desktop:/home/jovyan/work --name notebook jupyter/datascience-notebook jupyter-lab --NotebookApp.token='' --allow-root`
1. 以下のURLにアクセスする<br>[http://localhost:10000](http://localhost:10000)
1. 正常に起動できれば、以下のように表示される。①workフォルダ以下にデスクトップのファイルが表示される、②各言語のnotebookを作成、③`conda install (ライブラリ名)`コマンドで各ライブラリをインストール<br><img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278468/f27e6337-14f9-af76-0568-c7ce31edd4b6.png width=400>


# 参考URL

* [Docker Desktop for Windows Home is here! - docker official blog](https://www.docker.com/blog/docker-desktop-for-windows-home-is-here/)
* [Windows 10 Home 対応の Docker Desktop for Windows を一足早く試してみました - TechRacho](https://techracho.bpsinc.jp/ebi/2020_03_27/90477)
* [jupyter/datascience-notebook - dockerhub](https://hub.docker.com/r/jupyter/datascience-notebook)
PygameがmacOSで動かない問題

## はじめに

Macでpygameを使ってゲームを開発していた際、pygameが上手く動いてくれなかったのを解決したのでメモ

## 環境

* macOS Calatalina 10.15.1 
* Python 3.7.3

## 解決方法

pygameのバージョンを `2.0.0.dev4` に上げる

2020年4月26日現在、`pip install pygame` だとpygame1.9.4がインストールされるため、バージョンを指定してインストールする必要がある

```
$ pip install pygame=2.0.0.dev4
```

## 参考

* https://u29.hatenablog.com/entry/2019/10/26/035327
* https://github.com/pygame/pygame/issues/555
P5.js 日本語リファレンス(lerpColor)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の lerpColor関数を説明します。

## lerpColor () 

### 説明文

2つの色をブレンドしてそれらの間にある中間色を取得できます。 amtパラメータは2つの値の間を補間する量です。0.0は開始の色に等しく、0.1は開始の色に非常に近く、0.5はその中間などです。0未満の値は0として扱われ、1以上の値は1として扱われます。

色が補間される方法は、現在のカラーモードによって異なります。

### 構文

lerpColor(c1, c2, amt)

### パラメタ

- c1
p5.Color：補間を開始する色

- c2
p5.Color：補間を終了する色

- amt
Number：0と1の間の数

### 戻り値

p5.Color： amt の位置する中間色

### 例

```javascript
function draw() {
  let from = color(200, 00, 0); // 赤色を設定
  let to = color(0, 0, 200); // 青色を設定
  colorMode(RGB);
  let interA = lerpColor(from, to, 0.33); // 1/3地点での補完色
  let interB = lerpColor(from, to, 0.66); // 2/3地点での補完色
  fill(from);
  rect(10, 20, 20, 60);
  fill(interA);
  rect(30, 20, 20, 60);
  fill(interB);
  rect(50, 20, 20, 60);
  fill(to);
  rect(70, 20, 20, 60);
}
```

### 実行結果

![lerpColor.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/754f4510-7512-9edd-18be-8eda468f73b2.jpeg)


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
[Tensorflow] tensorflowでarray_to_imgの使い方

# tensorflowでarray_to_imgの使い方
自分用メモ

## 環境
- Anaconda
- python 3.5
- Tensorlow 1.5.0
- (jupyter notebook)

## array_to_img
array_to_img　が使えなかった。下記のモジュールインポートで解決した。

```
  from tensorflow.python.keras.preprocessing.image import array_to_img
```
P5.js 日本語リファレンス(hue)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/private/91818244dc26c767a0fe) の hue関数を説明します。

## hue() 

### 説明文

指定した色から色相値を取得します。

色相はHSBとHSLの両方に存在します。この関数はHSBカラーを指定した場合にHSBの色相値を返しますが、それ以外の場合はデフォルトでHSLの色相値を返します。 (返す色相値は最大色相設定により異なります) 

### 構文

hue(color)

### パラメタ

- color  
p5.Color | Number[ ] | String：p5.Colorオブジェクト、カラーコンポーネント、CSSカラー

### 戻り値

Number：色相値

### 例

```javascript
function draw() {
  colorMode(HSB, 255); // カラーモードをHSBに設定
  let c = color(180, 126, 255);
  fill(c);
  rect(15, 20, 35, 60);
  value = hue(c); // 色相値180を取得する
  fill(value);
  rect(50, 20, 35, 60);
}
```

### 実行結果

![hue.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/d6cabb93-9337-600b-f5ce-8422e7b0c341.jpeg)

### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
複数のconsoleに同時入力

メモ

これ便利

https://orebibou.com/2015/12/%E3%81%93%E3%82%8C%E3%81%A0%E3%81%91%E3%81%AF%E6%9C%80%E4%BD%8E%E9%99%90%E3%81%8A%E3%81%95%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84iterm2%E3%81%AE%E4%BE%BF%E5%88%A9%E3%81%AA%E6%A9%9F/
【Rails】has_secure_passwordでパスワードのセキュリティを強化

##目的
__パスワードのセキュリティを強化する。__

##手段
__has_secure_passwordを使ってパスワードをハッシュ化する。__

・ハッシュ化は、訳のわからない暗号みたいな文字列に変換すること。

・has_secure_passwordでハッシュ化されたパスワードは、同じ文字列で生成すれば常に同じ値になるので一致しているかどうかをチェックする際に使える。

・has_secure_passwordでハッシュ化したパスワードは、元のパスワードそのものに戻すことができないので、ハッシュ化されたパスワードを奪われたとしても何の問題もないのでパスワードのセキュリティが強固になる。


##手順
####1.Userモデル作成時のパスワード属性をpassword_digestとする。
　➡︎has_secure_passwordを使う際の命名規則なので必須。

####2.Gemfileにbcryptというgemを追加して、インストールする。
　➡︎bcryptというgemをインストールすることで、has_secure_passwordを使えるようになりパスワードをハッシュ化できるようになる。
　➡︎$ bundle installコマンドを忘れずに。

####3.Userモデルにhas_secure_passwordを記述。
　➡︎Userモデル内にhas_secure_passwordを記述したことにより、password属性とpassword_confirmation属性の2つの属性が追加される。データベースのカラムとは対応していない属性。

　➡︎どういうことかというと、この2つはユーザーに入力を求めるためだけの属性で、`この2つの属性をユーザーに入力させる`ことで、`Railsはこの2つの一致をチェック`した後、`一致していたらそのパスワードをハッシュ化`して`データベースのpassword_digest属性に格納される`ようになっている。

__以上の記述を行うことで、ユーザーの新規登録時に入力したパスワードはハッシュ化されるようになる。__

>```:ターミナル
  $ rails g model user ... ... password_digest:string
```

>```ruby:db/migrate/[timestamps]_create_users.rb
  class CreateUsers < ActiveRecord::Migration[5.2]
    def change
      create_table :users do |t|
        .
        .
        .
        t.string :password_digest
        .
        .
        .
      end
    end
  end
```

>```:ターミナル　
  $ rails db:migrate
```

>```ruby:Gemfile
  gem 'bcrypt', '~> 3.1.7'
```

>```:ターミナル
  $ bundle install
```

>```ruby:app/models/user.rb
  class User < ApplicationRecord
    has_secure_password
    .
    .
    .
  end
```

<br>
試しにコンソールで確認してみる。

>```ターミナル
  $ rails c --sandbox
    > user = User.new(..., password: '123456', password_confirmation: '123456')
    > user.save
    => true
　
    >user.password_digest
    => 'fflafbnalwefhhhawkleufhb'
```

ユーザーにpasswordとpassword_confirmationに任意の値を入力させれば、2つの属性が一致しているかどうかを検証した後に、ちゃんとハッシュ化されたパスワードがpassword_digest属性に保存されている事がわかる

##参考
　[現場で使える Ruby on Rails 5速習実践ガイド](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E7%8F%BE%E5%A0%B4Rails&qid=1586706956&sr=8-2)
【Unity】否定演算子の使い方

#環境
Unity 2019.3.7f1

#はじめに
否定演算子の使い方がわからなくなるのでメモ

#使い方
使い方は2種類
**・if文で使用**
　if(変数 != 数値)
　{
　　処理内容
　}

**・trueとfalseを逆にする**
　変数 = !変数;

#具体例
**・if文で使用**

```CSharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class test : MonoBehaviour
{
    int a;

    void Start()
    {
        a = 2;

        //aが1ではないなら処理
        if(a != 1)
        {
            Debug.Log("aは1じゃないよ");//コンソールに表示
        }       
    }
}

```
**実行結果**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/c6a7b6eb-aab5-37a9-707e-d67a8e269de4.png)


　
**・trueとfalseを逆にする**

```CSharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class test : MonoBehaviour
{   
    bool a;
    
    void Start()
    {
        a = true;

        a = !a;
        Debug.Log("a=" + a);
        a = !a;
        Debug.Log("a=" + a);
        a = !a;
        Debug.Log("a=" + a);
        a = !a;
        Debug.Log("a=" + a);        
    }
}

```

**実行結果**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/02efc8b5-e1a1-8f41-9a01-b7ea45535b74.png)

#おわりに
なにかと使える否定演算子
vim-quickrunで標準入力にクリップボードを流し込む

##前提
###環境
- macOS Catalina(10.15.3)
- Neovim(0.4.3)
- deinで[vim-quickrun](https://github.com/thinca/vim-quickrun)をインストール済

### やりたかったこと
quickrunで走らせるプログラムに標準入力としてクリップボードの中身を渡すこと．
### 動機
　競プロのテストケースを手軽なキーバインドで実行したかった．しかし，vim力と時間が足りなかった．
　そこで，ひとまずinit.vimでcppファイルを読んだときにautocmdでベタ打ちのQuickRunのコマンドにキーバインド（runとか）を付ければいいだろうという結論に達した．
　コピーしてきたテストケースを実行するにあたって，inputオプションにそのまま入力文字列を入れるのは不都合があったし，新しくファイルを作るのも少々手間かつキーバインドの定義に要求される技術力が上がってしまう．したがって，clipboardから直接入れるという方法が最善だと思った．ここで詰まった．
##解決
`:help QuickRun`して[ドキュメント](https://github.com/thinca/vim-quickrun/blob/master/doc/quickrun.jax)を読むと，

> input (*)
標準入力に流し込むファイルを指定します。先頭が = で始まっていた場合、それ以降の文字列を入力として扱います。

また，

> オプション値の構文
いくつかの設定は、実行時に中身の一部が置換されます。(*) がついている設定は、@,&,$で始まる単語をそれぞれレジスタ、オプション、環境変数として展開します。曖昧さを避ける為、単語を{}で囲っても良いです。

とあるので，init.vimで`set clipboard=unnamed`としている人は無名レジスタとクリップボードとの紐つけがあるので，無名レジスタの中身(=クリップボードの中身)を文字列としてinputに流し込むためには`-input =@`とオプションを付ければよい．
###コード
最終的に，init.vimにこう記述することにした．

```vim:init.vim
autocmd BufNewFile,BufRead *.cpp nnoremap <silent>run :QuickRun -command g++ -outputter quickfix -cmdopt -Wall -input =@<CR>
```
##終わりに
QuickRunはとても便利だが，Atcoderをやるぶんにはもっと良いツールを公開してくださっている方がいらっしゃるし，自前でももう少し高機能なモノを書けると思うので，テストの実行はどんどん改善していきたい．

（ここに書くべきではない余談ですが，deinのtomlファイルでhook_addで辞書型の変数をletしようとすると`[dein] Vim(let):E15: 無効な式です: {`と出て困っているので，もし原因に見当のつく方がいらっしゃれば教えてくださると泣いて喜びます．)
AtCoder ABC 150 C問題 "Count Order" 解法メモ

自分＆なかなか解けなくてほかの方の提出を見ても分からない方用の解法メモです。
[こちらのnote](https://note.com/memenekokaburi/n/nf0201d6002cd)を拝見させていただいて初めて解けました。とても感謝しています。

#コード

```c++
#include <bits/stdc++.h>

typedef long long ll;
const int INF = 1e9;

using namespace std; 

#define REP(inc, bgn, end) for (int inc = bgn; inc < end; inc++)

int main() {
    int n;
    cin >> n;
    vector<int> p(n), q(n), a(n);
    REP(i, 0, n) cin >> p[i];
    REP(i, 0, n) cin >> q[i];

    /* 
    next_permutation()のための順列を作ります。
    この順列は、辞書順で一番小さいものです。
    */
    REP(i, 0, n) a[i] = i + 1;
    
    /* 
    連想配列に作った順列を格納ていきます。
    構造は以下のようになっています。
    Key: value = [順列]: 辞書順で数えたときの番号
    例) [1, 2, 3]: 1
     */
    map<vector<int>, int> mp;
    
    do {
        mp[a] = mp.size();
    } while (next_permutation(a.begin(), a.end()));

    int ans = abs(mp[p] - mp[q]);
    cout << ans << endl;
}
```

##next_permutationについて
>※全ての順列を取得する場合は、関数に最初に与える範囲が昇順にソート済みになっている必要がある

と上記のnoteに書かれているように、next_permutationに渡す配列はソートされたものにしましょう。
コードの配列aはそのために作ったものです。

```c++
mp[a] = mp.size();
```
この部分ついて
配列aはnext_permutationによって毎回変わるイメージです。
mp.size()は連想配列の大きさを返しますが、do-while文によってmpの要素が増えるたびに1, 2, 3 ...と大きくなっていきます。
つまり、mp.size()はその順列（配列）が辞書順で何番目かを取得してくれています。
P5.js 日本語リファレンス(color)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の color関数を説明します。


## color() 

### 説明文

colorデータ型の変数に格納する色を作成します。 パラメータは現在のcolorMode() に応じてRGBまたはHSB値として解釈されます。 デフォルトモードは0〜255のRGB値であるため、関数呼び出しcolor(255, 204, 0)は明るい黄色を返します。

color() に提供される値が1つだけの場合、それはグレースケール値として解釈されます。 2番目の値を追加するとアルファ透明度に使用されます。 3つの値が指定されるとそれらはRGBまたはHSB値として解釈されます。 4番目の値を追加するとアルファ透明度が適用されます。

単一の文字列引数が指定されている場合, RGB, RGBA, および16進数のCSSカラー文字列とすべての名前付きカラー文字列がサポートされます。 この場合, 2番目の引数としてのアルファ値はサポートされていません。RGBA形式を使用する必要があります。

### 例

```javascript
function draw() {
  colorMode(RGB);
  let c = color(255, 204, 0); // RGBで黄色を指定
  fill(c); 
  rect(30, 20, 55, 55); 

  c = color(90); // グレー色を指定
  fill(c);
  ellipse(100, 75, 80, 80);

  c = color('blue'); // 名前付きカラー文字列で blue を指定
  fill(c);
  rect(160, 20, 60, 60);

  c = color('#00ff00'); // 16進数のCSSカラー文字列で緑色を指定
  fill(c);
  rect(200, 60, 45, 80);

  colorMode(HSB, 100); // カラーモードをHSBに設定
  c = color('hsb(0, 80%, 100%)'); // HSBで赤色を指定
  fill(c);
  rect(270, 10, 45, 80);

  c = color('hsba(160, 100%, 90%, 0.5)'); // HSBでアルファ透明度付きの緑色を指定
  fill(c);
  rect(300, 60, 45, 80);
}
```

### 実行結果

![color.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/ba99931c-e1eb-b46c-51ec-9a5d4f6d58ff.jpeg)

### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
P5.js 日本語リファレンス(brightness)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の brightness関数を説明します。

## brightness() 

### 説明文

HSB輝度値を指定した色から取得します。

### 構文

brightness(color)

### パラメタ

<dl>
  <dt>color</dt>
  <dd>p5.Color | Number[ ] | String：p5.Colorオブジェクト、カラーコンポーネント、CSSカラー</dd>
</dl>

### 戻り値

Number：明るさの値(HSB輝度値)

### 例


```javascript
function draw() {
  noStroke();
  colorMode(HSB, 100); // カラーモードをHSBに設定
  let c1 = color(30, 100, 80); // HSBで緑色を設定
  fill(c1);
  rect(15, 20, 35, 60);
  let val1 = brightness(c1); // 輝度値80を取得する
  fill(val1);
  rect(50, 20, 35, 60);

  noStroke();
  colorMode(HSB, 255);
  let c2 = color('hsb(90, 100%, 80%)'); // HSBで緑色を設定
  fill(c2);
  rect(100, 20, 35, 60);
  let val2 = brightness(c2); // 輝度値80%(255の80%)を取得する
  fill(val2);
  rect(135, 20, 35, 60);
}
```

### 実行結果
![brightness.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/f36ff9b7-289e-3947-e523-b881fb02714a.jpeg)


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
Raspberry Pi の RealVNC を使う

Raspberry Pi 側の設定

raspi-config で次の設定をします。

1) Intefacing Options
![vnc_apr26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/86fcce62-973b-f68e-3f98-7696c22bd001.png)

2) System Options -> Boot / Auto Login
![desktop_apr26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/eaf66007-3bc8-35b7-df50-da61ef996675.png)

3) Display Options -> Resolution
![resolution_apr26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/5c563111-1c6e-8ebc-728e-657cd6371f74.png)


私はクライアントとして　Arch Linux を使いました。

クライアントソフトのインストール

```bash
yay realvnc-vnc-viewer
```

クライアントの起動

```bash
vncviewer
```

hostname:5900 に接続
![violet_apr26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/5e64988b-7e05-89be-aefd-6563ec4d5000.png)
P5.js 日本語リファレンス(blue)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の blue関数を説明します。

## blue()

### 説明文

指定した色から青の値を取得します。

### 構文

blue(color)

### パラメタ

- color  
p5.Color | Number[ ] | String：p5.Colorオブジェクト、カラーコンポーネント、CSSカラー

### 戻り値

Number：青の値

### 例

```javascript
function draw() {
  let c = color(255, 0, 255); // RGBで紫色を設定
  fill(c);
  rect(15, 20, 35, 60); //左の長方形を描画する

  let blueValue = blue(c); // 青色を取得する
  fill(0, 0, blueValue);
  rect(50, 20, 35, 60); // 右の長方形を描画する
}

```
### 実行結果

![blue.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/05ba5cb9-fb0c-3300-dec6-6d612d18028c.jpeg)


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
[Azure] Microsoft Azure で出来ること

#はじめに
さて、皆さんは [Microsoft Azure](https://azure.microsoft.com/ja-jp/) をご存知でしょうか？
恐らく「Azure って、クラウドサーバーでしょ？」って感じで認識されていると思いますが、実は結構色々なサーバーを利用したサービスが統合されているソリューションと思っていただいたほうがいいです。

#Microsoft Azure で出来ること
では、具体的に何が出来るかというと…

- Unity や UE の作成したプロジェクトをクラウドで自動ビルド ([Azure DevOps Pipelines](https://azure.microsoft.com/ja-jp/services/devops/pipelines/))
- ビルドの配信 ([Visual Studio App Center](https://azure.microsoft.com/ja-jp/services/app-center/))
- ライブラリの社内のプライベートなメンバーへの配信 ([Azure DevOps Artifacts](https://azure.microsoft.com/ja-jp/services/devops/artifacts/))
- パフォーマンス監視 ([Visual Studio App Center](https://azure.microsoft.com/ja-jp/services/app-center/))
- クラッシュログを収集 ([Visual Studio App Center](https://azure.microsoft.com/ja-jp/services/app-center/))

という感じです。
他にも色々あるのですが特に利用する頻度が高いものを列挙しています。

#おわりに
今後はこの辺りの紹介や説明を公開していきたいと思います。
P5.js 日本語リファレンス(green)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の green関数を説明します。

## green() 

### 説明文

指定した色から緑の値を取得します。

### 構文

green()

### パラメタ

- color  
p5.Color | Number[ ] | String：p5.Colorオブジェクト、カラーコンポーネント、CSSカラー

### 戻り値

Number：緑の値

### 例

```javascript
function draw() {
  let c = color(255, 255, 0); // RGBで黄色を設定
  fill(c );
  rect(15, 20, 35, 60 );

  let greenValue = green(c); // 緑色を取得する
  fill(0, greenValue, 0);
  rect(50, 20, 35, 60);
}
```

### 実行結果

![green.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/eab287a9-adba-e618-f4c7-8f1f28c4df79.jpeg)


### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
環境変数の設定、その意味

#避けては通れない道
現場に行くとまずはじめに行うのは開発環境構築です。
そして必ず直面する環境変数の設定。
手順書に従えば設定はできるけど、これは一体なんなのか

##環境変数とは
・OSが動いているときに使える変数
・Terminal環境内における変数
など調べると色々書かれています。
プログラミングを行うときにも変数の定義がありますが、
それと同じようなものをOSに設定するイメージかと思います。

ターミナルで`printenv`というコマンドを打つと、
現在設定されている環境変数の一覧が表示されます。

##PATH
環境変数のうちの一つ。
通常、コマンドはそのコマンドが格納されているディレクトリでしか実行できませんが
Pathを通すことで他のディレクトリからの実行であってもOSがコマンドの格納先を参照してくれるようになります。

例）
`mvn`コマンドを使いたい場合、何も設定しなければ
`C:¥apache-maven-3.x.x¥bin` などインストール先のbinディレクトリでしか`mvn`を実行できません。
しかし、Pathに`C:¥apache-maven-3.x.x¥bin`を設定すると他の場所からでも実行できるようになります。


##JAVA_HOME
こちらも環境変数のうちの一つ。
JDKがインストールされているディレクトリを指定します。
他のプログラムが`java`を使用したいときにこちらを参照することになります。

例）Mavenがビルドするときに使うのはJAVA_HOMEに設定されたディレクトリのJava
mvn clean package install ...?

Mavenを導入している現場を経験しました。
ソースの修正をしたらこのコマンドを実行するよう手順書にあり言われるがまま実行していましたが
それぞれどういう意味なのか改めて調べてみました。

##mvn package
targetディレクトリに**.jarを作る。
作成されるファイルの名前は、pom.xmlに記述されている `artifactId`と`version`から決定される。
拡張子は,pom.xmlに記述されている`packaging`から決定される。

##mvn clean
targetディレクトリを削除する。

##mvn install
.m2（ローカルリポジトリ）にインストールを行う。
そうすることで、ローカルの他のプロジェクトからの参照ができるようになる。

##mvn clean package install
**targetディレクトリを削除して新しいjarを作成。他からの参照も最新化する。**
と認識しておけばよさそうです。
Visual Studio Code で編集中のテストコードを実行する (Golang編)

# TL;DR

[Visual Studio Code で編集中のテストコードを実行する](https://hakobe932.hatenablog.com/entry/2017/11/10/120000)

　この記事にいたく感動したので**Go言語**でもショートカット一発で任意の関数をテストしたくなった！

# できばえ

 - 開発言語非依存にしたかったので**シェルスクリプト**で実装しました
 - 関数名を定義した行に移動するのがめんどいかったので**コードの途中からでも**出来るようにしました

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/d566bddb-4287-fef2-174b-23ebdf71c823.png)


# やりかた

・以下、**gotet.sh**をプロジェクト名フォルダの下に置いてください
<details><summary>gotest.sh</summary><div>

```
relativeFile=$1
lineNumber=$2
line=0
funcName=""
while :
do
 cursol=`expr $lineNumber - $line`
 if [ "$cursol" = "0" ]; then
 break
 fi

 strs=`sed -n ${cursol}p $relativeFile | grep func | grep testing.T`

 if [ "$strs" != "" ]; then
 funcName=$strs
 break
 fi

 line=`expr $line + 1`
done

if [ "$funcName" != "" ]; then
 funcName=`echo $funcName | cut -d " " -f 2 | cut -d "(" -f 1`
 echo "Testing function: $funcName"
 go test -run $funcName
else
 echo "not find Test function name..."
fi
```
</div></details>

・元記事の通りプロジェクト名フォルダの下に**.vscode**を掘って、以下**tasks.json**を置く
<details><summary>tasks.json</summary><div>

```
{
 "version": "2.0.0",
 "tasks": [
 {
 "label": "run Go test here",
 "type": "shell",
 "command": "sh gotest.sh ${relativeFile} ${lineNumber}",
 "group": "test",
 "presentation": {
 "reveal": "always",
 "panel": "shared"
 }
 }
 ]
}
```
</div></details>

・[このあたりを参照](https://code.visualstudio.com/docs/getstarted/keybindings)にキーバインドを設定してください
<details><summary>tasks.json</summary><div>

```
[
 {
 "key": "ctrl+shift+a",
 "command": "workbench.action.tasks.runTask",
 "args": "run Go test here"
 }
]
```
</div></details>

# ではでは

Windowsでもcygwinとかインストールすれば問題なく動きます。
[Gow軽くて良いっすよ！](https://github.com/bmatzelle/gow)

さらに

[VS CodeのGo言語テストコード生成ツールを使ってみたらめちゃくちゃ便利だった話とか](https://kdnakt.hatenablog.com/entry/2019/01/03/080000)
こちらと組み合わせてテストテンプレートを自動生成するとテスト能率爆上がりなんでオススメです！！
sklearnのpipelineの中身を理解する

# これは何か
sklearnのpipelineを時々使っていたのだが、`pipeline.fit_transform(X, y)`とした時にpipelineの中ではどのような処理をしているのか、気になったので公式ドキュメント[^1]やソースコード[^2]を読んで、整理してみることにした。

なお、自分の抱いていた問題意識は下記コードのコメントに記載している。
人によっては「当たり前でしょ！!」って思うかもしれないが、どうしても気になってしまったので調べてみた。

```python
# 問題意識1: 変換器ではfit_transform, 推定器ではfitが呼ばれている??
# 問題意識２: このタイミングで変換器もしくは推定器にパラメータを渡したい時はどうすればいい？？
# 問題意識3: 自作の推定器・変換器を入れたい場合に満たすべき要件は??
pipe.fit(X, y)

# 問題意識4: 変換器ではfit_transform, 推定器ではpredictが呼ばれている??
pipe.predict(X)
```

## 1. pipelineとは何か
機械学習プロジェクトにおいて分類や回帰などを行う推定器(estimator)を利用する際、変換器(transformer)も一緒に使われることが多い。データの変換から学習・推定までの処理を一つの推定器としてまとめることができる機能としてpipelineが提供されている。

### 1.1.　pipelineの使用例
pipelineは(key, value)のタプルを要素に持つリストで構成される。keyには推定器・変換器の名前、valueには推定器・変換器のオブジェクトをstepsとしてpipelineに渡す。使用例を下記に示す。

```python
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn import datasets

# サンプルデータの用意
iris = datasets.load_iris()
X, y = iris.data, iris.target

# pipelineの作成
estimators = [('reduce_dim', PCA()), ('clf', SVC())]
pipe = Pipeline(steps=estimators)

# 学習
pipe.fit(X, y)

# 予測
pipe.predict(X)
```
## 2. 推定器・変換器の要件
pipelineに自作の推定器・変換器を入れたい場合がある。その際に満たしておくべき要件を記載する。
なお、要件はpipelineのstepsの最後(final_estimator)か、それ以外（not_final_estimator）で変わる。
* ドキュメント内では、not_final_estimatorをtransformと呼んでいるが、transformメソッドと被るため、本記事ではその呼び方を変更している。

- final_estimator: fitメソッドを持っていること
- not_final_estimator: fit及びtransformメソッドを持っている、もしくはfit_transformメソッドを持っていること

pipelineで呼び出すメソッドによって、要件は増えるが最低限満たしておくべき要件は以上である。

## 3. pipeline内での処理
1.1.のコードにあるように、pipeline.fitやpipeline.predictを呼び出した時のpipeline内での処理を確認してみた[^3]。
pipelineで頻繁に使用されるであろうメソッドに絞って、下記に整理している。
左から、pipelineのメソッド、それに渡すパラメータ、not_final_estimatorで呼ばれるメソッド、final_estimatorで呼ばれるメソッドである。

|  pipeline |  パラメータ  |  not_final_estimator |  final_estimator  |
| ---- | ---- | ---- | ---- |
|  fit  |  X, y=None, **fit_params  |  fit_transform  |  fit  |
|  fit_transform  |  X, y=None, **fit_params  |  fit_transform  |  fit_transform  |
|  predict  |  X, **predict_params  |  transform  |  predict  |
|  fit_predict  |  X, y=None, **fit_params  |  fit_transform  |  fit_predict  |
|  score  |  X, y=None, sample_weight=None  |  transform  |  score  |

なお、以下に注意すべき点を列挙しておく。

- fit_transformメソッドを定義していない場合、fitメソッドとtransformメソッドが順番に実行される。
- fit_transformメソッドと違って、fit_predictメソッドは定義していない場合、エラーとなる。
- \*\*fit_paramsは、`対象stepの名前(タプルのkey部分)__パラメータ名`で渡すことができる。
    - 例: `pipeline.fit(X, y, key1__param1=True)`
- \*\*fit_paramsと違って、\*\*predict_paramsはfinal_estimatorで呼ばれるpredictメソッドにのみパラメータを渡せる。記述方法はpredictメソッドにあるパラメータ名をそのまま指定するだけでよい。
    - 例: `pipeline.predict(X, param1=True)`

余談であるが、sklearn準拠のモデルでは、fitメソッド実行時にパラメータを受け付けるような設計にすべきではないとしている。
そのため可能な限り、\*\*fit_paramsを利用してパラメータを渡すのは避けたほうが良いと思われる。
sklearn準拠のモデルについては[こちら](https://qiita.com/shota-imazeki/items/e09ea39660bb4d5d0a90)で詳しく触れている。


[^1]: [ユーザーガイド](https://scikit-learn.org/stable/modules/compose.html#pipeline)
[^2]: [ソースコード](https://github.com/scikit-learn/scikit-learn/blob/95d4f0841/sklearn/pipeline.py)
[^3]: [pipelineのドキュメント](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html)
P5.js 日本語リファレンス(red)

このページでは[「P5.js 日本語リファレンス」] (https://qiita.com/bit0101/items/91818244dc26c767a0fe) の red関数を説明します。

## red() 

### 説明文

指定した色から赤の値を取得します。

### 構文

red(color)

### パラメタ

- color  
p5.Color | Number[ ] | String：p5.Colorオブジェクト、カラーコンポーネント、CSSカラー

### 戻り値
Number：赤の値

### 例

```javascript
function draw() {
  let c = color('#FFFF00'); // CSSカラーで黄色を設定
  fill(c);
  rect(15, 20, 35, 60); //左の長方形を描画する

  let redValue = red(c); // 赤色を取得する
  fill(redValue, 0, 0);
  rect(50, 20, 35, 60); // 右の長方形を描画する
}
```

### 実行結果
![red.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43467/c5fcfa9a-5db9-196a-67a8-aa42ea1d79b3.jpeg)

### 著作権

p5.js was created by Lauren McCarthy and is developed by a community of collaborators, with support from the Processing Foundation and NYU ITP. Identity and graphic design by Jerel Johnson.

### ライセンス

Creative Commons(CC BY-NC-SA 4.0) に従います。
IAM resource を Terraformで管理する

# 背景

IAM userをTerraformで管理し始めて、 policyを importして、Roleを。。とやっていたが、policy attachmentや group memberなどもTerraform化しなくてはいけなくなってかなり大変になった。

# 要件

以下の要件くらいは満たしてほしい

- [x] Userの追加・削除
- [x] User削除時に関連する グループに所属する、UserPolicyAttachmentなどの削除が可能
- [x] Groupの作成と同時にUserの追加
- [x] Policyの作成と同時にUser/Role/GroupへのAttachment
- [x] Role/Group/Userの作成とPolicyのAttachment


# 材料

## `terraform import`
利点:
1. officialで既存のリソースのImportができる
難点:
1. tfstateはimportできるがtfファイルは準備しないといけない。 → すでに大量のリソースがあると大変

## [terraforming](https://github.com/dtan4/terraforming)

利点:
1. ほとんどのリソースカバーされてる
2. tf と tfstate既存が既存リソースに対して生成できる

難点:
1. プロジェクトがActiveではないのでPRとか出したがマージされたり更新されることはなさそう
1. ResourceごとにImportするので、上記の異なるResource間のDependencyを解決できない


# 解決策

とりあえずあるもの使って自分で作ればいいかという感じになったので、勉強がてら作った 

基本は 「terraformingがどうやってるか理解」＋「リソース間の依存までを自分で実現する」

# 出来たもの

[iamterraformer](https://github.com/nakamasato/iamterraformer)

使ったもの:
1. terraforming
2. pratice_terraforming <- terraformingの勉強しつつ、自分の必要なリソースでterraformingになかったものを作った
3. shell (汚くstateを移動したり、無理くりやってるのは愛嬌w)

とりあえず2ステップだけでできるようになった

1. 生のtfとtfstateのimport

    ```bash
    ./import.sh
    ```

1. インポートしたやつの依存関係を考えたModule構造に変換する

    ```bash
    ./convert.sh
    ```
fish 3.1.0 iTerm起動時にエラーが出る

# fish 3.1.0　iTerm起動時にエラーが出る

## 問題

iTermを再起動した所、以下のエラーが出てきた。

```shell
~/.config/fish/config.fish (line 1):
rbenv init - | source
^
in command substitution
	called on line 36 of file ~/.config/fish/config.fish
from sourcing file ~/.config/fish/config.fish
	called during startup
~/.config/fish/config.fish: Unknown error while evaluating command substitution
from sourcing file ~/.config/fish/config.fish
	called during startup
```

おそらく、`~/.config/fish/config.fish`で設定している `eval (rbenv init - | source)` のところでエラーが出ている。

下記は原因がわかった上で実行しているが、whichを実行しても何も返ってこない。

```shell
$ which fish
# 期待結果 /usr/local/bin/fish
```

## 解決策1

`~/.config/fish/config.fish` の最初に、パスを追加する。

```shell
set PATH /usr/local/bin $PATH
```

追加する理由としては、パスを確認した時に上記のものが入っていないから。

```shell
$ echo $PATH
/usr/bin /bin /usr/sbin /sbin
```

しかしながら、これはやや強引な気もするのでよくないかも。

## 解決策2

iTermの環境設定を修正する。
iTerm > Preferences > Profiles > General > Commond　に、Commondで`/usr/local/bin/fish`を設定している。これを、

```shell
/usr/local/bin/fish -l
```
に変更する。設定したらiTermを再起動する。

![](https://i.imgur.com/EgH3w6F.png)

ちゃんと `which` も返ってくるようになるよ。`echo`の結果もちゃんとしてる。

```shell
$ echo $PATH
/Users/{ユーザ名}/.rbenv/shims /usr/local/bin /usr/bin /bin /usr/sbin /sbin /usr/local/share/dotnet ~/.dotnet/tools
```

ちなみに `-l` オプションは「ログインシェルとして起動する」と言う意味。他のオプションなど気になる人は公式で。

参考：[fish - the friendly interactive shell — fish-shell 3.1.0 documentation](https://fishshell.com/docs/current/cmds/fish.html)

解決策1よりこちらの方がいいかもしれない。

## 原因

前日にHomebrewでインストールしたものをupdateしたせいかもしれない。その時に、fishのバージョンが`3.1.0`に上がったと思われる。
fish の`3.1.0`は2020/2/12にリリースされていた。詳しくは[リリースノート](https://fishshell.com/release_notes.html)からどうぞ。

いつから`-l`オプションが必要になったかは、issueのコメントを読むとどうやら、`3.1.0`になってからのようだ。Fish v3.0.2では、ログインシェルであるかに違いはみられないが、Fish v3.1.0では `/usr/local/bin` をはじめとして他のPATHも差があるみたい。

参考：[fish 3.1.0 does not include /usr/local/bin in the PATH · Issue #6594 · fish-shell/fish-shell](https://github.com/fish-shell/fish-shell/issues/6594)


## 余談

雑に下のエラー文で検索したら

```shell
~/.config/fish/config.fish: Unknown error while evaluating command substitution from sourcing file ~/.config/fish/config.fish
```

ヒットした記事がこちら。

[RubyMineのターミナルが壊れた話 - @ledsun blog](https://ledsun.hatenablog.com/entry/2020/03/04/044216)

同じところでエラーが出てて、ほんとにありがてえ…。

## 参考

* [RubyMineのターミナルが壊れた話 - @ledsun blog](https://ledsun.hatenablog.com/entry/2020/03/04/044216)
* [After update to 3.1.0 /usr/local/bin has disappered from PATH. Why? · Issue #6903 · fish-shell/fish-shell](https://github.com/fish-shell/fish-shell/issues/6903)
* [fish 3.1.0 does not include /usr/local/bin in the PATH · Issue #6594 · fish-shell/fish-shell](https://github.com/fish-shell/fish-shell/issues/6594#)
* [fish - the friendly interactive shell — fish-shell 3.1.0 documentation](https://fishshell.com/docs/current/cmds/fish.html)
GCE(Google Compute Engine)でのユーザ作成 - 2種類の作成方法とsudo権限設定

#はじめに
久しぶりにGCEでVMを立てたが、ユーザ作成やSSH公開鍵配置、権限設定に時間がかかったので、備忘も兼ねて記載。なんとなくで動かすことはできるが挙動が理解できない部分があったので、そこも併せて調べてみた。
###GCE環境
- マシンタイプ：n1-standard-2
- OS: CentOS (centos-7-v20190916)
- ゾーン：us-west1-b

#ユーザ作成
VMインスタンスを作成した時点で、自分のGoogleアカウントのユーザは自動で作成される。が、あまりにも設定をGoogleに依存させ過ぎても汎用性に欠けるため、VM上に別アカウントを作成する。
#パターン1. VM上でuseraddコマンド
GCPコンソールからブラウザでSSH接続し、`$sudo useradd [username]`でユーザを追加する。追加後は、`/home/username/.ssh/authorized_keys`にSSH公開鍵の内容を書き込む。なおそのユーザのホームディレクトリに不必要に他ユーザの権限がついていると、下記のようなログが吐かれ、SSHログインできないことがあるので注意。[ホームディレクトリに所有者以外の書込み権が設定されているとNGのようです](http://shoyan.hatenablog.com/entry/20111117/1321546001)、お勉強になります。

```txt:/var/log/secure
Apr 25 07:49:19 instance-hoge sshd[1889]: Authentication refused: bad ownership or modes for file /home/username/.ssh/authorized_keys
```

###参考: GCPコンソールからSSHする場合、特別な挙動を示す
GCPターミナルからのブラウザSSH接続では、Googleアカウントユーザはパスワード無しでsudoが打てる。そのユーザ自体にパスワード不要の権限はついていないようであり、Google側でうまくやってくれているようだ。ターミナルソフトからSSH鍵でログインすると、sudoにパスワードが求められる。

###注意: Webブラウザ要件
手元のFirefox 75.0だと、GCPコンソールからのSSH接続/シリアルコンソール接続がうまくいかなかった（SSH鍵転送が始まらず、真っ黒の画面のまま）。ChromeとEdgeならちゃんと動いているので、この辺を推奨。


```config:/etc/sudoers
%wheel        ALL=(ALL)       NOPASSWD: ALL 
#wheelグループであればパスワード無しsudoが打てるが、
#Googleアカウントユーザはデフォルトではwheelグループには所属していない。
```

#パターン2. GCPコンソールからユーザ追加
GCPコンソールからユーザ追加・鍵追加ができる。ぱっと見、わかり辛いが[VMインスタンスの詳細]画面でSSH認証鍵が登録できる。公開鍵を登録するだけで鍵内で指定したユーザ名のユーザが、VMインスタンス上に勝手に作成される（[参考: Google Compute Engine のSSH接続](https://qiita.com/NewGyu/items/3a65e837519297951e79)）。鍵をコンソールに書き込むだけでユーザ作成～鍵ファイルの配置までやってくれるのは結構な時間短縮になり、ありがたい。

###勝手にパスワード無しsudo権限を付与
そして凄いのだが、このパターン2で作成したユーザにはパスワード無しsudo権限がデフォルトで付与されている。個人で遊ぶ分には毎度パスワードなんて打ってられないので、勝手に全部やってくれるのは本当ありがたい。一応設定ファイルとかで確認するとこんな感じ。

作成ユーザは`google-sudoers`に所属させられている。

```text:bash
[fuga@instance-hoge etc]$ groups fuga
fuga : fuga google-sudoers
```
設定ファイルでは`/etc/sudoer.d`内のファイルをさらに読み込むようになっている。

```config:/etc/sudoers
## Sudoers allows particular users to run various commands as
## the root user, without needing the root password.
##
## Examples are provided at the bottom of the file for collections
## of related commands, which can then be delegated out to particular
## users or groups.
## 
## This file must be edited with the 'visudo' command.

(中略)

# ↓↓最下段の2行が重要。この#はコメントアウトではないとのこと。ここでsudoers.d内のgoogle-sudoersを読み込んでいる。
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d
```
`/etc/sudoers.d`内のファイルを開くとこんな感じ。ちゃんとパスワード無し権限が明記されている。

```config:/etc/sudoers.d/google-sudoers
%google-sudoers ALL=(ALL:ALL) NOPASSWD:ALL
```

#まとめ
今まで原始的なパターン1しか知らなかったが、パターン2はめちゃくちゃ便利。
パターン1ではユーザ作成～鍵の配置～sudoのパスワード無し権限付与とかやっていたのが、パターン2ではGCPコンソールで鍵を設定するだけで全部OKになる。Googleさん強い。Googleさんありがとう。
ImageMagickを用いて不透明アルファでマスクをかける

#概要
ImageMagickを用いて不透明アルファでマスクをかける方法を書きます。
ゲーム開発はどにおいて一つのキャラクターイラストから他の画面、例えばパーティ画面などで短冊形のUIに表示するキャラの絵を表示する場合に不透明アルファでマスクをかけたいといったケースがあるのでそういった際に活用していただければと思います。

#方法
今回はUnityちゃんを利用しました。ダウンロードは[UNITY-CHAN! OFFICIAL WEBSITE](https://unity-chan.com/)から
![I_am_Unity-Chan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4541/cb6977d8-4af6-cd36-bd7d-6bbcae2cf050.png)
マスクで使用する画像はあらかじめ作っておきます。大抵の人はPhotoShopで作ると思いますが今回はFireAlpacaで以下のようなマスク画像を作りました。
![mask.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4541/0e16c7fa-b6e8-92a3-e91f-066f4d89edcf.png)
上の二つの画像を以下のコマンドで合成を行います。dst-inは上下の画像が重なる領域で切り抜くオプションです。

```
$ composite -compose dst-in mask.png I_am_Unity-Chan.png out.png
```
できあがった画像が以下。
![out.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4541/fef45940-6fd2-2f68-0cf3-8957e4530c05.png)

PhotoShopでこのような作業を行う方もいると思いますが無料でコマンドラインを用いてこのような作業を行いたい方にはオススメの手法です。

#ライセンス
© Unity Technologies Japan/UC
GitLabをCentOS 7にインストール～502エラーになった場合の対応方法

# この記事の内容
今回は、会社でGitLabをインストールしたいけど、こわいのでまずは自分のさくらVPSにインストールしてみました。
その際行った以下の手順を説明します。

1. さくらVPSのCentOS 7にGitLabをインストール
2. 502エラーが発生したときの対処法

1ですが、GitLab推奨のOmnibusパッケージをインストールします。
Omnibusパッケージとは、GitLabを動かすためのDBとかWebサーバとかがすべて入った全部入りということです。
今後のバージョンアップとかを考えても周辺アプリも一緒に入れてあったほうが面倒なことに巻き込まれずに済むので基本はこちらを選択します。

2については、インストール直後とページ遷移時、2回出ました。
（どちらもちがう原因）

# 環境
環境は以下のとおりです。
・さくらVPSのCentOS 7（立ち上げて間もない）

#手順

## さくらVPS設定
### パケットフィルタ設定
右下のパケットフィルタ設定を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299568/60bd70cd-26cd-a9fe-6daf-9e883b892935.png)


以下にチェックを付けます。
・SSH
・Web
・メール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299568/7eee448d-3073-0de8-db17-d72b46466527.png)



## CentOS 7をインストール
ほぼ、GitLab公式ページのとおりです。
特徴としては、相対URLにしているところくらいです。（ｈttp://XXXXXXX/ではなくｈttp://XXXXXXX/gitlabにしている）

### SSH有効化

```shell
sudo yum install -y curl policycoreutils-python openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd
```

### ファイヤーウォール設定
HTTP、HTTPSポートの通信を許可します。

```shell
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo systemctl reload firewalld
```

※Firewalldが起動していないというエラーが発生した場合は次のコマンドを実行してFirewalldを起動します。

```shell
sudo systemctl start firewalld
```

### メールサーバ設定
自分でSMTP立てる場合は不要ですが、今はなにもないので追加します。

```shell
sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix
```

### GitLabパッケージをインストール

```shell
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
# "http://XXX.XXX.XXX.XXX/gitlab"の部分は変更する
# XXX.XXX.XXX.XXXはIPアドレス
sudo EXTERNAL_URL="http://XXX.XXX.XXX.XXX/gitlab" yum install -y gitlab-ce
```

### GitLabサービス起動

```shell
sudo gitlab-ctl start
```

### GitLab接続確認
「GitLabパッケージをインストール」でEXTERNAL_URLに指定したアドレスにアクセスします。
※私はここで502エラーが出ました。。詳細は次項をご覧ください。

アクセス後にrootユーザのパスワード変更画面が表示されたら、画面の指示に従い変更します。
それでは快適なGitLabライフを！！

## 502エラー（応答時間が長すぎます）となる場合の対処法

### GitLab起動直後の502エラー
GitLab起動後にさっそくアクセスしてみると、502エラー（応答時間が長すぎます）になりました。

困っていろいろ調べていると・・・何もしていないのにアクセスできていました。
なんと、ただ立ち上げに時間がかかっていただけでした！

コマンドは完了していても、立ち上げに時間がかかるみたいなので、みなさんも焦らずお待ちを！

### ページ遷移時の502エラー
せっかくアクセスできて、プロジェクト作って遊んでいると・・・
またもや502エラーに！

どうやら、重すぎてnginxがタイムアウトしていたみたいです。
（nginxはGitLab Omnibusパッケージに入っているWebサーバアプリです）

GitLabの設定ファイルから、タイムアウト設定を変更しました。

``` /etc/gitlab/gitlab.rb
unicorn['worker_timeout'] = 600
```

設定を変更したあとは、再構成します。

```shell
sudo gitlab-ctl reconfigure
```

# 参考ページ
以下ページには大変お世話になりました。ありがとうございました。

・GitLabのインストール（GitLab公式ドキュメント）
https://about.gitlab.com/install/#centos-7

・ネコでもわかる！さくらのVPS講座 ～第七回「ファイアウォール”firewalld”について理解しよう」
https://knowledge.sakura.ad.jp/10583/?_ga=2.73043537.372784200.1587799144-1051214763.1587799144

・GitLabのアンインストール
https://qiita.com/yubaxp/items/75a6b6836b9f647b36ae
※エラーになったのでインストールやり直してみたときに参考にしました

・GitLabの merge requestで502が出て対処した話
http://innobase.hatenablog.com/entry/2014/09/15/195703

・相対URLを指定する方法（GitLab公式ドキュメント）
https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab
※相対URLを変更する際に役に立ちそう
ThunderBird を複数PCで共有する

###<概要>

* Thunderbirdのメールを2台以上のPCで共有した内容を残す。

共有する方法としてdropboxを使用。

 * 必要なソフト

thunderbird
dropbox


###<手順>

####1.各PCにthunderbirdをdownloadしinstall アカウント設定をする。
https://www.thunderbird.net/ja/

####2.各PCへdropboxをdownloadしinstallする
https://www.dropbox.com/ja/downloading

####3.thunderbirdのフォルダをdropboxへコピー

 * [メニュー（右上の三本線）]→[ヘルプ]→[トラブルシューティング情報]を選択

 * [プロファイルフォルダー]のフォルダを開くでエクスプローラが開くので「xxxx.default」のフォルダ毎dropboxへコピー
 
 * `C:\Users\ユーザー名\AppData\Roaming\Thunderbird\profiles.ini` を以下に修正する。
 
```ruby

[Profile1]
Name=default
IsRelative=0
Path='C:\Users\ユーザ名\Dropbox\xxxx.defaul'
Default=1

[Profile0]
(snip)
```
青色箇所をdropboxにコピーしたフォルダへ修正する。
フォルダは指定していなければ`C:\Users\ユーザ名`に作成されている

以上

※事前に一方のPCでthunderbirdを使用していてメールの仕分けをしている場合。
[msgFilterRules.dat]のファイルに設定値が入っているので、共有できていないときは他のPCへこのファイルをコピペすればよい
Python で HDR, RAW 画像処理するメモ

## 背景

Python で HDR, RAW 画像処理したい

## rawpy

https://github.com/letmaik/rawpy

基本となる RAW 処理ライブラリ. Windows も対応(prebuilt で pip で入る)

## colour-hdri

color-science https://github.com/colour-science 謹製

https://www.colour-science.org/colour-hdri/

RAW の読み書きには rawpy を使っている.

colour パッケージにも注目です!

https://github.com/colour-science/colour

また, color-nuke に, 各種カラーチャートのデータ(EXR 形式)

https://github.com/colour-science/colour-nuke/tree/master/colour_nuke/resources/images

## imageio

いろいろ読めます. 


https://imageio.readthedocs.io/en/stable/formats.html

OpenEXR も対応していました(FreeImage 経由).

https://imageio.readthedocs.io/en/stable/format_exr-fi.html#exr-fi

pip だと prebuilt が入る? ようなのでコンパイル不要かもしれません
(上記リンク先の prebuilt バイナリは 6 年前と古い)

## EXR

OpenEXR パッケージがあるようです.

https://pypi.org/project/OpenEXR/

pyexr のほうが楽かも?

https://github.com/tvogels/pyexr

ただ, どちらもソースからビルドからになり面倒です.

imageio でもいいかもですが, TinyEXR を利用いただいている PyEXR

https://github.com/ialhashim/PyEXR

を少し改変して, cibuildwheel で Windows, macOS, Linux の prebuilt binary wheel を作りました.

cibuildwheel で python bwheel(C++ モジュール含む) を CI で一括ビルドし PyPI へアップロードするメモ: https://qiita.com/syoyo/items/97f35b4d5c40761cc314

https://pypi.org/project/pytinyexr/

コンパイルせずに pip インストールできます!
(python2.7 は対応していません.)

## 保存する.

32bit float で保存したい場合は tifffile https://pypi.org/project/tifffile/ がいいでしょうか.

rawpy でもいけるかもしれません.


## 画像処理する

numpy 2D array(float32)にして numpy やらで処理するのが手っ取り早いでしょうか.

## tone map する

T.B.W.(`colour-science` package にあるかな?)

## 画像にゼブラとかだす

ハイライトが飛んでいるところなどで, ゼブラ(縞模様)パターンを出したいですよね.
手っ取り早くやる方法はなさそうです. ゼブラパターンの画像を作って合成とかでしょうか.

T.B.W. 

## 

## まとめ

Happy HDR/RAW image loading & editing!
【Unity】 Transform.SetParentを使わずに子オブジェクトの相対位置を追従させたい

# 何がしたいのか

`Transform.SetParent`を使わずに、衝突したオブジェクトとの相対位置を一致させたい。

![rotation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47146/13c8f8f8-6ab0-0934-eeba-c0726180bedf.gif)
（こういうの。CubeとSphereはそれぞれ独立したオブジェクトだが、相対値を維持している。）

# 実装例

```cs
using UnityEngine;

public class AttachSample : MonoBehaviour
{
    /// <summary>
    /// 追従する対象
    /// </summary>
    private Transform _target;

    /// <summary>
    /// 相対位置
    /// </summary>
    private Vector3 _deltaPosition;

    /// <summary>
    /// 相対角度
    /// </summary>
    private Quaternion _deltaRotation;

    private void Update()
    {
        if (_target != null)
        {
            // 相対ベクトルにぶつかったときの角度の逆を反映してから、
            // 現在の角度を反映させる
            transform.position = _target.position + _target.rotation * _deltaRotation * _deltaPosition;
        }
    }

    /// <summary>
    /// 衝突したらくっつく
    /// </summary>
    /// <param name="other"></param>
    private void OnCollisionEnter(Collision other)
    {
        _target = other.transform;

        // 衝突したワールド座標
        var cp = other.contacts[0];

        // 対象の中心部から衝突地点への相対ベクトル
        _deltaPosition = cp.point - _target.position;

        // 対象の現在角度の「逆」
        _deltaRotation = Quaternion.Inverse(_target.rotation);
    }
}
```

# 備考

* 追従する側の回転角は操作していません（位置のみ追従）
* 対象のScaleが変化したことを考慮していません
CakePHP4 の認証処理 cakephp/authentication のメモ

CakePHP4 でプラグインとして提供されている cakephp/authentication のメモです。
認証したいだけなんですが、 cakephp/authentication は登場するクラスが多いです。

すべて以下の Cookbook に記載されている内容です。

- CMS Tutorial - Authentication
    - https://book.cakephp.org/4/en/tutorials-and-examples/cms/authentication.html
- CakePHP Authentication - Quick Start
    - https://book.cakephp.org/authentication/2/en/index.html


# 登場クラス

主要な登場クラスとその概要です。

| クラス     | 概要 |
|:-----------------|:------------------|
| AuthenticationMiddleware | リクエストごとに認証処理を行う PSR の Middleware |
| AuthenticationService    | 認証処理の 一般的な Facade |
| AuthenticationComponent  | 認証処理の CakePHP の Component |
| Identity                 | ログインユーザー情報 (AuthenticationService->getIdentiy(), AuthenticationService->buildIdentiy() で生成される)  |
| Authenticator            | 認証処理  |
| Identifier               | ログインユーザー情報の取得処理 |
| Identifier\Resolver      | ユーザー情報取得処理 |


こちらはサブ的な登場クラスとその概要です。

| クラス     | 概要 |
|:-----------------|:------------------|
| PasswordHasher           | パスワードハッシュ処理 |
| UrlChecker               | URLチェック処理 |


## カスタマイズするとき

Auth0やSAML2.0等の独自の認証処理を追加する場合は、独自の `Authenticator` を作れば良いです。

ログインユーザー情報を DB 以外から取得する場合（例えば、DynamoDB から取得する等）は、 `Identifier` もしくは `Identifier\Resolver` を作れば良いです。


## `Authenticator` `Identifier` の補足

`Authenticator` `Identifier` は複数指定することができます。

複数指定した場合、設定した順番に処理がされ、成功すると、後続で指定された `Authenticator` `Identifier` は呼び出されません。

通常の認証の場合、Session情報にログインユーザー情報があるか確認し、ない場合は Form情報としてログインユーザー情報が渡っているかを確認します。

そのときは `Authenticator` を以下のような感じで、２つ設定します。

```php:src/Application.php
        // Load the authenticators, you want session first
        $authenticationService->loadAuthenticator('Authentication.Session');
        // Configure form data check to pick email and password
        $authenticationService->loadAuthenticator('Authentication.Form', [
            'fields' => [
                'username' => 'email',
                'password' => 'password',
            ],
            'loginUrl' => '/users/login',
        ]);
```
RaspberryPi と GoogleCloudPlatform で家電をコントロール Vol.1

# はじめに
赤外線リモコンを通じて、GoogleCloudPlatformから家電をコントロールした方法を紹介します。

## 目的
市販のスマート家電リモコンを使っていたのですが、時間でのトリガーはできるのですが温度のトリガーはありませんでした。
夏の夜にタイマーをかけて寝ると、朝方に暑くて起きてしまうことが多かったので、温度のトリガーでエアコンを制御したいと思ったのがきっかけです。


## 基本構成

* ハードウェア部分
raspberryPi Zero に以下の回路を構成していきます。

   - 学習リモコン部
     - 赤外線受信回路
     - 赤外線発信回路
   - 温度・湿度測定回路 (BME280)

* ソフトウェア部分
スマートスピーカーからの操作と、GoogleCloudPlatformへの温度等の測定結果送信と命令を受信してのリモコン動作部で構成します。

   - スマートスピーカーからの操作 (IFTTT + slack + hubot)
   - 赤外線発信回路 (CloudFunctions + CloudSql)

![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622279/361a3477-09e2-ccb7-27c9-9ddfcd3b1d85.png)


## ハードウェアの作成

学習リモコン部分（赤外線の受信・発信回路）は、[格安スマートリモコンの作り方](https://qiita.com/takjg/items/e6b8af53421be54b62c9)を参考に作成しました。
これに温度・湿度を測るためのセンサーを追加していきます。
使用したセンサーは [BME280](https://www.switch-science.com/catalog/2236/) です。配線等については、[Raspberry Pi 2で温湿度・気圧センサのBME280をPythonから使う](https://qiita.com/masato/items/027e5c824ae75ab417c1) を参考に作成しました。

RaspberryPiの初期状態ではI2Cが無効になっているため、有効化後に接続します。

作成した回路は以下のようになりました。
<img width="976" alt="スクリーンショット 2020-04-25 16.53.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622279/e4d69845-c724-3426-2227-6b27307e57bb.png">

[次回](https://qiita.com/inq0428/items/1bf6d8d427ee28af6194)はソフトウェア部を作成していきます。