OmniAICreator/Qiita-1.07M huggingface dataset:
react-reduxライブラリについて

## ReactとRedux 2つの違い
- React
    - Viewを扱うライブラリ (コンポーネントに関するライブラリ)
- Redux
    - 状態を一元管理するライブラリ (ストアに関するライブラリ)

## react-reduxとは
ReactとReduxを組み合わせる手助けをするライブラリ

## Container Component と Presentational Component
###  ■Container Component
- Reactのコンポーネントをラップしたコンポーネント
    - ReduxのStoreやActionを受け取り、ReactコンポーネントのPropsとして渡す役割

###  ■Presentational Component
- 依存性のない純粋なReactコンポーネント
    - ただのコンポーネント

## react-reduxの機能
大きく分けて2つの機能

- Provider
- connect

### ■Provider
- Providerを使用することで、connect関数が使える
    - 任意のコンポーネントに対し、Storeとの紐付けを行える
    
```react
// Providerでコンポーネントをラップする

ReactDOM.render(
  <Provider store={store}>
    <MyRootComponent />
  </Provider>,
  document.getElementById('root')
);
```
- コンポーネントはどうやってStoreの情報を取得するのか？
    - → connect関数を用いる
    
### ■connect([mapStateToProps], [mapDispatchToProps], [mergeProps], [options])
- 特定のComponentに対して、Reactのcontextで保持しているStoreを提供する。

#### ●mapStateToProps(state, [ownProps])
- Storeから必要なStateを取り出し、ComponentのPropsに割り当てる
    - StateをPropsにmappingして、Componentに渡す

```react
// returnしたオブジェクトはconnect先のコンポーネントのPropsとして受け取ることができる
// 第一引数：StoreのState
// 第二引数：オプション(親コンポーネントから引き継がれたPropsが格納されている) 下記の例では用いていない

function mapStatetoProps({ task, tasks }) {
  return task, tasks;
}
```

#### ●mapDispatchToProps(dispatch, [ownProps])
- Actionのdispatchを行う処理をこの関数内で閉じることで、コンポーネントからdispatchの処理を隠蔽する
    - コンポーネントでdispatchの処理を記述しなくてすむ

```react

// Action Creator
const addTask = (task) => ({
  type: ADD_TASK,
  payload: {
    task,
  },
});

// 第一引数：Storeのdispatch

function mapDispatchtoProps(dispatch) {
  return {
    addTask(task) {
      dispatch(addTask(task));
    },
  };
}
```

#### ●mergeProps(stateProps, dispatchProps ownProps)
- mapStateToPropsとmapDispatchToPropsを経たそれぞれのPropsと、親から渡ってきたownPropsをマージして、コンポーネントに渡すための関数
- デフォルトでは以下のように、単純な3つをマージする関数が設定されている

```react

function mergeProps(stateProps, dispatchProps, ownProps) {
  return Object.assign({}, ownPorps, stateProps, dispatchProps);
}
```

- mapDispatchToPropsにStateの値を利用したい場合、mergePropsを用いることで、コンポーネントを介さずにStateを引数として受け取ることができる

```react

// mergeProps内でStoreの中のtaskを参照して、addTaskに渡している

function mergeProps(stateProps, dispatchProps, ownPorps) {
  return Object.assign({}, ownPorps, stateProps, {
    ...dispatchProps,
    addTask() {
      dispatchProps.addTask(stateProps.task);
    },
  });
}

function mapStatetoProps({ task }) {
  return {
    task,
    tasks,
  };
}

function mapDispatchtoProps({ dispatch }) {
  return {
    inputTask(task) {
      dispatch(inputTask(task));
    },
    addTask(task) {
      dispatch(addTask(task));
    },
  };
}
```
Javascript ES6の真偽判定

JavaScriptにおける真偽判定がややこしすぎたので表にまとめてみました。

# Trueになるやつ

|型|中身|
|----|----|
|Number|0とNaN以外|
|Array|[]|
|Object|{}|
|String|'a'|

# falseになるやつ
|型|中身|
|----|----|
|Object|null|
|Number|0|
|Number|NaN|
|Number|[].length|
|Number|Object.keys({}).length|
|String|''(空文字)|
|Number|''.length|



# 推察(この推察 = trueなのかは知らない)
### Number
0ないしNaNならfalse
それ以外はtrue

### Object,Array
基本的にtrueになっちゃう
-> lengthでNumberにしようね
(Objectに関してはObject.keysしないといけないから他にもっと楽な方法はあるかもしれない)

### String
[]や{}を差し置いて空文字は生意気にもfalse
それ以外はtrue

### null
おまえは流石にfalse


#まとめ
lengthはっょぃ

※コメントにて間違いをご指摘くださった@htsign様、誠にありがとうございましたm(_ _)m
フレームワークについて知ろう！

##フレームワークとは？
そもそもフレームワークとはなんなのでしょうか？
簡単にいうと枠組みのことです。

Webアプリケーションを作成する際に、フレームワークでアプリケーションの雛形を作成します。webアプリケーション開発に必要なファイルを自動で作ってくれるので、それらを編集することで、効率的にwebアプリケーション開発ができます。

##フレームワークの種類
フレームワークはWebアプリケーション開発で用いられる各プログラミング言語ごとに存在します。

Ruby | Ruby on Rails、Sinatra
PHP | Laravel、CakePHP
Java | Spring Framework、Java EE

などがあります。

フレームワークを使うことで簡単にアプリを作ることができるので活用してみてはいかがでしょうか。

最後までご覧いただきありがとうございます。
【UE4】AIの敵をランダムに多種類出現させる小ネタ

<h2>いろいろな敵をランダムに出現させる</h2>
たとえば、ドラクエで言えば、スライムが出てきたと思うと、次はスライムベスやドラキーが出てくると言った具合で、敵はランダムにいろいろな物が出てきます。こちらの記事の75ページを参考に、
https://www.slideshare.net/masahikonakamura50/5ue4
同じことができないかを考えてみました。やってみたら簡単です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/b1be7ec6-e465-255b-80db-3d02eaeb6393.png)

<strong>PawnClass</strong>に出現させるAIを指定すると、指定された同じ敵がランダムなタイミングでいくつも出現してきます。これを複数の種類出現させる方法です。

まず、Pawnの配列を作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/7dc2550a-6e1a-1277-beac-7b7bd6501958.png)
配列の中に、出現させたい敵を入れます。数は好きなだけ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/9bbf3c43-59e8-b7fa-a429-e160fb631e43.png)
Pawnの配列と長さをGetします。配列のインデックスは配列の長さから1を引いた数なので1を引きます。
<strong>Random Integer In Range</strong>で0からlength-1の間で値を取ります。
これをSpawn AI From ClassのSpawn Classにつなげるだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588692/90a1dbd6-9c92-fd13-c249-93709835ef29.png)

お手本では無限ループで出現させていますが、自分用にFor ループしてます。その他は同じです。これで、何種類もの敵が現れます。
ただ、ビヘイビアツリーは共通なので出現したあとの挙動は同じです。ビヘイビアツリーを複数用意すれば同じように、これもランダムな挙動をさせることができると思います。

また、お手本ではEventBeginPlay(1回だけ呼ばれる)の後の無限ループで出現させていますが、たとえば、マップにコリジョンを置いて、そこを何かが通過したら新たに出現するなどとやってもいいかもしれませんね。
【Python】文字列シーケンスを使う

#はじめに
とみーさんのブログの[Python入門者のための学習ロードマップ](https://obgynai.com/python-roadmap/)に沿ってPython学習を進めています。
今回は[【Python】文字列シーケンスの使い方まとめ](https://obgynai.com/python-sequence/)を参考に
シーケンスの概念と文字列の使い方を扱います。

#対象者
- とみーさんブログで学習中の方
- 文字列シーケンスについて概要を知りたい方

#環境
Google Colaboratory

#学習内容
1. Pythonのシーケンスについて
シーケンスとは**変数を格納する倉庫（の集合体）**

2. 文字列でのシーケンスとは
``x = "文字列"``
の場合は「xが変数」となり、xに文字列が格納されている状態をいいます。

3. スライス←**格納された文字要素を抜き出す**

``x = "12345Python"``

``x[0]``  xの0番目をスライス
1　←0が一番左（Python恒例ですね）

``x[-11]``  右から数えて11番目をスライス
1　←右から数えて11番目（つまり0番目）の1

``x[0:3]``0から3までスライス
123　←0から3まで取ってきました

``x[:]``　全てスライス
12345Python　←全ての文字列持ってきました

``x[0:12:2]``
'135yhn'　←0から12番目まで2つ間隔でスライス

[ ]内の書式によって、文字列の取得方法が異なるので目的応じて使い分けていきます。

#参考
[【Python】文字列シーケンスの使い方まとめ](https://obgynai.com/python-sequence/)
Rubyにおけるクラス・インスタンス

# イメージ

![blog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533191/f625954f-5814-a5d1-9625-d54836ba5b13.png)

クラスとインスタンスを車で説明するならば、

クラス　＝　車の設計図　　・インスタンス　＝　設計図を元に作られたそれぞれの車

になります。

クラスは共通の処理、すなわちどの車にも共通している部分が記されています。車体やハンドルを持っていることや、ブレーキで減速する、アクセルで加速するなどです。実際に共通しているデータをプロパティやメソッドと呼ばれるデータで定義しています。


```
class クラス名　←先頭は大文字
  # 変数やメソッドの定義
end
```


インスタンスはクラスの特徴を引き継いでいますが、車ごとに詳細は違います。車体やハンドルの見た目や種類などは車ごとに異なるはずです。インスタンスはクラスメソッドのnewメソッドによって生成できます

```
変数名 = クラス名.new
```

#まとめ

この記事ではあくまでクラスとインスタンスの概念を説明しましたが、この後にクラスの中にメソッドを追加し、オブジェクト共通・個別の情報をそれぞれ定義していくという流れになります。

クラスとインスタンスは、初めにイメージを掴むことでその後の処理なども理解しやすくなるので、車でも携帯でも何でもいいので自分なりに置き換えて考えてみると良いかもです。
【EC2・Rails】postgresqlのアンインストール→インストール・パスを通す方法


##アンインストール

```
sudo su -

rpm -qa | grep postgres

postgresql96-server-9.6.17-1PGDG.rhel7.x86_64
postgresql96-9.6.17-1PGDG.rhel7.x86_64
postgresql96-contrib-9.6.17-1PGDG.rhel7.x86_64
postgresql96-libs-9.6.17-1PGDG.rhel7.x86_64

yum remove 上記のバージョンを指定する。

```

##インストール
これでいける。
https://qiita.com/shinsaka/items/cf45cd87c2c75e35ce12

https://qiita.com/shota0701nemoto/items/fba60c97e1332b931488#posgresql%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB



##パスを通す

```
[shogo@ip-10-0-0-193 ~]$ vim ~/.bash_profile
```

以下のようにパスを通します。


```
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

PATH=$PATH:/usr/pgsql-9.6/bin/   →数字は9.6で追加
 export PATH                     →追加

export PATH
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

```





```
[shogo@ip-10-0-0-193 ~]$ exit
S:Portfolio sahota0701nemoto$ ssh Portfolio_key_rsa

[shogo@ip-10-0-0-193 ~]$ psql --version
psql (PostgreSQL) 9.6.17
[shogo@ip-10-0-0-193 ~]$ 
```
Gitの共同開発の確認の仕方

###変更したファイルの把握
自分がどのコードを変更したかの確認です。
ターミナル

```
git status
```
上記で自分がどのコードを変更したかの確認ができます。
addされたファイルは緑色、変更した部分(addされてない)は赤色で表示されます。
###変更内容の把握の仕方
ターミナル

```
git diff
```
上記を実行すると追加された部分が緑色で表示されます。
コードを変更した部分では、変更前のコードが赤色、変更後のコードが緑色で表示されます。
####他の人のコミットメッセージの見方
ターミナル

```
git log
``
上記のコマンドで自分や他の人のコミットを確認することができます。
上から新しいコミット順で出てきます。
###変更内容
変更内容が見たい場合
ターミナル

```
git log -p
```
上記で確認できます。
上下キーを使うと表示範囲を変えられて、Qキーを押すことで終了できます。
【AzureAD】ユーザプロビジョニングで検疫エラーが発生

#プロビジョニングで検疫エラーが発生
先日Salesforce のユーザがプロビジョニングされていなかったので
AzureADでプロビジョニングの状態を確認したところ、以下のエラーが発生していました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/ffc39b83-b491-9517-3e08-19080207c8b8.png)

SalesforceでAuthenticated Websiteってロールが重複している影響で
プロビジョニングができていない模様
Microsoftグラフを使用してサービスプリンシパルで重複したロールを消せば
直ると書いてあったので、指示に従ってみます。


#MicrosoftGraphで修正作業
MicrosoftGraphにアクセスしてみます。
Microsoft Graph は、Microsoft Cloud サービス リソースへのアクセスする Web APIみたいです。 
[MicrosoftGraph](https://developer.microsoft.com/en-us/graph/graph-explorer)
 
AzureADの管理者IDでログインし、APIへのアクセス権限を付与するために
**Modify Permissions**で以下にチェックを入れます。

"Directory.Read.All"

"Directory.ReadWrite.All"

"Directory.AccessAsUser.All"

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/89b04597-02bf-098a-33d2-2f909bd81ce0.png)

まずリソースからservicePrincipal データを読み取ります。
GET https://graph.microsoft.com/beta/servicePrincipals/アプリのObjectID
を入力後[**Run Query**]をクリックします


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/a5ecaa13-cac4-7e32-7062-5864710842ba.png)

コマンドに成功すると、以下のような画面があるので、appRolesの部分を全部メモ帳等にコピーします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/d6c3814d-96f8-da7d-3a51-8c4593f931cb.png)

メモ帳を確認するとと、確かにAuthenticated Websiteが重複しており、
isEnabledがtrueとなっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/ffcc8cde-7d18-731c-ff27-b437bc60ba62.png)

重複部分を削除したいのですが、アプリロールを削除するには一度無効化をしないといけないので無効化を実施します。
消したいアプリロールのisEnabledをfalseにします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/63bc7d71-bea0-fcf4-7387-e0fdeb6932be.png)

MicrosoftGraph画面でPATCHコマンドでリソースを新しい値に更新します。
コマンドの**黒塗りの部分はアプリケーションのディレクトリIDが入ります。**
RequestBodyの部分にメモ帳で修正したappRolesを貼り付けます
貼り付けの際に**{　}**で囲むのを忘れないようにしてください！！
[**Run　Query**］をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/d0fe7c39-5042-f422-85ce-5347203512e8.png)

コマンドが成功したら、次に重複のロールを削除します。
重複しているAuthenticated Website（isEnabledをfalseにしたもの）を削除して
もう一度PATCH https://graph.microsoft.com/beta/servicePrincipals/アプリのObjectIDを入力後
[**Run Query**]をクリックします
Successが出ればOKです。

#プロビジョニングジョブの再起動

Azureポータルに戻りプロビジョニングジョブを再起動します。
[**現在の状態を初期して、同期を再開します**］にチェックをいれ[**保存**］ボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/10e46ef2-b9c2-f25f-4608-781be2a07a34.png)

無事プロビジョニングが成功しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/d0fe3291-6f52-dc5a-2c60-4eb5781306a2.png)

発生原因についてはわかりませんでしたが、検証でアプリの設定を繰り返し
設定していたので、それが原因かもしれません。参考まで
1960～1970年代のC言語の黎明期が良くわからなったので可視化（C言語 vs デニス・リッチー vs UNIX vs ケン・トンプソン）

# はじめに
 1960～1970年代のＣ言語の黎明期流れがよくわからなかったので整理してみた。

# 可視化
 時代の流れを調べていたら、Go言語と、ビルジョイ繋がりでJavaも出てきたので、追加しました。

![変遷_C言語からの系譜_2023年7月22日.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157498/412d8624-8fa0-4368-cd9a-d09fc323d3c6.png)


# 結論
 - ケン・トンプソンの業績がすごい事が分かった。
 - なんだか、限られた数人の天才たちが、世界を引っ張っている気がした。

# ファイル
 [変遷SVGファイル in GitHub](https://raw.githubusercontent.com/kobe2018/viz_svg-tree-diagram/master/%E5%A4%89%E9%81%B7_C%E8%A8%80%E8%AA%9E%E3%81%A8%E5%89%B5%E4%BD%9C%E8%80%85%E3%81%AE%E7%B3%BB%E8%AD%9C_2020%E5%B9%B44%E6%9C%8814%E6%97%A5.svg)
Haskellerの1週間Rust入門チャレンジ Day 2 #Rust

# Day 2
[前回](https://qiita.com/Tatsuki-I/items/e19953c051e55214b9a2)に引き続き、1週間チャレンジ2日目。

時間があまりなかったので第3章のみ。
ちゃんとまとめると日付が変わりそうなのでとりあえず雑多に。

機械語型って何？
表現が難しいけど、ようするに文字とか数値とかのことだよね？
参照、Box、Rawポインタとか、正直使ってみないと掴めそうにないものも多数。

明日ぐらいから多分ソースコードを書くことになりそうなので、引き続き頑張ります。
Vue Test Utils ケバブケースの属性の値を参照する

# Vue Test Utils ケバブケースの属性の値を参照する

## やりたいこと
例えば、このようなコンポーネントをテストするときにケバブケースで記載された属性値を取得する。

``` テスト対象.vue
<customComponent>
  v-model="input"
  label="メールアドレス"
  type="Email"
  place-holder="email@example.com"
  :content="formEmail"
></customComponent>
```

## やり方
以下のようにケバブケースで表現されたplace-holder属性の値を取得できる。
単純に属性から'-'を消せばアクセスできる。

``` __test__/テスト対象.spec.js
import { Mount } from '@vue/test-utils'
import Component from '~/pages/テスト対象.vue' // Nuxtのディレクトリ構造前提

...
wrapper = Mount(Component)

describe('テスト対象.vueのテスト', () => {
  test('ケバブケースで表現された属性値の取得', () => {
      expect(formEmail.attributes().placeholder).toBe('your.email@example.com')
  })

...
```
【Golang】変数定義、定数

#【Golang】変数定義、定数
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

```

package main

import (
	"fmt"
)

func main(){
	fmt.Println("変数")
	
	//変数宣言 明示的な定義
	//var 変数名 型指定 = 値
	//var i int = 1
	//下記、まとめて変数宣言( )で書く
	var (
		i    int     = 1
		f64  float64 = 1.2
		s    string  = "test"
		//2つまとめて変数宣言（同じ型の場合）
		t, f bool    = true, false
	)

	//変数宣言して値を入れない場合、初期値が入る
	var ii int
	
	//ショートカット変数 暗黙的な定義
	//明示的な定義に対して、型指定の必要がないという特徴を持つ。
	//var 型指定が不要になる
	//関数内のみ宣言可能
	//関数外ではvarで変数宣言する
	//自動で型を入れてくれる。型推論と呼ばれる。
	xi := 1
	//デフォルトではfloat64になる。型を明示的に宣言する場合はvarを使う
	var xf32 float32 = 1.2
	xs := "test"
	xt, xf := true, false
	fmt.Println(xi, xf32, xs, xt, xf)

	//このような書き方もできるが、:=を使った方が望ましい。
	//var a = 1

	//明示的、暗黙的な定義の使い分け
	/*
	可能であれば、基本的には型指定を使った方がいい。
	一般的に静的型付け言語では、静的型によるプログラムの整合性の保証　という　メリットを得る代わりに
	プログラム全域で煩雑な型指定が必要になるという代償を払う。
	Goは多くの局面で型指定を省略できるように設計されている為に、静的型付け言語のメリット享受しつつ、そのデメリットを軽減するためにも
	積極的に型指定をして、開発効率の向上を図るのが正しい。
	*/

	//共通
	//複数回同じ変数を定義することはできない。代入(上書き)は可能。
	//関数内の変数は、関数内でのみ使用可能。
	//使われていない変数を定義されている場合、エラーになってしまう。




	//定数
	//定数は後から変更できない
	//後から変更しない値の場合、セキュリティ上望ましい。
	//関数内にも書けるが、定数はグローバルに書くことが多い
	//他のプログラムからも呼び出す場合は、頭文字を大文字にする

	//単体
	const Pi = 3.14
	//const Pi = 3 はできない

	//複数
	const (
		Username = "test_user"
		Password = "test_pass"
	)


	//下記、intの最大値
	//下記エラー
	// var big int = 9223372036854775807 + 1

	//constは型指定しないので、最大値をしてもエラーにならない
	const big = 9223372036854775807 + 1
}

```
python版のemacs-orgパーサー orgparse のお試し

emacs-lispが書けないので、pythonでorg-modeのパーサ探したらあったのでお試し。
サンプルorgファイルの読み込みと、読み込み結果のorgテキスト化を試します。

公式ドキュメントはこちら。
https://orgparse.readthedocs.io/en/latest/


今回使うのは以下のサンプル。

``` 
$ cat sample.org
* Heading 1
   :PROPERTIES:
   :ID:       48c4a07e-95c1-41ff-a1f0-8e2f6ad88761
   :END:
** TODO [#B] Heading 2
   DEADLINE: <2020-05-09 Sat>
** DONE Heading 2
   CLOSED: [2020-05-09 Sat 22:21]
*** Heading 3
    SCHEDULED: <2020-05-09 Sat>
* Heading 1      :ARCHIVE:
```

まずは必要なパッケージのインストール。
読み込みと書き込みでパッケージが別々になっています。

```
$ pip install orgparse orger
```

読み書きのサンプルコードは以下。

```
$ cat org-parse.py
from orgparse import load
from orger import inorganic

root = load('sample.org')

print('--- for node in root[1:] ---')
# 上の行のノードから順に実行
for node in root[1:]:
    print(node.heading)

# 上の階層のノードから順に実行
print('--- for node in root.children ---')
# for node in root.children
for node in root.children:
    print(node.heading)

# 書き込み用のパッケージへのコピー
def get_node(node):
    children = [get_node(child) for child in node.children]
    scheduled = None if node.scheduled is None else node.scheduled.start

    return inorganic.node(
        heading=node.heading, # タイトル読み込み
        todo=node.todo, # TODO, DONE など読み込み
        tags=node.tags, # タグ読み込み
        scheduled=scheduled, # scheduled 読み込み, 読み込みはdeadlineもあり
        properties=node.properties, # 個別読み込みは node.get_property('ID')
        body=node.body, # 中身の読み込み
        children=children
    )
print('--- write to org file ---')
for node in root.children:
    node = get_node(node) 
    print(node.render())
```

実行結果

```
$ python3 org-parse.py
--- for node in root[1:] ---
Heading 1
Heading 2
Heading 2
Heading 3
Heading 1
--- for node in root.children ---
Heading 1
Heading 1
--- write to org file ---
* Heading 1
:PROPERTIES:
:ID: 48c4a07e-95c1-41ff-a1f0-8e2f6ad88761
:END:
** TODO Heading 2
** DONE Heading 2
*** Heading 3
SCHEDULED: <2020-05-09 Sat>
* Heading 1 :ARCHIVE:
```

簡単に org ファイルの読み書きが出来ました。
これで todo の集計などが python スクリプトで書けそうです。
なお、2020/05/09 現時点では書き込み専用パッケージの inorganic 側が closed や deadline に対応していない模様。
※ 読み込みは問題なくできます

orgの書き込みパッケージはまだ仮段階で、APIの検討中らしいです。
関連 issue : https://github.com/karlicoss/orgparse/issues/11

ちなみに、今回の関連リポジトリは以下の通り。全部同じ方が作ってくださっています。

- https://github.com/karlicoss/orgparse
- https://github.com/karlicoss/inorganic
- https://github.com/karlicoss/orger

特に orger というパッケージは github, pdf, tiwtter などを org 化し、
あらゆる情報を org で管理することが目標のようです。
evernote の emacs-org 版みたいなものですかね。いずれ使ってみたいです。
Fortran で三項演算子（改訂）

Fortran でコンピュータ言語でいう三項演算子を実現する方法について記します。
実用性は低いと思いますが、ギリギリの非常時や、「Fortran には三項演算子が無いくせに！」といじめられたときに「いや、なくもない」などと煙に巻くのに役立つでしょう。

### 改訂：
**septcolor さんから MERGE 関数が (then,else,if) 並びの三項演算子として使えるというコメントをいただきました。こちらの方が ELSE が必須になりますが、スカラーを直接扱えるので便利です。また本文の例題に出した ELSE の要らない場合は SUM の MASK を使えばよいので、SUM(*then,if*) の形に PACK を略したほうが簡潔になります。ただ数値にしか使えず、ELSE 値として 0 が返ります。以下記事は元のままにしておきます。**


#前書き　三項演算子
Fortran には単項演算子と二項演算子しか存在しません。Operator Overload でもこの二つにしか対応していません。その理由は、どこかで読んだ分には、数学でもほとんど単項演算子と二項演算子しか出てこないので、それで十分であろうとのことでした。

確かに数学本を見ていても、三項演算子が出てくることはほとんどありません。理由はよく分かりませんが、三項が絡む時は関数の形にするからでしょうか？

コンピュータ言語でいう三項演算子は、三つの項を取るという点では三項ですが、if 文が式となって値を返すというもので、数学などの単項・二項演算子の延長線上にあるものではない気がします。

# Fortran での実現
PACK 関数を使うと、疑似的に三項演算子相当の機能が実現できます。以下に二つの数を比較して、大きい方を返す max 関数相当の例を示します。

```fortran
!k=max(i,j)
k=sum(pack([i], i>j ,[j]))

if(i>j)then
    k=i
else
    k=j
endif
```

ここで PACK 関数の中に、THEN 節で返す値（を配列化したもの）、IF 文の条件式、ELSE 節で返す値（を配列化したもの）の順番で並べます。この順番は C 言語の三項演算子ではなく、Python の三項演算子の順番になっています。

PACK 関数は、元々配列操作用の関数なので、配列構成子 [...] によって、1 要素の配列にしています。これをスカラーに戻す方法がないので、sum 関数でナンセンスな計算をやってスカラーに戻しています。なお条件式はスカラーのままでも、全配列操作として全要素に単一の論理値が作用するから大丈夫です。配列構成子 [...] でくくって、論理型の配列にしても良いです。

## PACK 関数
文法事項。任意型の配列から、論理型の mask が .true. である要素を取り出す。mask が .false. である所を埋めたい場合、optional な vector 配列を与えておくと対応要素をで埋めてくれる。　

```
result = PACK (array,mask[,vector])

array
(Input) Must be an array. It may be of any data type.

mask
(Input) Must be of type logical and conformable with array. It determines which elements are taken from array.

vector
(Input; optional) Must be a rank-one array with the same type and type parameters as array. Its size must be at least t, where t is the number of true elements in mask. If mask is a scalar with value true, vector must have at least as many elements as there are in array.

Elements in vector are used to fill out the result array if there are not enough elements selected by mask.
```

PACK 関数は、本来は array processor 型の SIMD 並列コンピュータ向けの機能だと思います。SIMD 型のプロセッサでは複数の配列要素が一括で実行されるので、（ else 節の無い）if 文の条件分けは、実行するけど結果を捨てるという mask で実現されます。しかしこの場合、捨てる要素が多くなると SIMD の利点が生かされなくなるので、そういう場合はあらかじめ PACK 関数で実行処理されるべき配列要素を抜き出しておき、SIMD 処理した後、UNPACK 関数で配列の元の位置に戻すことが考えられていたのではないかと思います。

下図は 1960 年代の夢の SIMD 型並列スパコン [ILLIAC IV のパンフレット](https://www.computerhistory.org/brochures/doc-4372957044511/)から借りてきた参考イラストです。（このイラストでは計算するけど結果を捨てるのではなく、計算せずに寝てるようですが。）

![illiac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44522/04d77c43-36c6-0145-2bfa-060c444bd448.png)

## 利用例
三項演算子は、値を返す if 文と見なせるので、値しか取れない所で条件分けをしたいときなどに利用できます。たとえば、WRITE 文などで使えます。ここで WRITE 文の場合、配列とスカラーの差が見えないので、配列をスカラーに直すための余分な sum 関数を省略できてスッキリします。

以下の例では（else 節の無い場合ですが）、20 までの整数の約数を求めて列挙しています。

```fortran
program divisor
    implicit none
    integer:: i,j
    do i=1,20
        print'(*(g0,x))',(pack([j], mod(i,j)==0), j=1,i)
    enddo
end program divisor
```

```
1
1 2
1 3
1 2 4
1 5
1 2 3 6
1 7
1 2 4 8
1 3 9
1 2 5 10
1 11
1 2 3 4 6 12
1 13
1 2 7 14
1 3 5 15
1 2 4 8 16
1 17
1 2 3 6 9 18
1 19
1 2 4 5 10 20
```
RaspberryPi4でZoomは使えるのか2020年5月版

#はじめに
ラズパイ4でZoom:movie_camera:ができたらいいな。じゃあできるのか。
2020/5時点ではできますけど、使えませんという話。（以下、2020/5時点の話。）

#どうやってできるのか
ZoomからLinux向けにもソース提供ありますけど、アレはx64,x86向けでRaspberryPiでは使えません:oncoming_police_car:
じゃあどうするか。chromium:globe_with_meridians:からです。

#chromiumから?
おいおい、試したよ。ダメ:skull:だったよ。

私も過去に試してそう思ってました。

ところが、[ここの情報](https://www.kunimiyasoft.com/raspberry-pi-zoom/)をみて試したらできました。
ざっくりいうと

```
1.Chromium上で「Zoom」を操作するので、起動します。
2.「xdg-openを開きますか」のポップアップウインドウが開きますが、「キャンセル」する
3.「ブラウザから参加」をクリックする。
4.参加するときの自分の名前と、ロボット防止を経て「参加」ボタンをクリック→参加！
```

これを押せ！という指示に**真っ向から逆らって「キャンセル」を押す**というのは斬新:zap:というか、よく見つけたというか。
ロボット防止をどうしてもさせたいのでしょうね。
なお、この方法はManjaroでもRaspbianでもOK。（私は普段[Manjaro](https://qiita.com/damacchi/items/25b0b751f1eea57ff04a)です）

利用したカメラは[JETAku HDウェブカメラ](https://www.amazon.co.jp/gp/product/B085C678PX/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1)です。
会議室に参加しまして、動画も音もマイクも確認しました。使えますよ:star:
ここまでで特別に追加したパッケージはありません。上記カメラはUSBカメラですが、挿すだけでOK。

#でもね…
でも…基本ラグるんですよね:frowning2:それもまぁ諦めるとしても…

最大の弱点：５分もせずにブラウザごと落ちます:umbrella:

ManjaroでもRaspbianでも結果は同じ。これがRaspberryPi4 4GBの限界なのか…
ヒートシンクもかなり熱く:fire:なります（コマンドによれば61℃。通常52℃ぐらいなのでやっぱり頑張っている）

よって、RaspberryPi4でZoomできますが使えません。
たぶんRaspberryPi4の他のOSでもchroniumが使えれば同じ結果になると思います。

会議に参加しても５分じゃ何もできないですし、ましてやホストなんて…

たぶんネイティブなアプリができればこんなことにならないと思うのですけどねぇ…

#最後に
せっかくWebカメラ買ったのにお蔵入り…は寂しいので、zoomさんraspberryPi向けにネイティブアプリ作ってください。
メモリ2Gの型落ちタブレットでも使える程度に動くのだから、ネイティブアプリがあればなんとかなる…ならないかなぁ…

ちなみに私の環境ではヒートシンクしかないので、ファンなどでガンガン冷やせる環境があればもう少し使えるかもしれませんね。

以上でーす
RDBMS  【 Relational DataBase Management System 】

RDBMSとは、リレーショナルデータベースを管理するための専用のソフトウェア。
リレーショナルデータベース（RDB：relational database）は一件のデータを複数の属性の値の組として表現し、組を列挙することでデータを格納していく方式で、属性を列、組を行とする表（テーブル）の形で示されることが多い。
ボタンなどがくっついてしまう件

こんなことも知らなかった・気づかなかったという個人的メモなのですが。

Elmなどのフロントエンドでボタンを配置するとくっついて表示されますよね?
(htmlをテンプレートにするようなものは違うのかもしれませんが)
![kuttuita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554706/d340cae1-0aa4-6116-9bf5-938e81ff6204.png)

CSSフレームワークなどの公式ページをみるとカラフルなボタンが間隔を開けて表示されてますが、これはmargin-rightなどを設定しているのかと思っていました。

これは.htmlの手書きだとinline要素は改行が半角スペースに変換されて表示される。
というだけでした。

Discord elm-jp の方々ありがとうございました。


---
```html
<button>hoge</button>
<button>hoge</button>
<button>hoge</button>
<button>hoge</button>
```

![hanareteru.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554706/b6c553ab-b1a3-eb7c-58b6-12f3d5defa7e.png)

---

```html
<button>hoge</button><button>hoge</button>
<button>hoge</button><button>hoge</button>
```
![hanareta.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554706/d5795506-f813-0af8-fe8c-82d1d8961c46.png)

---
記事とは関係ないのですが、github.ioにファイルをアップしても、すぐには表示できないと思っていました。
しかしurlに /index.html とつければすぐに表示されそうということに気づきました。
Ruby と Perl と Java と Python で解く AtCoder ABC 065 C 階乗

# はじめに
*[AtCoder Problems](https://kenkoooo.com/atcoder/#/)* の Recommendation を利用して、過去の問題を解いています。
AtCoder さん、AtCoder Problems さん、ありがとうございます。
# 今回のお題
*[AtCoder beginner Contets C - Reconciled?](https://atcoder.jp/contests/abc065/tasks/arc076_a)*
<font color="brown">Difficulty: 647</font>

今回のテーマ、階乗
# Ruby
犬`N匹`の階乗と猿`M匹`の階乗の掛け算になります。
階乗を関数化しておけば後々のコンテストに使用できます。

```ruby.rb
n, m = gets.split.map(&:to_i)
MOD = 1_000_000_007
def nPk(n, k)
  r = 1
  while k > 0
    r *= n
    r %= MOD
    n -= 1
    k -= 1
  end
  r
end
if (n - m).abs > 1
  puts 0
elsif n == m
  puts nPk(n, n) * nPk(m, m) * 2 % MOD
else
  puts nPk(n, n) * nPk(m, m) % MOD
end
```
```nCk.rb
def nCk(n, k)
  r, j = 1, 1
  return 0 if k > n || k < 0
  k = n - k if n - k < k
  while j <= k
    r *= n
    n -= 1
    r /= j
    j += 1
  end
  r
end
```
こちらも~~コピペ~~再利用可能です。
# Python
```python.py
n, m = map(int, input().split())
MOD = 1000000007
def nPk(n, k):
    r = 1
    while k > 0:
        r *= n
        r %= MOD
        n -= 1
        k -= 1
    return r
if abs(n - m) > 1:
    print(0)
elif n == m:
    print(nPk(n, n) * nPk(m, m) * 2 % MOD)
else:
    print(nPk(n, n) * nPk(m, m) % MOD)
```
# Perl
```perl.pl
chomp (my ($n, $m) = split / /, <STDIN>);
my $MOD = 1_000_000_007;
sub nPk {
  my ($n, $k) = @_;
  my $r = 1;
  while ($k) {
    $r *= $n;
    $r %= $MOD;
    $n -= 1;
    $k -= 1;
  }
  $r;
}
if (abs($n - $m) > 1) {
  print "0\n";
} elsif ($n == $m) {
  print (nPk($n, $n) * nPk($m, $m) * 2 % $MOD), "\n";
} else {
  print (nPk($n, $n) * nPk($m, $m) % $MOD), "\n";
}
```
```nCk.pl
sub nCk {
  my ($n, $k) = @_;
  my ($r, $j) = (1, 1);
  return 0 if $k > $n || $k < 0;
  $k = ($n - $k) if ($n - $k) < $k;
  while ($j <= $k) {
    $r *= $n--;
    $r /= $j++;
  }
  $r;
}
```
# Java
```java.java
import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = Integer.parseInt(sc.next());
        int m = Integer.parseInt(sc.next());
        sc.close();
        int MOD = 1_000_000_007;
        if (Math.abs(n - m) > 1) {
            System.out.println(0);
        } else if (n == m) {
            System.out.println((((nPk(n, n, MOD) * nPk(m, m, MOD)) % MOD) * 2) % MOD);
        } else {
            System.out.println((nPk(n, n, MOD) * nPk(m, m, MOD)) % MOD);
        }
    }

    static long nPk(int n, int k, int MOD) {
        long r = 1;
        while (k > 0) {
            r *= n;
            r %= MOD;
            n -= 1;
            k -= 1;
        }
        return r;
    }
}
```
*Java* は気を許すと、整数のオーバーフローを食らいます。

||Ruby|Python|Perl|Java|
|:--:|:--:|:--:|:--:|:--:|
|コード長|287 Byte|314 Byte|386 Byte|794 Byte|
|実行時間|21 ms|64 ms|41 ms|111 ms|
|メモリ|1788 KB|3064 KB|384 KB|23764 KB|
# まとめ
+ ABC 065 C を解いた
+ Ruby に詳しくなった
+ Python に詳しくなった
+ Perl に詳しくなった
+ Java に詳しくなった
Gulpの構築（Sassコンパイル、CSS圧縮、ベンダープレフィックス）

Gulpを使用したSassコンパイル、CSS圧縮ファイルの生成、ベンダープレフィックスの付与をするための環境構築したので覚書です。

## 1 Node.jsのインストール
[公式サイト](https://nodejs.org/ja/)からダウンロード、インストールを行う。

## 2 package.jsonファイルの作成
作業するディレクトリに移動しコマンドプロンプトで次のコードを実行

```
npm init -y
```

## 3 Gulpのインストール、gulpfile.jsの作成
作業するディレクトリで次のコードを実行

```sh
npm install gulp --save-dev
```

作業するディレクトリにgulpfile.jsを作成（ファイルの処理はJavaScriptで記述）
## 4 Sassのコンパイル、ベンダープレフィックスの付与
### 必要なプラグインのインストール
- Sassコンパイル

```sh
npm install gulp-sass --save-dev
```

- ベンダープレフィックスの付与

```sh
npm install autoprefixer --save-dev
npm install gulp-postcss --save-dev
```

※gridレイアウトに対応させるためにpostcssが必要
### gulpfile.jsへの記述

```js
gulp.task("sass", function() {
  return (
    gulp
        //SCSSファイルの取得
      .src("css/style.scss")
        //Sassのコンパイル
      .pipe(sass({outputStyle: "expanded"}))
        //ベンダープレフィックスの付与
      .pipe(
        postcss([
        autoprefixer({
        cascade:false,
        grid:true
        })
        ])
      )
        //cssファイルの書き出し
      .pipe(gulp.dest("css"))
  );
});
```

## 5 CSSの圧縮
### 必要なプラグインのインストール
- CSSの圧縮プラグイン

```sh
npm install gulp-clean-css --save-dev
```
※gulp-minify-cssは非推奨

- ファイル名のリネーム

```sh
npm install gulp-rename --save-dev
```
### gulpfile.jsへの記述

```js
gulp.task("cleancss", function(){
  return(
    gulp
        //CSSファイルの参照
      .src("css/style.css")
        //CSS圧縮の実行
      .pipe(cleancss())
        //ファイル名変換
      .pipe(rename({
        extname:'.min.css'
      }))
        //書き出し
      .pipe(gulp.dest("css"))
  );
});
```

## 6 watch（自動更新）

```js
gulp.task("watch",function(){
  return(
    gulp
    .watch("css/style.scss",gulp.series("sass","cleancss"))
  );
});
```

Sassのコンパイル→CSS圧縮の順に実行する。

## 7 タスクの実行処理
### gulpfile.jsへの記述

```js
gulp.task("default",gulp.task("watch"));
```

### コマンドプロンプトでの実行

```sh
npx gulp
```

## 8 別のディレクトリで使う場合
package.jsonとgulpfile.jsをコピペ
### コマンドプロンプトで次のコマンド実行

```sh
npm install
```
package.jsonに記述されたプラグインが作業ディレクトリにダウンロードされる。
文系新入社員が応用技術者試験に合格した勉強方法

# はじめに
　2019年春季応用情報技術者試験に合格したので、勉強方法をまとめてみました。

# スペック（勉強時）
　経済学部卒の2019年入社SEです。
　当時のITの入門知識程度は、１ヶ月のインターン研修で身につけていました。
　基本情報技術者は持っていません。

# 午前対策
　午前に関しては、とにかく過去問の繰り返しです！
　半分近くは過去問から出題されるためとにかく過去問演習を中心に対策していきます。
　午前の試験時間が足りなくて困ることはないと思うので、毎回通しでやるのではなくスキマ時間で少しずつ解いていけばいいと思います！
　
　私の場合は、10回分過去問を解いたあとに間違った問題を解けるまで解いていました。
　[応用情報技術者過去問道場](https://www.ap-siken.com/apkakomon.php)
　ユーザー登録すると間違った問題をあとから解けるのでおすすめです!
　
　最後に試験の前日に再度間違った問題のみ目を通しました。

# 午後対策
　午後に関しては11問の問題が出題され、その中から1問の必須問題に加え4問選択して解答します。
　出題分野は以下のとおりです。

　情報セキュリティ（必須）

　**ストラテジ系**
　経営戦略、情報戦略、戦略立案・コンサルティング技法

　**テクニカル系**
　プログラミング（アルゴリズム）
　システムアーキテクチャ
　ネットワーク
　データベース
　組込みシステム開発
　情報システム開発

　**マネジメント系**
　プロジェクトマネジメント
　ITサービスマネジメント
　システム監査

　どの問題を選択するかですが、時間がない方でも最低**5分野**以上は対策しておいたほうがいいと思います。
　選択基準は一通りすべての分野を１回ずつ解いてみて、自分にあった問題を選択してみてください。
　マネジメント系は国語の問題と言われているので、文系の方は選択してみてもいいかと思います。
　
　午後の対策ですが過去問を解いていきます。
　午前と違い同じ問題が出ることはないですが、同じような問題がよく出題されます！
　解説を読んでみて理解ができない（知識が足らない）場合は、参考書で勉強してみてください。
　[応用情報技術者 合格教本](https://www.amazon.co.jp/%E4%BB%A4%E5%92%8C02%E5%B9%B4%E3%80%90%E6%98%A5%E6%9C%9F%E3%80%91%E3%80%90%E7%A7%8B%E6%9C%9F%E3%80%91%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E5%90%88%E6%A0%BC%E6%95%99%E6%9C%AC-%E5%A4%A7%E6%BB%9D-%E3%81%BF%E3%82%84%E5%AD%90-ebook/dp/B0832DLZWH/ref=sr_1_5?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E5%BF%9C%E7%94%A8%E6%8A%80%E8%A1%93%E8%80%85+%E5%8F%82%E8%80%83%E6%9B%B8&qid=1589030543&sr=8-5)

　私の場合は、過去問題で試験時間ギリギリまで使っていたので、だいたい１問25分で解けるよう練習していました。

# 使用したテキスト、サイト
　[応用情報技術者 合格教本](https://www.amazon.co.jp/%E4%BB%A4%E5%92%8C02%E5%B9%B4%E3%80%90%E6%98%A5%E6%9C%9F%E3%80%91%E3%80%90%E7%A7%8B%E6%9C%9F%E3%80%91%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E5%90%88%E6%A0%BC%E6%95%99%E6%9C%AC-%E5%A4%A7%E6%BB%9D-%E3%81%BF%E3%82%84%E5%AD%90-ebook/dp/B0832DLZWH/ref=sr_1_5?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E5%BF%9C%E7%94%A8%E6%8A%80%E8%A1%93%E8%80%85+%E5%8F%82%E8%80%83%E6%9B%B8&qid=1589030543&sr=8-5)

　[応用情報技術者　午後問題の重点対策 (重点対策シリーズ)](https://www.amazon.co.jp/%EF%BC%92%EF%BC%90%EF%BC%92%EF%BC%90-%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E5%8D%88%E5%BE%8C%E5%95%8F%E9%A1%8C%E3%81%AE%E9%87%8D%E7%82%B9%E5%AF%BE%E7%AD%96-%E9%87%8D%E7%82%B9%E5%AF%BE%E7%AD%96%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E5%B0%8F%E5%8F%A3%E9%81%94%E5%A4%AB/dp/4865751874)

　[応用情報技術者過去問道場](https://www.ap-siken.com/apkakomon.php)
# 最後に
　応用情報技術者に合格して1年近く経ちます。
　勉強した知識は役に立っていますが、絶対に必要かと言われれば必要ではないと感じています。。。
　ただ、私のような文系出身の方は基礎知識を身につけるいい機会でした。
　
　余談ですが、合格したときに成績をPDF出力しておいてください！
　私は、照会できなくて何点合格だったかわかりません。。。
　
　現在は試験が中止となりましたが、次回の試験に向けて少しでもお役に立てれば幸いです。
MPIをCMakeでリンク

#拝啓
本質でないところで苦労している人のために

#概要
MPIのライブラリのリンクについての記事があまり期待できたものでなかった(自分にとって)ので自身のものを共有しときます。

```cmake
cmake_minimum_required(VERSION 3.9)
project(MYTARGET1 CXX)

find_package(MYTARGET1 REQUIRED)

add_definitions(-DOMPI_SKIP_MPICXX)

add_library(MYTARGET1 SHARED Test1.cpp)
target_link_libraries(MYTARGET1 PUBLIC MPI::MPI_CXX)

add_executable(MYTARGET2 Test2.cpp)

target_link_libraries(MYTARGET2 BLAU)
```
AWS 基礎

#前提
AWSについて学んだことを書いていきます

#本題

##プライベートサブネット


-u
ログインするユーザー名の指定

-p
パスワード入力を求められる



##プロコトルとは
コンピュータ同士がネットワークを利用して、通信するために決められた約束ごと

###プロコトルの例
HTTP
TCP
UDP
IP
SMTP
IPX

###必要性
・メーカーやOSが違うコンピュータ同士が通信するためには、同じ仕様でやり取りする必要だがある
プロコトルがあり、同じプロトコルを使用するという同意があるからこそ様々なコンピュータ同士が通信できる

##TCP/IPとは
TCP・IPを中心として、インターネットを構築する上で必要なプロトコル群の総称。インターネットを運用するために開発された

###アプリケーション層
アプリケーション同士が会話する
HTTP、DSN、SSH、SMTP

###トランスポート層
データの転送を制御する
TCP、UDP

###ネットワーク層
IPアドレスを管理し、経路選択する
IP、ICMP、ARP

###ネットワークスインターフェース層
直接接続された機器同士で通信する
Ethernet、PPP

##HTTPとは
・インタネットでHTMLなどのコンテンツの送受信に用いられる通信の約束ごと
・クライアントがHTTPリクエストを送り、それに対してサーバーがHTTPレスポンスを返す
そのリクエスト・レスポンスの書き方がHTTPの正体

##HTTPリクエストの中身
リクエストライン、ヘッダー、ボディから構成される

###リクエストライン
GET/HTTP/1.1


###ヘッダー
Host:example.com
User-Agent:Mozilla/5.0
Accept-Encoding:gzip, deflate
Connection:keep-alive

###ボディ
特になし（オプション）



##HTTPレスポンスの中身
ステータスライン、ヘッダー、ボディから構成される

###ステータスライン
HTTP/1.1 200 OK
HTTPの結果の成否を返すもの
200 成功
300 リダイレクトするとき
400　クライアント側に問題
500 サーバー側に問題

###ヘッダー
Date:Fri,28 Jun 2019 01:09:23 GMT
Content-Type:text/html; charset=UTF-8
Cache-Control:max-age=604800
Last-Modified:Fri, 09 Aug 2013 23:54:35 GMT

###ボディ
<!doctype html>
<html>
・・・
</html>

##トランスポート層のプロトコル
代表的なプロトコルがTCPとUDP
通信の特性により使い分ける

###TCP
・信頼性のある通信を提供
・信頼性を保つために、送信するパケットの順序制御や再送制御を行う
・信頼性のある通信を実現する必要がある場合に使用する

###UDP
・信頼性のない通信
・送信するだけで、パケットが届いたかは保証しない
・高速性やリアルタイム性を重視する通信で使用する

##UDP
コネクションレスな通信

###特徴
・アプリケーションから送信要求のあったデータをそのままネットワークに流す
・パケットが届かなくても再送制御はしない、パケットの到着順序が入れ替わっても直せない
・コネクションレスなのでいつでもデータを送信できる
・プロトコルの処理も簡単なため高速

###向いている用途
・動画や電話など、即時性が必要な通信
・そうパケット数が少ない通信（DNSなど）
・特定のネットワークに限定したアプリケーションの通信

##TCP
通信を制御するプロトコル
データの到着確認や、コネクション管理を行う

###データの到達確認
・送信したデータが届いたかを確認する
・届いていなければ再送する
・確認応答とシーケンス番号を使用することで、再送制御などを行う

###コネクション管理
・通信相手との間で通信を始める準備をしてから通信を行う
・コネクション指向の通信を提供する

##IPの役割1 IPアドレス
IPの役割はIPアドレス、終点コンピュータまでのパケット配送（ルーティング）、パケットの分割・再構築処理の3つ

###IPアドレス
・ネットワーク上で、通信を行う宛先を識別するのに使われるのがIPアドレス
・IPアドレスを元にしてパケットが配送される


##IPの役割2 ルーティング
###ルーティング
・宛先IPアドレスのコンピュータまでパケットを届ける役割
・それぞれの区間ごとにルーターがIPパケットを転送し、それを繰り返して最終的な宛先コンピュータまでパケットが辿り着く


##IPの役割3 パケットの分割・再構築処理

###分割・再構築
・ネットワークインターフェース層のプロトコルによって、最大転送単位が異なる
・IPでは、各ネットワークインターフェースの最大転送単位より小さくなるようにパケットを分割して送信し、終点コンピュータで再構築する


##インフラ設計における重要な観点
###可用性
サービスを継続的に利用できるか
稼働率、目標復旧時間、災害対策

###性能・拡張性
システムの性能が十分で将来的においても拡張しやすいか
性能目標、拡張性

###運用・保守性
運用と保守がしやすいか
運用時間、バックアップ、運用監視、メンテナンス

###セキュリティ
情報が安全に守られているか
資産の公開範囲、ガイドライン、情報漏洩対策

###移行性
現行システムを他のシステムに移行しやすくなっているか
移行方式の規定、設備・データ、移行スケジュール

##S3に画像保存する理由

###Webサーバーのストレージが画像で一杯になるのを防ぐ

###HTMLへのアクセスと画像へのアクセスを分けることで負荷分散する

###サーバーの台数を増やしやすくする
・Webサーバー上に画像が保存されていると、Webサーバーの台数を増やした時に、画像を同期する必要があり、スケールアウトが難しい
・画像の保存場所は分離されていた方がWebサーバーの台数を簡単に増やすことができる

###コンテンツ配信サービスから配信することで、画像配信を高速化できる

##S3とは
安価で耐久性の高いAWSのクラウドストレージサービス
###特徴
・0.023USD/GB・月と安価、1GB約3円/月
・99.999999999%の高い耐久性
・容量無制限、１ファイル最大５TBまで
・バケットやオブジェクトに対してアクセス制限を設定できる

###概念
・バケット
オブジェクトの保存場所、名前はグローバルでユニークな必要あり
・オブジェクト
データ本体、S3に格納されるファイルでURLが付与される
バケット内オブジェクト数は無制限
・キー
オブジェクトの格納URLパス

##S3のよくある利用シーン
・静的コンテンツの配信
img画像はS3から配信する

・バッチ連携用ファイル置き場
S3にファイルを置いて、バッチでそのファイルを参照して処理を行う

・静的ウェブホスティング
静的なウェブサイト（ランディングページなど）をS3から公開する
Psycopg2でPostgreSQLを操作するときのトランザクションについて


Psycopg2の基本的な使い方と、トランザクションについて新たに学んだ点をまとめてみた。

# 環境
Psycopg2 : 2.8.4
Heroku : 0.1.4
python : 3.7.4


# Psycopg2でDBに接続してSQL文を実行する
psycopg2に関しては公式ドキュメントに全て書いてある。
https://www.psycopg.org/docs/usage.html#transactions-control

以下は最低これだけわかれば良いというやつ。簡単だね～。

```python:psycopg2.py
# まず、connect関数でDBと接続されたconnectionインスタンスを生成する
conn = psycopg2.connect(DATABASE_URL)

# そしてconnectionインスタンスのcursorメソッドで、sql文を実行できるcursorインスタンスを生成する
cursor = conn.cursor()

# INSERTとかDELETEとかする場合はexecuteした後、commitしてDBに反映させる
cursor.execute("実行したいsql文")
conn.commit()

# SELECTしたらexecuteした後、fetchoneかfetchallかfetchmanyで取得する
cursor.execute("実行したいsql文")
data = cursor.fetchall()
cursor.close() #こちらは忘れずにクローズ

# 最後に接続を切る
conn.close()
```
# 注意すること
sql文を実行したら必ず`cursor`を`close`か`commit`すること。
`commit`しても自動で`cursor`が`close`される。

すなわち、INSERTとかの実行後は必ず`conn.commit()`し、SELECTしたら`fetch`した後必ず`cursor.close()`する。

ドキュメントによると、sql文が実行(execute)されたときにトランザクションなるものが作成されるらしい。これは`connectionクラス`で処理される。`cursor`が`close`されるとトランザクションが終了する。

既に実行されているトランザクションが`close`する前に別のsql文が実行された場合、そのsql文は同じトランザクションで実行される（新たにトランザクションが作成されるわけではない）

つまり、トランザクションをきちんと終了しない(`cursor`を`close`しない)と同じトランザクションで永遠とsql文が実行され続けることになる。これが恐ろしいことに、トランザクションの中で一度エラーが発生すると、そのトランザクションが終了するまで永遠とエラーにトラップされ、次のsql文が実行できなくなってしまうのだ。

だからsql文を実行するたびに`cursor`は`close`しよう。

# closeを忘れそうなあなたにwith文
with文を使うとこんな感じ。
with文中での処理が終わると勝手に`commit`までしてくれる優れもの。
ちなみにSELECTを実行した後に`commit`しても特に問題は無いよう。
つまりとりま`commit`しとけってことか。

```python:connect.py
import psycopg2

DATABASE_URL = os.environ.get('DATABASE_URL')
SQL = "select * from table名"

with psycopg2.connect(DABASE_URL) as conn:
    with conn.cursor() as curs:
        curs.execute(SQL)
        result = curs.fetchall()
# resultに検索結果がリストで格納される


```
ちなみにwithで`cursor`は`close`しても`connection`は繋がりっぱなしらしいので注意。
~~（つなぎっぱなしで何が悪いんだろう...）~~
**2024/06/24 更新 :** DBとの接続は処理負荷が高い。`connection`をプールしておくことで、次のトランザクションを素早く行えるようになっている。　コネクションプール側で同時最大接続数なども管理しているため、適切に`connection`を切りましょう。
参考: https://qiita.com/hiroshi-ishihara/items/449eb120fece242f1a0d

# with文は使いたくないあなたへ autocommitモード

`connectionインスタンス`の`set_sessionメソッド`で、すぐ次のsql文の実行を制御できる。
`autocommitモード`にすると実行後に勝手にcommitしてくれる。ありがとう。
`readonryモード`にするとINSERTやDELETEなどできなくなる。

詳しくは[公式ドキュメント](https://www.psycopg.org/docs/connection.html#connection.set_session)で

```python:connect.py
import psycopg2

DATABASE_URL = os.environ.get('DATABASE_URL')
SQL = "select * from table名"

# cursorインスタンスを生成するとこまではいつも通り
conn = psycopg2.connect(DATABASE_URL)
cursor = conn.cursor()

# 次のexecuteに対する設定ができる 
conn.set_session(readonly=True, autocommit=True)

# 普通に実行してもその後勝手にcommitされる～～
self.cursor.execute (sql)
```
こちらも`conn.close()`しない限り接続しっぱなし。
同じタグにイベントを追加する方法

同じタグにイベントを追加する方法について、jQueryで書く場合とJSで書く場合の違いのメモ

## jQuery
```js
$(function(){
  $('li').click(function(){
    let name = $(this).attr('class');
    alert(name);
  })
})
```

## JavaScript
```js
const tagName = document.getElementsByTagName('li');
//tagNameには配列が返ってくる。

for (let i = 0; i < 3; i++){
  tagName[i].addEventListener('click',function(){
    alert(tagName[i].className);
  })
}
```
PMP試験のプロセス群ごとの問題数について

# PMP試験のプロセス群ごとの問題数
プロセス群ごとの問題数がわかれば効率よく対策ができる！

## どこに載ってるの？
[Project Management Professional (PMP) Examination Content Outline(公開)](https://www.pmi.org/-/media/pmi/documents/public/pdf/certifications/project-management-professional-exam-outline.pdf) の３ページ目に載っているぞ！




|プロセス群|配分|問題数|プロセス数|
|:--|:--|:--|:--|
|Initiating Phase 立ち上げ|13%|26問|2プロセス|
|Planning Phase 計画|24%|48問|24プロセス|
|Executing Phase 実行|31%|62問|8プロセス|
|Monitor and Controlling Phase 監視と制御|25%|50問|11プロセス|
|Closing Phase クロージング|7%|14問|2プロセス|

# 対策優先度
この優先度で対策すると効率が良いぞ！

1. Executing
- Initiating
- Closing
- Monitoring and Controlling
- Planning

----

よかったよかった
Amazon Rekognitionでローカルファイルの画像からテキストを検出してみた

# やったこと
- Amazon Rekognitionでローカルファイルの画像からテキストを検出
- rubyで叩いた

# ここで書かないこと
- rubyで叩くようにするまでの準備(アカウント作る〜SDKインストール)

# ソースと画像を用意
## 画像
こんなのを用意

text.png
![text.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97052/6799234a-f1b1-d2fe-3f34-956a31b33d65.png)

## ソース
基本的に公式ドキュメントに叩き方の例はのっているのでそこを参考にした
(リージョンは~/.aws/configに設定)

get_text.rb

```ruby:
require 'aws-sdk-rekognition'

credentials = Aws::Credentials.new(
   'xxxxxxxxxxxxx',
   'xxxxxxxxxxxxxx'
)
client   = Aws::Rekognition::Client.new credentials: credentials
photo = 'text.png'
path = File.expand_path(photo)
file = File.read(path)

attrs = {
  image: {
    bytes: file
  },
}
response = client.detect_text attrs

response.text_detections.select! { |text| text.type == 'LINE' }
response.text_detections.each do |text|
  p text.detected_text
end
```

## 実行結果
```
$ ruby get_text.rb
"ABCDE"
"12345"
"EGHT]"
"6789"
```

取れたー

## 補足
`text_detections`には検出した行と単語を入れてくれるらしく、今回の画像だと行として"ABCDE"が入っているのと同時に単語として"ABCDE"が入っていた。
(selectでLINEだけにしているのはそのため)

なので英語の文章の画像を用意してみる
![word.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97052/b1c0bb63-016e-b0f3-b7c1-8250d6971464.png)

レスポンス表示を少し変えて

```ruby:
response = client.detect_text attrs

response.text_detections.each do |text|
  p "type:#{text.type} text:#{text.detected_text}"
end
```

実行してみるとこんな感じ

```
$ ruby get_text.rb
"type:LINE text:Hello World!"
"type:LINE text:This is a pen"
"type:WORD text:Hello"
"type:WORD text:World!"
"type:WORD text:This"
"type:WORD text:is"
"type:WORD text:a"
"type:WORD text:pen"
```

お手軽ですごい！
VScodeでSpring Bootプロジェクトを作成したらBuild path specifies execution environment JavaSE-1.8. There are no JREs installed in the workspace that are strictly compatible with this environment. と表示された

##開発環境

・ホストOS: Windows10 Home ビルド19619
・ゲストOS: WSL2 Ubuntu20.04 LTS
・VScode ver 1.45.0
・openJDK 11.0.7
・Spring 2.2.7
・Maven 3.6.3

##発生したエラー

・VScodeでSpringプロジェクトを作成したところ、以下のエラー(警告)が発生した

```
Build path specifies execution environment JavaSE-1.8. There are no JREs installed in the workspace that are strictly compatible with this environment. 
```

```
The compiler compliance specified is 1.8 but a JRE 11 is used
```

どうやら本来はJavaSE-1.8であるべきなのに11を使っているのが原因のよう。


##解決法

pom.xmlを編集してJavaのバージョンを変更する。
具体的にはpom.xmlの17~20行目あたりに記載している下記のコード

```xml 
<properties>
  <java.version>1.8</java.version>
</properties>
```

を次のように変更する

```xml

<properties>
  <java.version>11</java.version>
</properties>
```

これで警告が表示されなくなった。

また、[Mavenの公式ドキュメント](https://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html)によると次のように書いても同じようにエラーを解消できるとのこと。(試してはいないが)

```xml

<project>
  [...]
  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
  [...]
</project>
```

というかデフォルトのjava.versionを今使っているJavaのバージョンに合わせてくれてもいいような・・・
うまく設定する方法があるか調べてみたい。

##参考資料

[diki-kezuka’s diary様](https://kezudai.hatenablog.com/entry/2019/03/07/133119)
[Mavenの公式ドキュメント](https://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html)
Gitの共同開発

###Gitの共同開発の流れ
①コードの変更(追加)
②共有の準備
③共有
###準備
Gitを共有するためにまずはターミナルで

```
git init
```
を実行します。
次に、共有したいファイルを選択します。
ターミナルで

```
git add ファイル名
```
で選択できます。
【例】

```
git add index.html
```
次に、選択したファイルをメッセージ付きで記録します。
ターミナル

```
git commit -m "メッセージ"
```
を実行します。
【例】

```
git commit -m "create index.thml"
```
上記みたいな感じでメッセージはわかりやすくしましょう。
ここまでで②の共有の準備は終わりました。
####リモート
Gitでは「リモート」という共有ファイルの置き場として使います。
例えばAさんがリモートにファイルをアップロードし、Bさんがリモートからファイルをダウンロードすることで、開発者同士がファイルを共有することができます。
リモートにアップロードするにはそのリモートのURLを登録する必要があります。
リモートを登録する際には名前を付ける必要があり、一般的には「origin」とすることが多いらしいです。
ターミナル

```
git remote add リモート名 URL 
```
でリモート登録ができます。
【例】

```
git remote add origin https://xxxx.com/yyyy.git
```
上記のように登録します。
次は、リモートにファイルをアップロードします。
例えばAさんがファイルをアップロードする場合
ターミナル

```
git push リモート名 master
```
とすることで、先ほど登録したリモートにアップロードすることができます。
このアップロードを**プッシュ**と言います。
次は、AさんがプッシュしてくれたファイルをBさんがダウンロードするとします。
リモートからファイルをダウンロードする場合
ターミナル

```
git pull リモート名 master
```
でダウンロードできます。これを**プル**と言います。
簡単に言えばここまでの作業で一周です。
add=>commit=>push=>pull=>add
PCからハードウェアを触ろう~Microchip MCP2221AでI2C・GPIOを使う

# MCP2221Aとは
MCP2221Aというチップをご存じだろうか？
PCからUART、GPIO,I2Cが使えるUSB-to-UART/I²Cコンバータである。

https://www.microchip.com/wwwproducts/en/MCP2221A

# PCからデバイスをコントロール
これを使って何が出来るの？
PCからI2CやGPIOを動かせるんです。
そういっても多くの人は、チンプンカンプンかと思いますが、PCからI2Cのセンサーデータを見たいことはありませんか？
例えばLEDを点灯させたり
そのためには、マイコンを使うのが一番楽ですが、ファームを書く必要があります。
MCP221は、USB接続で、Microchip社のアプリケーション、Python、VisualStudioのプログラムでコントロール可能です。

# アプリ・ライブラリ類
## MicroChip Win,Linux,Android Terminal etc・・・

https://www.microchip.com/wwwproducts/en/MCP2221A

## Pythonライブラリ
Pythonライブラリも用意されている。（元秋月電子の北神博士）

https://github.com/nonNoise/PyMCP2221A/blob/master/README_JP.rst

## VisualStudio　「GROVE対応シリーズ活用BOOK」
さらに同人誌「GROVE対応シリーズ活用BOOK」が配布されています。

https://drive.google.com/drive/u/0/folders/16LStrVKNun6Ml5n7rZguF26JjCVCnChb

# Breakout board
###  ・Microchip 純正 
#### USB-UART ブレークアウトモジュール for MCP2221 ADM00559
https://www.microchip.com/developmenttools/ProductDetails/PartNO/ADM00559

### ・みんなのラボ社
##### USB-I2CブリッジボードV1
##### USB-I2CブリッジボードV2(GROVE対応版)
##### USB-I2CブリッジボードV2(ブレッドボード対応版)
##### USB-I2CブリッジボードV2 (GROVE対応USBドングル版)
http://www.wakanyan.net/product/pro_USB-I2C_BRIDGEBOARD-V2-GROVE/pro_USB-I2C_BRIDGEBOARD-V2-GROVE.html

# 工作キットを作りました
今回、極小か、工作キットかと検討した結果、MCP221の工作キット作ってみました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/bba75318-f91e-03f1-be1e-ed25aec2e496.jpeg" width="500"  />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/e649a605-08a5-fb3f-1d9b-f8c7170e0a47.jpeg" width="500"  />
完成後は、アプリケーションを作って、スイッチや、LED,I2CデバイスをWindowsから使う事が可能です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/0a117810-7b57-1c07-ef9f-4b7c0c49be04.jpeg" width="500"  />
完成品が良い人は、みんなのラボのボードがお勧めです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c3a463ca-11e4-c9c0-bb34-bd35929f2cbf.jpeg" width="500"  />
Automation Anywhere A2019 Control Room API に関する情報

Automation Anywhere A2019 では、Control Room APIというREST APIを使って、他のアプリケーションからRPAを操作できるようになっています。仕様書については、まだ英語しかありません。製品ドキュメントでは以下の場所に公開されています。

* [Enterprise Control Room API](https://docs.automationanywhere.com/bundle/enterprise-v2019/page/enterprise-cloud/topics/control-room/control-room-api/cloud-control-room-apis.html?_LANG=jpjp) - 製品ドキュメント

実際の実装は、Control Room上でSwagger UIで見ることができます。フリートライアルとCommunity Editionでは、以下のURLでAPIの実装を閲覧できます。

* フリートライアル: https://trial.cloud.automationanywhere.digital/swagger/
* Community Edition: https://community.cloud.automationanywhere.digital/swagger/

Swagger UIで以下のように一覧が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/0b420151-2512-306e-4d7f-8675b6a4c75e.png)

それぞれのAPIをクリックすると、詳細が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/dfdb01fb-f9a0-5d4f-e5fa-c6ef042b4982.png)

2020年5月8日時点では、製品ドキュメントに記載されている11種類のAPIのうち、Bot Lifecycle Management APIだけが未実装のようである。これはBotのインポート/エクスポートをAPIを介してできるようにするもので、ブログ記事『[Enterprise A2019 Update: Clone Bots, Bot Import/Export, and More](https://www.automationanywhere.com/company/blog/product-insights/enterprise-a2019-update-clone-bots-bot-import-export-and-more)』によると、Community EditionでもAPIを通してBotのインポート/エクスポートが可能になるとのことで、一刻も早い実装を待ちたいところです。

>公式ブログ『[Enterprise A2019 Update: Clone Bots, Bot Import/Export, and More](https://www.automationanywhere.com/company/blog/product-insights/enterprise-a2019-update-clone-bots-bot-import-export-and-more)』より引用
>
>**Bot Import/Export — CI/CD foundation**
With the Bot Import/Export feature, Enterprise users are now able to execute export/import functionality via API. This is key for continuous integration/continuous deployment (CI/CD) pipeline integration. Users are also able to import bots into Test/Prod environments without bot editor licenses in these environments. 
>
>Note: This also allows Community Edition users the ability to export bots so they can be imported into their Enterprise environments (see Figure 2).
>
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/c8a0af98-794e-24f3-e9bc-d299ad034d66.png)
>**Figure 2.** The Bot Import/Export feature in Enterprise A2019 ensures continuous integration/continuous deployment by letting users export and import bot functionality.

<font color="Red">**2020年7月12日追記:** A2019.13 (.14) 以降、BLM API が実装され、Community Edition/フリートライアルでもAPIの口が開きましたが、試してみたところ、権限がなくエクスポートできませんでした。Community EditionはUIではインポートが可能になりましたが、APIでもインポートのみが可能です。Community Edition/フリートライアルのユーザーにはそれ以上の権限が与えられていないので、API経由でも引き続きエポスポートはできません。詳細は『[Automation Anywhere A2019でAPI経由のBotインポート/エクスポートを行う](https://qiita.com/RPAbot/items/bacd0484dca7d42cd77c)』にまとめました。</font>
ロリポップサーバーに独自ドメインを設定してみる

自分が個人的に記録づけのためにやってるダイエットブログに、
せっかくなんで、独自ドメインと無料のSSLを設定してみることにしました


## ネームサーバーの変更（お名前.com　ドメインnavi）
ネームサーバー設定画面を開きます

ネームーサーバーの選択を「その他」にタブを切り替え、「その他のネームサーバーを使う」を選択します。
設定したいサーバーの情報を入力し保存してください

※ロリポップの場合は、こちらの[プライマリネームサーバー]と[セカンダリネームサーバー]になります
https://lolipop.jp/manual/user/chg-plan/
>uns01.lolipop.jp [プライマリネームサーバー]
uns02.lolipop.jp [セカンダリネームサーバー]

<img width="843" alt="スクリーンショット 2020-05-03 20.45.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276326/2b9924dc-da4e-acbf-9427-f04dfb9fc78e.png">

## 独自ドメインを設定　ロリポップ編集画面
独自ドメイン設定の「独自ドメインをロリポップ！に設定する」の欄に取得したドメインを設定します
公開用フォルダは設定したいフォルダ名で、これによって複数ドメインを設定することができるんですね

<img width="725" alt="スクリーンショット 2020-05-09 21.23.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276326/51c59003-ec58-b627-70cb-a6e3c2031c7a.png">

ついでに、設定してから反映されるまで、時間がかかることがあります。
次の日など時間を置いて反映するのがいいです



## 無料独自SSLを設定　ロリポップ編集画面
Let's Encryptという無料SSLがあるのですが、ロリポップでも簡単に設定することができます。

SSLに画面に移動して「無料独自SSLを設定する」を選択します
<img width="698" alt="スクリーンショット 2020-05-03 20.51.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276326/c01b13aa-0765-3c4a-796b-80332106d3f5.png">

設定しているドメイン一覧がでてきますので、設定したいドメイン横の「独自SSL（無料）を設定する」を選択して設定することができます。
<img width="743" alt="スクリーンショット 2020-05-04 0.38.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276326/9f653eaf-901a-7b59-efbd-e1ba4eda924b.png">



結構簡単にできました！
これで晴れて独自ドメインSSL付きのブログ公開することができたーよかった！
GCPのConsoleの読み込みが遅いときの解決方法

## はじめに
MacBookのChromeからGCPのConsoleにアクセスした時と、UbuntuのChromeからアクセスした際に読み込み時間の差を感じました（Ubuntuの読み込みが遅い気がした）
なんとかできないかと思い、調べました。

## 解決方法
Chromeの設定の「ハードウェア アクセラレーションが使用可能な場合は使用する」を無効にする。
今回の検証ではハード依存のところが多いかも？みたいな感じになったので、この解決法が当てはまらない人もいると思います。

## 検証環境
- ThinkPad X1 Carbon 2018
 - RAM:16GB
 - CPU:Core i7-8550U
- Ubuntu 20.04
- Goocle Chrome
 - バージョン: 81.0.4044.138（Official Build） （64 ビット）

## 検証
### Chrome DevToolsを使って速度を確認する
- オプション有効
![use_option_devtool.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495517/3d05de13-bcd8-a847-fac6-67e8dae74b87.png)

- オプション無効
![no_use_option_devtool.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495517/e6d21462-b784-7748-260e-43fc9e452faf.png)

有効化されていると遅くなってる。。。
※画面読み込みを待たないで操作することが多いので体感だとここまで大きな差は感じない

### GPUの使用率を見てみる
GPU使用率を見るために下記コマンドでツールをインストール

```bash
sudo apt install intel-gpu-tools
```

- オプション有効
![use_option_gpu_top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495517/caf3a2bf-5ecf-bca0-de71-2f0e2f4687b9.png)

- オプション無効
![no_use_option_gpu_top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495517/414312a6-8945-a3fd-e72a-29d5e08d6561.png)

手を抜いてtopコマンドでスクショしたので最高値ではないですが許して。。。
だいたいここらへんをウロウロしてる感じです。
内蔵GPUの性能が足りなくて有効化すると逆に足を引っ張ってる感じなのかな？

## おまけ
### MacBookの読み込み速度
#### 検証環境
- MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)
 - CPU:2.3GHz デュアルコアintel Core i5
 - メモリ:16GB
- Goocle Chrome
 - バージョン: 81.0.4044.138（Official Build） （64 ビット）

#### 検証
- オプション有効
<img width="329" alt="use_option_mac.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495517/bc589ec1-17a3-9b22-b75c-640caa9d8f8d.png">

- オプション無効
<img width="304" alt="no_use_option_mac.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495517/31eae378-0258-0ae6-a9c2-0082339bec3a.png">