OmniAICreator/Qiita-1.07M huggingface dataset:
SQLserverで処理が遅いSQLの特定と改善

# 対応概要
　画面から実行するとある検索処理が時間を要するため処理速度の改善対応を実施した。
　今回は、SQLserverでの改善方法を備忘メモとして記載。
　実施内容は2点。
　
  1.　原因となっているSQLの特定
  2.　原因となっているSQLに対応するINDEXの作成

　⇒INDEXの張りすぎも良くないらしいので、対応については慎重に確認した方が良さそう。


# 対応詳細
### 原因となっているSQL文を調査する
1. SQL Server Managment Studioのメニューバー＞ツール＞SQL server　プロファイラーを選択  
2. トレースのプロパティで下記を設定する  
　　・TSQLの「SQL：SmtCmpleted」をチェック  
　　・Stored　Proceduresの「SP：SmtCmpleted」をチェック  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174609/04ef0e59-d519-94a9-d3fe-972fbe48250c.png)  
3. 実際に問題になっている処理を実行する
  →問題の検索処理等、SQLが絡んでいる処理。
4. SQLserverプロファイラーを確認する。
　※実行前に一度クリアすると良いかも…。  
　※実行後は、一時停止ボタンを押下すると良いかも。  
　「Reads」や「Duration」がやたらと数値が高い行を確認する。  
　 ウィンドウの下画面に赤字で問題となっているSQL文が表示される。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174609/d395c44d-54c5-9bd4-c2d3-0fc239105e77.png)

```sql:取得できるSQLのサンプル※１
'SELECT 項目A,項目B,項目C FROM サンプルテーブル 
 WHERE ((項目カナ LIKE @P1) AND (項目コード LIKE @P2) AND (項目区分 = @P3) AND (項目属性 = @P4)) 
ORDER BY 項目A ASC,項目B ASC,項目コード ASC ',@p5 output,@p6 output,@p7 output,'%%','%','00001','0'
```

### 問題になったSQLのINDEXについて確認・作成
1. SQL Server Managment Studioのメニューバー＞クエリ＞実際の実行プランを含めるを押下。  
2. SQLプロファイラーで取得したSQLを実際に実行。  
　取得したSQLがパラメータがある場合は適宜置換をする事。(`@P1`等)  

```sql:取得できるSQLのサンプル※１のSQL整形後
SELECT 項目A,項目B,項目C FROM サンプルテーブル 
 WHERE ((項目カナ LIKE '%%') AND (項目コード LIKE '%') AND (項目区分 = '00001') AND (項目属性 = '0')) 
ORDER BY 項目A ASC,項目B ASC,項目コード ASC
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174609/410b8a75-0805-9964-4485-c6f799eb93b6.png)
3. 実行プランタブ内で、右クリックして「不足しているインデックスの詳細」をクリック  
4. 表示されたインデックス作成SQLを実行する。  
　 ※「`<Name of Missing Index, sysname,>`」は任意の名前に変更する。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174609/607d8b5c-5461-fcbe-9999-a17635699d77.png)


# 結果
INDEXを貼ったら検索処理が早くなりました。
最初に記載しましたが、Index貼りすぎもNGらしいので
良く確認しながら作業した方がよさそうです。
忘備録

# とりあえずまとめる
- SQLまわり
    - null同士は比較しない。
        - null = null → false
        - coalesceして比較する
    - utf8をbulk insert したい
        - rowterminator = '0x0a'
    - Accessを使おうとしてちょっと困ったところ
        - with句使えない
        - 3つ以上のテーブルをjoinするときは括弧でくくる
            - from ((a join b) join c)join d
        - case が使えない
            - iif(a=b,真の時,偽の時)
        - 数字、記号の入ったテーブル名はくくる
            - from [a1] join [b+]
Rの欠損値がある場合の計算結果

# はじめに
データの統計量（平均等）を求める際に使用する関数の欠損値の取り扱いが気になったので、確認を行った。

# 統計量の計算
以下、欠損値（NA）を含んだデータで検証してみる。

```R:コード
x <- c(1,2,3,NA,5,NA,7,8,9,10)

x.sum <- sum(x)
x.mean <- mean(x)
x.var <- var(x)
x.sd <- sd(x)

print(c(x.sum, x.mean, x.var, x.sd))
```

```:出力
[1] NA NA NA NA
```

どの計算をしても出力は基本的にNAになってしまう。因みに、`quantile`関数は、

```R:コード
x.qs <- quantile(x)
```

```:出力
 quantile.default(x) でエラー: 
   'na.rm ' が FALSE なら、欠測値及び NaN は許されません 
```

と出て、エラーを吐き出す。これらすべては、na.rm = TRUE オプションでNA値を無視して計算することができる。

```R:コード
x.sum <- sum(x, na.rm = TRUE)
x.mean <- mean(x, na.rm = TRUE)
x.var <- var(x, na.rm = TRUE)
x.sd <- sd(x, na.rm = TRUE)
x.qs <- quantile(x, na.rm = TRUE)

print(c(x.sum, x.mean, x.var, x.sd))
print(x.qs)
```

```:出力
[1] 45.000000  5.625000 11.410714  3.377975
   0%   25%   50%   75%  100% 
 1.00  2.75  6.00  8.25 10.00 
```

# おわりに
データに欠損が含まれている場合はその取扱いを気を付ける必要がある。次は欠損を埋める（内挿したり等）方法についても検討したい。
[Go] 1.16 から使える embed で HTML がバイナリに埋め込める！！

シングルバイナリーがメリットと言われてる Go 言語ですが、HTML などのテンプレートはそのバイナリは埋め込むことができませんでした。
(hugo のようにファイルを生成するツールがあるので、無理くり、埋め込むことはできたんだと思いますが。。)

__追記(2020/03/10)__: こちらの [YouTube 動画](https://youtu.be/uH0SGxA5UJM) にて、1.16 より前の静的ファイルの埋め込み方法が解説されています。(ざっくりと、`var embedData = []byte("静的ファイルの中身")` が定義された Go ファイルを作成して build する。なるほどですね。)

ただ、Go 1.16 から `go:embed` を使うことで、めっちゃ簡単に埋め込むことができるようになりました！！

インポートした後は、これまで通り `http/template` が使えます！

めっちゃ便利なので、おすすめです。

以下、ざっくりとまとめです。

## 参考
https://golang.org/pkg/embed/
https://golang.org/pkg/html/template/

## フォルダ配下全てを読み込み

下記のように書くことで、`templates` フォルダ配下のファイルを読み込みできます。
その後は、`f` を経由してアクセスできるようになります。 

```go
//go:embed templates
var f embed.FS
```

そう！これだけ！

## 読み込んだテンプレートを使う

`template.ParseFS()` を使って、インポートした特定の HTML を呼び出します。

```go
tmpl, _ := template.ParseFS(f, "templates/index.html")
```

あとは、これまで通り `Execute()` で　`http.ResponreWriter` に書き込み

```go
// ここはこれまで通り
err := tmpl.Execute(w, "Second Page")
```

めっちゃ簡単！！

## コード全体

```go:main.go
package main

import (
	"embed"
	"html/template"
	"log"
	"net/http"
)

//go:embed templates
var f embed.FS

func index(w http.ResponseWriter, r *http.Request) {
	tmpl, _ := template.ParseFS(f, "templates/index.html")

	type Post struct {
		PageTitle   string
		PageContent string
	}

	// Struct データを渡してみる
	err := tmpl.Execute(w, &Post{PageTitle: "Index Page", PageContent: "トップページのコンテンツ"})
	if err != nil {
		log.Println(err)
	}
}

func second(w http.ResponseWriter, r *http.Request) {
	// base.html ばベースのテンプレートになるので、同時にパース
	tmpl, _ := template.ParseFS(f, "templates/second.html", "templates/base.html")

	// シンプルにテキスト文字列を渡してみる
	err := tmpl.Execute(w, "Second Page")
	if err != nil {
		log.Println(err)
	}
}

func main() {

	http.HandleFunc("/", index)
	http.HandleFunc("/second", second)

	log.Println("listening ... ")
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		log.Fatal(err)
	}
}
```

### 確認①: テンプレートにデータを渡すことができる

`index.html` ページでは渡された struct データを受け取り、使うことができます

```html:index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name={{.}}>
    <title>{{ .PageTitle }}</title>
</head>
<body>
    
    <h1> {{ .PageContent }}</h1>

</body>
</html>
```

### 確認②: ベーステンプレートを使うこともできる

```html:base.html
{{ define "base" }}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ . }}</title>
</head>
<body>
    
    {{template "content" . }}

</body>
</html>
{{ end }}
```
このベーステンプレートを使って、`second.html` を書く

```html:second.html
{{ template "base" . }}

{{ define "content" }}
<h1>Welcome to Second Page</h1>
{{ end }}
```
Breadcrumb NavXT をリッチリザルトに対応させる

wordpressのプラグイン「Breadcrumb NavXT」がgoogleのリッチリザルト（構造化マークアップ）に対応していなかったので、対応させる為のメモ。

| plugin | version |
| ---- | ---- |
| Breadcrumb NavXT | 7.3.0 |

# breadcrumb-navxt.phpを編集

772行目（バージョンによって行数が違うが、だいたいこの辺）

```diff:wp-content/plugins/breadcrumb-navxt.php
function bcn_display_list($return = false, $linked = true, $reverse = false, $force = false)
{
global $breadcrumb_navxt;
	if($breadcrumb_navxt !== null)
	{
-		return $breadcrumb_navxt->display($return, $linked, $reverse, $force, "<li%3\$s>%1\$s</li>\n", "<ul>%1\$s</ul>\n");
+		return $breadcrumb_navxt->display($return, $linked, $reverse, $force, "<li itemprop=\"itemListElement\" itemscope itemtype=\"https://schema.org/ListItem\">%1\$s</li>\n");
	}
}
```

# ダッシュボードでbreadcrumb-navxtの設定を編集
### デフォルトはこんな感じ↓
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29776/58cddea5-5ecc-68f4-44ed-8f274caef345.png" width="50%">

### ↓こんな感じでパンくずのリンク有りとリンク無しの部分を変更
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29776/3016282c-401c-6169-28ec-94b4b473b391.png" width="50%">

### コピペ用
```:リンク有りの方
<a itemprop="item" href="%link%"><span itemprop="name">%htitle%</span></a><meta itemprop="position" content="%position%">
```
```:リンク無しの方（Unlinked）
<span itemprop="name">%htitle%</span><meta itemprop="position" content="%position%">
```

設定画面のタブ、General、Post Types、Taxonomies、Miscellaneous全て書き換えないとエラー出る。

### 表示させる時
下記コードを表示させたい場所に記述する
```
<ol itemscope itemtype="http://schema.org/BreadcrumbList">
	<?php if(function_exists('bcn_display')){
		bcn_display_list();
	}?>
</ol>
```
【Git】分岐したコミット履歴の作り方。どうやったらコミットを分岐できるのか？（分岐するmergeと分岐しないmergeの違い）

git logでコミット履歴を確認しているときに、分岐した処理が表示されることがある。

git mergeしたときに発生する場合があるがが、どういった場合にコミット履歴が分岐するのかを理解することで、gitの理解を深める。

▼こういう履歴の作り方

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/06729718-b9ba-712b-599b-0a741d333348.png)

コミット履歴をグラフと1行で表示するには、オプションで --oneline　と　--graph　をつける。

`$git log --oneline --graph`


<br>
コミット履歴の分岐が発生するのは、自分のブランチと派生先のブランチの最新のコミットが完全に分岐しているとき。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/f56b6895-6093-fb8b-a63f-705c43c9999c.png)|
|:--|



<br>
**▼分岐元が共通の場合はコミット履歴は分岐しない**
どちらかのコミットが共通のコミットから進んでいなければ、git mergeした後もコミット履歴は分岐しない。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/e700f340-6147-4da6-3e2d-32278cace724.png)|
|:--|



<br>
##gitで分岐を作成する

```
#新しいブランチを作成
$ git checkout -b test
Switched to a new branch 'test'

#ブランチの確認
$ git branch
  master
* test
```

この時点ではそれぞれ最新のコミットが共通しているため、各ブランチで別々の変更をコミットする。

※注意：　同じファイルを編集するとconflictすることがあるので、別のファイルを作成し編集する。


**▼masterブランチ**
新規ファイル`style.css`を作成しコミット。

```
$git add style.css
$git commit -m "add style.css"

$ git log --oneline --graph
* f9c877b (HEAD -> master) add style.css
* 0060ce9 (main/master) first ci
```


**▼testブランチ**
新規ファイル`index.html`を作成しコミット。

```
$git add index.html
$git commit -m "add index.html"

$ git logg
* 026105e - (HEAD -> test) add index.html
* 0060ce9 (main/master) first ci
```

<br>
**▼git merge (at master)**

それぞれのブランチのコミットが完全に分岐したので、masterブランチに移動して、`git merge`する


```
$ git merge test
Merge made by the 'recursive' strategy.
 index.html

$ git log --oneline --graph
*   4fb9b74 (HEAD -> master) Merge branch 'test'
|\  
| * 026105e (test) add index.html
* | f9c877b add style.css
|/  
* 0060ce9 (main/master) first ci
```

分岐成功。
Qiita Markdown記法 まとめ

# はじめに

Qiitaでの記事の書き方の練習も兼ねて，まずはMarkdown記法をいくつかまとめてみました．


# 目次

1. [見出し][1]
2. [リスト][2]
3. [順序付きリスト][3]
4. [文字の修飾][4]
5. [空行と改行][5]
6. [文字色の変更][6]
7. [テーブル][7]
8. [リンク][8]
9. [コードの挿入][9]
10. [引用][10]
11. [注釈][11]
12. [マークダウンのエスケープ][12]

[1]:#見出し
[2]:#リスト
[3]:#順序付きリスト
[4]:#文字の修飾
[5]:#空行と改行
[6]:#文字色の変更
[7]:#テーブル
[8]:#リンク
[9]:#コードの挿入
[10]:#引用
[11]:#注釈
[12]:#マークダウンのエスケープ

# 見出し

文頭に「#」をつけることにより，見出しを作ることができます．
また，文頭の「#」の数により見出しの重みを変えることができます．（#の数はhtmlにおけるh〇に相当します）

```
# 見出しh1
## 見出しh2
### 見出しh3
```

># 見出しh1
## 見出しh2
### 見出しh3


# リスト
文頭に「-」「+」「*」をつけて，リストを作成することができます．

```
- リスト
+ リスト
* リスト
 * 小リスト
```

> - リスト
+ リスト
* リスト
 * 小リスト


# 順序付きリスト

文頭に「〇（数字）.」を付けます．

```
1. 順序付きリスト
2. 順序付きリスト
```

> 1. 順序付きリスト
> 2. 順序付きリスト


# 文字の修飾

- イタリック ---> 「_」「*」でくくります
- 太字 ---> 「__」「**」でくくります
- 打消し線 ---> 「~~」でくくります

```
_イタリックitalic_
__太字__
~~打消し線~~
```

> _イタリックitalic_
> __太字__
> ~~打消し線~~


# 空行と改行

半角スペース2つで空行，「\<br>」で改行ができます．

```
一行目
二行目  （←半角スペース2つ）
三行目
<br>
四行目
```

> 一行目
二行目  
三行目
<br>
四行目


# 文字色の変更

「\<font color="〇">」（〇は任意の色）とすることで文字の色を変更できます．

```
<font color="Red">テキスト1</font>
<font color="#ee82ee">テキスト2</font>
```

> <font color="Red">テキスト1</font>
> <font color="#ee88ee">テキスト2</font>


# テーブル

「\|」でくくります．
また「:」を入れることにより文字の位置を変えることができます．

```
|左揃え|中央揃え|右揃え|
|:---|:---:|--:|
|align-left|align-center|align-right|
|左揃えです|中央揃えです|右揃えです|
```

> |左揃え|中央揃え|右揃え|
|:---|:---:|--:|
|align-left|align-center|align-right|
|これは左揃えです|これは中央揃えです|これは右揃えです|


# リンク

リンク付きの文章を表示します．

```
[リンク付き](https://qiita.com)

## ページ内リンク

[ページ内リンク][100]
\[100]:#ページ内リンク（←「\」はエスケープ．後述）
```

> [リンク付き](https://qiita.com)
> ## ページ内リンク
> [ページ内リンク][100]
[100]:#ページ内リンク


# コードの挿入

「\`\`\`」で囲むことにより，コードを挿入できます．
また，「\`\`\`」の直後に「言語:ファイル名」を記述すると言語とファイル名を指定できます．

```javascript:app.js
console.log('Hello world!');
```


# 引用

文頭に「\>」を付けることにより，引用分を書くことができます．

```
> テキスト
>> ネストされたテキスト
```

> テキスト
>> ネストされたテキスト


# 注釈

以下のようにして注釈を書きます．
また，注釈は記述する場所に関わらず文末に表示されます．

```
テキスト[^1]
\[^1]: 注釈内容（←「\」はエスケープ．後述）
[^1]: 注釈内容
```

> テキスト[^1]


# マークダウンのエスケープ

「\」をMarkdownの前に記述することでMarkdownを無効化できます．この記事でも用いています．

```
\ ### ダミーのタイトル
```

> \### ダミーのタイトル


# まとめ

記事を書くために使いそうな記法をまとめました．このほかにも多くの記法があるので，他の記事も参照してみてください．また，**Qiitaで公開されているURLの末尾に「.md」を付けるとマークダウンを見ることかできる**ので，試してみてください．


# 参考にした記事
* [Qiita Markdown 書き方 まとめ](https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1)
* [Qiita マークダウン記法 一覧表・チートシート](https://qiita.com/kamorits/items/6f342da395ad57468ae3)
* [Markdown文法まとめ](https://qiita.com/higuma/items/3344387e0f2cce7f2cfe)
【AWS】S3 Glacier アーカイブの削除からボールトの削除（Win）

負の遺産を整理するために仕方なくAWSをコマンドラインから操作した記録です。

[とても丁寧な取説が用意されている](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-welcome.html)んですが、とにかく初級者には敷居が高い。
そもそものAWSの仕組みを理解していないので厳しいものがありました。

手順は↓こんな感じで、ひとつずつ見ていきましょう。

```
1.AWS CLI（Ver2）をインストール
2.ユーザと認証キーの作成
3.セットアップ
4.Glacierのジョブの開始
5.アーカイブリストの取得
6.アーカイブの削除
7.ボールトの削除
```

### 1.AWS CLI（Ver2）をインストール
これは難しいことはありません。
インストーラーをダウンロードしてインストールするだけです。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-windows.html

バージョンが1と2がありましたが2を選びました。理由は特にありません。

### 2.ユーザと認証キーの作成
まずコマンドラインを使うためにユーザが必要です。
↓未作成の場合はここで作成します。
https://console.aws.amazon.com/iam/home#/users

私の場合はすでに複数のユーザがあったのでフルアクセス権限の付与されたユーザを使うことにしました。

ユーザが作成出来たらそのユーザの認証キーを作成します。

ユーザ名をクリックした先の「***認証情報タブ***」に行き「***アクセスキーの作成***」をクリックします。
ポップアップが開きアクセスキーが表示されますが、***必要なキー情報はポップアップを閉じると閲覧できなくなってしまう***ので控えておきましょう。
![cap1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31194/33817ff2-f3c9-c311-f3aa-9f1105569ca0.png)

### 3.セットアップ
コマンドプロンプトを開き、初期設定をするため下記のコマンドを打ちます。

```sh
$ aws configure
```
すると認証キーを求められるので以下順番に入力していきます。

```sh
AWS Access Key ID [None]: xxxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

### 4.Glacierのジョブの開始
セットアップが完了したらジョブを開始します。

```sh
aws glacier initiate-job --vault-name xxxxx --account-id xxxxx --job-parameters '{"Type": "inventory-retrieval"}'
```

***--vault-name***は対象のボールトの名前で、***--account-id***はログイン後のアカウント名のプルダウンに記載があります。
![cap2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31194/e055d36b-5e60-edb0-30db-18b51a6e664a.png)

***ジョブの開始コマンドを打ってから3~4時間くらい待たないとジョブが開始されません。
今回の一連の作業ではコマンド打った後の処理がどれも時間がかかるため、計画的なご利用を推奨します。***

### 5.アーカイブリストの取得
***ジョブを開始して3~4時間くらいたつとようやく色々コマンドが叩けます。***
***ボールトは空じゃないと削除できない***ので、まずはアーカイブを削除するためにアーカイブのリストを取得します。

```sh
aws glacier get-job-output --vault-name xxxxx --account-id xxxxx --job-id xxxxx output.json
```
上記コマンドを打つと所定のディレクトリ（私の場合は***C:\Users\[User]***）に「output.json」というファイルが生成されます。
中身は↓こんな感じです。
※ジョブが開始されていないとエラーが返されます。

```json

{
"VaultARN":"arn:aws:glacier:region:111122223333:vaults/awsexamplevault",
"InventoryDate":"*** job completion date ***",
"ArchiveList":[
{"ArchiveId":"*** archiveid ***",
"ArchiveDescription":*** archive description (if set) ***,
"CreationDate":"*** archive creation date ***",
"Size":"*** archive size (in bytes) ***",
"SHA256TreeHash":"*** archive hash ***"
}
{"ArchiveId":
...
]}
```						

### 6.アーカイブの削除
output.jsonに記載されている***ArchiveId***を使ってアーカイブ削除のコマンドを打ちます。

```sh
aws glacier delete-archive --vault-name xxxxx --account-id xxxxx --archive-id xxxxx
```

※--archive-idは「-」とか「=」で始まる文字列の場合があり、コマンドではじかれるので「'」で括ってあげると良いです。

うまくいくと何も起きません。（レスポンスはありません）
で、ここでも時間がかなりかかります。
私の場合は***コマンド打ってから実際にアーカイブが削除されるまで5時間くらいかかりました***。

### 7.ボールトの削除
コマンドでもいけるようですが管理画面で対象のボールトを選択肢て削除しました。


以上かなり恐る恐る操作しましたがなんとか削除することができました。
この手の引継ぎ資料はちゃんと用意しましょうね。
細胞のセグメンテーションをやってみた(HPA-Cell-Segmentation)

## 経緯
最近、Kaggleをちょこちょこやってます。[Human Protain Atlas](https://www.kaggle.com/c/hpa-single-cell-image-classification)というコンペに参加しているのですが、そこで細胞のセグメンテーションタスクがあり、そのときに試した、細胞のセグメンテーションをやってくれるリポジトリの使い方を共有します。[HPA-Cell-Segmentation](https://github.com/CellProfiling/HPA-Cell-Segmentation)というリポジトリです。

## 環境

- Ubuntu 20.04
- Python 3.8.5(Virtualenv)

## 手順
まずは下の手順で環境を作成します。

```bash
$ git clone https://github.com/CellProfiling/HPA-Cell-Segmentation.git
$ cd HPA-Cell-Segmentation
$ sh install.sh
// 下のコマンドでエラーが出なければOKです
$ python -c 'import hpacellseg'
```
サンプルコードがリポジトリにあったので、それを元に試してみました。imagesに細胞の微小管、核、小胞体の画像のセットを渡してあげます。データセットは[こちら](https://www.kaggle.com/c/hpa-single-cell-image-classification/data)から入手しました。

```python
import hpacellseg.cellsegmentator as cellsegmentator
import matplotlib.pyplot as plt
from hpacellseg.utils import label_cell, label_nuclei
# Assuming that there are images in the current folder with the
# following names.
images = [["test/0a12663b-71ff-49e2-9fd9-b9a1bba5a9b4_red.png"],
        ["test/0a12663b-71ff-49e2-9fd9-b9a1bba5a9b4_blue.png"],
        ["test/0a12663b-71ff-49e2-9fd9-b9a1bba5a9b4_yellow.png"]]
NUC_MODEL = "./nuclei-model.pth"
CELL_MODEL = "./cell-model.pth"
segmentator = cellsegmentator.CellSegmentator(
    NUC_MODEL,
    CELL_MODEL,
    scale_factor=0.25,
    device="cuda",
    padding=False,
    multi_channel_model=True,
)

# For nuclei
nuc_segmentations = segmentator.pred_nuclei(images[1])

# For full cells
cell_segmentations = segmentator.pred_cells(images)

# post-processing
nuclei_mask = label_nuclei(nuc_segmentations[0])
nuclei_mask, cell_mask = label_cell(nuc_segmentations[0], cell_segmentations[0])
plt.imshow(nuclei_mask)
plt.show()
plt.imshow(cell_mask)
plt.show()
```

## 結果
入力画像の微小管の画像はこちらです。
![0a12663b-71ff-49e2-9fd9-b9a1bba5a9b4_red.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663246/467671b6-39d5-877c-45f6-7a50cc459eec.png)

入力画像の核の画像はこちらです。
![0a12663b-71ff-49e2-9fd9-b9a1bba5a9b4_blue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663246/b911b840-a2f6-272a-20e6-0410689d388f.png)

入力画像の小胞体の画像はこちらです。
![0a12663b-71ff-49e2-9fd9-b9a1bba5a9b4_yellow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663246/57c9c7a6-9a68-0b46-2b6f-b15646d8e7c7.png)

この3つの画像を入力として、先程紹介したコードでセグメンテーションした画像は下のようになります。まずは細胞全体です。
![Figure_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663246/cbeaa1eb-8591-af89-db73-65a892d0127a.png)

次は核をセグメンテーションした結果です。
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663246/5df1c8e6-e6de-522d-3087-9af50b3ae62a.png)

## まとめ
こんな感じで簡単に細胞をセグメンテーションできました。Kaggle面白くなってきました。
ChromebookのLinux(ベータ版)でapache2を起動し、外部からアクセスする

<h1>ChromebookのLinux(ベータ版)でApache2を起動して外部のPC、スマホからアクセスしたい！</h1>
どうも、Chromebookをサーバーにしたい(サーバー不足)のaapythonです。
<h2>準備</h2>
1. Chromebookをアップデートする。(設定の【chrome OSについて】で可能)
2. Linuxベータ版を有効にする。
3. ポート転送をクリック
![InkedScreenshot 2021-02-19 at 10.15.45 AM_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700063/0bce8b4e-e103-8488-619b-dd844b69f0b3.jpeg)
4. 追加をクリック
5. ポート番号を　8080、TCPにして追加する。
<h2>Linuxでの作業</h2>
1.  ```sudo apt update``` と ```sudo apt upgrade```をしておく。
2. ```sudo apt install apache2``` でapache2をインストール。
3.  ```sudo nano /etc/apache2/ports.conf```
  nanoなどのエディタで五行目を　Listen 8080　にする。
4. ```sudo systemctl restart apache2``` を実行し、apache2を起動。
<h2>外部から確認</h2>
1. クロームブックのIPアドレスを確認(設定→ネットワーク→WIFI→接続してるWIFIのSSID　の順に進んで確認)
![InkedScreenshot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700063/45aca836-5769-fa27-3f17-46b7379b32dd.jpeg)
2.外部から IPアドレス:8080 にアクセス
Apache2 Debian Default Pageが出てくる。
/var/www/html/の下にhtmlが保存されてある。
LaravelでBootstrap-Iconsを利用する

まず問題！

``` php:main.blade.php
<img src="./node_modules/bootstrap-icons/icons/bootstrap-fill.svg" alt="" width="32" height="32" title="Bootstrap">
```
上のパスのどこが間違ってるでしょうか！正解は`node_modules`にアクセスはできないってとこです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283091/e1a0f17c-014f-ce53-40fd-629071ca389d.png)
404で参照できないって言われます...。
まぁ参照する方法はあると思うのですが、まず`node_modules`はGit管理外の場所なのでおすすめはしないです。

そこでなら調べたら`Laravel/Mix`に良い機能があるではないですか！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283091/4933d5d5-f6b5-3158-0a4b-11fc41a1da0a.png)
https://readouble.com/laravel/5.5/ja/mix.html

`mix.copy`に`コピー元`と`コピー先`を指定すれば`npm run dev`などの実行時にコピーしてくれるみたいです。

`public\`の中なら読み込みができるので`bootstrap-icons`というフォルダーを作成して

``` javascript:webpack.mix.js
mix.copy('node_modules/bootstrap-icons', 'public/bootstrap-icons');
```
を追加して`npm run dev`を実行すれば
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283091/388bfd48-dc4e-9e3a-108b-ede2a20978f1.png)
コピーされてると思います！

あとは

``` php:main.blade.php
<img src="bootstrap-icons/icons/bootstrap-fill.svg" alt="" width="32" height="32" title="Bootstrap">
```
に変更すれば表示できると思います！
unicornのワーカーがすべて処理中になった時のnginx/Railsログ

nginx -> unicorn の間で待ちが発生すると思うがログにはどうでるんだろう？と思って整理してみた。
考えてみるととても当たり前。でも、もう考えたくないのでまとめておく。

# 結論

- nginxの `$time_iso8601` はリクエストが完了した時刻
- Railsのログに `Started GET xxxx` が記録されるのは unicorn のワーカにリクエストが到達して処理が開始されたタイミング
    - まぁ当たり前か
- unicornが枯渇していてリクエストがワーカーに割り当てるまでの待ち時間は Railsの `Completed` のログに含まれない

# 状況

- 2021-02-19 10:00:00 にリクエストが2つ同時にnginxに到達
- Rails側で、1リクエストを処理するのに10秒かかる

# どう記載されるか？

## 先に到達した方のリクエスト

- nginx
    - `$time_iso8601` は `2021-02-19 10:00:10`
    - `$request_time` は `10`秒
    - `$upstream_response_time` は `10`秒
- Rails
    - `Started GET "/hoge" ...` のログの時刻は `2021-02-19 10:00:00`
    - `Completed 200 OK in xxx ms ...` のログの時刻は `2021-02-19 10:00:10`。 `ms` の所はほぼ10秒」

## 後に到達した方のリクエスト
ワーカーがすべて処理中なので10秒間待たされる。

- nginx
    - `$time_iso8601` は `2021-02-19 10:00:20`
    - `$request_time` は `10`秒
    - `$upstream_response_time` は `10`秒
- Rails
    - `Started GET "/hoge" ...` のログの時刻は `2021-02-19 10:00:10`
    - `Completed 200 OK in xxx ms ...` のログの時刻は `2021-02-19 10:00:20`。 `ms` の所はほぼ10秒」

# 再現手順

1. unicornのワーカー数を1にする
2. 数秒sleepするエンドポイントに対してcurlを2つ同時に実行
AWS cloud9接続時にずっとConnecting状態になってしまう時の対応方法

いろいろと調べたが、この方法で解決した情報を見つけられなかったので投稿しておきます。

不得意な事をいろいろして無駄に時間を使いました…。疲れた。

# 起こったこと
AWSのCloud9接続時「Connecting...」の画面が出て接続できない。
特にAWSの設定等変更していない、突然発生。

# やったこと
以下対応したが解決せず。

https://qiita.com/somarihair/items/759d525153ae68ce4a7f
→再起動しても変わらず

https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/vpc-settings.html
→設定確認しても変わらず、色々と作り直したりしたが変わらず

# 解決した方法
家のルータを再起動したらなおった。

# 原因？
Chromeのデベロッパーツールでcloud9接続時のコンソールを確認した時に、
cloud9のコンソール画面で使用されている「environment-default.js」内、「https://～～～.vfs.cloud9.～～～」にアクセス時、「ERR_CERT_COMMON_NAME_INVALID」のエラー発生していた。

https://support.google.com/chrome/answer/6098869#-200&zippy=%2C%E3%81%93%E3%81%AE%E6%8E%A5%E7%B6%9A%E3%81%A7%E3%81%AF%E3%83%97%E3%83%A9%E3%82%A4%E3%83%90%E3%82%B7%E3%83%BC%E3%81%8C%E4%BF%9D%E8%AD%B7%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93neterr-cert-authority-invaliderr-cert-common-name-invalidneterr-cert-weak-signature-algorithmerr-certificate-transparency-requiredssl-%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%A8%E3%83%A9%E3%83%BC

証明書見てみると謎の証明書をダウンロードしている。（まったく違うドメイン）
どこかのキャッシュが原因？？？

家以外のネットワークから接続
→つながった
→家のルータ再起動
→家のネットワークでもつながった
→ルータのキャッシュのせいかな？（多分）
【Git】リモートのブランチとローカルのブランチをコマンドで削除する方法

###リモートのブランチとローカルのブランチをコマンドで削除する方法について

####・ローカルブランチの削除
他のブランチに移動(checkout)した後に以下を実行。

`$ git branch -D <ブランチ名>`

- ブランチ名は複数記載可能
- `-D`は強制削除　(-d -f)
    - `-d`: --delete
    - `-f`: --force




**▼実例**

```
$ git branch -a
* master
  test
  test2
  remotes/main/master
  remotes/main/test
  remotes/main/test2

$ git branch -D test test2
Deleted branch test (was 0bfac69).
Deleted branch test2 (was 6ae0aa4).

$ git branch -a
* master
  remotes/main/master
  remotes/main/test
  remotes/main/test2
```

testとtest2ブランチが削除できた。



<br>
####・リモートブランチの削除
リモートブランチの中身を変化させる場合は`push`を使う。

`$ git push --delete <リモートレポジトリ名> <ブランチ名>`

- --delte は -d と同じ


**▼その他の方法**

`$ git push <リモートレポジトリ名> :<ブランチ名>`

これは、`git push <リモートレポジトリ名> <ローカルブランチ名>:<リモートブランチ名>`を応用したコマンド。

指定したローカルブランチの内容をリモートレポジトリにプッシュする。**ローカルブランチに空を指定すれば、リモートブランチは空で上書き**され、消える。



**▼実例**

```
$ git branch -a
* master
  remotes/main/master
  remotes/main/test
  remotes/main/test2

$ git push -d main test
To https://github.com/git-test.git
 - [deleted]         test

$ git push main :test2
To https://github.com/git-test.git
 - [deleted]         test2

$ git branch -a
* master
  remotes/main/master
```

`remotes/main/test`と`remotes/main/test2`が削除できた。
IQKeyboardManagerの使用に関すること

IQKeyboardManagerを実装しようとして、podでIQKeyboardManagerとインポートしてもだめだった理由は
swiftとobject-Cの記載が違うからだった。

https://github.com/hackiftekhar/IQKeyboardManager

![スクリーンショット 2021-02-19 10.31.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112697/d66cc424-c8e4-b4d3-7a92-0e86ea6b4375.png)

完全に初歩的なミス…

AppDelegate.swiftにはこう書く↓

```AppDelegate.swift

import IQKeyboardManagerSwift

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

      IQKeyboardManager.shared.enable = true

      return true
    }
}
```

このように入れればできた。
ユーザー単位で投稿できるカテゴリーを限定する

結論、ブロックエディタ解除してクラシックにするのが一番確実。

```functions.php
function show_only_restricted_category() {
    global $current_user;

    if($current_user->ID=='123'){ //ユーザーID指定
    //ブロックエディタの解除
	add_filter( 'use_block_editor_for_post', '__return_false' );

	//カテゴリを指定するフィルターフック
	add_filter('get_terms', 'restrict_categories',10,1);
	function restrict_categories($categories){
	$isPostPage = (strpos($_SERVER['PHP_SELF'], 'post.php') || strpos($_SERVER['PHP_SELF'], 'post-new.php')); 
		if(is_admin() && $isPostPage){
			$size = count($categories);
			for ($i = 0; $i < $size; $i++){
				//表示したいカテゴリの指定
				if($categories[$i]->slug != 'category-1' && $categories[$i]->slug != 'category-2') unset($categories[$i]);
				}
			}
			return $categories;
		}
    }
}
add_action('admin_menu', 'show_only_restricted_category');
```
未経験エンジニアの面接対策

##自己紹介
看護師からエンジニアを目指す30代未経験。
現在就活真っ只中であるが、医療職以外の転職活動をしたことがないため、
情報収集の毎日です。
未経験ではあるが、これまでの経歴は新たな企業で生かせるよう自分をアピール（知ってもらう）ために
どうしたらよいか、まとめてみた。

##面接８つのポイント

```
① 志望動機の作り方
② 自己紹介に個性を
③ 想定質問の回答準備
④ 過去の失敗でアピール
⑤ 「結論」から言う
⑥ 「敬語」は強く意識しない
⑦ 「緊張」も強く意識しない
⑧ 面接後は自己採点する
```
深掘りします。

##① 志望動機の作り方
```
 適性がある人　＝　伸びる人 ＝ 早期に辞めない人 ＝ 元が取れる人
```
　面接では自分をアピールするエピソードを持ってくる人かどうかを見られる。

##② 自己紹介に個性を
```
 自己紹介　＝　アイスブレイク
```
　はじめなので、面接官も緊張している。硬さをとりたい。
　履歴書に書いたことを伝えても、話題が膨らまない。
　自身のモットーや価値観、意気込みを繋げた自己紹介の方がより相手に知ってもらうことができる。

##③ 想定質問の回答準備
```
　★配点高めな質問項目　（特に企業が重点を置いて聞く項目）
　　　　・志望動機　　　　・退職理由（転職のみ）　　・自己PR（長所）　　・短所
　　　　・キャリアプラン　　・逆質問
```
　相手がどんな意図で質問してきたのか、その場その場で質問の意図を汲み取って考える（難易度高い...）
　エンジニアとしては未経験だが、これまでの経歴を活かして、新たな企業で利益を生み出すことができる人材かどうかがポイントとなる。
　中途の場合には、戦力が求められる。
　__!!point!!  「回答は、文章で覚えない。」__
　文章で覚えると、緊張した際に飛んでしまう。
　スライドの様に図解で「情報が視覚的に記憶する」様に準備する。
　

##④ 過去の失敗でアピール
```
社会人として成長するためには、 「できないことをできることに転換するスキルが大事」 なため
```
失敗を要素分解して、原因と解決策を見出す。
面接官より、失敗として指摘された場合には失敗と認める。他者からみるとそれは失敗である。

##⑤ 「結論」から言う

【初学者】伝え方　〜結論から話す〜
https://qiita.com/pagk/items/2d901e1b793e8e783c63

##⑥ 「敬語」 は強く意識しない
聞いているほうも聞きづらい印象になる場合がある。
相手にしっかり伝えるということに注力する。

##⑦ 「緊張」 も強く意識しない
```
しっかりと準備をする
```
緊張はするもの。
しっかり準備して、回答できるようにしておく。回答は図解で記憶する。

##⑧ 面接後は自己採点する
```
 「自己採点を終えるまでが面接である」
　　　（記入例）日付　企業名　
　　　　　　　どんな質問がでたか。どう答えたか。
　　　　　　　今後の改善点　　　
```
数をこなしながら改善していく。




##参考文献
エンジニアを面接するときに面接官が本当に知りたいこと
https://qiita.com/newta/items/63a06516521998ddd9f0
Qiita Daily Survey memo 2021.02.19

# Qiita Daily Survey memo 2021.02.19
Qiita の記事を可能な限り毎日読むために、読んだmemoを公開することでモチベーションを維持しようという試み。

## [Vue.js でマインスイーパーをつくる](https://qiita.com/kosuke-sugimori/items/894277a9d50fe7bd7661)
杉森 航介(kosuke-sugimori) さんの記事。
タイトルの通り、Vue.js でマインスイーパーを作成する過程と、作ったものを公開されている記事になります。
毎回書いてる気がしますが、動くものを作って公開までやっているのがSUGOI。
また、特徴として概念図があるので、とても分かりやすいです。
勉強がてら、何かを作ってみるのはモチベーションになりますよね…！
React しか触ったことがありませんが、チュートリアルがてら Vue.js も触ってみようかと思いました！
そして、「公開」まで頑張りたいです…。

## [研究室内コーヒーメーカーの課金処理を【画像認識＋クラウドソーシング】で全自動化した話](https://qiita.com/ssmsaito/items/27683ebb40b57b4be8aa)
Susumu Saito(ssmsaito)さんの記事。
研究室のコーヒーメーカーの課金処理をドリャッと作った様子のまとめになります。
実際に動いているところや、写真・動画を使って非常にわかりやすく書かれています。
また、クラウドソーシングをこんなに細かい単位でできることを知らなかったので、その点でも参考になりました！
昨日の Line Chat Bot でお風呂を沸かす記事もそうですが、ネットワークに繋がった機器がリアルで動くのは夢がありますよね。
ラズパイもブレッドボードも手を出してみたくなりますが、踏ん切りがつかず…。
いつか挑戦してみたいです。


## [【Python】LINEのグルチャ履歴をヌルヌル動くグラフにしてみた～原理からWebアプリ化まで～](https://qiita.com/Kitsuya0828/items/4be1c07aeb461f7d9341)
きつや(Kitsuya0828)さんの記事。
よくある棒グラフが時間経過で伸びていく図の作り方の記事。
バーチャートレース(Bar Chart Race)と呼ぶそうです。
将棋のタイトル保持数や、イチローさんの安打数など、様々なところで見ました。
実装したい方法別に、複数の実装方法を紹介してくださっていて、簡単にトライできそうです！
1. 【今すぐ動かしたい人向け】コースは、触ってみたいと思います。
MacOS 11.2でruby2.2が入らない問題

## 結論
```
brew install rbenv/tap/openssl@1.0
export optflags="-Wno-error=implicit-function-declaration"
export PKG_CONFIG_PATH="/usr/local/opt/openssl@1.0/lib/pkgconfig:/usr/local/opt/readline/lib"
export CPPFLAGS="-I/usr/local/opt/openssl@1.0/include -I/usr/local/opt/readline/include"                   
export LDFLAGS="-L/usr/local/opt/openssl@1.0/lib -L/usr/local/opt/readline/lib"
export RUBY_CONFIGURE_OPTS='--with-openssl-dir=/usr/local/opt/openssl@1.0'
```

## 理由
### その1
openssl@1.0問題

詳細はこちら
https://qiita.com/kazutosato/items/9c4ff7711ca992dd67e5

### その2
11.4(Bug Sur)での問題

詳細はこちら
https://stackoverflow.com/questions/65325136/problem-when-installing-ruby-2-2-9-on-mac-big-sur-m1

## その他
Dockerでいいじゃんという話は無し
※OSのバージョンとToolのバージョンをまちがえました
ビットコインのブロックチェーン

ビットコインで使用されるブロックチェーンのP2P分散型ネットワークというシステム

中央管理者を置かず、大量に分散された電子デバイスにデータが保管され
データの記帳を行う有志の作業者全員で同じデータを管理しています。

取引記録が管理ネットワーク上に公開され、作業者全員で取引の正当性を検証し、
合意によって有効化されます。これにより二重払いなどの不正記録排除が容易になります。

取引データは、大量に分散化された有志の電子デバイスに保管され、一部の電子デバイスで
記録の改ざんが行われてもネットワーク全体の記録まで改ざんすることは極めて困難です。

さらに一部のデータがサイバー攻撃を受け破壊されても、
他の電子デバイスでは同一のデータが保存されているため、データの復旧が可能です。

すべてのデータが同時に破壊されない限りブロックチェーンのサービス停止はほぼなく、
現状実質的には「ゼロダウンタイム」となっています。

参考記事
https://coin.z.com/jp/column/blockchain/
AWS Snowball Edge のデバイスオプションの種類について

## AWS Snowball Edge にはデバイスのオプションがある

デバイスオプションは以下の3種類です

- Snowball Edge Storage Optimized
- Snowball Edge Compute Optimized
- Snowball Edge Compute Optimized with GPU

2021-02-17 Snow Family Console - Google Chrome 2021-02-17 21.![2021-02-17 Snow Family Console - Google Chrome 2021-02-17 21..png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/397429fd-6493-bef5-2f48-61e1bb5a8e13.png)


### Snowball Edge Storage Optimized

大規模なデータ移行や、高容量を必要とするローカルコンピューティングに適しています。
最大80TBが使用可能なストレージ領域があります。
また、アタッチされたブロックボリューム用に1TBの追加SSDストレージ容量も用意されています。

### Snowball Edge Compute Optimized

コンピューティング機能が多く搭載されており、機械学習やフルモーション動画分析などに適しています。
42TB使用可能なHDD容量が用意されています。

### Snowball Edge Compute Optimized with GPU

インストールされているGPU以外は `Snowball Edge Compute Optimized` と同様です。

## 勉強後イメージ

ただ単に大容量を運びたいだけだったら Storage Optimized
分析系だったら Compute Optimized って感じかな？

## 参考

- [AWS Snowball Edge デバイスの相違点](https://docs.aws.amazon.com/ja_jp/snowball/latest/developer-guide/device-differences.html)
- [AWS Snow ファミリーについて](https://www.acrovision.jp/service/aws/?p=2355)
ginza,networkx関係のメモ(mac)

```
pip install --upgrade pip
```

```
pip install ginza
```

pythonで一度下記を実行（おまじない）

```
import pkg_resources, imp
imp.reload(pkg_resources)
```

MacだとFontをIPAexGothicにしてもnetworkx,matplotlibで文字化けするので
font_family='Osaka'
にする。
【Git】git diff HEAD~~..HEADとは何をしているか？。指定したファイル間の差分を確認する方法。

###`git diff HEAD~~..HEAD`とは何をしているか？
指定したコミット間の差分をHEADを使って指定して、確認する方法について。


##git diff
git diff は**コミットの差分を確認**するためのコマンド。どのコードを追加 or 削除したかというのが確認できる。

git diffの指定の方法によって、**何と何を比較するかというパターンが結構ある**。

デフォルトの`git diff`のみでは、**前回のコミットと、ステージ前のワークツリーの状態を比較**している。


>▼git diffの注意点
git diffは、ファイルだけでなくディレクトリを丸毎指定したり、ステージ前とステージを比較したり、リモートブランチと比較したり、様々な状態を比較して確認できる。

>ある意味便利だが、一つ一つ見ていかないと混乱しやすいコマンド。



<br>
##指定したコミット間の差分をみる
`git diff`の後ろに２つの値をつけると、指定したコミットを比較することができる。

```
git diff 前のコミット番号..後のコミット番号
```

コミット番号の指定方法は、**ハッシュ値（SHA）でも指定できるし、HEADでも指定できる**。

わかりやすくするためコミットを前、後としたが、**前のコミット番号は元となるファイル**で、後ろのコミット番号との間でどれだけ変化したかを表示する。

**※ドットは省略できる**
ドットは省略しても同じ挙動になる。

```
git diff 前のコミット番号 後のコミット番号
```



<br>
###ハッシュ値（SHA）
コミット番号のハッシュ値は`git log`で確認できる。オプションの`--oneline --graph`をつけると見やすい

```:
$ git log --oneline --graph
* 3e6a20f (HEAD -> master) add c
* d639d81 add b
* 5363dd1 add a
```

冒頭についている、7桁の数値（3e6a20fなど）がそのコミット番号。

--onelineなどで表示したコミット番号は省略されており、コミットが増えてくると表示される桁数も増える。

本来のコミット番号は`git log`で確認できる。


```:コミット番号（フル）
$  git log
commit 3e6a20fcf9f00b28c0d07b96335c82fb6314d0ef (HEAD -> master)
Author: Name <name@gmail.com>
Date:   Thu Feb 18 22:04:01 2021 +0900

    add c
```



<br>
###HEAD
ハッシュ値以外のコミットの指定方法にHEADがある。HEADは**現在のコミットを基点として、さかのぼる数を指定**する。

さかのぼる数は`^`か`~`で指定する。（キャレットかチルダ）

**▼HEADの考え方**

```:
* 3e6a20f (HEAD -> master) add c
* d639d81 add b
* 5363dd1 add a
```

↓ HEADと対応するコミット

- `HEAD`  3e6a20f
- `HEAD^` d639d81
- `HEAD^^` 5363dd1

または

- `HEAD`  3e6a20f
- `HEAD~` d639d81
- `HEAD~~` 5363dd1





<br>
##git diff HEAD~~..HEADの意味
以上より、`git diff HEAD~~..HEAD`は、２つ前のコミットと現在のコミットを比較しているということ。

```
$ git diff HEAD~~..HEAD
diff --git a/resources/views/line.blade.php b/resources/views/line.blade.php
index 1795ce6..af20ab6 100644
--- a/resources/views/line.blade.php
+++ b/resources/views/line.blade.php
@@ -72,4 +72,6 @@

 <div>a</div>
+<div>b</div>
+<div>c</div>
```


`+`が前のコミットから追加された内容。ｂとcのdivタグが追加されている。



###git diff HEAD..HEAD~~
比較するファイルの順番を逆にするとどうなるか？

基準元のファイルがHEADになり、２つ前のコミット時点のファイルとの差分を表示する。

```
$ git diff HEAD..HEAD~~
diff --git a/resources/views/line.blade.php b/resources/views/line.blade.php
index af20ab6..1795ce6 100644
--- a/resources/views/line.blade.php
+++ b/resources/views/line.blade.php
@@ -72,6 +72,4 @@

 <div>a</div>
-<div>b</div>
-<div>c</div>
```

最新のコミットから見れば、昔のファイルは、`-`でbとcのdivタグがなかったことがわかる。




###ドットはなくてもOK
コミット番号の間を繋ぐドット２つは省略できる。

```
$ git diff HEAD^^ HEAD
diff --git a/resources/views/line.blade.php b/resources/views/line.blade.php
index 1795ce6..af20ab6 100644
--- a/resources/views/line.blade.php
+++ b/resources/views/line.blade.php
@@ -72,4 +72,6 @@
 
 <div>a</div>
+<div>b</div>
+<div>c</div>
```


<br>
以上。
【Twitter API】ツイートにアプリ名を表示させる方法

どうも。再びカラボンです。

今回はTwitter APIでツイートした時に表示されるアプリ名を表示させる方法を教えていきたいと思います。

<h3>ツイートアクティビティの表示方法 </h3>

1.https://developer.twitter.com/en/portal/dashboard
にアクセスします。

2.設定をしたい自分のアプリにアクセスします。

3.Settingsタブで下にある<b>Authentication settings</b>のEditボタンを押します。

4.<b>ORGANIZATION NAME</b>に表示させたいアプリの名前を入力します。半角空白とハイフンはアンダーバーに置き換えられます。
このまま保存したいところですが今のところではここの項目のみの保存が出来ないのでCALLBACK URLSやらに入力し保存しましょう。

![D4D8D73F-C5D9-4C15-81A1-E97102E505F5.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086026/48bcc161-9de5-0a92-dc35-7226f697b877.jpeg)

↑
ここに入力します。

5.設定が保存できたら、まずはAPIを使ってツイートしてみましょう。

このように表示されたらOKです。

![6C468E36-7BDA-4F0E-889B-3D77D5025D71.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086026/714ae47e-8de3-585a-d626-2e5e84140002.jpeg)

元ツイート
↓
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ラトブガハシス</p>&mdash; カラス (@crow_py) <a href="https://twitter.com/crow_py/status/1362465913572794368?ref_src=twsrc%5Etfw">February 18, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【個人開発】現在地にタイムカプセルを埋める的なアプリを作ってみました(LINE BOT)


#はじめに
Qiitaはよく参考にさせてもらっています。いつもは完全に趣味全開の投稿しかしてませんが
いつか【個人開発】というタイトルで投稿してみたいなと思ってたので今回頑張ってみました




#サービス概要

１、現在地（緯度・経度）にWEBサイト（写真×１、動画×１、音声×１、テキスト）を登録できる
　　また、そのWEBサイトの公開時間を設定できる

２、現在地から半径５００M程度の中にある「登録されたWEBサイト」を検索できる

３、上記二つの機能をLINEで友達になることで実現する


※要はLINEボット作ったよということです。。

#使い方

「 https://lin.ee/kUAy2qr 」をLINEで友達登録してください

![L.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90606/79affb9d-1a7f-4ec4-373a-d9596112f7ba.png)


画面下部にあるリッチメニューをタップして操作します

###・投稿
「PUT in」をタップするとブラウザが開いてこの画面になります。
写真、音声、動画、テキスト、閲覧開始日、閲覧期間の設定ができます。
（※位置情報取得の許可を聞いてくる場合があるので許可してあげてください）

![screenshot-1613654778925.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90606/27fe2a71-ac1a-41b3-b859-68d7be6263b9.jpeg)


###・検索
「GET OUT」をタップすると、クイックリプライボタン（Here）が出てくるのでタップすると現在地を送ることが出来ます。
すると現在地から半径500M程度の中から閲覧期間にあるものを近い順に表示します


![screenshot-1613654818310.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90606/bca96f4d-ff45-ceb9-2099-18018a34b5de.jpeg)


###・詳細
「SITE」ボタンをタップすると、WEBサイトが開きます（図にはありませんが、動画や音声はこのサイトで見ることができます）
「MAP」をタップするとその場所を示すメッセージが返ってきます。タップすればグーグルマップ等が開いて経路案内出来ます
![screenshot-1613654888957.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90606/fc344235-f0f9-caae-f425-27de6d037b0d.jpeg)

#使用技術について
・python（Flask,line-bot-sdk）
・javascript少々
・postgis

#環境
・heroku(アドオンでpostgresql、cloudinary)
全部無料枠です。ありがたい

#こんなシーンで・・
ごはん屋さんでランチメニューをアップして近くの人に宣伝するとか・・
旅行先でアップして閲覧期間を数年後にしてまた来る約束するとか・・
あってほしくないですけど、災害時の伝言板として使うとか・・


#今後は・・
サイト開くときにパスワードを設定できるようにしようかなーと思います。

#おわりに
ポケモンGOが好き（現実の世界とWEBの世界の微妙な距離感が好きです）で、いつか位置情報を使った何か作りたいと思っていました。
構想１日、実装４日で一気にやりました。自分で作りたいものを作るのはやっぱり楽しいですね
デザインもっとうまくできるようになりたいなぁと思います。あとjavascriptももっとスラスラ書けるようになりたい。。
LINEBotだと、OSごとのアプリ作らなくていいし（作れない・・）いいかなと思いました
Serverless Meetup Japan Virtual #16 の「ZoomでMeetUp枠」に参加しました！

# Serverless Meetup Japan Virtual #16 って？

Serverless Community(JP)さんが主催するコミュニティのイベントです。
https://serverless.connpass.com/

サーバーレスについて色々語る、AWSの中の方々も参加されている素敵なコミュニティのイベントとなっております。
YouTubeのチャンネルと今回の動画は以下です！

- [チャンネル](https://www.youtube.com/channel/UCfxQU-DkoT78c2OyBSDfh3w)
- [動画](https://www.youtube.com/watch?v=DsKMHDh9yVg)

## 今回のテーマ

今回のテーマは「技術選定」でした。
技術選定、大変ですよね…選定理由を説明したり、選定前に試行錯誤したり、ビジネスインパクトも考えたり…
みなさんはどうやって技術選定されているか、気になるところです。

## Speakers

今回お話いただいたのは「コロニー株式会社 VPoE 座安 勇貴さん」でした。
2020年4月からサーバーレスを選定ということで、割と最近ですね！

と思ったら既に2021年でした。2020年の記憶がありません！

## 感想

### Spec1:API-GatewayとLambdaの鉄板構成！

王道にして正道、サーバーレスでウェブアプリ作るならこれ！という完成形ですね。
奇をてらわないことにより、サービス展開やビジネスロジックに集中できると個人的にも思います。

#### 熱いのはRDS Proxyの導入
個人的にもずっと気になって仕方ないRDS Proxy...
RDBを使わなくてはいけないケース、まだまだあります。
ENI問題はAWSさんのお陰で解決しつつあるものの、つきまとうコネクションプール問題…

これを早速導入されているのは非常に熱いものでした！

気になっていたので「使っていて困ったことやトラブルはありましたか？」と質問してみましたが…
特になかったとのことです！さすがAWSさん、素晴らしいサービスをありがとうございます（感謝

ただ、気をつけるべき事項についてはAWS下川さんがTweetしてくださった以下の記事がありますので、一読せねばです！

[オンラインセミナー「RDS+Lambda が始まる。過去のアンチパターンはどう変わるのか」 資料および QA 公開](https://aws.amazon.com/jp/blogs/news/onlineseminar-rds-lambda-doc-qa/)

### Spec2:AppSync+DynamoDBのチャット機能！

こちらも手を付けたくて付けていないAppSync...
そして、つらいこととして挙げられていた「VTLはやっぱりつらい」
つらいですよね…

#### 便利なDynamoDBストリーム

テーブルの変更検知でLambdaを発火させることができるのは便利ですよね。
ただ、大量発火に気をつけないといけないというのは正にそのとおり…DynamoDBはものすごい勢いで書き込みをすることが可能なので、大変な事態になる前に対策しなければなりません。

前職でDynamoDB変更検知でLambda→RDS書き込みしていましたが、今考えるとかなり無茶だった気がします。
SPAでブックマークラベルをON/OFFさせながら、お気に入り一覧を画面に出す際にちょっと複雑なクエリを発行するため、RDBが必要だったのでやってみたのですが…（遠い目

### Spec3:Cognito+Lambda+SESのカスタム認証！

これも調べたらよく出てくるとありますが、私は知らなかったので勉強になりました。
メールアドレス認証を気軽に使いたい場面、小さく始めるときには便利そうです。
試したいけど踏み出せない…

#### 認証は常に悩むけど

毎度作るとき悩みます。
Cognito使ってサーバーレスの鉄板構成でもいいのですが。
最近はAuth0が使いたい…でも技術選定の理由説明をどうしたものかなぁ。

### Spec4:S3+RDS(Hosting File Service)！

これもいいですね！最近では鉄板？
署名付きURLが便利だというのは心の底から同意です。

#### DynamoDBを使いたいけど
質問であがっておりましたとおり、この構成ならRDSでなくてDynamoDBでいいかもしれません。
ただ、座安さんは「RDBに馴染みがあって」という、これまた心の底から頷いてしまう理由を仰っておりました。
わかります（泣）
そう、分かってはいるのですが、RDBが…

### Summary

課題に挙げられていた「サービスがスケールしたときどうなるか考える」というのは、私が現在行っているPoCをメインとしたチームでも課題になるものだなと共感しました。
個人的に、どの程度のサービス規模なら耐えられるのかという明確なメトリクスは、恐らくないのだろうなと思います。

ビジネス課題を解決するために選んだサーバーレスで、サービスのスケール時にビジネス課題を生み出してしまうのは本末転倒…

マネジメントサービスを選択したからこそ受ける恩恵もあれば、事前に把握しておきたい制約も知っておかなければスケール時に困るかもしれない。

しかし、実際にやってみないと地雷を踏むことがない。

卵が先か鶏が先か…これを議論し続けることも非常に重要なことだと改めて感じます。

## おわりに

### サーバーレスの監視ってどうしよう

Speakerの座安さんは、監視についてはまだこれからというお話でした。
サーバーレスに限らずマネジメントサービスは便利なのですが、ブラックボックスになる箇所も多いため、なんとなく監視してる風な監視は本当に機能しなくなりますよね。

サービスが稼働している限り、監視からは逃れられない運命なので、ここは個人的にも再考したいなと思います。

### 配信終了後

配信終了後、色々とお話をすることができました。
つよつよなエンジニアに囲まれて萎縮していましたが、みなさんお優しくて非常に有意義な時間を過ごすことができました！

私も2020年4月に現在の会社にジョインしたばかりですので、チームの外に出ると社内の温度差を感じることもありますが、徐々に社内のデジタル熱を上げていければと強く思います！
Electronで透明なウィンドウを作成する（Electron@11.2.3）

# この記事について
Javascript初心者がElectronでデスクトップアプリを作ってみたときに、最新のElectronだと透明なウィンドウが表示できなかったので、対処法を記載しています。
同じく透明ウィンドウが作れない方の参考になればと思います。

# 前提
* Node.jsやElectronは導入済み
* 細かい理屈は知らんが動けばいいって人向け

# 筆者の環境
* Windows10 64bit
* node.js v14.15.5
* Electron v11.2.3

# とにかく解消法が知れればいいて人
* fullscreen:false;とwidthとheightを-2pxする

# 発生事象
[heroku + electron でニコニコメソッドを作ってみました。その２（ルーム分け機能追加）](https://qiita.com/UC-SADA/items/39c43a1b196391a3e9e7)とか[Electronでデスクトップいっぱいに雪を降らせるアプリを作る](https://qiita.com/nyamogera/items/a2e367b44e78d04ee3a6)みたいに透明なウィンドウで画面いっぱいになんか出したいって、アプリを作ってました。

参照先のサイトを参考にしながら作りました。

``` Javascript:main.js
"use strict";
var electron = require("electron");
var app = electron.app;
var BrowserWindow = electron.BrowserWindow;
app.on('ready', function () {
    var Screen = require('screen');
    var size = Screen.getPrimaryDisplay().size;     // ディスプレイのサイズを取得する
    var mainWindow = new BrowserWindow({
        width: size.width,   // 最大サイズで表示する
        height: size.height, // 最大サイズで表示する
        frame: false,      // ウィンドウフレームを非表示に
        show: true,
        transparent: true, // 背景を透明に
        resizable: false,
        'always-on-top': true // 一番手前に表示する
    });
    mainWindow.setIgnoreMouseEvents(true);     // マウスイベント無視
    mainWindow.maximize();
    mainWindow.loadURL('file://' + __dirname + '/index.html');
});
```

Electronをnpm installして起動したところ画面が真っ黒に。。。
![真っ黒.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1119829/d1092ab0-a098-8bbe-1e9b-506989b958e2.png)
※デスクトップに何もなくて壁紙真っ黒なわけじゃないですよ。

Electronのバージョンが違うからかな？とか考えつつ、Electronの公式ドキュメントやStack overflowを探しても対処法が見つからない・・・
Linuxはnpmコマンド実行時に「--enable-transparent-visuals --disable-gpu」オプションをつけなさいは出てきて、Windowsだけど試してもダメ。

いろいろ探してやっと辿り着いた解決策。
[GitHub electron issue27286](https://github.com/electron/electron/issues/27286)
どうやらサイズがフルスクリーンだと発生するらしく、幅と高さをそれぞれ2px減らすとうまく動くらしい。早速やってみる。

``` diff_Javascript:main.js
"use strict";
var electron = require("electron");
var app = electron.app;
var BrowserWindow = electron.BrowserWindow;
app.on('ready', function () {
    var Screen = require('screen');
    var size = Screen.getPrimaryDisplay().size;     // ディスプレイのサイズを取得する
    var mainWindow = new BrowserWindow({
-       width: size.width,   // 最大サイズで表示する
+       width: size.width-2,   // 最大サイズから-2pxする
-       height: size.height, // 最大サイズで表示する
+       height: size.height-2, // 最大サイズから-2pxする
        frame: false,      // ウィンドウフレームを非表示に
       show: true,
        transparent: true, // 背景を透明に
        resizable: false,
        'always-on-top': true // 一番手前に表示する
    });
    mainWindow.setIgnoreMouseEvents(true);     // マウスイベント無視
    mainWindow.maximize();
    mainWindow.loadURL('file://' + __dirname + '/index.html');
});
```

透明になりました。なぜ2pxなのかは不明。1pxだと変わらず真っ黒でした。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1119829/f7bde3cb-4199-55aa-c24c-4a967d7ad945.png)
Invalid: lock file's bootstrap@5.0.0-beta1 does not satisfy bootstrap@^4.0.0の解決法

`npm install`を試したら...。

``` bash:コンソール
% npm install  
npm WARN The package bootstrap is included as both a dev and production dependency.

removed 1 package, updated 2 packages and audited 1098 packages in 5.338s

51 packages are looking for funding
  run `npm fund` for details

found 1 high severity vulnerability
  run `npm audit fix` to fix them, or `npm audit` for details 
```

ほう...ならば`npm audit fix`を試してみる

``` bash:コンソール

npm ERR! code ELOCKVERIFY
npm ERR! Errors were found in your package-lock.json, run  npm install  to fix them.
npm ERR!     Invalid: lock file's bootstrap@5.0.0-beta1 does not satisfy bootstrap@^4.0.0

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/sugitaku03031/.npm/_logs/2021-02-18T16_01_48_905Z-debug.log
```

原因はbootstrapのベータ版にあるみたいですな

以下の部分を削除↓

``` bash:package-lock.json

"bootstrap": {
            "version": "5.0.0-beta1",
            "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.0.0-beta1.tgz",
            "integrity": "sha512-UrHApw/WRmT7l2rlDdn5iXr7Jps/LlMZtJlLn9G41aGDfss48hyDeYyHtX1C6NHKVcmdUarGG+ve0LZB5iHyTQ=="
        },
```
![スクリーンショット 2021-02-19 1.17.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283091/a96261f9-a9a0-1070-631e-e2c2eb1d63b1.png)

と

``` json:package.json

"bootstrap": "^5.0.0-beta1",
```
![スクリーンショット 2021-02-19 1.16.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283091/203c52e9-1a08-876a-29ef-e7b16727350f.png)

を削除して`npm install`を実行！

``` json:package-lock.json

        "bootstrap": {
            "version": "4.6.0",
            "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.0.tgz",
            "integrity": "sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==",
            "dev": true
        },
```

！？なんか追加されたぞ！
続いて一応`npm audit fix`も実行

``` bash:コンソール
% npm audit fix
+ axios@0.21.1
added 1 package from 3 contributors and updated 1 package in 4.526s

52 packages are looking for funding
  run `npm fund` for details

fixed 1 of 1 vulnerability in 1098 scanned packages
```
治った...。

Laravel Framework 8.28.1
独学エンジニアのアウトプット集

本日学んだこと

①var_dumpとechoとの違いについて
・echo・・・文字列を出力する。
・var_dump・・・型と値を出力する。

②プログラムは基本的に逐次実行(上から下に処理されていく。)
より複雑な処理を行うために、if文(条件分岐)やwhile文（繰り返し処理）を使う。

③余白(半角スペースやTABスペース)を削除・・・trimを使用。
例
trim(fgets(STDIN));

④ユーザーがキーボードで入力したもの(下記書籍名)を一時的に変数に保存する。
echo '書籍名：';
$bookTitle = (fgets(STDIN)); 

・fgets($handle)・・・()で指定した中から1行だけデータを取得する。
※$handle部分は読み取るデータ元

・STDIN・・・標準入力。簡単に言うとユーザーがキーボードで入力したもの。

本日出来るようになったことは、空白の削除とfgets(STDIN)を用いたユーザーが入力したデータを取得して、それを変数に一時的に保存して、ユーザーが入力したあとに別個所に表示すること。
※fgetsの際は、ユーザーのデータが取得できるまで、fgetsより下の処理は待機中になることに注意。
続・証明書の透過性が怖いという話

# 証明書情報取得とTIPS
宣言通りスクリプトを作ってみました。
その際のノウハウをつらつらと。

使わせていただいているサービスやパッケージは以下。
### https://crt.sh
SSL証明書の事業者であるSECTIGO（旧コモド）の公開してくださっている証明書の検索サイト。
今回のスクリプトでは結構大量にアクセスしてしまうので、心苦しい。。

### https://www.radb.net/
別記事でまとめた、ミシガン州の大学群によって設立された団体のサービス（？）を利用させて頂いています。
。。。こういう用途で使うもんじゃないんだろうけど、、、

### https://cryptography.io/en/latest/
Pythonの暗号化用パッケージ。
今回はcrt情報のデコードにしか使わないのでオーバスペックな気はしつつですが、デコードだけしかしないパッケージなんてもんも見つかりませんし、素直に使わせていただきます。

# 証明書の概要情報の取得
```
$ curl "https://crt.sh/?q=<Your Domain>&?output=json"
```
これで、対象ドメインの情報をjson形式で取得できます。

'common_name'という要素にCN情報、'name_value'という欄にSANの情報が入ってくるっぽいです。
ただ、厄介なのが、SANについて検索につかった<Your Domain>の文字列を含むものに絞り込まれてしまっているようなんですね。。

例えば自組織がXXXX.example.netというドメインを使っているとして。
そこに、メインではないけど関連システムとしてYYYY.example.netも追加シなければいけない時。
YYYY用の証明書を新たに１枚取るのも構成上都合が悪いので、既存のXXXX.example.netの証明書のSANにYYYY.example.netを追加してしまう、、ということがあります。
その場合、XXXX.example.netで検索すると、SANには実はYYYY.example.netが記載されているのですが、crt.shの応答の'name_value'にはYYYY.example.netが入ってこない、ということになります。

これはちょっとうれしくない。

# 証明書の詳細情報の取得
```
$ curl "https://crt.sh/?d=<certid>"
```

最初に取得したjsonについて、'id'という要素があります。
これはcrt.sh上での証明書情報の一意識別子のようなのですが、これを使って、上記を叩くと、証明書の.crtデータをダウンロードさせてもらえます。

非常にありがたい。
。。ありがたいんだけど、この用途だとかなりの量引き抜かせてもらうことになってしまうので、大変申し訳がない、、

# 証明書の詳細情報の展開

```python
import cryptography import 509


with open('./cert.crt', 'r') as fd:
    crt = fd.readline()

# CNの抽出
ce = x509.load_pem_x509_certificate(cert)
st = ce.subject
cns = st.get_attributes_for_oid(x509.oid.NameOID.COMMON_NAME)
fqdns = [x.value for x in cns]

# SANの抽出
ce = x509.load_pem_x509_certificate(cert)
es = ce.extensions
sans = es.get_extension_for_calss(x509.SubjectAlternativeName)
fqdns = sans.value.get_value_for_type(x509.general_name.DNSName)

```

コード目視で手打ちしたから、タイポしてたらすみません。
ざっとこんなで、証明書ベースで自身の管理するドメインに紐づく公開（されてしまってる）ドメインがわかります。


# 作ったもの
こんなです。
https://github.com/nfwprod/certcheck

過去の証明書まで全部遡ってダウンロードしているので、処理に結構時間かかります。
申し訳ないので一回落とした証明書はローカルの.dlo_dumpというフォルダに保存して、２回目以降は聞きに行かないようにしてはいるのですが、怒られそうだなぁ。。
Windows10以降で未署名のドライバをインストールする

# おことわり
初投稿です。今回は実験的な投稿になるので至らぬ点がありましたら申し訳ない。
Windows10に未署名のドライバを無事インストールするまでの未熟者の戦いを記録しておきます。
当時の僕には全然余裕がなかったのでスクリーン画像はありません。リクエストがあれば状況を再現したうえで追加するかもしれません。
とりあえず結論だけ知りたい方は「まとめ」をお読みください。

追記・もたもたしていたら別の記事が先に完成してしまい、初投稿でなくなってしまいました。まあQiitaに不慣れなことに変わりはありませんが。
# 事の発端
### Altera USB Blaster Driverがぜんぜんインストールできない
タイトル通りです。画面に従って普通にインストールするだけのはずなのにうまくいかない。
ちなみにこの時はなぜうまくいかないのかすらよくわかっていませんでした。
再起動とかパソコンを変えるとかWindowsを1909にダウングレードするとかがむしゃらに色々と試しましたが悉く失敗しました。
後から振り返ってみれば的外れな対策ばかりだったので、詳細は割愛させていただきます。
# 数日後に転機が訪れる
### どうやらドライバが未署名（unconfigured）なのがいけないらしい
詳しいであろう方に相談に乗っていただいたところ、どうやら未署名のドライバは少々特殊な手順を踏まないとインストールできないらしい。
よって「未署名のドライバをインストールする方法」みたいなサイトを参考にすべしとアドバイスを頂きました。
原因さえわかってしまえばあとは簡単…だと思っていた時期が私にもありました。
### 早速試してみる
善は急げということで家に帰って早速パソコンを起動。「未署名」「ドライバ」「インストール」みたいな感じで適当にググります。
出てきたサイトを１０個ほど流し読みして、その中で一番らくちんそうな方法に従います（参考欄にも載せておきます）。

1. スタートから設定を開く
2. 更新とセキュリティを開く
3. 左から「回復」を選ぶ
4. 「PCの起動をカスタマイズする」の下の「今すぐ再起動」を押す
5. （再起動後、青い画面が出るので）トラブルシューティング
6. 詳細オプション
7. スタートアップ設定
8. 「再起動」を押す、もう一度待ちます
9. 再起動後の画面で「ドライバ署名の強制を無効にする」をクリック（って書かれてたけどキー入力しか受け付けない模様、なので７を押す）
10. 再起動を待って、完了

…するはずだったのですが、数回再起動したところで___「Bitlockerがなんちゃら…回復キーを入力してください」___の文字が！回復キー？そんなの聞いてないぞ！？
# これにて一件落着…どころか更なる沼へ
### Bitlockerがうんぬんかんぬん！これ以上先へ進めません！！
色々足掻いてみましたが、どうやら回復キー？がないとこれ以上先へ進めない模様。
がここで流し読みしたサイトに「まずはあらかじめBitlockerを解除して～」みたいな記述があったことを思い出す。
どうやらBitlockerなるものは案外簡単に解除できるらしい。希望を捨てずに「Bitlocker」「解除」みたいな感じで再び検索。
### サイトに従えば解除できる、はずが…
Dellさんのサイト（こちらも参考へ）がわかりやすかったので早速実践。

1. 設定
2. 更新とセキュリティ
3. デバイスの暗号化
4. Bitlockerの設定
5. Bitlockerを無効にする

…って、___肝心の５番が何故か画面に表示されてないんですけど！？___
まぁ４の「Bitlockerの設定」が何故かサイトと違うところにあった時点でなんとなーく嫌な予感はしていましたが。
他のサイトを覗いても似たようなことしか書いてない…さて、いよいよ「詰み」か！？
###それでもめげずに頑張ってたところ、ついに…！？
ふと「デバイスの暗号化をオフにする＝Bitlocker解除なんじゃね？」と思い、オフにするを押してから（解除にしばらく時間がかかります）回復→再起動の手順を試してみたところ、ついに「Bitlockerうんぬん」の文字が現れず普通に最後まで手順を進めることができました、やったね！
まあ頑張ったというよりはたまたまうまくいったというべきでしょうか…にしてもなんで微妙に設定方法変えたし。
ちなみにどうでもいいかもしれませんが、暗号化オフの状態でBitlockerの設定（画面右側）を開こうとすると設定が落ちます。
# まとめ
### で、結局どうやったらうまくいったの？
「なぜその操作をしようと思い立ったの？」という疑問が浮かばないように当時の状況を書き綴ってみたら、結局どうすればインストールできるのかという最も肝心な情報が埋もれてしまったので、最後にまとめておきます。
### まず下準備、Bitlockerの解除（人によっては不要？）

1. 設定
2. 更新とセキュリティ
3. デバイスの暗号化
4. デバイスの暗号化をオフにする（しばらく時間がかかります）
5. これでBitlockerは解除されたので下準備完了

### 本題、ドライバ署名の強制を解除
1. スタートから設定を開く
2. 更新とセキュリティを開く
3. 左から「回復」を選ぶ
4. 「PCの起動をカスタマイズする」の下の「今すぐ再起動」を押す
5. （再起動後、青い画面が出るので）トラブルシューティング
6. 詳細オプション
7. スタートアップ設定
8. 「再起動」を押す、もう一度待ちます
9. 再起動後の画面で「ドライバ署名の強制を無効にする」をクリック（って書かれてたけどキー入力しか受け付けない模様、なので７を押す）
10. 再起動を待って、完了

### 以上、おしまい！
# 環境（念のため）
PC:富士通 LIFEBOOK UH90-C3
OS:Windows10 home ver.1909
# 参考
ドライバ署名の強制を解除
http://ashiter.com/?page_id=2469

Bitlockerを解除
https://www.dell.com/community/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%A8OS/BitLocker%E3%82%92%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/td-p/7246034