OmniAICreator/Qiita-1.07M huggingface dataset:
[新感覚パズルゲーム]type-challenges初級編へTry

# はじめに
* こんにちは ! KDDI アジャイル開発センターの小板橋です。
* 昨日のKPTで激ムズtype-challengesについて盛り上がったので、今度はしっかり学びながら問題を解いていき、まとめていこうと思います。
[type-challenges](https://github.com/type-challenges/type-challenges/blob/master/README.md)

# さっそく
## warm up
[問題1](https://github.com/type-challenges/type-challenges/blob/master/questions/13-warm-hello-world/README.md)

* 僕の解答↓

```anser.ts
/* _____________ Your Code Here _____________ */
type HelloWorld = string // expected to be a string

/* _____________ Test Cases _____________ */
import { Equal, Expect, NotAny } from '@type-challenges/utils'

type cases = [
  Expect<NotAny<HelloWorld>>,
  Expect<Equal<HelloWorld, string>>
]

```
* 解説  
ジェネリクスについて知っていれば、わかる問題かなという感じです。

### ジェネリクスってなんやねん？

基本的に、型がある言語にはジェネリクスというものがよく存在しています。
これは、クラス、インターフェース、メソッドなどの型を**パラメータとして定義する**ことです。
もちろんTypeScriptにもジェネリクスがあります。

書き方としては、型名をHoge`<S, T>`のようにします。
名前のあとに`<>`で囲った変数の列を与えることで、型の定義の中でそれらを型の変数として使うことができるのです。

また、この問題だと`<HelloWorld, string>`このジェネリクスに対しEqualを取っているので、`type HelloWorld = string`としてやれば良い。

## easy
### Pick`<T, K>`
[問題](https://github.com/type-challenges/type-challenges/blob/master/questions/4-easy-pick/README.md)

* 僕の解答

```anser.ts
type MyPick<T, K extends keyof T> = {[k in K]: T[k] }

/* _____________ Test Cases _____________ */
import { Equal, Expect } from '@type-challenges/utils'

type cases = [
  Expect<Equal<Expected1, MyPick<Todo, 'title'>>>,
  Expect<Equal<Expected2, MyPick<Todo, 'title' | 'completed'>>>,
  MyPick<Todo, 'title' | 'completed' | 'invalid'>,
]

interface Todo {
  title: string
  description: string
  completed: boolean
}

interface Expected1 {
  title: string
}

interface Expected2 {
  title: string
  completed: boolean
}

```
* 解説
注目すべき点としては、まず`K extends keyof T`という部分ですかね。

これは、型引数Kは型引数Tの部分型でなければならないうえ、typeof演算子を用いているので、与えられた値の型を文字列で返した時の部分型ということになります。
`{[k in K]: T[k] }`については、まず右側の`: T[k]`について明記する。
これは、Tが{ title: string; description: string; completed: boolean; }の型であることを指す。
次に、Mapped typesである`[k in K]`を知っている必要がある。
Mapped typesとは、Kはstringにアサイン可能なtypeであればよく、Kに対する値はTというtypeになるという意味です。
[参照: Mapped types](https://github.com/Microsoft/TypeScript/pull/12114)


### `Readonly<T>`
[問題](https://github.com/type-challenges/type-challenges/blob/master/questions/7-easy-readonly/README.md)

* 僕の解答

```anser.ts
/* _____________ Your Code Here _____________ */

type MyReadonly<T> = { readonly [K in keyof T]: T[K] }


/* _____________ Test Cases _____________ */
import { Equal, Expect } from '@type-challenges/utils'

type cases = [
  Expect<Equal<MyReadonly<Todo1>, Readonly<Todo1>>>,
]

interface Todo1 {
  title: string
  description: string
  completed: boolean
}

```

* 解説

まず、`[K in keyof T]: T[K]`ここは良さそうですね。先ほどの問題と似ています。
さて、では`readonly `こいつですが、何をしているのかというと、これを付けることで、宣言されたプロパティは再代入できなくしています。constみたいなもの。
なので、テストケースを見た際に`Expect<Equal<MyReadonly<Todo1>, Readonly<Todo1>>>`となっていると思いますが、右側の`Readonly<Todo1>`でTodo1の型に対し、左側の`MyReadonly<Todo1>`では型の制約(`[K in keyof T`、型引数Kは型引数Tの部分型でなければならないうえ、typeof演算子を用いているので、与えられた値の型を返した時の部分型)となっているので、付き合わせて時にイコールとなり、テストをクリアしていることになります。


# おわりに
いや、難しすぎる。。easyじゃないって。。。
途中で諦めてごめんなさい。
pandasで欠損したヘッダーの対処をする

# したいこと
以下のようなcsvデータを読み込んだ後にいろいろ整形したいとしても，ヘッダーの数と各行のデータ数が合わない場合，うまく整形ができませんでした．
このような場合の対処のベストプラクティスがわからなくて無理やり対処しました．もしあれば教えていただきたいです．


<!-- table start -->

|  id  | mean | data| | | | |  
| ---- | ---- | ---- |----|----|----|----|
|  1  | 0.5 | 0.75 | 0.40 | 0.55 | 0.39 | ... | 
|  2  | 0.3 | 0.25 | 0.10 | 0.35 | 0.43 | ... | 
| ... | ... | ... | ... | ... | ... | ... |

<!-- table end -->

# 対処方法
誰もが思いつくことだと思うのですが，データはid列とmean列と複数のdata列が並べられているだけなので，headerを0に設定してnamesでヘッダーを無理やり上書きします．
そのためにお恥ずかしいですが以下のように2回データを取得して無理やりデータを整形し直して，得られたデータフレームに対して処理を加えます．データ数が多くなると同じことはできないと思うので，ベストプラクティスが知りたいです．．．

```py
import pandas as pd

# csvの読み込み 1回目
# header=1にすることで一行目を無視しています．なので，この段階では2行目のデータがheaderの代わりになっています．
df_num = len(pd.read_csv('test.csv', header=1).columns)

# namesを作成します．ヘッダーは重複ができないので適当にindexをつけておきます
names = ['id', 'mean'] + ['data_%d'%(i+1) for i in range(df_num - 2)]

# csvの読み込み 2回目
# データを再度読み込みます．この際header=0としてnamesを上書きします．
df = pd.read_csv('test.csv', header=0, names=names)
```

上記のようにすることで，csvファイルのヘッダーを以下のように無理やり上書きしました．

<!-- table start -->

|  id  | mean | data_1 | data_2 | data_3 | data_4 | ... |  
| ---- | ---- | ---- |----|----|----|----|
|  1  | 0.5 | 0.75 | 0.40 | 0.55 | 0.39 | ... | 
|  2  | 0.3 | 0.25 | 0.10 | 0.35 | 0.43 | ... | 
| ... | ... | ... | ... | ... | ... | ... |

<!-- table end -->

これで一応mean列を消したりと欲しいデータに整形することが容易にできます．
pandasを普段からゴリゴリにつかっていないので，なにか良い方法があればコメントいただけると幸いです．
ご覧いただき，ありがとうございました．
【PHP】標準入力で受け取った、空白を挟んだ複数の値をそれぞれ変数に入れる【初心者】


空白を挟んだ複数の値(例:2 3)を標準入力で受け取ってそれぞれを変数に入れたい。

自分が知ってるやり方は2つ

#####方法(1つ目)

```hoge.php
//文字前後の空白や改行コードとか消して$numに代入
$num = trim(fgets(STDIN));

//空白を区切りに配列に分割して代入
$array = explode(" ",$num);

//配列の1つ目を変数に代入
$first = $array[0];

//配列の2つ目を変数に代入
$second = $array[1];

```



#####方法(2つ目)

```huga.php
//文字前後の空白や改行コードとか消して$numに代入
$num = trim(fgets(STDIN));

//空白で区切って、それぞれ$firstと$secondに代入
[$first,$second] = explode(" ",$num);
```

このだいぶ短くなったほうは、「分割代入」っていうらしいです。

###補足(2020/12/3 更新)
※@il9437様からご指摘頂きました。ありがとうございます。

上記の書き方だと区切りの空白が半角スペース一個の時に限った書き方だったので、以下のように書くと空白が二個以上でも対応できます。

```
// 空白文字の１文字以上の連続で分割して、代入
$array = preg_split('/\s+/',$num);
```
DataGridView.Columns[0]に自作プロパティを作成する

C#でDataGridView.Columns[0]に自作プロパティを作成する方法

class1.cs

    public class CusDataGridViewColumn: DataGridView
    {
        public new List<CustumColumn> Columns { get; }

        public CustumColumn this[int index]  // インデクサ
        {
            get
            {
                return Columns[index];
            }
            set
            {
                Columns[index] = value;
            }
        }
    }

    public class CustumColumn : DataGridViewColumn
    {
        public string test { get; set; }
    }


Form1.cs


        private void Form1_Load(object sender, EventArgs e)
        {
            string a = cusDataGridViewColumn1.Columns[0].test;
            a = cusDataGridViewColumn1.Columns[1].test;
        }
【JUnit】JUnitを使ってテストケースを作りたいときにやること


## JUnitとは？

Javaのプログラムをテストするフレームワークのこと
一番メジャーなテストフレームワークなのでJavaを扱う現場ではセットになっているケースが多いと思います。

## なぜテストをするのか？
簡単に言えば、作ったプログラムがきちんと動いていることを確かめるためにテストをします。

Javaのように大規模なシステムのためのプログラムや止まっていは行けないミッションクリティカルな要件では特に大切。

あと、テストフレームワークを使わずに手動でプログラムを確かめるのはとっても大変だからです。
（いわゆるIT土○的な残業MAXなお仕事スタイルを納品前にすることもある）

なので、コードを作った時点でテストを作り後続で作ったプログラムができてもきちんと動くことを保証することはとても大事なことであると思います。

GooodBye、スキルアップしない残業人生…


## プロダクトコードを作成する。

一番わかり易いモデルとして足し算を行うプログラムをテストしてみよう

本来は先にテストコードを書いてからというお約束があるけれど今回はテストした対象ありきでスタート。サンプルは以下

```java
package sampleTestJava;

public class SampleJava {

	int testMethod(int a, int b) {
		return a + b;

	}
}
```

## テストコードを作成する

今回は一番シンプルなテストの構成を使ってテストをしてみる。

JUnitでは基本的にテストはすべて独立したものとして書くというのが概念の一つとしてあるので、テストを行うには以下の要素が必要です。

* テストの対象をインスタンス化する
* 対象メソッドを呼び足して実測値を得る（Actual）
* 期待値を自分で設定しておく（Expected）
* 実測値と期待値があっているのかを確かめる（Assertメソッドを使った比較）

以下のコードはテンプレートなコード
インスタンス化するクラスとメソッド名を変えてあげれば自分の書いたクラスのテストができるのでスペニットなどに登録しておくといいかも

```java
package sampleTestJava;

import static org.junit.Assert.*;
import org.junit.Test;
import jdk.jfr.Description;

public class SampleJavaTest {

	@Test //必ずテストアノテーションを入れる
	@Description("足し算をするメソッドのテスト") //慣習的に説明を入れておくのがベター
	public void test_testMethod() {
		//クラスをインスタンス化する。
		SampleJava sut = new SampleJava();
		//インスタンスメソッドを実行して、実測値を取得する。
		int actual = sut.testMethod(1, 2);
		//期待値を代入しておく
		int expected = 3;
		//実測値と期待値を比較する
		assertEquals(actual, expected);
	}

}
```

## テストを実行する
Eclipseには標準機能としてJUnitを使うことができるのでテストファイルを右クリックしてメニューから「JUnitテスト」を選択肢実行してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89244/37bf6fef-e9e6-7144-38e3-f82b9d441db1.png)

コマンドラインから実行したい場合は以下のような形で実行すること

JUnit5
`Java -jar junit-platform-console-standalone-<version>.jar <Options>`

JUnit4
`Java -cp .:/usr/share/Java/junit.jar org.junit.runner.JUnitCore [test class name]`


## テスト結果を確認する

テストが正常に実行された場合はグリーンのバーが表示されます。
赤になった場合はテスト実行時に何かしらのエラーが発生している音でスタックトレースを確認して修正してみてください。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89244/1ecaf0a8-eeb3-3fa8-b16a-d606bccaac14.png)



#development/java
投稿機能を作る

<h3>モデルの編集</h3>

```Artist.php

class Artist extends Model
    public function followingArtist()
    {
        // このユーザがフォロー中のユーザのidを取得して、配列にする
        $userIds = $this->followings()->pluck('users.id')->toArray();
        // このユーザのidもその配列に追加
        $userIds[] = $this->id;
        // それらのユーザが所有するアーティストを絞り込み、返す。
        return Artist::whereIn('user_id', $userIds);
    }
```

<h3>コントローラーの編集</h3>

```ArtistController.php
    public function output()
    {
/*-------------自分だけのタイムライン-------------------------------
        //現在ログイン中のユーザIDを変数$user_idに格納する
        $user_id = Auth::id();
        
        //artistテーブルからuser_idカラムが変数$user_idと一致するレコード情報を取得し変数$artistsに格納する
        //artistテーブルからuser_idカラムが変数$user_idと一致するレコード情報を取得し変数$artistsに格納する
        
        $artists = Artist::whereUser_id($user_id)->get();
        return view('welcome', [
            'artists' => $artists
            ]);
-------------------------------------------------------------*/
            
        $data = [];
        if (\Auth::check()) {
            // 認証済みユーザ（閲覧者）を取得
            $user = \Auth::user();
            // ユーザとフォロー中ユーザの投稿の一覧を作成日時の降順で取得
            $followingArtist = $user->followingArtist()->orderBy('created_at', 'desc')->paginate(10);

            $data = [
                'user' => $user,
                'follows' => $followingArtist,
            ];
        }

        // Welcomeビューでそれらを表示
        return view('welcome', $data);
            
    }
```
<h3>ビューに表示する</h3>

```blade.php
@foreach ($follows as $follow)

  <div class="artistList__row__items">
     <a href="{{URL::to('artist/'.$follow->id)}}">
        <div class="artistPanel">
          <img src="{{ $follow->path }}" width="100%">
        </div>
     </a>
     <p>{!! link_to_route('artist.show', $follow->name, ['id' => $follow->id]) !!}</p>
  </div>

  @endforeach
```
人気急上昇中のwebフレームワーク「Svelte」の紹介 #基礎編

### 初めに
本記事は2020年[木更津高専アドベントカレンダー](https://qiita.com/advent-calendar/2020/nit_kisarazu) の7日目の投稿です。
また素人記事なため温かい目で見守ってください。

## Svelteとは
[Svelte](https://svelte.dev/)とは
**速い・簡単・便利**
の３つ兼ね備えたフロントエンド初学者や上級者にもおすすめしたい、幅広い人のニーズに対応したフレームワークです
初リリースは2016年11月26日でTypeScriptで書かれています(コードで使用するのはJavaScript)
Svelteはコンパイラーであるため、実質ライブラリーとしての容量は0kbであり、独自の拡張`.svelte`を使って書きます

### ほんとに人気なの？
こう思う方も少なくはないと思います。
自分も最近まで名前も知らなかったし、友人などに聞いても知らない人がほとんどで、触ったことある人なんて数人しかいませんでした。


しかし、こちらをご覧下さい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563017/2b07ebd9-a7ac-cd6f-36fb-d0e42e8f9d2f.png)
こちらは有志の方が行われた[jsフレームワークの人気調査](https://2019.stateofjs.com/front-end-frameworks/)です

コレを見ると前述した通りリリースは2016年のはずですがランキングに現れたのは2019年が初です。
PreactやVueなどを抑え２位となっています。
コレには公式のTypeScript対応など様々な要因があると思いますが、人気急上昇中なのは明らかでしょう。

## 速い
みなさんは**仮想DOM**という言葉は聞いたことがありますか？
これはDOMを２つ用意しレンダリングの際に差分のみを変更し、レンダリングコストを下げるためのものです。
一般的に仮想DOMは高速と言われ続けてきました。
###### しかし！！！
Svelteには仮想DOMはありません！！！
これは仮想DOMの欠点を補いつつ速度も出せる最高なことなのです。

仮想DOMは変更の度に毎回差分を見るためレンダリングまでに処理が発生します。これはコード量が多くなればなるほど作業は多くなります。
しかし、Svelteはビルド時にアプリケーション内の変更される場所を認識するコンパイラなので処理を少なく早く行うことできます。

実際
ベンチマークで React の35倍、Vue.js の50倍の速度が出ています。

## 簡単
まずはこちらを見てください

```react
import React, { useState } from 'react';

export default () => {
  const [a, setA] = useState(1);
  const [b, setB] = useState(2);

  function handleChangeA(event) {
    setA(+event.target.value);
  }

  function handleChangeB(event) {
    setB(+event.target.value);
  }

  return (
    <div>
      <input type="number" value={a} onChange={handleChangeA}/>
      <input type="number" value={b} onChange={handleChangeB}/>

      <p>{a} + {b} = {a + b}</p>
    </div>
  );
};
```
```Vue
<template>
  <div>
    <input type="number" v-model.number="a">
    <input type="number" v-model.number="b">

    <p>{{a}} + {{b}} = {{a + b}}</p>
  </div>
</template>

<script>
  export default {
    data: function() {
      return {
        a: 1,
        b: 2
      };
    }
  };
</script>
```
こちらはReactとVueで書かれた加算演算をして表示するコードです。
これをSvelteで書いてみると

```html

<script>
	let a = 1;
	let b = 2;
</script>

<input type="number" bind:value={a}>
<input type="number" bind:value={b}>

<p>{a} + {b} = {a + b}</p>
```
こうなります❗
なんと20行ほどかかっていたコードがたったの10行で記述できました。
これは短いから可読性が低いというわけではなく、無駄を削ぎ落とし、より直感的にコードを読めるようになっています。
さらにみなさんがすでにマスターしているであろうJavaScriptとCSS、HTMLの知識があれば8割方書けると言っても過言ではありません。

より直感的に書くことにより、書き手と読み手両方が即座に理解することができ、開発スピードも格段に上がることでしょう。

## 便利
Svelteを使ってできないことはありません！

例えば

Redux, Vuexは storesで代用することができます

Next, Gatsby は Sapper があり簡単に実装できます

WebGL, Three.js なども Svelte GLがありますし

React Native, nativescript-vue などのNativeアプリもSvelte Nativeで作ることができます

また[公式のチュートリアル](https://svelte.dev/tutorial/basics)がとても豊富でコレをするだけで独自の言語仕様から、JSなどの基本も一緒に学習できます。

またここまで呼んだ天才フロントエンドエンジニアの皆さんなら思ったと思います。
Sass使えないの！？！？！？
TypeScriptは？？？JSだけなの！？！？
安心してくださいどちらもサポートされています。
プロジェクトに簡単に追加することができ、誰でも自分にあったスタイルでwebページを作れます


## 最後に
ここまで呼んでいただきありがとうございました
明日は独自の言語仕様や環境構築などを紹介したいと思います。
では、良いクリスマスを
Proxy環境下のSpring Securityを攻略する

# 下記対応は非推奨です。
以下記事の手順で代替してください。
[Java認証Proxy対応方法](https://qiita.com/SierSetup/items/f29e84f27273d1bea7f5)

# Depuricated!!
# Advent Calendarの第5日目です
タイミングが合ったので乗っかってみました。

# 環境
| 環境名 | Version |
|:-:|:-:|
| OS  | Ubuntu  |
| Proxy  |  Squid-4.13 |
| Proxy-Authentication  | あり  |
| IdP  | Keycloak-11.0.3  |
| Spring-Boot  | 2.4.0  |

# 何がしたかったか。
KeycloakをIdPとして、認証を通した後にOIDCの認可コードフローを回してSpring Sessionを開始したかった。
また、この一連の流れをSpring Securityの設定ベースで実現したかった。

## 何が起きたか。
Proxyに殺された。
と、冗談は置いといて、以下に最終的な解決方法を示します。
これに至った詳細な経緯も載せておきます。

# 解決策
javaagentライブラリを開発した。
[siersetup/RestTemplateAddonUserSystemProxy](https://github.com/satoc0629/RestTemplateAddonUserSystemProxy)

細かいことは上記のReadMeに記載していますが、主な働きとしては、

* **RestTemplateのコンストラクタ処理に、JVM引数（プロキシ関連）をまとめて読み込む処理を追加します**

これにより、Springフレームワーク側で`new`を用いて生成される`RestTemplate`はすべてプロキシに対応します。
自身のアプリケーション上は、RestTemplateをBean化して、必要なカスタマイズを施して利用します。

以下、経緯を簡単にまとめてみました。

# Proxy環境下ではOAuth系のクラスが対応していない
SpringSecuirtyでは、SpringのHttpClientであるRestTemplateが四方八方で使われている。
RestTemplate自体は、requestFactoryを設定することでプロキシ対応は可能である。
しかし、SpringSecurityでは、`new RestTemplate()`している箇所が多くまたカプセル化されているため、設定では対応は不可能。

## 対応方法の検討
### リフレクション
リフレクションで対応する、というのはナンセンスだと考えました。
というのも最初はそれでやっていましたが、全貌が見えなかったのと、SpringSecurityすべてのソースを見るという工数的余裕もありませんでした。ボトムアップアプローチはやめました。

### RestTemplateの挙動を変える
RestTemplateをプロキシ対応する方法はわかっていたので、SpringSecurityを使う上で、`new RestTempalte`はすべてプロキシ対応を打ち込むべきと考えました。

#### AOP
executionでコンストラクタの前に仕込もうと思いましたが、うまくいきませんでした。
というのも問題箇所は、`new RestTemplate`されているだけで、DIのBeanでもなんでもないからです。

#### javaagent(javassist)
バイトコード書き換えというのは、Lombokを知っていればなんとなく聞いたことがあるものです。
私もその口でしたので、思い切って調べてみました。
意外なほど簡単にコンストラクタを捕捉し、書き換えに成功しました。

## 後日談
### Spring Secuity内の`new RestTemplate()`は6箇所だった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87538/4a0d04ec-b18d-8620-015c-9fe4f1146af1.png)

| class | 働き | わたしの被弾 |
|:--|:--|:-:|
| NimbusOpaqueTokenIntrospector |  OAuth 2.0 Introspection Endpoint を使用してトークンを検証。 |未使用|
| NimbusJwtDecoder  |  Nimbus設定を受け取るJwtDecoderの低レベルNimbus実装。 |被弾|
| DefaultOAuth2UserService  |  標準の OAuth 2.0 プロバイダーをサポートする OAuth2UserService の実装。 |被弾|
| CustomUserTypesOAuth2UserService  | `@Deprecated`  |未使用|
| ClientRegistrations  | 提供された発行者に基づいてClientRegistration.Builder、OpenIDプロバイダー構成または 承認サーバーメタデータからを作成できます。  |被弾|
| JwtDecoderProviderConfigurationUtils  | `/.well-known/openid-configuration`や`/.well-known/oauth-authorization-server`などから設定情報を得る。 |被弾|

### 感想
非常に苦しい期間もありましたが、自分なりのOSSを一つ初めて作れたことがとても良かったです。
特に設定だけでOIDC＋SpringSecurityを動かせるようにする、というのも普通に理解するのに苦労しました。
最後はProxyにひどいめに合わされましたが、自分なりの解決策に至ったことは大変嬉しく思います。
ひたすら楽するJulia

# はじめに
この記事は限界開発鯖 Advent Calendar 2020の3日目です
アドベントカレンダーは良き文明...
# juliaとは
PythonのようにかけてCのように早い言語
楽しい
めっちゃ現代的
もはや次世代
動的型付けのくせに静的型付けとしても書ける
#### GitHubページ
https://github.com/JuliaLang/julia
# Juliaを使いたくなる理由
### 高速な実行速度
JITコンパイルでコンパイルしているため、型安定[^1]にさえ気をつけたらCなどの高速な言語と同程度の速度を出せる
~~やはりPythonは~~
#### 参照先
https://jp.quora.com/JIT-konpaira-ga-hayai-to-gen-ware-te-iru-riyuu-ga-yoku-waka-ri-ma-sen-intapurita-to-kurabe-te-toiu-koto-de-shou-ka-mata-kumikomi-youto-de-JIT-wo-riyou-suru-koto-ha-arima-suka
### Lispと同程度に使えるマクロ
とても多機能なマクロが使える
~~黒魔術ももちろんできる~~
#### 参照先
https://muuuminsan.hatenablog.com/entry/2020/10/08/021903
### Julia単体でドキュメント/ホームページ生成ができる
ページの形は固定されてるとはいえ、doxygenのようなものが手軽に使えるのは便利
#### 参照先
https://qiita.com/SatoshiTerasaki/items/b0ac17088f3b2c374099
https://github.com/JuliaDocs/Documenter.jl
### 豊富な既存マクロ
Juliaには既存マクロとして、

1. コンパイラへのヒント
2. 構文の拡張
3. 開発の補助
4. 特殊なリテラル
 
といった4通りの目的に応じたマクロが存在する
とても便利
### 変数名などにUnicodeを使用できる

```
✟卍魔剤卍✟="Monstar"
```
といったふざけた変数名でも通るので趣味で書くのにも楽しく書ける

### C、R、Pythonなどの多言語の資産も利用できる
最新の言語に乗り換えにくい原因の一つとして、ライブラリなどの資産がないということが挙げられるが、Juliaはその点も解決できる
標準でもPyCallやRcall、Ccallといった他言語呼び出しのためのモジュールが存在する
### 虚数の計算を標準サポートしている
Juliaの特徴として「科学技術計算を思考した動的な言語 [^2] 」と言われているほどなので、もちろんサポートしている
書き方としてもその特徴が現れており、数式的に記述できる

# ええやんけぇ……と思った人におすすめの入門ページ等
## サイト
* https://github.com/bicycle1885/Julia-Tutorial
    * ノートブックに書かれた高速チュートリアル 実行しやすいしわかりやすいし神
* https://juliaacademy.com/courses
    * 公式のチュートリアルたち
## 本
* https://www.coronasha.co.jp/np/isbn/9784339029055/
    * コロナ社による「1から始めるJuliaプログラミング」
        * これ１冊でなんとなく把握できる
        * 題名どおり、1から理解できるので学び始めるのにぴったし
* https://www.oreilly.co.jp/books/9784873118895/
    * オライリー社による「Juliaプログラミングクックブック――言語仕様からデータ分析、機械学習、数値計算まで」
        * 書かれていることがとても幅広く、読んでるだけでも面白い
        * 1冊目としては向かないかも...?
[^1]: 型が固定されていること
[^2]: O'REILLY社発刊のJuliaプログラミングクックブックより引用
VercelのサイトにVercel以外のDNSで管理しているドメインのサブドメインを設定する

レッドインパルスのたかけんです。
REDIMPULZ Advent Calendar 2020 の3日目のエントリーです。

## はじめに

昨日のアドベントカレンダーで、「[TypeScript導入済みのミニマムなNext.jsのテンプレートを作った](https://qiita.com/takaken/items/8ffbb3b11db1de2b3cb2)」という記事を作成した際に、
サンプルページを公開を公開しようと思ってVercelでデプロイしたのですが、
Vercel以外のDNSで管理しているドメインのサブドメインを設定するのに若干手こずったので、注意点をまとめようと思います。

## VercelのDNS機能

VercelにはDNSの機能があり、Vercelで購入したドメインや、他のレジストラで購入したドメインもネームサーバーにVercelを設定すれば、Vercel上でドメインの管理が可能になります。

しかし、DNSは別のサービス（AWSのRoute 53など）を使っていて、VercelのDNSを使わずにサイトにサブドメインを割り当てる場合の手順は、あまり情報が無いので設定に手間取ってしまいました。

## 完成形

https://nextjs-typescript-starter.redimpulz.com/

![screen-2020-12-02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71453/e0a6a7a5-4489-3021-b2b9-8b2424d28ed3.jpeg)

## 設定例 : `sample.redimpulz.com` というサブドメインをサイトに設定する場合

以下のようなCNAMEレコードを、使用しているDNSに登録します。

```
Type CNAME
Name sample
Value cname.vercel-dns.com
```

その後、Vercelの管理画面から、`Project Settings > Domains` を選択し、`sample.redimpulz.com` を追加します。
名前解決ができれば、Vercel上で証明書の発行が行われて、完了するとアクセスできるようになります。

なおレコードが反映されるまで、しばらく時間がかかります。（およそ30分くらい）

## あとがき

VercelのサイトにVercel以外のDNSで管理しているドメインのサブドメインを設定する方法でした。
同じような境遇の人には、参考になる情報になれば幸いです👍
BootstrapでValueつきDropdown

##例
### HTML
```html
<div class="dropdown">
        <button class="btn btn-secondary dropdown-toggle" id="gender" type="button" data-toggle="dropdown">
            性別
        </button>
        <div class="dropdown-menu">
            <button class="dropdown-item" value="male">男性</button>
            <button class="dropdown-item" value="female">女性</button>
        </div>
</div>
```
### Javascript
```javascript
$(function () {
    $('.dropdown-menu .dropdown-item').click(function () {
        var visibleItem = $('.dropdown-toggle', $(this).closest('.dropdown'));
        visibleItem.text($(this).text());
        visibleItem.attr('value', $(this).attr('value'))
    });
});
```

項目はdropdown-menu以下に追加してください。

選択項目をJavascriptで取得する場合は
上の例だと

```javascript
$("#gender").attr('value')//value
$("#gender").text()//text
```

で取得できます。
# 参考
[Bootstrap4ドロップダウンで選択した項目をボタンに表示したい！](https://mseeeen.msen.jp/bootstrap-4-dropdown-list/)
VLOOKUPの上位互換【INDEX & MATCH】

お客様とのデータのやりとりでExcelファイルを使用することがありますが
データを加工する際にVLOOKUPが使用できない場面が多々あります。
VLOOKUPの代わりにINDEXとMATCH関数の組み合わせが便利なので紹介します。

## ◆VLOOKUP関数は検索範囲の左側に検索値がないと検索できない

##### シートA（商品一覧）
| A   | B    | C     | 
| :-: | :--: | :---: | 
| 商品名 | 単価 | 商品コード | 
| りんご| 120 | A001  | 
| みかん| 80 |  A002 | 
| もも |  150 |  A003 |

##### シートB（出荷一覧）
| A   | B    | C     |  D    | 
| :-: | :--: | :---: | :---:  | 
| 出荷先 | 商品コード| 個数 |  売上金額  | 
| 〇〇商店  | A003 | 300|     | 
| △△商店  | A002 | 500 |     | 
| ◇◇商店  | A003 |  200|     | 

### ◆シートBのD列に売上金額を計上するには？
シートBのB列（商品コード）を検索値として
シートAのB列（単価）を参照したいところですが
検索値である商品コードは検索範囲の一番右側に表示されています。
この場合VLOOKUP関数では検索することができません。

|   因数  |  = VLOOKUP（検索値,範囲,列番号,検索型）      | 
| -----: | :--------------------------------------------------------------------------- | 
| 検索値 | 検索する値を指定。全角と半角の区別はされるが、大文字と小文字の区別はされない | 
| 範囲   | 検索したいセル範囲                                                           | 
| 列番号 | 範囲の先頭の列から数えた列数を指定                                           | 
| 列番号 | 範囲の先頭の列から数えた列数を指定                                           | 


### ◆代わりに使えるのがINDEXとMATCHの関数の組み合わせ

INDEXとMATCHの組み合わせであればVLOOKUP関数ではできなかった
左端に検索値がない範囲からの検索が可能になります。
実際に求める値の範囲と、検索する値の範囲を絶対参照にしておくことを忘れないでください。


|   因数  |  =INDEX（配列,行番号,列番号）      | 
| -----: | :--------------------------------------------------------------------------- | 
| 配列| 値を求めたい範囲を配列定数で指定 | 
| 行番号| 【配列】のなかで何行目に当たるかを指定   | 
| 列番号| 【配列】のなかで何列目に当たるかを指定 | 


|   因数  |  =MATCH（検査値, 検査範囲, 照合の種類）     | 
| -----: | :--------------------------------------------------------------------------- | 
| 配列| 検索する値を指定| 
| 行番号| 【検査値】を検索する範囲を指定   | 
| 列番号| 1または省略･･･【検査値】以下の最大値を検索。0･･･【検査値】に一致する値のみを検索。-1･･･【検査値】以上の最小値を検索  | 

```
=INDEX(シートA!$B$1:$B$3,MATCH($B3,シートA!$C$1:$C$3))
=INDEX(実際に求める値の範囲,MATCH(検索値,検索する値の範囲,0))
```
君たちはなぜ毎日勉強することができないのか


#なぜできないか
明日やろう（後回し）　
<b>→　明日もやらない

やらなきゃいけないことが膨大　
<b>→　目の前にあるやることを具体的に把握する

頭の中が整理できていない　
<b>→　必要なものを明確にして、一歩前へ進む

疲弊している　
<b>→　何もしなければ何もしない自分により疲弊してしまう

やっても何も変わらない　
<b>→　やらなければ後退する

退屈している　
<b>→　楽しむための努力は足りているだろうか


#今日の名言
One today is worth two tomorrow.
（今日という1日は、明日という日の2日分の価値がある）
-ベンジャミン・フランクリン
リレーション先の要素のレコードを取得する

<h3>リレーション先の取得</h3>

```Model.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;

class Work extends Model
{
    protected $fillable = ['name','title','description',];
    
    public function artist()
    {
        return $this->belongsTo(Artist::class);
    }

    //そのユーザーが所有するアーティスト達を取得し、アーティスト達の user_id を全て取り出す。
        public function work_artist_userid()
    { 
        $artists = $this->artist()->get();
        foreach ($artists as $artist){
        
        return $artist->user_id; 
        }
    }
}
```
  そのユーザーが所有するアーティスト達を取得し、アーティスト達の user_id を全て取り出す。
30代からのプログラミング勉強　8日目【HTML/CSS編】

昨日は少し逸れましたが再びHTML／CSSを学んでいきます。

##学習内容
###HTML/CSS
```HTML:セクション
<section class=""></section>
```
区分けをする為のタグ。classを付与して使う。

```CSS:インポート
@import url(ファイル名);
```
CSSファイルに記述すると別のCSSファイルを読み込む事が出来る。htmlに外部参照を複数書かなくてよくなる。

```CSS:フォントを普通にする
font-weight: nomal;
```
デフォルトが太字の見出し等の文字を普通にする。

```CSS:中央に揃える
text-align: center;
```

###CSSセレクター
特定の対象を選択する為の記述。特定のタグやクラスを指定する他にも○○の中にあるコレ、といった指定を行うことが可能。

##所感
新しい学びもありつつ復習もありつつなセクション内容。
この後は画像の表示やレスポンシブWebデザインについての講義となっていく様なので楽しみ。
37歳元ニートおじさんがデータサイエンティストになったお話

## アジェンダ
* [はじめに](#)
* [自己紹介](#自己紹介)
* [モチベーションを保つ方法](#モチベーションを保つ方法)
* [転職に役立ったこと](#転職に役立ったこと)
* [さいごに](#さいごに)
* [データサイエンティスト募集してます](#データサイエンティスト募集してます)


## はじめに
データサイエンスや機械学習という言葉がバズワードになって久しいですが、未経験からデータサイエンティストを目指されている方はまだまだ多い印象です。
実務未経験からデータサイエンティストに転職した人間が、その際にどんな事をやったかを書いていきます。



## 自己紹介
約8ヶ月前に実務未経験から受託でデータ分析を専門にやっている企業へ転職した人間です。
正直、私のレベルでデータサイエンティストを名乗るのはおこがましく感じますが、今の職場ではPh.D.持ちやら数学者やら最強エンジニアやら億万長者やらベネズエラ人やらに囲まれながらも、業務において一定の評価を頂けているためデータサイエンティストということで話を進めていきます。

いままでの経歴はこんな感じです。

< 経歴 >

* 美容師
* アパレル
* ニート
* フロントエンドエンジニア
* ニート
* データサイエンティスト(現在)


ニートを2回はさんでいるあたりに、ヤバさを感じて頂けるかと思います。
現在37歳ですが、フロントエンド開発の仕事に就いたのが34歳のときです。
それまではタッチタイピングもできませんでした。
OSってなに？？みたいなレベルです。

こんなヤツでもデータサイエンティストになれるんだ、と思って頂ければ幸いです。



## モチベーションを保つ方法
私は怠け者です。
せめてもの救いは、自分が怠け者であることを知っていることです。
勉強したいことは無限にあるので、あらゆる手段でおのれのケツに火をつけます。
例えばこんなこととか。

* 仕事を辞める
* 機械学習スクールの受講
* 勉強会の主催
* コミュニティ活動



### 仕事を辞める
転職することを決意してから、まずは仕事をやめました。
これで後戻りはできません。
非推奨ではありますが、挫折防止には効果的です。
がんばる or DIEです。

結果的に私は10ヶ月ほど無職をやりながら機械学習やらデータ分析やらの勉強をしました。
もし仕事を続けていたら、転職までにもっと時間がかかっていたかなとは思います。


### 機械学習スクールの受講
オフラインのスクールを受講しました。
1.5ヶ月ほどの期間で、何回か対面での授業を受ける感じのやつです。
10万円です。
今は書籍や動画教材など優秀なコンテンツがたくさんあるので独学でも勉強は可能だと思いますが、お金を払って対面で受講するということに意味があったと思います。
10万払ったんだから頑張ろうと思えれば勝ち。
ただ私の場合スクールを修了した段階では、まだまだ転職して通用するレベルではなかったので独学で勉強を続けることになります。


### 勉強会の主催
コロナが流行る前は、オフラインでKaggleの勉強会の運営などを行っていました。
過去コンペをみんなでわいわい議論したり、一人でもくもくと現行コンペをやったりしていました。
いろいろな方のお話しが伺えるのは、勉強にも、モチベーションにもなります。

今はオンラインで"もくもく会"を主催しています。
成果報告の時間をつくっているので、それが程よいプレッシャーになり作業がはかどります。
(土日や祝日などにゆるーくやってますので、もし気が向いたらご参加ください。)

https://daremoku.connpass.com/


主催をするハードルが高ければ、定期的にどこかの勉強会に参加するみたいなことでもモチベーション維持には良と思います。
connpassやtech playなどで探せばいろいろと見つかります。


### コミュニティ活動
データラーニングギルドというオンラインサロン型のコミュニティに参加しています。
データ分析や機械学習に関わる人、目指す人などがあつまるコミュニティです。

https://data-learning.com/guild

いろいろな企画がありコミュニティ内でチームを組んで取り組むこともあるので、特に私のような未経験の人間の学習環境としてはとてもありがたかったです。
ちなみに今の職場はコミュニティ内でご紹介頂いた会社です。
この記事はデータラーニングギルドのアドベントカレンダーなので宣伝しているわけではありません（あります）。


## 転職に役立ったこと
今の会社に入る際にスキルチェック試験がありました。
与えられた課題に対して分析レポートとコードを提出するというものでした。
これをパスできたのは以下の2つで勉強できたことが大きかったかなと思います。

### Kaggle
やはり実務未経験者にとってKaggleのようなコンペはとても勉強になりました。
与えられたデータから何かしらの予測結果を出すという一連のフローを学ぶには非常に有効だと思います。
モデル構築、前処理などはKaggleで勉強したところが大きいです。


### Slack分析
こちらはデータラーニングギルド内で企画されたコンペで行ったものです。
コミュニティ内で使われているSlackのログデータを分析しました。
Kaggleなどとは違い、「Slackデータを使って好きに分析してレポート作ってね」という自由度の高いものでした。
課題設定から考えるので実務のフローに近い経験をすることができました。
そもそも分析レポートというものを作ったことが無かったので、その経験も入社試験に役立ちました。
この記事はデータラーニングギルドのアドベントカレンダーなので宣伝しているわけではありません（あります）。

---

Kaggleなどのコンペ参加はデータサイエンスの勉強をする上でとても有効だと思いますし、最もポピュラーな方法のひとつだと思います。
私もKaggleに力を入れて勉強していたのですが、モデリングができるだけでは入社試験をパスできなかっただろうなとも思っています。
分析業務において重要な論理展開能力を訓練するためには、好きなデータを探してきて分析レポートを作ってみるというのも良い勉強法かと思います。




## さいごに
ニートのおじさんでもデータ分析の仕事に就けることがおわかり頂けたかと思います。
ただ相当量の勉強をしてきたとは思っていますし、今もやっています。
「誰でも簡単にデータサイエンティストになれますよ」などとは間違っても言えませんが、あなたがデータサイエンスに興味があり楽しいと感じるのであれば、経験や年齢なんぞは気にせず挑戦してみるのもいいのではないでしょうか？
もし、この記事を見てどこかの誰かの背中が1ミリでも押されれば幸いです。



## データサイエンティスト募集してます
現在、弊社ではデータ分析、機械学習人材を募集しています。
フルリモートなので、地方の方でも海外の方でもご応募可能です。
非常に成長できる環境で、非常に社員ファーストな会社なので個人的にはかなり居心地良く働けています。
もしご興味がある方は下記TwitterからDM下さい。
応募するかわからんけど話だけ聞いてみたいといったことでもお気軽に。

https://twitter.com/komiya_no_tweet
固定ツイートに会社の概要など書いてますので、もしよろしければ。
CentOSで定期（繰り返し）実行したいさー


#どんなことをやりたいのさー？
1日1回とか30分に1回とか定期的にファイルをバックアップしたいさー。

でもCentOSでそんなもん作ったことないから、まず手始めにひたすら繰り返すだけのやつを作ってみるさー。

**定期実行** を覚えればバックアップだけじゃなくて、死活監視とか更新通知とか…できることの幅が広がると思うんさー。


#どんな方法で定期実行？
**systemd** を自作します。

そして『いきなり本番！』じゃなくてDocker上のCentOS8で確認します。

ただし、Dockerのコンテナを作る時に一工夫しています。詳細は下記。
[Docker上のCentOSだと自作systemdが動かない時の対応方法](https://qiita.com/waokitsune/items/eb50a2e34342a92fcfb2)


#テキストファイルとそいつに書き込むシェルスクリプトを作成
まずテキストファイル新規作成。

```shell:コマンド
touch /syami.txt
```

続いてシェルスクリプト新規作成。

```shell:コマンド
touch /momo.sh
```

シェルスクリプトの中身はこう！
（テキストファイルに追記するだけの単純なやつ）

```shell:/momo.sh
#!/usr/bin/bash
echo `date` syamikogawaruinndayo >> /syami.txt
```

シェルスクリプトに実行権限与えてあげる。

```shell:コマンド
chmod 755 /momo.sh
```

#serviceを新規作成するさー
『/etc/systemd/system/』に下記ファイル新規作成。
（作ったシェルスクリプトをキックするやつ）

```service:/etc/systemd/system/momo.service
[Unit]
Description=mazokusabisu

[Service]
Type=simple
ExecStart=/momo.sh

[Install]
WantedBy=multi-user.target
```

#timerを新規作成するさー
『/etc/systemd/system/』に下記ファイル新規作成。
（作ったシェルスクリプトをキックするやつを定期実行するやつ）

```timer:/etc/systemd/system/momo.timer
[Unit]
Description=mazokutimer

[Timer]
Unit=momo.service
OnUnitActiveSec=1m

[Install]
WantedBy=multi-user.target
```

#定期実行開始するさー
```shell:コマンド
systemctl enable momo.service
systemctl enable momo.timer
systemctl start momo.timer
```

しばらく放置して/syami.txtを開いてみると…
うん、いい感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6b56cfd3-5c7d-076a-ee1c-d369fda98af8.png)


#蛇足
『毎日〇時に』とか『〇曜日の〇時に』って指定方法が実用的かなーって思います。



#参考サイトさん
https://qiita.com/narikei/items/ca4823c7f6790f0cbe0b
https://qiita.com/mogya/items/aaee50d41012d202f53c


#次の記事
[CentOSで日付・曜日・時間を指定して定期実行したいんだよなあ](https://qiita.com/waokitsune/items/146da8a11a77b9d4cf27)


#バージョン
Windows10 Pro バージョン1909 OSビルド19042.630
Docker Desktop:2.5.0.1（49550） Engine:19.03.13 Compose:1.27.4
CentOS Linux release 8.2.2004 (Core)
指先認識、OpenCVの輪郭、肌色のノート

Vision-Based Finger Action Recognition by Angle Detection and Contour Analysis
https://onlinelibrary.wiley.com/doi/pdf/10.4218/etrij.11.0110.0313

XNNPack can't be built natively on ARM Raspberry pi 4 by Bazel
https://github.com/google/mediapipe/issues/1346

https://www.ijitee.org/wp-content/uploads/papers/v9i1/A4489119119.pdf


https://www.instructables.com/Opencv-Python-Hand-Detection-and-Tracking/

https://nalinc.github.io/blog/2018/skin-detection-python-opencv/
https://arxiv.org/ftp/arxiv/papers/1708/1708.02694.pdf
skin color paper
https://www.cs.rutgers.edu/~elgammal/pub/skin.pdf

OpenCV 色空間
https://www.learnopencv.com/color-spaces-in-opencv-cpp-python/

Contours-detection
http://www.robindavid.fr/opencv-tutorial/chapter5-line-edge-and-contours-detection.html

https://docs.opencv.org/master/d4/d73/tutorial_py_contours_begin.html


opencv カメラの解像度
https://www.codingforentrepreneurs.com/blog/open-cv-python-change-video-resolution-or-scale


https://www.youtube.com/watch?v=5zgLtQh5_lk
ハンドモデルのまとめ
https://qiita.com/nonbiri15/items/6abaade346512fcb8c92


日本語のOpenCV
http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_contours/py_table_of_contents_contours/py_table_of_contents_contours.html

http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_morphological_ops/py_morphological_ops.html

輪郭
https://docs.opencv.org/master/d4/d73/tutorial_py_contours_begin.html

http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_contours/py_table_of_contents_contours/py_table_of_contents_contours.html#table-of-content-contours


https://stackoverflow.com/questions/44588279/find-and-draw-the-largest-contour-in-opencv-on-a-specific-color-python/44591580

肌の色について面白いペーパー
http://perso.usthb.dz/~slarabi/Papers/paperIVC2020.pdf
RS-WFIREX3とGoogleHomeを使って家をハッピースマートホームにしてみた

## この記事を読んでできること
・google homeに「ok,google.エアコンつけて/消して」と声をかければ,家電を操作できるようになる
・スマートフォンを使って家の内外からでもエアコン等を付けられる

## 用意するもの
*  [RS-WFIREX3](http://www.ratocsystems.com/products/subpage/wfirex3.html) 
*  Google home
*  スマートフォン
*  Wi-Fi ルータ(2.4GHz帯が利用できるもの)
*  赤外線で動く家電
*  家

## 背景
過去記事より     [【[IFTTT]Google Homeから声でツイートできるようにする](https://qiita.com/shuthimaru/items/703309dc27780a5b32f9)】

google homeを買ってから約1年、朝のニュースとキッチンタイマー以外に使わなくなってしまった。（それでも十分役に立っているのだけれど）
やはりハンズフリーでできることは素晴らしく、電気やエアコンの操作とかもっと色々なことができればなぁと思っていた矢先、「スマートリモコン」なるものの噂を聞いた。なんでもスマートスピーカーと連動して赤外線の家電が動かせるらしいのだ。早速試さなくては。

## スマートリモコンについて
スマートリモコンの仕組み自体はスマートフォンから飛ばした命令をWi-Fiを経由で受け、赤外線を飛ばすことのできる機器のようだ。機器にもよるが、基本的な家電の赤外線はある程度網羅しているらしく、またその家電のリモコンさえあれば赤外線を手動で覚えさせることができるため、リモコンの集約も可能になる。一連の命令をマクロで実行したりもできるようなので複数の家電を同時に操作することもできるようだ。

1点だけ注意したいのが、いずれのスマートリモコンもWiFiの2.4GHz帯を利用すること。5GHzだけしか使えないルータはないとは思うが、マンション等インターネットが元々ついているタイプの住居に住んでいる人は注意してほしい。5GHzは対応していない。


##  スマートリモコン「RS-WFIREX3」の選定
スマートリモコンの種類はいくつかあるが、動作が安定しているように思えるラトックスシステム社の [RS-WFIREX3](http://www.ratocsystems.com/products/subpage/wfirex3.html) を選んだ。


## RS-WFIREX3の初期設定
マニュアル参照。
### 手順
①スマートフォンでアプリをダウンロードする
②スマートフォンからWiFi接続⇒RS-WFIREX3を探して接続
③連携ができたらRS-WFIREX3にWiFiを覚えさせる

※詰まったところ
WiFiのSSIDをRS-WFIREX3が拾ってくれなかった。手動登録でうまくできた。簡単登録より手入力でやった方が確実かもしれない。

こうしてスマートフォンとRS-WFIREX3が連携できた。

## 家電操作
次にスマートフォンから家電を操作できるようにする。対象と結果は下記。

・エアコン⇒登録済みのものを使用。電源のオンオフができたらokなので良し。
・テレビ⇒しっくりくるのがなかったのですべて手打ちで登録
・照明⇒しっくりくるのがなかったので全て手打ちで登録
・サブモニタ⇒登録済みのものを使用。

### 手順
①家電の型番をアプリで検索する
②型番に近いもので操作してみる、満足が行く操作ができたら次へ
③満足が行く操作ができないならば片っ端から試す
④どれもうまくいかなければ手動で登録する(ボタンが少なければこちらのほうが楽）
⑤①～⑤の繰り返し
⑥終わり

これでスマートフォンから各家電の操作ができるようになった。

#### 余談
iPhoneやandroidのウィジット機能を使えばアプリをいちいち開かなくてもすぐに操作ができる。便利なので登録しておいて損はない。

### Google homeとRS-WFIREX3を連携させる
①アプリから家外での利用ができるようにする
②スマートスピーカーとの連携を行う

※詰まったところ
設定し始めた当初、なぜか家外の設定ができなかった。次の日に設定してみるとなぜかできた。本当にわからない。

これでGoogle homeに話しかけるだけで家電の操作ができるようになった。また、地味に出先からエアコンの電源を入れることができるのも利点だ。

## 最後に
話すだけで家電の操作ができるのはなかなか近未来感があっていい。実際リモコンを探す⇒ボタンを押すという操作を一言で済ますことができるのは便利だ。一連の命令をマクロで実行したりもできるようなので「OK google,いってきます」というだけですべての家電の電源をオフにするというマクロも作ってみたいと思う。

使用感としてはRS-WFIREX3を置く位置が悪いのか、エアコンは確実に応答してくれるが、電灯はなかなか点いたり消えたりしてくれなかったりする。
（google homeは反応してくれている）
3回同じことを繰り返して言うのはちょっと面倒でスマートフォンから操作したりもする。今後のアップデートを祈るばかりだ。
Djangoプロジェクトのファイル構成をみてみた

#はじめに
今回は、Python/Djangoでwebアプリを作成する際に、
事前に作成するプロジェクト/アプリケーションフォルダ内の
各ファイル・フォルダ構成について、それぞれの役割を簡潔に確認します。

##フォルダ構成
以下が作成したプロジェクトフォルダの構成です。
![スクリーンショット 2020-12-02 22.31.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692063/8e4b7755-a326-bca8-c694-9835a716624d.png)


##各フォルダ・ファイルについて

###django仮想環境フォルダ(一番上の階層)
`db.sqlite3`
データベースに使われるデフォルトのsqliteでここに記録される

`mamage.py`
開発用サーバの起動やデータベースの更新


###プロジェクトフォルダ
上記の例の場合「test_project」

`__pycache__`
Pythonで使われるコンパイルされたpycファイル群が保管される

`__init__.py__`
パッケージを読み込んだ際の初期化用ファイル

`urls.py`
読み込んだurlごとに適した処理を行う

`wsgi.py`
Djangoをwebサーバー上で動作させる際の仕様を満たすためのファイル

`settings.py`
Djangoプロジェクト全体の設定を定義するファイル
※`INSTALLD_APPS`に関して、Djangoアプリケーションを読み込ませる箇所。今後作成するアプリケーションもここに記載していきます。不用意に消さないように注意します。
####補足
DjangoでWebアプリ作成を行う際について、
1.[Djangoプロジェクトを作成する](https://qiita.com/kosments/items/663baa3e7955f54438b9)

```
$ django-admin startproject test_project(フォルダ名)
```
2.必要な数だけ、Djangoアプリケーションを作成する

```
$ python3.8 manage.py startapp test_app(フォルダ名)」
```
3.プロジェクト側で読み込んでいく

###アプリケーションフォルダ
アプリケーションを追加生成した後のフォルダ構成です。
![スクリーンショット 2020-12-02 23.29.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692063/3adb55bb-a75b-d707-0247-a7d15918fb23.png)


`migrations`
データベースの設定に関するファイルが保管される

`admin.py`
管理画面の設定を定義する

`apps.py`
Djangoアプリケーションの設定に定義する

`models.py`
データベースの編集に関連するmodelを定義する

`tests.py`
テストに関連する処理を定義する

`views.py`
実際に呼び出される処理を定義する

#まとめ
今回は、djangoプロジェクトのファイル構成について、
簡潔に役割を確認しました。

そのほかのファイルやwebアプリ作成過程で、
新規に作成/編集していくファイルについても
随時、役割を確認していきたいと思います。

ありがとうございました。
SSHの公開鍵を楽に設定する方法

この記事は，2020 UEC Advent calendarの12/03の記事になります．

ほぼリモートで演習等を行っているようなので，大学の教育用サーバにSSHで接続して演習用のコードを実行することが多くなっていると思います．
何も設定をしていない状態では，SSH接続時に毎回パスワード入力を求められてしまい非常に面倒くさいことになります．
そのため，鍵認証方式の設定を進められることが多いですが，多く見られる解説ではsftpなどで公開鍵ファイルを送り，それをサーバの$HOME/.ssh/authorized_keys にコピーし，権限を適切に設定するというもので初心者にはあまり優しくありません．

そこで，簡単に公開鍵をサーバにコピーするコマンドを紹介します。　

```
# 基本こっち
ssh-copy-id -i ${path to public key} ${USER}@${target_host}

# 次のコマンドは，ssh-copy-id コマンドが存在しなかった場合に使用する．
cat ${path to public key} | ssh ${USER}@${target_host} "mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys"
```

上記コマンドの，`${path to public key}` は，ローカルコンピュータの公開鍵へのパス，`${USER}@${target_host}`の部分は，普段SSH接続時に接続先にしている文字列に置き換えてください．
もし，$HOME/.ssh/config に設定を書いていて `ssh server` のように指定している場合は，server を指定します．

このコマンドを使用すると，指定した公開鍵を適切な場所に追加書き込みされます．
手動で公開鍵のコピー作業を行うと，過去に設定したほかのPCの公開鍵を削除してしまうという事故が起こってしまう場合がありますが
上記コマンドを使用すると人間が介在する部分がほぼないため事故が起こりにくいです．

もし，詳しく正確な解説が欲しい場合は，manページを確認してください．
【個人アプリ作成】情報管理アプリ制作4日目

Toshiです！ ああ、、、、２日間も取り組みをできていなかった。。。
<br>リスタートせねばですね。がんばります。

#今日やったこと

>・メイン画面のイメージ、イメージを検索、デザイン<br>・タグ付機能の勉強<br>・タグ検索機能の勉強<br>・タグメンション機能の勉強

<br>それでは書いていきます。自分のインプットをアウトプット。


#メイン画面のデザインについて

初日ではログイン画面と新規登録画面と機能を実装しました。画面のイメージはあれからは少し離れてもいいのかなと考えています。<br>学校のメンバーがデザインに関してすごくいい情報共有をしてくれて参考に載せます。

・【初心者必見】Bootstrapのテンプレートの使い方を解説 ＜Bootstrap>
https://blog.codecamp.jp/bootstrap-template-howto

・おすすめのChrome拡張機能「Wappalyzer」を紹介！色んなサービスのプログラミング言語やフレームワークが丸わかり！ ＜しまぶーのIT大学さん＞
https://youtu.be/q92r_WrQjoY

・【HTML/CSSレイアウト番外編】コーディングに便利なChrome拡張機能を作りました【ヤフー出身エンジニアの初心者向けプログラミング講座】 ＜しまぶーのIT大学さん＞
https://youtu.be/CXrW5rqP-WY

<br>
特にBootstrapはおしゃれなデザインを簡単に使えるので、今日検索を始めました！（Start Bootstrapより）
![スクリーンショット 2020-12-02 22.48.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759485/3ccf528f-983d-ec68-a54b-419f79f7ba93.png)

まずは慣れる段階で、この後トップページの作成に取り掛かっていこうと思います。


# タグ付機能について

通うスクールの完了した創作アプリの追加要件で実装にチャンレンジしてみました。初回だけだと理解度は５０％がいいところ。。。。
Ajaxはやっぱり初回だけではなかなか理解できない。痛感しました。実装を積み重ねていくことで身につくと思いますので、とりあえず自分が理解できた初回分のアウトプットをしようと思います。

>**①アソシエーションとデータベース設計の重要性**

このQiitaがそうであるように、ある投稿に対して複数のタグが紐付き、また共通のタグが別の投稿に紐づく。
![f85c8033511d87c181821a3b6d7bc186.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759485/dd8a5735-b6dc-0571-1d96-c5222c696ad0.png)

Tweetとタグの関係性なら多対多になります。これを紐づけるために、中間テーブル（図だとtweet_tag_relations）を用意しないといけないという具合です。

これに加えて例えば保存をかけるときは同時にtweets,tagsテーブルに保存をかけるために、Formオブジェクトの考え方を利用して同時に複数のテーブルに保存処理をかける必要があります。
中間テーブルとFormオブジェクトを両方採用する際には、中間テーブルにFormオブジェクトのレコードを作成します。


>**②タグの一意制約への対応**

タグ保存時にすでにDBにあるタグは新たに保存できないようになっています。<br>ここで「first_or_initialize」を用います。whereで検索した条件のレコードがあればそのレコードのインスタンスを返し、なければ新しくインスタンスを作るメソッドです。

```
def save
    tweet = Tweet.create(message: message)
    tag = Tag.where(name: name).first_or_initialize
    tag.save
end
```

>**③逐次検索機能の実装（インクリメンタルサーチ）**

実装コードは長くなってしまうので、別の記事でまとめるようにしようと思いますが、Ajaxを用いた非同期通信で検索欄に入れた値を「XMLHttpRequestオブジェクト」でリクエスト、openメソッドで定義した引数によってrubyのコントローラーで設定した、検索キーワードを取得し、json形式でJS側に返送、onloadで取得といった具合にAjaxで実装できそうです。

#まとめ

少し雑っぽくまとめてしまいましたが、Ajaxは繰り返し実装することで慣れてきそうだということが掴めました！
明日はもう少し具体的なアウトプット、記事にまとめられるようにしたいと思います。
【React】ファイルアップロード機能を実装する【TypeScript】

## 概要
React×TypeScriptで、フォーム画面から画像などのファイルをPOSTする方法をご紹介します。
React×TypeScriptの組み合わせでの記事があまりなかったので書きます。

本当はカスタムフックやserviceファイルを作ってコンポーネント内にロジックを書かないようにしているのですが、今回は便宜上、コンポーネントファイル内で完結させております。

## 前提条件
TypeScript 3.7.2
React 16.12.0

## 実装したコード

まずはフォームから。
必要な部分のみ抜粋してます。

```FormComponent.jsx
<div>
  <form>
　  <label htmlFor="img">画像</label>
　  <input id="img" type="file" accept="image/*,.png,.jpg,.jpeg,.gif" onChange={getImage}>
　  <input type="button" value="保存" onClick={submitImage} >
  </form>
</div>
```

画像が選択されると、onChangeイベントが発火し、getImageメソッドを、
保存ボタンがクリックされるとsubmitImageメソッドを実行するようにします。
メソッドの処理の詳細は以下。

```FormComponent.tsx
const [image, setImage] = useState<File>()

const getImage = (e: React.ChangeEvent<HTMLInputElement>) => {
        if(!e.target.files) return
        const img: File = e.target.files[0]
        setImage(img)
}

const submitImage = () => {
 const header = { headers: {
  'Content-Type': 'application/json;charset=UTF-8',
  "Access-Control-Allow-Origin": "*",
   }}
  const data = new FormData()
  data.append('file', image)
  const postImageUri = '任意のURL'
  axios.post(postImageUri, data, header)
  .then(res => {
    //任意の処理
  }).catch(err => {
    //任意の処理
  })
}
```

ちなみにgetImageの引数**e**に設定している型は、VSCodeでeにカーソルを合わせると出てくるウィンドウに表示されている型をそのまま使ってます。
2行目で、画像が選択されていない場合は、何もせずreturnさせてます。
選択されている場合は、e.target.files[0]で画像を取得して、setImage(img)でstateの値を更新しております。
submit時は、stateの値をaxiosでpostするようにしてます。
パラメータにはFormDataインターフェイスを使用し、appendで要素を追加するようにしております
（なのでファイル以外もあればappendで追加すれば良いかと思います）


## まとめ
VueからReactに移行したがVueの方が書きやすかったな〜というのが今の心情です。
また詰まる箇所があれば随時アウトプットしていきます。
【Vue.js】Firebase Hostingを使ったデプロイまでの流れ【Nuxt.js】

# 事前準備

**Vue.js、Nuxt.jsアプリケーションのデプロイを想定しています。**

・firebaseプロジェクト
・Googleアカウント
・node、npm環境
・Vue.jsまたはNuxt.jsアプリケーション



#Firebase-CLIのインストール

Firebaseを操作するためにFirebase-CLIをインストールします。

```:ターミナル
$ npm install -g firebase-tools
```

バージョンが表示されればインストール完了です。

```:ターミナル
$ firebase --version
8.16.2
```

#Googleアカウントと紐付け
```:ターミナル
$ firebase login
```



```:ターミナル
Allow Firebase to collect CLI usage and error reporting information? (Y/n)
```

**Y**と入力しEnter
ブラウザが立ち上がる
***

自身のGoogleアカウントを選択しましょう
![スクリーンショット 2020-12-02 21.16.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635852/0cbd239f-2a5c-1ac3-e8ac-d10f0ef61eef.png)
***

許可を選択

![スクリーンショット 2020-12-02 21.17.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635852/b6c3037e-8683-eedd-261b-466d81d58d73.png)
***
この画面が表示されれば完了です
![スクリーンショット 2020-12-02 21.17.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635852/ed0aa5f2-9405-a047-9c12-695e81e0ac10.png)


# Firebaseプロジェクトの初期化

Hostingの設定を行います。

アプリケーション配下で以下のコマンドを実行。

```:ターミナル
アプリ名$ firebase init
```
**Hosting**を選択しEnter
![スクリーンショット 2020-12-02 21.57.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635852/d9fd7a94-dc56-4886-d41f-e3634fc10fae.png)
***
**Use an existing project**を選択し、自身のFirebaseプロジェクトを選択してください。
![スクリーンショット 2020-12-02 21.58.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635852/4ccefa82-2909-b199-4245-68ca50756a30.png)
***



```:ターミナル
=== Hosting Setup

Your public directory is the folder (relative to your project directory) that
will contain Hosting assets to be uploaded with firebase deploy. If you
have a build process for your assets, use your build's output directory.

? What do you want to use as your public directory? dist
? Configure as a single-page app (rewrite all urls to /index.html)? Yes
? Set up automatic builds and deploys with GitHub? (y/N) No

```
**以下の順に入力**
・**dist**
・**y**　(SPAの場合)
・**N**
***
この様な表示になればOKです。
![スクリーンショット 2020-12-02 22.15.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635852/6edff5c4-0768-a838-12b6-faa4431e4916.png)

アプリケーションに以下のファイルが作成されています。

・**.firebaserc**
・**firebase.json**

# アプリケーションのビルド

アプリケーション配下で以下のコマンドを実行。

```:ターミナル
アプリ名$ npm run build    
```
これにより**dest**ディレクトリ配下にコンパイルされたファイルが作成されます。

# デプロイ

```:ターミナル
アプリ名$ firebase deploy  
```


`Deploy complete!`と表示されればOKです。

`Hosting URL`にアクセスするとアプリが公開されています。

```:ターミナル
✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/********
Hosting URL: https://***************.web.app
```

#デプロイの停止

```:ターミナル
アプリ名$ firebase hosting:disable 
```

```:ターミナル
? Are you sure you want to disable Firebase Hosting for the site deploy-test-6110f
This will immediately make your site inaccessible! (Y/n) Y
```

**Y**でアプリが閉じます。
Vagrant up でエラーが出た(macOSをBig Surにアップデートしたとき)

##はじめに

macOS Big Surにアップデートした時に、`vagrant up`をしたときにエラー対処法を書きたいと思います。備忘録です。

>**使用した環境**

+ macOS Big Sur (11.0.2)
+ Homebrew 2.6.0
+ Vagrant　2.2.14
+ virtualBox　6.1.16

```
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["hostonlyif", "create"]

Stderr: 0%...
Progress state: NS_ERROR_FAILURE
VBoxManage: error: Failed to create the host-only adapter
VBoxManage: error: VBoxNetAdpCtl: Error while adding new interface: failed to open /dev/vboxnetctl: No such file or directory
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component HostNetworkInterfaceWrap, interface IHostNetworkInterface
VBoxManage: error: Context: "RTEXITCODE handleCreate(HandlerArg *)" at line 95 of file VBoxManageHostonly.cpp

```

最近, macOSをBig Surにアップデートしたのですが、アプリがうまく起動しないなどありましたが、vagrantがうまく動かない原因はmacOSをアップデートしたからでした。


## VagrantとVirtualBoxを最新版にする

```
①まずはアンインストールをします
brew cask uninstall virtualbox
brew cask uninstall vagrant

②次にインストールをします。
brew cask install virtualbox
brew cask install vagrant
```

でアップデートしましたがまたも
同じエラーが出てしまいます。

ここでなかなか進まず他の人書いたブログやqiitaを参考に、HostやHomestead.yamlをいじっていましたがうまくいかず、

この方が書いてくださった記事を参考に解決できました！！

[【macOSアップデート】vagrant upできない時に一通り試すと良いかもしれない方法] [1]
[1]:https://qiita.com/akane_kato/items/c103332729e3d0ac39e6

ここの記事の
「VirtualBoxのカーネルエクステンションをロードし、Oracleのソフトウェアの実行許可を出す」のところを参考にしてpcを再起動をして
`vagrant up`で上手くいきました。

##最後に
`vagrant ssh`で接続してログインすることができました。
なかなかうまくいかなくてHomestaedで作っていたアプリを削除しなくても解決できました。
macOSをアップデートしたときは、ぜひ参考にしてみてください！！

##参考サイト
[【macOSアップデート】vagrant upできない時に一通り試すと良いかもしれない方法] [1]

[1]:https://qiita.com/akane_kato/items/c103332729e3d0ac39e6
NavigationBar,StatusBarの背景色と文字(アイコン)色の変更

#出来上がり
StatusBarとNavigationBarの背景をDarkGrayに、文字色を白にする

![スクリーンショット 2020-12-02 23.38.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918084/38102f8e-914c-492f-97f9-a67b9b39d454.png)


###1. Navigation Barのタイトル設定と背景色・文字色の変更

```swift
  override func viewDidLoad() {
    super.viewDidLoad()
    //NavigationBarのタイトルを設定
    navigationItem.title = "Title"

    //NavigationBarの背景色を設定
    navigationController?.navigationBar.barTintColor = .darkGray

    //NabigationBarのタイトルの文字色を設定
    navigationController?.navigationBar.titleTextAttributes = [.foregroundColor:UIColor.white]
  }
```

###2. Status Barの文字色とアイコンの色変更

 - info.plistに「View controller-based status bar appearance」の項目を追加
 
　　※Valueは”NO”のまま

![スクリーンショット 2020-12-02 22.49.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918084/bacb7f8b-be58-b2c5-31eb-58fdb8a55149.png)
※プラスを押して出たリストから選択（下の方）
　
　

 - Deployment Info(TARGETSのGeneral)の「Status Bar Style」を"Light Content"に変更

![スクリーンショット 2020-12-02 21.57.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918084/a3b3fc63-f398-ed99-bb4c-7ed8b009a594.png)

以上でStatusBarの文字色が白になるはず

[環境]
Xcode 12.2
JIRAでGitHub Enterpriseを連携する際の設定値の具体例

# 概要

GitHub EnterpriseとJIRAの連携の設定で、JIRA側の設定でちょっと苦労したので、メモとして公開しておく。
基本的な設定はネットに結構あるのだが、設定項目の具体的な値の例がなくて困ったので記載しておく。
Enterpriseの場合、アプリではなく、DVSC accountsで連携設定をする。その際に指定する項目の例が以下になる。

# JIRA設定例

設定 > 製品 > 統合 > DVCSアカウント > GitHub エンタープライズアカウントをリンク

## 新しい GitHub エンタープライズアカウントを追加

### Team or User account

項目がTeamとか書いてるのに、これはGitHubのOrganizationを指定するらしい
``` ex) xxx-organization```

### Host URL

GitHub EnterpriseのサイトURLとか説明が書いてあるのに、指定するのは普通にGitHubのURL
```ex) https://github.com/```

### Client ID / Client Secret

これはGitHub側で指定した内容で、特に嵌る事はなかった。 

### Auto Link New Repositories / Enable Smart Commits

これは任意なので、ご都合に合わせて。特に困らなければ、そのままの方が。

# 最後に

以上、本当に簡単ですが、誰かの参考になれば幸いです。
Dockerの一括削除コマンド





###停止コンテナ、タグ無しイメージ、未使用ボリューム、未使用ネットワークを一括削除

```
docker system prune
```

###停止コンテナを一括削除

```
docker container prune
```

###未使用イメージを一括削除

```
docker image prune
```

###未使用ボリュームを一括削除

```
docker volume prune
```

###未使用ネットワークを一括削除

```
docker network prune
```

参考
https://qiita.com/boiyama/items/9972601ffc240553e1f3
【Windows】 GitHub Desktop をインストール後にgit commandでpushするまでの手順


GitHub DesktopでGitHubにpushしていたのですが、
コマンドベースでもできた方がいいかなぁと思い、
GitHub Desktopでインストール済みの**gitにパスを通し**て、
gitコマンドで**「git push origin ブランチ名」**までを行いました。
その時の備忘録です。

## gitのインストール場所(GitHub Desktopのみインストール時)
`C:\Users\【ユーザ名】\AppData\Local\GitHubDesktop\app-2.6.0\resources\app\git\cmd`

## パスを通していない状態

```
> git status
'git' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

## パスを通す
Windowsスタート＞windowsシステムツール＞コントロールパネル＞システムとセキュリティ＞システム＞
システムの詳細設定＞環境変数＞Path>編集>新規
`C:\Users\【ユーザ名】\AppData\Local\GitHubDesktop\app-2.6.0\resources\app\git\cmd`
を登録

###参考（パスを通す）
[Windows10でTempやPathなどの環境変数を設定する方法][1]
[1]:https://proengineer.internous.co.jp/content/columnfeature/5205

## パスを通した状態
```
> cd 【リポジトリ】
> git status
On branch 【ブランチ名】
Your branch is up to date with 'origin/【ブランチ名】'.

nothing to commit, working tree clean
```

リポジトリ内で何かを修正保存

```
> cd 【リポジトリ】
> git status
On branch 【ブランチ名】
Your branch is up to date with 'origin/【ブランチ名】'.

Changes not staged for commit:

> git add .
> git commit -m "git command test"
[main 061726f] git command test
 39 files changed, 1477 insertions(+)
略
```

##ブランチ名確認
```
> git branch
error: cannot spawn less: No such file or directory
* 【ブランチ名】

> git push origin 【ブランチ名】
fatal: could not read Username for 'https://github.com': No such file or directory
```

## SSH接続設定
```
> cd C:\Users\【ユーザ名】\.ssh
> ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\【ユーザ名】/.ssh/id_rsa): github_id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

> clip < C:\Users\【ユーザ名】\.ssh\github_id_rsa.pub
```

GitHub>Settings>SSH and GPG keys>New SSH key から登録
`clip < C:\Users\【ユーザ名】\.ssh\github_id_rsa.pub`でコピーしたものをペースト

`C:\Users\【ユーザ名】`下にある（なければ作る？←未検証）`.gitconfig`に以下を追加する


```~/.gitconfig
[url "github:"]
    InsteadOf = https://github.com/
    InsteadOf = git@github.com:
```

```
> cd 【リポジトリ】
> git push origin 【ブランチ名】
```

成功！！

## 参考
[GitHubにssh接続する初心者さん][3]
[3]:https://qiita.com/aki4000/items/4c81bc2747bbd5e96d85
[GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~][2]
[2]:https://qiita.com/shizuma/items/2b2f873a0034839e47ce

## 覚えておきたいgitコマンド一覧
$ git status 【覚えた】
$ git log 【覚えた】
$ git add . 【覚えた】
$ git commit -m "コミットメッセージ" 【覚えた】
$ git checkout ブランチ名 
$ git checkout -b ブラント名 
$ git push origin リモートブランチ名 【覚えた】
$ git stash 
$ git stash apply 
$ git pull origin リモートブランチ名 
$ git rebase ブランチ名
Laravelでよく使うコマンド集

##プロジェクト作成

```Ruby:Laravel6のプロジェクト作成
$ composer create-project --prefer-dist laravel/laravel="6.*" sample_app
```

##Controller作成

```Ruby:UserController作成
$ php artisan make:controller UserController
```

##Model作成

```Ruby:Userモデル作成
$ php artisan make:model User 
```

##サーバー起動

```Ruby:サーバー起動
$ php artisan serve
```

##マイグレート

```Ruby:マイグレート
$ php artisan migrate
```

##DBデーブル作成

```Ruby:Userテーブル作成
$ php artisan make:migration create_users_table
```

##コンソール起動

```Ruby:tinker
$ php artisan tinker
```

##DBを全削除する

```Ruby:DB全消し
$ php artisan migrate:refresh
```
コントローラーに記述するセキュリティの記述

#はじめに
　コントローラーに記述する最低限のセキュリティについて、忘れないように記録しておく。

##Basic認証
```ruby:app/controllers/application_controller.rb
before_action :basic_auth

private
def basic_auth
  authenticate_or_request_with_http_basic do |username, password|
    username == 'ユーザー名' && password == 'password'
  end
end
```

##直接URLを入力されてもリダイレクトさせる

```ruby
before_action :authenticate_user! #←ログイン状態でないときはサインインページに遷移
before_action :move_to_index
private
def move_to_index
  @item = Item.find(params[:item_id])
  redirect_to root_path if user_signed_in? && current_user.id == @item.user_id
end
```