OmniAICreator/Qiita-1.07M huggingface dataset:
【laravel】シーディングによるレコードの追加

# 概要
シーディングはデータベースを管理する機能の1つで、データベース構築時にダミーデータや初期データを作成するために使われます。
生成したい内容をクエリビルダで作成することにより、自動でレコードを生成することができます。

シーディングは以下のような段階で構成されます。
１．シーディングのためのシーダークラスを作成する。
２．シーディングコマンドを実行する。


# シーダークラスの作成
ここでは前回の[【laravel】マイグレーション]
(https://qiita.com/gone0021/items/5cec0c945b41c00441cc)で作成したSampleテーブルの内容を例に記述していきます。


## コマンド
マイグレーションのファイルはartisanコマンドで作成します。
ファイル名（クラス名）の指定はありませんが、テーブル名と合わせた名前でシーダーファイルを作成していきます。

```:コマンド
php artisan make:seeder SampleTabaleSeeder
```


## ディレクトリ構造
database\seeds内にコマンドで作成したファイル名のファイルが作成されます。

```:ディレクトリ
database
├─ seeds
   ├─ SampleTabaleSeeder.php
```


## 作成されるファイル
artisanコマンドで作成した場合は以下のような内容が自動で作成されます。
`Illuminate\Database\Seeder`クラスを継承したシーダークラスとなっています。
シーダーファイルにはvoid型のrunメソッドが用意されており、ここに処理を記述していきます。

```php:SampleTabaleSeeder.php
<?php

use Illuminate\Database\Seeder;

class SampleSeeder extends Seeder
{
  /**
   * Run the database seeds.
   *
   * @return void
   */
  public function run()
  {
    //
  }
}
```

## シーダーの作成
ダミーレコードを作成します。
ここではクエリビルダで記述するため、DBファサードをuseします。
また、idはオートインクリメントのため省略して記述していきます。

クリエビルダについては[【laravel】データベースの操作 / クリエビルダによる操作]()をご参考ください。

```php:SampleTabaleSeeder.php
use Illuminate\Support\Facades\DB;
```

```php:SampleTabaleSeeder.php
public function run() {
  $param = [
    'name' => 'サンプル太郎',
    'tel' => '09012345678',
    'address' => '〇〇県☓☓市',
    'wmail' => 'taro_sample@mail.com',
    'is_experience' => 1,
];
DB::table('people')->insert($param);

// 中略...

// 記述方法：DB::table('テーブル名')->insert(パラメータ);
}
```


# シーディングの準備
シーダークラスを作成したので、シーディングを実行してレコードを生成します。
そのためにはDatabaseSeederで実効するシーダークラスを指定する必要があります。
DatabaseSeederはdatabase\seedsにデフォルトで用意されています。


## ディレクトリ構造
database\seedsにデフォルトで用意されています。

```:ディレクトリ
database
├─ seeds
   ├─ DatabaseSeeder.php
```

## DatabaseSeederファイルの中身
作成したシーダークラスと同じくSeederクラスを継承したクラスとなっています。
runメソッドに実効するシーダークラスを指定します。
シーダークラスと同じメソッドなのでコメント部分は割愛します。

```php:DatabaseSeeder.php
<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
  public function run()
  {
    // $this->call(UsersTableSeeder::class);
  }
}

```


## シーダークラスの登録
runメソッドに`call`メソッドを記述します。
callメソッドは実行するシーダークラスを引数にして記述します。

```php:DatabaseSeeder.php
public function run()
{
  $this->call(SampleTableSeeder::class);
}
```

# シーディングの実行
シーダークラスを作成してDatabaseSeederへ登録できれば準備は完了で、あとはシーディングを実行するだけです。
シーディングの実行はコマンドで行います。
指定のテーブルにレコードが生成されていればシーディングは完了です。

```:コマンド
php artisan db:seed
```

## 補足
シーディングはマイグレーションと異なり、重複の確認は行いません。
実行済みのシーダークラスも再度シーディングを実行すれば再度生成されるため、実行済みのシーダークラスはコメントアウトするなどしてデータベースが汚くならないように工夫することをおすすめします。


# 参考
[データベース：シーディング]
(https://readouble.com/laravel/6.x/ja/seeding.html)
[【PHP/Laravel入門】動作チェックに便利なシーディング使い方まとめ]
(https://www.sejuku.net/blog/61041)
トレイト　（アウトプット）

今日初めてトレイトを使ったからまとめとく。

#トレイトとは
PHPのバージョン5.4.0から導入されたコードの再利用性を高めるための機能。
トレイトは任意のクラスの機能（メソッド）を拡張できる仕組み。

####トレイトの定義方法
```trait.php
<?php
trait Language{
    public function aiueo(){
        print 'あいうえお';
    }

    public function kakikukeko(){
        print 'かきくけこ';
    }
}
```

####トレイトの利用方法
```human.php
<?php
require_once 'trait.php';
class Human{
    //クラスの中で宣言する
    //宣言するとトレイトの中で定義したメソッド aiueo(), kakikukeko()が使える
    use Language;
    
    public $name = '田中';
    public $age = 20;

    
    public function greet(){
        print $name . 'です。' . $age . '歳です。';
    }
}

$human1 = new Human();
//trait.phpで定義したメソッドの呼び出し
$human1->aiueo();
```

####答え
```
$ php human.php
あいうえお

```

継承していなくてもメソッドが使えた。

トレイト使うことで設計の幅が広がりそう。
GoでDFSを書く(ABC161 D - Lunlun Numberを解く)

# はじめに
唐突ですがGoで競プロコードはどう書くのかなと気になったのでやります．
**Goが好きなので．**
競プロ経験者だけれどGoは知らない人がこの記事を読んで「Goってこんな感じなんだ～」って流し見してくれれば嬉しいです.
## 注意
ぼく自身，競技プログラミングは弱く，かつ普段はC++を使っているので最適でなく助長な記述等になっているかもしれませんがご容赦ください．あくまで雰囲気を感じてもらえたらとおもいます．ちなみにこの問題が初めてのGoでのACになりました．また，DFS自体についての解説，問題の解説は行っていません．

#やる
問題は[ABC161D - Lunlun Number](https://atcoder.jp/contests/abc161/tasks/abc161_d)を解きます．
この問題の選定理由は特にないです．ここ最近でDFS使って解けるからって所でしょうか（ABC165-Cがありますが...）
早速ですが解答コードを先に見せてから解説（？）していこうと思います．

```golang
package main

import (
	"fmt"
	"sort"
)

var ans []int

func dfs(n int) {
	if 3234566667 < n {
		return
	}
	ans = append(ans, n)
	d := n % 10
	if d != 0 {
		dfs(n*10 + d - 1)
	}
	if d != 9 {
		dfs(n*10 + d + 1)
	}
	dfs(n*10 + d)
}

func main() {
	var k int
	fmt.Scan(&k)
	for i := 0; i < 9; i++ {
		dfs(i + 1)
	}
	sort.Ints(ans)
	fmt.Println(ans[k-1])
}

```
意外と普通ですね（？）

## package

```go
package main

import (
    "fmt"
    "sort"
)
```

まずは必要パッケージをインポートします．

- fmt : 標準入出力を使うために用います．
`fmt.Scan(&n)`で変数nの標準入力を受け付けます．
`fmt.Printf("%d\n",n)`で変数nを出力します．さらに`fmt.Println(n)`で改行付きで標準出力します．ここまでは競プロerお馴染みのC++と差異はありません．パッケージから用いる関数の頭文字を大文字にすることを忘れないようにしましょう．

- sort : その名の通りソートの為のパッケージです．配列やスライスはもちろんmapなどにも対応しています．


## slice
```go
var ans []int
```
C++で言うところの`vector`で可変長配列です．ここに解候補を入れていきます．
型の宣言は変数名の後に書くことに気を付けます．

## DFS

```go
func dfs(n int) {
	if 3234566667 < n {
		return
	}
	ans = append(ans, n)
	d := n % 10
	if d != 0 {
		dfs(n*10 + d - 1)
	}
	if d != 9 {
		dfs(n*10 + d + 1)
	}
	dfs(n*10 + d)
}
```

- ここがメインとなるDFSです．Goでの関数の書き方は

```
func 関数名(引数 型) 戻り値型{
     処理
}
```
のように書きます．今回のDFSは整数nを引数にして，戻り値はありません(C++でいうvoid型です)Goのint型は実装のCPUやOSに依存し，int64型かint32型になるみたいです．

- sliceへの要素の追加は`append`を使います．ここで注意するべきなのは

```go
append(ans,n)
```
ではなく

```go
ans=append(ans,n)
```
と書くことに気を付けましょう．

- Goでの`if文`は処理部分には1行の処理でも必ず中括弧`{}`を用います．

- 再帰の書き方もそのままで分かりやすいですね．

## main関数
```go
func main() {
	var k int
	fmt.Scan(&k)
	for i := 0; i < 9; i++ {
		dfs(i + 1)
	}
	sort.Ints(ans)
	fmt.Println(ans[k-1])
}
```
main関数から処理がスタートします．ですので標準入力や具体的な処理，解答の出力はmain関数で行います．
今回の問題では特筆すべきことは無いですが，for文の書き方もC++と同様で分かりやすいですね．

## おわりに
初めてGoで競プロの問題を解きましたが，特に困ることもなく書きやすかったです．
今回突発的に本記事の作成をしたため，問題選定が微妙だったかもしれません．（扱う内容的にはstringやデータ構造の利用も無く単なる整数の処理でした）
これを機に僕もGoで問題を解いていきたいと思います．Goでの競プロを取り組む人が増えていったらいいなと思います(^^)/．
Unityちゃんをサードパーソンユーザーコントローラーで動かすときの注意点について


今回は、　Unityちゃんを　スタンダードアセットにある　
サードパーソンユーザーコントローラーで　動かすときの注意です。　



![bandicam 2020-05-08 03-13-28-129.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295760/e9d5d26b-f7f4-d1d8-58bc-fc4f8340e7b1.jpeg)






わたしの出している、
[UnityStandard講座](https://note.com/zazizuzezo22334/n/n90340339a00c)
の中でも　
このサードパーソンユーザーコントローラーで
Unityちゃんを動かしていましたが。　

これには　一つ難点がありまして。　

それは、　段差やデコボコ道などで　コライダーが引っかかってしまうことです。　

普通の平らの場所なら問題ないんですが、　ちょっとした段差でも
フリーズすることがあります。　
あと、キャラクターが浮くこともありますね。


このコントローラーは　リジッドボディとカプセルコライダーで　
キャラクターを動かしているのですが。　
その場合だと、　このようなコライダーでエラーが発生してしまうのです。　

それを解決するには、　レイを飛ばしたりして、　段差分の計算も
しないとだめなんですよね。　


なので　それが面倒な場合は　普通に　
キャラクターコントローラーを使ったほうがいいですね。



ＰＳ　

Unity講座のセールは、　緊急事態宣言が出されている間は　セールにしますので　
多分　今月いっぱいまでになりますかね。
Azure Kinect によるVFX＋WebCamera



#はじめに
まずはこちらの画像をご覧ください
![AGDRec_Trim_Moment.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633391/4e09aba6-54f7-080e-c8ed-a26790aaffbe.jpeg)

自分が燃えて苦しんでいる様です←

そうじゃないですね
@keijiro さんのAkvfxをZoom上に表示させています。
これを使って社内会議でみんなを驚かせましょう(AzureKinectを所持している人が希少種なので目立てます)


#動作環境

・AzureKinect
・Unity(2019.3.7)
・Spoutおよびインストーラーに同梱されたSpoutCam 
・KlakSpout
・Akvfx



#手順
###1. SpoutおよびSpoutCamのインストール
SpoutのWebサイトからインストーラーをダウンロードしてexeファイルを実行。
https://spout.zeal.co/download-spout/
インストーラーの設定画面で、SpoutCamにもチェックが入っていることを確認しインストール。

###2. Akvfxプロジェクト作成
@keijiro さんのGitHubにあるAkvfxをダウンロードし解凍後　\Assets\Test.unityを起動
(Akvfxの内容は長くなってしまうので、ここでは割愛します。)
https://github.com/keijiro/Akvfx

###3. KlackSpoutをプロジェクトに追加する
KlakSpoutのreleasesのから、KlakSpout.unitypackageをダウンロードする。
KlakSpout.unitypackageをUnityのプロジェクトにインポートする。
https://github.com/keijiro/KlakSpout/releases

###4.RenderTextureを作成する
ProjectWindowからRenderTextureを作成する。
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633391/fd7058c9-4786-7bdf-3071-2b051b01d89d.png)

![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633391/fc1cef9d-faf8-375a-7773-33d56749fcad.png)
※Sizeを変更すると解像度が変わります。

###5.RenderTexture出力用カメラを作成する
HierarchyWindowからCameraを作成する。
作成したカメラのOutput/Target TextureにRenderTextureを充てる。
※元からあるカメラとは別
![c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633391/fe97c64e-6ceb-5230-22bc-f04cf50360fc.png)
![d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633391/8252ba32-8f65-e645-fde9-ee9015f40dfe.png)

###6. SpoutSenderをGameObjectに追加する
HierarchyWindowからCreateEnptyを作成する。
作成したGameObjectにKlackSpoutのSpoutSenderスクリプトをアタッチする。
SpoutSenderのSourseTextureにRenderTextureを充てる。

![e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633391/032f90e3-bc60-6a39-057a-c5a5512a9790.png)

![f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633391/b4d619c6-ae05-9fb0-4f41-ad48b733a418.png)


###7. Zoomの設定をする
Zoom起動前にUnityを実行中にする。
Zoom起動後ビデオ設定を開きカメラをSpoutCamを指定するとZomにUnityの情報が反映されます。


![j.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633391/01384287-88d0-d349-a46f-6d0e41d56fec.jpeg)


※UnityとZoomが接続出来ていない場合はノイズが表示されます

![g.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633391/d338ea22-1f57-6f37-9d70-23831b7dc5dc.png)

#参考
https://qiita.com/comocc/items/d404893414ef72511dca
java(条件分岐と繰り返し)

##for文による繰り返し
```java
for (int i = 0; i < 10; i++) {
```
①`int i = 0;`　初期化処理
最初に１回だけ実行される文（ループ変数）
②`i < 10; `　　繰り返し条件
ループを継続するか否かを判定する条件式
③`i++`　　　　　繰り返し時処理
}まで到達した直後に自動的に実行される文

##制御構造のネスト
```java
if (height > 170) {
  if (eyesight > 1.0) {
```
「分岐の中に分岐」多重構造を`入れ子`や`ネスト`という
laravel環境構築でハマった日

##説明
Laravelを導入時ハマってしまったのでその記録。

##Conposerのインストール
Homebrew(macのソフトウェアの導入を簡単にするもの)は入っていたので割愛しますが、まずはConposer（ｐｈｐのパッケージ管理システム）をインストール。

```
$ curl -sS https://getcomposer.org/installer | php
```

次にComposerを移動。グローバルにするため。移動かと思ったら名前も変わるらしい（後から知った）

```
$ mv composer.phar /usr/local/bin/composer
```

とりあえずバージョン確認

```
$ composer -v
```


↓こんなの出てきてこの下にバージョンとか書いてある


```
  ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/

```

##laravelのインストール
準備は整ったのでここでlaravelのインストール

```
$ composer global require laravel/installer
```



##PATHを通す
.bash_profileに下記の記述を追加

```
export PATH=$HOME/.composer/vendor/bin:$PATH
```
記述を追加後、ターミナルでsourceコマンドを実行

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

バージョンを確認してみる

```
$ laravel --version

Laravel Installer 2.3.0
```


ここまではエラーなく進みインストールも完了。


##プロジェクトの作成
ここでググった手順と同じ通りにlaravelのプロジェクトを作成してみる

```
$ laravel new アプリ名
```
エラった。

別の方法で作成してみる

```
$ composer create-project laravel/laravel --prefer-dist アプリ名
```
できた！！

と最初は思っていたが、エラーはでなかっただけでこれはプロジェクトの作成だけではなくて、composerを利用してlaravelをインストールして、プロジェクトを作成しているらしい。この時点ではプロジェクト作成しただけだと思っていた。

今作成したプロジェクトのディレクトリに移動してartisanコマンドでサーバ立ち上げる

```
$ php artisan serve
Laravel development server started: <http://127.0.0.1:8000>
```

これでhttp://localhost:8000にアクセス

<img width="1158" alt="スクリーンショット 2020-05-08 1.47.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499780/cdd05faa-4358-b128-1053-5d2009f8f7b9.png">

これで、はじめましてLaravelできました。

##さっきのエラー
先ほどのエラーが気になってPATHとか通しなおしてみたりしてやり直してみたけど、laravel newではやっぱりエラーが解消しない。ここから別のソースみながら新しいプロジェクトとか作ってみる

```
$ php composer.phar create-project --prefer-dist laravel/laravel アプリ名

```
こんなエラーが

```
Could not open input file: composer.phar
```
要はファイルを開けませんでしたってことなので、composer.pharを探してみるけど、ローカルにそんなファイルそんざいしないっぽい。composerインストールした時確かにあったはず。

##原因
先ほど書いたが、mvでファイルが移動するだけかと思っていたが、ファイル名が変更されるというのをどこかで見た。
もしくは、laravelを複数回インストールする記述をしていたからか。
現在の時点でどちらか不明だけど、とりあえず

```
$ /usr/local/bin/composer update

```
してもダメ。

次に

```
$ brew tap josegonzalez/homebrew-php
```
して

```
$ brew install josegonzalez/php/composer
```
brew使って、phpとcomposerをインストールしたのかな

```
$ composer create-project laravel/laravel --prefer-dist アプリ名
```

でとりあえず新しいプロジェクトはできました。


##本日のまとめ
composer.pharが名前変わっているのが原因なのか今日ははっきりしなかった。とりあえずlaravelだけ会えてよかった。
たった導入するだけなのに環境構築は考えなしでやるとハマる。
とりあえず100％解決はしていないから続く。
Javascriptで月から日数を求める

月を入力にして、その時の日数を求めます（一旦うるう年は考えない）

2月を除くと、8月より前の月は奇数の月が、8月移行の月は偶数の月が31日になるので、

```js
30 + ((month > 7) + month) % 2) - 2 * (month === 2)
```

として計算できる。

## うるう年を考慮する場合

うるう年は、400で割り切れるとき、または、4で割り切れかつ100で割り切れない時なので、

```js
year % 400 === 0 || (year % 4 && year % 100 !== 0 )
```

となる。

この場合、

```js
const leapYear = year % 400 === 0 || (year % 4 && year % 100 !== 0 )

30 + ((month > 7) + month) % 2) - (month === 2 ? (leapYear ? 1 : 2 ): 0)
```
となる。

もっとシンプルに書きたい。


### 月ごとの日数↓

|月|日数|
|---|---|
|1|31|
|2|28 または 29|
|3|31|
|4|30|
|5|31|
|6|30|
|7|31|
|8|31|
|9|30|
|10|31|
|11|30|
|12|31|
DBの情報をlistに格納したい

```python
import psycopg2
connection = psycopg2.connect("********")
cur = connection.cursor()
list = []#ちなみにこれは作れない
cur.execute("SELECT ID FROM DB;")
list = cur
print(list)
```

直接入れると無理みたい
```cur```で取得できるのは「```[(1),(2),(3)]```」でlistの中にtupleが入っているので扱いづらい。ので、listの中にstringで追加した変数を作りたい

```python
import psycopg2
connection = psycopg2.connect("********")
cur = connection.cursor()
list = []
cur.execute("SELECT ID FROM DB;")
for i in cur:
   list.append(str(i[0]))
print(list)
```
これなら```[1,2,3]```のように作成されるので扱いやすい
Gitのコミットグラフ

#ブランチの状況（コミットグラフ）を表示する
各ブランチがどのように進んでいるのか確認できる

- コマンド

```
$ git log --graph --date-order --all --pretty=format:'%h %Cred%d %Cgreen%ad %Cblue%cn %Creset%s' --date=short
```
- コマンド実行結果（例）

```
*   8768c7b  (HEAD -> master) 2020-05-08 (name) branch_aの作業をマージ
|\  
| * 8bff760  (branch_a) 2020-05-08 (name) 作業Aを完了
* |   e46e8ff  2020-05-08 (name) 緊急でbranch_bで作業した内容を反映
|\ \  
| * | f087b63  2020-05-08 (name) branch_bでb.txtを作成
|/ /  
| * 469afaa  2020-05-08 (name) branch_aでコミットしてみた
|/  
* 68ffd89  2020-05-08 (name) hello.txtの内容を修正
* a081e0c  2020-05-07 (name) 初めてのコミット
```

### 上記コマンドを「git graph」だけで実行できるようにする
- エイリアスを設定

```
$ git config --global alias.graph "log --graph --date-order --all --pretty=format:'%h %Cred%d %Cgreen%ad %Cblue%cn %Creset%s' --date=short"
```

- コマンド実行

```
$ git graph
```
文系学部卒・プログラミング完全未経験者がRailsチュートリアルを完走した話

先日、無事にRailsチュートリアルを完走しました。

巷で「挫折率が高い」と言われている通り、正直なところ自分も途中で何度か心が折れかけました・・
なんとか挫折せずに完走できたので、チュートリアルに取り組むにあたって自分なりに気をつけたこと等、備忘的に書き連ねていきます。

#事前準備
文系学部卒、かつプログラミングと一切無縁の仕事をしているため、プログラミングの周辺知識がゼロの状態で学習を開始しました。
（HTMLという四文字の単語が存在することを初めて知ったレベルでした。「サーバー」に関しては「地下で機械音を発しながらよくわからない処理をしている黒くて大きな機械」という認識でした）

「こんな状態でいきなりチュートリアルに挑戦しても秒殺されるだけだな・・」と思い、最初の基礎固めとして、以下２つに取り組みました。

①「Progate」
有名オンライン学習サービス「Progate」で、HTML、CSS、Ruby、Railsをそれぞれ２周しました。
無料会員のままだと受講可能レッスンが少ないので、自分は課金して有料会員になりました。
1,000円/月で各言語の基礎を叩き込めるなら、安い買い物だと判断しました。

②「現場で使えるRuby on Rails5 速習実践ガイド」（マイナビ出版）
Progateを終えてすぐにチュートリアルに挑戦しようとしたものの、自分の理解度とチュートリアルの難易度にギャップを感じました。

「１冊テキストを挟んでみよう」と思い、購入したのがこちらの書籍です。
豊富な図解、平易な文章で構成されており、Progateより詳しく説明されているので、Progateとチュートリアルのいい橋渡しになりました。

#いざ本番
事前準備を終え、ほんの少しビビりながらも、Railsチュートリアルの学習を開始しました。
普段は社会人しているので、平日の仕事後や休日を使ってひたすら進めました。

実際に進めるに当たって、以下の点に注意していました。

＜全般＞
・スペルミス等に足を引っ張られないよう、コードは基本コピペでOK。
・いきなり100％理解できなくても良い。５〜６割理解できていればひとまず先に進んでOK。
・演習問題はスルーしてOK。

＜エラー発生時＞
・基本はひたすらググる。インターネットという広大な海の中で大抵答えは見つかる。
・エラー文そのものをよく読む。エラーが全て英語表記で少し萎えるが、ちゃんと和訳してエラーの趣旨を正確に把握する
・エラー文を検索ワードにぶち込んでそのままグーグル検索する。
・何をしたくて、何ができていないのか、落ち着いて整理する（一旦紙に書き出してみるのも◎）


＜内容が難しい、チュートリアルの説明が理解できない時＞
・知らない単語の意味を調べて、説明文の趣旨を把握する。
・「（理解できない項目）」＋「わかりやすく」等で検索し、初心者向けの解説を探す。
・どうしてもよくわからない時は、「２周目やる頃には理解できるはず」と信じて一旦そのまま進む。

＜その他＞
・１時間に１回程度のペースで休憩した方が、結果的に長時間集中できる。
・原則毎日Railsに触れる。（ノータッチの日を極力作らない）
・ツイッターで、自分と同じようにプログラミングを頑張っている人を眺めると、なんとなくモチベーションが湧いてくる。


#これから
なんとか１周を終え、なんとなく全体像をつかむことができたものの、理解が怪しい箇所がいくつもあります。
次は演習も含めて２周目、３周目に取り組み、あやふやな箇所を潰しこんでいきたいと思います。

チュートリアル後は、自分でWEBアプリを作成する作業に取り組めたらと思っております。

※ツイッターでも学習過程を発信していきますので、良かったらフォローお願いします！
 https://twitter.com/ad169bc 

拙い文章となりましたが、最後までご覧いただきありがとうございました。
Ubuntu 20.04LTS + GPU に cuda, Anaconda, Tensorflow, Pytorch を入れる

書くこと無いくらいに簡単に入りましたが、一応メモっときます。

## 手順

1. Ubuntu 20.04LTS デスクトップをインストールする。
https://jp.ubuntu.com/download
インストール後の処理をして、ソフトウェアのアップデートが終わるのを待つ。

2. Ubuntu デスクトップにログインして、左下のメニューを開くと、中に「ソフトウェアアップデート」というメニューがあるのでそれを開く。

3. 開いたウィンドウの中に「追加のドライバ」というタブがある。GPU が認識されていれば「nvidiaのドライバを使う」という項目がいくつかあって、バージョンが選べる。適切なバージョン (GTX/RTX 系なら 440 で良いはず)  を選んで「変更を適用」を押す。これで、待っていればインストールされる。

4. ターミナルを開いて、下記コマンドを打つ。これで cuda が入る。

```
$ sudo apt update
$ sudo apt install nvidia-cuda-toolkit
```

2020/05/07 時点では cuda 10.1 が入る。違うバージョンを入れることもできる(みたい)。

5. Anaconda をダウンロードする。
https://www.anaconda.com/

Get Start -> Install Anaconda Individual Edition -> Download -> Linux Python 3.7 64-Bit (x86) Installer を選んでダウンロード。

6. ダウンロードしたフォルダで下記コマンドを実行 (ファイル名はバージョンによって微妙にかわってるかもしれない)

```
$ bash Anaconda3-2020.02-Linux-x86_64.sh
```

必要に応じて `conda create -n tf` などする。

7. tensorflow-gpu をインストール

```
$ conda install tensorflow-gpu
```

8. pytorch をインストールする。

```
$ conda install pytorch torchvision cudatoolkit=10.1 -c pytorch
```

これで、GTX 2080, RTX 2080, GTX1660 あたりでは問題なく動きました。あとで、もうちょっと加筆します。
pythonで文字列を1文字ずつのリスト形式に変換する

#文字列の場合
```python
#やりたいこと
#'hello'　⇒　['h','e','l','l','o']

a = 'hello'
print(list(a))
```
実行結果は以下のようになる

```python
['h', 'e', 'l', 'l', 'o']
```

#数値の場合
```python
b = 123456789
print(list(str(b)))
```
実行結果は以下のようになる

```python
['1', '2', '3', '4', '5', '6', '7', '8', '9']
```
パッケージの分け・呼び出し

## パッケージを作る
ディレクトリを作成してgoファイルを作成
ファイル名はパッケージの役割がわかるように一致させるのが好ましい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434376/cc94320b-2f62-2366-af75-cdf3a1b2a96a.png)

```golang:greeting/hello.go
//パッケージはディレクトリ名
package greeting

//呼び出しができるように大文字から始める
func Do() string {
	hello := "Hello for greeting"
	return hello
}

```
```golang:greeting/sub/sub.go
package sub

func Sub() {
	println("sub func")
}
```



## 呼び出し方法
```golang:main.go
package main

import (
//importはプロジェクト名からパッケージがあるディレクトリ名まで
	"udemy/greeting"
	"udemy/greeting/sub"
)

func main() {
//呼び出しはディレクトリ名.関数
	hello := greeting.Do()
	fmt.Println(hello)
	sub.Sub()
}
```
ElasticSearchのindexデータを移行する

# はじめに

今回、AWS ElasticSearchからローカルのElasticSearchにデータを移行したかったのでElasticDumpを使って、試しにやってみました。

ElasticSearchはVPCからしかアクセスできなかったので、踏み台のEC2から接続しています。


## 注意点

※他にいい方法はたくさんありますのであくまでも一つの方法です。

- index単位なので、indexが多いと面倒です。`＊`などで一括でindexをdumpするなんてこともできません。


## EC2にNodeをインストール

[AWS公式のNodejsインストール手順](https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/setting-up-node-on-ec2-instance.html)を元にnvmでインストールします。

```bash
# EC2の中

# nvmインストール
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash

# nvmを有効化
. ~/.nvm/nvm.sh

# nodeのインストール
nvm install node

# Node.js が正しくインストールされ、実行されていることをテストします。
node -e "console.log('Running Node.js ' + process.version)"
```

## ElasticDumpのインストール

```bash
# EC2の中
npm install elasticdump -g
```

## dumpする

```
# EC2の中

# index一覧を確認
curl -XGET {VPCエンドポイント}/_cat/indices?v
 
# dumpする
elasticdump --input=http://localhost:9200/{index名} --output={ファイル名}.json
```

## EC2からファイルをローカルにダウンロード

```bash
# ローカル

scp {ssh接続先}:{path}/{ファイル名} {ローカルのパス}
```

## dumpファイルをインポート

```bash
# ローカル
elasticdump --input={ファイル名}.json --output=http://localhost:9200/{index名} 
```

移行完了！
ProcessingでVJ素材を作るブログ　第三回 translateとrotate( i )

#高度な動画であれば出てくるtranslateとrotateを学ぶ
よくわからんが、頻出関数translate()とrotate()を学んだので、解説する。
##前提
translate()やrotate（）を学ぶ前にProcessingに置ける座標の考え方をおさらいしておこう。Processingでは、以下のように左上をスタート地点として、x座標は右に、y座標は下に広がっていくイメージである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632724/a36d00de-7cd0-99f0-08a8-61ab86f7c168.png)

##translate()
translate()は、この基準とする（０、０）の位置をずらす。
イメージとしては以下のような感じになる.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632724/bc0566b9-9e86-f71d-4c6e-2b7fc6b4254e.png)
基準点（０、０）の位置をずらすっていうイメージだろうか。

実際にソースコードと、できた絵をみてみよう。

```processing:sample.pde
void setup(){ 
  size(640, 640);
  background(0);
  stroke(255);
  noFill();
  circle(0,0,100);
  
  translate(320, 320);
  circle(0,0,100);
  
}

```


↓できた絵がこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632724/71a44347-5897-dcc8-8165-265f3ae25b83.png)

左上がcircle(0,0,100);の実行結果、真ん中中央がtranslate(320, 320);circle(0,0,100);の実行結果である。

まぁこれだけであればCircle(320, 320, 100)でいいはず。
おそらくだがtranslateは、x座標、y座標をそこそこ計算すれば、不要だと思う。

##rotate()
ただrotate()はそうも行かない。rotate()は座標の方向を回転させるからだ。

次回はrotate()の具体的な動き、そしてこんがらがった基準点の戻し方やってみようと思う。

では今日はこの辺で!
ツールは適材適所で使う必要があるという話

# 2020/08/11 追記

Azure Synapse Analytics でShrink DatabaseがGAになったそうです。教えてくれた人ありがとう。

https://qiita.com/ryoma-nagata/items/ce50f72824ce61238daa

# はじめに

Azure SQL Data Warehouseはで苦労した話。

# Azure SQL Data Warehouse（現 Azure Synapse Analytics ）とは
昔はAzure SQL Data Warehouseをバッチ用サーバーとして使っていました。（今はApache Sparkに置き換えました。）
Data WarehouseっていうのはAWSで言うところのRed Shift, GCPで言うところのbig table みたいなもので、巨大なSQLSERVERっぽいものが建てられるサービスです。

# 何がひどいの？
Azure SQL Data Warehouseの嫌なところは色々あるけど、一番ビックリしたのはデータベースの容量を削除しても課金が停止されない点です。
どういうことか。
分析業務をやっているとテーブルがいっぱい作成されると思います。いっぱいテーブルを作成するとストレージ容量が増えてきていっぱい課金されます。ここまでは良いです。
日が立つに連れどんどんデータが溜まっていくと思います。ストレージ料金もどんどん増えていきます。
あまりに古いデータは要らないので、昔作ったテーブルは削除します。すると当然ストレージの使用量は減るので、課金額も減ると思いますよね？減らないんです。
テーブルをたくさん作るとストレージが勝手に拡張されて容量が確保されるのですが、一旦確保されたストレージはテーブルを消しても勝手に解放されません。空き容量として課金され続けます。
テーブルのデータが単調増加している場合は `テーブルのデータ量＝確保されたストレージ量`なのですが、テーブルを削除し始めると、`テーブルのデータ量 ＋ 空き容量　＝ 確保されたストレージ量`になります。
「え、じゃあ空き容量を開放して課金を減らす方法を教えてよ」とサポートに聞くと「shrink database っていうコマンドがあるけど非推奨です」って返ってくるんですよ。なんと公式に空き容量を減らす方法は無いのです。
https://docs.microsoft.com/ja-jp/sql/t-sql/database-console-commands/dbcc-shrinkdatabase-transact-sql?view=sql-server-ver15
↑見たら今でも非推奨だった。
結局非推奨でもいいからshrink databaseを回して課金額を減らしました。


他にもバッチ処理が遅いのが嫌だった。最適化しようにも資料が少ないので全然わからない。その点有名なオープンソースは資料がたくさんあって素晴らしい。

のちにAzure SQL Data Warehouseは全部廃止、バッチ処理はSparkに置き換えて課金も安く、処理も早くなりました。

# そもそも

バッチ処理と解析業務をAzure SQL Data Warehouseで全部してるのが間違っていた。

バッチの(非リアルタイム)データ解析は(自分の中では)３つに分かれると思う。この３つに適材適所のツールを当てなめないと、めんどくさいことになる。

## データ収集処理系ツール

端末やセンサーからデータを受け取る。落ちないことが大事。

- Apache Kafka
- AWS kinesis

など

## データ加工系ツール

データにマスターテーブルなどとJOINして分析用データを生成する。

- Apache Spark

など

## データ解析系ツール

データをいい感じに並び替えて(インデックスを張る)素早く検索できるようにしたりBIにデータを表示する。

- elastic search
- kinetica
- Azure SQL Data Warehouse

間違ってデータ解析系ツールで複雑で膨大なJOINやGROUP BYを実行すると遅いし、データ加工系ツールで分析業務をするとレスポンスが遅れてイライラする。

Azure SQL Data Warehouseはどっちかって言うとデータ解析系ツールだった。（実際データの検索は速い）

# まとめ

ツールは適材適所で使おうね、という話。
Configの変更が反映されないのはSpringが起動していたためでした

# はじめに
`config/aprication.rb`の変更が反映されない原因は`spring`で、それを止めたら無事に反映されました。その試行錯誤の記録です。

#環境

```
OS: macOS Catalina 10.15.4（19E287）
ruby: 2.6.4
rails: 5.2.3
```

#前提
`rails g`を実行する際に、不必要なファイルなどを生成することを防ぐ必要がありました。`config/aprication.rb`にて適切にコードを書き、保存し、`rails s`をしてもうまくいきませんでした。`rails g `で不必要なファイルも生成されてしまうのです。

書き加えたコードはこちら。`module`のなかの`class`に書いたのに、、、

```apprication.rb

    config.generators do |g|
      g.skip_routes true
      g.assets false
      g.helper false
      g.test_framework false
    end
```

で、講師のかたに「`rails c`で`config`の値を確認してみたら」と助言をいただく。
`config`の値を確認する、ということがどんなアクションをすればいいのかはわからなかったですが、とりあえず`rails c`を開く。

いろいろ調べて、Time.zoneの変更が反映されるかを確認することにしました。すると、、、

>irb(main):001:0> Time.zone.name
=> "UTC"
irb(main):002:0> config.time_zone = 'Tokyo'
Traceback (most recent call last):
        1: from (irb):2
NameError (undefined local variable or method `config' for main:Object)
Did you mean?  conf

**嘘だろ。`config`が`undefined`なわけはないはず！**

###追記（2020/05/08）
**嘘だろ。`config`が`undefined`なわけはないはず！**　というのはてんで愚かな過ちでした。
`rails c`でタイムゾーンの設定はできない、というあまりにも当たり前なミスをしていました。タイムゾーンの変更は、例えば次のように`config`ファイルに記述しなければいけません。

```apprication.rb
config.time_zone = 'Tokyo'
```
つまり、`Spring`に出会えたのは、偶然だったいうことです。怪我の功名？
あまりにもお粗末なのですが、自戒の意味を込めて残しておきます、、、
###追記　終わり


#Springを止める
ということで「`rails console, config　変更されない`」とぐぐると次のドンピシャなタイトルの記事にぶつかりました。

[Rails Consoleで確認するとConfig(Settings)の更新がされない時](http://l-chika.hatenablog.com/entry/2017/04/18/102627 )

>定数を環境毎に管理できるgem `config` で、`config/settings.yml` の中身を変更して、Rails Consoleで確認しても反映されない場合がある。

で、`spring`が起動しているか確認するために、`$ ./bin/spring status`を実行すると、、、

```
Spring is running:

69543 spring server | 330_KentarouTawara_runteq_learning_basic | started 58 mins ago   
69544 spring app    | 330_KentarouTawara_runteq_learning_basic | started 58 mins ago | development mode
```

ばっちし動いていた。なので、`$ ./bin/spring stop`を実行すると、、、

```
Spring stopped.
```
となり、念のためもういちど`$ ./bin/spring status`を実行すると、、、

```
Spring is not running.
```

で、当初の目的だった`config`の修正を保存し、サーバーを再度立ち上げ、試しに` bin/rails g controller tasks index show`を実行すると、、、

```
Running via Spring preloader in process 70888
      create  app/controllers/tasks_controller.rb
      invoke  erb
      create    app/views/tasks
      create    app/views/tasks/index.html.erb
      create    app/views/tasks/show.html.erb
```
ルート、asset、helper、テストファイルなどが、生成されていないことが確認できます。一件落着です。

#【課題】Springって何なの？
ざっくりと調べたところ、先のリンクと同じかたが次のように解説してありました。

>Spring は Rails アプリケーションの preloader（プリローダー）の gem です。Rails アプリケーションをバックグラウンドで走らせたままにしておくことにより（pre + load = 前もってロードしておく）、bin/rails や bin/rake コマンドの2回目以降の起動時間が短縮されます。

[RailsでSpringを導入して開発効率を上げる](https://easyramble.com/install-spring-into-rails.html)

`bin/rails`を繰り返すときの処理の時間を短縮してくれるみたいです。プリローダーなどの知識が少ないので、深堀りは別の機会にします。

講師のかたによれば、「修正の反映がされないときがたまにあるので、とりあえずSpringを止めてみることがある」そうです。頭に入れとこうと思います。

#終わりに

最後まで読んでくださってどうもありがとうございます。
どなたかの役に立ち、学習が前進してもらえれば、うれしいです。

#参考文献
たいへん助けていただきました。感謝いたします。

・[Rails Consoleで確認するとConfig(Settings)の更新がされない時](http://l-chika.hatenablog.com/entry/2017/04/18/102627 )
・[RailsでSpringを導入して開発効率を上げる](https://easyramble.com/install-spring-into-rails.html)
Typora にカスタム CSS を設定する

# Typora にカスタム CSS を設定する

Typora は HTML+CSS の Web ベースの技術スタックで作られてます。なので、CSS を少し扱える知識があれば、細かなところにも簡単に変更が出来ます。


### やりたいこと

- Typora にオレオレ CSS を当てる。


## カスタムCSSを設定していく

### tl;dr

```zsh
# 1) このファイルを作成＋好きなCSSを書き込む
vim ~/<TyporaのApplicationのPath>/themes/base.user.css

# 2) TyporaをrestartしてCSSを読み込ませる
```

やりたいことはこの２ステップです。
細かく見ていきます。

### `<TyporaのApplicationのPath>/themes`を探す

下記で場所がわかる。

`Typora` > `Preferences` > `Appearence` > `Open Theme Folder`

### `base.user.css`について

下記の順番でCSS が読み込まれます。

- １）Typora 標準の CSS
- ２）現在のテーマの CSS
- ３）`base.user.css`の CSS
- ４）`{current-theme}.user.css`の CSS

また、使い分けとして下記のような感じです。

- １）、２）は、基本的に修正禁止
- ３）は、すべてのテーマに反映
- ４）は、テーマ単位に反映

今回の記事では汎用的かつわかりやすいように、３）を使って CSS をカスタマイズします。

ユースケースによっては４）で行うべきケースもありますが、初めてなら３）から始めても良いかと思います。

### その他：CSSを当てるためのClass名はデバッグモードから探す

CSSを書くにあたり「どこの要素がなにのClassを持っているか？」を知る必要があります。

Web開発で使うDevTool をTypora 上でも動かせるので、これで確認します。

デバッグモードは下記で表示されるようになります。

- １）Help > Enable Debugging
- ２）右クリック ＞ Inspect Element

これで、必要な要素をクリックしたり、Elementを探していきます。

### おわりに

だいたい公式ドキュメントを読めばわかるけど、このメモでもう少し楽になるはず。

## REF

- [Add Custom CSS](https://support.typora.io/Add-Custom-CSS/)
【初心者】E2Eテストってどんなテスト？

E2Eテストという言葉を初めて聞いたので、
ざっくり理解します。

#E2Eテスト（End to Endテスト）
`システム全体を一通り動作させて正しく動作することを確認するテスト。`
　Webアプリケーションの場合、`ユーザが行うブラウザ操作を起点とし、`クライアント処理・サーバ処理を通して画面再描画に至る過程を`最初から最後までテストする。`
　User Interface Testとも呼ばれるらしい。

##e.g.ログインページのテストシナリオ
よくログインページが例として挙げられるらしい。

1. ログイン画面を表示
2. メールアドレスを入力
3. パスワードを入力
4. ログインボタンを押下
5. トップページに遷移すること　


##E2Eテストの主な特徴
- **コストが高い**   
実行時の時間的コストや、変更の影響を受けたテストの修正など。
- **実行時間が長い**  
ユニットテストと比べ、一通りの動作をテストするため。
- **不安定になりやすい**  
ユニットテストと異なり、ネットワーク・DB・ファイルなどへの外部通信が発生するため、それらの影響を受けて、成功していたはずのテストが失敗することがある。
デザインの変更など、変更の影響を受けやすい。

##なぜE2Eテストをやるのか
　軽く調べた結果、辛いテストだということが初心者なりにわかった。
　しかし、「この機能が動かなければ、このサイトはなんのためにあるのか」というようなアプリケーションの核となるような機能では、時間的コストをかけてでもE2Eテストを行う必要性がある場合があることを知れた。


#参考
- [MMMブログ>E2Eテストについて考えてみた](https://blog.mmmcorp.co.jp/blog/2017/03/10/E2ETest/)
- [Qiita>E2Eテストの導入から学んだこと](https://qiita.com/mt0m/items/7e18d8802843d9f60d28)
よく使うReactNativeメモ(Windows)

個人的にとても詰まったのでメモメモ
私はコマンドプロンプトでの起動とAndroid Studioを同時に行わないとダメかと思ってた馬鹿です。\(^o^)/
最終的にはsnack使いました。

#コマンドプロンプトを使った実機テストでアプリの起動方法

・USBでパソコンとAndroidをつなぐ(iOSは分からない)
・コマンドプロンプトを開き、React Nativeファイルにて、コマンド"npm run android"を入力 

※ Visual Studio Codeだとそもそもデバイスが反応しない場合あり。
※ これで起動しない場合は、設定が怪しい。(デバイス側開発者ツール・パソコン側のドライバ)

##snackを使った実機テスト

AndroidでもiOSでもできるからおすすめ。ついでにWeb上でもテストできる
・expoでアカウントを作成
・実機にExpoというアプリをダウンロード
・右下のPreviewをonにする
・右側の画面から、Android(iOS)を選択→Run on your deviceを選択
・QRコードが出るのでAndroid(iOS)で読み取る

※Webでのテストでは通るのに、実機でのテストでは反応しないこととかあるのはなぜだろうか…。

###おまけ(Android Studioを使った実機テスト(そもそもReactNativeを使わなそうである))
・USBでパソコンとAndroidをつなぐ
・Android Studioを起動
・Running deviceをAndroidにする
・Android StudioをRun
parquet-toolsのビルドとParquetファイルのマージ方法

複数のParquetファイルを1つのParquetファイルにマージする方法についてメモ

##結論
parquet-toolsを使用すれば簡単にマージできます。
しかし[jarとして配布されているもの](https://mvnrepository.com/artifact/org.apache.parquet/parquet-tools/1.9.0)にはhadoop-clientが含まれていないらしく、ローカルでの実行ができませんでした。

```
# java -jar parquet-tools-1.9.0.jar cat test.parquet
org/apache/hadoop/fs/Path

```
そのため自前でビルドする必要があります。
以下のサイトを参考にビルドしました。
https://www.lancork.net/2016/10/inspect-parquet-files-using-parquet-tools/

##準備

CentOS7.5 サーバ(GUI使用) でセットアップしたものを使用

**1.もろもろ必要そうなパッケージをインストール**

```
# yum install gcc gcc-c++ java-1.8.0-openjdk-devel boost-devel openssl-devel 
```

**2.mavenのインストール**

```
# wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
# tar zxvf apache-maven-3.3.9-bin.tar.gz
```

**3.Thriftのインストール**

```
# wget -nv http://archive.apache.org/dist/thrift/0.12.0/thrift-0.12.0.tar.gz
# tar zxvf thrift-0.12.0.tar.gz
# cd thrift-0.12.0/
# ./configure -disable-gen-erl -disable-gen-hs -without-ruby -without-haskell -without-erlang -without-php -without-nodejs
# make install
```

**4.ソースコード一式をダウンロード**
https://github.com/apache/parquet-mr
上記リンクからソースコード一式をダウンロードする。
※gitコマンドを使わなくても Clone or download からダウンロードできる

```
# unzip parquet-mr-master.zip
# cd parquet-mr-master/
```

**5.ビルドする**
mvnコマンドは[カレントディレクトリ]/parquet-mr-master/ 配下で実行する
↑に気が付かず[カレントディレクトリ]/parquet-mr-master/parquet-tools 配下で実行しており、地味にハマりました。

```
mvn clean package -Plocal
```

##parquet-toolsでParquetファイルをマージする
[カレントディレクトリ]/parquet-mr-master/parquet-tools/target 配下に
parquet-tools-1.12.0-SNAPSHOT.jar というファイル（2020/5/8 時点）が生成される。
こちらを用いてマージを行う。

マージするParquetファイルは何でも良かったので、ググって出てきた以下のリンクのファイルを利用させて頂きました。
http://anson.ucdavis.edu/~clarkf/


```ruby:中身が見れるか確認
# java -jar ./parquet-tools-1.12.0-SNAPSHOT.jar cat test.parquet
timeperiod = 01/01/2016 00:00:05
flow1 = 0
occupancy1 = 0.0
speed1 = 0.0
flow2 = 0
occupancy2 = 0.0
speed2 = 0.0
flow3 = 0
occupancy3 = 0.0
speed3 = 0.0

timeperiod = 01/01/2016 00:00:35
flow1 = 0
occupancy1 = 0.0
speed1 = 0.0
flow2 = 0
occupancy2 = 0.0
speed2 = 0.0
flow3 = 0
occupancy3 = 0.0
speed3 = 0.0

・・・（省略）・・・
```

```ruby:マージする
# java -jar ./parquet-tools-1.12.0-SNAPSHOT.jar merge ./data/*.parquet ./merge.parquet
Warning: file data/part-r-00000-ddaee723-f3f6-4f25-a34b-3312172aa6d7.snappy.parquet is too small, length: 16979
Warning: file data/part-r-00001-ddaee723-f3f6-4f25-a34b-3312172aa6d7.snappy.parquet is too small, length: 18350
・・・（省略）・・・
Warning: you merged too small files. Although the size of the merged file is bigger, it STILL contains small row groups, thus you don't have the advantage of big row groups, which usually leads to bad query performance!
```

マージしたらパフォーマンス下がるぞ的な警告が出ますが、マージできました。

以上です。
EC2のWindowsインスタンスの操作中にパーソナルFWを無効化して接続できなくなった場合の復旧手順

# トラブルの原因
AWSにて作成したEC2のWindowsインスタンスに対してRDPでログインした後、WindowsのパーソナルFWを操作中にRDP接続を無効に設定すると、RDP画面がブチっと切れて操作できなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/f695dccc-37eb-b3ec-098e-3a819dfe9c99.png)

EC2としては起動しているのですが、外からRDPが拒否されてしまい、OSレイヤーでの設定やローカルのファイルにアクセスすることが出来なくなってしまいます。

# 対処法
- EC2のバックアップ、スナップショットを取得していれば設定変更前に戻すことは出来ます…が、私は残していませんでした。
- AWS Systems Managerを使ってEC2にアクセスし、復旧させる方法もあるようです。    
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-ec2rescue.html
- 今回試してみた手順であれば、EC2の停止を伴いますが30分ほどで元に戻せますので試す価値ありです。

# 参考サイト
以下のサイトを参考にさせて頂きました。
少し前の手順ですが、2020年現在でもこの手順で解決できます。
https://haws.haw.co.jp/tech/ec2-windows-rdp-failure/  
やってることをシンプルに言えば、「ログイン出来なくなったEC2の設定を別のEC2で修正し、元のEC2に付け直す」ということになります。

# 手順
1. 対象のWindowsインスタンスを停止し、アタッチしていたEBSをデタッチします。  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/a84ea394-0b13-551c-f7dc-246ba9392aa9.png" width=30%>

2． 同じAZで切り替え用として新規のEC2を作成します。  
接続出来なくなったEC2のEBSのボリュームIDを確認し、新規作成したEC2にアタッチします。ボリュームが２つアタッチされる形になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/73036107-f5d5-4f41-9c16-7012684a81bc.png)

３． OSレイヤーで元のEC2のディスをオンライン化ます。
新規作成したEC2にリモートログインしてServer Managerを開き、
「File and Storage Services」 -> 「Volumes」 -> 「Disks」
からアタッチされた元のEC2のディスクを右クリックして「Bring Online」でドライブをオンラインにします。

4． レジストリハイブを読み込みます。
コマンドプロンプトから「Regedit」を入力し、レジストリが表示されたら「HKEY_LOCAL_MACHINE」を選択しFileメニューから「ハイブの読み込み」を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/17f61dc5-fe63-8111-aa48-db37e578d598.png" width=50%>

元のEC2の設定変更をするため、`Windows\System32\config\System`を開きます。

5． パーソナルFWポリシーの設定を書き換えます。
`services/SharedAccess/Parameters/FirewallPolicy`を開きます。
直下にネットワークごとのFW設定項目として`DomainProfile、PublicProfile、StandardProfile`の項目がありますので、それぞれのEnableFirewallの設定値を1→0に書き換えます。その後、Fileメニューから「ハイブのアンロード」を実行します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252317/1345c1e2-dc67-e916-9c50-5788d719388e.png" width=80%>

6． 元のEC2へアタッチし直します。
Server Managerで先ほどオンライン化したドライブを選択して「Take Offline」を実行し、切り替え用のEC2からログオフします。その後、2. と同様の手順でAWSのコンソール画面から対象のVolumeをデタッチし、元のEC2へアタッチし直します。

7． 接続確認
元のEC２を起動させるとRDP可能となります。
UiPath 変数と文字列を使った動的ファイル名の付け方

UiPathでの、動的なファイル、フォルダ名の付け方です。
例えば毎日、または毎月１ファイル作成し、そのファイル名に月や日付を入力する方法です。

例：月報◯月　　→◯の部分だけ変わるようにしたい

毎回同じファイル名なら問題ないですが、毎回異なるファイル名をつけなければいけない場合は、VBや変数を使います。プログラミングできる方にとっては当たり前の話ですが、ノンプログラマーや初心者がUiPathで実装しようとすると、悩むところもあると思うので参考になればと思います。

今回は例のような、固定の文字列と、作業当月の月が入るようにします。

代入アクティビティを使用して、
以下の変数、型と式を使用します。（もちろん変数名はなんでもOKです）

|変数名|変数の型|式| 
|:---|:---|:---|
| month|Datetime|DateTime.Now.ToString("%M")|
| filename|String|"月報"& month &"月"|

これで変数名「filename」を使ってファイル名を変更すれば当月の月が入ったファイル名に変更できます。
（ファイル名の変更方法は　https://qiita.com/usagit/items/8fe7a6fc4414a338a060
をご参照ください。）

１ヶ月前や、１日前等で入力したい事があると思います。
その場合は以下のような式を入力します。

| 変数名  |   変数の型      |式|出力される文字　|
|:-----|------------------|:------------------|---|
|month| DateTime |DateTime.Parse.(Now.Date.ToString())|5　　　　　　　|
|before_month| string | month.AddMonths(-1).Tostring("％M")|4|
|filename| string |"月報"& before_month　&"月"|月報４月|
※現在を５月とした場合の例
※("%") は書式指定子

１日前の場合は　AddDays(-1).Tostring("dd")　としてください。
#Python DeepLearning基礎 （数学1/4）

#1.シグマ
シグマ（$\Sigma$）: 複数の数値の総和 

$$\sum_{k=1}^n a_k = a_1 + a_2 + \cdots + a_n$$

$$\sum_{k} a_k = a_1 + a_2 + \cdots + a_n$$

```python
import numpy as np

a = np.array([1, 2, 3, 4, 5])
print(np.sum(a))
```

```:実行結果
15
```
#2.ネイピア数

ネイピア数$e$

$$e = 2.71828 18284 59045 23536 02874 71352 …$$ 

（式 1）
$$ y=e^x=\exp(x) $$

この式は、微分しても式が変わらないという大変便利な特徴を持っています。  

```python
import numpy as np

def get_exp(x):
    return np.exp(x)
    
print(get_exp(1))
```

```:実行結果
2.718281828459045
```
### グラフ表示

↓グラフ表示に関しては以前書いた記事を参考にしてください。
[#Python基礎（#matplotlib）](https://qiita.com/hiwasawa/items/529ed53c154159124dbc)

```python
import numpy as np
import matplotlib.pyplot as plt

def get_exp(x):
    return np.exp(x)

x = np.linspace(-3, 3, num=100)
y = get_exp(x)

# 軸のラベル
plt.xlabel("x val")
plt.ylabel("y val")

# 軸
plt.axhline(0, color = "gray")
plt.axvline(0, color = "gray")

#plt.hlines(y=[0], colors='b', linestyles='dashed', linewidths=1)
# グラフのタイトル
plt.title("Graph Name")

# プロット 凡例と線のスタイルを指定
plt.plot(x, y, label="y")
plt.legend() # 凡例を表示

plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631693/18afe0e8-22c0-3916-2cb9-7cd1e0243169.png)

#3.自然対数

$$ x = e^y $$　
のとき
$$ y = \log_{e} x $$


```python

import numpy as np

def get_log(x):
    return np.log(x)
    
print(get_log(1))
# 0.0

```
### グラフ表示

```python
import numpy as np
import matplotlib.pyplot as plt

def get_log(x):
    return np.log(x)

x = np.linspace(0.001, 3, num=1000)
y = get_log(x)

# 軸のラベル
plt.xlabel("x val")
plt.ylabel("y val")

# 軸
plt.axhline(0, color = "gray")
plt.axvline(0, color = "gray")

# グラフのタイトル
plt.title("Graph Name")

# プロット 凡例と線のスタイルを指定
plt.plot(x, y, label="y")
plt.legend() # 凡例を表示

plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631693/6285976e-91dd-57c3-2a50-d25025520dc9.png)
Pythonでソートする時のテクニック

## はじめに

Python3で競プロをしているときにソートの方法をド忘れすることがあるのでメモ

以下、インタプリタモードで実行しているため、行の最初に `>>>>` がついているものは入力だと思って見てほしい。

## list.sort() と sorted(list) の違い

`list.sort()` は元のリストをソートする。返り値は `None`

```python
>>>> list = [2, 3, 5, 1, 4]
>>>> list.sort()
>>>> list
[1, 2, 3, 4, 5]
```

`sorted(list)` は元のリストは変更せずにソートした結果を返す

```python
>>>> list = [2, 3, 5, 1, 4]
>>>> sorted(list)
[1, 2, 3, 4, 5]
>>>> list
[2, 3, 5, 1, 4]
```

## 逆順にソートしたい時

以下、 `list.sort()` でも `sorted(list)` でも同じオプションを使うので `sorted(list)` のみ扱う

オプションで `reverse=True` を指定する

```python
>>>> list = [2, 3, 5, 1, 4]
>>>> sorted(list)
[1, 2, 3, 4, 5]
>>>> sorted(list, reverse=True)
[5, 4, 3, 2, 1]
```

## ソートに使う列を限定したい時

普通にソートすると左の列から順にソートする。辞書順のようなイメージ

```python
>>>> people = [('Bob', 12), ('Alice', 10), ('Chris', 8), ('Chris', 7)]
>>>> sorted(people)
[('Alice', 10), ('Bob', 12), ('Chris', 7), ('Chris', 8)]
```

2列目のみをソートに使いたい時

```python
>>>> sorted(people, key=lambda x:x[1])
[('Chris', 7), ('Chris', 8), ('Alice', 10), ('Bob', 12)]
```

1, 2列目をソートに使いたい時

```python
>>>> sorted(people, key=lambda x:(x[0], x[1]))
[('Alice', 10), ('Bob', 12), ('Chris', 7), ('Chris', 8)]
```

## おわりに

`itemgetter`, `attrgetter`を使えばラムダ式を書かなくて済むが、覚えることが増えるので自分は使わないことにした。

使いたい方は参考のリンクから確認してほしい。

## 参考

https://docs.python.org/3/howto/sorting.html
【Tips】Gitで複数のブランチを一括削除(一致・除外)

```bash:bash
# 対象ブランチのみ強制削除
$ git branch | grep ${target_word} | xargs git branch -D

# 対象ブランチ以外を強制削除
$ git branch | grep -v ${target_word} | xargs git branch -D
```

- 解説
    - `git branch`: ローカルに存在するブランチを表示
    - `grep ${target_word}`: 上記のブランチ群を ${target_word} で部分一致検索
    - `grep -v ${target_word}`: こちらは ${target_word} で除外検索
    - `xargs`: grep で絞り込んだブランチを`引数`として取り扱う
    - `git branch -D`: xargs を引数としてブランチを強制削除
- 参考 URL
    - [Gitでローカルブランチを削除する \- Qiita](https://qiita.com/hogeta_/items/33d2334c9b1919bd5120)
    - [grep等の探索系コマンドメモ \- Qiita](https://qiita.com/xx2xyyy/items/c330bb1b55e475b01033)
    - [find, xargs, grepコマンドで検索　備忘メモ \- Qiita](https://qiita.com/tatsuo-iriyama/items/d636892a3f1694e6b16d)
ransackable_scopeに自由を！

Railsで検索画面作るなら、Ransack　ですよね。
めっちゃ便利。
あなたなしには生きていけない:relaxed:
もうあなたなしに、地道にcontrollerとmodelいじってた頃のことなんて、思い出せない...


検索機能を追加したい。
特に込み入った条件の…　というとき、皆さんどうされます？

私は、ransackable_scopeを使います。

1. ActiveRecord で scope 作り
1. それをransackからの使用を許可します `#ransackable_scopes`

詳細は、↓に譲ります(ry
[Ransack で ActiveRecord の Scope を利用して検索を行う方法](https://qiita.com/ruzia/items/f6003547ca18377a1508)
[公式](https://github.com/activerecord-hackery/ransack#using-scopesclass-methods)


この2番、面倒くさくないですか？

ransackでは、どのassociation, scope, model, 検索方式を使えるかを
[権限制御として操作可能](https://github.com/activerecord-hackery/ransack#using-scopesclass-methods)になってます。
このscope部分だけが、defaultで [] つまり、全拒否。

めんどい…。（エンジニア的美徳と信じて。）


正直、これが問題になること滅多にないので、
↓のmonkey patchでオーバーライド（ransackable_scopeを全無視）させました :japanese_ogre:

```ruby:/config/initializers/ransack.rb

# 全scopeを使OK
module Ransack
  class Context
    def ransackable_scope?(str, klass)
      klass.respond_to? str
    end
  end
end
```

引数 0-1個のscopeは全部検索に使用可能です。
option引数を第二引数以降にいれても大丈夫ですしね。

また、パラメーターを配列にすれば、2引数以上でもOK（展開してくれる）

例 `?q[my_scope][]=arg1&q[my_scope][]=arg2&q[my_scope][]=arg3`

というわけで、自由勝ち取りました


まぁ、セキュリティあまり気にしない社内システムとか限定[^1]で、
個人の責任でご使用くださいまし。

[^1]: 厳密には、ホワイトリスト型からブラックリスト型にするのがいいんだろな。`#ransackable_limited_scope` とか作って。
Webpackにてhtml-webpack-inline-source-pluginを利用する

# 更新（2021年6月13日）
本記事で紹介したPluginは既に開発が止まっておりますが、以下Pluginでは今でも開発が続いているようです。
開発環境上問題がなければこちらの活用をお勧めします

```
html-inline-script-webpack-plugin
```

# 以下当時の記事
古いPluginの内容となる為、最新のWebpack5等の環境では正常に動作しません

# はじめに
webpackで出力する際に出力されたJavascriptをHTMLファイルに差し込みたいと思います。

が、html-webpack-inline-source-pluginを使えば良いという点までは辿り着いたものの、公式のやり方では素直に実現出来なかったので発生した問題とその解決方法を記載致します。

# 検証した環境
```
- Node.js 13.13.0
    - webpack 4.42.1
    - webpack-cli 3.3.11
    - ts-loader 6.2.2
    - html-webpack-plugin 4.2.0
    - html-webpack-inline-source-plugin 1.0.0-beta.2
```

# 今回発生した問題
公開されている通常のhtml-webpack-inline-source-pluginを利用するとバンドル時に以下のようなエラーが発生してしまいます。

```
Cannot read property 'tapAsync' of undefined
```

調べた所対象PluginのIssuesに答えがありましたが、現行のバージョンで発生しているバグのようです。 これを回避する方法を記載します。
[https://github.com/DustinJackson/html-webpack-inline-source-plugin/issues/63](https://github.com/DustinJackson/html-webpack-inline-source-plugin/issues/63)

# 解決方法
- html-webpack-inline-source-pluginのバージョンを1.0.0-beta.2で指定する
- webpack.config.jsの記載方法を公式の書き方から変える。

以下に手順を示していきます。

Node.jsの開発環境を準備しましたらpackage.jsonを以下の通りにします。

```package.json
{
  "name": "name",
  "dependencies": {
    "html-webpack-inline-source-plugin": "1.0.0-beta.2",
    "html-webpack-plugin": "4.2.0",
    "ts-loader": "6.2.2",
    "typescript": "3.8.3",
    "webpack": "4.42.1",
    "webpack-cli": "3.3.11",
    "webpack-dev-server": "3.10.3"
  }
}
```
インストールする

```
npm install
```
webpack.config.jsを以下の通り準備する

```
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const HtmlWebpackInlineSourcePlugin = require("html-webpack-inline-source-plugin");

const mode = process.env.NODE_ENV === "development" ? "development" : "production";
const entry = path.resolve("src", "index.ts");
const outPath = path.resolve("build");
const outFileName = "main.js";
const rules = [{ test: /\.tsx?$/, use: "ts-loader" }];
const resolve = { extensions: [".ts", ".tsx", ".js", ".json"] };
const output = { path: outPath, filename: outFileName };
const devServer = { contentBase: outPath };

const plugins = [
new HtmlWebpackPlugin({ inject: true, inlineSource: '.(js|css)$', template: "./src/index.html" }),
new HtmlWebpackInlineSourcePlugin(HtmlWebpackPlugin),
]

module.exports = [{
  mode,
  entry,
  output,
  module: { rules },
  resolve,
  externals,
  devServer,
  plugins,
}]
```

ここでポイントは以下の箇所になります。他の所はお好みで記載して良いです。寧ろ私のwebpack.config.jsのこの書き方はかなり我流なのであまり真似しない方が良いかもしれません。

````webpack.config.json
const plugins = [
  new HtmlWebpackPlugin({ inject: true, inlineSource: '.(js|css)$', template: "./src/index.html" }),
  new HtmlWebpackInlineSourcePlugin(HtmlWebpackPlugin),
]
```

通常公式では以下の通り記載することになっていますが、

```webpack.config.json
new HtmlWebpackInlineSourcePlugin()
```

これを以下の通りに変更するとErrorが解消されます。 ※なお今回Installしたプラグインのバージョンで上記公式の記載方法を取ると引数が足りないとErrorになります。

```
new HtmlWebpackInlineSourcePlugin(HtmlWebpackPlugin)
```

上記の状態でバンドルしてみてください。上手くインラインされて出力されると思います。

以上
Visual Studio Codespaces(旧Visual Studio Online)で、無料でVSCodeとウェブからアクセス可能な開発環境を手に入れる

オンラインエディタとして注目されたVisual Studio Onlineですが、仮想マシンの値段や、デスクトップ上でしか動かせないことから、採用を見送っていた方が多いかと思います。
いつの間にか名前が変わり、cliツールが出たことで、任意の仮想環境で使う事が出来るようになっていました。
これにより、GCPやAWSの無料枠を使い、無料でどこからでもVSCodeを使った開発環境を手に入れる事が出来ます。
#### 準備するもの
- マイクロソフトアカウント
- Azureサブスクリプション
- 任意のvps（この記事ではGCP登録時の1年分のクレジット枠を使うことを想定します)
- VSCode

###　GCPでのインスタンス作成
まず、GCPのコンソール画面から、左上のメニューを開き、『Compute Engine』=>『VMインスタンス』を選び、インスタンスを作成します。
注意点としては、外部IPアドレスを作成し、固定にしておくことです。![gcp 外部アドレス.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350500/116ac05e-8e16-512d-9589-9acebce4407d.png)
### コンソール画面からVS Online CLI　のセットアップをする
インスタンスが起動したら、VMインスタンス管理画面から右側にあるSSHをクリックし、コンソールを起動します。
![gcp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350500/224e8899-15ac-f378-915d-7b3396256263.png)[こちら](https://docs.microsoft.com/en-us/visualstudio/online/reference/vsonline-cli)のドキュメントを参考にし、インスタンスにVS Online CLI　の設定をしていきます。
ここでは、debian10を例にして記述します。

```debian10
sudo curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
sudo apt install software-properties-common
sudo apt install apt-transport-https
sudo add-apt-repository https://packages.microsoft.com/debian/10/prod/
sudo apt-get update
sudo apt-get install vso
vso start
```
ここで、コンソールに表示されたＵＲＬをクリックし、四角の部分のコードを入力します。
![microsoft login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350500/af203816-4d5e-8c53-a3c1-2252e88c39a2.png)
Azureサブスクリプションが有効になっているアカウントで認証を進めると、再びコンソールが進みます。

```
Would you like to run as a persistent service/daemon? [Y/n]: y
Enter an environment name or blank to use [instance-1]: "好きな名前かブランク"
Would you like us to run 'loginctl enable-linger' to enable services to run even when you're not logged on? [Y/n]:y
All done! Connect: https://online.visualstudio.com/environment/#######
```
最後に表示されるURLにアクセスすると、ようやく仮想環境のVisual Studio Codespaceにアクセスできます。
![vsonline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350500/c212595c-906c-bdb1-3826-ddc6987cbca3.png)

これでどこにいても、ブラウザからVSCodeベースの開発環境にアクセスできます。

###　VSCodeからアクセスする
下記の拡張機能をインストールします。

- [Visual Studio Codespaces](https://marketplace.visualstudio.com/items?itemName=ms-vsonline.vsonline)
-  [Azure Account](https://marketplace.visualstudio.com/items?itemName=ms-vscode.azure-account)

コマンドパレットから『Azure Sign In』と入力し、先ほど入力したアカウントでログインします。
左下にログインしたアドレスが表示されたら、リモート接続の準備完了です。
リモートエクスプローラーのドロップダウンから『Codespaces』を選択すれば、先ほど作った接続先がリストにあるはずです。![vscodetoonline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350500/a018d801-e3c9-77f3-dd50-5aa2edabb44d.png)
これで、VSCodeとブラウザで同じ環境を開発できます。
今のところ、Codespaces経由の操作はかなりもっさりしているので、ストレスを感じたら[こちらの記事](https://qiita.com/HoriThe3rd/items/b2f6c440f096106cf89e)を参考に、SSH接続をしてください。

####　あとがき

Codespaceについてはまだあまり触ってないのでこれから色々試してみようと思います。
また、リポジトリから環境構築をしてくれる[GitHub版](https://github.com/features/codespaces)がありますので、Gitpodとの違い等、興味のある方は触ってみたら如何でしょうか。
以上、ありがとうございました。
ruby &. の呼び方について

# これ何

`&.` ってなんて呼びんだっけ...って調べてたので、ついでにまとめる。

答え「ぼっち演算子」

英語では「safe navigation operator」というらしい。学び。
公式ドキュメントにも確かに載っていた。

参考：[Ruby 2.7.0 リファレンスマニュアル  Rubyで使われる記号の意味（正規表現の複雑な記号は除く） #and](https://docs.ruby-lang.org/ja/latest/doc/symref.html#and)

# ついでに
調査ついでに、リファレンスマニュアル を読んでいたら `^=` ってmethodが気になった。 

右辺がtrueの場合には、aの論理値の反転した値を返す。

```ruby
b = true
3.times do 
  b ^= true
  puts b
end
# => false
# => true
# => false
```

左辺がfalseの場合には、反転せず、同じbooleanの値を返す。

```ruby
b = true
3.times do 
  b ^= false
  puts b
end
# => true
# => true
# => true
```

```ruby
b = false
3.times do 
  b ^= false
  puts b
end
# => false
# => false
# => false
```

stringやintegerなどでも試したところ、NoMethodErrorになった。

```ruby
b = 'a'
b ^= true
# => NoMethodError (undefined method `^' for "a":String)
```

参考：[Ruby 2.7.0 リファレンスマニュアル  Rubyで使われる記号の意味（正規表現の複雑な記号は除く） #hat](https://docs.ruby-lang.org/ja/latest/doc/symref.html#hat)

# まとめ
ついでを調べると意外な発見がある！
Ubuntu 20.04 LTS Focal Fossa で docker を使う

# 追記
Focal Fossa 向け Docker CE 19.03.9 が 2020-05-18 にリリースされたようです。


# はじめに

Ubuntu の新しい LTS である Focal Fossa がリリースされました。
が、[Focal Fossa 向け Docker CE](https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/) は 2020-05-07 時点で存在していません。

具体的なリリースプロセスは知らないのですが、Ubuntu 向け Docker CE はリリースまでタイムラグが小さくないようです。前 LTS の Bionic Beaver での初版となる 18.03.1 登場は 2018-06-22 頃でした。

リリースを待っていられないので、別の Docker を使います。

ただ、docker.io は手順がディストリビューション依存になりそうなので、Snappy を利用します。


# 手順

## 概略

- グループ docker を作る
- docker をインストールする
- hello-world でテスト

## 詳細

### グループ docker を作る

```
# groupadd --system docker
```

### docker をインストールする

edge から新しめのバージョンをインストールします。
2020-05-07 時点で 19.03.8 がインストールされました。stable のは 18.09.9 でした。

```
# snap install --channel=latest/edge docker
```

### hello-world でテスト

```
# docker run --rm hello-world
```

# おわりに

グループ docker を作ることは必須ではありません。作っておくと non root でゴニョゴニョする場合に便利というか Docker CE 互換になります。
ちなみに docker.io はグループ docker が存在しないとエラーとなり起動できません。postinst スクリプトで作成されるので存在しないのはちょっとオカシイですが。

happy docking!
【Sass】【Rails】　画像＆背景画像を入れる

## 目的
railsアプリ を作っている時に背景や画像を入れるやり方がわからなかったので

##前提
載せたい画像をapp/assets/imagesに配置する
app/assets/images/materialに画像の素材を格納


##画像
```
= image_tag "material/app-store.svg", class:"image"
```

##背景画像


```.scss
background-image: image-url("material/pict/bg-mainVisual-pict_pc.jpg") ;
```

ポイントは載せたい画像をapp/assets/imagesに配置することです。
images以降の相対パスを記述すればいけます。

<img width="1440" alt="スクリーンショット 2020-05-08 0.05.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628336/621a64e1-aa18-42c7-ca86-a4475ee0fa35.png">

こんな感じで背景が入れられました

###捕捉

下記の記述だと本番環境で画像が表示されませんでした。理由は分かっていないですが、上述のコードでお願いします。

```.scss
background-image: url(material/pict/bg-mainVisual-pict_pc.jpg) ;
```