OmniAICreator/Qiita-1.07M huggingface dataset:
効率化や自動化できる種類の仕事について（社内ハッカソンにあたり考えたこと）

# これは何
M&Aクラウドでは先日社内ハッカソンを行いました。
初回のテーマは「チームの業務効率化」でした。各エンジニアが社内の他の（営業やCSなど）チームに潜り込んで、そのチームの業務を効率化しようという試みです。

このハッカソンにあたり、他部署の業務を効率化するという視点をもつ時に、どういう業務が効率化・自動化できるのだろうか？というのを自分なりの考えをまとめましたので共有します。


# そもそも効率化とは？

* 効率化とは、生産性をあげること
* 生産性 = 欲しいアウトプット ÷ 時間や金など投入資源
* 生産量 ≠ 生産性
* 生産性をあげるには
    * 欲しい出力を明確化する
    * インプットを減らす
* 生産**量**はインプットを単に増やせばあげられるが、生産性は下がる
* インプットを下げる = 生産性をあげる
* ハッカソンにおいては、投入する時間資源を節約して生産性をあげよう！ という趣旨だと理解。時間資源の節約のためにITの力を借りる。


# 効率化・自動化できる業務の種類

### データ視点
* **データがコンピュータの中に存在するもの**
* 即座に定型化されたデータとして置くことができるもの
* 今は定型化されたデータとして置かれていないが、ある程度の些末な情報を落としてモデル化することができるデータ


### 処理視点
* **データ処理のルールが定型化されているもの**。曖昧さが入り込む余地がない
* 処理のルールが定型化されていないが、必要性の薄い処理をやめるなどして重要な処理だけ定型化できるもの　
* 大きな業務を分割して、小さな業務の一部だけ処理定型化できるもの

# コスパの良い自動化・効率化
### 工数の面で効率化コスパがよくなる傾向があるもの
あくまで傾向。

* 一つのシステムの中で完結するもの
    * salesforce の中だけや、macloud.jp の中だけ
    * システム内の処理が複雑であれば実装が非効率であることも。ただ、処理が複雑になるのは、あるべき処理を正しくモデル化できていないケースもあるかも？
* 複数のシステムにまたがるが、その連携が定型化されているもの
    * macloud -> slack や、gmail -> slack 
    * excel -> redash 
    * NoCodeツールで連携できるもの

### 自動化の影響が大きいもの
* 人間が同一の処理を複数回、長時間かけて行なっているもの

### 自動化の影響が少ないもの
ショートカットを覚えるなどして処理の一部を効率化するほうが効率が良い。

* 色々な業務の中で現れる作業だがあまりに短時間
    * 例
        * ブラウザを開いて検索窓にワードを入れて検索、終わったら閉じる => 全てショートカットがあるので一連のショートカットをまとめて覚える
        * slack の特定のチャンネルに行って発言する => 同上

# 自動化できない？

### 自動化できないもの

* 定型化できない業務
    * 直感に頼っている
    * 色々な人の異なる判断基準の元でデータが処理され送信されている

本当に自動化できないのか？
もし以下のように組み替えたらデータと処理を定型化できるかもしれない

* 直感に頼っている => 直感に元となるデータと判断基準を明文化・数式化する
* 色々な人の異なる判断基準の元でデータが処理され送信されている => 同じ判断基準に揃えることはできないか？ 

### 一部だけ自動化するという考え方

* 大きなタスクのうち、人間の判断が発生するところだけ人力にする
    * 例： 企業価値算定 =>  業界の取得、類似企業の選択、財務情報の比較、メール文面構築 などは自動化できるかもしれない。「一方で複数企業が絶対に欲しいか？相場の壁を超えられるか」みたいな直感に近いところはデータ作成が自動化しづらいのでそこだけ人間がデータ入力して、あとは最終成果物が勝手にできるようにする

### 組織として検証中で運用すると決まっていないもの

* 基本的に自動化しないほうが良い
* 自動化することは工数が高く、その後運用するかどうかわかっていないものを自動化頑張ってやっても使わなくなる可能性が高いため
* ただし、自動でのみ成り立つ施策などはその限りではない
    * 例） 特定の膨大なデータをWeb上から引っ張ってきて整理して、それを判断に使う。膨大なデータをWeb上から引っ張って処理するのは人間には不可能なため

# 自動化・効率化のヒントになる言葉など

* 「いつも俺おんなじことしてね？」
* 「最近成長してない」
* 「いつもここでミスる」
* 「もっと手が早く動かせれば」
* 「あとインターンでも一人いたら楽なんだけど」
* 「腕が4本あったらなあ」
* 「こんなタスクばかりやっていても成長できない」
* 「そんなの新人にやらせておけよ」
* 「だるいので誰かやってよ」
* 「やる人をくじ引きで決めよう」
OpenAPIってなんだろう

##はじめに
エンジニアインターンをして約3ヶ月が経とうとしています。
先日の業務でOpenAPIに初めて触れたので、OpenAPIとは何なのか、使い方等を見返せるようメモしていきたいと思います。

##そもそもOpenAPIとは
あるサイトにこう書かれていました。
>OpenAPIは、いわゆる「Web API」の仕様を形式的に記述するためのフォーマット

もう少し噛み砕くと、「バックエンドがまだ終わってない(タスクが未完)時にフロントエンドだけで実装(挙動)を確認するためのもの」です。

あたかも、バックからデータが返ってきているかのように見せることができます。実際はopenapi.yamlにゴリゴリ書かれているだけですが...

##OpenAPIのいじり方
**前提条件**
**localhostの番号はdocker-compose.ymlに書いてあるのでそこを参照** 
**Swagger UIですがdockerイメージを使用しています**

1 envファイルを開き、NEXT_PUBLIC_API_SERVER_URL=https:~をNEXT_PUBLIC_API_SERVER_URL=http://localhost:9003 に変更する。

2 http://localhost:3000 で検索するとOpenAPIのexampleで作られたもののみで構成されたものが表示される。

3 直接openapi.yamlに記述するのではなく、Swagger UIというソフトウェアを使用。(http://localhost:9002/ を開いて編集する。(9002はswagger-editorのports番号を使用))
ちなみに、localhost:9001では記述はできないがswagger UIを見ることだけ可能

4 Swagger editorで編集したものをコピーして、openapi.yamlにペーストし、versionを1つあげる。(編集するたびにversionアップが必要です)
```version: "0.4.9" だったら version: "0.4.10"に変更
```
5 http://localhost:3000/ を開き検証>Network>1の順に確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648295/ffae60e6-5896-5791-5b8d-3924bab70e78.png)
dataを開いて、中にデータが入っていれば完璧！

##最後に
openAPIを触ったことで、ロジック部分も学びました。しかし、理解が追いつかなかったため前提知識としてDDD、クリーンアーキテクチャの理解が必要だと感じました。
楕円曲線暗号

応用情報技術者平成30年秋期 午前問37

楕円曲線暗号に関する記述のうち，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/2f3d894a-fc2f-b9fb-dea2-d3cf9d68808c.png)

１、楕円曲線暗号は、楕円曲線の点の演算を用いた**公開鍵暗号方式**です。楕円曲線によって定義された有限可群上の離散対数問題を解く際の計算量の多さを安全性の根拠とし、同じ強度を想定した場合、RSAより鍵長を短くできる利点があります。

・楕円曲線暗号はディジタル署名のアルゴリズム"ECDSA"として利用されています。
・認証及び鍵交換のアルゴリズムとしてTLSで利用されています。

２、RSAの説明
素因数分解問題の困難性を利用している。

・RSA
RSA暗号 - 公開鍵暗号の一種。ロナルド・リベスト (Ron Rivest) 、アディ・シャミア (Adi Shamir) 、レオナルド・エーデルマン (Len Adleman) の各姓から取った頭字語である。


ーーーーーーーーーーーーーーーーーーーーーー
補足

暗号方式のうち，共通鍵暗号方式はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/2936bd1a-3577-c816-5667-a63bf77922f9.png)

１、AES(Advanced Encryption Standard)は、
アメリカ合衆国の次世代暗号方式として規格化された共通鍵暗号方式です。
日本でも「電子政府推奨暗号リスト」に掲載されているほか、無線LANの暗号化規格WPA2の暗号化方式としても採用されています。

２、
・ElGamal暗号
　→×。ElGamal暗号は、非常に大きな数の離散対数問題を解くことが困難であることを利用した公開鍵暗号方式です。共通鍵を安全に共有する方法であるDiffie-Hellman法を暗号方式として応用したものです。

・RSA
　→×。RSAは、けた数の大きな数の素因数分解に膨大な時間がかかることを利用した公開鍵暗号方式です。

・楕円曲線暗号
　→×。楕円曲線暗号は、楕円曲線上の離散対数問題を解くことが困難であることを利用した公開鍵暗号方式です。

参照：

https://www.ap-siken.com/kakomon/28_haru/q37.html

https://www.ap-siken.com/kakomon/30_aki/q37.html

RSA
https://ja.wikipedia.org/wiki/RSA
IPA、JIPDEC、JPCERT/CC、NISC

応用情報技術者平成30年秋期 午前問36

サイバーセキュリティ基本法に基づき，内閣官房に設置された機関はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/e5b0af59-ef69-5256-e9f1-300185c7bf9a.png)

１、NISC(National center of Incident readiness and Strategy for Cybersecurity　内閣サイバーセキュリティセンター)は、内閣官房に設置され、情報セキュリティ政策に係る基本戦略の立案、官民における統一的、横断的な情報セキュリティ政策の推進に係る企画などを行う機関です。

サイバーセキュリティ基本法では、内閣への「サイバーセキュリティ戦略本部」の設置と行うべき事務を規定しており、その事務については内閣官房で処理することと定めています。この事務を行うために内閣官房に置かれている組織がNISCです。

２、独立行政法人情報処理推進機構（じょうほうしょりすいしんきこう、英: Information-technology Promotion Agency, Japan、略称：IPA）は、日本におけるIT国家戦略を技術面、人材面から支えるために設立された、経済産業省所管の中期目標管理法人たる独立行政法人である。

３、一般財団法人日本情報経済社会推進協会（にほんじょうほうけいざいしゃかいすいしんきょうかい、Japan Institute for Promotion of Digital Economy and Community　通称JIPDEC）は、一般財団法人。総務省および経済産業省共管の「財団法人日本情報処理開発協会」として設立され、公益法人制度改革に伴い、2011年4月1日に一般財団法人に移行するとともに名称も変更された。

or 
JIPDEC【Japan Information Processing Development Corporation】
日本情報処理開発協会の略。ISMS(情報セキュリティマネジメントシステム)適合性評価制度や、Pマーク(プライバシーマーク)を担う機関として知られている。

４、
JPCERT/CC（ジェーピーサート/シーシー[1]）は、「一般社団法人 JPCERTコーディネーションセンター[2]」の略称。 コンピュータセキュリティの情報を収集し、インシデント対応の支援、コンピュータセキュリティ関連情報の発信などを行う一般社団法人。



参照：

https://www.ap-siken.com/kakomon/30_aki/q36.html

JPCERT/CC
https://ja.wikipedia.org/wiki/JPCERT/CC

JIPDEC
https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E6%83%85%E5%A0%B1%E7%B5%8C%E6%B8%88%E7%A4%BE%E4%BC%9A%E6%8E%A8%E9%80%B2%E5%8D%94%E4%BC%9A
【QAエンジニア】について

#はじめに
未経験でIT業界へ。。
【QAエンジニア】について学んだことを自分の復習もかねて、まとめてみました。

#QAエンジニアとは？
普段私たちは、スマホやアプリなどを当たり前の様に使えていると思いますが
その**「当たり前」**を作り出していくのが、QAエンジニア。
主にソフトウェアの品質管理や品質を高める作業を担っています。

#QAとは？
QAとは**「Quality Assurance」**の略で、日本語では「品質保証」を意味します。

そのことから、QAエンジニアは**「品質管理エンジニア」**とも呼ばれ、ソフトウェアなどITサービスの品質を保つ上で、重要な役割を果たします。

#QAエンジニアの主な業務

主な業務は以下の通りです。

▶テスト設計

製品が正常に動作するか、想定した品質を保っているか確認するテストを行うために、どういったテストを実施するか、内容と流れを設計。

▶テスト実行

テスト設計で作成したテストケースに基づいて、テスト環境を使って検証を実施。

▶チームビルディング

テストチームの作業効率化、生産性向上、品質向上を目的に「仕組み」を設計し、実行。またチームメンバーのマネジメントや、マネジメントを通してのチームパフォーマンスの最大化。

▶サービス・仕様設計

開発段階で問題が発生しないよう、要件定義及び仕様検討段階からプロジェクトに参加し、サービス内容や仕様の品質向上を行う。

▶脆弱性診断

攻撃者の視点に立って、WEBアプリケーションの「脆弱性」を狙った攻撃が成功する可能性がないかを検証し、問題点を見つけ出す。

#QAエンジニアに必要なスキル

●テストに関する知識
●設計やプログラミングなど、開発に関する知識やスキル
●品質マネジメントに関する知識

#QAエンジニアに有効な資格

QAエンジニアとしての知識を得る、仕事をする際に有効な資格は以下の通りです。

**【JSTQB（Japan Software Testing Qualifications Board）】**
主催団体　一般財団法人日本科学技術連盟

ソフトウェアテスト技術者資格認定組織であるJSTQBが実施している認定資格。
テスト技術者としての知識や技術を持っていることを示す国際資格。

**【IT検証技術者認定試験（IVEC）】**
主催団体　一般社団法人IT検証産業協会

一般社団法人IT検証産業協会(IVIA)が認定するテストエンジニアの資格試験。

#まとめ
まだまだ知識が薄く内容も濃くはありませんが、今ある知識で簡潔にまとめた記事になります。
iPhoneX系の画面の下のバー(Home Indicator)を非表示にする方法

![IMG_7320.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678249/7f3ed0f7-4475-9290-c9fa-bf79043d7c2e.png)

画面の下にいつもいるバー
Home Indicatorという名前です。
iPhoneXが発売されて数年、私は知りませんでした。
全画面でコンテンツを表示したい時にこのバーだけ表示されてしまっていると見た目が悪いですよね。

但し常に非表示にしておくということはできませんが操作をしていない場合に非表示になってくれる実装方法があります。

非表示にしたいViewControllerに以下の一行を追加します。

```ViewController.swift
override var prefersHomeIndicatorAutoHidden: Bool { true }
```

公式ドキュメント:
[prefersHomeIndicatorAutoHidden](https://developer.apple.com/documentation/uikit/uiviewcontroller/2887510-prefershomeindicatorautohidden)

常に表示するという状態と、操作していない場合は非表示にしたい、という二つの状態を切り替えたいというときは以下のような実装をします。

```ViewController.swift

private var indicatorAutoHidden:Bool = false {
    didSet {
        self.setNeedsUpdateOfHomeIndicatorAutoHidden()
    }
}

override var prefersHomeIndicatorAutoHidden: Bool { 
    return self.indicatorAutoHidden
}

```
setNeedsUpdateOfHomeIndicatorAutoHiddenを呼び出すことですぐさま表示、非表示状態の更新を切り替えることができます。

公式ドキュメント:
[setNeedsUpdateOfHomeIndicatorAutoHidden](https://developer.apple.com/documentation/uikit/uiviewcontroller/2887509-setneedsupdateofhomeindicatoraut)

終わりです

Brewus,Inc.
株式会社ブリューアス
https://brewus.co.jp
IF文


##IF文

IF文とは、条件分岐を行うためのプログラムで、Pythonだけではなく、java、Rubyなど多くのプログラミング言語でも使用されているプログラミング構文です。
多くの言語で使われていますが、if文自体の処理や考え方などは変わらないために、理解してしまうと、もしPython以外の言語を勉強していれば考え方は同じです。Pythonが注目されている分野の人工知能のプログラムでも利用されています。
基本をしっかり抑えておくことで、実際の現場に行った時にも活きてくるため是非とも習得しておきたい文法の1つです。

Pythonのif文で字下げする際の注意点
Pythonのif文の書き方について、Pythonにおけるif文での字下げは他の言語と少し異なります。
Pythonでは基本的に1行1ステートメントしか記述することができません。本来プログラミングにおいて「字下げ」は、コードの読みやすさを高めるために利用されています。ただ、Pythonの場合、ブロック文を指定するために本質的に必要な書式です。
Pythonにおける字下げは行頭にある空白文字が重要で、同じ数の空白文字で字下げされたステートメントがブロックとみなされます。
多くのテキストエディタでは、空白文字で字下げした次の行のタブ文字\tで埋め合わせることが出来るのですが、Pythonでは、タブ文字をキー入力して字下げされているように見えても、字下げしたとは見なされません。この他の言語との字下げの違いを理解しておかないと、誤ってタブ文字を使って字下げしたと思ってデバッグした時に、IndentationError:unexpected indentのようなエラーが起きてしまうので注意しましょう。

使用例
ネットワークサイトやアプリなど、マウスカーソルを持っていくと、ポップアップウインドウが表示されるといったときにもif文は利用可能です。
マウスカーソルがターゲットの上にあるか、それともないかをif文で条件分岐させることが可能です。マウスカーソルがターゲットの上にあればTrueに分岐して、ポップアップウインドウを画面に表示させることができます。逆に条件を満たしていないときはFalseに分岐します。

if else文の書き方
if 条件式：
条件式が正しい時に行われる処理1
else:
それ以外の時に行われる処理2

if elif else文の書き方

if 条件式1 :
条件式1が「正」である時に行われる処理1
elif 条件式2 :
条件式1が「偽」で、条件式2が「正」である時に行われる処理2
elif 条件式3:
条件式1も条件式2も「偽」で、条件式Cが「正」である時に行われる処理3

else
上記の条件式がすべて「偽」である時に行われる処理4


IF文で使用する型に、「bool型」という型があります。bool型は「True（真）」と「False（偽）」という2つの値のいずれかを取るデータ型になります。
bool型はif文などの制御分でよく利用されます。

|演算子|説明| 
|:-:|:-:|
|a and b|aもbもTrueならTrue|
|a or b|aかbがTrueならTrue|
|a == b|aとbが同じならTrue|
|a != b|aとbが異なればTrue|
|not b|	aがFalseならTrue|
|a > b|	aがbより大きければTrue|
|a >= b|aがb以上ならTrue|
|a < b|	aがbより小さければTrue|
|a <= b	|aがb以下ならTrue|
データベース（MySQL）の主キーを任意のカラムに変更する。

# 初めに…

データベースでテーブルを作成すると必ず作成される主キー（ `:id` カラム）ですが、デフォルトではレコードに登録された順番に１番から登録されていきます。ところが、既存のサービスを見てみると `https://www.uniqlo.com/jp/ja/products/E428313-000` のように商品番号が URL に入っていたり、ユーザー情報を閲覧できるページではユーザー名がパラメータとなっていたりします。
そこで、本投稿ではデータベース（MySQL）で主キーを任意のカラムに変更する方法をご紹介します。

# データベース （MySQL） の主キーを任意のカラムに変更する方法

```Ruby:db/migrate/_マイグレーションファイル.rb
class ● ● ● < ActiveRecord::Migration[5.2]
  def change
    create_table :テーブル名, id: false, primary_key: :主キーにするカラム名 do |t|
      # `id: false` は、このテーブルでは `:id` カラムを作成しない。という記述です。
      # `primary_key:` に主キーにするカラム名を指定する。
      t.timestamps
    end
  end
end
```

```Ruby:app/models/モデル名.rb
class モデル名 < ApplicationRecord
  self.primary_key = "主キーにするカラム名"
    # モデルファイルに この記述をすることで主キー（プライマリーキー）となるカラムを指定する。
end
```

- モデルファイルに主キーとなるカラムを記述しておくことで、コントローラーから `モデル名.find(params[:id])` により `:id`
のレコードを呼び出すと…

```SQL:サーバーログ
Parameters: {"id"=>"値"}
SELECT  `テーブル名`.* FROM `テーブル名` WHERE `テーブル名`.`主キーとするカラム名` = 値 LIMIT 1`
```

となり、ちゃんと主キーとした値が読み込まれてることが分かります。
AWS API Gateway がリクエストヘッダーを小文字にしてしまう時の解決策 (golang)


ここ最近業務で API Gateway + Lambda を使った開発を行っており、API Gateway の振る舞いで注意しなければならない点を見つけたので、解決方法も添えて記事にしたいと思います。開発言語は Go言語です

## AWS API Gateway がリクエストヘッダーを小文字にしてしまう

- 今回使用するサンプルプログラムです

```go
package main

import (
	"errors"
	"fmt"
	"log"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
	"github.com/aws/aws-lambda-go/lambdacontext"
)

type (
	request  = events.APIGatewayProxyRequest
	response = events.APIGatewayProxyResponse
)

// handler handles AWS Lambda execution.
func handler(ctx context.Context, r request) (response, error) {
	if _, ok := lambdacontext.FromContext(ctx); !ok {
		return response{StatusCode: http.StatusBadRequest}, errors.New("not invoked from aws lambda")
	}
	log.Print(r.Headers)
	accept, _ := r.Headers["Accept"] // 実際は accept としないと取得できない
	if == strings.Contains(accept, "application/json") {
		return response{StatusCode: http.StatusOK, Body:"{}"}, nil
	}
	return response{StatusCode: http.StatusOK, Body: fmt.Sprintf("It Works! path=%s", r.Path)}, nil
}

func main() {
	lambda.Start(handler)
}

```
サンプルプログラムでは Accept ヘッダーが application/json だった場合に空の json を返します。

今回の一例ですが、下記のようなリクエストを送信したとします。

```
curl -X GET -H "Accept:application/json" https://hogehoge
```
これが API Gateway を通って Lambda 側にきた時には Accept → accept になっていて、`r.Headers["Accept"]`では取得できません。
そもそもRFCの定義では、リクエストヘッダーは小文字大文字を区別しないとなっています。
「とりあえず全部小文字に変換しておくから、アプリケーション側で取得する時は小文字で取得してね」という事なのでしょうかね？

## 大文字、小文字の区別なく取得できるようにするには

全て小文字で書かなければならないのはとてもモヤモヤします。この問題に対して有効な解決策が、[Lambda の SDK 開発の PR](https://github.com/aws/aws-lambda-go/issues/117) の議論のなかにありました。
vents.APIGatewayProxyRequest の header を net/http の header に置き換えてしまうというやり方です。
net/http の Header は CanonicalHeaderKey() を用いて正規化されるので、`Accept`でも`accept`でも`ACCEPT`でも問題ありません。 

```go

headers := http.Header{}
for header, values := range r.MultiValueHeaders {
	for _, value := range values {
		headers.Add(header, value)
	}
}

headers.Get("Accept")
```

golang で Lambda 開発を行う方は是非参考にしてください。
New Relic メモ　〜Single Sign On設定（Auth0）〜

## やりたいこと

* New RelicにSAML IdP(Auth0)からSSOしたい

## 事前準備

### New RelicのAccount Idをコピーしておく

1. New Relicの**Account Settings**にアクセスする
2. URLが`https://rpm.newrelic.com/accounts/nnnnnnn`の形式となっているので、`nnnnnnn`をコピーする


### Auth0のアカウントを作っておく

（割愛）

## 設定開始

New Relicの**SSO Integrations**からNew Relicの設定ウィザードを開始する

![911CE9DE-946F-4E54-98D6-5C7771149A2C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325101/f5340845-f8cd-d851-8824-905df99f6830.png)

事前準備でコピーした**Account Id**を**New Relic Account Number**に入力して、**SAVE**を押す

![2B6EE730-B70C-4DED-8596-20310D5470FE.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325101/6767aaf3-c19a-43d6-d835-d551471086df.jpeg)

画面下部の証明書のダウンロードリンクから、**CERファイル**をダウンロードする。
また、同画面の下部に記載の**Remote Login URL**と**Logout landing URL**をコピーする

![6AA7D0C9-2B51-4DAB-BDD4-193DF1A5B9B6.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325101/0f366cdc-4d38-d10b-f174-9fe563c17bbc.jpeg)

New Relic側の**Account Settings > SECURITY AND AUTHENTICATION > Single Sign-On**から、**CERファイル**をアップロード、**Remote Login URL**と**Logout landing URL**を入力し、**Save my changes**を押す

![04E1E968-DB33-47F9-8CC7-39C43D33EF95.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325101/a6528aaa-88b3-64c6-4d23-24447681e622.jpeg)

接続テスト開始用のリンクが案内されるのでクリックする。

![A7D11BBC-2FCD-44E0-BA80-10474E88C036.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325101/5e90ec4b-b3af-6c9d-5962-d08ce5b5b5b9.jpeg)

Auth0のログイン画面が表示されるので、ログインする
ここでのログインはログイン用メールアドレスがNew Relic側のものと一致している必要がある

![5F5AB478-6742-4A86-9261-FE39E775E57E.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325101/ea659cec-1fad-ff86-a4eb-846e5e189519.jpeg)

接続テストがsuccessfulであることが確認されたので、**Enable SAML Login+**をクリックし、有効化する

![652CB720-280E-4255-A8B3-D76636403BE5.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325101/b1f2a6fa-985e-de58-7afc-7a6a88aaa1c8.jpeg)

できた。

![05452007-8EED-4ED9-9816-A6A01195564C.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325101/457bd0f0-2b1b-5e29-6378-bfc5e18d445a.jpeg)

## SAMLのmetadataについて

New Relic側の設定画面に以下が表示されている。

![DC437A57-738E-4A96-8723-60A520E79B19.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325101/c279aa6f-8717-46cb-89ce-f0ef68b2107b.jpeg)

この後、調査するが属性のバインディングはemailAddressでしかできなさそうに見える。故に、予めバインディング用のユーザをNew Relic側で作成し、権限等のコントロールを済ませた上で、SSOを提供する流れとなりそう。

おわり。
３日で合格！！AWSクラウドプラクティショナー試験のコスパよかった勉強方法



AWSクラウドプラクティショナー試験についての記事は山ほどありますが、自分ほど詰め込みで受験した人もそういないと思い、勉強方法と感想を書いていこうと思います。

#はじめに
私がなぜ今回の資格試験を受けたかと言うと、会社の必須資格だったからです。
実際に業務としてもAWSは使用頻度が高く仕事にも慣れたいと思い受験しました。

自分のスペック
AWSの実務経験一ヶ月ほど、EC2を少し触った程度
理系院卒だが情報系ではないし詳しいわけではない

#やったこと


##AWS認定資格試験テキスト　AWS認定 クラウドプラクティショナー

https://www.amazon.co.jp/dp/B07QX45RXM/ref=cm_sw_r_tw_dp_x_jQpqFbNDGG93P

１周目は全て読み込み、２週目以降は時間がなく各章ごとにある問題演習を解いてまとめを暗記することに使っていました。また、次に紹介する問題を解く際にわからない単語があると辞書的に使っていました。

内容自体は経験がない人であってもほとんど理解できるレベルで書かれていて大変助かりました。
内容はよくまとめられていますが、もともとAWSクラウドプラクティショナーはホワイトペーパー等を読むことを前提としているため、試験に出る全ての内容を網羅している訳ではないです。しかし、初めて勉強する方には是非ともオススメしたい一冊です。

問題演習に関しては演習量が圧倒的に足りないです。問題慣れしたい方にオススメを次に述べます。

## この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）

https://www.udemy.com/share/101I2OAEAbc11TRHkF/

udemyのクラウドプラクティショナー向けの模擬試験です。私が勉強法について調べていた際に多く目につきました。評価の高さと、受講生からのコメントを読み購入。
私が購入した際は値下げされており、1200円程度で購入できました。
中身に関しては、実際模擬試験として合計７回分の模試が受けられます。
具体的には
模擬試験（基本レベル①）65 質問
模擬試験（基本レベル②）65 質問
模擬試験（応用レベル①）65 質問
模擬試験（応用レベル②）65 質問
模擬試験（応用レベル③）65 質問
追加問題（難易度高）模擬試験2回分130問

私は結局応用レベルの②までを実施しました。基本レベルと応用レベルで分かれており応用はかなり難しいです。問題を解くと、全体の正解率と問題ごとの解説が表示されます。また、分野ごとの正解率もわかるので、苦手分野の特定にも役立つと思います。pcとスマホ両方に対応しているため通勤電車や昼休み等に気軽に問題を解くことができとても助かりました。試験前の電車でも間違えた問題をもう一度確認しました。

難易度については、実際の試験と同程度か少し難しいくらいの難易度です。たくさんの問題で試験慣れしたい方、わからない内容を見つけたい方に特にオススメです。

ちなみに、1周目上記のテキストを読んだ後に初めて基本レベルを解いてみましたが、正解率は４８％でした。。。（合格ラインは７０％です）

## 参考にした記事

https://qiita.com/hy_working/items/f537a21b27ad6f772149
別の方の記事ですが、AWSクラウドプラクティショナー試験の学習用にまとめた単語帳との事です。

試験前の１時間で発見したため、もっとはやくに知りたかった記事です。上記の模試で出てきた知らないサービスや試験で必須の内容がまとまっており、テスト前はこれをひたすら読んでいました。

### やったことは以上です。

びっくりでしょ？これしかやってないです。

#勉強スケジュール
1日目　仕事から帰ってきてテキストを半分程度読み寝落ち。

2日目　テキストが一周読み終わる。udemyで模試を受験４８％で絶望する。軽い復習をして就寝。

3日目　模試を応用2まで受ける。全て正答率が７０％未満で、これ落ちるわ。。。と感じる。間違えた問題の解説を読み、テキストを斜め読みして復習し就寝。

試験当日　試験が夕方からだったため早起きして勉強しようと決意していたが１０時に起きる。再度、基本１の模試を解き直してみると７２％が出て、これいけるわと勢いで詰め込み。

#試験を終えて
試験時間は１時間くらいあったと思いますが、３０分もあれば終わって、アンケートを答えて終わりでした。
手応えは半分半分かなと思っていましたが、アンケート回答後に合格と表示されめちゃくちゃ嬉しかったです。

実際のテスト結果は合格点ギリギリとお世辞にも良いとは言えなかったです。これを参考にする人はいないと思いますが、もっと前もって勉強することをオススメします。。。
ど真ん中に図や文字を表示させたい

【概要】
----------------------------------------
<b>1.結論</b>

<b>2.display:flexとalign-items/justify-content とは何か</b>

<b>3.どういう時に使うのか</b>

<b>4.ここから学んだこと</b>



1.結論
----------------------------------------
”display:flex”と”align-items”と”justify-content”は親要素に3点セットで使用する！

<br>
2.display:flexとalign-items/justify-content とは何か
----------------------------------------
i)<b>display:flex</b>➡︎<b>”指定した要素の子要素”</b>をFlexboxを適用させるためのプロパティです。そして、子要素が横並びになります。Flexboxとは柔軟にレイアウトを組める仕組みです！他にもdisplay:block(指定のセレクタをブロック要素に変更）などがあります。に

ii)<b>align-items</b>➡︎display:flexと併用して使うことが多く、<b>”指定した要素の子要素”</b>の水平方向の配置を決めれます。justyfy-content:center(中央）,justyfy-content:space-between(両端が左右寄り)などがあります。

iii)<b>justify-content</b>➡︎display:flexと併用して使うことが多く、<b>”指定した要素の子要素”</b>の垂直方向の配置を決めることができます。
align-items:felx-start(上),align-items:center(中央)などがあります。

<br>
3.どういう時に使うのか
----------------------------------------
実はこの3点セットでよく使うパターンが決まっております。ど真ん中に配置させたい時（水平方向・垂直方向・そして横並びに整列させたい）はdisplay:flexとalign-itemsとjustify-contentを親要素に3点セットで使用します！

下記に使用例を載せておきます！

```css:ど真ん中設定
.center_of_center{
 display:flex;
 align-items:center;
 justify-content:center;
}
```
上記のようにすると、画面中央に横並びになった状態でHTMLに反映され画面に表示されます！

*子要素の並び順を変えたい・縦列にしたい場合は親要素に”flex-direction”です。
 display:flexはフレックスボックスを適用させるものなので、同時に使用します。

<br>
4.ここから学んだこと
----------------------------------------
align-items/justify-content について、最初に子要素につけていたことによって
表示が反映されていませんでした。”親要素に適用する”という基本が抜けていました。
Amplify mockがすごく便利！

# はじめに
- 下記の記事に続いて記載する

[[Amplify, (ionic) Angular ] 一日で認証付きチャットツールを作成（準備編）](https://qiita.com/taaabooon/items/957cba923ceddc55a5b2)
[[Amplify, (ionic) Angular ] 一日で認証付きチャットツールを作成（実装編）](https://qiita.com/taaabooon/items/2a6c1d8c3a5205ebdde4)

## Amplify mockについて

[新機能 – Amplify CLI を使用したローカルモックとテスト](https://aws.amazon.com/jp/blogs/news/new-local-mocking-and-testing-with-the-amplify-cli/)
> 実際のバックエンドコンポーネントを使用する代わりに、クラウドサービスの場合は API を使用する代わりに、その API のローカルで単純化されたエミュレーションを代わりに使用できることを意味します。

### メリット
- Amplifyはクラウドサービスなので、これまではAPI側を修正したら、AWSに `amplify push` でデプロイをしなくてはいけなかったため時間がかかっていたが、 `amplify mock` を使用することで、ローカルで実行できるため、APIを修正しても即反映されるため、確認への時間が短縮された。
- GUI でのドキュメント、データのやり取りの確認も可能なので、正しいAPIの設計が出来ているか確認することができるようになった。
- （AWSにデプロイされないため、費用も発生しない）

# 確認
- 下記をもとにお話します。
[[Amplify, (ionic) Angular ] 一日で認証付きチャットツールを作成（準備編）](https://qiita.com/taaabooon/items/957cba923ceddc55a5b2)
[[Amplify, (ionic) Angular ] 一日で認証付きチャットツールを作成（実装編）](https://qiita.com/taaabooon/items/2a6c1d8c3a5205ebdde4)

- プロジェクトの配下で実行

```
❯❯❯ amplify mock
```

- 下記が出力されることを確認

```
Running GraphQL codegen
✔ Generated GraphQL operations successfully and saved at src/graphql
✔ Code generated successfully and saved in file src/app/API.service.ts
AppSync Mock endpoint is running at http://192.168.0.13:20002
```

## 確認

### Amplify mockで確認

- 下記にアクセス

`http://192.168.0.13:20002`


#### 作成したUIからチャットを送信し、GUIで内容を確認する


![デモ_UI_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176216/89294f11-7e56-1042-a95d-8d30b88ad443.gif)


左から　`listMessages` を選択

ローカルで送信出来ていることを確認する
![スクリーンショット 2020-08-24 17.08.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176216/8127061f-900b-7565-2419-597fcb5b6aca.png)


#### Mock GUIからメッセージを作成して、作成したUIから確認する

左から `CreateMessage`　を選択

![スクリーンショット 2020-08-24 17.12.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176216/56378fe2-f710-c5fb-f1a2-b599f8fadb12.png)

![スクリーンショット 2020-08-24 17.13.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176216/f230043e-40ad-b198-d490-4f5b7455c2f0.png)


GUIからもメッセージを送信することが出来ました。

# 最後に

- 本当に簡単なMock程度だったら、フロントエンドエンジニアの力だけで開発出来てしまうし、本当に便利な世の中になったなぁって思うばかりです。
- 最近では個人開発ではGraphQLでの開発が多くなって来ており、便利さを痛感しております。


## 参考

[新機能 – Amplify CLI を使用したローカルモックとテスト](https://aws.amazon.com/jp/blogs/news/new-local-mocking-and-testing-with-the-amplify-cli/)
[GraphQL API開発スピードを爆上げするAWS Amplify Mockingことはじめ](https://qiita.com/nagym/items/638974a3a5aaa63841c8)
同期非同期コールバック

新人の頃訳がわからなかった三兄弟を JavaScript を使って説明してみる

## 同期処理
記述された通りの順番に処理すること

```
console.log('前の処理が終わるまで')
console.log('次の処理は')
console.log('行われません')
```

### 実行結果
![スクリーンショット 2020-08-24 16.14.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265363/e023d618-d225-9114-937a-57c9ba2992e5.png)

## 非同期処理
他の処理と並列で処理を行うこと

```
setTimeout(() => {
  console.log('どうぞどうぞ')
}, 100)
setTimeout(() => {
  console.log('いやおれが')
}, 50)
console.log('ここはおれが')
```

### 実行結果
![スクリーンショット 2020-08-24 16.19.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265363/d35e92d1-d588-30b7-53bb-b349f9c16bb3.png)
プログラムの記述された順番通りに実行されません（行番号の順番通りという意味で）

## コールバック
一番わけがわからなかったやつ。こいつを説明したいがために記事を書いた。

〇〇したら（されたら)引数として渡された関数を実行するというのが、コールバックの考え方だ

例えば
addEventListener
というメソッドがある
文字通り、イベントのリスナーを(HTMLElementに)追加するメソッドだ
第一引数にイベント名、第二引数にコールバック関数(イベントリスナー)を追加する
使い方はこんな感じ

```
window.addEventListener('click', () => {
  console.log('window がクリックされました')
})
```

これにより、windowをクリックすると `window がクリックされました` とコンソールログが出るようになる。コンソールログを出す関数をコールバック関数として引数に渡しているからだ。

当然、

```
window.addEventListener('click', function() {
  複雑な処理
})
```

書き方が変わろうが、実行する処理が複雑になろうが、windowがクリックされたら第二引数の関数が実行されるところは変わらない。

また、先ほど例に出したsetTimeout関数も、引数にコールバック関数を取っている

```
// setTimeout(コールバック関数, 何秒待つかms)
```
これは第二引数に渡されたミリsec分待ってから、第一引数に渡された関数を実行するという関数
addEventListenerコールバックの例と比べて、ウィンドウでイベントが発火したら、という条件から何ms待ってからという条件に変わったものの、コールバックの考え方自体は変わっていない。

〇〇したら（されたら）引数として渡された関数を実行している

コールバックは他の言語でも実装されている。JavaScriptだけではなく、Javaにだって、Objective-cにだって、Swiftにだって存在している。
スマホの画面をつけた時、ページ遷移した時、ボタンが押された時など、とにかく〇〇したら（されたら）引数として渡された関数を実行する = コールバック は色々なところで使われているが、考え方は変わらない
〇〇したら（されたら）引数として渡された関数を実行するという考え方だ

もしよくわからない場合は、わからないメソッド（関数）のリファレンスをちゃんと読んで、使用例を見て、正しいメソッドの使い方を調べればきっとできるはずだ
Next.jsのプリレンダリング方式についてまとめてみた

最近Next.jsを使い始めましたが、Next.jsにおいて重要な概念であるプリレンダリング方式(SSR・SSG)についてあまり理解できなかったため、公式ドキュメントを参考にそれぞれの方式の違いや使い分けについてまとめました。

この記事では、用語の説明にフォーカスしており、実装方法は記載してませんのでご了承ください。

#プリレンダリングとは？
プリレンダリングとは、簡単にいうと**事前にHTMLを生成すること**です。

通常のReactアプリケーション(SPA)の場合、ユーザーがWebページにアクセスし、Webページを表示する時にブラウザ側でHTMLを生成します。（クライアントサーバーレンダリング）

![スクリーンショット 2020-08-24 16.46.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584128/54128359-3aff-3bf3-d3e7-73fb29099733.png)


プリレンダリングでは、ユーザーがアクセスする前に事前にHTMLを生成し、その用意されたHTMLをユーザーに提供する方式となっています。そのため、**ブラウザの負荷を下げて表示を高速化**することができます。

![スクリーンショット 2020-08-24 16.49.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584128/8a4761e7-b455-e3d6-9afe-e2c04a484b55.png)


また、事前にHTMLが生成されているため、検索エンジンのクローラーに全てのコンテンツを見せることができます。
SPAのSEO的なデメリットをカバーできることもプリレンダリングの強みの一つです。

Next.jsでは、**デフォルトで全てのページでプリレンダリングが有効化されています。**

#プリレンダリング方式（SSR・SSG）の違い
Next.jsでは、2種類のプリレンダリング方式（SSR・SSG）があり、それぞれ**ページごとに自由に選択して実装**することができます。
この2つの方式の違いは、主に**HTMLを生成するタイミング**になります。

###SSR（Server Side Rendering）
SSRでは、**ユーザーがアクセスした時にサーバー側でHTMLを生成**します。

SPAとの違いについてを簡単に説明しますと、

SPAではブラウザ側でHTMLを生成していましたが、SSRではサーバー側でHTMLを生成し、レンダリング済みのHTMLをブラウザ側に提供します。
要するに、**ブラウザの大半の仕事をサーバー側に任せ、ブラウザの仕事は最後の描画だけ**となります。

SSRは、リクエストごとにHTMLを生成するため、常に最新の状態をユーザーに見せることができます。

![スクリーンショット 2020-08-24 16.50.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584128/f47e4c3d-2a87-4156-ab13-dc8a8f706b05.png)


###SSG（Static Site Generator）
SSGでは、**アプリビルド時にHTMLを生成**します。

リクエストごとにHTMLを生成せず、事前にビルドされたHTMLを再利用する形となるため、**SSRよりもさらに高速な表示が可能**です。

![スクリーンショット 2020-08-24 16.50.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584128/422771d3-c847-c786-bb87-5390c12119a6.png)



#プリレンダリング方式（SSR・SSG）の使い分け
公式ドキュメントでは、以下の通り、**基本的にはSSGを使用することが推薦**されています。
>
We recommend using Static Generation (with and without data) whenever possible because your page can be built once and served by CDN, which makes it much faster than having a server render the page on every request.

意訳：可能な限りSSG(データの有無にかかわらず)を使用することをお勧めします。なぜなら、あなたのページは一度構築され、CDNによって提供されるので、サーバーがリクエストごとにページをレンダリングするよりもはるかに速くなります。


ただし、SSGはビルド時にHTMLを生成するため、更新頻度の高いページには適していません。

SNSや動画配信サイトといった**リアルタイムにWebサイトの表示を変えたいページ**に関しては、SSRを選択するのが最適かと思います。

#参考資料
[Next.js 公式ドキュメント](https://nextjs.org/docs/getting-started)
[nextjs with typescript:06 プリレンダリングとデータフェッチ](https://note.com/fz5050/n/n6bb306485b0e)
【Python】cachetoolsを利用した処理の高速化

- キャッシュを利用した処理の高速化が、pythonでも可能かどうかを調査。
- 結果、cachetoolsというライブラリを利用して容易に利用できることが判明。
- そこで今回はライブラリの概要と処理の記述例を記載。
- **※この内容では、概要や結果イメージ・基本記述を扱うため、詳細内容は[ドキュメント](https://cachetools.readthedocs.io/en/stable/)を参考。**

## 概要
- cachetoolsとは、キャッシュを利用した高速化処理(メモ化)をまとめたコレクションライブラリ。
- 特徴は以下。
  - 少ない記述で、多くのキャッシュアルゴリズムを扱うことができる。
  - 拡張可能で、用途や環境に合わせて適切な仕組みへ変更することが可能。
  - データはRAMに保存される。
- Github : [cachetools](https://github.com/tkem/cachetools/)

## 結果
- 以下の2枚の比較画像のように、少ない記述で容易に重たい処理を高速化することが可能。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/e9ebb521-58d4-1cb6-8055-6efab8c8b194.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/124b28fb-b24b-1404-abc3-26479853efe6.png)


## 環境
- Google Colaboratory

## インストール
- 以下のコマンドで、cachetoolsライブラリをインストールする。

```bash
pip install cachetools
```

## 記述例


**※この内容では、概要や結果イメージ・基本記述を扱うため、詳細内容は[ドキュメント](https://cachetools.readthedocs.io/en/stable/)を参考。**

### 基本
- 標準(オプション指定無し)のキャッシュ処理を利用する場合。

```python
# ライブラリの読み込み
from cachetools import cached

# キャッシュ有効化
@cached(cache ={})
def fibonacci(n):
  if n <= 2:
    return 1
  else:
    return fibonacci(n - 2) + fibonacci(n - 1)

print(fibonacci(30))
```

### 各オプション
- 以下利用できるキャッシュ処理の種類は下記。

| 名前 | 内容 |
|:-:|:-:|
|**TTLCache**|キャッシュの存続可能時間指定。<br>存続可能時間を超えたものにはアクセス不可。<br>最も使用頻度の低いアイテムから破棄される。|
| **LFUCache**  |  最小使用頻度。アイテム取得頻度を計測して、最も頻繁に使用されていないものから破棄|
|**LRUCache**|最長未使用頻度。最も長く使用されていないものから破棄|
|**RRCache**|ランダム。アイテムをランダムに選択して、そこから破棄|

- 以下、記述例

```python
# ライブラリの読み込み
from cachetools import cached, LFUCache, TTLCache, RRCache

@cached(cache=LFUCache(maxsize=10))  # 最大保持数
def get_all_item:
  # 処理

@cached(cache=TTLCache(maxsize=10, ttl=300))  # 最大保持数と存続可能時間
def get_user_item:
  # 処理

@cached(cache=RRCache(maxsize=10, choice=min))  # 最大保持数と任意の要素を返す代替関数
def get_random:
  # 処理。cache.choiceで指定関数(min)の呼び出し可能。
```

## 参考
- [Github](https://github.com/tkem/cachetools)
- [ドキュメント](https://cachetools.readthedocs.io/en/stable/)
- [Cachetools module in Python](https://www.geeksforgeeks.org/cachetools-module-in-python/)
AzureFunctionsでGithub連携させたときに躓いたエラーとその解消方法

## 現象

Azure FunctionsをVisualStudioから発行していた時は、上手く動作していた。
ある程度作りこんだところでローカルから一々発行するのではなく、デプロイメントを活用したくなった（Gitにpushし、自動的にデプロイしてほしい）。
その設定をしたまでは良いが、いざ動かしてみるとエラーが発生するようになった。
なお、私の場合はTwitterAPIにリクエストを投げる時のクエリが不適切であるといったエラーだった。

## 解消方法

[参考URL](https://blog.azure.moe/2019/12/16/azure-functions-%E3%81%AA%E3%81%A9%E3%81%AE%E3%83%AD%E3%82%B0%E3%81%8C%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%81%99%E3%82%8B/)を確認したところ、直接デプロイする場合には問題ないが非Windows環境を経由させる場合には文字化けが発生してしまう場合が発生するとのこと。
私の場合も上記の解消方法の通り、csファイルをUTF-8で保存しなおすと上手く動作した。
クエリを投げる時には日本語文字列が混ざる場合があるので、UTF-8で保存しなおすことでそこのエラーが解消されたよう。
Azure Functionsでプロジェクトを立ち上げるとデフォルトの文字列コードがShift-JISになるのは落とし穴なので、注意したほうが良いと思われる。
【Rails】Semantic UIを使って動的にフラッシュメッセージを表示する方法

## Semantic UI
Bootstrapのフレームワークである[Semantic UI](https://semantic-ui.com/)を使って、Railsに動的なフラッシュメッセージを導入する方法を以下に記しておきます。

Railsを使ったSemantic UIの導入方法は、以下の記事を参考にしてみてください。

- [Rails6にSemanticUIを導入 - はてなブログ](https://ryota21silva.hatenablog.com/entry/rails6-semantic-ui-settings)

## class属性を動的に設定するためのヘルパーを作成
```ruby:app/helpers/application_helper.rb
module ApplicationHelper
  def flash_class(level)
    case level
    when "success" then "ui success message"
    when "danger" then "ui error message"
    end
  end
end
```

## フラッシュメッセージ用のパーシャルを作成
上記で作った`flash_class(level)`メソッドを使用。

```slim:app/views/shared/_flash_message.html.slim
- flash.each do |message_type, message|
  div class="#{flash_class(message_type)} closable"
    i class="close icon"
    = message
```

## JavaScriptの導入
フラッシュメッセージの右上の×ボタンを押すと、フラッシュメッセージが消えるようにjsの記述をしておく。

```javascript:app/javascript/packs/flash_message.js
$(function () {
  $(".closable .close.icon").on("click", () => {
    $('.closable').fadeOut("slow");
  });
});
```

エントリポイントである`app/javascript/packs/application.js`に、`app/javascript/packs/flash_message.js`を読み込んでおく。

```javascript:app/javascript/packs/application.js
require("packs/flash_message")
```

## パーシャルをレンダリングする。
`== render "shared/flash_message"`でオッケーですね。

```slim:app/views/layouts/application.html.slim
doctype html
html
  head
    title
      = page_title(yield(:title))
    = csrf_meta_tags
    = csp_meta_tag
    = stylesheet_pack_tag "application", media: "all", "data-turbolinks-track": "reload"
    = javascript_pack_tag 'application', 'data-turbolinks-track': 'reload'
  body
    == render 'shared/header'

    == render "shared/flash_message"

    == yield

    == render 'shared/footer'
```

## `add_flash_types`を記述
Bootstrapに用意されているスタイルのフラッシュを定義。
この記述によって、毎回`flash: { success: 'ログインに成功しました' }`と書かなくて済むようになる。

```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  add_flash_types :success, :info, :warning, :danger
end
```

## 各コントローラで、`flash_class(level)`メソッドに渡すキーとバリューをセットする。

```ruby:app/controllers/user_sessions_controller.rb
class UserSessionsController < ApplicationController
  skip_before_action :require_login, only: %i[new create]

  def new; end

  def create
    @user = login(params[:email], params[:password])
    if @user
      redirect_back_or_to root_path, success: 'ログインに成功しました'
    else
      flash.now[:danger] = 'ログインに失敗しました'
      render action: 'new'
    end
  end
```

## ブラウザで確認
記述は以上です。
最後にブラウザで挙動を確認します！レイアウトは気にしないでください🙄

- ログイン成功時
![スクリーンショット 2020-08-24 16.57.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576318/64b07932-22b3-56e8-5cc9-d84c8ff4fe10.png)

- ログイン失敗時
![スクリーンショット 2020-08-24 16.49.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576318/8043ebc2-833b-6b4d-714f-3f1557713ce8.png)

- ×ボタンを押すとフラッシュメッセージが消える。
[![Image from Gyazo](https://i.gyazo.com/ffd4b5c9c3888a032d4cadfda8ea4842.gif)](https://gyazo.com/ffd4b5c9c3888a032d4cadfda8ea4842)
Tanzu Mission Controlを気軽に試す(via HOL)

# TL;DR

Tanzu Mission Controlを試したい場合、HOLが便利です。

# Tanzu Mission Controlって何？

Tanzu Mission ControlとはVMwareがリリースしたマルチKuberenetesを管理するための仕組みです。
省略では「TMC」と呼びます。

Tanzu Mission Controlを使うといろんなKubernetesを一元的に管理できます。
EKS,AKS,GKEが管理できるのも面白いです。

# HOLってなに？

VMwareのHands On Labの略称であり、気軽にVMwareのソリューションを試せる仕組みです。
他者さんの記事ですが、[ここ](https://qiita.com/nagahisa/items/f2b3d83009ca86dd00f2)などに紹介されています。

# この記事は？

この記事は最近リリースされたTanzu Mission ControlをHOLで扱うようにできることになりました。
この記事では、ちょっとこれを紹介します。

# HOLのID

以下です。

[HOL-2132-01-MAP - VMware Tanzu Mission Control](https://labs.hol.vmware.com/HOL/catalogs/lab/8087)

# このHOLでできること

TMCのアカウントおよびAWSへのk8sクラスタのデプロイができるようになります。(太っ腹)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/6d182a21-5934-01cd-40d6-560b01096e09.png)

ログインすると以下のような画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/f37b7ce8-3fe6-2574-3c6a-2741a7c7ebff.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/ea289466-5cbd-e0bc-6d80-11adf10f8ec7.png)

# まとめ

TMCの新しい機能を試したい場合、HOLをつかうとAWSのアカウント含め、すぐに試せる環境があります。
【JavaScript】基礎


#1.switchで条件分岐

if文で条件の分岐が多数になるときに、switchを使用すればもっと簡単に書くことができます。

```js

// 見本

変数名 = "値"

switch (変数名) {
  case "値":  
    処理
    break;
  case "値":
    処理
    break;
  case "値":
    処理
    break;
  default:
    処理
    break;
}
```

```js

// 信号機の色別で出力内容を条件分岐してみます

color = "red"

switch (color) {
  case "red":  
    console.log("STOP!!")
    break;
  case "yellow":
    console.log("be careful!!")
    break;
  case "blue":
  case "green":  // caseは複数指定することもできます
    console.log("GO!!")
    break;
  default:  // 条件のどれにも当てはまらなかった場合にdefaultで指定した内容が出力されます
    console.log("Not applicable!!")
    break;

// 結果としてはredのSTOPが出力されます

}
```

#2.whileのループ処理

while文は指定した条件が満たされるまで、ループ処理を繰り返して値を出力してくれる便利なプロパティです。

```js

// 下記はiが１ずつ増えて100になるまでiの値を繰り返し出力するという命令です

let i = 0; 

while (i <= 100) {
  console.log(i);
  i++;  // この記述がないと無限に処理が実行されるので注意しましょう！
}
```

#3.forのループ処理

for文はwhile文をさらに簡略化した記述ができるプロパティです。

```js

// 見本

for (let 初期値を代入した変数名; 条件式; 変数の再代入) {
  console.log(i);
}
```
```js

// 下記はiが１ずつ増えて100になるまでiの値を繰り返し出力するという命令です

for (let i = 0; i <= 100; i++) {
  console.log(i);
}
```

#4.テンプレートリテラル記法

下記のような記述で、文字列と変数を接続することができます。

```js

const animal = "猫";
// シングルクオーテーションの代わりにバッククオートで${}に囲むことで文字列と変数を接続できます
console.log(`この動物は ${animal} です` );

// 出力内容：この動物は猫です
```

#5.continueとbreak

continueは対象の値をスキップしたいときに、
breakは対象の値で処理を停止させたいときに使用します

for文を使って見ていきます。

```js
for (let i = 1; i <= 10; i++) {
  if (i === 4) {
    continue;
  }
  console.log(i);
}

// この条件式なら、1~10の出力の中で4の値のみスキップされます

```
```js
for (let i = 1; i <= 10; i++) {
  if (i === 4) {
    break;
  }
  console.log(i);
}

// この条件式なら、4の値でループ処理が停止するので、3の値までしか出力されません

```

#6.関数

```js
// 引数にはデフォルトで値を入れておくこともできる
function 関数名（引数） {
  処理
}
// 呼び出す
関数名（引数）;
```

#7.関数宣言と関数式の違い

6で紹介した関数の記述方法は関数宣言と言われています。
その他に関数宣言を変数に代入する関数式というものがあるので紹介しつつ違いを明確にしていきます。

```js
// 関数宣言
function 関数名（引数） {
  処理
}
関数名（引数）;
```
関数式とは、関数を定数に代入することを言います。

```js
// 関数式
const 定数 = function（引数） {  // 関数名がいらなくなります
  処理
};  // 定数に代入しているので末尾には;が必要です
// 呼び出すときは定数名になります
定数名（引数）;
```

#8.アロー関数
関数をもっと短く記述することができる記法です。

```js
const 定数 = (引数) => { // functionがいらなくなり、=>が必要
  return 処理
};
```
また、引数が１つの場合やreturnの処理が１つの場合はもっと簡易的に記述することができます。

```js
const 定数 = 引数 => 処理;
// ()も{}も必要なくなります
```

以上
Literal について



#Image Literal
![スクリーンショット 2020-08-24 16.30.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562721/c0ec69a4-9f0e-cff2-d39d-cdfe89448a2c.png)

#Color Literal
![スクリーンショット 2020-08-24 16.30.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562721/227cab24-709f-a457-be66-ddc2e9b52e34.png)

#Literal
![スクリーンショット 2020-08-24 16.30.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562721/ecbbaa58-f568-d2e1-7ba8-df1af1dcae3f.png)

あとは
・Image Literalをダブルクリックすれば、Assetフォルダ内に保存されている画像を選択できる。

・Color Literalをダブルクリックすれば、色を選択できます![スクリーンショット 2020-08-24 16.31.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562721/1f3f7e78-c0ac-63a3-af53-4cf283481a6b.png)
cgroups(Control Groups)

## cgroups(Control Groups)とは
- プロセスグループのリソース(CPU、メモリ、ディスクI/Oなど)の利用を制限・隔離するLinuxカーネルの機能
- プロセスとスレッドをグループ化して管理する技術
- グループに階層構造を適用することができ、体系的にリソース管理ができる。

| 項目 | 説明 　　　　　　　　　　　　　　　　　　　　　|
|:-----------|-------------------------------------:|
| cpu       | 　CPUの使用量制限　　　　　　　　　　　　　　　|
| cpuacct     | CPUの使用量統計情報提供　　　　　　　　　　　|
| cpuset       | CPUやメモリの配置制御　　　　　　　　　　　　|
| memory         |　 メモリやスワップ（Swap）の使用量制  　 　　　　|
| devices       | デバイスに対するアクセス制御　　　　　　　　　|
| freezer    | グループ内プロセス停止及び再開　　　　　　　　|
| net_cls    | ネットワーク制御　　　　　　　　　　　　　　　|
| blkio    | ブロックデバイスの入出力量の制御　　　　　　　|
.NET Framework から .NET Core への移植

# 移植するアプリケーションについて

シリアル通信を行い、通信内容を解析、結果を画面表示するようなアプリケーションで、
SerialPort クラスを使用。

# 事前準備

1. .NET Core環境を以下の記事で構築。
https://qiita.com/takmot/items/19fab3a4b89a33bb8930

2. .NET Framework環境としてVisual Studio 2019をインストール。
3. Visual Studio 2019上でアプリケーションがビルド、起動できることを確認。

# 移植手順
以下の公式ドキュメントを参考に進める。
https://docs.microsoft.com/ja-jp/dotnet/core/porting/

### 1. Visual Studio の変換ツールを使用してpackages.config の依存関係を PackageReference 形式に変換

1. Visual Studio 2019上でpackages.configファイルを右クリックし、`packages.configをPackageReference`に移行するを選択する。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/eec67f5c-8a50-bb0e-3baa-5f3e373872e1.png)

2. OKを選択。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/6c8f251c-6470-da91-7007-6c122fa503a0.png)

3. 完了するとソリューションファイルと同じパスにMigrationBackupフォルダが出来上がる。その中のNuGetUpgradeLog.htmlを確認。成功している場合、以下のように表示される。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/e65937ab-ad82-5373-bd22-2e55251af8bf.png)

4. 再度Visual Studio 2019上でアプリケーションをビルドし問題ないことを確認。

### 2. プロジェクトファイルを.NET Core形式に変換

プロジェクトファイルの変換には`dotnet try-convert`を使用する。
github：https://github.com/dotnet/try-convert/releases

1. githubページのHow To Installに従って以下でtry-convertをインストールする。

        dotnet tool install -g try-convert

    インストールが完了すると以下のように表示される。

    ![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/c5fa48b9-1ef4-70ce-c100-a6176fce3beb.png)

2. プロジェクトファイルの変換
  1. プロジェクトファイルを対象とする場合

            try-convert -p <.csproj のファイルパス>

  2. ソリューションファイルを対象とする場合
 
            try-convert -w <.sln のフォルダパス>

3. 完了すると以下のように表示される。
    ![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695430/83e5626a-812f-7ab8-4685-baa87705a752.png)

### 3. SerialPort クラスの対応

上記1,2で一旦変換は完了したが、.NET Coreでビルド`dotnet build`を行うとエラーが発生。

        型名 'SerialPort' は名前空間 'System.IO.Ports' に見つかりませんでした。

以下の公式ドキュメントを確認すると、.NET Core 3.1ではSerialPort クラスは対応しておらず、.NET Platform Extensionsのページにリダイレクトされる。
https://docs.microsoft.com/ja-jp/dotnet/api/system.io.ports.serialport?view=dotnet-plat-ext-3.1&viewFallbackFrom=netcore-3.1

Windows 互換機能パックを以下ページに従ってインストール。
https://www.nuget.org/packages/Microsoft.Windows.Compatibility

        dotnet add package Microsoft.Windows.Compatibility --version 3.1.1

これでSerialPortのエラーが解消しビルドが通ることを確認。
データベースの正規化について


#正規化とは
データベースのデータ構造をより効率的で重複や無駄のないシンプルな構造にするための手順のことです。

正規化をしたあとのデータベースの構造を**正規形**
してないデータベースの構造を**非正規形**と言います。

正規化には順番があります。
非正規形→第一正規形→第二正規形→第三正規形・・・

##なぜ必要か
映画館の場所と、鑑賞できる作品に対する1日あたりの観客動員数を、管理するためのテーブルがあったとします。

※mobilization = 1日あたりの動員数

| id         | store       | movie1_title | movie1_mobilization | movie2_mobilization |
|:-----------|:------------|:-------------|:-------------|:-------------|
| 1       | 原宿        | 名探偵コナン         |1,000          |1,500          |
| 2     | 新宿      | ハリーポッター       | 2,000       | 3,000       |
| 3       | 渋谷	        | クレヨンしんちゃん         | 3,500         | 3,000        |


#####このテーブルの問題点
・重複するカラムがある
・一つのテーブルに、映画館と観客動員のエンティティが存在している

#####重複してる
movie1_titleやmovie2_titleなど、１つの映画館に対して繰り返されている。
カラム追加したいときに、 movie３_title、movie３_mobilizationとなってしまい、**冗長になります**

#####一つのテーブルにエンティティが混在している。
1つのテーブルに「映画館の場所情報」と「観客動員の情報」という別のエンティティが含まれてます。
この場合、場所が重複してしまうことがあり、**テーブルの可読性などが下がります**。

#順番

###第一正規形
同一のカラムが存在しないかつ、レコードを構成する1つ1つのマスに、値が1つずつ入っている状態。
**テーブル内に重複するカラムをなくすためです。**

###第三正規形
主キーに依存しているかつ非キー属性（簡単に言えば、主キーではないもの）同士の依存がない状態。
**1つのテーブルに映画館の場所と観客動員のエンティティが混在しているためです。**

#正規化のデメリット
正規化は手順を進めるほどに、パフォーマンスが低下します。(小さなテーブルが増えていくから）
関連するテーブルを検索するたびにSQLを実行する回数が増えて、速度が低下します。
そこで正規形は必要最低限のレベルである**第三正規形**で終えることが多いです。


#####今回は以上になります。最後まで読んでいただきありがとうございます！
あのファーウェイスマホのカメラ機能をアプリにも取り入れる？

##はじめに

ファーウェイのスマートフォンといえば、高性能なカメラ機能で有名ですよね。
アパーチャモード、夜景モード、ポートレートなどの処理にもハードウェアやSoc性能に依存します。
アプリ単体だと簡単に作れない機能です。


##HMS CameraKit

現在販売しているファーウェイのスマートフォンにはHMS（Huawei Mobile Service）が搭載していて、アプリ開発向けの独自のSDK群が提供しています。
もちろん一般的なPushやIn App purchaseなどのSDKは提供している以外に、HUAWEI独自のSDKもアプリ開発者に提供しています。
それを取り入れたアプリをファーウェイ独自のアプリストアAppGallery公開すれば、全世界のファーウェイスマートフォンユーザーに配信することができます。

その中に、ファーウェイスマートフォンで使われているカメラ機能をSDKとして提供されたのがCameraKitです。
![アパーチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677524/7f61121b-2ad0-9e34-203b-37824961734f.png)　![夜景.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677524/b5fde3a3-7017-12bc-cd86-2663f5085af4.png)　![ポートレート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677524/1fb7ae19-c6e8-06da-7a29-0e4b110ac335.png)
（引用元：<https://developer.huawei.com/consumer/en/doc/development/Media-Guides/3180101>）


##CameraKitをアプリに取り入れる準備

１、HUAWEI IDを新規登録
２、開発者アカウントを登録

GooglePlayやAppStoreと同様に開発者登録が必要ですが、
ファーウェイの開発者アカウント開設およびSDK運用はすべて無料で提供しています。
登録方法は公式サイトを参考：
<https://developer.huawei.com/consumer/en/doc/10104>


##CameraKitの開発

CameraKitをAppGallery Connectコンソール画面から入手し、AndroidStudioプロジェクトに取り入れ、依存関係を追加します。

![開発.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677524/f02b1b9d-faa4-cbf2-cf16-bba12efbc5b3.png)
（公式サイト：<https://developer.huawei.com/consumer/en/doc/development/Media-Guides/3180103>）

次に、各カメラ機能のAPI導入：
フロントカメラHDRモード

    Set mCurrentModeType to Mode.Type.HDR_MODE.

スーパーナイトモード

    Set mCurrentModeType to Mode.Type.SUPER_NIGHT_MODE.

ウルトラワイドアングルモード

    Set mCurrentModeType to Mode.Type.BOKEH_MODE.

レコーディングモード

    Set mCurrentModeType to Mode.Type.VIDEO_MODE.

ポートレートモード

    Set mCurrentModeType to Mode.Type.PORTRAIT_MODE.

ノーマルモード

    Set mCurrentModeType to Mode.Type.NORMAL_MODE.

スーパースローモーションレコーディングモード

    Set mCurrentModeType to Mode.Type.SUPER_SLOW_MOTION.

スローモーションレコーディングモード

    Set mCurrentModeType to Mode.Type.SLOW_MOTION_MODE.

など
コマンドの場所を表示【BashとPowerShellの比較】

[Linux（Bash）とWindows（PowerShell）のコマンド対応表](https://qiita.com/karakuri-t910/items/c3b9a314afe18f6d0e7c) に戻る

<br>

# 対応表

| <font color="magenta">シェル</font> | <font color="magenta">スペル</font> | <font color="magenta">短縮形</font> |
| --- | --- | ---|
| **Bash** | `which` | - |
| **PowerShell** | `Get-Command` | `gcm` |

<br>

# Bash

## コマンド形式

```bash
$ which <コマンド名>
```

### 使用例

例１）`ls`コマンドの場所を表示

```bash
$ which ls
/usr/bin/ls
```

例２）`ping`コマンドの場所を表示

```bash
$ which ping
/usr/bin/ping
```

例３）`ssh`コマンドの場所を表示

```bash
$ which ssh
/usr/bin/ssh
```

<br>

# PowerShell

## コマンド形式

```powershell
> Get-Command <コマンド名>
```

### 使用例

例１）`Get-ChildItem`コマンドの場所を表示

```powershell
> Get-Command Get-ChildItem

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Get-ChildItem                                      3.1.0.0    Microsoft.PowerShell.Management
```

例２）`ping`コマンドの場所を表示

```powershell
> Get-Command ping

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Application     PING.EXE                                           10.0.18... C:\WINDOWS\system32\PING.EXE
```

例３）`ssh`コマンドの場所を表示

```powershell
> Get-Command ssh

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Application     ssh.exe                                            7.7.2.1    C:\WINDOWS\System32\OpenSSH\ssh.exe
```
[C++] ifstreamでファイルを読む際のファイル存在チェック

C++においてファイルの中身を読み込む際にはifstreamを使う。この時にファイルが存在しなかったり不正なファイルを入力したりした時の挙動については少し注意する必要がある。

# ifstreamの挙動

## 正常な場合

例えば、以下のような入力ファイルがあったとして

```txt:input.txt
1 2
```

それを変数に読み込む場合、以下のようなコードを書く。

```cpp
int i, j;
std::ifstream fin("input.txt");
fin >> i >> j;
std::cout << "(i,j) = (" << i << "," << j << ")" << std::endl;  // => (1,2)
```

入力ファイルが存在し、適切なフォーマットで書かれているならば何も問題は起きない。

## ファイルが存在しない場合

しかし、もし入力ファイルが存在しなかったらどうなるか？

```cpp
    int i, j;
    std::ifstream fin("do_not_exist");
    fin >> i >> j;
    std::cout << "(i,j) = (" << i << "," << j << ")" << std::endl;   // => (0,0) （挙動は未定義？）
```

実はその場合にも実行時例外などは送出されず、プログラムが正常終了してしまう。

## ファイルフォーマットが不正な場合

さらに、以下のような不正なフォーマットの場合を考えよう。

```txt:invalid.txt
1 a
```

このファイルに対して上記のコードを動かしても実行時例外などは何も発生せず、`(1,0)`と表示される。
（ただし、`j`の値がどうなるかは未定義かも。私の環境ではこうなったというだけかもしれない。）

# チェック方法

このような不正なフォーマットのファイルが入ってきた場合のエラーをどのように検出するべきか？
ifstreamの状態をチェックするには `fin.good()`, `fin.is_open()` など様々なメソッドがありややこしいが、結論から言えば`operator bool`でチェックするのがベストプラクティスになる。
要するに

```cpp
std::ifstream fin("....txt");
if( !fin ) {
   .... // 何かエラーが起きている
}
```

ファイルの存在やパーミッションについては`fin.is_open()`でチェックすることができるが、`operator bool`は`is_open`によるチェックも含んでいる。
https://stackoverflow.com/questions/24097580/ifstreamis-open-vs-ifstreamfail
https://en.cppreference.com/w/cpp/io/basic_ios/operator_bool

例えば、先ほどの例での結果は以下のようになる。

```cpp
// 正常系の場合
    int i, j;
    std::ifstream fin("input.txt");
    std::cout << static_cast<bool>(fin) << std::endl;    // => 1
    fin >> i >> j;
    std::cout << "(i,j) = (" << i << "," << j << ")" << std::endl;   // (1,2)
    std::cout << static_cast<bool>(fin) << std::endl;    // => 1

// ファイルが存在しない場合
    int i, j;
    std::ifstream fin("do_not_exist");
    std::cout << static_cast<bool>(fin) << std::endl;     // => 0
    fin >> i >> j;
    std::cout << "(i,j) = (" << i << "," << j << ")" << std::endl;
    std::cout << static_cast<bool>(fin) << std::endl;     // => 0

// 入力の形式が不正な場合
    int i, j;
    std::ifstream fin("invalid.txt");
    std::cout << static_cast<bool>(fin) << std::endl;     // => 1
    fin >> i >> j;
    std::cout << "(i,j) = (" << i << "," << j << ")" << std::endl;

    std::cout << static_cast<bool>(fin) << std::endl;     // => 0
```


というわけで、入力ファイルが存在するかどうかをチェックするためにも`ifstream`でファイルを開いたら最低限次のようなチェックを入れておくことを習慣化しておくとよい。

```cpp
ifstream fin("my_file.txt");
if (!fin) {
   // エラー処理
}
```
半角スペースで区切られた２つの正の整数を足し算して出力する

paizaDランク問題で、標準入力に半角スペースで入力して計算する方法が分からなかったのでメモ

```ruby.rb
s = gets.split(' ').map(&:to_i) #splitで半角空けて配列を作り、map(&:to_i)で数値に変更
result = s[0] + s[1] #配列内の数値を足す
puts result
```
これまで改行で区切られた問題しか解いていなかったので、標準入力で半角空けて２つ入力する方法を分かってなかった。
基礎固め大事。
【鬼滅の刃】〜今日の呼吸ガチャ〜 を作りました

鬼滅の刃、面白いですね。

最近漫画とアニメを見終わったのですが、

ハマり過ぎて、

**【鬼滅の刃 〜今日の呼吸ガチャ〜】**

を作ってしまいました笑

今日の呼吸ガチャを回してみる↓ 
https://kimetsu-gacha.firebaseapp.com

**ガチャを回すと、**
**今日のあなたの呼吸がわかります。**

![スクリーンショット 2020-08-23 17.17.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287122/37cd9790-744d-5157-ee92-1a7ebe66f8c7.png)

![スクリーンショット 2020-08-24 15.14.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287122/3c05b380-6f61-9853-22ee-7aa00ccc25ff.png)

![スクリーンショット 2020-08-24 15.15.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287122/99a36bc9-1437-194a-2936-6c620a5a5170.png)

![スクリーンショット 2020-08-24 15.25.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287122/951c1e95-9732-aa41-6d97-142b67475462.png)

![スクリーンショット 2020-08-24 15.26.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287122/6451e7cf-5a4a-96cb-74aa-cc2c7886fa9f.png)

## 使った技術

・React.js
・TypeScript
・Firebase

## かかった時間

1日

## なぜ作ったのか？

- 鬼滅の刃に猛烈にハマっていた

- ReactとTypeScriptを勉強したくて、画面だけで完結するものを作りたかった

- @twtjudy1128 さんの、[プルジャダイニング(本格ネパール料理店)menuガチャ](https://www.purjadining-gacha.com/purja.html)からインスパイアされた

- 「ガチャなら画面だけでいけるやん！」で作ることを決定

## 参考にしたWEBサービス

[プルジャダイニング(本格ネパール料理店)menuガチャ](https://www.purjadining-gacha.com/purja.html)

[サイゼリヤ1000円ガチャ](https://saizeriya-1000yen.herokuapp.com)

## 過去に作ったアプリ

Qiitaの新着記事を、ニュース感覚で聞き流せるwebアプリ
[聞い太？](https://technews-app.herokuapp.com/)

## 作って感じたことを一言で

**「好きこそものの上手なれ」**

作るのは楽しい！
【鬼滅の刃】〜今日の呼吸ガチャ〜 を作りました

鬼滅の刃、面白いですね。

最近漫画とアニメを見終わったのですが、

ハマり過ぎて、

**【鬼滅の刃 〜今日の呼吸ガチャ〜】**

を作ってしまいました笑

今日の呼吸ガチャを回してみる↓ 
[kimetsu-gacha.firebaseapp.com](kimetsu-gacha.firebaseapp.com)

**ガチャを回すと、**
**今日のあなたの呼吸がわかります。**

![スクリーンショット 2020-08-23 17.17.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287122/37cd9790-744d-5157-ee92-1a7ebe66f8c7.png)

![スクリーンショット 2020-08-24 15.14.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287122/3c05b380-6f61-9853-22ee-7aa00ccc25ff.png)

![スクリーンショット 2020-08-24 15.15.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287122/99a36bc9-1437-194a-2936-6c620a5a5170.png)

![スクリーンショット 2020-08-24 15.25.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287122/951c1e95-9732-aa41-6d97-142b67475462.png)

![スクリーンショット 2020-08-24 15.26.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287122/6451e7cf-5a4a-96cb-74aa-cc2c7886fa9f.png)

## 使った技術

・React.js
・TypeScript
・Firebase

## かかった時間

1日

## なぜ作ったのか？

- 鬼滅の刃に猛烈にハマっていた

- ReactとTypeScriptを勉強したくて、画面だけで完結するものを作りたかった

- @twtjudy1128 さんの、[プルジャダイニング(本格ネパール料理店)menuガチャ](https://www.purjadining-gacha.com/purja.html)からインスパイアされた

- 「ガチャなら画面だけでいけるやん！」で作ることを決定

## 参考にしたWEBサービス

[プルジャダイニング(本格ネパール料理店)menuガチャ](https://www.purjadining-gacha.com/purja.html)

[サイゼリヤ1000円ガチャ](https://saizeriya-1000yen.herokuapp.com)

## 作って感じたことを一言で

**「好きこそものの上手なれ」**

作るのは楽しい！