OmniAICreator/Qiita-1.07M huggingface dataset:
【1行野郎】Elasticsearch レスポンスの「green」「yellow」「red」を色付けする


# 概要

下図左を右のように色付けして表示する

|色付けなし|色付けあり|
|:--|:--|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/f73365e4-f185-4e56-9604-c7d9f5faa5e0.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/b680502b-1375-bae4-d935-227c25a8e62b.png)|

　

# コード ... decoac

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/f534eda9-fd7d-6101-3235-a8db51e0e8a1.png)


## 使い方

```bash
## 書式は「decoac コマンド 引数」である
$ decoac curl -s -XGET 'http://localhost:29200/_cat/indices?v'
```

## 説明

単に green, yellow, red に AnsiColor コードを付与しているだけである.
(わざわざ Python のサードパーティパッケージに頼るのも面倒なくらい小さな処理である)

上図中の **<font color="#0088ff">^[</font>** は制御文字である.
Vim であれば `Ctrl-v → Esc`、Emacs であれば `Ctrl-q → Esc` で入力できる.

## 疑問

**脱線するけれども、VScode の Vim プラグインの場合はどうやって制御文字を入力するのだろうか...**

　

以上
Sequelizeを使用してDBからデータを取得する時のメソッドが生成するクエリ

# 初めに
Sequelizeの「findメソッド」や「sumメソッド」などのデータを取得するメソッドが、MySQLを使用した場合にどのようなクエリに変換されているかをまとめました。
Usersテーブルにあらかじめレコードを挿入してモデルを定義しており、Expressを使用した環境での調査になります。

Usersテーブル
![SnapCrab_NoName_2021-8-10_16-48-10_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1229062/f016d91d-d543-d80a-8068-b2e908bbfd00.png)

# 環境
■ 言語
Javascript(Node.js)
■ フレームワーク
Express
■ RDBMS
MySQL
■ 使用しているパッケージの詳細

```:package.json
  "dependencies": {
    "express": "~4.16.1",
    "mysql2": "^2.3.0",
    "sequelize": "^6.6.5"
  }
```
■ 使用するソースコード

```:ソースコード
db.User.[各メソッド].then(result =>{
    console.log(JSON.stringify(result))
})
//取得結果はthenメソッドのresultという引数の値を参照しています。
```
※[各メソッド]という箇所に、以下に記述しているメソッド(findAllやfindOneなど)が入ります。

# findAllメソッド

テーブルにある全てのレコードを取得します。

```:クエリ
SELECT `id`, `name`, `age`, `createdAt`, `updatedAt` FROM `Users` AS `User`;
```

```:結果
[{"id":1,"name":"たかし","age":16,"createdAt":"2021-07-29T08:42:14.000Z","updatedAt":"2021-07-30T08:42:14.000Z"},{"id":2,"name":"花子","age":17,"createdAt":"2021-08-29T08:42:14.000Z","updatedAt":"2021-08-30T08:42:14.000Z"}]
```

# findOneメソッド
LIMIT句を使用して、１つのレコードを取得します。


```:クエリ
SELECT `id`, `name`, `age`, `createdAt`, `updatedAt` FROM `Users` AS `Users` LIMIT 1;
```

```:結果
{"id":1,"name":"たかし","age":16,"createdAt":"2021-07-29T17:42:14.000Z","updatedAt":"2021-07-30T17:42:14.000Z"}
```



# countメソッド
テーブルのレコードの数を取得します。

```:クエリ
SELECT count(*) AS `count` FROM `Users` AS `Users`;
```

```:結果
2
```

# findByPkメソッド


idカラムの値を指定して取得します。
今回はidカラムが１の値を取得します。

```:クエリ
SELECT `id`, `name`, `age`, `createdAt`, `updatedAt` FROM `Users` AS `Users` WHERE `Users`.`id` = 1;
```

```:結果
{"id":1,"name":"たかし","age":16,"createdAt":"2021-07-29T17:42:14.000Z","updatedAt":"2021-07-30T17:42:14.000Z"}
```


# findAndCountAllメソッド
countメソッドとfindAllメソッドを合わせたメソッドです。
countメソッドの結果は、"count"キーの値としてオブジェクトに格納されます。
findAllメソッドの結果は、配列形式で"rows"キーの値として格納されます。

```:クエリ
SELECT count(*) AS `count` FROM `Users` AS `Users`;
SELECT `id`, `name`, `age`, `createdAt`, `updatedAt` FROM `Users` AS `Users`;
```

```:結果
{"count":2,"rows":[{"id":1,"name":"たかし","age":16,"createdAt":"2021-07-29T17:42:14.000Z","updatedAt":"2021-07-30T17:42:14.000Z"},{"id":2,"name":"花子","age":17,"createdAt":"2021-08-29T17:42:14.000Z","updatedAt":"2021-08-30T17:42:14.000Z"}]}
```

# sumメソッド
引数で指定したカラムの合計値を取得します。
今回は、sumメソッドの引数を「"age"」として、Usersテーブルの２人の年齢を合計した値を取得します。

```:クエリ
SELECT sum(`age`) AS `sum` FROM `Users` AS `Users`;
```

```:結果
33
```
【Python】リストの基礎と活用


※個人の勉強用メモ

たとえば、CSVファイルの列・行の文字列をリストに格納し、そこから引き出して何らかの処理を行う場合に活用できる(はず)

```py
unko = ['cat','dog','rat','bird']
```

※1.unkoは変数名
※2.変数名「unko」は気持ち悪いとのコメントがあったので「unko」で統一

上記のように unko のリスト内に格納された[cat,dog]といった値(要素という)は、以下のように引き出すことができる。

```py
unko[0]
unko[1]
unko[2]
unko[3]
```

それぞれ、インタラクティブシェルに入力してみると「0→cat」「1→dog」「2→rat」「3→bird」という形で、リスト内に格納された単語が引き出される処理を行う。

```py
unko[10000] #リストに格納されてない番号を指定(リストのインデックスが範囲外)
unko[1.0] #リストの数字が整数でない(インデックスが浮動小数点である)
```

リストには他のリストを入れることができる。
その場合、[]の中に複数の[]を入れることで表現できる。

```py
unko = [['cat','bat'],[10,20,30,40,50]]
```

上記のリストの値を呼び出すには、以下のように複数のインデックスを用いる。

```py
unko[0][1]
```

<h2>負のインデックス</h2>
インデックスは0から増えていくが、負の整数も用いることができる。

```py
unko[-1]
```
ブログ投稿機能作成 新規データの登録 PHP

#■新規データの登録の流れ
①フォームから値を渡す。
②フォームから値を受け取る。
③バリデーションする。
④トランザクションを開始
⑤データをDBに登録する。

#■①　フォームから値を渡す。
htmlのフォーム等から登録したい値を渡す。

``` html
//action='値を渡すファイル名' method="渡し方送信するのでPOST"
<form action='URL' method='POST'>
  //name='受け取るファイルで使う共通の呼び方'
  <input type='text' name='title'>
  <textarea name="content" id="content" cols="30" rows="10"></textarea>
  <input type='submit' value='送信'>
</form>
```

#■② フォームから値を受け取る。
受け取るファイルでPOSTで受け取る。

``` php
//例 blog_create.php
<?php $blogs= $_POST;?>
```

#■③バリデーションする。
簡単に言うと入力もれがないかのチェック作業
ブログの本文書いてなかったりタイトル書いてなかったり必要事項が書いてないよと投稿者に教えてあげる。

下記ではif文を使っているがもっと簡単にまとめて書く方法もある。

``` php
if(empty($blogs['title'])) {
 exit('タイトルがありません。');
}

if(empty($blogs['content'])) {
 exit('本文がありません。');
}
```

#■④トランザクション ⑤実行
データの整合性のチェック
うまくデータが入力されていて
登録前と登録後の整合性に差異がないかチェックする。
 
``` php
//トランザクションを始める。
$dbh->beginTransaction();
//整合性バッチリ実行しよか！
$dbh->commit();
//整合性に差異がでてる。もどそか
$dbh->rollBack();
```
▼下記実際トランザクションの使い方。

``` php
$sql = 'SELECT INTO blog(title,content) VALUES(:title,:content)';
//$dbh はrequire_once('データ接続の関数が書いてるファイル名');で関数をデータ接続の関数を持ってきている。
$dbh = dbConnect();
//トランザクションを始めよう！
$dbh->beginTransaction();
try {
  $stmt = $dbh->prepara(':title','$blogs['title']',PDO**PARAM_STR);
  $stmt = $dbh->prepara(':content','$blogs['content']',PDO**PARAM_STR);
  $stmt->execute();
  //トランザクションをcommitしてる。
  $$dbh->commit();
} catch(PDOException $e) {
  exit($e);
  //なんかちゃういったん戻ろか。
  $dbh->rollBack();
}
```

このあらゆるチェックの流れでデータを登録する。
AWSによるクラウド入門まとめ

## はじめに
 真野智之氏による[AWSによるクラウド入門まとめ]
(https://tomomano.gitlab.io/intro-aws/#_%E8%91%97%E8%80%85%E7%B4%B9%E4%BB%8B)で勉強したことをまとめた。

## クラウド
* クラウドはシステムの運用をインターネット上で行う。
* クラウドの対義語としてサーバーやソフトウェアを自分で運用するのがオンプレミスである。

## AWS
* RegionはAWSのデータセンターの所在地でAWSコンソールのメニューバーでRegionを選択できる。
* 東京Regionはap-northeast-1で、大阪Regionはap-northeast-3
* Availability Zone (AZ) はRegion内で独立したデータセンターでAZ間で障害が起きたときのカバーをする。
* AWSの利用にはAWSコンソールとAPIがある。APIはREST APIである。
* AWS APIはリソースを操作するコマンドとタスクを実行するコマンドに分けられる。
* AWSのリソース管理の仕組みをCloudFormationといい、ハードウェアをプログラムによって記述し管理する考え方をInfrastructure as Code (IaC) と呼ぶ。
* CloudFormationはJSON (Javascript Object Notation) フォーマットで記述される。
* CloudFormationの記述を容易にするためのツールが AWS Cloud Development Kit (CDK)であり、Pyhon, Java, TypeScriptで CloudFormationを自動生成することができる。
* EC2はAWSに仮想サーバーを立ち上げ、個々の起動状態のサーバーをインスタンスと呼ぶ


## SSH
* SSH (Super Shell)はリモートサーバーに安全にアクセスするためのツール

## GPU
* 機械学習の計算にはGPUが有用で、AWSではクラウドでGPUが使用できる。
* AWSでGPUを使用するにはEC2のインスタンスタイプでGPU搭載のものを選択する。

## AMI
* AMI (Amazon Web Image) はOSのようなものでEC2インスタンスタイプを起動するのに必要である。
* AMIには各種プログラムがインストールされたものもあるので環境構築の手間を省ける場合がある。
* ディープラーニングに必要なプログラムであるTensorFlowやPytorchが予めインストールされているAMIがDLAMI (Deep Learning AMI) である。

## Docker
* AWS上にDockerを用いた計算機クラスターを作成するためのツールがECS (Elastic Container Service)
* FargateはEC2と同様に仮想サーバーに計算を走らせるサービスで、ECSでの利用に特化している。
* FargateはEC2よりも制約が多いがECSで利用する分には設定が少なくインスタンスの起動時間も少ない。

## Surverless
* AWSでサーバーレスコンピューティングの中心を担うのがLambdaである。
* Lamdaに実行したいプログラムを予め登録しておき、実行するためのコマンドinvokeを送信することでプログラムを実行する。
* Lambdaのようにサーバーとしての管理や機能をクラウドに任せるサービスのことをFaaS  (Function as a Service)と呼ばれる。
* S3(Simple Storage Service) はサーバーレスなストレージシステムを提供しデータの量だけ保存領域が拡大していく。
* DynamoDBはサーバーレスなデータベースである。

## おわりに
今回はAWSとクラウドに関する知識をまとめた。学んだことがあれば追記予定。
Knapsack 2　Educational DP Contest-E問題

## 問題文
$N$個の品物があります．品物には$1, 2, ...,N$と番号が振られています．各$i(1\leq i \leq N)$について，品物$i$の重さは$w_i$で，価値は$v_i$です．太郎君は，$N$個の品物の内いくつかを選び，ナップサックに入れて持ち帰ることにしました．ナップサックの容量は$W$であり，持ち帰る品物の重さの総和は$W$以下でなければなりません．太郎君が持ち帰る品物の価値の総和の最大値を求めてください．
$1\leq N \leq 100$
$1\leq W \leq 10^9 $
$1\leq w_i \leq W$
$1\leq v_i \leq 10^3$

https://atcoder.jp/contests/dp/tasks/dp_e
## 考察
$dp[i][j] = $前から$i$個までの中から任意の数選んだとき，価値の和を$j$とするために必要な最小のコスト，とします．
$dp[i][j] = $前から$i$個までの中から総コスト$j$以下になるように任意の数選んだ時，価値の総和の最大値，
という普通のナップサック問題の解法で解いてしまうと，計算量のオーダーが$O(NW)$となるため，計算量の最大値が$100\times W_{max}=10^{11}$となってしまいます．これを今回の解法で解くと，計算量のオーダーが$O(N\sum_i v_i)$となり，計算量の最大値が$100\times 10^3 \times 100=10^7$で処理が$2$秒以内に間に合います．

$$dp[i][j]=min(dp[i-1][j],\quad dp[i-1][j-v[i-1]]+w[i-1])$$

前から$i$番目の品物を選ぶ場合と選ばない場合を比較し，総コストが小さいほうを$dp[i][j]$に採用していきます．$i$番目の品物を選ばない場合は$dp[i-1][j]$で$i-1$番目までから選び，価値$j$を達成する最小の総コストをそのまま$dp[i][j]$の候補とします．$i$番目を選ぶ場合は，$i-1$番目までから好きに品物を選び，総価値$j-v[i-1]$を達成するための最小のコストに$i$番目のコスト$w[i-1]$を加えたものを$dp[i][j]$の二つ目の候補とします．ただし，$j-v[i-1]<0$のときは，価値の総和が負になることはないので候補から外します．

```c++
int main(){
    ll n, W;
    cin >> n >> W;
    vector<ll> w(n), v(n);
    ll sv = 0;
    ll INF = 101010101010;
    for(ll i=0; i<n; i++){
        cin >> w[i] >> v[i];
        sv+=v[i];
    }
    vector<vector<ll>> dp(n+1, vector<ll>(sv+1, INF));
    for(ll i=0; i<=n; i++) dp[i][0] = 0;
    for(ll i=1; i<=n; i++){
        for(ll j=0; j<=sv; j++){
            dp[i][j] = dp[i-1][j];
            if(j-v[i-1]>=0) chmin(dp[i][j], dp[i-1][j-v[i-1]]+w[i-1]);
        }
    }
    for(ll i=sv; i>=0; i--){
        if(dp[n][i]<=W){
            cout << i << endl;
            break;
        }
    }

    return 0;
}
```
Eclipseの使い方

###　はじめに
この記事ではMac における初心者が使いながら便利だと思ったEclipseの機能を書き足して行こうtと思っています。
自分の備忘録を兼ねた記事です。
まだ、書き途中なのでご容赦ください。

###Eclipseのコンテンツアシスト
変数名やメソッド名、クラス名などを補完してくれる。スペルミスを防ぐためにも使った方がいい。
preferance → java → コンテンツアシスト

###コンストラクターやゲッター、セッターの設定

コンストラクターやゲッター、セッターの設定は自動生成することができます。
右クリック　　→　　ソース　　→　　フィールドを利用してコンストラクターの生成
右クリック　　→　　ソース　　→　　getter および　setter の生成

###equalsメソッドの自動生成
右クリック　　→　　ソース　　→　　hashcodeおよびequalsの生成

###toStringメソッドの自動生成
右クリック　　→　　ソース　　→　　toStringの生成

###テンプレートの一覧
設定のJava→エディター→テンプレート


### Command i
ソースコードのフォーマットを整えて見やすくしてくれます。

### Comman shift f
ソースコードのフォーマットを整えて見やすくしてくれます。

###　デバグ機能
変数がどのように変わって行くかなどを視覚的に見て、バグを突き止める事ができます。
実行→デバッグ→
YouTube動画をOpenCVでキャプチャするスクリプト

## はじめに

タイトルそのまま、YouTube動画をOpenCVでキャプチャするスクリプト
YouTubeライブ配信でも動作しました

## 環境

Windows10で実行しました。

```powershell
PS C:\> python -V
Python 3.9.5
PS C:\> pip list | Select-String -Pattern "pafy"

pafy                  0.5.5

PS C:\> pip list | Select-String -Pattern "youtube-dl"

youtube-dl            2021.6.6
```

以下2つのモジュールをインストールします。

- pafy
    - `pip install pafy`
- youtube_dl
    - `sudo pip install --upgrade youtube_dl`


## スクリプト

変数 `url` にYoutube動画のURLを設定し実行します。

```python:YouTube動画をキャプチャするスクリプト
import cv2
import pafy

# キャプチャするYouTube動画のURLを設定します
url = "https://youtu.be/PaCyCcWseO4"

video = pafy.new(url)
best = video.getbest(preftype="mp4")
cap = cv2.VideoCapture(best.url)

while (True):
    ret,frame = cap.read()
    cv2.imshow('frame',frame)
    if cv2.waitKey(20) & 0xFF == ord('q'):
        break    

cap.release()
cv2.destroyAllWindows()
```
Laravel初心者のワイ、VoragerにLaravel Livewireを入れて遊ぶ実験

統合パッケージ的なものを探してVoragerにたどり着いたんですが
さて、VoragerにはLaravel Livewireを入れて遊ぶことができるかのテストです。
やり方とか、ぇ？そのコードいじるのは阿呆のやることってのはありますが、
そこは見地に合わせて読み替えてくださいませ。

Voragerは普通にインストール（説明省略）



■Laravel Livewireを導入

Laravelのプロジェクトで

```
composer require livewire/livewire
```

■Laravel Livewireのコード雛形を作る
Laravel　livewireのコード雛形として、testlivewireという名前でmake:livewireする

```
# php artisan make:livewire testlivewire

 COMPONENT CREATED  🤙

CLASS: app/Http/Livewire/Ttestlivewire.php
VIEW:  resources/views/livewire/testlivewire.blade.php

  _._
/ /o\ \   || ()                ()  __         
|_\ /_|   || || \\// /_\ \\ // || |~~ /_\   
 |`|`|    || ||  \/  \\_  \^/  || ||  \\_   


Congratulations, you've created your first Livewire component! 🎉🎉🎉

 Would you like to show some love by starring the repo? (yes/no) [no]:
```
なにか聞かれるんですが、noのママでいいので「return」を押せばいいです。
２回目以降のmake:livewireでは聞かれないです



■Laravel Livewiteで動的に動くBlade部分の処理を書く
ボタンを押せば+1するというどっかに有ったサンプリです。
Laravel Livewire的にはbladeを丸々サーバサイドでHTMLを生成し直して、HTMLをJSで送って、その部分のHTMLを書き換えるってことをしているようですね。
publicな変数の値はJSで渡され、イベントが発生したら発生したイベントと値をサーバに渡して、渡ってきた値をpublicに当てはめて処理をする・・と。
よく出来た仕組みです。

```
vi app/Http/Livewire/Testlivewire.php
```

```
<?php

namespace App\Http\Livewire;

use Livewire\Component;

class Testlivewire extends Component
{
    public $count = 10;
    public function inc(){
        $this->count++;
    }

    public function render()
    {
        return view('livewire.testlivewire');
    }
}
```

```
vi resources/views/livewire/testlivewire.blade.php
```

```
<div>
    {{-- Knowing others is intelligence; knowing yourself is true wisdom. --}}

hello livewite<br>
<?php echo date("Y/m/d H:i:s");?>
<h2>{{ $count }}</h2>
<p><button wire:click="inc">+1</button></p>
</div>

```

■Live wireを動作させるためのスタイルとJSをテンプレbladeに仕込む

```
vi vendor/tcg/voyager/resources/views/master.blade.php 
```

```
〜〜〜〜
<title>@yield('page_title', setting('admin.title') . " - " . setting('admin.description'))</title>
    @livewireStyles
〜〜〜〜
    @livewireScripts
</body>
```
※vendor/tcg/voyagerをいじるのは頭おかしいのですが、とりあえずｗｗｗｗ
良い子は手元に移動させましょうね



■作ったLivewireパーツをとりあえずDashboardのbladeに埋め込む

```
vi vendor/tcg/voyager/resources/views/dashboard/navbar.blade.php 
```
```
<nav class="navbar navbar-default navbar-fixed-top navbar-top">
<hr>
<livewire:testlivewire>
<br>
〜〜〜〜
```
※またまたvendor/tcg/voyagerをいじるのは頭おかしいのですが、とりあえずｗｗｗｗ
良い子は手元に移動させましょうね

たぶん、Dashboardページを表示すると以下のような感じになってるんじゃないでしょうかね？
＋１ボタンを押せば動きます

![スクリーンショット 2021-08-11 15.13.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19107/d0943b9e-537d-2d3e-5009-f070b10035d0.png)



以上、無事実験成功でした。
Laravel Livewireは調べれば奥深いですし、導入しどころはアイデアが必要かもですが、
Laravel Livewire自体は既存システムにも導入は楽ですし
エンジニア的にはAjaxやらを考えずに作れるのは面白いですね。
VSCode　ヘッダーファイル名でincludeしたときのエラーを消す方法

# 結論

VSCode　ヘッダーファイル名でインクルードしようとしてエラーが出たときはワークスペースの`.vscode`内に`c_cpp_properties.json`を設定するとエラーが消えます。

globalで設定する方法が無いようなので、すべてのワークスペースに置く必要があるようです。

```c_cpp_properties.json
{
    "configurations": [
        {
            "name": "Mac",
            "includePath": [
                "${default}",
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "macFrameworkPath": [
                "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks"
            ],
            "compilerPath": "/usr/bin/clang",
            "cppStandard": "c++11",
            "intelliSenseMode": "macos-clang-x64",
            "browse": {
                "limitSymbolsToIncludedHeaders": false
            }
        }
    ],
    "version": 4
}
```

## 参考

[Customize default settings in Visual Studio Code C++ projects](https://code.visualstudio.com/docs/cpp/customize-default-settings-cpp)

[【翻訳】Visual Studio Code C/C++ Extension の設定ファイル c_cpp_properties.json のリファレンスガイド - Qiita](https://qiita.com/yuki12/items/0296796c64dd077bd5c4)
redux-sagaとは何なのか？

reactのredux関連の副作用を扱うケースが発生したのでその時のメモです。

# redux-sagaとは?
公式ホームページから引用すると `直感的な副作用を管理ツール` だそうです。
https://redux-saga.js.org/

具体的には、react内の処理の
* 非同期実行
* 並列実行

を簡易的に実装できるようにするツールです。

# ジェネレーター
redux-sagaはジェネレーターという機能を軸としているので、先にこちらを解説します。
端的にいうと、ある関数をカスタマイズして、処理を途中で止めてその時点での値を返したり、止めた処理から再開させたりします。

簡単に言うとコルーチンです。

```typescript
function* generater() {
    yield 1;
    yield 2;
    yield 3;
    return 4;
}

    const iterater = generater();
    console.log(iterater.next()) //{"value": 1,"done": false} 
    console.log(iterater.next()) //{"value": 2,"done": false}
    console.log(iterater.next()) //{"value": 3,"done": false}
    console.log(iterater.next()) //{"value": 4,"done": end}
```

`function*`でジェネレーターの関数を宣言します。そして、yieldで処理を止める場所とその時点で返す値を指定します。
そして完全に処理を止めるときはreturnで値を返します。

そして、ジェネレーター関数を呼ぶことでイテレーターを返します。
そして、next関数を呼ぶことで、yieldの時点で処理を止め、値を返します。再度next関数を実行すると止まった処理の直後から再度実行されます。

# redux-saga effect creator 
話を戻すと、redux-sagaは副作用を管理するために、effect creator という概念があります。
dispatchや同期処理などを行うための小さな処理の単位だと思ってください。
以下はよく使うやつです。

## call 
処理を同期的に実行する関数です。この関数の引数には通常の関数かジェネレーター関数を渡せます。

## put 
actionを引数に渡してactionをdispatchします。

## selector
selectorを渡してstoreからデータをもらってきます。

## takeEvery
actionがdispatchされた時に実行されます。

# サンプルコード
公式ホームページから引っ張ってきたコードを見ます。

```typescript
import { call, put, takeEvery, takeLatest } from 'redux-saga/effects'
import Api from '...'

// Worker saga will be fired on USER_FETCH_REQUESTED actions
function* fetchUser(action) {
   try {
      const user = yield call(Api.fetchUser, action.payload.userId);
      yield put({type: "USER_FETCH_SUCCEEDED", user: user});
   } catch (e) {
      yield put({type: "USER_FETCH_FAILED", message: e.message});
   }
}

// Starts fetchUser on each dispatched USER_FETCH_REQUESTED action
// Allows concurrent fetches of user
function* mySaga() {
  yield takeEvery("USER_FETCH_REQUESTED", fetchUser);
}
```
見ての通り、redux-sagaのeffectは全てyiledをつけます。これはお約束として考えときましょう。

# 最後に
今回は大雑把に概要把握レベルでのメモです。
effectやeffect creater の処理などは別個にまとめていきたいとおもいます。
Cloud9 AWS CLI のバージョンを1から2に変更するときのメモ

# 起きた事象

CLI1 のアンインストール、CLI2のインストールは他のサイト参照。
CLI2のインストールを実施後にバージョン確認のコマンドを実行したところ以下のエラーが出た

```
***:~/environment $ aws --version
bash: /usr/bin/aws: No such file or directory
```

以下のコマンドを行えばOK

```
 hash -d aws
```

その後は、正しく使えるようになる

```
***:~/environment $ aws --version
aws-cli/2.2.28 Python/3.8.8 Linux/4.14.238-182.422.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off
```

# 参考
https://qiita.com/kobayashiss/items/6b5faf11cc1391885bd4
https://superuser.com/questions/1637802/aws-version-error-bash-usr-bin-aws-no-such-file-or-directory
【Laravel8】レイアウト共通化 layoutsファイルのapp.blade.phpのコード例

Laravel8でレイアウトを共通化させる方法です。

開発環境
Docker 20.10.7
PHP 7.4.22
Laravel 8.53.1
mySQL 5.7
データベースのツール　phpmyadmin
※bootstrapを導入しています。

以下の記事の続きになります。
[【Laravel実務に使える】マイグレーションの作成から一覧画面表示まで](https://qiita.com/kamome_susume/items/4013dfcc9c0b93db7ce1)

## 本記事のゴール
・親ファイルのレイアウト共通ファイルのコード例
・子テンプレートファイルのコード例
・ファイルを編集したときに出たエラー解消方法

https://www.kamome-susume.com/enginner-job-change-site/

##実際にコードを書く

resourcesに共通の親ファイルであるlayoutsファイルを作成し、そこにapp.blade.phpを作成します。

resources
 - layouts
    -- app.blade.php

app.blade.phpは共通のテンプレートファイルになるので、他のビューファイルでも読み込むことができます。

app.blade.php

```php
<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- CSRF Token -->
    <meta name="csrf-token" content="{{ csrf_token() }}">

    <title>{{ config('app.name', 'Laravel') }}</title>

    <!-- Scripts -->
    <script src="{{ asset('js/app.js') }}" defer></script>

    <!-- Fonts -->
    <link rel="dns-prefetch" href="//fonts.gstatic.com">
    <link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">

    <!-- Font Awesome -->
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css">

    <!-- Styles -->
    <link href="{{ asset('css/app.css') }}" rel="stylesheet">
</head>
<body>
    <div id="app">
        <main class="py-4">
            @yield('content')
        </main>
    </div>
</body>
</html>
```

以下のように親ファイルであるapp.blade.phpを継承することができます。

resources>book>index.blade.php

```php
@extends('layouts.app')

@section('content')
<h1>本を管理</h1>

<table class="table table-striped">
  <thead>
    <tr>
      <th>ブックナンバー</th>
      <th>ブック名</th>
      <th>作成日</th>
    </tr>
  </thead>
  <tbody>
    @foreach ($books as $book)
    <tr>
      <td>{{ $book->book_id }}</td>
      <td>{{ $book->book_name }}</td>
      <td>{{ $book->created_at }}</td>
    </tr>
    @endforeach
  </tbody>
</table>
@endsection
```

私は途中にファイルを作成したりコード内容を変更したせいか以下のようなエラーが出ました。

```
file_put_contents : failed to open stream: No such file or directory
```

いくつかの記事を調べると以下で解決しました。

```
$ php artisan config:cache
$ php artisan config:clear
$ composer dump-autoload -o
```

キャッシュが原因だったっぽいです。

参考になったらLGTMしてくれると励みになります！

https://www.kamome-susume.com/enginner-job-change-site/
データマスキング  とは

## 勉強前イメージ

マスキングは包み隠すって意味だから、
データを隠す？匿名化的な・・・？

## 調査

### データマスキングとは

端的に言うと `データを匿名化すること` です。
データスクランブルとも言われます。
アプリケーションの開発やテストの際にデータベースにコピーする情報を
外見は本物であるが、匿名化のルールに基づいてデータを書き換えるプロセスです。
情報のデータとしては、名前や住所、電話番号などがあります。
本物の情報を書き換え、テストで使用します。

### データマスキングの方法

データマスキングの方法としてはツールを使用することで匿名化出来ます。
DBによって使用できる・出来ないがあるので確認が必要です。

また、クエリでルールに則って匿名化するスクリプトを組んでいる場合があります。
例えば `0120-000-000` だと `0120-***-***` のように
ルールに基づいて匿名化する方法もあります。

## 勉強後イメージ

テストするためのデータってを作ること。
開発するために個人情報のデータをそのまま使うのは良くないから
特定出来ないようにしてデータを使用する・・ってことかな

## 参考

- [4 データ・マスキング](https://docs.oracle.com/cd/E57425_01/121/DMKSB/data_masking.htm)
Flutter Androidでflavorを指定したらエントリポイントのmain.dartが自動設定されるようにしたい

# 背景
Flutter で作ったアプリを flutter run や build する際は、以下のように --flavor オプションでビルドフレーバーを、さらに -t オプションを使ってエントリポイントの dart ファイルを指定します。

```
flutter run --flavor dev -t lib/main_dev.dart
```

Android Studio でビルド/実行するときはプロジェクトの Configuration でフレーバー名とエントリーポイントの dart ファイルを指定します。

![Screen Shot 2021-08-11 at 14.39.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43781/5e72d612-a1a1-d37f-af9c-2c9b670d4639.png)

しかし、冗長です。単に、フレーバー `hoge` を設定したら自動で `main_hoge.dart` が選ばれてくれないだろうか...。
(※iOSではスキーム毎に.xcconfigファイルを作ってFLUTTER_TARGETを指定すれば、自動化できます）

やってみたら、一応できましたので、やリ方をメモしておきます。

ただ、実装はかなりトリッキーな方法なので、あまりオススメではありません。
flutter run や build 以外の方法、たとえば gradle のタスクを直接実行するなどすると、正しく動かないかもしれません。

# やり方
Flutter 2.2.3, gradle 6.7を前提とします。

`./android/app/build.gradle` で `flutter.gradle` を読み込んでいる行の後に、以下のコードを追加すると、 `main.dart` の代わりに `main_<flavor>.dart` が読み込まれるようになります。

```./android/app/build.gradle
...
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
// ↑この行より後に以下を追加する

def getCurrentFlavor() {
    String tskReqStr = getGradle().getStartParameter().getTaskRequests().toString()
    def matcher = tskReqStr =~ /(assemble|bundle)(\w+)(Release|Profile|Debug)/
    if(matcher.find()) {
        return matcher.group(2).toLowerCase()
    }
    return null
}

if (project.hasProperty('target')) {
    if (project.target == null || project.target ==~ /.*main\.dart$/) {
        def flavor = getCurrentFlavor()
        project.target = "lib/main_${flavor}.dart"
    } else {
        // 外部から main.dart 以外のファイルが指定されていた場合は、
        // こちらに分岐。外部から指定されたdartファイルを優先する
    }
}
```

実行中のタスクの名称を無理やり読み込んで、そこからフレーバー名を抽出し、`project.target`を書き換えるという、無茶苦茶な方法ですが、一応うごくようです。

フレーバー名の抽出ロジックは、`assemble<Flavor><BuildType>` (apk 生成時）か `bundle<Flavor><BuildType>` （appbundle 生成時）の Gradle タスク名を前提に書いてあるため、それ以外の名前のタスクが叩かれる場合は、適宜修正する必要があります。 

# 補足
次のように記述すると一見、期待通り動きそうに思えますが、動きません。project.target はフレーバー毎のプロパティではないため、フレーバーの指定によらず、いちばん最後に書いた project.target が有効になってしまいます。

```build.gradle
// 実際には動かない例
...
    flavorDimensions "env"
    productFlavors {
        dev {
            dimension "env"
            applicationIdSuffix ".dev"
            project.target = "lib/main_dev.dart"
        }
        stg {
            dimension "env"
            applicationIdSuffix ".stg"
            project.target = "lib/main_stg.dart"
        }
        prod {
            dimension "env"
            project.target = "lib/main_prod.dart"
        }
    }
..
```
AgoraVideoSDKでバーチャル背景の実装

AgoraNativeSDK3.5.0が2021/7/20にリリースされました。
[リリースノートはこちら](https://docs.agora.io/en/Video/release_android_video?platform=Android#v350)
対象はiOS/Androidのスマホ、mac/Windowsのデスクトップアプリになります。
（ブラウザ版は現在開発中です）

目玉の機能としてはバーチャル背景になります。
単色か、指定した画像を背景として設定する事が可能です。

## 実装方法
実装方法を見ていきます。この記事ではmac用デスクトップアプリについて記載します。
ドキュメントは[こちら](https://docs.agora.io/en/Video/API%20Reference/oc/Classes/AgoraRtcEngineKit.html#/api/name/enableVirtualBackground:backData:)。
その他のOS、デバイスについても基本的には同様の実装です。


```swift:VideoChatViewController.swift
        let bg = AgoraVirtualBackgroundSource()
        bg.backgroundSourceType = AgoraVirtualBackgroundSourceType.color
        bg.color = 0xFFFFFF
        AgoraKit.enableVirtualBackground(true, backData: bg)
```

SDKに付属するAgora-Mac-Tutorial-Swiftに一部追記しました。
実装の流れとしては
- 背景を単色か画像かを設定
- 色の設定
- バーチャル背景の有効化
この3点になります。非常に簡単です。


2021/10/22追記
 [ver3.5.1](https://www.agora.io/en/blog/agora-releases-native-sdk-v351/)で背景のぼやかしが追加されました。


## 結果
![スクリーンショット 0003-08-11 12.20.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/1087fbca-d33e-623e-5309-e1b4214b9fa3.png)
試しに複数人を写してみましたが正しく人物が判定できています。


# 最後に
[**agora.ioに関するお問い合わせはこちらから**](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=24a1a0c00a4bd6ab57dc)
[<img width="912" alt="スクリーンショット 0001-08-15 13.41.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/5d815376-9b89-08fa-9434-6fa7e8e67bcf.png">](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=24a1a0c00a4bd6ab57dc)
機械学習で仮想通貨取引をするチュートリアル。python

機械学習ボットのチュートリアルをpythonで作りました。
詳しい解説はJupyterノートブック中に書きました。

https://github.com/richmanbtc/mlbot_tutorial

- [はじめに](https://qiita.com/richmanbtc/items/00becc5fd506cfe796ca)
- [環境構築](https://qiita.com/richmanbtc/items/cc6e9ef51bf86a8ba1d3)
- [FAQ](https://qiita.com/richmanbtc/items/f563d778d8676b2989dd)

## 参考リンク

[richmanbtcさんのチュートリアルをじっくり読んでみた](https://note.com/kuroeda11/n/n173a206c4591)
【2章】Javaを学ぼう

今回の記事は私自身が学んだプログラミング言語、「Java」の基礎についての２章になります！
内容としては1章と同様、本当に基礎的な部分になりますので、アウトプットの場と思っていただけると幸いです。

##変数の役割について
コードを書く上で、重複する箇所が多い場合は、変数にしておくと便利です。このコードが後に変更になったとしても、変数を用いていればその変数に代入する文字列を変更するだけで対応することができます。
下記に変数を用いたコードを参照してください。

```ruby:Main.java
System.out.println("Xさん、プログラミングを勉強しよう");
System.out.println("Yさん、プログラミングを勉強しよう");
System.out.println("Zさん、プログラミングを勉強しよう");
```

変数を用いた場合、

```ruby:Main.java
String text = "プログラミングを勉強しよう";
System.out.println("Xさん、" + text);
System.out.println("Yさん、" + text);
System.out.println("Zさん、" + text);
```

##変数を扱う上での注意点
変数の決まり事について解説していきます。変数名は基本的に自由に決められますが、2語以上の変数名を使うときは、単語の始めを大文字にして区切りましょう。これを**キャメルケース**といいます。

**・良い例**
**shippingAddress** ・・・・・・・・　２語目の単語は大文字にする

**・悪い例**
**1order**　・・・・・・・・　数字から開始してはいけない
**shipping_address**　・・・・・・・・　アンダーバー使用はあまり望ましくない

今回はJavaの変数について記事を書かせていただきました。
続きは次章になりますので、よろしければご覧いただければと思います！
最後までご覧いただきまして、ありがとうございました！
長いパスをドライブ化して手軽にアクセスできるようにする（SQL Serverのパスもいけます)

かなり昔、DOSコマンドプロンプト全盛の時期にSubstコマンドという、任意のパスをドライブ化してくれる便利コマンドがありました。

今（2021年8月現在）、Substコマンドに相当する便利コマンドはあるのでしょうか？
ちなみに、DOSコマンドでSUBSTは今でも残っているのですが、DOSコマンドをPowerShellのスクリプトに入れるのはどうも嫌なので、PowerShellだけで完結したいと思います。

## New-PSDrive コマンド

結論から先に言いますと、New-PSDriveコマンドを使うことで任意のパスをドライブ化できます。
以下の例ですと、My Documentの下にあるFolder1をZドライブとしてマップしてくれます。

``` PowerShell
New-PSDrive -Name Z -PSProvider FileSystem -Root '~\My Documents\Folder1'
```

使用しているドライブは次のように確認できます。

``` PowerShell
Get-PSDrive
```
TeamsのファイルをOneDrive同期していたりすると、同期したフォルダによくアクセスしますよね。フォルダをExplorerでピン留めするでもいいのですが、PowerShellだったらドライブに割り当てたほうが使い勝手がいいです。

自分の場合、こんな感じでOneDrive同期されたフォルダをドライブ化しています。```General```はTeamsで言うところの「一般」チャネルです。なお、ドライブ名が1文字だったら```Z:```と入力するとドライブ切り替えできるのですが、ドライブ名が2文字以上の場合は ```cd TF:``` のようにcd コマンドが必要になるので注意です。

``` PowerShell
cd  '~\OneDrive - {企業名}\{Teamsチーム名}ドキュメント\General\'
New-PSDrive -Name TF -PSProvider FileSystem -Root $pwd
cd TD:
```

>New-PSDrive コマンドには```-Persist```オプションというドライブ化を永続化してくれるオプションがあるのですが、これは共有フォルダをドライブ化するときにしか使用できません。残念。

## SQLServerドライバでSQL Serverインスタンスをドライブ化する

SQLServer モジュールをインストールしておくと、SQL Serverの任意の階層をドライブ化できます。

まずは、モジュールのインストールと読み込み。

```　PowerShell
Install-Module -Name SQLServer
Import-Module -Name SQLServer
```

SQL Serverにアクセスするための認証情報の作成とドライブマップ。
ここでは、ローカルホスト上のSQL Serverにユーザsaと、そのパスワードを使ってSドライブにマップします。

``` PowerShell
$user = 'sa'
$pass = ConvertTo-SecureString -AsPlainText 'パスワード'
$crd = New-Object  System.Management.Automation.PSCredential -argumentlist $user,$pass
New-PSDrive -Name S -PSProvider SqlServer -Root SQLSERVER:SQL\localhost\Default -Credential $crd
```

Sドライブにアクセスして、データベースの一覧を出力してみます。

``` PowerShell
cd S:
ls Databases
```

Sドライブにアクセスして、最初のデータベースのテーブル一覧を、先に作ったドライブ上のテキストファイルに出力します。

``` PowerShell
cd S:
$db = ls Databases
$db[0].Tables > Z:\tables.txt
```

出力はこんな感じ。

``` txt
Schema                   Name                        Row Count Storage Sp Index Spac Created
                                                                 ace Used     e Used
------                   ----                        --------- ---------- ---------- -------
dbo                      M_ユーザ                            6    8.00 KB    8.00 KB 2021/04/12 8:15
dbo                      M_商品                            110   16.00 KB   16.00 KB 2021/04/12 8:15
dbo                      M_店舗                              6    8.00 KB    8.00 KB 2021/04/12 8:15
dbo                      M_顧客                            196   24.00 KB   16.00 KB 2021/04/12 8:15
dbo                      T_注文履歴                      21560    1.66 MB   16.00 KB 2021/04/12 8:15
dbo                      __RefactorLog                       2    8.00 KB    8.00 KB 2021/04/26 3:06
```

DBにアクセスして、PowerShellで管理することもできて便利ですね。

## 参考
[PowerShell で SQL Server への認証を管理する](https://docs.microsoft.com/ja-jp/sql/powershell/manage-authentication-in-database-engine-powershell?view=sql-server-ver15)
オブジェクト指向について


######Qiita初投稿です。

######今回はオブジェクト指向という言葉をよく見かけるが、しっかりと理解出来ていなかったのでまとめました。


##オブジェクト指向とは？
######共通点や関連性があるデータやメソッドを「クラス」にまとめて管理する開発手法のこと。

メリットは既存プログラムを活用できるため、一度作ったプログラムをもう一度一から書く手間が省ける。

小規模なプログラムを開発する場合は、オブジェクト指向のメリットを感じにくいが、膨大な量のコードを書く場面では欠かせない考え方。

##オブジェクトとは？
######簡単に言えば全ての物や事柄のこと。
######オブジェクト指向では、メソッドや変数などをオブジェクトという単位で扱います。

##代表的なオブジェクト指向言語
Java、PHP、JavaScript、C++、Swiftなど



参考記事

https://www.internetacademy.jp/it/programming/java/explanation-about-object-orientation-of-java-and-relationship-between-java-objects-and-instances.html
python で 発生した例外(エラー等)をログに出力するコード

#コード

```python
try:
    #コードをここに書くと発生する例外がファイルに出力される。
    print(あああ) # あああ　は文字列変数を指定していなければ"(ダブルクォート）で囲む必要がある。
except Exception as e:
    import traceback
    with open('error.log', 'a') as f:
        traceback.print_exc( file=f)
```
#error.log の 出力結果
```text
Traceback (most recent call last):
  File "<ipython-input-6-b89e2faedd03>", line 2, in <module>
    print(あああ)
NameError: name 'あああ' is not defined
```
AtCoderログ：0068 - ABC 213 B

# 問題

https://atcoder.jp/contests/abc213/tasks/abc213_b

## 問題文
> $1,\ldots,N$ の番号のついた $N$ 人の選手がゲームを行いました。選手 $i$ のスコアは $A_i$ であり、スコアが小さい方が上位になります。
> ブービー賞に該当する選手、すなわち、下位から $2$ 番目の選手の番号を求めてください。

## 制約
> ・$2 \le N \le 2 \times 10^5$
> ・$1 \le A_i \le 10^9$
> ・$A_i$ は相異なる
> ・入力に含まれる値は全て整数である

# 回答
## 回答1 (AC)
スコアをソートして下位から2番目の要素を取り出せば良いでしょう。設問のゲームではスコアが小さい方が上位になるので、昇順(小さい順)にソートした場合には、大きい方から2番目を取り出す必要があります。コードは以下のようになりました。

```C++:abc213b-1.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int n;
  cin >> n;

  vector<int> a(n), b(n);
  for ( int i=0; i<n; i++ ) {
    cin >> a.at(i);
  }
  copy( a.begin(), a.end(), b.begin() );
  sort( b.begin(), b.end() );
  
  for ( int i=0; i<n; i++ ) {
    if ( a.at(i)==b.at(n-2) ) {
      cout << i+1 << endl;
    }
  }
}
```

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc213/tasks/abc213_b/editorial) → [公式解説](https://atcoder.jp/contests/abc213/editorial/2365)
解き方は回答1と同じですが、実装には pair を使っていて、スコアと選手番号をペアとして保持することで、ソートした後の処理を簡略化していました。

# 学んだこと
- pair の第1成分に関するソートの処理方法

# リンク
## 前後の記事
- 前の記事 → [AtCoderログ：0067 - ABC 061 B](https://qiita.com/RoadLynton/items/464eb7945e0978ce5c80)
AtCoderログ：0067 - ABC 061 B

# 問題

https://atcoder.jp/contests/abc061/tasks/abc061_b

## 問題文
> $N$ 個の都市があり、$M$ 本の道路があります。$i~(1 \le i \le M)$ 
 番目の道路は、都市 $a_i$ と都市 $b_i$ $(1 \le a_i,b_i \le N)$ を双方向に結んでいます。同じ $2$ つの都市を結ぶ道路は、$1$ 本とは限りません。
> 各都市から他の都市に向けて、何本の道路が伸びているか求めてください。

## 制約
> ・$2 \le N, M \le 50$
> ・$1 \le a_i,b_i \le N$
> ・$a_i \ne b_i$
> ・入力は全て整数である。

## 収録されている問題セット
- [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)
各都市に通っている道路の本数を保存する配列 path を用意し、初期値を 0 に設定します。都市 a から 都市 b の道路がある場合、path.at(a) と path.at(b) に 1 を加える操作を全ての道路に対して処理すれば良いでしょう。コードは以下のようになりました。

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

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

  int a, b;
  vector<int> path(n+1,0);
  for ( int i=0; i<m; i++ ) {
    cin >> a >> b;
    path.at(a) += 1;
    path.at(b) += 1;
  }

  for ( int i=1; i<=n; i++ ) {
    cout << path.at(i) << endl;
  }
}
```

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc061/tasks/abc061_b/editorial) → [コンテスト全体の解説](https://img.atcoder.jp/abc061/editorial.pdf)
後半は回答1と同じ方針でした。

# リンク
## 前後の記事
- 前の記事 → [AtCoderログ：0066 - ABC 213 A](https://qiita.com/RoadLynton/items/4004e7aa403cdf6b3ee7)
- 次の記事 → [AtCoderログ：0068 - ABC 213 B](https://qiita.com/RoadLynton/items/2f2e41ccbcfa65b29562)
MacからのRemote DesktopでJISキーボードを使えるようにする(PowerShellを使用)

# はじめに
MacのMicrosoft Remote Desktop.appからWindows Server等へリモートデスクトップ接続をするとキーボードが正しく認識されずUS配列のままになってしまうことがあります。
[Microsoft Remote DesktopでJISキーボードを有効にする方法 - Qiita](https://qiita.com/RYO-4947123/items/da880e53b2e8a493803a)に丁寧な解説記事がありますのでこちらの内容を実施すれば万事解決ですが, レジストリエディターではなくPowerShellからのコマンド操作で実施する方法を防備録としてまとめました。

# 手順
## キー"00010002"の値を変更
① 設定内容を確認

```PowerShell:コマンド
Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\KeyboardType Mapping\JPN" | Select-Object "00010002"
```

```:実行結果
00010002
--------
kbd106n.dll
```

② 値を`kbd106.dll`に変更

```PowerShell:コマンド
Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\KeyboardType Mapping\JPN" -Name 00010002 "kbd106.dll"
```

③ 設定値を確認

```PowerShell:コマンド
Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\KeyboardType Mapping\JPN" | Select-Object "00010002"
```

```:実行結果
00010002
--------
kbd106.dll
```

## キー"00000000"の値を変更
① 設定内容を確認

```PowerShell:コマンド
Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\KeyboardType Mapping\JPN" | Select-Object "00000000"
```

```:実行結果
00000000
--------
kbd101.dll
```

② 値を`kbd106.dll`に変更

```PowerShell:コマンド
Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\KeyboardType Mapping\JPN" -Name 00000000 "kbd106.dll"
```

③ 設定値を確認

```PowerShell:コマンド
Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\KeyboardType Mapping\JPN" | Select-Object "00000000"
```

```:実行結果
00000000
--------
kbd106.dll
```

## 最後に
上記の設定が終了したら, コンピューターを再起動します。
Windowsで仮想環境の作り方(VScode)

<br>

Pythonの仮想環境を作りたいときにOSがWindowsとMacとではコマンドが違うため困ったので備忘録みたいな感じで書いていきます。
ここではWindows10で仮想環境の作り方を説明します。
##前提
まず仮想環境を作りたいファイルを作成します。ここでは、ファイル名をmyProjectとしています。

```console:コマンドプロンプト
md myProject
```
ディレクトリの移動

```console:コマンドプロンプト
cd myProject
```

現在いるディレクトリをVScodeで開く

```console:コマンドプロンプト
code .
```

##仮想環境の作り方
ここから仮想環境を作っていきます。先ほどのコマンドで、作成したディレクトリでVScodeが開けたら新しいターミナルを開き以下のコマンドを入力します。

```console
python -m venv myenv
```

そうするとディレクトリの中にmyenvまたは、それに対応するファイルが作成されます。
次のコマンドは、コマンドプロンプトとPowerShellではコマンドが違うので注意してください。
参考[コマンドプロンプトとPowershellの違い](https://docs.python.org/ja/3.6/library/venv.html)

```console:コマンドプロンプト
myenv\Scripts\activate.bat 
```


```console:PowerShell
myenv\Scripts\Activate.ps1
```
そうすると先頭に(myenv)と付きこれが付いたら仮想環境に入れてます。

##インタープリターの選択
次に仮想環境の選択について説明していきます。
まず、表示(日本語の拡張機能入れてない人はview)からコマンドパレットを開きます。
![スクリーンショット 2021-08-11 124350.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1752668/251bf23d-b257-cd91-c722-60e24dcfb08f.png)

そこで、インタープリターと入れるとインタープリターを選択というのがあるのでそれをクリックします。そうすると、下の画像の赤矢印が差すように仮想環境を選択できます。

![スクリーンショット 2021-08-11 125013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1752668/6ffacfdf-8be5-fc2c-6e50-842a2f5a7d5c.png)

ここで、赤矢印のやつが出てない人は緑丸で囲ったところを選択してもらうとfindが出てきてそれをクリックすると、仮想環境を制作したときに作られたファイルが見れると思います。そこで、myenv\Scripts\pythonを選択します（下の画像参照）。
![スクリーンショット 2021-08-11 125557.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1752668/e1351b19-f036-effd-0ac4-81892e070f9a.png)

そうすると、左下のところで仮想環境を選択できていることが分かります。
![スクリーンショット 2021-08-11 124839.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1752668/29523c74-6bad-c203-b9f4-8ceba373b772.png)
本番環境でTailwindCSSが効かない【Next.js】

# 前提
次の構成での開発（TypeScriptはどうでもいいかも）
- React
- Next.js
- tailwindcss
- TypeScript

# 現象
開発環境（`yarn dev`や`next dev`）ではTailwindCSSで指定したスタイルが反映されているが，
本番環境（`yarn start`や`next start`）では反映されない

# 原因
**tailwind.config.jsのpurge設定が正しくなかったため**

本番環境ではpurgeで指定したファイルのみCSSが適用されます．

私の場合は，ディレクトリ構成が次のようになっていたにも関わらず，

```:sample_appのディレクトリ構造
sample_app
|
|---src
|    |-components
|    |    |-... 
|    |
|    |-pages
|         |-... 
|    
|-tailwind.config.js
```

purgeは次のように設定されていました．

```js:tailwind.config.js
module.exports = {
  purge: ["./components/**/*.{js,ts,jsx,tsx}", "./pages/**/*.{js,ts,jsx,tsx}"],
  darkMode: false,
  theme: {
    extend: {},
  },
  variants: {
    extend: {},
  },
  plugins: [],
};
```

私の場合，`pages`や`components`は`./src`配下にあるため，`./pages`や`./components`は存在せずcssが反映されていなかったということです．

よって，次のように修正したら解決しました．

```js:tailwind.config.js
module.exports = {
  purge: ["./src/**/*.{js,ts,jsx,tsx}"],
  darkMode: false,
  theme: {
    extend: {},
  },
  variants: {
    extend: {},
  },
  plugins: [],
};
```

`npx create-next-app`ではsrcディレクトリは生成されないので，私のようにそこからディレクトリ構造を変更した人がこの問題に直面するのかなと思います．
一時テーブルを作成してtsvでデータを登録する方法


一時テーブルを作成して、テーブル作成後にtsvファイルでデータを登録する方法です。

流れとしては以下のようになります。
一時テーブルを作成　→　tsvファイルでデータを登録

まず、一時テーブルを作成します。
一時テーブルは「CREATE TEMPORARY テーブル名」で作成できます。
既存テーブルがある場合は「SHOW CREATE TABLE テーブル名;」でテーブル情報を取得して応用するといいかもしれません。
<pre>CREATE TEMPORARY TABLE テーブル名 (
　PRIMARY KEYやカラムの定義など、テーブル構造を記述
);
</pre>

その後、「LOAD DATA LOCAL INFILE 'tsvファイル名'」でtsvファイルを使用して作成した一時テーブルにデータを登録します。
<pre>LOAD DATA LOCAL INFILE '/tmp/test_data.tsv' INTO TABLE テーブル名(登録カラム名);
</pre>
MVCモデルについて

#MVCとは
モデル（Model）、ビー（View）、コントローラー（Controller）の頭文字をとって**MVC**という。
Railsでは、MVC+ルーターに役割が別れる。

####なぜ必要なの？
M/V/Cに分割することで、効率的に開発、保守することが可能になる。
MVCについて理解せず場当たり的に開発してしまうと、ディレクトリ構造がぐちゃぐちゃなってしまいがち。その結果、チーム開発や保守がしづらくなってしまう。



#コントローラー
司令塔、MVCの中心的存在。
**コントローラーを中心にMVCを覚えると分かりやすい。**

####役割
ユーザーの入力を元に、モデルとビューに命令を出す
ユーザー、モデル、ビューの橋渡し的存在。

####ファイル
- 場所： `/app/controllers/[コントローラー名]_controller.rb`
- 名前： `[コントローラー名]_controller.rb`とする
- リソース毎にファイルが存在する。[^1]

[^1]: リソースとは、コントローラーの操作対象のデータのこと。


#モデル
データベースを取り扱う。
データの追加、更新、削除を行う。

####ファイル
- 場所： `/app/models/[モデル名].rb`
- リソース毎にファイルが存在する。[^1]

#ビュー
お客さんへの対応窓口みたいなもの。

####役割
Webブラウザに表示するHTMLを動的に生成する。


####ファイル
/app/views/[]

#ルーター
コントローラーを補助する秘書のようなもの。

####役割
役割としてはコントローラーの一部。
HTTPリクエストを読み取って、コントローラーへ処理を振り分ける。

####ファイル
- 場所：`/config/routes.rb`
- ファイルはひとつ。


#参考にしたサイト
https://rails-study.net/mvc-r/#i-4
https://www.geekly.co.jp/column/cat-technology/1911_040/
Java Excel フィルターの作り方

<h4>Excelでは、フィルター機能を利用することで、指定したデータのみを表示したり、取り出したりすることができます。今回はFree Spire.XLS for Javaという無料のライブラリを活用して、Excelでフィルターの作り方を紹介します。</h4>
<h4><strong>下準備</strong></h4>
<h4>1.E-iceblueの公式サイトから<a href="https://www.e-iceblue.com/Download/xls-for-java-free.html">Free Spire. XLS for Java</a>無料版をダウンロードしてください。</h4>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210811/20210811122545.png" alt="f:id:lendoris:20210811122545p:plain" width="545" height="198" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
<h4>2.IDEを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire. XLS.jarを参照に追加してください。</h4>
<h4> <img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210811/20210811122551.png" alt="f:id:lendoris:20210811122551p:plain" width="268" height="93" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></h4>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210811/20210811122615.png" alt="f:id:lendoris:20210811122615p:plain" width="554" height="240" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
```JAVA
import com.spire.xls.ExcelVersion;
import com.spire.xls.Workbook;
import com.spire.xls.Worksheet;

public class CreateFilter {
    public static void main(String[] args){
        //Excelファイルをロードします。
        Workbook workbook = new Workbook();
        workbook.loadFromFile("Example.xlsx");

        //始めのシートを取得します。
        Worksheet sheet = workbook.getWorksheets().get(0);

        //A2:G2の範囲でフィルターを追加します。
        sheet.getAutoFilters().setRange(sheet.getCellRange("A1:G2"));

        //保存します
        workbook.saveToFile("CreateFilter.xlsx", ExcelVersion.Version2010);
    }
}
```
<h4><strong>実行結果</strong></h4>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210811/20210811122702.png" alt="f:id:lendoris:20210811122702p:plain" width="554" height="257" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
<p> </p>
Databricks（Spark）にてPysparkによりコア数（スロット数）を確認する方法

## 概要
Databricks(Spark)にてPysparkによりコア数（スロット数）を確認する方法を共有します。

## 実行環境
databricks runtime: 8.3.x-cpu-ml-scala2.12
Python version: 3.8.8
pyspark version: 3.1.2.dev0

## 手順
下記のコードを実行。

```python
spark.sparkContext.defaultParallelism
```

### ワーカーノードにて4CoresのVMが1台の場合には、4と表示
実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f23aea68-9dec-b1a6-69e5-d2ef94a937fd.png)


ワーカーノードのVMの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/029353fd-e2bd-13d3-6112-01b134d64970.png)


### ワーカーノードにて4CoresのVMが3台の場合には、12と表示。
実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7435f938-27fe-7d93-23b4-38a369cb5b9e.png)


ワーカーノードのVMの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9724bf14-7870-4848-9cae-d972d1593b84.png)
[Java] Microsoft Word のプロパティを設定

<p><strong>Wordプロパティは、ファイルの内容を示し、そのファイルを特定するためのものです。 ドキュメントのプロパティには、タイトル、作成者名、件名などのほかに、ドキュメントのトピックや内容を特定するキーワードがあります。今回はSpire.Doc for Javaというライブラリを使ってWord プロパティを設定する方法を紹介していきます。</strong></p>
<h4><strong> </strong><strong>下準備</strong></h4>
<p><strong>1.E-iceblueの公式サイトから<a href="https://www.e-iceblue.com/Download/doc-for-java-free.html">Free Spire.doc for Java</a>無料版をダウンロードしてください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210811/20210811121604.png" alt="f:id:lendoris:20210811121604p:plain" width="437" height="221" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
<p><strong> </strong><strong>2.IDEを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire.doc.jarを参照に追加してください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210811/20210811121611.png" alt="f:id:lendoris:20210811121611p:plain" width="239" height="101" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
<h4><strong>プロパティを設定</strong></h4>
```JAVA
import com.spire.doc.Document;
import com.spire.doc.FileFormat;

public class SetDocumentProperties {
    public static void main(String[] args){
        //Wordファイルをロードします。
        Document document = new Document("Input.docx");

        //プロパティを設定します。
        document.getBuiltinDocumentProperties().setTitle("パンダンのファイル");
        document.getBuiltinDocumentProperties().setSubject("Wordプロパティ");
        document.getBuiltinDocumentProperties().setAuthor("James");
        document.getBuiltinDocumentProperties().setCompany("竹会社");
        document.getBuiltinDocumentProperties().setManager("Jakson");
        document.getBuiltinDocumentProperties().setCategory("Word操作");
        document.getBuiltinDocumentProperties().setKeywords("プロパティ");
        document.getBuiltinDocumentProperties().setComments("複写禁止");

        //保存します。
        document.saveToFile("SetBuiltInProperties.docx", FileFormat.Docx_2013);
    }
}
```

<h4><strong>実行結果</strong></h4>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210811/20210811121714.png" alt="f:id:lendoris:20210811121714p:plain" width="431" height="429" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
<h4><strong>プロパティをカスタマイズ設定</strong></h4>
```JAVA
import com.spire.doc.Document;
import com.spire.doc.FileFormat;

public class SetDocumentProperties {
    public static void main(String[] args){
        //Wordファイルをロードします。
        Document document = new Document("Input.docx");

        //プロパティをカスタマイズ設定します。
        document.getCustomDocumentProperties().add("番号", "AB01");
        document.getCustomDocumentProperties().add("閲覧者", "Wilson");

        //保存します。
        document.saveToFile("SetCustomProperties.docx", FileFormat.Docx_2013);

    }
}
```
<h4><strong>実行結果</strong></h4>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210811/20210811121758.png" alt="f:id:lendoris:20210811121758p:plain" width="371" height="456" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
<p> </p>
VsCodeでPrettierが効かなくなった時の対応

#概要
Prettierインストール後、保存時にコードが自動整形されるはず。
だけど、何かをきっかけに自動整形が上手く走らなくなった。
Prettierのプラグインも入れている。VsCodeの自動整形も入れているのに、なぜか動かなかった。備忘録のためにも記事に残す。

#稼動環境
1. Prettierはインストール済み
![スクリーンショット 2021-08-11 12.04.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/224ee83f-3463-5c0c-04c4-e2e03b7e7e84.png)

2. VsCodeの設定(自動フォーマットの有効化)
![スクリーンショット 2021-08-11 12.06.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/d19390af-5da7-04dd-5715-e0173349f12c.png)

#原因
VsCodeの自動整形ツールにPrettierを紐づけていなかった事。
VsCodeの自動化はした、Prettierもインストール済み。でも、紐付けが上手くいってないから、自動整形が上手く行かない。原因を突き止めると至極単純なのだが、初回Pluginインストール時は自動で紐付けをやってくれたので、意外と気が付きにくい。

#解決策
setting.jsonに↓のコードを追記する。

```json:setting.json
"editor.defaultFormatter": "esbenp.prettier-vscode",
```
[初心者向け] なぜDocker imagesがホストディスク容量を圧迫するのか

# はじめに
右も左もわからないプログラミング初心者が書く備忘録です。
膨大な勉強量の中で気になった事をメモしていきます。

間違いや記事を見て良かったことなど
気軽にコメントを残して頂けると活力に繋がりますのでよろしくおねがいします:smiley:


# 今回の内容
前回の記事

https://qiita.com/daisuke114/items/e79c54ab343004199c0f

の続きで、なんでimagesがそんな大容量になってしまったのかという所に焦点を当てていきたいと思います

ちなみに前回の記事に補足として記載しようとしていたのですが、思ったよりも長くなってしまったので記事として投稿させて頂いております。


# 開発環境
Rails 6.1.3.2
ruby 2.5.1
Docker version 20.10.6



# なぜimagesが3.5GBもの大容量になっているのか

結論から言うと、アプリそのものが大容量になっているからでした
今回の原因はwebpackerでした

https://railsguides.jp/webpacker.html

dockerから一度離れますが、development環境のwebpackerはデフォルトでwebpack-dev-serverが適用されており
app/javascript/packs/*.jsファイルの変更を監視し、変更が必要であるページに転移した際にコンパイルされる
コンパイルされる毎に、public/packs配下にアセットを置きます。

最後に生成されたアセットを app/public/packs/manifest.json が読み取り
最終的に
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
などで読み込み、viewに表示することで処理速度をあげるのだと私は解釈しています

ものすごく簡単に考えるとアセットとはキャッシュのlogで、manifest.jsonは最新のキャッシュを読む
ものだと考えています。
（間違えているようでしたらご指摘頂けると幸いです:bow:）

今回の原因はそのアセットでした
アセットは自動で削除されず、コンパイルされる毎にどんどん溜まっていきます（自動で不必要なアセットを削除する方法が見つかりませんでした。。。）

お恥ずかしいかぎりですが、その容量なんと２GB！！！

私の場合、app/public/packs/js　というディレクトリにアセットが配置されていました。
中のファイルは全て消しても、
app/javascript/packs配下のファイルを何でも良い（cssを少し書き換えるなど）ので変更し、
それを必要とするページを開けば新たなアセットが作成されます
（環境により、アセットが作成されない場合があるので、最新のアセットは残しておくようにしましょう！）
そして変更がない限り、最新のアセット１つのみ残ることになります
アセット削除後に何も変更せずにアプリを開くと、読むアセットが無いため悲惨な状態になっていますが落ち着きましょう笑

# 削除してみる
今回、アプリの容量を見ながら作業したかったので、
画面左上のアップルマーク　→　このMACについて　→　ストレージ　→　管理…　→　書類　→　ファイルブラウザ
を開き、アプリのディレクトリからpublic/packs/jsを見つけ、手動で削除しました
（macbookAir: os mojave ver.10.14.6）

膨大な量になったアセットを一括削除すると

アセット削除前のアプリの容量　→　 2.99GB
アセット削除後のアプリの容量　→　394.7MB

となりました

そしてDockerのimagesは

アセット削除前　→　3.59GB
アセット削除後　→　1.66GB

となりました

副次的に、docker-compose buildの速度も劇的に上昇！

アセット削除前　→　632s
アセット削除後　→　359.7s



# 最後に
Dockerを導入した時に、気になっていた箇所でしたので
気になったのなら解決するまで頑張ろう！と思えた問題でした


勉強を始めたばかりで知識もなく、拙い文章ですがアウトプットすることで頭の中を整理しつつ、どなたかのお役に立てれば良いなと思い投稿させて頂きました。
最後まで見て頂きありがとうございました！
Databricks(Spark)にてPysparkによりSparkテーブルのファイルフォーマットを変数にセットする方法

## 概要
Databricks(Spark)にてPysparkによりSparkテーブルのファイルフォーマットを変数にセットする方法を共有します。
`DESC EXTENDED`により取得できるデータに含まれており、Sparkデータフレームに格納後、値を変数にセットする手順です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/fa3ae4d7-36d8-f6e3-a2dc-1ba49ec92f87.png)


## 実行環境
databricks runtime: 8.3.x-cpu-ml-scala2.12
Python version: 3.8.8
pyspark version: 3.1.2.dev0

## 手順
下記のコードを実行。
Delta Lake形式の場合には、deltaと表示されます。

```python
from pyspark.sql.functions import col

# テーブル名を指定
table_name = 'qiita_test.flights_summary_data'

# ファイルフォーマット（Provider）を取得
file_format = (spark.sql(f'DESC EXTENDED {table_name}')
                   .where(col('col_name') == 'Provider')
                   .select('data_type')
                   .collect()[0][0]
              )

print(file_format)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d1c78635-ef07-6351-4d96-543fc3cbbc0c.png)


Parquet形式の場合には、parquetと表示されます。

```python
from pyspark.sql.functions import col

# テーブル名を指定
table_name = 'qiita_test.flights_summary_data_parquet'

# ファイルフォーマット（Provider）を取得
file_format = (spark.sql(f'DESC EXTENDED {table_name}')
                   .where(col('col_name') == 'Provider')
                   .select('data_type')
                   .collect()[0][0]
              )

print(file_format)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/585f14a1-b126-6a35-55b3-6aabf362838b.png)
a simple user-data of ec2 httpd

a simple user-data of ec2 httpd

```
#!/bin/bash
# Use this for your user data (script from top to bottom)
# install httpd (Linux 2 version)
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd
echo "<h1>Hello World from $(hostname -f)<h1>" > /var/www/html/index.html
```