OmniAICreator/Qiita-1.07M huggingface dataset:
【AzureAD】条件付きアクセスでExchangeonlineのトークンの期限を制御する

AzureADとADFSを利用した環境で
O365を利用しているところは多いと思います。

ただO365のリフレッシュトークン機能により
ADFSのクレームルールで　社外はメールを利用できないようにアクセス制御
していても、制御されない場合があります。

Exchange onlineへアクセスと想定したときの
アクセスの動きを説明しながら理由をお伝えします。

1：Exchangeonlineへアクセス


2：アクセスチケット（規定1時間）を持っていたらそのままExchangeonlineへアクセス
もっていなければAzureADへアクセスチケットの発行依頼


３：ここで本来はAzureADの認証画面が表示されて、ログイン画面でUPNを入力
対象ドメインがADFSとフェデレーションしているドメインであればADFS認証されます。

しかしAzureADではアクセストークンの他にデフォルトで90日間有効のリフレッシュトークンが発行されています。
このリフレッシュトークンをユーザが持っていると、認証せずにユーザーへサービスへのアクセスチケットが渡されます。この場合、ADFS認証は起きず、AzureADだけで認証が完結します。
これがADFS認証されない理由です。


ADFSクレームルールでアクセス元のグローバルIP等で、社内か社外かを
制御している環境の場合、ADFSまでアクセスがされないので
まったく効果がなくなってしまいます。
（一度認証通ったら、外でも使えてしまう）

これはセキュリティにリスクがあるので、対処方法を
下記します。

AzureADの条件付きアクセスを利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/88f0d126-8ffe-b22b-2cd9-08050fb473cc.png)

ユーザーとグループを指定します。ここではテストユーザを指定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/87cece8d-142d-1498-9d7a-c8d25b09e4ee.png)


アプリケーションはExchange　onlineを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/701e1dbd-4543-f794-bab6-696febe5c876.png)

条件を指定します。携帯はもともと外からアクセスすることを想定しているパターンが
多いので、ここでは対象から外しました。
ここではWindowsPCを対象としました。"Windows"にチェックを入れます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/1785f6f8-d3ad-0504-f03e-dd356e999965.png)

場所を選択します。対象をすべてとし、対象外を自社用としました。
社内のGIP一覧を作成しておけば、社内からのアクセスは、サインイン頻度の対象にさせないことも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/7d33d5bc-b52f-cf65-5713-71da56a68970.png)

サインイン頻度を1時間で設定しました。
これで社外にPCを持っていけば、1時間後認証要求されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/29ca4e87-846e-311f-5dde-a2c2ade9108d.png)

認証要求されると、この後、ADFSまで落ちるのでクレームルールの制御が
可能になります。


AzureADだけの環境であれば、外に持ち出すPCをintuneに登録し、アクセス制御できると思いますが、ADFSでアクセス制御している環境もまだ多いと思いましたので
記載致しました。
参考になれば幸いです。
Vue CLIで新規プロジェクトを作成する

環境は以下で作成

- node
    - 14.15.0
- vue cli
    - 4.5.8

## 事前準備
`docker-compose.yaml` と `Dockerfile` を準備

```docker-compose.yaml
version: '3'
services:

  sample-front:
    build: <path-to-dockerfile>
    container_name: sample-front
    tty: true
    volumes:
    - ./../sample-front/:/app
    ports:
      - "8080:8080"
```

### Dockerfile

```
FROM node:14.15.0-alpine3.12

ENV VUE_CLI_VERSION 4.5.8

RUN yarn global add @vue/cli@${VUE_CLI_VERSION}

WORKDIR /app
```

## コンテナ立ち上げ
```
⛄ docker-compose up
```

## 確認
```
⛄ docker ps
```

## コンテナに入る
```
⛄ docker exec -it sample-front ash
```

## インストールしたもののversion確認(スキップ可)
```
/app # node -v
v14.15.0
/app # vue --version
@vue/cli 4.5.8
```

## プロジェクト作成
今回はカレントディレクトリに作成

```
vue create .
```

カレントに作らない場合は、以下のコマンドを使用

```
vue create <app-name>
```

設定は好みがあると思うのでお好きなように

```
Vue CLI v4.5.8
? Generate project in current directory? (Y/n) -> Y

? Please pick a preset: (Use arrow keys)
  Default ([Vue 2] babel, eslint)
❯ Default (Vue 3 Preview) ([Vue 3] babel, eslint)
  Manually select features

? Pick the package manager to use when installing dependencies: (Use arrow keys)
❯ Use Yarn
  Use NPM
```

今回自分はVue 3とYarnを選択

```
🎉  Successfully created project app.
👉  Get started with the following commands:
 $ yarn serve
```

docker-composeに以下の部分を足して、サーバーが立ち上がるか確認してみる

```
command: >
  ash -c "yarn install &&
  yarn serve"
```

## 立ち上げ
```
⛄ docker-compose up
sample-front    |   App running at:
sample-front    |   - Local:   http://localhost:8080/
```

ブラウザで以下のURLを叩いて確認してみると...

```
http://localhost:8080/
```

以下の画像のような画面になっていたらOK!
![スクリーンショット 2020-11-16 23.11.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168995/93773082-6031-e5e7-ea39-228cb803695d.png)
【Flutter】ContainerのプロパティcolorとBoxDecorationのプロパティcolorは共存させてはいけない

## 背景
下記のコードで、Containerのプロパティ**decoration**を使って、角丸にしようとした。

``` dart
  @override
  Widget build(BuildContext context) {
    return Container(
      color: Color(0xFF333333),
      decoration: BoxDecoration(
        borderRadius: BorderRadius.all(Radius.circular(4.0)),
        color: Color.white,
        border: Border.all(color: Colors.black),
      ),
    );
  }
```

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

## エラー

```
════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
Cannot provide both a color and a decoration
To provide both, use "decoration: BoxDecoration(color: color)".
'package:flutter/src/widgets/container.dart':
Failed assertion: line 285 pos 15: 'color == null || decoration == null'
The relevant error-causing widget was: 

════════════════════════════════════════════════════════════════════════════════════════════════════
Reloaded 5 of 690 libraries in 1,640ms.

════════ Exception caught by rendering library ═════════════════════════════════════════════════════
A RenderFlex overflowed by 99555 pixels on the bottom.
The relevant error-causing widget was: 
  Column file:~~~~
════════════════════════════════════════════════════════════════════════════════════════════════════

```
エラー分によると、Containerのプロパティ**color**と、BoxDecorationの**color**は共存してはいけないと行く事らしい。
という事で、BoxDecorationのcolorの方を残した。

``` dart
  @override
  Widget build(BuildContext context) {
    return Container(
      decoration: BoxDecoration(
        borderRadius: BorderRadius.all(Radius.circular(4.0)),
        color: Color(0xFF333333),
        border: Border.all(color: Colors.black),
      ),
    );
  }
```

これでエラーが解消された。
Linux非対応なtp-linkの無線LAN子機を使う方法

tp-linkの無線LAN子機(以降無線LANと呼びます)を購入したのですが、Linuxに対応していないようなので、有志の方が作成したドライバをインストールする方法を紹介します。
###1.GitHubで公開されてるドライバをダウンロードする
[RTL8812AU/21AU Wireless drivers](https://github.com/aircrack-ng/rtl8812au)
このドライバをダウンロードするので、はじめにターミナルからGitとdkmsをインストールします。
はじめに、Gitをインストール
```sudo apt install git-all```
その次にdkmsをインストール
```sudo apt install dkms```
これでドライバをダウンロードする準備が整いました。
Githubからドライバをダウンロードします。
```git clone https://github.com/aircrack-ng/rtl8812au.git```
これを実行するとダウンロードが始まるのでしばらく待ってください。
ダウンロードが終わったら```rtl8812au```というディレクトリが作成され、そこにダウンロードされているのでそのまま
```cd rtl8812au```
を実行します。
そして移動したディレクトリでdkms_installを実行するとインストールが完了します。
```sudo make dkms_install```
認識されない場合は刺し直したり再起動したら認識されると思います。
ではまた。
SQLを実行してデータベースを作成、編集する

ターミナル上からSQLを実行し、データベースを作成、編集、削除する方法を学習したため、
アウトプットします。

#データベースに接続する
まずデータベースに接続します。
接続するには

```
sudo service mysqld start
//今回はmysqlというデータベース管理を使っています
```

そして

```
mysql -u root
```

でmysqlへの接続は完了です。
ちなみに「mysql -u root」はmysqlにrootで接続するという意味
※mysqlにおいてrootとは、あらかじめ用意されているユーザーで全ての操作が可能な権限を持っている。

ここからはデータベースの
1．　確認
2．　作成
3．　選択
4．　テーブルの作成
5．　テーブルの構造の確認
6．　テーブルにカラムを追加
7．　テーブルのカラムを修正
8．　テーブルのカラムを削除

を記載します。

#1．　確認
これによって、現在どのようなデータベースが存在するかを確かめられる

```
SHOW DATABASES;
```

#２．　作成
これによって、SQLにデータベースを作成できる

```
CREATE DATABASE データベース名;
```

#3．　選択
これによってデータベースを選択することができる。
データベースを作った後、作業をする場合（編集、削除等）必ずデータベースを選択しなくてはいけない

```
USE データベース名;
```

４以降はデータベースの中にあるテーブルの操作です

#４．　テーブルの作成
これによって、選択したデータベースの中にテーブルを作ることができる

```
CREATE TABLE; テーブル名（カラム名　カラムの型）
//複数同時に作ることも,をつけると可能
```

ちなみにSQLで使う型は主に2つで
INT →　保存できる値が数字　（railsでいうinteger）
VARCHAR(X) →最大X文字の文字列　（railsでいうstring）

#5．　テーブルの構造の確認
４．によってテーブルを作成しても、しっかりできたか不安です。
そこでこれを使うと、テーブルの構造を確認することができます。

```
SHOW columns FROM テーブル名;
```

#6． 7． 8．　テーブルにカラムを追加、修正、削除する
実はこれらは全て「ALTER TABLE」を使う。

カラムを追加する場合

```
ALTER TABLE テーブル名 ADD　カラム名 カラムの形;
```


カラムを修正する場合

```
ALTER TABLE テーブル名 CHANGE 古いカラム名 新しいカラム名 新しいカラムの型:
```

カラムを削除する場合

```
ALTER TABLE テーブル名 DROP カラム名;
```
テストコードについて


###テストコードとは
アプリケーション内に記述する、そのアプリケーションの挙動を確認するためのコードのことです。

手動で確認をする場合は1つずつ自分の手で確認しなければいけませんがテストコードを書いておけばコマンド一つで確認をすることができる。

##テストコードの必要性について
こちらの記事でとても大事なことを伝えていると思います。
僕自身もとても参考になりましたのでこちらの記事をどうぞ。
[テストコードを書く理由](https://qiita.com/halkt/items/930097f76f5d82f9079b)

###テストコードの書くべきパターン
**正常形**
「ユーザーが開発者の意図する操作を行った時の挙動」を確認するテストコードが、正常系に分類されます。
**異常形**
「ユーザーが開発者の意図しない操作を行った時の挙動」を確認するテストコードが、異常系に分類されます。たとえば、必須項目を入力せずに送信した際は、「必須項目を入力してください」とアラート画面などがでることがあります。この挙動を確認することは異常系に分類されます。

その他にも準正常系など、さまざまな分類があるみたいです。

###テストコードの種類
テストコードの種類は、大きく2つあります。1つ目が、実装した機能を部分的に意図通りに動作するか確認する単体テストです。2つ目が、ユーザーがその機能を使う際、一連の動作が問題なく行われるかを確認する結合テストです。

**単体テストコード**
モデルやコントローラーなどの機能ごとに問題がないか確かめます。

**結合テストコード**
ユーザーがブラウザで操作する一連の流れを再現して、問題がないか確かめます。
Go クラス 基本

最近go言語を使い始めて、なんとなく書けるようになったのでそろそろクラスみたいな書き方をやっていこうと思い、ここに記しておきます！
とりあえず書いてあとで細かく説明していきます。

```go:main.go
package main

import "fmt"

type Human struct {
	Age  int
	Name string
}

func (h Human) getName() string {
	return h.Name
}

func (h *Human) Birthday(newAge int) {
	h.Age = newAge
}

func main() {
	v := Human{Age: 3, Name: "mike"} // インスタンス作成
	fmt.Println(v.getName())
	v.Birthday(24)
}
```

##クラス定義
```go
type Human struct {
	Age  int
	Name string
}
```
クラス定義はstructという構造体という概念を使用し定義します。構造体はフィールドをプロパティを持つことができます。


##メソッド定義
```go
func (h Human) getName() string {
	return h.Name
}

func (h *Human) Birthday(newAge int) {
	h.Age = newAge
}
```
クラスに紐ずくメソッドは上記のように定義します。
func (変数名 クラス名) 関数名 リターンする値　{
    処理
}
となります。goは関数の中でプロパティの値を変更させる場合にはクラス名の横に*を付けます。これはインスタンス変数のアドレスを指しています。アドレス変数の中身を変更することで実際の値を変更することができます。対してプロパティの中身を変更しない場合は*は使用しなくて良いです。

##インスタンス作成
```go
func main() {
	v := Human{Age: 3, Name: "mike"} // インスタンス作成
	fmt.Println(v.getName())
	v.Birthday(24)
}
```
インスタンス作成は
変数名 := クラス名{プロパティ名: 値, .....}
となります。

簡単ですがここまでにします。
SIerにいる人間がWeb技術の基礎の基礎から学ぶお話

<h2>はじめまして</h2>
初投稿です。
よろしくお願いいたします。

<h2>自己紹介</h2>
簡単に現在の自分についてです。

* 新卒未経験で入社4年目
* 中規模のSIerにて受託開発を行う
* 1〜3年目はC言語で組み込み開発を行う
* 4年目の途中から配置が変わりフロントエンド開発を行うようになる

<h2>きっかけ</h2>
フロントエンド開発を行うようになり、はじめてJavaScriptやNode.jsに触るようになりました。
それでも普段の業務ではあらかじめ客先で用意されたツールやアプリを使用し、
ビルドを行うコマンドも現場で提示されたものを使っている状態ですので、
受け身のインプットだけでは開発周辺の知識が身につかないという危機感を抱きました。
ですので、自分が書籍で学んだことなどをアウトプットしていこうと思い投稿をはじめました。

<h2>用語の理解</h2>
さて、まずはこれができないとお話になりません。
とりあえず覚えた用語を整理してリストアップしていくところからはじめようと思います。
これらの用語は、IT企業に関わる人はもちろんのこと、会社内でネットワークの関係の業務をされている人なら
おそらく「あいうえお」レベルで、本当に初歩レベルの単語かなと個人的には思います。

* Web:クモの巣が語源。
* WWW:World Wide Web。直訳すると世界規模に広がるクモの巣。インターネットの世界規模のクモの巣。
* プロトコル:規約。これが合わないとWebブラウザはデータのやり取りができないし、Webサーバは通信ができない。
* Webブラウザ：普段見てる画面。具体的にはChromeとかFirefoxとか。
* クライアント：サービスを要求するもの
* サーバ：サービスを提供するもの。クライアントの要求に答えてデータを渡したりする。箱のイメージ。
* MACアドレス：個別のPCを識別するのに使う。
* IPアドレス：個別のPCがどのネットワークのどの住所にあるのかを識別するのに使う。
* サブネットマスク：IPアドレスをネットワークアドレス(1)とホストアドレス(0)に分ける。IPアドレスの後ろについてる/(数字)はサブネットマスクであり数字は1の数を示している。

<h3>使用している書籍</h3>
きたみりゅうじ先生のキタミ式IT塾 応用情報技術者の本や
NRIネットコム株式会社の「イラスト図解式この一冊で全部わかるWeb技術の基本」を読んでます。
とにかく用語を覚えないと話にならないと知人に言われましたので、ここをしっかりやっていきます。

ここまでお読みいただいた方、ありがとうございます。
これからも学んだことをアウトプットしていきます。
よろしくお願いいたします。
最近のエラーまとめ

#最近発生したエラーの振り返り
簡単な内容のエラーではあるが、記事にしてアウトプットする。

【この記事の目的】

✅どんなエラーがあったのか記録の意味をこめて記載
✅アウトプットを継続する力をつける
✅簡単な内容から文章にし、記事を書くことに慣れる


##1.SQL が開けないエラー
SQLの実行コードを行ったが開けなかった。

```
docker-compose app mysql -h db -u book_log -D book_log -p
```

上記のようにコードを記述して実行した所

```
No such command: app
```

docker-compose と　app の間の　exec　が抜けてしまっていた凡ミス。
今後コードを良く見返して実行するように注意する。

##２．SQLへのデータ登録エラー
SQL登録の際に以下のエラーが発生

```
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near
```

確認の結果、カンマの不要な箇所にカンマをしてしまっていたことが原因であった。


##3.変数に関するエラー

PHPでのアプリケーションの起動の際に以下のエラーが発生

```
Undefined variable: reviews in /var/www/html/book_log.php on line 145
```

関数の引数としていた変数が存在しない返送となっていた。
実際に存在する変数を記述することにより、エラー解消。

##４.foreach に関するエラー

PHPでのアプリケーションの起動の際に以下のエラーが発生

```
PHP Warning:  Invalid argument supplied for foreach() in /var/www/html/book_log.php on line 118
```

３のエラーとつながっている内容となり、
PHPからSQLデータを呼び出して、表示させる際のforeach文の中の変数が上記エラーと同じく存在しない変数で
あったためこのようなエラーが発生していた。

３のエラーと同じく、正しい変数を記述してエラー解消

##５．まとめ
プログラミング学習を続けることはインプットしたことをアウトプットし、
そのアウトプットで発生したエラーを解消することの繰り返しである。
１つエラーが発生したら自分のスキルが一つ上がることを信じて、一つずつ解消して
スキルアップを続けていきたい。

今は人に読んでもらうというよりは自分の為に書いている内容となっており、
拙い文章であるが、アウトプットを継続することでより洗練された文章にしていく。
今後も可能な限り週１回程度のペースでQittaへ何らかのアウトプットを続けていく予定。
子どもの勉強監督botをLINEで実装してみた

#自己紹介
大学時代C言語を学んでから十数年以来のプログラミングを始めています。
本業はweb制作で、ホームページとLINE連携の需要がとても多く、LINEbotに興味を持ちました。
今回も練習した事のメモです。

#やったこと
子どもが勉強中にあまりにもふらふらするので、
1.obnizを机に設置
2.子供との距離を測る
3.一定距離以上離れたら遊んでいるとみなし
　ーLINEでお知らせを受け取る
　ーLEDを光らせる

#obnizで使用した部品
超音波測距センサー
フルカラーLED WS2811

#obnizの超音波距離センサーで一定期間は離れるとLEDが光る
という部分の動作確認です。

```javascript

const obniz = new Obniz('obnizID');
```

obnizIDを書き換えます。

```javascript

const Obniz = require('obniz');
const obniz = new Obniz('obnizID');

obniz.onconnect = async() => {
    // 超音波測距センサを利用
    const hcsr04 = obniz.wired('HC-SR04', { gnd: 11, echo: 10, trigger: 9, vcc: 8 });

    // LEDを利用
    const rgbled = obniz.wired('WS2811', { gnd: 0, vcc: 1, din: 2 });

    // obnizディスプレイ（初期表示）
    obniz.display.clear();
    obniz.display.print('obniz Ready');

    // setIntervalで定期実行
    setInterval(async() => {
        // 距離を取得
        let distance = await hcsr04.measureWait();
        // 小数点以下がたくさんあるのでここでは整数に
        distance = Math.floor(distance);
        // 距離をコンソールに表示
        console.log(distance + ' mm');
        // 距離をobnizディスプレイに表示
        obniz.display.clear();
        obniz.display.print(distance + ' mm');
        // 距離によって判定
        if (distance > 500.0) {
            // 500mm = 50cm 以上の場合 obnizディスプレイ表示
            obniz.display.clear();
            obniz.display.print('Too distance');
            // LEDオン
            rgbled.rgbs([
                [0xFF, 0x00, 0x00], // red
                [0x00, 0x00, 0xFF] // blue
            ])
        } else {
            // 500mm未満の時は色が反転
            rgbled.rgbs([
                [0x00, 0x00, 0xFF],
                [0xFF, 0x00, 0x00]
            ])
        }
    }, 5000); // 5000ミリ秒 = 5秒ごとに実行
};
```

#LINEbotと接続
ここがなかなかうまくいかず、苦労しました。

エラーが結構出まして。
どこまで動いているのか切り分ける為、細かくコードの中に

```javascript

console.log('Hello2!');
```

を入れていきました。
そうする事で、Hello2!が表示されたかされていないのかで、どこの記述が怪しいのか判別する事が出来ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/15871007-e597-0071-f5c8-893975ce86b1.png)

時間かかりましたが、ようやくエラー表示が消え距離が出力されるようになりました。
そして、ngrokを実行して、LINE botのwebhookへ入力すると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/d4c89d01-f8e7-e5ad-f76a-609b5ec87559.png)

今回は、子どもとobnizの距離を測り500mm以内離れた時にだけ、LINEに通知が送られるようにしました。

#まとめ
今回は超音波測距センサーってなんか凄いな！と思い、超音波測距センサー×LINEを実装したのですが
最初に超音波距離センサーを知った時の概念で、一定期間距離が近づいたらアクションを起こすという発想でいたのですが、距離が離れた時にアクションを起こすというのも面白いなと思いました。

フラフラする子供が近くからいなくなったらLINEで通知するとか。
距離×LINEで実生活に役立つbotを作れそうだなとおもいました。
PowerDNSにつまずいたポイントまとめ(1) ～DNSレコードが引けない～

#はじめに
BINDの脆弱性からの脱出という話から始まり、
DNSレコードの編集がWebUIで簡単にできる環境があるらしいということから
PowerDNSを触ってみることになりました。
実際に動かすまでにいろいろと躓いては立ち上がり...
といった具合だったので、備忘録を兼ねてつまずいたポイントを
まとめていきたいと思います。

# 動作環境
 * CentOS 8.2
 * MySQL 8.0.x
 * PowerDNS Authoritative Server - version 4.4.X

# DNSレコードが引けなかった原因
インストール、初期設定、レコードの登録を一通り行っていましたが、
digコマンドでDNSレコードが引けませんでした。

MySQL8から認証プラグインが新しくなったことが原因でした。

 * 新) caching_sha2_password
 * 旧) mysql_native_password

 SHA-256を使用したより安全なパスワードの暗号化を提供すると共に、
キャッシュを使用して同一ユーザの認証処理を高速化しようというものだそうです。

新→旧認証プラグインに変更することでDNSレコードが引けるようになりました。

※PowerDNS以外のツールで使用するときにも注意しておくべき点かもしれません。

以下に簡単にMySQLの設定ファイルの記載を含め、PowerDNSのインストール手順を記載します。

# PowerDNSのインストール
1. PowerDNSのインストールコマンドは以下からコピーして実行する

```
yum install epel-release &&
dnf install -y 'dnf-command(config-manager)' &&
dnf config-manager --set-enabled PowerTools &&
curl -o /etc/yum.repos.d/powerdns-auth-44.repo 
https://repo.powerdns.com/repo-files/centos-auth-44.repo &&
yum install pdns
```
(https://repo.powerdns.com/ から抜粋)

2．PowerDNSのバックエンドパッケージをインストールする

```
yum install pdns-backend-mysql
```

# MySQL8.xのインストール

```
dnf localinstall https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm
```

# my.cnfファイルに認証プラグインを指定する

```
[mysqld] 
default_authentication_plugin=mysql_native_password
```

※MySQL上で以下のコマンドを実行して認証プラグインを変更することも可能です。

```
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pass';
Query OK, 0 rows affected (0.01 sec)
```
Bootstrapデザインコントロール／初心者用（メモ）

Bootstrapの初心者用メモ

#Formの基本
[Bootstrap Form おさらい -Qiita](https://qiita.com/zaburo/items/8983993d173c51cb3827)

>・レイアウトにより（inline, horizontal）、マークアップが異なる。
>・text系（input, textarea, select）と、その他のものは扱いが違う。
>・horizontal では form-group が row と同じ概念になる。（なので要素をcol-xで分割）

>・text系はlabelと一緒に class="form-group" で囲む。
>・text系は class="form-control" を定義する。
>・checkbox, radiobutton, submit等は form-group では囲まない。（horizontalでは囲む）

#グリッドシステム
レイアウトを格子状に分解して配置するデザイン手法（Bootstrapでは横幅を12分割）
[Bootstrapのグリッドシステムについてまとめてみた -Qiita](https://qiita.com/akatsuki174/items/53b7367b04ed0b066bbf)

>・class = "container"（固定枠）または "container-fluid"（流動枠）の中に書く
>・class = "row" の中に書く
>・class = "col-{prefix}-{columns}" の形で書く
>・class = {columns}は合計が12になるようにする

#余白の指定（マージンとパディング）
マージン：外側（ボックス）の余白、パディング：内側（要素）の余白
[Bootstrapの基本「マージン」と「パディング」](https://design-studio-f.com/blog/bootstrap-utilities-spacing/)
[Bootstrapの余白を解説。マージンとパディングの違いとは？](https://www.fenet.jp/dotnet/column/tool/2033/)

>class = "p{sides}-{size}" でパディング
>class = "m{sides}-{size}" でマージン

#ボーダーライン
ボックス内の枠線を指定する際に使用するプロパティ
[Bootstrap4 Border(ボーダー)の使い方を徹底解説](https://webst8.com/blog/bootstrap4-border/)

#ボタンコントロール
[Bootstrap 4によるボタンの作り方。色やサイズなどの指定方法！](https://original-game.com/bootstrap4-how-to-use5/)
[Bootstrap 4 のボタンのサイズ、色をカスタマイズする方法](https://pera-lab.com/archives/2436)
総務省APIを使ってデータを取得する

# 総務省APIを使用してデータを取得

計量経済学のパネルデータを作成するためにPythonでデータをとってみました。(備忘録です)  

## 準備
Python実行環境
総務省APIの取得
[こちら](https://www.e-stat.go.jp/api/api-info/api-guide)からユーザ登録して取得できます。

##　コード

```python:def_TakeData
import requests,urllib
import pandas as pd
import numpy as np
import json
def get_json(base_url,params):
    params_str=urllib.parse.urlencode(params)
    url=base_url+params_str
    json=requests.get(url).json()
    return json

def take_data(dataid):
    appID="appIDを入れます"
    base_url="http://api.e-stat.go.jp/rest/2.1/app/json/getStatsData?"
    params={
        "appId":appID,
        "lang":"J",
        "statsDataId":dataid,
        "metaGetFlg":"Y",
        "cntGetFlg":"N",
        "sectionHeaderFlg":"1"
    }

    data=get_json(base_url,params)
    return data
```


```python:take
data=take_data(XXXXX)
```


json形式のデータが変換されます  
urlは
`http://api.e-stat.go.jp/rest/2.1/app/getStatsData?appId=&lang=J&statsDataId=(ここにデータIDを入れる)&metaGetFlg=Y&cntGetFlg=N&sectionHeaderFlg=1`
上記の形式です。
総務省サイトから簡単にAPIリクエストURLを参照できます。

# json->DataFrame

```python:例
df=pd.DataFrame(data['GET_STATS_DATA']['STATISTICAL_DATA']['DATA_INF']['VALUE'])
#jsonデータをpandasDataFrameに変換(例)
```

欲しいデータをDataFrameに格納します。  
  
  

    -`data['GET_STATS_DATA']['STATISTICAL_DATA']['CLASS_INF']['CLASS_OBJ']`
上記のコードでjsonにどのようなデータが入っているの確認できます。  
  
これで操作しやすいDataFrameになりました

## 最後に
TwitterAPIとかよりは使いやすかったのでもっと詳しくかけるように頑張ります



Python初学者ですので間違いあれば指摘お願いいたします
WindowsでRがすでに入っている場合にJupyterでRのカーネルを呼び出す設定


RでIRkernelをインストール．

```{r}
install.packages('IRkernel')
```

ターミナルでRを呼び出して（呼び出せない場合はPATHに"C:\Program Files\R\R-3.6.3\bin"を追加），以下を実行．ここはターミナルのRでないとできないらしい．

```{r}
IRkernel::installspec()
```

参考
- https://github.com/IRkernel/IRkernel
- https://nxdataka.netlify.app/rjup/
冗長になりがちなDispatchGroupを簡潔に使用する方法

Qiita初投稿。

Zhalenといいます。読み方は「ツァーレン」です。本名ではありません。

「さっさと結果だけ教えろ」という方は、下記の```Method```をコピペして```Usage```のように使って下さい。

#Traditional
DispatchGroupとは、複数の非同期処理を管理できるものです。

これを用いると、複数の非同期処理全てが終了したときに何かを実行するということができます。

その従来の使い方は、こんな感じです。

```swift

let dispatchGroup: DispatchGroup = DispatchGroup()
let dispatchQueue: DispatchQueue = DispatchQueue(label: "queue")

dispatchGroup.enter()
dispatchQueue.async(group: dispatchGroup) {
    //処理１
    dispatchGroup.leave()//処理１が終わったことを知らせる。
}

dispatchGroup.enter()
dispatchQueue.async(group: dispatchGroup) {
    //処理２
    dispatchGroup.leave()//処理２が終わったことを知らせる。
}

disptchGroup.notify(queue: dispatchQueue) {
    //全ての処理が終了した時にここを実行
}
```



SNSアプリなどを開発してAPI通信関連のゴタゴタをやっていると、どうしてもこれを何回も何回も書かなくてはいけなくなります。そのため、簡潔に書きたくなります。

理想は、こうです。

```swift
DispatchGroup([処理１, 処理２]) {
    //全ての処理が終わった時の処理
}
```

このように書くことができれば、分かりやすく、そして簡潔です。

以下のメソッドはそれを実現します。

#Method
```swift
//DispatchGroupAsync
func DispatchGroupAsync(label: String, attributes: DispatchQueue.Attributes?, handles: [(((() -> Void)?) -> Void)?], completion: (() -> Void)?) {
    let dispatchGroup: DispatchGroup = DispatchGroup()
    let dispatchQueue: DispatchQueue = (attributes == nil) ? DispatchQueue(label: label) : DispatchQueue(label: label, attributes: attributes!)
    
    handles.forEach { (handle) in
        dispatchGroup.enter()
        dispatchQueue.async(group: dispatchGroup) {
            handle? {
                dispatchGroup.leave()
            }
        }
    }
    
    dispatchGroup.notify(queue: dispatchQueue) {
        DispatchQueue.main.async {
            completion?()
        }
    }
}
```


ラベルとアトリビュートを付与する結果とはなりましたが、致し方ありません。そして、スレッドのズレを補正するため、一応最後でメインスレッドに戻しています。これは本質的ではありませんが実際、mainThreadで行わなければならない処理が多くそれらをいちいちDispatchQueue.main.asyncと書くのが面倒だったのでこうしました。

#Usage
```swift

DispatchGroupAsync(
    label: "queue",
    attributes: nil,
    handles: [モンスターボール当てる(_:), カチって音が鳴る(_:)],
    completion: {
        print("ポケモンゲットだぜ！")
    }
)
```
```swift
func モンスターボール当てる(_ completion: (() -> Void)?) {
   //dispatchGroup.leave() を置いていたところに completion?() を置く。
}
func カチって音が鳴る(_ completion: (() -> Void)?) {
   //dispatchGroup.leave() を置いていたところに completion?() を置く。
}
```

ちなみに、```attributes```を```.concurrent```にすると並列となり、処理１と処理２を同時に処理し始めます。上記のように```nil```だと直列となり、処理１が終わった後に処理２が始まります。

閲覧ありがとうございました。
order by句でcase式を利用し、任意の順でソートする

昇順、降順のソートならorder by asc descを用いれば実現できるが、任意の順でソートを行いたい場合、case式を使うことで実現できるようだ。

以下のようなデータを持つテーブルがある。

````sql
| tbl_key | x    | y    | z    |
+---------+------+------+------+
| A       |    1 |    2 |    3 |
| B       |    5 |    5 |    2 |
| C       |    4 |    7 |    1 |
| D       |    3 |    3 |    8 |
+---------+------+------+------+
````

結果順をtbl_keyのB-A-D-Cにしたい場合

````
SELECT
*
FROM Greatests
ORDER BY 
CASE tbl_key
WHEN 'B' THEN 1
WHEN 'A' THEN 2
WHEN 'D' THEN 3
WHEN 'C' THEN 4
ELSE NULL END;
````

````sql
-- 結果
+---------+------+------+------+
| tbl_key | x    | y    | z    |
+---------+------+------+------+
| B       |    5 |    5 |    2 |
| A       |    1 |    2 |    3 |
| D       |    3 |    3 |    8 |
| C       |    4 |    7 |    1 |
+---------+------+------+------+
````

こちらを参考にさせていただきました。
<a href="https://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6SQL%E5%BE%B9%E5%BA%95%E6%8C%87%E5%8D%97%E6%9B%B8-%E7%AC%AC2%E7%89%88-%E5%88%9D%E7%B4%9A%E8%80%85%E3%81%A7%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%9F%E3%81%8F%E3%81%AA%E3%81%84%E3%81%82%E3%81%AA%E3%81%9F%E3%81%B8-%E3%83%9F%E3%83%83%E3%82%AF-ebook/dp/B07GB4CNKP/ref=sr_1_1?adgrpid=48836428930&dchild=1&gclid=Cj0KCQiA48j9BRC-ARIsAMQu3WSrZJJd4-psCT9_qj0w4f0_fuN9b3Rh3DD8mwgP9UkTOLLapCJzwJwaAsG_EALw_wcB&hvadid=338547693256&hvdev=c&hvlocphy=1009306&hvnetw=g&hvqmt=e&hvrand=10462958271481352436&hvtargid=kwd-335112034228&hydadcr=4076_10899478&jp-ad-ap=0&keywords=%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6sql%E5%BE%B9%E5%BA%95%E6%8C%87%E5%8D%97%E6%9B%B8&qid=1605532234&sr=8-1&tag=googhydr-22">達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ
</a>
fishのプロンプトをOSで良い感じに切り替える

![osflavor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190000/88fa281c-0435-c502-7cb1-a63398be6edb.png)
# はじめに
ここ数年、[fish](https://fishshell.com/)を好んで使っています。zshのように色々設定しなくても、デフォルトで良い感じに設定されているところが良いです。

fishを使うOSは、各種Linux、macOS、最近だとWSL1/2など、色々な環境があると思いますが、シェルを使っていると、自分がどの環境にいるのかふと見失うことがあります(私だけ？)。sshなどリモートログインしていると尚更。

自分の場所を示す`user@hostname`のようなプロンプトもよく使われますが、文字列だと認識に時間がかかるので、できるだけ無意識に自分の環境を認識できるように**各種OS風**にプロンプトを切り替えるプラグインを作りました。

- [eholic/osflavor](https://github.com/eholic/osflavor)

# 使い方
パッケージ管理ツールの[fisher](https://github.com/jorgebucaran/fisher)を使います。

```bash
$ fisher install eholic/osflavor
```
インストール後は、`(__osflavor)`を`fish_prompt.fish`に書くだけです。

```fish
function fish_prompt
    # エラーステータスをプロンプト に反映させたい場合
    set -g __osflavor_last_status $status  # 関数の先頭に書くこと
    # いろんな設定
    echo -n -s (__osflavor) (__fish_git_prompt " %s") ' '
end
```

# 高度な設定
`osflavor`の各OSごとのプロンプトは、fishのグローバル変数`__osflavor_dist_<name>`で定義されており、`<name>`が`uname -a`に含まれているかどうかで、プロンプト切り替えています。デフォルト定義を変更したい場合や、`osflavor`未定義のOSのプロンプトを設定したい場合は、`config.fish`に`__osflavor_dist_<name>`を定義することで自由に設定できます。
詳細は、[eholic/osflavor](https://github.com/eholic/osflavor)を見てください。

# おわりに
初めてfishのプラグインを作りましたが、fishの関数やパッケージ管理ツールが良くできていて、思ったより気軽にコーディングできました。もっとfishユーザやプラグインが増えてきて、開発が活発になると良いなと思います。
pandas DataFrame で任意の値を含む行を削除　

#前提
データフレームのある列（ここではid列）について，特定の値が入っている行をすべて除去する必要がありました．行番号を取得したりいろいろ方法を検討しましたが，簡単に処理する方法があったのでメモしておきます．

#コード
```python
import pandas as pd
data = pd.read_csv("元データのパス") 

list = [1,2,3]   ###消去したい任意の値

for i in list:
   data = data[data['id'] != i]
```
たったのこれだけで済みました．
【アウトプット】データベースについて

データベースの振り返りをしたのでここでも書いていく

ターミナルでテーブルを作るとき
＄　rails g model Post content :text
Postはモデル名　contentはカラム名　textはデータ型
textは長い文字列という意味、つまりcontentに入るのはtext（長い文字）ということになる。
「こんにちは」とか

これをターミナルで実行するとmodelとmigrateに２つのファイルが入る
１．migrateには「2020..._create_posts.rb」というものが作られている

ファイルを開くとこんな感じなのがある
dif change
    create_table posts do |t|
t.text:content

t.timestamps

2つめはあることをしないと作成されない
rails db:migrate と書く。

以上
Ubuntu 20.04でSSL接続エラー（ssl.SSLError: [SSL: DH_KEY_TOO_SMALL]）が発生する際の対処法

Ubuntu 20.04でPythonのサードパーティAPIを用いてSSL通信しようとしたところ以下のエラーが発生。Ubuntu 20.04で起こるらしい。
>(Caused by SSLError(SSLError(1, '[SSL: DH_KEY_TOO_SMALL] dh key too small (_ssl.c:1123)')

下記のQAを参考に解決した方法をまとめます。
https://askubuntu.com/questions/1233186/ubuntu-20-04-how-to-set-lower-ssl-security-level

# このエラーが発生する背景
Debine系のOpenSSLのデフォルト設定がよりセキュアになったことが原因らしい。
セキュアになった背景はこれです。（英文です）
https://weakdh.org/

簡単に概要を訳すとSSLで使用する鍵交換のアルゴリズムに脆弱性が見つかったため。
脆弱性に該当するSSL通信をしようとするとDH_KEY_TOO_SMALLのエラーが発生する。

根本解決としてはサーバー側のセキュリティが改善されることだが、今回はサードパーティAPIを用いており不可能。
そのため暫定対処ではあるが、セキュリティレベルを変更する方法を採用した。

# openssl.cnfの編集してセキュリティレベルを変更
以下コマンドでopensslコンフィグファイルの配置ディレクトリを確認。
>% openssl version -d

ちなみに一般的には"/usr/lib/ssl"配下にある。

ファイル冒頭に以下の1行を追記して保存。
>openssl_conf = default_conf

次にファイル末尾に以下を追記する。
>[ default_conf ]
>
>ssl_conf = ssl_sect
>
>[ssl_sect]
>
>system_default = system_default_sect
>
>[system_default_sect]
>MinProtocol = TLSv1.2
>CipherString = DEFAULT:@SECLEVEL=1

これは何をしているかというとOpenSSLの暗号化のセキュリティレベルを下げている。
これだけでSSL通信できるようになるはず。

# openssl.cnfのローカル化
/usr/lib/ssl配下のコンフィグファイルを直接編集するとLinuxシステム全体に影響を与える。
影響を特定ユーザーでのログイン時等に局所化したい場合は以下を環境変数を.bashrcに追記する。

>export OPENSSL_CONF=/path/to/my/openssl.cnf
Goで関数の引数でnilを指定したときにハマった話


# 前置き

goのnilの話は n番煎じだと思いますが、ハマってしまった記念に記事を書きます..

実際のコードはもうちょっと長くてフレームワークの中だったりするので、原因の特定が大変でしたが、エッセンスだけ抜き出したものを書きます。

# このようなメソッドを作りました（失敗例）

ちなみに、テストコードで何度もHTTPRequestを投げるのでラッパー関数のつもりでした。

```go
func Request(method, url string, body *strings.Reader) error {
	request, err := http.NewRequest(method, url, body)
	if err != nil {
		return err
	}
	request.Header.Set("Content-Type", "application/x-www-form-urlencoded")

	client := new(http.Client)
	resp, _ := client.Do(request)
	defer resp.Body.Close()
	byteArray, _ := ioutil.ReadAll(resp.Body)
	fmt.Println(string(byteArray))
	return nil
}
```

このメソッドをこのように使うことを想定しています。

```go
	
func main() {

	values := url.Values{
		"hoge": []string{"fuga"},
	}

	err := Request("POST", "https://google.com", strings.NewReader(values.Encode()))
	if err != nil {
		log.Fatal(err)
	}

}

```


Requestの第3引数は、 ~~雑に~~ 特に何も考えずにstrings.NewReader の戻り型をそのまま指定しました。

# nilを指定する
さて、POSTで何もパラメータを送るものがないとき

```go

	err := Request("POST", "https://google.com", nil)
	if err != nil {
		log.Fatal(err)
	}
```


と指定するわけなのですが、これを実行すると

実行時エラーでクラッシュします。

```
strings.(*Reader).Len(...)
        /usr/local/Cellar/go/1.15.3/libexec/src/strings/reader.go:26
net/http.NewRequestWithContext(0x1314620, 0xc00001a0b0, 0x12baeec, 0x3, 0x12be7e1, 0x12, 0x13102c0, 0x0, 0x121018d, 0x0, ...)
        /usr/local/Cellar/go/1.15.3/libexec/src/net/http/request.go:889 +0x2a4
net/http.NewRequest(...)
        /usr/local/Cellar/go/1.15.3/libexec/src/net/http/request.go:813
main.Request(0x12baeec, 0x3, 0x12be7e1, 0x12, 0x0, 0x0, 0x0)
```


ちなみに、直接 http.NewRequest の第3引数にnilを指定したら大丈夫です。

```go
	req, err := http.NewRequest("POST", "https://google.com", nil)
	if err != nil {
		log.Fatal(err)
	}
```


# エラーの理由は?

IntelliJ IDEA でステップ実行していくとわかりますが、

https://github.com/golang/go/blob/f2eea4c1dc37886939c010daff89c03d5a3825be/src/net/http/request.go#L887

```go
if body != nil {

```

Go の nil は型がついているセマンティクスですので、 *strings.NewReaderの型を持ったまま 関数内部に入ってしまい、下のコード時で body自体はnilであるのに
body 中身自体の型は *strings.NewReader で、bodyの宣言は io.Readerですので 
nil判定的にはtrueになり （意図せず？） if の中に入ってしまいエラーになっているということになります。

参考: 
https://qiita.com/umisama/items/e215d49138e949d7f805

# 関数の引数でnilを指定すると、関数宣言の引数の型になる

```go
req, err := http.NewRequest("POST", "https://google.com", nil)
```

さてここで指定された nil ですが、 NewRequest の定義から
io.Reader の  nil になります。 (io.Reader が interface でも型とされます）

# どうすればよかったか

`func Request(method, url string, body *strings.Reader)`
の引数を
`func Request(method, url string, body io.Reader)`

としていればよかったので、テストで使い捨ての関数とはいえ、
関数の引数は、その呼び出す方の型ではなく、中で使っている関数の型に合わせるのが無難でした。



# 結論

http.NewRequest の第3引数で nilを指定するときは  io.Readerの型になるように指定する。

関数の引数は、なるべく中で呼ばれる型に寄せて宣言する。


nilはハマるとよく言われますが、実際にこういうハマりをしないと気づけないものだと思いました..
lazy_staticはもう古い。遅延初期化にはonce_cellを使おう

# 目に訴える[^1]

[^1]: コード例は[RFCのプルリク](https://github.com/rust-lang/rfcs/pull/2788#issue-329776074)からパクってきています。

`lazy_static`は**マクロ**を使っていますし、`BACKTRACE`の本当の型がわかりません。

```rust
use lazy_static::lazy_static;

// `BACKTRACE` implements `Deref<Target = Option<String>>` 
// and is initialized on the first access
lazy_static! {
    static ref BACKTRACE: Option<String> = std::env::var("RUST_BACKTRACE").ok();
}
```

`once_cell`は通常のRustの文法の範囲内ですし、`BACKTRACE`の型も明示的に書かれています。

```rust
use std::sync::Lazy;

// `BACKTRACE` implements `Deref<Target = Option<String>>` 
// and is initialized on the first access
static BACKTRACE: Lazy<Option<String>> = Lazy::new(|| {
    std::env::var("RUST_BACKTRACE").ok()
});
```

# 権威に訴える

Nightlyの標準ライブラリには既に遅延初期化に関する[API](https://doc.rust-lang.org/nightly/std/lazy/struct.Lazy.html)が入っていますがこれは[once_cell](https://crates.io/crates/once_cell)クレートからコピーされたものです。

https://github.com/matklad/rfcs/blob/std-lazy/text/0000-standard-lazy-types.md#reference-level-explanation

> The proposed API is directly copied from [`once_cell`](https://crates.io/crates/once_cell) crate.

# 作者が訴える

`once_cell`の作者が`lazy_static`に取って代わるものだと言っています。

https://github.com/rust-lang/rfcs/pull/2788#issue-329776074

> Add support for lazy initialized values to standard library, effectively superseding the popular `lazy_static` crate.

# 結論を訴える

`once_cell`を使いましょう。
予約システムの中で毎週、n週間に1度、nヶ月に1度といった定期的な予約が出来る処理を実装する

社内で使用するサービスの改修を行う中で
定期的な予約を行う仕様があるのですが
定期的な予約の期間も仕様で定められていて
その予約も毎週1回の指定しか出来なかったので
今回、n週間にn度、nヶ月に1度といった仕様を追加しました。
より良い処理があればコメント頂けると嬉しいです！

```php:function.php
// 月ごと開催のテンプレート
/*
 *return 'Y-m-d'
 */
function monthTemplate($end_date, $month_week, $week_count, $period) {
	$start = date("Y-m-d");
	$end = date('Y-m-d', strtotime($end_date . 'last day of this month'));
	$weekly = $month_week;
	$d_start = strtotime($start . " first day of 0 month");
	$d_end   = strtotime($end . " first day of 1 month");

	$target = [[$weekly, $week_count]];

	$list = [];
	$d = $d_start;
	$c = 0;
	while ($d < $d_end) {
		foreach ($target as $val) {
			$list[] = date("Y-m-d", strtotime(date("Y-m-d", $d) . sprintf("first %s of 0 month +%d week", $val[0], $val[1] - 1)));
		}
		$d = strtotime(date("Y-m-d", $d) . '+' . $period . 'month');
	}
	sort($list);
	$list = array_filter($list, function($x) use($start, $end) {
		return $x >= $start and  $x <= $end;
	});
	return $list;
}

// 週間ごと開催のテンプレート
function weekTemplate($end_date, $weekly, $period) {
	$start = date('Y-m-d');
	$target_week = date('w', strtotime($start));
	$target_sunday = date("Y-m-d", strtotime("-" . $target_week . "day", strtotime($start)));
	$start_monday = date('Y-m-d', strtotime('+ 1 week', strtotime($target_sunday)));
	$end  = $end_date;
	$d_end   = strtotime($end . 'last day of this month');
	$list = [];
	$d = strtotime($start_monday);
	while ($d < $d_end) {
		foreach ($weekly as $val) {
			$day = date('Y-m-d', strtotime('next ' . $val . date('Y-m-d', $d)));
			$list[] = $day;
		}
		$d = strtotime(date('Y-m-d', $d) . '+' . $period . 'week');
	}
	sort($list);
	$list = array_filter($list, function($x) use($start) {
		return $x >= $start;
	});
	return $list;
}
```

## つまづいた点

コードの中に文章がある？となって調べました。
公式→https://www.php.net/manual/ja/datetime.formats.relative.php
これ→**'last day of this month'**

```php
 $end = date('Y-m-d', strtotime($end_date . 'last day of this month'));
```

解釈として
last day of this month　→　月の最終日を指定
first day of 1 month　→　月の最初の日を指定
正直まだ雰囲気でしか理解していないのでもっと相対的な書式を使って覚えていきたい。

今回参考にした内容　→　https://teratail.com/questions/191105
こちらでは第n曜日と指定をして取得しているので
それを改修してみたのだが

```php
if(date("Y-m",$d)==substr($day,0,7)) $list[]=$day;
```

こちらの処理をいまいち理解しておらず
2週に一回の指定をした際に月を跨ぐと
第１週目の取得されるであろう日にちが取得できずにいて悩んだが
きちんとコードを読めば、また参考した内容の求めている内容を理解していれば
すぐに気付けただろう箇所
僕なりの解釈で言うと
毎月の第n曜日を指定するので毎月の終わりで締めないと
第n曜日がずれていってしまうので
このif文で条件をつけている


改めて気づいたこと
再改修したことがあれば更新します。
[Vue.js]v-bind

<h1>v-bindでGoogleへのlinkつくってみる</h1>
```javascript
js
data:{
//htmlに挿入するurlをdataの中に入れておく
  url:'https://www.google.com/?hl=ja'
```

```html
//これでGoogleへのリンクが貼られる
<a v-bind:href = "url">google</a>
```
<h1>Googleへのリンク以外にもクラスやidなどまとめて表示させたい場合</h1>

```javascript
js
data:
//まとめてgoogleオブジェクトをつくる
    google:{
        href:'https://www.google.com/?hl=ja',
        id:12,
        class:'goo'
    }
```
```html
html
<a v-bind = 'google'>google</a>
```
<p>href="https://www.google.com/?hl=ja" id="12" class="goo">google</p>

<p>検証画面で見ると上のようになっている(aタグが本当はある)</p>
<p>ちゃんとhref属性とidとclassがまとめてaタグの中に入ってます</p>
アソシエーション(１対多の関係)

# アソシエーション(１対多の関係)

##１．アソシエーションとは？
　簡単に表現すると「各モデル同士を関連付ける」ということである。つまり、テーブル同士で関連付けておき、**一方のモデルからもう一方のモデルにアクセスできる**ようにすることである。

例.　**１人のuserが複数のコメントを所有するパターン(１対多の関係）**
  ![aso0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875779/0266acdc-6c52-f18d-cf59-7bdf346b3206.png)
　→「**Aさん**」とAさんのコメントである「**おはよう**」、「**こんばんは**」を結びつける。
　→「**Bさん**」とBさんのコメントである「**こんにちは**」、「**さようなら**」を結びつける。
##２．has_manyメソッドとbelongs_toメソッド
では、どのようにアソシエーションをコードで再現するのか示してみる。
上記の**１人のuserが複数のコメントを所有するパターン(１対多の関係）**で考えてみる。
###(1) has_many
![aso01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875779/87da0d97-7806-4b0c-2c42-0b68aa3b3d32.png)

　　※上記の図は**Aさん**と**Aさんが所有するコメント**の関係であるが、Bさんも上記の図のように考える。

```ruby
#Userモデル  
class User < ApplicationRecord
 has_many :comments       #１人のuserが複数のcommentを所有するので複数形のcommentsになる。
end
```
###(2) belongs_to
![aso02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/875779/59833161-3520-62ee-bfd9-44819542917b.png)
　　※上記の図は**「おはよう」のコメント**が**Aさん**に所有されている関係であるが、その他のコメントも上記の図のように考える。

```ruby
#Commentモデル
class Comment < ApplicationRecord
 belongs_to :user      #１つcommentは1人のuserが所有するので単数形のuserになる。
end
```

##３．さいごに
　アソシエーションの１対多における基本的な考え方を説明しました。今後も、多対多の関係など少し応用的な投稿にも継続的にしていきたいと思います。また、。誤り等ご指摘ありましたらコメントお願いします！
##
CSSで画像を重ねる+中央に配置する方法のメモ


1.重ねたい画像（動画）のタグを囲む新しいdivタグ(sample-box)を追加する

```html
<div class="sample-box">
  <video id="myvideo" width="500" height="500" muted autoplay playsinline></video>
  <img class='scope' width="200" height="200"　src="https://iconlab.kentakomiya.com/wp/wp-content/uploads/2019/08/icon0140.png"/>
</div>
```

2.CSSに↓を追加

```CSS
.sample-box {
    position: relative;
}
.scope {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}
```

transform: translate(-50%, -50%);で画像の中央を支点に配置が可能

参考
[【css】要素をposition:absoluteで中央に配置する最新の方法(上下左右、上下、左右)]
(https://arts-factory.net/position/)
[【HTML・CSS】画像の上に画像や文字を重ねる方法]
(https://public-constructor.com/display-icon-on-image/)
SaaS / PaaS / IaaSとは

`SaaS(サース)` = `Softwre(ソフトウェア) as a Service`
`PaaS(パース)` = `Platform(プラットフォーム) as a Service`
`IaaS(アイアース)` = `Infrastructure(インフラストラクチャ) as a Service`

##SaaSとは
`パッケージ製品として提供されていたソフトウェアを、エンドユーザーにインターネット経由で提供するサービス。`
`エンドユーザー` = `商品を使う人`


・特徴
1.`データをインターネット上に保存できる。`
2.`PC、スマホ、タブレットなどの端末を選ばずにデータにアクセスできる。`
3.`複数人が同一のデータを共有・編集できる。`

・SaaSの代表例
1.Google Workspace
→Googleがサブスクリプション形式で提供しているクラウドコンピューティング生産性向上グループウェアツールで、Gmailやカレンダーなどがあります。
　![スクリーンショット 2020-11-16 20.38.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601015/ab22056e-f213-d443-ffcd-46f48b38afcf.png)
公式サイト：（https://workspace.google.com/）

2.Salesforce　
→ビジネスアプリケーションおよびクラウドプラットフォームをインターネット経由で提供している。
公式サイト：(https://www.salesforce.com/jp/?d=cta-li-promo-12)

##PaaSとは
`アプリケーションソフトが稼働する為のデータベースやプログラム実行環境などのプラットフォーム一式を、主に企業などにインターネット上のサービスとして提供するサービス。`

・特徴
1.`コストを抑え、かつ早くシステム開発ができる。`
→プラットフォームを大規模なデータセンターに用意して外部に開放し、ユーザーがその上でサービスを開発することができるようになっている。

・PaaSの代表例
1.Google App Engine
→ウェブアプリケーションをPHP・Python・Java・Go言語を使用して開発し、Googleのインフラストラクチャー上で実行し、バージョン管理することができる。
公式サイト：（https://workspace.google.com/）

`インフラストラクチャー` = `基盤となる設備や要素の略で、パソコンやサーバーなどのハードウェア、ネットワークを構築するインターネット・LAN・データベース・OSなどのソフトウェアのこと。`

2.Microsoft Azure(アジュール)
→マイクロソフトのクラウドコンピューティングサービス。
公式サイト：(https://azure.microsoft.com/)

`クラウドコンピューティング` = `インターネットなどのコンピュータネットワークを経由して、コンピュータ資源をサービスの形で提供する利用形態。`

##IaaSとは
`サーバーやストレージ、ネットワークなどのハードウェアやインフラまでを提供するサービス。`

・特徴
1.`ハードウェアのスペックやOSを自由に選定・利用できる。`
→サーバを利用する際に必要なハードウェアのスペックやOSを、自分で自由に選定して、ネットワーク越しに利用することが可能。

・IaaSの代表例
1.Google Compute Engine
→Googleの検索エンジン、Gmail、YouTube、その他のサービスを実行するグ​​ローバルインフラストラクチャ上に構築された、Google Cloud Platformのサービス。
公式サイト：(https://cloud.google.com/)

2. Amazon Elastic Compute Cloud (EC2) 
→アマゾンが提供する計算資源を用いてアプリケーションを実行する、AWS(Amazon Web Services)。
公式サイト：(https://aws.amazon.com/)

##まとめ
・提供される構成要素
→`Applications → Middle Ware → OS → Hard Ware → Network`

・`各要素がないと動作しない。`
→例 ApplicationsはMiddle Wareが無いと動作しない。
　　 Middle WareはOSが無いと動作しない。

・提供される要素
SaaS → `Applications → Middle Ware → OS → Hard Ware → Network`
PaaS → `Applications → Middle Ware → OS → Hard Ware` 
IaaS → `Applications → Middle Ware → OS` 

参考元はこちら
(https://www.cloud-ace.jp/column/detail01/)
Youtube動画の埋め込みテスト


QiitaにYoutube動画の埋め込みができるとのことで、やってみました。

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="html,result" data-user="nakamura0736" data-slug-hash="gOMEWpg" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="youtube-lambda">
  <span>See the Pen <a href="https://codepen.io/nakamura0736/pen/gOMEWpg">
  youtube-lambda</a> by Yoshiteru Nakamura (<a href="https://codepen.io/nakamura0736">@nakamura0736</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


よりすっきりさせると、こうですね。
最高や〜
<p class="codepen" data-height="555" data-slug-hash="gOMEWpg" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 0; padding: 0;">
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 非常に参考になりました。

[【結論】Qiitaの投稿に動画(Youtube)を埋め込んで再生させる方法](https://qiita.com/takada_impl/items/6a5cdcc28f1434a9e4b7)

[【説明しよう】これがQiitaの投稿に動画(Youtube)を埋め込んで再生させる方法だ。](https://qiita.com/takada_impl/items/0287ddad3966a42903fb)

@takada_impl さん、ありがとうございます！！
AWS EC2でAmazon Linuxを作成、ログイン

AWS EC2でAmazon Linuxを作成、ログインする。

AWSにログイン、サービス＞EC2＞インスタンスを起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625472/7be441dc-3107-fbea-cc85-72eb1fab2eee.png)

Amazon Linux 2 を、64bit(x86)のまま「選択」をクリック

デフォルトのまま、「確認と作成」をクリック

インスタンスが作成されるので、「パブリック IPv4 アドレス」のIPを確認。

Macのターミナル、WindowsならTeraTerm等のソフトでssh接続。

ssh -i testkey.pem ec2-user@[IPアドレス]

でログイン。
CSSだけでリボンデザインじゃなくて、リボン結びを作ってみた

# どうも7noteです。リボン・・・ではなくリボン結び（蝶々結び）を作ってみました。

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/ribon/
Rust×CLionで使用するCコンパイラーをDockerで作る

#1 使用ツール
・CLion
・Docker for Windows

#2 Docker

Rustを触ってみたかったのでついでにインストールしてます。
ただのCコンパイラーなら不要ですね。

``` Dockerfile.
FROM ubuntu:18.04

RUN apt-get update \
  && apt-get install -y ssh \
      build-essential \
      gcc \
      g++ \
      gdb \
      clang \
      cmake \
      rsync \
      tar \
      python \
      apt-utils \
      git \
      less \
      neovim \
      sudo \
      curl \
      file \
  && apt-get clean

## install rust  
RUN curl https://sh.rustup.rs -sSf | sh -s -- -y


SHELL ["/bin/bash", "-c"]
RUN source ~/.cargo/env
ENV PATH $PATH:~/.cargo/bin


## SSH-Settings
RUN ( \
    echo 'LogLevel DEBUG2'; \
    echo 'PermitRootLogin yes'; \
    echo 'PasswordAuthentication yes'; \
    echo 'Subsystem sftp /usr/lib/openssh/sftp-server'; \
  ) > /etc/ssh/sshd_config_clion \
  && mkdir /run/sshd

## SSH-User
RUN useradd -m user \
  && yes password | passwd user

CMD ["/usr/sbin/sshd", "-D", "-e", "-f", "/etc/ssh/sshd_config_clion"]
```


```docker-compose.yml
version: '3'

services:
  remote_cpp:
    container_name: remote_cpp
    shm_size: 4096m
    build: "./"
    ports:
      - '2222:22'
    cap_add:
      - SYS_PTRACE
    tty: true
```


#3 CLion

SettingsよりToolchainsを選んでDocker側の解放ポート、user/passを入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309466/05ed123d-f135-9e7d-5b6a-48e0cfbb5300.png)

#4 おわり
VSCodeのRemote Developmentだと上記のDockerだけでガンガン開発できるんですが、Jetbrains製のIDEにはそういう機能ないのでしょうかね？
iOSでARマーカーを読み取った際に自動的に音声を再生するための方法

教えてもらったことの備忘メモ。

#背景
iphoneはユーザをパケ死させないように色々な工夫がされている。Webでの音声再生においても、Webページ開いた瞬間に音が再生される仕組みだと、音のダウンロードがどんどん進んでいってしまうため、いくらでもパケットが使えてしまう。＃無音のmp3とか流されたらユーザは気づくことができない。

それを防ぐためにユーザが画面をタッチしたなど、ユーザきっかけでないと音を再生させないようにしている。

そして、ARマーカーを撮影するということが「ユーザきっかけ」に値するのかどうかは、ブラウザによって判断が分かれていて、iOSでは「ユーザきっかけ」とは言えない。と定義されてしまっている。

#iphoneでARマーカーを読み取った際に自動的に音声を再生するための方法
よって、トップ画面「今回でいうと"TAP TO START"」で一度画面をタップしたときに、音を内部で再生させて、すぐに一時停止させる処理を記述することで、一度は「ユーザきっかけ」で音声が再生された状況をつくれば、以降は、ARマーカーを読み取っただけで、音が再生できるようになる。

```html:test.html
  <div id="mask">TAP TO START</div>
```

script内にこれ。audio.play(); audio.pause();で一瞬だけ音声を再生させている。

```js:test.js
   window.onload = () => {
      audio = document.getElementById('audio');

      document.getElementById('mask').addEventListener('click', () => {
        audio.play();
        audio.pause();
        document.body.removeChild(document.getElementById('mask'));
      });
    }; 
```
【早く知りたかった！】GitとGitHubで超頻出の用語を初心者向けに解説！

最近、プログラミングの学習内容を、GitとGitHubを利用して管理しているのですが、、、

<b>専門用語が多すぎません？？？(笑)</b>

と思ったので、アウトプットがてらGitとGitHubで頻出の用語について、簡単に説明していきます！
<br>

##各種エリア
<ul><li><b>リポジトリ(Repository)</b><br>
　→変更履歴を記録する場所。箱みたいなもの。</li><br>

<li><b>ワーキングツリー(Working tree)</b><br>
　→自身のPC内でGitに監視されているディレクトリとファイル郡。</li><br>

<li><b>ステージングエリア(Staging area)</b><br>
　→コミットをする前の控室のようなもの。</li><br>

<li><b>ローカルリポジトリ(Local repository)</b><br>
　→ローカル環境(自分のPC)のリポジトリを指す。</li><br>

<li><b>リモートリポジトリ(Remote repository)</b><br>
　→外部サーバー(GitHub)のリポジトリを指す。</li><br>
</ul>
各種エリアのポイントは、<b>ワーキングツリーからどんどん下に更新していく</b>と言う流れです。僕は最初のうちは「こんなにあってどうするの？」って感じですが、、、笑
<br>

##簡単なコマンド
<ul><li><b>アッド(add)</b><br>
　→ワーキングツリーから、ステージングエリアへ残す。</li><br>

<li><b>コミット(commit)</b><br>
　→ステージングエリアから、ローカルリポジトリに変更履歴を記録すること。</li><br>

<li><b>プッシュ(push)</b><br>
　→ローカルリポジトリを、リモートリポジトリに共有すること。</li><br>

<li><b>プル(pull)</b><br>
　→リモートリポジトリから、ローカルリポジトリに、ファイルを同期すること。</li><br>
</ul>
こちらのコマンドは、先の各種エリアから移動する際に使用する、最も基本的なコマンドになります。これも<b>上から順番に実行していく流れ</b>です。
<br>

##Gitが使用しているファイル
<ul><li><b>.git</b><br>
　→Gitを管理するファイル。通常は隠しフォルダとされていて見えない。</li><br>

<li><b>.gitignore</b><br>
　→Gitで管理したく無いディレクトリやファイルを記述するファイル。こちらも通常は隠しフォルダとされていて見えない。</li>
</ul>

隠しファイルの存在は、誰かから教えてもらわない限り、なかなかわからない部分ですが、特に `.gitignore`は<font color=red>セキュリティ対策で<b>超重要</b>な部分</font>になりますので、気になる方は是非調べてみてくださいね！

<br>

##まとめ
ここで紹介した用語は、GitやGitHubで出てくる中で、ほんの一部ですが、これだけでも知っておくとチーム開発などがしやすくなると思いますので、また忘れた頃に見返してみてくださいな！

最後まで読んでくださり、ありがとうございました！

筆者：yuki｜学習10日目で初案件獲得→現在はフルスタックエンジニア転職に向けて学習中
Qiita：https://qiita.com/yuki4839
Twitter：https://twitter.com/yuki35522891
LaravelのプロジェクトをGithubからcloneして開発環境を構築する方法

こんにちは、JeffTechです。

# この記事で実現できること
- GithubからCloneする
- GithubからLaravelプロジェクトをCloneした後の、開発環境の構築

# 開発環境
- OS：MacOS
- フレームワーク：Laravel
- バージョン管理ツール：Git
- Github

# 説明
LaraveのプロジェクトをGithubからCloneしただけだと、vendarディレクトリや.envファイルがなく、php artisan serveしてもエラーが出てしまい、実際に開発できる環境にはありません。
今回は、LaravelのプロジェクトをGithubからCloneしたけど、どうしたらいいの！という人向けに、どうやって開発環境を整えるのかを説明していこうと思います。

# 実装の流れ
1. GithubからClone
1. composer install
1. .envの作成
1. データベース設定

# 実装
## GithubからClone
まずは、Laravelのプロジェクトをクローンしたい場所にターミナルで`cdコマンド`を実行して移動しておきましょう！
今回は、`/Applications/MAMP/htdocs`配下にクローンしていきます。
皆さんは自由な場所にクローンしてくださいね！

```bash:ターミナル
$ cd /Applications/MAMP/htdocs/
```
次に、Githubからのクローンです。ターミナルで下記のコマンドを実行しましょう。

```bash:ターミナル
$ git clone LaravelプロジェクトURL
```

これでLaravelプロジェクトが先程`cdコマンド`で移動したディレクトリにクローンされています。

## composer update or composer install
クローンしてきたLaravelプロジェクトを見てみると、vendarディレクトリが無いことがわかります。
なので、作っちゃいましょ！
まずは`cdコマンド`でLaravelプロジェクトディレクトリまで移動しましょう。

```bash:ターミナル
$ cd Laravelプロジェクトディレクトリ
```

それが終わったら、vendarディレクトリを作っていきます。

```bash:ターミナル
$ composer install
```
これで`php artisan serve`をすると、サーバーは起動します。


## .envの作成
次に、.envを作成していきましょう。
これがないと、500エラーなどがでて全くサイトを確認できないですからね！
実は、すでに.envの元となるファイルは存在するので、それをコピーするだけなんです。
なので、以下のコマンドを実行してください！

```bash:ターミナル
$ cp .env.example .env
```

次に、.envの中のAPP_KEYを発行します。

```bash:ターミナル
$ php artisan key:generate
```
このAPP_KEYは、暗号化やパスワードリセット等のセキュリティーでとても大事な役割を担っています。

そして、下記のコマンドで念の為キャッシュをクリアしておきましょう！

```bash:ターミナル
$ php artisan config:clear
```
これで、.envの設定はOKです。
現場などで、他に.envの設定がある場合は設定しましょう！

## データベース設定
データベースが必要な場合は、下記のコマンドたちも実行していきましょう！

```bash:ターミナル
$ php artisan migrate
```

seederファイルもある場合は、下記のコマンドを実行してください。

```bash:ターミナル
$ php artisan db:seed
```

`ReflectionException : Class 〇〇 does not exist`や`class 〇〇 not found`などのエラーが出た場合は、下記のコマンドでオートロードの定義をしましょう。

```bash:ターミナル
$ composer dump-autoload
```

それが終わったら、再マイグレーションとシーダーの実行をしましょう。

```bash:ターミナル
$ php artisan migrate:refresh --seed
```

ブラウザで確認して、問題なければOKです。

# 最後に
少しでも役に立った！という時は、いいねをポチッとして
フォローしてくださると嬉しいです、、、笑

役に立たなかった時は、怒らないでコメント頂けますと幸いです笑

Twitterもやってますので、よかったら見てみてくださいね！
https://twitter.com/jefftechsaku
[Vue.js]methodsを使う

<h1>簡単なmethodを使う</h1>
```javascript
js
new Vue({
    data:{
    },
    methods:{
//SayHi！！！と言うメソッドを作る
    SayHi:function(){
        return 'SayHi!!!'
    }
```
```html
html
//SayHi!!!と表示される
<p>{{sayHi()}}</p>
```

<h1>dataから呼び出したものをメソッドに使う</h1>
```javascript
　　　data:{
         message:'hello'     
}
    SayHi:function(){
//クォテーションをつけない、thisをつけないとアクセスできない
        return this.message;
    }

```
<p>これでhelloを呼び出すことができる</p>
UnityPlayerActivity


●Unityプラグインは複数の方法がある

(1)[UnityPlayerActivityファイルを拡張する](https://docs.unity3d.com/ja/current/Manual/AndroidUnityPlayerActivity.html)
 UnityPlayerActivity.javaを使ってUnityプラグインを作る。
準備：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/32c232f6-6226-7f89-03a8-ec89472558d2.png)

UnityPlayerActivity.java/classes.jarはUnityExportしたProjectにもある。

# [Unity向けAndroidネイティブプラグインの作り方](https://gaprot.jp/2020/03/30/unity-android-native-plugin/)

build.gradleを編集して、プラグインにclasses.jarを含めないようにする。含めるとUnity側のclasses.jarと衝突する。

```
dependencies {
//    implementation files('libs\\classes.jar')
//    implementation fileTree(dir: "libs", include: ["*.jar"])
    compileOnly fileTree(dir: 'libs', include: ['*.jar'])
```

#[UnityでAndroid拡張を行うベストプラクティス](https://qiita.com/seachicken/items/6fa4eff15fc613650c41)


 final Activity activity = UnityPlayer.currentActivity; で、UnityPlayerActivityを継承しなくてもOK


***
***

# Unityマルチスレッドレンダリングは外す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/0b9b40ef-c657-c085-7d01-b978d315b891.png)

# 低レベルネイティブプラグインインターフェース


Unity のレンダリングは、プラットフォームと CPU の数が一定の条件を満たす場合は、マルチスレッドで行われます。マルチスレッドのレンダリングが使用されるとき、レンダリング API の命令は、MonoBehaviour スクリプトを実行するスレッドとは完全に別の 1 つのスレッド上で行われます。そのため、プラグインがいくつかのレンダリングを即座に開始することが常に可能ではありません。なぜなら、その時レンダースレッドが行っている処理に干渉する場合があるからです。

Unity2018以降(?)はマルチスレッドレンダリングがデフォルト。OpenGLES描画は　GL.IssuePluginEvent(GetRenderEventFunc(), 1);経由で行う事。


# 参考
Androidネイティブ開発のすすめ
https://qiita.com/relzx/items/a35f7ab6dbacb48f7e26

UnityでAndroidのネイティブプラグインを使用する3つの方法
https://qiita.com/tempura/items/5e7992896c0faba08da3