OmniAICreator/Qiita-1.07M huggingface dataset:
Gnuplot.jl を使用して、論文用の図(eps,latex)を作成する


Gnuplot.jlを使用して論文用の図を作成するための、メソッドを個人的なメモとして記述する。


物理学系ではlatexを用いて論文を書くことが多く、そのため図をeps形式などで使うことが多い(らしい)。

今回は、Gnuplot.jlを用いて簡単に図をeps出力してそれをlatexで実装する所まで紹介する。

以下のコードがあったとする。

![スクリーンショット 2020-11-06 22.10.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263910/94adb0cf-e29d-2bbc-09be-ebdb99981a12.png)

上の図をセーブすると、texファイルとepsファイルの両方が出力されるので、両方ダウンロードする。
![スクリーンショット 2020-11-06 22.11.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263910/d3b6c66e-0551-6a7a-4335-36fe443f3805.png)

これをtex環境で以下のように宣言する(test.epsで宣言すると上手くいかない)
![スクリーンショット 2020-11-06 22.13.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263910/bab59fcc-15f2-0e62-74de-0337e638181a.png)
latex上の出力結果
![スクリーンショット 2020-11-06 22.15.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263910/4ed2fdf6-cfd6-d910-a6e3-d0439dacb9d0.png)


ラベル表記がlatex表記になっており、綺麗な図が描ける。
個人的に問題だと思った点はjupyter notebook上のlatex表記した所が表示されない（しかし、latex上では表示される）。
このことに関して解決策を見つけた方がいらっしゃいましたら、コメント下さい。お願いします。
Rustで並列処理する湯婆婆を実装してみる

# 元ネタ

@Nemesisさんの[Javaで湯婆婆を実装してみる](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2)に便乗してみました。

# のんびり書いてる間に先を越された。

[Rustで湯婆婆を実装してみる](https://qiita.com/7321hasu/items/cad5efdaaf842cc967ba)

でもせっかくだから投稿しちゃう。

# コード

```rust
use std::sync::{Arc, Mutex, Barrier};
use std::thread;
use rand::Rng;

fn main() {
    let mut handles = Vec::with_capacity(3);
    let name = Arc::new(Mutex::new(String::new()));
    let barrier = Arc::new(Barrier::new(3));

    handles.push(thread::spawn({
        let name = name.clone();
        let barrier = barrier.clone();
        move || {
            {
                let stdin = std::io::stdin();
                let mut locked = name.lock().unwrap();
                println!("湯婆婆A：契約書だよ。そこに名前を書きな。");
                let _ = stdin.read_line(&mut *locked);
            }
            barrier.wait();
        }
    }));

    handles.push(thread::spawn({
        let name = name.clone();
        let barrier = barrier.clone();
        move || {
            barrier.wait();
            let mut locked = name.lock().unwrap();
            println!("湯婆婆B：フン。{}というのかい。贅沢な名だねぇ。", locked.trim());
            let n = rand::thread_rng().gen_range(0, locked.trim().chars().count());
            *locked = locked.trim().chars().nth(n).unwrap().to_string();
        }
    }));

    handles.push(thread::spawn({
        let name = name.clone();
        let barrier = barrier.clone();
        move || {
            barrier.wait();
            println!("湯婆婆C：今からお前の名前は{0}だ。いいかい、{0}だよ。分かったら返事をするんだ、{0}!!", name.lock().unwrap().trim());
        }
    }));

    handles.into_iter().for_each(|h| { let _ = h.join(); });
}
```

# ポイズン湯婆婆
空白のままにしますと、あるスレッドがMutexをロックしたまま終了しますので、湯婆婆Cはポイズンエラーが発生します。~~ポイズン湯婆婆~~。

![Screenshot from 2020-11-06 22-06-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665043/14c46f36-dc03-81fe-6372-9be98f92400a.png)

もちろん湯婆婆Bはクラッシュ~~湯婆婆~~してます。

# 連帯感
たまに湯婆婆Cがでしゃばります。
![Screenshot from 2020-11-06 22-01-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665043/ed920601-c3c6-ae11-3ea6-5c74b40c6735.png)


# おわりに
Rustは並列処理を比較的気持ちよくかけます。

しかし、やっぱり並列処理の基本的な考えをおろそかにしていると、デバックしにくかったり、実行タイミングが管理しきれなくなったりします。

それでも、Rustは並列処理を書きやすいです。

メモリ競合を抑えるための`Mutex`やタイミングを合わせるための`barrier`、デバックに関しては`std::io::Error`を`new`すれば手軽にデバック用のメッセージを飛ばせる（要件に合わせて自作Error型を作ったほうがいい気はするけど。。）。

Rustはいいですよぉ。とくにC++を学んだ方にはおすすめします。C++経験者であればすんなり馴染めることでしょう。
ER図：エンティティリレーションシップの説明

#【概要】

<b>1.[ER図とは](#1er図とは)</b>

<b>2.[各項目の名称と説明](#2各項目の名称と説明)</b>

<b>3.[リレーションとカーディナリティ](#3リレーションとカーディナリティ)</b>



#1.ER図とは
下記のようなデータ関係性を示す図のことです。
ユーザーのカラム名やどのテーブルにどのカラムを持っていくかを整理するためでもあり、関係性を整理した図になります。
![スクリーンショット 2020-11-06 22.30.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686400/c423bafe-d722-f066-aa9b-a44fa1d08b22.png)


#2.各項目の名称と説明
❶❻：アトリビュートといい、DBでいうカラム名を指します。
❷：エンティティといい、DBでいうテーブル名になります。
❸；PrimaryKeyの略で、そのエンティティのメインキーになります。このメインキーを他のエンティティとつなげる(リレーションとカーディナリティ)ことでどこに何の情報をもっていっているかわかります。
❹：ForeignKeyの略で、外部キーを指します。外部キーは主力キーを他のエンティティにデータを渡す際に、”他のエンティティの主力キー情報も参照します”という意味です。他から見ると外部になるためです。
❺：リレーションとカーディナリティと言います。これは下記にて詳しく説明します。

#3.リレーションとカーディナリティ
![スクリーンショット 2020-11-06 22.45.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686400/454256cd-0e81-64a5-9bbc-53e371c7d4bf.png)
❺-1をさしているエンティティ同士たちを繋いでいる線が`リレーション`と呼ばれる部分です。
❺-2の`○`や`|`、`鳥の足`のような形をしている部分が`カーディナリティ`と呼ばれる部分です。
これにはいくつか種類があります。

●これは`ゼロ(0)`という意味です。
![スクリーンショット 2020-11-06 22.50.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686400/f7c930f1-caaf-a7d8-be59-8a0700d43bd8.png)

●これは`いち(１)`という意味です。

![スクリーンショット 2020-11-0622.29.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686400/89f2cae7-d70d-b484-0354-0bca911a09f6.png)

●これは`多(複数)`を意味します。
![スクリーンショット 2020-11-06 22.50.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686400/d2abde87-7f26-0e57-bebb-26f0963571e5.png)

これらをリレーションを交えて説明すると以下のような例が
できます！(アトリビュートやPKは適当なので気にしないでください！)

●1対多(1以上)
オーソドックスに使用する関係です！
![スクリーンショット 2020-11-06 22.57.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686400/8f7eba10-50c1-232d-3ecf-f15dbdddabe1.png)

●多対多(1以上)
これもよく使用します！
中間テーブルが必要でthroughの記載が必要なパターンです。
![スクリーンショット 2020-11-06 22.58.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686400/20373cb9-be6f-ea2f-f17b-e8d71ce51412.png)

●0(ゼロ)or1対多(0以上)
0のときもあれば1の時もあり、複数にまたがる可能性があるテーブルがあるときです！
![スクリーンショット 2020-11-06 22.58.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686400/7c65db12-3195-b149-53a4-555a099367c3.png)
Notice: Undefined indexエラーの対処法

##エラー内容
`Undefined index`＝`未定義の配列の要素を使用した時に出る`エラー。
`$_POST`や`$_GET`で`値を受け取る時`によく発生すると言われています。

##解決方法
```
//キー値の場所 : <form method="POST"><input　name="キー値"></form>

if ($_POST["キー値"])  
{
   //処理内容
}

$user_email=$post['email'];  

↓

// !emptyで配列の要素が定義されているか確認する。

if (!empty($_POST["キー値"])) 
{
   //処理内容
}

if (!empty($_post["email"])) 
{
   $user_email=$post['email'];  
}

```

参考元はこちら
(https://qiita.com/wakahara3/items/bb7c8d7a1673b161abe7)
【Rails】バリデーションエラーメッセージを日本語にする

# 記事の内容
deviseを使ったユーザー管理機能のテストコードを書く中で、バリデーションのエラーメッセージを日本語にする方法を学んだので、備忘録として記録します。

# 環境
```yml
OS: macOS Catalina 10.15.6
Ruby: 2.6.5
Rails: 6.0.3.4
```

# 手順
①config/application.rbを編集
②gem 'rails-i18n' を導入
③config/localesに日本語用のYAMLを作成

# ①config/application.rbを編集
以下のように編集。

```ruby
module アプリケーション名
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.0
    config.i18n.default_locale = :ja # 言語の設定を日本語にする記述
    # （省略）
  end
end
```

# ②gem 'rails-i18n' を導入
- Gemfileに以下を記述

```
gem 'rails-i18n'
```
- ターミナルで```bundle install```を実行

# ③config/localesに日本語用のYAMLを作成
####deviseのデフォルトバリデーションの場合####
- config/localesにdevise.ja.ymlを作成
- 以下リンク先の記述を作成したファイルにペースト  
https://github.com/tigrish/devise-i18n/blob/master/rails/locales/ja.yml  

####任意に追加したカラムの場合####
- config/localesにja.ymlを作成  
- 以下のような形でモデルとカラムの数に応じてファイルを編集  
（インデントがズレるとうまく動かないようです。）

```yml
ja:
 activerecord:
   attributes:
     モデル名:
       カラム名: 表示させたい日本語訳
     モデル名:
       カラム名: 表示させたい日本語訳
       カラム名: 表示させたい日本語訳
```

# 補足
devise.ja.ymlの内容についても、日本語訳の部分を適宜修正するとメッセージの表示がきれいになると思います。  
また、モデル名.rb内で```presence:```のバリデーションを設定しているものについても、画像などの場合デフォルトのエラーメッセージと相性が悪いこともあるため、以下のようにメッセージを任意で設定しても良いと思います。

```ruby
  validates :image, presence: { message: 'を選択してください' }
  # 'true'は入れない！
```

引き続き学習がんばります！
【2020年受験】AWSソリューションアーキテクト アソシエイト合格体験記

タイトルの通り、AWSソリューションアーキテクトアソシエイト試験を受験し、合格しましたので、体験記を書きたいと思います。

###試験について
AWSソリューションアーキテクトとはどのような資格か？といった根本的なことはご存じかと思いますので、ここでは実際に試験を受ける上での重要事項だけ書きます。

<dl>
<dt>合格ライン</dt>
<dd>100～1,000点中、720点が合格ラインです。</dd>
<dt>受験方法</dt>
<dd>全国のテストセンターで受験できるほか、最近では自宅でのリモート受験も出来ます！すごいですよね。
私も自宅受験やってみたい、と思いましたが、子どもに乱入されると一巻の終わりでしたので無難にテストセンターにしました。
自宅では集中力が落ちるとか、通信回線に不安がある方は、無難にテストセンターにしておいたほうがいいと思います。</dd>
<dt>資格の有効期限</dt>
<dd>3年です。たいてい有効期限があるのがベンダー試験の厳しいところですよね…
特にAWSは頻繁に新サービスがリリースされたりするので、有効期限の必要性は分かるんですけどね。</dd>

###受験者のスペック
都内勤務のインフラエンジニアです。
AWS実務歴は半年ほど。某案件でわりと自由にAWSラボ環境を使わせてもらえる機会があり、基本的なマルチAZの冗長構成を作ったりできました。
やはり実際に手を動かす経験は大きいですね！
少なくともVPN、サブネット、IGW、EC2、RDS、S3、CloudWatch、AutoScaling、IAMあたりは実践経験があったほうがいいのではないかと思います。

###使った教材
※アフィリンクではないのでご安心ください。
##### [徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-AWS%E8%AA%8D%E5%AE%9A-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E2%80%93-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E6%95%99%E7%A7%91%E6%9B%B8/dp/4295005495/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2F7PQI0EGWUBQ&dchild=1&keywords=%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5+aws%E8%AA%8D%E5%AE%9A+%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88&qid=1604153104&sprefix=%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5%E3%80%80AWS%2Caps%2C273&sr=8-1)

いろいろな試験で定番の、いわゆる黒本。
ある程度インフラ業界で働いている人にとっては、すんなりと理解できる内容になっていると思います。

また、本試験と同程度の問題集が付属しています。
本試験とは難易度や出題傾向がちょっと違いますが（特に近年リリースされたサービスに対応しきれていない印象）、実力試しには最適かと。

##### Web上の無料問題集
ありがたいことにWeb上に無料問題集があり、活用させて頂きました。

[AWS認定資格 無料WEB問題集＆徹底解説](https://aws-exam.net/saa/)
とか
[Amazon AWS 資格取得のための演習問題集(完全無料、オリジナル)](https://awsjp.com/exam/saa-sap/c/)
とか。
問題数も豊富ですし、なにより無料です。利用しない手はないです。


ちなみに、Udemyの問題集も評判がいいみたいですね。
私はもし不合格になったらお世話になろうと思いましたが、運よく1発合格できましたので利用しませんでした。

###AWS公式 模擬試験
AWS公式で模擬試験も受けられます。もちろん自宅からのリモートも可。
詳細は以下の通り。

 * 金額 2,200円(税込)
 * 試験時間 35分
 * 出題数 25問

たかが25問に2,200円…と思われるかもしれませんが、個人的には**絶対やるべき**だと思いました。

やはり実際の試験に近い形式での問題に触れられるのは大きいです。
私個人としては模擬試験を受けてみて、

 * 意外と時間が足りない！
 * 問題文の日本語が若干クセある！
 * 黒本でみたことないサービスが出てきた（Amazon Cognito？なにそれ？）！

と、率直に言うと**予想以上に難易度が高かった**ことを思い知らされました。
ぶっつけで本試験に挑んでいたら、無事返り討ちになっていたことでしょう…。

###試験本番
そんなわけでしっかり対策を練ったうえで、いざ本試験。
攻略法…とまでは言えませんが、ここを気をつけるべきというポイントを挙げます。

<dl>
<dt>何が求められているのかをしっかり意識する</dt>
<dd>たいてい問題文の最後の一文に書かれているのですが、AWSのサービス群を使って**何を解決したいのか**を押さえることがポイントです。

求められるのはコスト効率の良さか？
高パフォーマンスを発揮する構成か？
高可用性か？
堅牢なセキュリティか？

どうしても試験中は急がなければいけないという意識が働き、無意識で問題文を流し読みしがちになります（特に問題文の後半は）。
しかし、求められていること、解決したい問題、これを読み間違えると非常にもったいないです。
</dd>

### スコアレポート

結果、725点/1,000点で合格となりました。
たぶんあと1問間違っていたら…(；´Д`)

スコアレポートは↓のような形で、早ければ翌日にでも確認できます。
![スコアレポート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759621/bb5dd0b0-7c18-ea53-4323-742408f29e54.png)
jestでdynamoが絡んだテストをするとき、次のテストケースに前のテストケースで生成したテストデータが残ったままになってしまう問題の改善

## 今までの方法
今作っているテストコードでは、テストケースごとにテストデータの生成と削除を行う。
そのテストケースが何十個もあるので、テストデータの生成と削除を多く繰り返していることになる。

そのせいか、一つ前のテストケースで削除したはずのテストデータが次のテストケース実行時にそのデータが残ったままで意図する期待値にならずテストが失敗となってしまう。。。

ただ計算するだけみたいなテストなら特に何も意識する必要はないが、
DBや外部APIやその他重い処理が絡むと、テスト時間が長かったり意図しない結果になる場合があるのではないだろうか。

**もしjestのテスト実行を並列実行で行っている場合は以下の方法が有効になります。
テストにめっちゃ時間がかかる代わりに直列実行を選べば以下の方法は不要です。**

## 方法
ググりまくったら、jestには「done」というものが利用でき、これをテストケースの引数に用意した場合は、このdoneを呼ぶまで次のテストケースを呼ぶのを待ってくれるらしい。
ここで、注意なのが、そのまま一番下にdone()を書くだけだと、非同期のせいでdone()が先に呼ばれてしまって結局意味ないことになってしまう。

dynamoでgetやputする際は、get(パラメータ).promise()するべきだが、このpromise()にthenをつけてこの中でdone()する。

```typescript:anime-suko.ts
const testCase1 = test('hogehogeテスト', async (done) => {
//いろいろテスト(省略)

//ここから後処理
  await documentClient
    .delete(パラメータ)
    .promise()
    .then(() => {
      done()
    })
})
```

## 注意
引数にdoneを用意したら、必ず使う必要がある。
以下のように、引数にdoneを用意だけしてdone()して呼ばなかった場合、永遠に次のテストケースが呼ばれずタイムアウトになる。
doneは、引数に用意したときだけ待ってくれる機能が有効になるので、用意したら必ず使う。

```typescript:anime-suko.ts
const testCase1 = test('hogehogeテスト', async (done) => {
//いろいろテスト(省略)

//ここから後処理
  await documentClient.delete(パラメータ).promise()
})
```


## 感想
jestで複数のテストファイルを一括で実行していて、今まではテストケース割と少なめだったから成功していたが、今回テストケース多めのテストコードを書いてたおかげで、今まで書いていた方法では安定しない方法だったと気づかされた。
pdfplumberでPDFからCSVに変換

[pdfplumber](https://github.com/jsvine/pdfplumber)

camelotで点線を実線として処理する（ハフ変換）
https://qiita.com/barobaro/items/af850ac29dbc983eb39b

こちらでもcamelotは実線以外の表の抽出が苦手
pdfplumberだと簡単に抽出できるみたい

# 変換できなかった

[Go To EAT事業公式サイト 滋賀県](https://sites.google.com/view/gte-shiga-list/)
[労働基準関係法令違反に係る公表事案](https://www.mhlw.go.jp/content/000534084.pdf)
文字が認識しない、camelotだと抽出可能

# 変換できた

## 電話や情報通信機器を用いて診療を実施する医療機関の一覧
[電話や情報通信機器を用いて診療を実施する医療機関の一覧（兵庫県）](https://www.mhlw.go.jp/content/000691131.pdf)

```shell
wget https://www.mhlw.go.jp/content/000691131.pdf -O data.pdf
pip install pdfplumber
```

```python
import pdfplumber
import pandas as pd

with pdfplumber.open("data.pdf") as pdf:

    dfs = []

    for page in pdf.pages:

        data = page.extract_table()
        df_tmp = pd.DataFrame(data[2:], columns=data[1])

        dfs.append(df_tmp)

df = pd.concat(dfs)

df.to_csv("hyogo.csv", encoding="utf_8_sig")
```
## 千葉県のGo To EaTのPDF

https://www.chiba-gte.jp/downloads/store_list.pdf

```shell
wget https://www.chiba-gte.jp/downloads/store_list.pdf -O data.pdf
```

```python
import pdfplumber
import pandas as pd

with pdfplumber.open("data.pdf") as pdf:

    dfs = []

    for page in pdf.pages:

        data = page.extract_table()
        df_tmp = pd.DataFrame(data)

        dfs.append(df_tmp)

df = pd.concat(dfs)

df1 = df.mask(df.isna() | (df == "")).dropna(thresh=4)

df2 = df1[df1[0] != "紙"].reset_index(drop=True)

df2.set_axis(["紙", "電子", "店舗名", "住所", "TEL"], axis=1, inplace=True)

df2.index += 1

df2.to_csv("data.csv")
```
非同期処理を直列で実行する（ES2017以前）

## はじめに
現場での業務でJavaScriptを使用しているのですが、昔からあるシステムの改修でJavaScriptのバージョンがES2015を使って仕事しています。ES2015ではasync/awaitは使用できないため他の方法で代用しました。他現場でも使用するかもしれないので、備忘録としてメモ程度に残しておきます。

## ソースコード
``` JavaScript
// setTimeoutを使用して、非同期処理にする（実際はDB処理などを行う）
// 引数として渡された値（秒数）を待機時間とし値を出力
function promiseFunc(timeoutSeconds) {
  return new Promise((resolve, reject) => {
    const timer = setTimeout(() => {
      clearTimeout(timer);
      console.log(timeoutSeconds);
      resolve();
    }, timeoutSeconds * 1000);
  });
}

const timeoutSecondsList = [1, 2, 1, 3, 5];
timeoutSecondsList.reduce(
  (pv, cv) => pv.then(_ => promiseFunc(cv), e => Promise.reject(e)),
  // 1回目のループは正常とする
  Promise.resolve()
).then(
  // 最後のメッセージを出力する
  _ => {
    console.log('Complete!!');
  },
  e => {
    console.log(e);
  }
);
```

Array.reduceを利用することで前回の実行結果（Promise）を待って実行することができます。今回は値を配列にし、それぞれの値を関数に与えて実行する形でしたが、Promiseを返す関数の配列でも使用できると思います。

## おわりに
async/awaitを使うことができればこんなことには…
ただ今までreduceについてはあまり使ったことがなく、理解もしていなかったのですが、今回の件で使い方および仕様の理解が深まったのはいい結果でした。
常に最新の技術を仕事で使用できるわけではないので、使えるもので創意工夫を凝らしていきたいですね。
Wio Terminal RTLファームウェアのアップデート手順（Windows）

Wio Terminalには、メインとなるCPU（ATSAMD51P19）とワイヤレス通信用CPU（RTL8720DN）が搭載されていて、それぞれにフラッシュメモリがあります。（参考：[Wio Terminalのアーキテクチャ](https://www.slideshare.net/TakashiMatsuoka2/wio-terminal/22)）
ワイヤレス通信用CPUのプログラム（RTL8720 Firmware）をフラッシュメモリに書き込むのに、ちょっとした操作が必要なので、、、Windowsの場合の手順を書いておきます。

# ダウンロード

RTL8720ファームウェアと書き込みツール、書き込み時にメインCPUに書いておくファームウェアをダウンロードしてください。

* [RTL8720ファームウェア](https://github.com/Seeed-Studio/seeed-ambd-firmware/releases) ... 執筆時の最新は20201106-seeed-ambd-firmware-rpc-v2.0.1.zip
* [書き込みツール](https://github.com/LynnL4/ambd_flash_tool) ... Code->Download ZIPでも良いし、gitに慣れている人はgit cloneでも良いです
* [CPUに書いておくファームウェア](http://files.seeedstudio.com/wiki/Wio-Terminal/res/rtl8720_update_v2.uf2) ... .UF2ファイル

# 解凍

RTL8720ファームウェア（と書き込みツール）はZIP圧縮されているので、適当なフォルダに解凍してください。

# メインCPUにファームウェアを書き込む

書き込みツールがRTL8270と通信できるよう、通信を中継するファームウェアをメインCPUに書いておく必要があります。
Wio Terminalをブートローダーモードに切り替えて、PCに表示されたArduinoドライブにCPUに書いておくファームウェア（.UF2ファイル）をコピーしてください。

1. Wio Terminalをすばやく2回リセット操作してブートローダーモードにしてください。
2. 正しくブートローダーモードになると、PCにArduinoという名称のドライブが現れます。
3. ArduinoドライブにCPUに書いておくファームウェア（.UF2ファイル）をコピーしてください。
4. 正常にコピーされると、Wio Terminalが自動的に再起動して、液晶に「Burn RTL8720 fw」と表示されます。

# RTL8720のフラッシュメモリを消去

`ambd_flash_tool.exe erase`コマンドでRTL8720のフラッシュメモリを消去してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/42423756-fc38-a7a2-14d9-d63d065f769b.png)

# RTL8720のフラッシュメモリへRTL8720ファームウェアを書き込む

`ambd_flash_tool.exe flash`コマンドでRTL8720ファームウェアを書き込んでください。`-d`オプションでRTL8720ファームウェアのフォルダ指定を忘れずに。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/c9817408-9132-bdbc-8b42-dca5ebc956f0.png)

# 参考資料

* [Wio Terminal Network Overview@英語](https://wiki.seeedstudio.com/Wio-Terminal-Network-Overview/)
Power BI入門1(データ取り込み編)

<h1>Power BIデータ取り込み編

Power BIを始める方に入門記事を書いていきたいと思います。
PowerBI Desktopを使用します。まず、一番最初にすることは、データを読み込みます。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629294/2f10c8c3-0ddc-d201-ff3b-099c38e44fcf.png)
赤い丸のところから、データをPowerBI Desktop内に取り込むが出来ます。

![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629294/f11070e6-8eef-fb4b-3f92-f78eeba63472.png)
データソースのところから、該当するデータの種類を選択します。今回は、Excelのデータを使いたいと思います。

![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629294/1be88215-cd3d-4b18-f656-532dae8886a2.png)
Excelのデータを選択すると、ナビゲータが出てます。赤い丸(テーブル形式)のほうを選択します。
![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629294/1835e3c3-d59f-57fe-bdf3-198b877eeb7f.png)
選択すると、データソースのテーブルが出てきます。読み込むボタンを押すと、PowerQueryEditerを経由せずにデータを取り込みます。今回は、データの変換ボタンからPowerQueryEditer経由で読み込みたいと思います。

<h1>PowerQueryEditer

![キャプチャ5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629294/94eddad7-9874-ddc7-d7c6-bc309261255c.png)

PowerQueryEditerはこのような画面になっています。

まず、一番最初にしてほしいことはデータの型が正確であるか見ることです。
![キャプチャ6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629294/fa6c579b-d452-e0c7-505f-8f8720331945.png)
ちなみに、PowerQueryEditerではCtrl+Zで戻ることはできないので、右側にある適用したステップの×を戻りたいところまで押しましょう。

![キャプチャ7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629294/0daf0dee-a985-c8d4-11b0-d1e94e03f508.png)
今回はデータの加工が出来たことにします。閉じて適用することで。レポートビューに適用し、戻れます。

レポートビューに戻ると、データが反映されていることがわかります。
![キャプチャ8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629294/ceed2100-7746-4e13-e829-c6b22733cccb.png)

PowerBIデータ取り込み編は以上です。お疲れ様でした。
z-indexが効かない！？　それ、スタックコンテキストのせいかも

# はじめに
要素を重ねる時、z-indexの数字だけ意識していませんか？
スタックコンテキストを意識していないとz-indexの値をいくら大きくしても要素が思い通りに前面に来ない！という事があります。
今回は、そのスタックコンテキストを取り扱っていきます！

# スタックコンテキストとは
positionプロパティの値がstatic以外で、z-indexプロパティの値がauto以外の場合に生成される文脈　だそうです。
うーん、わかりづらい！笑

# 実践
とりあえずベースとなるHTMLとCSSを作成
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="nabeshi" data-slug-hash="JjKaYqG" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="stack-context1">
  <span>See the Pen <a href="https://codepen.io/nabeshi/pen/JjKaYqG">
  stack-context1</a> by Daichi Nabeshima (<a href="https://codepen.io/nabeshi">@nabeshi</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

次に`.red`, `.blue`, `.green`にz-indexを付与する。
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="nabeshi" data-slug-hash="eYzLpWQ" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="stack-context1">
  <span>See the Pen <a href="https://codepen.io/nabeshi/pen/eYzLpWQ">
  stack-context1</a> by Daichi Nabeshima (<a href="https://codepen.io/nabeshi">@nabeshi</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
z-indexが-100なのに最前面に来ているだと。。。
<br>
ここでもう一度スタックコンテキストの定義を思い出してみましょう。
>positionプロパティの値がstatic以外で、z-indexプロパティの値がauto以外の場合に生成される文脈

`.red`, `.blue`, `.green`はこの条件をクリアしているのでスタックコンテキストを生成している状態になります!

html要素はデフォルトでルートスタッックコンテキストを生成しています。
また、スタックコンテキストは必ずどこかのスタックコンテキストに所属します。

`.red`と`.blue`はルートスタックコンテキストに所属し、`.green`は`.blue`のスタックコンテキストに所属します。

z-indexは所属するスタックコンテキスト内での順番を指定するプロパティなので、-100の値を設定しても所属するコンテキストが異なるため順番に変動がなかったということになります。

# まとめ
1. positionプロパティの値が`static`以外のかつ、z-indexプロパティの値が`auto`以外の要素がスタックコンテキストを生成する
2. html要素は上記の条件に該当せず、必ずルートスタックテキストとなる
3. スタックコンテキストは必ずどこかのスタックコンテキストに所属する
4. <font color='Red'>z-indexは所属するスタックコンテキスト内での順番を指定するプロパティ</font>
バッチファイルで指定日時まで待つ

バッチファイルで PowerShell を使って指定時間まで待つ。
スケジューラ登録するほどでもない、管理者権限がない ときに。
(Windows10, Window7 等)
(コマンドプロンプト スクリプト sleep wait DOS)

sleep_until.bat


```dosbatch

@echo off

for /f "usebackq delims=," %%a in (`powershell "(get-date -hour 22 -minute 0 -second 0).adddays((6 - (get-date).dayofweek.value__)).tostring('yyyy/M/d H:m:s')"`) do set tm=%%a
echo 今度の土曜日２２時： %tm%

for /f "usebackq delims=," %%a in (`powershell "(get-date -hour 22 -minute 0 -second 0).adddays((7 - (get-date).dayofweek.value__)).tostring('yyyy/M/d H:m:s')"`) do set tm=%%a
echo 今度の日曜日２２時： %tm%

for /f "usebackq delims=," %%a in (`powershell "(get-date -day 1 -hour 22 -minute 0 -second 0).addmonths(1).adddays(-1).tostring('yyyy/M/d H:m:s')"`) do set tm=%%a
echo 今月末日の２２時  ： %tm%

for /f "usebackq delims=," %%a in (`powershell "(get-date -day 1 -hour 0 -minute 0 -second 0).addmonths(1).tostring('yyyy/M/d H:m:s')"`) do set tm=%%a
echo 来月１日の０時０分： %tm%

echo.
for /f "usebackq delims=," %%a in (`powershell "(get-date).addminutes(1).tostring('yyyy/M/d H:m:s')"`) do set tm=%%a
echo １分後            ： %tm%
echo.
echo %date% %time%
rem tm 時間まで待つ
powershell "$w = [DateTime]'%tm%' ; if ((get-date) -lt $w) {  $w = new-timespan -start (get-date) -end $w ; Start-Sleep -seconds $w.totalseconds ; $ws = New-Object -com Wscript.Shell}"
echo %date% %time%
echo.
pause

goto :eof


```

実行例


```
C:\> sleep_until.bat
今度の土曜日２２時： 2020/11/7 22:0:0
今度の日曜日２２時： 2020/11/8 22:0:0
今月末日の２２時  ： 2020/11/30 22:0:0
来月１日の０時０分： 2020/12/1 0:0:0

１分後           ： 2020/11/6 20:45:7

2020/11/06 20:44:07.04
2020/11/06 20:45:07.34

続行するには何かキーを押してください . . .

```
Indeedなう（予選B）D- 高橋くんと数列 公式解説と違う解法

# 問題概要
[Indeedなう（予選B）D - 高橋くんと数列](https://atcoder.jp/contests/indeednow-qualb/tasks/indeednow_2015_qualb_4)
$1$以上$C$以下の整数$k$について、$k$が含まれる部分列の個数をそれぞれ求める

# 公式解説概要
全ての部分列の個数から、$k$を含まない部分列の個数を引く

# 自分の解法
$1$以上$N$以下の$i$について、$A_i$を含んだ部分列の内、$A_i$より前にある同じ整数を含まない部分列の個数を数える(後ろに同じ整数があった場合、含んでも良い)。
$1$以上$C$以下の整数について、最後にそれが表れた場所を記録することで、公式解説と同じ$O(N+C)$で解ける。

# 自分の解答
~~~python
N, C = map(int, input().split())
A = list(map(int, input().split()))

ans = [0]*C
pr = [-1]*C

for i in range(N):
    a = A[i]-1
    ans[a] += (i-pr[a]) * (N-i)
    pr[a] = i

for a in ans:
    print(a)
~~~

# 雑な図解
### 入力例1
線の長さが部分列の範囲、色がどの整数を含んだ部分列か(赤は$1$、青は$2$)を表しています。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671645/03f46784-ce11-af3a-5ce9-b451ed51c786.png)

# 感想
大きい値を求めるのがなんとなく嫌なのでこっちの方が好き
【初心者でもわかる】CSSで任意の位置で写真を丸く切り抜く方法。

#どうも7noteです。四角の写真をCSSで丸く切り抜く方法。

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/circle-cutout/
kubernetesの監視ツールについて調べてみた

## この記事について
kubernetesの監視に使えそうなツールついて簡単に紹介します。
デプロイ手順や仕組みは詳しく書きません。
「こんなものがあるんだよ」位の感じで書きます。

## リソース監視系

### Prometheus
https://github.com/prometheus

* クラウドのOSS監視ツールでは真っ先に名前が挙がるツール
* expoterが各システムからデータを収集する(node-expoter等)
* Prometheus上でクエリを入力すると値の取得が可能

PrometheusのHA構成を可能にするツールについては、別途記事を作成しておりますので、そちらをご参照ください。

* [Cortex](https://qiita.com/Hiroki1928/items/5c8642987b5f45a1f5e0)
* [VictoriaMetrics](https://qiita.com/Hiroki1928/items/7e9945ee003331445b5b)

### cAdvisor

https://github.com/google/cadvisor

* Googleが作成したDockerコンテナモニタリングツール
* Prometheusとも連携可能

## ログ収集系

### Fluentd

https://www.fluentd.org/

* ログ収集ツール
* td-agentと呼ばれるエージェントで各システムからログを収集
* elasticsearch/kibanaと連携することが多い

### Grafana Loki

https://github.com/grafana/loki

* like Prometheus, but for logs.
* 名前の通りGrafanaでの可視化が容易


## Web UI系

### Grafana

https://github.com/grafana/grafana

* データ・ログの可視化ツール
* ダッシュボード作成の自由度が高い
* グラフィックがきれいなことで有名

### Fluentd-ui

https://github.com/fluent/fluentd-ui

* fluetndの起動・停止や設定ファイルの変更がGUIで可能

### kibana

https://www.elastic.co/jp/kibana

* ログ可視化ツール
* elasticsearchとの連携が優秀
* (結構GUI操作が難しい…)

### Graylog

https://www.graylog.org/

* ログ管理プラットフォーム
* ユーザーごとに権限を付与できるkibanaのイメージ

## DB系

### elasticsearch

https://www.elastic.co/jp/elasticsearch

* 全文検索エンジン
* fluentdで収集したログを格納する等で使用する
* 安定して人気がある
  * https://db-engines.com/en/system/Elasticsearch%3BInfluxDB

### influxDB

https://www.influxdata.com/

* influxdata社の時系列データベース
* 時系列データベースとして比べるならばelasticsearchよりベンチマークが良い(らしい…)
  * https://www.influxdata.com/blog/influxdb-markedly-elasticsearch-in-time-series-data-metrics-benchmark/
自然言語処理で遊んでみた

技術書典で購入した書籍を基に自然言語処理を試してみました。

# 実行環境
Google Colaboratory

# 実行準備
準備として、MeCabとosetiをインストールします

```
# MeCabのインストール
!apt install mecab python-mecab mecab-ipadic-utf8
!apt install mecab-jumandic-utf8 libmecab-dev file curl
!pip install mecab-python3==0.7
```

色々検証してみた結果、MeCabのバージョンを`0.7`に指定しないと、後にインストールするosetiの実行でエラーになるようです

```
# osetiのインストール
!pip install oseti
```

# 形態素解析
MeCabで形態素解析を実行するとこのようになります。

```
import MeCab
text = "本日は晴天なり"

# MeCab.Taggerオブジェクトの作成
objMeCabTagger = MeCab.Tagger()

# 形態素解析された結果の出力
print(objMeCabTagger.parse(text))
```

```
本日	名詞,副詞可能,*,*,*,*,本日,ホンジツ,ホンジツ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
晴天	名詞,一般,*,*,*,*,晴天,セイテン,セイテン
なり	助動詞,*,*,*,文語・ナリ,基本形,なり,ナリ,ナリ
EOS
```

## 辞書変更
デフォルトの辞書では、固有名詞を判別していませんが、Neologdでは判別しています。  

```
# Neologdのインストール
!git clone https://github.com/neologd/mecab-ipadic-neologd.git
!echo yes | mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n
```

この例では`志村動物園`を固有名詞として判別しています。

```
text = "天才！志村動物園"

# MeCab標準辞書での形態素解析
objMeCabTagger = MeCab.Tagger()
print(objMeCabTagger.parse(text))

# Neologdを使った形態素解析
objMeCabTagger = MeCab.Tagger("-d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd")
print(objMeCabTagger.parse(text))
```

```
天才	名詞,一般,*,*,*,*,天才,テンサイ,テンサイ
！	記号,一般,*,*,*,*,！,！,！
志村	名詞,固有名詞,人名,姓,*,*,志村,シムラ,シムラ
動物	名詞,一般,*,*,*,*,動物,ドウブツ,ドーブツ
園	名詞,接尾,一般,*,*,*,園,エン,エン
EOS

天才	名詞,一般,*,*,*,*,天才,テンサイ,テンサイ
！	記号,一般,*,*,*,*,！,！,！
志村動物園	名詞,固有名詞,一般,*,*,*,志村動物園,シムラドウブツエン,シムラドウブツエン
EOS
```

jumanではカテゴリーもされるそうです。

```
text = "マイホームを買いに行く"

objMeCabTagger = MeCab.Tagger("-d /var/lib/mecab/dic/juman-utf8")
print(objMeCabTagger.parse(text))
```
```
マイホーム	名詞,普通名詞,*,*,マイホーム,まいほーむ,代表表記:マイホーム/まいほーむ カテゴリ:場所-施設 ドメイン:家庭・暮らし
を	助詞,格助詞,*,*,を,を,連語
買い	動詞,*,子音動詞ワ行,基本連用形,買う,かい,代表表記:買う/かう ドメイン:家庭・暮らし;ビジネス 反義:動詞:売る/うる
に	助詞,格助詞,*,*,に,に,連語
行く	動詞,*,子音動詞カ行促音便形,基本形,行く,いく,代表表記:行く/いく 付属動詞候補（タ系） ドメイン:交通 反義:動詞:帰る/かえる
EOS
```

# ネガポジ判定
osetiでは単語のポジティブ/ネガティブを判定してくれます。
天国はポジティブ、地獄はネガティブで判定しています。


```
import oseti
analyzer= oseti.Analyzer()
print(analyzer.analyze('天国'))
print(analyzer.analyze('地獄'))
```

```
[1.0]
[-1.0]
```

## 文章のネガポジ判定
参考書籍を基に青空文庫から蜘蛛の糸(芥川龍之介)をネガポジ判定を行うとこのようになりました。
ネガティブな要素が多いようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/da28e6d3-fe62-b61f-deb5-fe3a02574d04.png)



# 参考書籍
https://techbookfest.org/product/4801054537416704?productVariantID=5611107305652224
AWS環境にGoogle Driveをマウントしてみた話

# 環境
- Deep Learning AMI (Ubuntu 18.04) Version 35.0
- g4dn.xlarge

# google-drive-ocamlfuseインストール
[Github](https://github.com/astrada/google-drive-ocamlfuse)にしたがってインストールします

```
sudo add-apt-repository ppa:alessandro-strada/ppa
sudo apt-get update
sudo apt-get install google-drive-ocamlfuse
```

マウントポイントを作成します

```
/home/user/MOUNT_POINT
```

# 認証の準備
これでgoogle-drive-ocamlfuseが実行できるのですが、GUIによる認証を求められてしまいます
ここでは工夫して、CUI環境で認証できるようにします

http://moguno.hatenablog.jp/entry/2016/03/24/010502
で紹介されている方法を試してみました

firefoxスクリプトを作成して、ブラウザ(firefox)を開いているかのように偽造します

```
$ pwd
/home/ubuntu/bin

$ vi firefox
#! /bin/sh

echo $* > /dev/stderr
```

パスを通しておきます

```
$ export PATH=$PATH:/home/ubuntu/bin
```

# 認証
google-drive-ocamlfuseを実行するとURL(`https://accounts.google.com/o/oauth2/auth?....`)が表示されます。
CUIの画面はこの画面のままにしておき、Windows等のブラウザでURLを開いて認証します。

```
google-drive-ocamlfuse /home/user/MOUNT_POINT

/bin/sh: 1: xdg-open: not found
https://accounts.google.com/o/oauth2/auth?....
```

MOUNT_POINTにGoogle Driveがマウントされます。
shell で大量のファイルに対して集計処理を行う

例えば大量のファイルから `foo_*` が 5 回以上登場する行の id を抽出し、id ごとの行数を算出する。

ファイル例

```txt
id=>aaa, "foo_24"
id=>bbb, "foo_4", "foo_pp", "aaaaaa", "foo_343"
```

## 愚直版
愚直に逐次実行。
ファイル数やサイズが小さければこれで十分。

```sh
#!/bin/sh

files=$(find . -type f)

# 抽出
regex='(.*((foo_).*){5,}.*)'
tmp_file='tmp_result.txt'
for file in files; do
  cat $file \
  | grep -E $regex \
  | awk -F "=>" '{print $2}' \
  | awk -F "," '{print $1}' \
  >> $tmp_file
done

# 集計
result_file="result.txt"
cat $tmp_file \
| awk '{count[$0]++}END{for(k in count)print k, count[k]}' \
| sort -r -t ' ' -k 2 -n \
>> $result_file

# tmp ファイルの掃除
rm $tmp_file
```

## parallel 版
ファイル数やサイズがでかい場合は CPU をフルに使って頑張りたいのでこっち。

```sh
#!/bin/sh

files=$(find . -type f)

# 抽出。ここがボトルネックであり、並列化して頑張りたいところなので頑張る。
regex='(.*((foo_).*){5,}.*)'
tmp_file_name_prefix='tmp_extract_result'
parallel_num=50 # NOTE: マシンの CPU 負荷考慮して調整すること
k=0
for file in files; do
  k=$(( k % parallel_num ))
  (( k ++ ))
  if [[ $k -eq 0 ]]; then
      wait
  fi
  cat $file \
  | grep -E $regex \
  | awk -F "=>" '{print $2}' \
  | awk -F "," '{print $1}' \
  >> "${tmp_file_name_prefix}_$k.txt" &
done

# 集約
tmp_aggregation_file="tmp_aggregation.txt"
tmp_result_files=$(find . -name "${tmp_file_name_prefix}_*")
for tmp_result_file in $tmp_result_files; do
    cat $tmp_result_file >> $tmp_aggregation_file
done

# 集計
result_file="result.txt"
cat $tmp_aggregation_file \
| awk '{count[$0]++}END{for(k in count)print k, count[k]}' \
| sort -r -t ' ' -k 2 -n \
>> $result_file

# tmp ファイルの掃除
rm ${tmp_file_name_prefix}_*
rm $tmp_aggregation_file
```
Ajaxとは

#Ajaxとは
Ajax（Asynchronous JavaScript　+　XML）とは、ウェブブラウザ上で非同期通信を行いながらインターフェイスの構築を行うプログラミング手法。HTML/Javascriptとだけで実装できるようにしてくれるもの。
Javascriptを使用して、サーバーにリクエストし返ってきたレスポンスをHTMLに変更を加える形で画面表示してくれる。
つまり、ページをリロードせずにWEB画面の表示を簡単に変えられるやつ！

##同期通信と非同期通信の違い
ユーザーとサーバーのやりとりで説明します。
①ユーザーからリクエストを送る
②リクエストをサーバーが受け取る
③レスポンス（主にHTML）をユーザーに返す。
④結果をページ全体に反映
というような形でサーバーとの通信を行うたびにページ全体をリフレッシュしてしまうので、ユーザーはサーバーの処理の終了を待つ必要があります。
しかし、Ajaxは非同期通信なので
①ユーザーからリクエストを送る
②リクエストをサーバーが受け取る
③レスポンス（HTML/XML/JSON）をユーザーに返す。
④必要な箇所・領域のみ書き換える
ことができます。ユーザーである、ブラウザが直接サーバーとやりとりするわけでなく、Ajaxを使用してユーザーと通信しブラウザ内だけで処理が可能になるため、必要な部分のみ書き換えることが出来るみたいです。
※図で説明されてる先人がいらっしゃるのでそちらを見るとより理解出来ると思います。
connpassのメールがうるさいので一括で通知設定を選択できるようにした

勉強会に参加したことのある方ならご存知のconnpass。
いろんなイベントに参加することができて非常に便利です。

が、最近あまりにメールが多い。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322882/f48f5c10-02a6-119a-66e3-bbabfa4dbee6.png)
> 今後connpass.comからこのようなメールを受け取りたくない場合は、利用設定から配信停止することができます。

ということなので、**利用設定**からメール通知設定画面に飛んだところ……

え、これ手動でチェック外すの……？？？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322882/e24db8ea-38f8-c2d5-85e1-a5bfd43bdf91.png)


<h3>僕は嫌だ！！！</h3>

ということで、JSでconnpassのメール通知設定用の関数を書きました。

## コード

```js
function mailSelect(type, isCheck) {
  switch (type) {
    case "all":
      window.document.querySelectorAll("input[name^='group_notify_group_email-']").forEach(selectBox =>
        selectBox.checked = isCheck
      )
      break
    case "kokai":
      window.document.querySelectorAll("input[name$='-event_publish_to_series_watcher']").forEach(selectBox =>
        selectBox.checked = isCheck
      )
      break
    case "bosyu":
      window.document.querySelectorAll("input[name$='-event_open_start_to_group_member']").forEach(selectBox =>
        selectBox.checked = isCheck
      )
      break
    case "shiryo":
      window.document.querySelectorAll("input[name$='-new_event_links_to_group_member']").forEach(selectBox =>
        selectBox.checked = isCheck
      )
      break
  }
}
```


## 使い方

1. https://connpass.com/settings/ を開く
1. 検証ツールを開きます。
1. Consoleを開きます。
1. 上記のコードをコピペします。
1. コマンドを打ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322882/184f8d52-8c1c-7e05-2e93-2eade1fcf02c.png)


```js
mailSelect("all", false)
mailSelect("kokai", false)
mailSelect("bosyu", true)
mailSelect("shiryo", false)
```

こんな感じで使えます。
メールを送るな！という人は`mailSelect("all", false)`でおｋ。


## ブックマークレットにしてみた

ブックマークレットは即時関数なので、決め打ちです。

[ブックマークレット作成](https://crocro.com/tools/item/gen_bookmarklet.html)で簡単にブックマークレットの形式に変換できます。

```js:mailSelect("all",false)
javascript:(function(){window.document.querySelectorAll("input[name^='group_notify_group_email-']").forEach(selectBox=>selectBox.checked=false)})();void(0);
```

connpassの設定ページを開いた状態で、↑をアドレスバーにコピペします（コピペすると`javascript:`が消えるので手打ちする）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322882/703e80c7-25ca-5bb8-9a55-f69b343aa332.png)

そしてエンター、以上！！


## 知ったこと

`getElementsByName`では完全一致しか取得できないんですね。
`querySelector`を使うと、前方一致や後方一致のようなことができるようです。

[DOMをセレクトするときに正規表現的な文法をつかう \- みかづきブログ その3](https://kimizuka.hatenablog.com/entry/2015/07/27/000000)
[Document\.querySelectorAll\(\) \- Web API \| MDN](https://developer.mozilla.org/ja/docs/Web/API/Document/querySelectorAll)
Proxy Pattern

#Proxy
<font color="#00f">Proxyクラスに特定のクラスのタスクを代行させる
Proxyクラスで処理できないタスクは特定クラスに委譲するというメソッドを持たせる
<b>特定クラスのインスタンスは、特定クラスにタスクを委譲するまで生成しない</b></font>

このページでは下記を記載します
・Proxy Pattern の構造確認
・実装

[Design Pattarm MENU](https://qiita.com/old_cat/items/852d980bedb9100dd7e3)
##Proxy Pattern の構造確認
以下のクラス構成で確認します

|クラス|説明|
|------|----|
|sam.class|Proxyが代行するクラス|
|samProxy.class|sam.classのタスクを代行する|


```java:sam.class
class sam{
  void sm1(){}
  void sm2(){}}
```
```java:samProxy.class
class samProxy{
  sam  sam;
  void sm1(){}
  void sm2(){sam.sm2();}  //samクラスにタスクを委譲します。この直前でsamインスタンスを生成
}
```

##実装
interfaceにあるsm1()はsamProxyクラスで処理できるタスク
interfaceにあるsm2()はsamProxyクラスでは処理できないタスク
とします

```java:s.interface
interface s{
  void sm1();
  void sm2();
}
```
```java:sam.class
class sam implements s{
  public void sm1(){System.out.println("sam1");}
  public void sm2(){System.out.println("sam2");}
}
```
```java:samProxy.class
class samProxy implements s{
  sam  sam;
  public void sm1(){System.out.println("proxy1");}
  public void sm2(){        // samProxyで処理できないタスクをsamに委譲する、というメソッド
         if(sam == null){   // samインスタンスが必要となった時に、samインスタンスを生成する
            sam =  new sam();
            sam.sm2();}
}}
```
```java:user(Main.class)
public static void main(String[] args){
  s s = new samProxy();
  s.sm2();
}}
```
GCS からフォルダ構造を保ったままダウンロードする


## `gsutil rsync` を使う
例えば、`gs://aiueo/{01~10の数字}/**/foo.bar*` を全て落としてくる。

```sh
#!/bin/sh

gcloud config set project xxx

dest='dest'
mkdir -p $dest

file_regex='^(?!.*foo\.bar*)' # 参考: https://github.com/GoogleCloudPlatform/gsutil/issues/465

for k in `seq -w 1 10` ; do
    # rsync ではワイルカードが使えないので script で愚直に埋めていく
    gsutil -m rsync -r -x $file_regex "gs://aiueo/$k/" "$dest/"
done 
```

## ちなみに
構造を保ったままダウンロードすると、異なるフォルダに同名ファイルが存在していても無事にダウンロードができるというメリットがある。
素直に `gsutil cp /foo/bar/**/hoge/` みたいにすると、平坦に配置されるため、同名ファイルがあると適切にダウンロードできない。
Rasipbery Pi 3 Model Bの構築

#家に余っていたRaspberry Pi 3を今更ながらOSをインストールしたのでメモ
##用意したもの
- Raspberry Pi 3 Model B 本体
- SDカード
- USB wifi ドングル（プラネックス製 GW-USBano2）
- SDカードリーダーやOS書き込みする用のPC

##OSのインストール
前はNOOBSなどを使ってインストールしていましたが、今はRaspberry Pi Imagerなる公式ツールを使うことで簡単にSDカードにイメージを書き込めるようになっている。
下記公式サイトよりRaspberry Pi ImagerをDLする。
https://www.raspberrypi.org/downloads/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236501/b44b6cff-2448-a6a3-63ef-b5e1b532b2fb.png)

Raspberry Pi ImagerをPCにインストールし起動すると、あとは使用するOSと書き込むSDカードを指定してWRITEするだけ。
とにかく簡単。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236501/56a7850c-e0d5-e028-6ff1-59861c2a7c96.png)

イメージもWRITEしたときにツールがDLしてくれるので少し時間がかかるけど、とりあえず待つだけで完了。
あとはRaspberry PiにSDカードを指して電源をつけるだけで使用可能に。

さらに驚いたのは、USB wifi ドングルを使うときは、ドライバ探して～や、wpa_supplicant.conf の編集～などが不要になっていた。

Raspberry Pi OS起動後に初期設定チュートリアルが開始され、自動でドングルが認識されており、近くのwifiのSSIDから接続先を選びパスワードを入力するだけになっていた。
すべてのドングルが対応しているわけではないかもしれないけど、プラネックスのGW-USBano2ではそのまま利用できた。

インストール後に、apt-get upgradeをするとエラーになり現時点で解決できなかったため、apt-get upgradeはせずに利用している。。。

とりあえず、めでたしめでたし（？）
3DOFと6DOF


#DOFの概念
VRのDoFという概念聞いた事ありますか？（私もつい最近知ったばかりです…）
なので、今回は「DOF」の意味を説明しますね。

DoFはDegree of Freedomの略称で、「自由度」の意味です。
なので、「VRのDoF」は「VRの自由度」という意味になります。
具体的に説明すると、「VR感知できる動きの方向数を意味」になります。
#3DOFと6DOFの違い
##3DOF
![image_2020_09_10T11_08_59_908Z.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541380/e8b292b6-1c1e-716e-0056-3dea2b188f34.png)
頭の回転や傾きを感知できます。
要するに、X・Y・Z軸周りの3つの動きを対応することができます。

要するに、頭回っても、見える画像は頭の角度を合わる事です。

が、対応しているのは頭の周りのみになります、
要するに、使用者は前後など、直接移動した時は対応しておりません、
ゲーム時キャラクタ移動したい場合は、コントローラーなどを使う必要があります。
##6DOF
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541380/b10b52c0-812b-5882-c640-a0e078ecbc5f.png)
頭の上下左右前後の動きを感知できます。
6DOFは3DOFのX・Y・Z軸の基礎の上に、更に移動方向を感じできるようになってます。
6つの動きを対応できるので、6DOFです。

この機能により、
VR端末に表示された画像と現実世界での動きを連動させることが可能になります。

実際に自分の体を動かしたら、VR空間内の視野上も、歩いているようになります。
より現実に近い没入感を体現できます。

では。
putsメソッド

#putsメソッド
**Rubyに用意された、ターミナルに値を出力するメソッドです。**
putsに続けて値を記述すると、その値をターミナルに出力します。

```java:【例】putsメソッド
name = "Taro"

# ターミナルに出力する
puts name
```

```java:【例】ターミナル
# nameの値が出力される
=> "Taro"
```

#rubyファイルを以下のように編集して下さい。
それでは、実際にコードを書きましょう。
rubyファイルを以下のように編集します。

```java:rubyファイル
input = "こんにちは"

puts "入力した値は#{input}です"
```

#まとめ

**putsメソッドとは、ターミナルに値を出力するメソッド。**

#####以上。
CloudWatch初心者の学習備忘録

# はじめに
プロジェクトでログの調査を行った時に、CloudWatchを利用したわけですが、とにかくに用語や機能が訳わからん状態だったので、しっかりと学び記事として書いていくことにしました。

## 用語
**・ ログイベント**
　イベント発生時のタイムスタンプおよび生のイベントメッセージ
**・ ログストリーム**
　同じソースを共有する一連のログイベントをまとめたもの
**・ ロググループ**
　ログストリームのグループ
　そのため、各ログストリームは、1つのロググループに属している必要がある　
**・ メトリクス**
あるデータを収集し、計算や分析を加えてわかりやすいデータ（数値）に変換したもの

[AWS公式](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#CloudWatchPeriods)
>メトリクスは CloudWatch での基本的な概念です。メトリクスは、CloudWatch に発行された時系列のデータポイントのセットを表します。メトリクスは監視対象の変数、データポイントは時間の経過に伴うその変数の値と考えることができます。たとえば、特定の EC2 インスタンスの CPU 使用率は、Amazon EC2 により提供される 1 つのメトリクスです

**・ メトリクスフィルタ**
メトリクスフィルタは２つの機能を持ちます
1. ログイベントをメトリクスに加工する機能
2. メトリクスをフィルタして別のメトリクスに加工する機能

**・ アラーム**
指定した期間のメトリクスの数値を監視し、設定した閾値を基準に1つ以上のアクションを実行する機能

**・ 保持設定**
CloudWatchにログイベントを保持する期間を指定するために使用

## 理解したイメージ図
![cloudwatch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/dd83f443-0ab0-3733-e873-0794acc73600.png)



# おわり
監視は大事なので、CloudWatchの知識だけではなく、[監視]そのものについての知識を付けていく必要を感じました。
そういえば、家に監視の本あったような気がする。。
積読してますね。w
[入門 監視](https://www.amazon.co.jp/%E5%85%A5%E9%96%80-%E7%9B%A3%E8%A6%96-%E2%80%95%E3%83%A2%E3%83%80%E3%83%B3%E3%81%AA%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-Mike-Julian/dp/4873118646/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E5%85%A5%E9%96%80+%E7%9B%A3%E8%A6%96&qid=1557287805&s=gateway&sr=8-1)
麻雀のシャンテン数を求める

2020/11/09 追記

以下の場合に、失敗する。。

11112222456789
「111」「222」「456」「789」「12」
1,2どちらを切っても「３」待ちになる。
（０シャンテン）

22223333789東東東
「222」「333」「789」「東東東」「23」
2,3,東のどれを切っても「1」,「4」待ちになる。
（０シャンテン）

これは特別ルール（２）で正しいシャンテン数とならない。　（11/10再　<- 嘘。。正しいシャンテン数となる。少し冷静になろう。。）


--------


シャンテン数を求めるプログラムを作成する際に、つまづいたところが合ったので備忘録として。

シャンテン数は８点ルールというものをベースに求めました。

（参考）
「Mリーグ成績速報（非公式）」さま
手牌の向聴（シャンテン）数の数え方
https://note.com/mleague_results/n/nfe3e0e8774db

メンツを２点、対子、ターツを１点として抜き出し、（８ー合計の点数）＝シャンテン数とするものです。（0がテンパイ、-1が上がりとなる）

こちらのルールだけだと簡単なのですが、以下の特別な対応が必要になります。
◆８点ルールの特別ルール
（１）抜き出せるブロックは最大５つまで。抜き出す優先順位は面子→対子→ターツ　の順番
（２）５ブロックちょうどを抜き出して雀頭がない場合は１点減点

面倒なのが、（２）のケースです。
以下の手牌とツモ牌があった場合について考えます。

【東東東東１１１１４５６７８】　ツモ：９
（メンツに分解したもの「東東東」「１１１」「４５６」「７８９」「東」「１」）

８点ルールにしたがって考えると、メンツ４個と孤立牌２個で８点となり、０シャンテン＝テンパイとなります。
しかしながら、「東」「１」どちらを切っても待ち牌になる「１」「東」は自身で４枚使い切っているため、テンパイとなりません。この場合は１シャンテンが正解です。
（※４枚使い切っている牌での待ちをテンパイ形とみなすルールもあるらしいです）

ちなみにツモ牌がない場合
【東東東東１１１１４５６７８】
（メンツとターツに分解したもの「東東東」「１１１」「４５６」「７８」「東」「１」）

この場合も８点ルールにしたがって考えると、メンツ３個とターツ１個で７点となり１シャンテンとなりますが、実際には２シャンテンです。

この５枚目の待ち問題に対応するために、次の特別ルールを加えました。

（３）対子（雀頭）がないが（２）が適用されない場合、メンツ、対子、ターツを抜き出したあとの孤立牌の数を数える（r枚）。この孤立牌が元々４枚持っていた牌と一致する数を数える（k枚）。(r=k)のとき１点減点

（２）が元々、雀頭不足に対するものですが、さらに拡張した感じです。
Chromeの「戻る」ボタンクリック（ブラウザバック）で戻ったときに、ラジオボタンが戻る前の選択になっている現象が起きたけど、autocomplate="off"で解消した

本来ラジオボタンはautocompleteの対象じゃないんですが
https://developer.mozilla.org/ja/docs/Web/HTML/Attributes/autocomplete
ラジオボタンの場合は本来の意味と別に、今回のブラウザバック対応として設定していい値っぽいですね。
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/radio
https://stackoverflow.com/questions/5985839/bug-with-firefox-disabled-attribute-of-input-not-resetting-when-refreshing
上記リンクにはFirefoxで今回の事例が起きていたと書いてあったんですが、Firefoxで起きずChromeで起きたので、時代が変わったのかもしれません。

Safariだとラジオボタンの選択状態が外れたので、Safari以外で`autocomplete="off"`を入れるようにします。


|  | `autocomplate="off"`未設定時 | `autocomplate="off"`設定時 |
| --- | --- | --- |
| GoogleChrome(v86) | × 戻る前の選択維持 | ◯ 戻ったページの選択通り |
| Firefox(v81) | ◯ 戻ったページの選択通り | ◯ 戻ったページの選択通り |
| Safari(v13) | × 戻る前の選択維持 | × 選択状態が解除されている |
| Edge(v86) | ◯ 戻ったページの選択通り | ◯ 戻ったページの選択通り |
| InternetExplorer(v11) | ◯ 戻ったページの選択通り | ◯ 戻ったページの選択通り |
【Rails】フォローしているユーザーの投稿をすべて取得する方法

#### 環境
- *ユーザー認証に`gem`の`devise`を使用。*
- *モデル間同志のアソシエーション済み。*  
→ 設計方法は[こちら](https://qiita.com/kazukimatsumoto/items/14bdff681ec5ddac26d1)と同じ。

## 方法
フォローしているユーザーの全ての投稿を取得する方法

```ruby:該当のcontroller
#フォローしているユーザーの投稿

@posts = Post.where(user_id: [*current_user.following_ids])
```

フォローしているユーザーと自分も含めた全ての投稿を取得する方法

```ruby:該当のcontroller
#フォローしているユーザーと自分の投稿

@posts = Post.where(user_id: [current_user.id, *current_user.following_ids])
```


### 説明
- `following_ids`  
→ モデル間でアソシエーションが完了していると`Rails`が自動生成してくれるメソッド
AWSのEC2インスタンスへGitHubのリポジトリをクローンするための連携方法

# はじめに
AWSはAmazon Web Servisesの略で、Amazonが提供しているクラウドサーバーのサービスです。
AWSへの理解度を高めるために、学んだことをアウトプットします。


# 今回の流れ
AWSのEC2インスタンスの公開鍵をGitHubに登録します。

インスタンスは作成していることを前提とします。
※インスタンスの作り方が分からない方はこちらを参照ください。
「AWSに仮想サーバーを構築する方法」https://qiita.com/daisuke30x/items/91307c94e8f5a702a42f

# EC2インスタンスの公開鍵をGitHubに登録

①インスタンスにログイン

```:ターミナル
% ssh -i キーペア名.pem ec2-user@<パブリックIP>
```

②EC2サーバーのssh鍵の作成

```:ターミナル
[インスタンス]$ ssh-keygen -t rsa -b 4096
=> Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa): Enterキー
=> Enter passphrase (empty for no passphrase): Enterキー
=> Enter same passphrase again: Enterキー
```
ssh-keygenコマンド：ssh鍵のペアを作成するコマンド。
-t rsa：鍵形式rsaを指定
-b 4096：4096ビット

③EC2サーバーのssh公開鍵の確認

```:ターミナル
公開鍵の表示(id_rsa.pubファイル)
[インスタンス]$ cat ~/.ssh/id_rsa.pub
=> 表示された文字列全てが公開鍵。次のステップで使用するため、全てコピーする。
```

④GitHubにEC2サーバーのssh公開鍵を登録

自身のGitHubのプロフィールページのサイドバー「SSH and GPG keys」内の「New SSH key」をクリックし、「Title」と「Key」を入力します。
Titleは任意で入力し、Keyは③でコピーした公開鍵の文字列をペーストします。
最後に、「Add SSH key」をクリックします。


⑤Githubにssh接続できるか確認

```
[インスタンス]$ ssh -T git@github.com
=> インタラクティブな質問は全て「Yes」や「y」などで許容
=> Hi <Githubユーザー名>!・・・　と表示されればOKです。
```

**インスタンス内にアプリケーションをクローンするために、GitHubとの連携が完了です。**


# 最後に
本投稿が初学者の復習の一助となればと幸いです。
問題解決力をあげるには

<h1>プログラミングするうえで、問題解決力を磨くには</h1>
よくプログラムが動かないことがよくありバグを解消の方法を
理解していなかったようです。
Flutterをマックブックにインストールしたことを例にします。
課題）Flutterのディレクトリーファイルの設定で、bashとzshのコマンド
     osカトリーナのアップデート
コードで実行したいこと：binフォルダーを整理する為に
条件：directlyにFlutterのファイルを移動した後
### エラーが出たコード
```
vim ~/ .zshrc
iを押して、インサートモードにする。
export PATH="$PATH:$HOME/任意のフォルダー名/flutter/bin"
```
エラーが出て、Flutterのバージョンが確認ができなかった。
<h1>次に、bashのコマンドを変えて、インストールを試みる</h1>
### zshコマンドに書き換えて
```
source ~/.zsh_profile
export PATH="$PATH:$HOME/任意のフォルダー名/flutter/bin"
echo $PATH
flutter precache
```
flutterのバージョンが確認でき、アンドロイドのファイルがたりないとエラーが出た。
<h1>ファイルの場所とバージョンの確認をする</h1>
###
```
cd
cd 任意のフォルダー名
cd flutter
flutter --version
```
### 問題解決力をあげるには
ただ教材のサンプルコードや講師の話を暗記するのではなく、
情報を解釈する必要がある。
コードの意味を理解して、別のコードに入れて試す。
エラーメッセージが出た時には、その情報を集めて、意味を理解する。
検察して原因を究明して、バグを解決するという基本を身に付けたい。
【Linux】YouTubeLIVEをリアルタイムでダウンロードしてみる

1分以内で試せるLinuxネタを紹介します。
シリーズ化するかもしれないです。いま大してネタは無いですが…

今日は**YouTubeLIVEをリアルタイムにダウンロードしてみましょう**

### まずはYouTube-DLをダウンロード

``` Ubuntu系
apt install youtube-dl
```

```CentOS系
yum install youtube-dl
```

これで準備完了です。

### 早速ダウンロード

```
youtube-dl 動画のURL &
```

以上。
**※最後の「&」はバックグラウンド処理をするために入力します。ターミナルは閉じても構いません。**

尚、処理内容を確認するにはターミナルにjobsと入力し該当処理番号を確認して、fg X(番号)と打てば内容が見られます。

```
root@:~/youtube# jobs
[1]+  実行中               youtube-dl https://youtu.be/Qte6ArrIKlA &
root@:~/youtube#fg 1
```

※検証環境: Ubuntu 18.04.5LTS
PostgreSQLでbytea型のバイト数をカウントする

## この記事は

タイトル通りです。

## 自己紹介

Java（Spring Boot）のWebアプリ開発を主にやってます。

## 書き方
- ``octet_length``関数をつかいます。
- テーブル``hoge_tbl``のカラム``data``（bytea型）のサイズを知りたいときは以下のようにします。

```sql
select octet_length(data) from hoge_tbl;
```
- カラム``data``の全レコードのサイズ合計はsumでくるめばよいです。

```sql
select sum(octet_length(data)) from hoge_tbl;
```

## さいごに
以上です！
[Android]Androidアプリ側で何かしらのライブラリを読み込むとコンフリクトバージョンエラーが発生する理由

# はじめに

Androidで開発をしていて、よくある問題として何かしらのライブラリをgradleで読み込み実行すると、kotlinのバージョンンコンフリクト系のエラーが発生する場合がある。ので見解

ちょっと調べたのでメモ程度に残しておきます

# 原因

いろいろな理由があるのかも知れないが、まずライブラリのkotlinのバージョンとコンフリクトを起こしている場合に起きえます。
その場合は、そもそもライブラリを使うのを諦めるか、ライブラリのバージョンを古いものを使ってみるか、ライブラリを組み込むアプリのkotlinバージョンをアップしてみるかなどよくわからずに適当に試行錯誤して解決することが多いです。

## kotlinライブラリのコンフリクト
kotlinのライブラリを読み込むとkotlinのライブラリがアプリ側に読み込まれます。
その分apkのサイズとメソッド数は増加します。multi dexが必要かも。

アプリ側に読み込まれたkotlinライブラリとアプリ側のkotlinのバージョンでコンフリクトが起きる場合があるようです。
gradleの使用は下記を参考ください。kotlinバージョンでコンフリクトが発生した場合は新しいバージョンで上書きがされます。デフォルトの挙動なのでここを最新で上書きしないような設定をgradleファイルで行っても解決するはずです。（未確認）

コンフリクトが起きた場合の挙動
https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.ResolutionStrategy.html#org.gradle.api.artifacts.ResolutionStrategy:failOnVersionConflict()

# 解決方法
アプリ側で最新の実装するライブラリと同じバージョンにする。またはそれ以上にすると解決する可能性があります。
ライブラリとアプリ開発が同じ場合は問題なく実装できますが、大体の場合でライブラリは別企業か別の個人が実装しているはずです。そのためライブラリを作る人は常に最新のkotlinでバージョンアップをしてドキュメントにも最新のkotlinを利用するように促すことが必要なのではないでしょうか。

またはライブラリはkotlinではなくjavaで実装を行うとアプリ側にkotlinライブラリが読み込まれることはないためこの問題は発生しないはずです。はずです。
Railsモデル単体テストコードにおける、パスワードのダミーデータ生成注意点

#記事投稿の背景
モデル単体テストにおける<font color="DarkRed">ダミーデータ作成のため、Fakerを活用</font>していた。Fakerは名前、email等をランダムに生成する。しかし<font color="DarkRed">パスワードデータを生成する場合、注意が必要</font>だと分かった(後述)。そのため、<font color="DarkRed">注意点と対処方法</font>を備忘録として記事を投稿する。

**補足**
FakerとはRuby on RailsのGemの一つである。fakerの活用により、値をランダムに生成できる。詳細は下記リンク先を参照のこと。

[Faker公式のGithub](https://github.com/faker-ruby/faker/blob/master/doc/default/internet.md)


#Fakerを用いたパスワード生成の注意点
下記のような記述により、パスワードカラムへのダミーデータを生成した。

```ruby:user.rb
FactoryBot.define do
  factory :user do
    nickname                { Faker::Name.name }
    email                   { Faker::Internet.free_email }
    password                { Faker::Internet.password(min_length: 8) }
    password_confirmation   { password }
  end
end
```
このとき生成されるパスワードは大抵数字と文字列の組み合わせになるものの、<font color="DarkRed">稀に文字列のみ、あるいは数字のみが生成される</font>ことがある。これは<font color="DarkRed">パスワードのバリデーションを数字と文字列の組み合わせ</font>にした場合、<font color="DarkRed">ダミーデータとして不適</font>となることを意味する。

```bash:ターミナル
[8] pry(#<RSpec::ExampleGroups::User::Create>)> @user = FactoryBot.build(:user)
=> #<User id: nil, email: "michale@yahoo.com", nickname: "Eugenie Dach", created_at: nil, updated_at: nil>
[9] pry(#<RSpec::ExampleGroups::User::Create>)> @user.password
=> "1HyWz2Mr"
[10] pry(#<RSpec::ExampleGroups::User::Create>)> @user = FactoryBot.build(:user)
=> #<User id: nil, email: "landon_barrows@yahoo.com", nickname: "Kathi D'Amore", created_at: nil, updated_at: nil>
[11] pry(#<RSpec::ExampleGroups::User::Create>)> @user.password
=> "NdKrAcLw"

```

#対処方法
パスワードに対し数字・文字列の組み合わせのバリデーション設定をしている場合、<font color="DarkRed">手動でパスワードのダミーデータを作成する</font>こと。

```ruby:user.rb
FactoryBot.define do
  factory :user do
    nickname                { Faker::Name.name }
    email                   { Faker::Internet.free_email }
    password                { 'test1234TEST' }
    password_confirmation   { password }
  end
end
```
以上
【Github】masterからプルしたのに必要なファイルが存在しない場合の対処法（submoduleありPJ）

Githubのサブモジュールを使っているPJで、masterから最新版をプルしたのに、一部ファイルが存在しない場合の対処法。

git pullやcloneの後に、submoduleの最新版も同期する必要がある。

```:bash
$ git submodule update --init --recrusive
```

現在のsubmoduleを`--init`で初期化してupdateする。

`--recrusive`をつけることで、サブモジュールの中でサブモジュールが使われている場合にも対応する。


##どういうときに必要になるか？
submodule内で変更があった場合や、元々masterの中に入っていたファイルをsubmoduleに切り出した場合に上記処理が必要となる。