OmniAICreator/Qiita-1.07M huggingface dataset:
RubberDuckがパースエラーになったとき【VBA】

# あらすじ

VBAのテストフレームワーク[RubberDuck](https://rubberduckvba.com/)を利用して、
テスト駆動開発することが出来ます。
（RubberDuck詳細は下記にて紹介）

テストをするためには、
コードを書き換えるたびに`Refresh`をして、
RubberDuckにコードを監査させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/cd7e3ecb-364f-bbc3-e6e0-ac9fe2451c8a.png)

`Refresh`ボタンを押してエラーが発生し、上の画像のように真っ白になり、
何もできなくなった気がした時の解決法を書きます。

# 現象

## 前提

RubberDuckを利用して開発しているときに、
下記のコードを書いたとします。

```vb:ParseError.cls
Option Explicit
Public Sub ParseError()
    Dim i As Integer
    For i = 1 To 10
        If i Mod 2 Then
            Debug.Print("This Code Can't Run!")
    Next
End Sub
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/29312a12-ea75-1458-269a-be3592748522.png)

## パースと監査

テストを走らせる前に、
`Refresh`ボタンを押して、
RubberDuckに監査させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/28bf3377-9de7-7671-0529-4ee965f87fb0.png)
アヒルたちがクルクルして監査が終わると、
`Refresh`ボタンが`Ready`に変わるはずです。
そうすると、テストの`Run`ができます。

## パニック

しかし、`Ready`になるべきボタンが
`ParseError`となり、子ウィンドウ`Code Explorer`や`Code Inspections`、`Test Explorer`が真っ白になります。
こうなると軽いパニックです。

# 解決の糸口

ここで、気になるのが、`Refresh`ボタンを押した後に出現した「赤丸に白バツ」のボタンです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/3ab32b1a-f993-8d9c-b207-ba58ef2ebb83.png)
このボタンを押すと、下記のメッセージが見れます。

```text
Module	L54C5	mismatched input 'Next' expecting {ABS, ANY, ARRAY, CBOOL, CBYTE, CCUR, CDATE, CDBL, CDEC, CINT, CLNG, CLNGLNG, CLNGPTR, CSNG, CSTR, CURRENCY, CVAR, CVERR, DEBUG, DOEVENTS, FIX, INPUTB, INT, LBOUND, LEN, LENB, LONGLONG, LONGPTR, MIDB, PSET, SGN, UBOUND, ACCESS, ADDRESSOF, ALIAS, AND, ATTRIBUTE, APPEND, AS, BEGINPROPERTY, BEGIN, BINARY, BOOLEAN, BYVAL, BYREF, BYTE, CLASS, CLOSE, DATABASE, DATE, DOUBLE, ELSE, ELSEIF, END_IF, ENDPROPERTY, END, EQV, ERROR, FALSE, GET, IMP, IN, INPUT, IS, INTEGER, LOCK, LONG, LIB, LIKE, LINE_INPUT, LOCK_READ, LOCK_WRITE, LOCK_READ_WRITE, ME, MID, MOD, NAME, NEW, NOT, NOTHING, NULL, OBJECT, ON_ERROR, OPEN, OPTIONAL, OR, OUTPUT, PARAMARRAY, PRESERVE, PRINT, PTRSAFE, PUT, RANDOM, RANDOMIZE, READ, READ_WRITE, REM, RESET, SEEK, SHARED, SINGLE, SPC, STEP, STRING, TAB, TEXT, THEN, TO, TRUE, TYPEOF, UNLOCK, UNTIL, VARIANT, VERSION, WIDTH, WITHEVENTS, WRITE, XOR, '-', '[', OCTLITERAL, HEXLITERAL, FLOATLITERAL, INTEGERLITERAL, WS, IDENTIFIER, LINE_CONTINUATION}
```

ここから、`Next`の前後でミスが無いかを見ればいいということまではわかります。

# 結果

結果として、`End If`が無いことが原因でした。

```vb:ParseError.cls
Option Explicit
Public Sub ParseError()
    Dim i As Integer
    For i = 1 To 10
        If i Mod 2 Then
            Debug.Print("This Code Can't Run!")
        End If '←これです！
    Next
End Sub
```

ケアレスミスさんです。

# まとめ

RubberDuck で `Parse Error`が起きたら、「赤丸白バツ」のボタンを押してみましょう。

# 追記

@tenmyoさんからのコメントで、Refreshの前にVBEの方のコンパイルを走らせる習慣にしても良いかもしれません。

# RubberDuckの使い方

RubberDuckの先輩たちによるRubberDuckの紹介です。
「初めまして、アヒルさん」な人はこちらをご覧ください。

- [VBAにはユニットテストやリファクタリング機能がない・・・そんなふうに考えていた時期が俺にもありました](https://qiita.com/mima_ita/items/3629006163d0a7fa6e55)
- [VBA開発環境をモダンにする - RubberduckとVBEThemeColorEditorの紹介](https://qiita.com/mochimo/items/e9be36619a76e15bc898)

**Excelsior!**
tweet自動削除スクリプト

この記事は以下のような方におすすめです

- twitter apiを使わずに一括削除したい方
- 自動化なんとなく好きな方


# 背景
twitter広告出航したいから昔使っていたアカウント引き継いで出そうかな〜
↓
黒歴史ツイート多いから一括削除するか
↓
まずはtwitter apiを申請してっと...ポチっ
↓
審査中
↓
２日後..
審査中
↓
待てねえ
↓
そうだブラウザ操作して消すか

# How to
1. twitterのプロフィールを開いてください
2. 以下のコードを開発者モードでconsoleに貼り付けて実行してください
ツイートタブ、ツイートと返信タブどちらでも使用可能です

```javascript
var START_TWEET_INDEX = 1;
var MAX_INDEX = 100;
function loop( fn, i, end) {
  return fn(i)
  .then( () => {
    if ( i < end ) {
      return loop( fn, i+1, end)
    }
    else {
      return Promise.resolve('end');
    }
  })
}
function action(i) {
  if (i % 5 === 0) {
    window.scroll(0, 2000);
  }
  return new Promise( (res, rej) => {
    setTimeout( () => {
      const moreList = Array.from(document.querySelectorAll("[aria-label='もっと見る']"));
      moreList[START_TWEET_INDEX].children[0].children[0].click();
      setTimeout(() => {
        document.querySelector("[role='menuitem']").click();
        setTimeout(() => {
          document.querySelectorAll("[data-testid='confirmationSheetConfirm']")[0].click();
        }, 600);
      }, 600);
      res();
    }, 2000)
  })
}
loop(action, 0, MAX_INDEX);
```

# 解説
## START_TWEET_INDEX
削除を開始したいindex
１つ目のツイートだけは残したい！！そんな方は
START_TWEET_INDEX = 1

## MAX_INDEX
START_TWEET_INDEXから何個目までツイートを消したいかを定義する
とりあえず全部消したい方は適当に
MAX_INDEX = 1000000;
とかにしときましょう

# まとめ
これで清廉潔白な状態でtwitter adを始められますね
他にも[こんな記事](https://qiita.com/miyabiya/items/ffca90a648d59be2de50)も書いてるので自動化楽しんでください
Swift Package内のSwiftで並列にタスクを実行する方法

とあるきっかけで、UbuntuにSwiftをインストールし、並列処理をやってみたいと思ったのですが、うまくいかなかったのでその問題と解決方法を紹介します。
# 環境
自分が実行した環境は以下のとおりです。

- Ubuntu 20.04
- Swift version 5.3 (swift-5.3-RELEASE)
- Target: x86_64-unknown-linux-gnu
- CPU: Ryzen5 2600

# やりたいこと
- とりあえず並列に処理を実行することを確認したい
- 数字を非同期でprintする

調べたところ、`Dispatchqueue`を使うのが一般的なようでした。
`Process`や`Thread`などもあるようですが、`Dispatchqueue`はそれらを簡単に使えるようにしてものであるようなので、素直に`Dispatchqueue`を使うことにしました。

# 問題
はじめは[調べて出てきたサイト](https://medium.com/swift-india/parallel-programming-with-swift-part-1-4-df7caac564ae)のコードをそのまま写して、以下のようにしていました。

`swift package init --type executable`を実行して諸々のファイルを生成し、main.swiftを以下のようにしました。

```swift
import Foundation

var value: Int = 2

DispatchQueue.main.async {
    for i in 0...3 {
        value = i
        print("\(value) ✴️")
    }
}

for i in 4...6 {
    value = i
    print("\(value) ✡️")
}

DispatchQueue.main.async {
    value = 9
    print(value)
}
```

しかし、実行結果は

```
4 ✡️
5 ✡️
6 ✡️
0 ✴️
1 ✴️
2 ✴️
3 ✴️
9
```
となることが望ましかったのですが、

```
4 ✡️
5 ✡️
6 ✡️
```
となってしまいました。
つまり、**`Dispatchqueue`に任せた部分の処理が全く実行されていません。**
# 解決法
この原因には一つ心当たりがありました。
それは**ファイル単体で動かしている**ことでした。
多くのサイトはMacで開発しているiPhoneアプリの中で使うことを想定しています。
さらに、Swiftをファイル単体で実行するとき、以前も似たような不具合があったことを覚えていました。以下がそのときに投稿した質問です。
[【Swift】Timerで繰り返し実行(定期実行）ができない](https://teratail.com/questions/234540)
これは、アプリの中では自動で実行されるRunLoopがSwiftファイル単体で実行するときには実行されないため、不具合が起きていて、プログラムの末尾に`RunLoop.current.run()`を追加することで解決しました。
どうようにして今回のプログラムにも`RunLoop.current.run()`を追加してみました。

```swift
import Foundation

var value: Int = 2

DispatchQueue.main.async {
    for i in 0...3 {
        value = i
        print("\(value) ✴️")
    }
}

for i in 4...6 {
    value = i
    print("\(value) ✡️")
}

DispatchQueue.main.async {
    value = 9
    print(value)
}

RunLoop.current.run()
```
すると期待通りの出力がされました。
# まとめ
- Swiftをアプリではなく、ファイル単体で実行するときにはRunLoopをつけると解決するかもしれない
- Dispatchqueueを使うときはRunLoopをつけよう

# 最後に
なにか間違いや改善点がありましたら、コメントや編集リクエストをお願いします。
ありがとうございました。
HTMLのarticleタグとは

#プログラミング勉強日記
2020年10月1日
HTMLの`<atricle>`タグを初めて見かけたので使い方をまとめる。

#articleタグとは
　article要素は内容がそれだけで完結している部分に使用する。具体的には、雑誌や新聞の記事やブログのコメントなどである。

　`<article>`を入れ子にして使用するときには、内側の`<article>`の内容は原則として外側の`<article>`の内容に関連しているものにする。具体的には、`<article>`タグでくくられたブログのエントリの内側にさらに`<article>`タグでくくられたコメントを入れ子にすることで、そのコメントがブログに対して投稿されたものであることを示すことができる。

```html:ブログの例
<h1>blog</h1>

<article>
  <h2>2020年10月1日</h2>
  <p>今日はバスケをしました。</p>
  </article>
    <h2>コメント</h2>
    <p>私もバスケしたいです。</p>
  </article>
</article>

<article>
  <h2>2020年9月27日</h2>
  <p>今日はオムライスを作りました。</p>
  </article>
    <h2>コメント</h2>
    <p>とてもおいしそうですね。</p>
  </article>
</article>
```

#sectionとdiivタグとの違い
　articleもsectionもdivもブラウザで表示した場合には結果は変わらない。ただ、それぞれの違いを理解してマークアップすると文章構造ははっきりして、Googleのクローラーに正しく検知され修正や改善しやすくなる。

- articleはsectionよりも独自性の高い構造の場合に使う
- sectionはテーマ性ごとに、articleよりも独立していないときに使う
- divタグは一つの範囲として使えるが、過剰に利用されがち

#参考文献
[article…… 記事であることを示す](http://www.htmq.com/html5/article.shtml)
[HTMLでarticleタグを使いこなす方法を現役デザイナーが解説【初心者向け】](https://techacademy.jp/magazine/29412)
GMO-PGのリンクタイプPlusについて検証

# 概要

GMO Payment GatewayのリンクタイプPlusについて、いくつか技術検証したので、その検証メモを残します。

ここで行っている検証に利用したプログラムのソースコードは以下にあります。
https://github.com/Yu-Yamaguchi/codeigniter3-app

# リンクタイプPlusによる決済処理

## 会員ID（MemberID）を指定せずに決済画面へ遷移する

ショップで契約している決済方法が選択肢として選べる決済画面に遷移する。

![スクリーンショット 2020-10-01 21.19.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/ca6f6275-a57b-45c4-58bd-1978e8c4c974.png)


## 会員ID（MemberID）を指定して決済画面へ遷移する（会員未登録の場合）

- 条件
    - GMO会員登録（カード登録）が未完了の状態であること
    - https://pt01.mul-pay.jp/payment/GetLinkplusUrlPayment.json で会員ID（MemberID）パラメータを指定して、リンクタイプPlusの決済画面へ遷移するURLを生成する

**結果**

決済画面への遷移URLは生成できるが、決済画面に遷移すると

```
お支払い手続きに失敗しました。
カード情報が存在しません。
```

というメッセージが表示されてしまう。

![スクリーンショット 2020-10-01 21.17.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/2dc47bfb-3e0d-37bf-70d3-2f401c88bdf4.png)

## 会員ID（MemberID）を指定して決済画面へ遷移する（会員登録済みの場合）

- 条件
    - GMO会員登録（カード登録）が決済前にすでに登録していること
    - https://pt01.mul-pay.jp/payment/GetLinkplusUrlPayment.json で会員ID（MemberID）パラメータを指定して、リンクタイプPlusの決済画面へ遷移するURLを生成する

支払い方法を「クレジットカード」と選択すると、登録済みのクレジットカードを表示してくれる。
会員IDを指定してすでに会員が登録している状態であれば、登録済みカードを利用して決済が可能となるようです。

![screencapture-stg-link-mul-pay-jp-v2-plus-tshop00033642-checkout-d6f46912cf68b75bbc8529af7d525dc79fe74bdcdc97d89138de31e44843c379-2020-10-01-21_25_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/1572287d-bfe2-f03f-0d30-4bd0c824b0c3.png)

# リンクタイプPlusによる会員カード登録

## 会員カード登録未実施（初回）の場合

- 条件
    - １度も会員ID（MemberID）を指定して会員カード編集画面への遷移URLを生成していない
    - １度も会員ID（MemberID）を指定してカード登録が完了していない

完全に初回の場合は、新規会員登録としてクレジットカード番号などを指定して登録する画面が表示されます。

![スクリーンショット 2020-10-01 21.49.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/a0f8a6b1-a7a8-59fc-62b5-cf7ba8dcd82c.png)

## 会員カード登録済み（２回目）の場合

- 条件
    - すでに会員ID（MemberID）を指定して会員カード編集画面からカード登録が完了している
    - 同じ会員に対して会員カード編集画面へ遷移した場合

すでに完了していると怒られます。

![スクリーンショット 2020-10-01 21.51.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/318f92ef-3e40-6527-1538-ff08a3202ea6.png)

でも、カードの追加はできるはずなので、遷移するためのパラメータ情報を修正すればいけるとは思います。

# サンプルコードを一通り動かすとこんな感じ

![image.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/a177fc14-ea98-9d3e-5418-79d0c0fc59af.gif)
モデルのテストコードは何をテストしているか

#何がわからないか
・モデルの単体テストコードは何をテストしてるか
・パスワードなどの文字制限や空欄を防ぐバリデーションはどこに書いてあるのか
#railsアプリとgem(devise)とDBの図
バリデーションの記述場所、何をテストしているかについて整理する。
![IMG_1915.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693815/51907b53-7be1-7dd6-130f-5c81c9ab4796.jpeg)
・deviseはrailsアプリのモデルと繋がっている。
・deviseのバリデーションはconfig/initialize/devise.rbに記述してある
・gemを経由しないモデルのバリデーションはモデル内に記述する。
・モデルの単体テストはバリデーションが機能するかを確認している。
MAMPでMySQLに接続できない※コマンドラインでは接続できる

あまり中身がないが、いろいろ調べた結果これを書いてある記事がなかったので投稿。

### 原因

もともと自分のmacにあったmySQLと競合していた。

### 確認

mysql関連のプロセスを表示

```
$ ps aux | grep mysql
```

ここで使われてるコマンドをみて、複数のmysqlが起動していないか確かめる。
あとは使いたくない方を止めればいい。ローカルの方なら

```
$ mysql.server stop
```
すればいいだけ。

もしMAMPの方を使いたくないなら、

```
$ /Applications/MAMP/bin/stopMysql.sh
```


自分はこれで６時間ぐらいつまったので誰かのお役に立てれば嬉しい。

##　参考にしたサイト

https://www.itmedia.co.jp/help/tips/linux/l0158.html
https://royal-fummy.com/blog/mamp-stop-mysql/
Pythonのif文

### Pythonのif文の例文について
ifの使い方をパターン別に書いてみました。
複数の関数を用いた例も参考にしました。
条件式の構成で、必要な知識不足を載せています。
### 発生している問題・エラー
```python

for n in range(2,10):
    for x in range(2,n):
        if n % x == 0:
            print(n,'equals',x,'*',n//x)
            break
    else:
        print(n,'is a prime number')
```
また、数値を指定して条件でのコードが以下の通りです。

### ifと数値の指定パターン
```python
x = 25 //数値を指定する
if x < 0:
    print('negative')
elif x ==0:
    print('zero')
elif x ==10:
    print('ten') 
elif x ==50:
    print('fifty')
elif x ==25:
    print('twenty-five')
else:
    print('positive')
"""elseからの分岐点の条件を定める
   print('条件名')
"""
```

### 基礎からの復習ですが、付け加えること
１、リストの文字の指定の表記
【Ruby】標準入力から値を取得する方法まとめ【Paizaスキルチェック対策】

#一行から値を取得する
```
#========================================
パターン1 変数にgetsメソッドを入れ、putsで出力
#========================================
n = gets
puts n


#========================================
パターン2 stdinを使う方法
#========================================
puts $stdin.gets

```



#複数行から要素を取得して出力

標準入力
2
4
7

```
#========================================
パターン1
#========================================


#========================================
パターン2
#========================================
puts $stdin.readlines 

```
readlinesはstdinで取得した複数行の値を「配列」として読み取る。
一度`n = $stdin.readlines` と変数に入れておき`puts n[0]`とかする事も可能。
*文字列として読み取りたい場合は`read.split`を使う。
【作ってみた】理容室の前にある赤と青のくるくる（サインポール）をCSSで再現してみた

#どうも7noteです。この間ドライブしているときにふと理容室のくるくる回るやつをみて、「あ、CSSだけで作れそう」って思ったので作ってみた。

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

https://naruweb.com/coding/signpole/
laravelでbootstrapを使ったログイン機能

larabelでアプリ作る際bootstrapを使って簡単に作成したのでまとめたいと思います。
<br>

####環境
PHP 7.4.10
Laravel Framework 6.18.40
npm 6.14.5
node 14.5.0

<br>


まず前提としてLaravel 5.8以前ではフロントエンド フレームワークとしてbootstrapとVueがはじめから利用可能なように設定されていましたが、Laravel 6.xではデフォルトでは含まれなくなりました。

6.x以上ででBootstrapを利用するには、フロントエンドのScafolding機能を提供するlaravel/uiのコマンドを使用してJavascriptのビルドとCSSのプリプロセッサ設定を生成する必要があります。

<br>

スキャフォールドとは英語で足場という意味になっておりWebアプリケーション開発に関しては、MVCフレームワークで開発する際に必要なモデルやコントローラー、ビューをコマンドなどを自動生成してくれます。

<br>
元からスキャフォールドが入ってるRails素敵。

<br>

こちら環境がlaravel6.0なのでversion指定をしてます。laravelのバージョンが7などであれば公式を参照してください。

```
composer require laravel/ui:^1.0 --dev

```

これでbootstrapを向い入れる準備ができました。

次にui Artisanコマンドを使いフロントエンドのスカフォールドをインストールします。ここでオプションに認証機能をつけると自動で必要なファイルを自動で生成してくれます

```
php artisan ui bootstrap --auth

```

こちらのコマンドで認証機能のスキャフォールドが導入できてルーティングauthControllerなどのファイルが自動生成されましたが、bootstrap自体は足場を作っただけでダウンロードできてないのでしていきます。


補足ですがこちら完了するとこのような表示が出ます。

```
Please run "npm install && npm run dev" to compile
```

これからわかるようにlaravelではJavaScriptのパッケージ管理サービスであるnpmと連携することができて必要なソースコードを自動ダウンロードして依存関係を自動的に解決してくれます。

npmのダウンロード方法は省きます。

<br>

npmがお使いのpcに導入されている状態でアプリケーションにnpmをインストールします。また、インストールが完了すると下記フロントエンドのjqueryやbootstrapが使えるようになります。

```
npm install
```

このコマンドはsass等最新の書き方を昔の書き方に戻してコンパイルを統一させてブラウザでも読めるようにします。

```
npm run dev
```
<br>

```php:package.json

  "devDependencies": {
        "axios": "^0.19",
        "bootstrap": "^4.0.0",
        "cross-env": "^5.1",
        "jquery": "^3.2",
        "laravel-mix": "^4.0.7",
        "lodash": "^4.17.13",
        "popper.js": "^1.12",
        "resolve-url-loader": "^2.3.1",
        "sass": "^1.15.2",
        "sass-loader": "^7.1.0",
        "vue-template-compiler": "^2.6.12"
    }
```

これでログイン機能は完成です。

<br>
Top 10 Ways to Restore Your Social Media Reputation

With the growing presence of businesses on social media platforms today, creating mistakes has become very common. But the effect a mistake does on the brand’s image is extensive. This makes it important to consider Social Media Reputation important. Here are 10 ways to restore your Social Media Reputation:

 ![Better-Ecommerce-Results-1-768x432.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408898/248952cb-f865-9bb4-e368-c2941c799644.png)


1) Use Tools that will help you track your Social Media Reputation:

It has become hard to manage reviews nowadays, as everyone uses Social Media Platforms to review business whether it is a good review or a bad review. It has become easier through some free tools that notify you whenever you get an alert. Many of the free tools include Google Alerts, BuzzSumo, SEMrush, etc. Some tools like Radian6 or Sprinklr, are costly but they tell a consumer’s sentiment towards your brand.

These tools help you keep a check on your Social Media Reputation, and take notice of any mistake before it becomes immense.

 

2) Have a contingency plan ready!:

The most important step to restore your Social Media Reputation is to have a plan ready. Usually, we think it is right to respond right away. But the correct first step is to have a plan on how to respond to a criticism or a bad review. You should prepare well because responding badly right away, or doing a mistake in responding, can do irreparable damage. It is a given fact that before responding, you should consult your PR and legal team, so that the response that goes out, settles the problem, not start another one.

3) Be upfront about your mistake:

Sometimes, the mistake is not that huge, and only admitting to it, and seeking an apology helps in fixing that mistake. This is valid in all the cases though, be it a big mistake or small, but admitting to it, helps a lot in restoring your Social Media Reputation. Always remember to keep your voice humane, and with authenticity. A formal tone doesn’t work well when you are asking for an apology.

 

4) Remove the post if it’s offensive:

Sometimes it is important to just remove the post because it is offending your audience. Anything controversial or offensive will anyway cause a lot of damage to your social media reputation. And if it isn’t removed soon or ever, it will cause the same bad impression on your potential and existing followers. But deleting or removing the post doesn’t mean that the problem has eradicated itself. It is just to begin a fresh start and that will begin, the moment you remove the post, and post a new apology. The apology post, should come soon and should sound sincere. It should contain the reason why you posted the post in the first place, and why you have removed it. People should see that you have learned your lesson and that you are deeply regretting your mistake.

<a href="https://www.w3era.com/top-10-ways-to-restore-your-social-media-reputation.htm">READ MORE</a>
Doma入門 - 目次

Doma入門の投稿を集約しています。

## チートシート

* [Criteria API チートシート](https://qiita.com/nakamura-to/items/04def9dc3d218d50c71f)
* [Kotlin Criteria API チートシート](https://qiita.com/nakamura-to/items/bd621a782e086e39063d)

## 記事

* [Criteria APIの紹介](https://qiita.com/nakamura-to/items/cf97c6b57efbe06d11dd)
* [Criteria APIで動的にWHERE句を組み立てる](https://qiita.com/nakamura-to/items/2ba791fbcc13ef0075fc)
* [Criteria APIのWHERE句でANDやORなどの論理演算子を使う](https://qiita.com/nakamura-to/items/ca1fac9b6db3762c3611)
* [Criteria APIでサブクエリを使う](https://qiita.com/nakamura-to/items/77d9e56aff890d7757b3)
* [Criteira APIで結合を使う](https://qiita.com/nakamura-to/items/b16cbed6edc2b7aaac47)
* [Criteira APIで射影を使う](https://qiita.com/nakamura-to/items/4c64837b63c734cc40ad)
* [トランザクション](https://qiita.com/nakamura-to/items/da3b0173f9c46ccef784)
* [注釈処理](https://qiita.com/nakamura-to/items/072cb6cf9bd607e1aad5)
* [ログライブラリにSLF4Jを使う](https://qiita.com/nakamura-to/items/0f8195c45eb3630a8daf)
* [Eclipse + Java + Gradle の環境で Doma を動かす](https://qiita.com/nakamura-to/items/9e05fe00be9d4d629fdc)
* [Eclipse + Java + Maven の環境で Doma を動かす](https://qiita.com/nakamura-to/items/f98a05b926363016070b)
Ubuntuにおける静的IPアドレスアドレスの設定


## 古いディストリビューション

kali Linux などのDebian系はよく、
「/etc/network/interfaces」
ファイルを編集する。

「enp0s8」はネットワークの名称。

sudo vim /etc/network/interfaces

```/etc/network/interfaces
auto enp0s8
iface enp0s8 inet static
address 192.168.56.102
network 192.168.56.0
netmask 255.255.255.0
```


sudo systemctl restart

## Ubuntuの場合
Ubuntu18.04 LTS, Ubuntu20.04 LTS環境

/etc/network/interfaces 編集は効果なし。

昨今のubuntuのネットワーク設定は
**「/etc/netplan/99_config.yaml 」**
ファイルを編集する。


- 空白がインデントと認識されるので、インデントを揃える。
- 「enp0s8:」とあるところは、ネットワークの名称。
- ネットワークの名称下の「addresses:」には、設定したい静的IPアドレスとサブネットを指定。
- 「gateway4:」、nameservers下の「adresses:」にはデフォルトゲートウェイを指定する。（？）


```/etc/netplan/99_config.yaml 
network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s8:
      dhcp4: false
      dhcp6: false
      addresses: [192.168.1.70/24]
      gateway4: 192.168.1.1
      nameservers:
        addresses: [192.168.1.1]
```

[Ubuntu 20.04 LTSで固定IPアドレスの設定](https://qiita.com/zen3/items/757f96cbe522a9ad397d)
[Ubuntu公式 Network Configuration](
(https://ubuntu.com/server/docs/network-configuration)
[New Relic] NRQLアラートを使ってみる

# 概要
NRQLアラートで監視し、通知する方法をまとめる。

# NRQLとは

以下参照。

https://qiita.com/mmclsntr/items/2f4a194b79dfab89dc94

# NRQLアラートとは
New Relicアラートの種類の一つで、NRQLで対象のメトリクスを定義できる。

https://docs.newrelic.co.jp/docs/alerts-applied-intelligence/new-relic-alerts/alert-conditions/create-nrql-alert-conditions

## メリット
- 汎用的なNRQLを使うため、インフラ監視だけでなく、外形監視、APM、使用量などあらゆるアラートをNRQLアラート一つで作成できる。
- FACET句を使えば、任意のメタ情報を含めてアラートを飛ばすことができる。
- New Relic側としてもNRQLアラートの使用を推奨している

## デメリット
- NRQLが使えないといけない
    - New Relicを利用する上でNRQLを使うことはほぼ必須なので、使っていくと自然と身につくはず

## 使い方: AWSのEC2インスタンスのCPU使用率の監視をする場合

### 0. 準備
まずは対象のメトリクスについて、「Data explorer」または「Query builder」で参照してみて、データの挙動やメタ情報、実際のNRQL文を確認する。

![3feba932-6f9a-4934-9e16-e95f836d3252.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/02c169b3-f827-bcbb-45fc-804e65a3e5d2.png)

または、Infrastructure等の画面に表示されたグラフから、そのグラフを作るNRQL文が「View query」で参照できるため、それも参考にする。

![d66c98cd-8763-4e51-8ff5-6d184ac2274a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/68579c29-a0a5-c26c-db77-281fd202efd8.png)

### 1. 通知チャンネルとポリシーを作成する (説明割愛)

「Alert」ページから「Notification channels」(通知先) と「Policy」(アラートのグループ) を作成する (以下ドキュメント参考)。

https://docs.newrelic.co.jp/docs/alerts-applied-intelligence/new-relic-alerts/alert-notifications/notification-channels-control-where-send-alerts
https://docs.newrelic.co.jp/docs/alerts-applied-intelligence/new-relic-alerts/alert-policies/create-edit-or-find-alert-policy


### 2. NRQLアラート作成

**1) 作成したポリシーを選択し、右上の「Add a Condition」を選択**
**2) 「Categorize」で「NRQL」を選択**
**3) 「NRQL>」にNRQL文を入力し、メトリクスを定義する**

```sql
SELECT average(`aws.ec2.instance.cpuUtilization`) FROM Metric WHERE aws.accountId = '443553437457' FACET tags.Name, aws.accountId, aws.ec2.instanceId
```
- WHERE句で、グルーピング
- FACET句で、メトリクスの分離 (DatadogでいうところのMulti Alert)。 ここに記入したカラムがメタ情報としてアラートに載る。  

**4) 「Thresholds」を設定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/1d24da74-cc7c-6742-7734-a766b34360d3.png)

**5) 「Condition settings」を設定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/ddd5f0af-ab22-a717-df7e-4106c6965c25.png)

- FACET句で指定したカラムは、Descriptionで変数として指定できる [参考](https://docs.newrelic.com/docs/alerts-applied-intelligence/new-relic-alerts/alert-conditions/alert-custom-violation-descriptions)

**6) 「Create condition」で作成**

## NRQLサンプル

AWS EC2 CPU使用率

```sql
SELECT average(`aws.ec2.instance.cpuUtilization`) FROM Metric 
```

AWS RDS CPU使用率

```sql
SELECT average(`aws.rds.instance.cpuUtilization`) FROM Metric
```

AWS Lambdaエラー件数

```sql
SELECT average(`aws.lambda.function.errors`) FROM Metric
```

Synthetics結果

```sql
SELECT count(*) FROM SyntheticCheck WHERE result = 'SUCCESS'
```
PHP [trait,require,include,spl_autoload_register]

# trait(トレイト)
traitは、同じ内容のコードを使い回したい時に使います。
下記の様に記述します。
![スクリーンショット 2020-10-01 19.33.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663122/256e3a62-253f-4847-7193-833d64d297e6.png)
## use LIkeTrait;
下記の様にuse LIkeTrait;と記述する事でtrait LikeTraitの中のプロパティやメソッドを使う事ができます。
![スクリーンショット 2020-10-01 19.34.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663122/136d6271-48f0-ae9e-cb24-5ef8b2fcd3c1.png)
これによってコード見やすい様にする事ができます。

# 外部ファイルを読み込み[require,include]
require('別のファイル名');とする事で読み込んでくれる。
requireは処置が止まるとエラーが出ます。
includeでも同じ様に読み込んでくれますが、処理が止まらないという性質があります。
HTMLや処理が止まってもいい時に使います。
_onceと記述する事で、スキップします。
![スクリーンショット 2020-10-01 20.16.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663122/f64d2ae3-7c92-8baf-1857-519f39e89cf2.png)
# spl_autoload_register関数
spl_autoload_register(関数)
とする事で、newした時にPostクラスが無くても、自動でクラスを読み込んでくれます。便利！！
![スクリーンショット 2020-10-01 20.28.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663122/1f3b6256-d47c-26e9-4385-3312e0360402.png)
mapの中でawaitを使う方法

本当にただのメモですが、、

```js
const list = await Promise.all(listA.map(async itemA => {
  return { ...itemA, ...await this.getListB(itemA.id) }
}));
```

ただawait書くだけではエラーになりますが、Promise.allを使えば良いそうです。
kubernetes内でmysqlコンテナを起動しようとすると「 --initialize specified but the data directory has files in it. Aborting.」とでて起動してこない

## メッセージ

```
yuta:~ $ kubectl logs mysql-56f96469ff-8rwjv 
2020-10-01 11:25:43+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.31-1debian10 started.
2020-10-01 11:25:44+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2020-10-01 11:25:44+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.31-1debian10 started.
2020-10-01 11:25:44+00:00 [Note] [Entrypoint]: Initializing database files
2020-10-01T11:25:44.094657Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2020-10-01T11:25:44.095833Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.
2020-10-01T11:25:44.095860Z 0 [ERROR] Aborting
```

## 原因
-`/var/lib/mysql`内になにかあると、initializeできないみたい

## 対策
- いいのかはわからないけれど、起動時にいったんディレクトリをクリアする処理を入れるととりあえずは起動した

```mysql.yaml
        - name: persistent-storage
          mountPath: /var/lib/mysql
        lifecycle:
          postStart:
            exec:
              command:
                - sh
                - -c
                - "rm -fr /var/lib/mysql/*"
```
[New Relic] NRQLを使ってみる

# 概要
New RelicのNRQLを使ってみたので、メモ

# NRQLとは

New Relic上のデータを参照するための、SQL-likeなクエリ言語。

例

```sql:特定のアカウントのEC2インスタンスCPU使用率
SELECT average(host.memoryUsedPercent) FROM Metric WHERE aws.accountId = '443553437457' FACET tags.Name SINCE 1 week AGO TIMESERIES
```
![1a36cbdf-9cd2-424d-bacb-a4a375cd4ed6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/920765be-3093-d3f8-0a99-a9ff00323488.png)


New Relic上に集約された全てのテレメトリデータ (メトリクスやイベントデータやログなど) はNew Relic Database (NRDB) に格納される。

参考: 
https://blog.newrelic.co.jp/translation/nrdb-design-principles/
https://blog.newrelic.co.jp/story/metrics-events-logs-and-traces/

そのNRDBに格納された情報は、New Relic Query Language（NRQL）でクエリすることで参照できる。
かなり汎用的であり、なんでも取ってこれる。NRQLはNew Relicを扱う上ではほぼ必須。

以前まで「Insights」というサービスの機能だったが、New Relic Oneに統合された。ただ、Insights自体はまだ残っており、API keyの発行などで利用する場面がある。

話によると、「ぬるくる」って読むらしい

# 注意
- SELECT文のみ
    - 挿入などWrite操作はできない
- JOIN句は使えない

# 使い方
画面右上の「Query your data」から実行する。

「Data explorer」からはNRQL文を入力しなくともGUIで選択してクエリが可能。NRQL文も表示される。

https://docs.newrelic.co.jp/docs/query-your-data/explore-query-data/data-explorer/introduction-data-explorer 

![8ce2c9b7-988d-4103-b466-f81944bf6160.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/2931b34a-56ba-37d7-308c-34e65c7e4e42.png)

「Query builder」からは、直接NRQL文を入力してクエリができる。

https://docs.newrelic.co.jp/docs/query-your-data/explore-query-data/query-builder/introduction-query-builder

![db9c983c-3413-4776-b72a-0183d2f12dd4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/95203947-c7af-58bd-86d6-4e3d36cf9c27.png)

## 詳細
詳しくは、以下のドキュメント参照。

https://docs.newrelic.co.jp/docs/query-your-data/nrql-new-relic-query-language/get-started/introduction-nrql-new-relics-query-language
.pyファイルを.exeファイルにする方法

業務で必要になり調べたり試したりしてみたので、記録がてら初投稿。
py2exeとpyinstallerを使用し、最終的にpyinstallerを使用しています。
記述は全てpipenvでの仮想環境下を想定しています。[^1]
適宜読み替えてください。

誤っている箇所などあれば気軽にコメント等お願いします。


## 環境
- Windows 10 version 2004 (May 2020 Update)
    - pipenv 2020.8.13
        - python 3.8.5
        - numpy 1.19.2
        - pandas 1.1.2
        - py2exe 0.9.3.2 or pyinstaller 4.0

## py2exe
色々調べたところ、pyinstallerより軽量かつ高速！とあったので使用してみるも、pandasやscipyなどのモジュールがあると何故か依存ファイルに漏れが出て、実行時にimportエラーが出る。
(numpyは問題なかった。またGithub等で色々調べるとmatplotlibやQtPyなども問題になり得るみたい。)
使用していたpy2exeのバージョン(0.9.3.2)がリリースされた時点に合わせてライブラリをダウングレードしてみたりするも改善せず。
筆者はここでpy2exeを一旦見限った。

簡単なファイルで実行まで試したので、使い方だけサラッと説明します。

### インストール
使用する環境、バージョンに合わせて.whlファイルを[Github](https://github.com/albertosottile/py2exe/releases)からダウンロードしてくる。
その後、

```bash
$ pipenv install py2exe-0.9.3.2-cp37-none-win_amd64.whl

#非仮想環境下
$ pip install py2exe-0.9.3.2-cp37-none-win_amd64.whl
```
とするとインストールできる。
(`pip install py2exe`でもインストールできるが、古いバージョンになる。)

### 実行方法
- setup.pyを、exe化したいファイルと同じ階層に作成(各種optionはここで指定。詳しくはGoogle先生迄)。

```python:setup.py
    from distutils.core import setup
    import setuptools
    import py2exe

    setup(
        console = [{'script': 'xxx.py'}] # exe化するファイル
    )
```

- exe化

```
    $ pipenv run python setup.py py2exe
```

これでdistディレクトリ下にhello.exeができる。

## pyinstaller
pandasやnumpy等のライブラリを使っている場合、py2exeに比べて遅い・容量が大きいの二重苦で使用を避けていたが、py2exeが上で記したような感じだったのでこちらを使用することに。

参考: 

### インストール
```bash
$ pipenv install pyinstaller

#非仮想環境下
$ pip install pyinstaller
```

### 実行方法
- ファイルをまとめずexe化する場合

```bash
    $ pipenv run pyinstaller xxx.py
```

結果

```bash
    .
    ├─build
    │  └─xxx
    └─dist
        └─xxx
            ├─xxx.exe  # 生成された実行ファイル
            ├─Include
            ├─numpy
            ├─pandas
            
```

実行にはxxx以下が全て必要。

- ファイルをまとめてexe化する場合

```bash
    $ pipenv run pyinstaller xxx.py --onefile
```

結果

```bash
    .
    ├─build
    │  └─xxx
    └─dist
       └─xxx.exe  # 生成された実行ファイル
```
スッキリ。

### pyinstallerで生成された.exeファイルの容量・実行時間について
簡単な.pyファイルを作って実験。環境は上と同じ。

- 実験パターン
    - 'normal': ファイルをまとめずにexe化
    - 'onefile': ファイルをまとめてexe化

- 使用ファイル

```python:hello.py
    import sys
    import numpy
    import pandas

    with open('test.txt', 'w') as f:
        f.write(f'argv: {sys.argv}') # 引数がちゃんと渡せるか確認
```

- 実行

```bash
$ pipenv run pyinstaller hello.py # --onefile
$ dist/hello.exe hello world 1 2 3
```

- 出力ファイル

```txt:test.txt
argv: ['C:{PATH}\\hello.exe', 'hello', 'world', '1', '2', '3']
```
引数の渡し方は.pyの実行と同様で良さそう。

- 結果

||ファイル容量(distディレクトリ)|実行時間|
|:---:|:---:|:---:|
|normal|148MB|<1s|
|onefile|55MB|10~20s|

容量と実行時間がトレードオフっぽい。55MBでも十分大きいけど。

## まとめ
python以外の言語で書かれた既存のソフトに学習済みの機械学習モデルを組み込んだりするときに使えるかもしれないが、容量の大きさと、今回使用していない他ライブラリとの依存関係などが気になるところ。
気が向いたらもう少し実験して追記します。
[^1]: exe化実行時に環境にあるライブラリは全てexeに含まれてしまい容量がバカみたいに大きくなるという記述があったので、pipenvを使用して最小限のライブラリをインストールし、実行している。
Cognos Analytics 監査ログDBのデータ容量の見積もり用ネタ情報

#監査ログDBのデータ容量の見積もり用ネタ
Cognosの監査ログDBの容量見積もりって、特に見積もり式とかも無いので経験値でえいやでやるしか無いですね。
そうは言っても何か無いのか～、という話によくなるので、とりあえずサンプルのレポートやダッシュボードを実行してみて、監査ログテーブルのどこがどんだけ増えるか実際に見て、基礎数値にするかと思いましたので、ついでに結果を置いておきます。
※あくまで参考値として活用して下さい。正式なガイドでもなんでも無いです。

#結果
環境はCognos Analytics 11.1.7 @ RHEL7で、監査DBはDB2 LUW 11.1です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/67bd0816-89fc-29fa-0522-6bc5c47cab92.png)

まあ、やっぱりACTION表とRUNREPORT表が大きくなって行きますね。
ダッシュボードの実行で、こんなにRUNREPORTが増えるというのは発見でした。

サイズは生データのサイズなので、実際DBに入ると圧縮されたりしますので、圧縮率を適当にかけて見積もるようにしてください。安全率も忘れずに！

#詳細シナリオ

**1 ログイン**
この画面からログインする操作です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/be6b275e-2847-9c4f-29f2-ebb782b7b611.png)

**2 ログオフ**
ここで「サインアウト」の操作です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/8ed65fc4-fb75-b492-1880-cf17f1b640d4.png)

**3 フォルダ移動**
ホーム画面で、このフォルダを開く操作です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/3ae721b1-7552-1ecd-6673-2b0095ec92a9.png)

**4 レポート実行**
サンプルの「企業Webサイトへのアクセス」を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/88f0b1b7-0e89-9a9d-fcc6-5208de9e0181.png)

**5 レポートを閉じる**
スイッチャーのプルダウンから「ｘ」でレポートを閉じる操作です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/d8172d82-6c82-8c2e-fcb0-18fc6799a2c8.png)

**6 ダッシュボード実行**
サンプルの「国の比較」を実行します。
※この間のフォルダの移動はこの結果からは除外しています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/8fbeeb7a-7b8e-e272-8402-15ead608cd47.png)

以上です。
何かのお役に立てると良いですが。
PCLを作成するうえで意識するようにしていること。

#【PCLを作成するうえで意識するようにしていること。】

業務でのコーディングが一旦落ち着き、リリースに向けてテストの工程に入ります。
PCL作成をするうえでの個人的な意識づけを書き記しました。

##PCL （Program CheckList）

プログラムが仕様通りに動作するか調べるために作成する検査項目リストである。
→様々なテストケースを想定して、条件を与える。

プログラムをしっかり理解していないといいテストケースを想定できない。

##PCL作成で必要な意識

大前提として、バグのないプログラムはまずない。
また、テストの段階でバグを１００％見つけることもほぼ不可能。
しかし、バグを１００％見つけてやるという意識は超重要。

テストをするシステムは、何が出来て、どんな動作をするのか一通り理解することが大事
機能要件、非機能要件についての理解も必要になる。

自分が作成したPCLを見て、別の誰かがテストをすることもある。
誰でもわかるような簡潔な文章で書き、曖昧な表現は避ける。
プログラム設計書を参考にPCL作成をする場合は、コピペ使うなどをケアレスミスを無くすように努める。

※機能要件、非機能要件についてもQiitaに備忘録として残します。

##テストの初期段階でバグを見つけるために。

作り上げたシステムをバグを出さずにリリースすることが大事である。

テストは、基本的に単体テスト→結合テスト→総合テストの順を歩む。
初期の段階でバグを見つけられた方がコストが低い。
そのため、出来るだけ早くバグを見つけるようにする。

リリースしてから、致命的なバグなどが出てしまえば信頼を大きく損ねることになる。
１度失った信頼を取り戻すことは極めて難しい。規模が大きければ大きいほど。

自信を持ってリリースするためにテストが必要であり、初段階のPCL作成を決して簡単に考えてはいけない。
手を抜くことなどあってはならない。地味でもコツコツこなす。

##さいごに。

テストは、コーディングと比較して全然楽しいものではない。
しかし、プログラムで開発をしていくうえでは欠かせない。
何事にも一生懸命に取り組み、周りからの信頼を積み上げていきたい。

また、今後もテストやテストの自動化など多岐にわたり学習していこうと思う。
openCVでgif動画をループして再生する方法

# Background
現在自作でマイナーなOpenCVを紹介するwebページを作成しています。
https://featurepoints.jp/opencv_doc/

で、データセットとして [GIFMAGAZIN](https://gifmagazine.net/?locale=ja)からGIFをMP4に変換して画像処理をしているのですが、そのまま`cv２.imshow("window name", mat)` で動画再生しようとするとブラウザ表示のようにループして繰り返し表示はせずに短い時間で終了します。

ここでは、`cv2.imshow()`を使って動画再生をループさせる方法を書いてみようと思います。

# gif to mp4
gifからmp4に変換する方法ですが、2つあります。ひとつはgifをブラウザで表示させて右クリックで「名前を付けて動画で保存」を選んで変換する方法です。あともうひとつはffmpegを使って変換する方法です。([FFmpegでgifアニメをmp4に変換する](https://qiita.com/razokulover/items/fe45833c997b338c638a) 参照)

```
ffmpeg -i [gif ファイルパス]  -movflags faststart -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" [mp4 ファイルパス] 
```

# Method
繰り返し表示させる方法は、
1. 一度動画を再生し、すべてのフレームを配列に格納する
2. 無限ループの中に動画を再生
3. 処理中に終了条件を設定
とすればいいです。

# Development

[ESC]で動画が終了しますが、[S]を押すとフレーム画像を保存することができます。

```Python
import numpy as np
import cv2
import argparse

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--src')
    args = parser.parse_args()

    cap = cv2.VideoCapture(args.src)
    fps = cap.get(cv2.CAP_PROP_FPS)
    frames = []

    #一度動画を再生して、フレームを配列に格納する
    while cap.isOpened():
        _ret, frame = cap.read()        
        if frame is None:
            break
        frames.append(frame)
    cap.release()

    end = False
    while True:
        if end:
            break
        for frame in frames:
            cv2.imshow("loop a gif",frame)

            k = cv2.waitKey(int(fps)) & 0xFF

            # ESC で終了
            if k == 27:
                end = True
                break
            # S で画像保存
            elif k == ord("s"):
                cv2.imwrite("output.png", frame)

if __name__ == '__main__':
    main()
```

# Consequence

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/62f9439a-3443-6304-1f0c-72ed0c62b822.gif)

# Afterword
動画(画像)データは[せんとくんを止めろ！GIFゲーム](https://gifmagazine.net/post_images/4264354?locale=ja)を使ってみました。タイミングよくSボタンを押すと"nice"と表示された画像が保存されます。結構捉えるが難しいです。
お手すきの時間にどうぞ:cake:
自然言語処理まわりの便利グッズメモ

#機械学習情報情報集めるぜ
自然言語処理をしてくれる機械学習の実装が必要になりそうでして、せっかくなので使えそうな周辺サービスをちょっとだけ調べてみようと思いました。

#備忘録
・RakutenRapid API (引用元は[ここから](https://api.rakuten.co.jp/ja/))
　初めてみたAPI。世界中のAPIを集めたもの？
　NLP一覧を見るとこんな感じ。すごい優秀。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666990/14d7668d-1e3a-9f0e-1902-ae53969f71f0.png)


・COTOHA API (引用元は[ここから](https://api.ce-cotoha.com/contents/index.html))
　NTTコミュニケーションズが作ったAPI。
　for Developersプランは無料で、各API1000コール/日まで、検証用。
　辞書は基本語辞書というものを使う。日本最大級の辞書かあきになるなあ。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666990/6561e0f3-025b-b136-f142-3942487b1684.png">

・Google Cloud Natural Language (引用元は[ここから](https://cloud.google.com/natural-language?hl=ja))
　GCPの王道。できることはさすが幅広いのう。
　料金は1000文字を1ユニットとして、5000ユニットまで無料。ピンとこねぇ。
　日本語にも対応って買い取るけど日本語１文字とEnglish1letterは同じ1文字判定なの・・・？英語大変そう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666990/a750df98-0e6b-7503-af28-2c38802adcb2.png)

・IBM Cloud (引用元は[ここから](https://ledge.ai/ai-api-allstar/)と[ここから](https://www.ibm.com/jp-ja/cloud/watson-natural-language-classifier))
　月リクエスト1000件まで無料との。
　Tone Analyzerとかもすごい可能性にあふれるAPIだなあ面白そう。
 <img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666990/284471b1-e39d-4b6b-d92b-f42d10559c1f.png">

・リクルート A3RT(引用元は[ここから](https://ledge.ai/ai-api-allstar/)と[ここから](https://a3rt.recruit-tech.co.jp/product/textClassificationAPI/))
　Text Classification APIは自力でモデルの構築もできる様子。
　料金は書いていないけど無料。。。なのか？？
　別サービスで「誤字脱字校正AI」もあるらしく、それも気になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666990/b9c03405-f10e-1055-63a4-01a0c28a8d9c.png)

・Amazon Comprehend (引用元は[ここから](https://aws.amazon.com/jp/comprehend/pricing/))
　料金のケタがバグっててよくわからなかったのでひとまず画像をメモ。
　10Mユニットで1ユニットが100文字ということは1000M文字？で0.01円？？？
　日本語に対応していないようで、Amazon Translateで対応言語に変える必要あり。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666990/467cdae2-cfa1-244e-4974-30f1401d4d20.png)

・Azure Language Understanding (引用元は[ここから](https://azure.microsoft.com/ja-jp/pricing/details/cognitive-services/language-understanding-intelligent-services/))
　調べはしたものの、料金体系がややめんどくさそうで心配。
　トランザクション数なのね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666990/3443d8d8-9c97-de34-84da-b19fcb9d7b32.png)

#考え事メモ
　日本語対応しているか、料金がどうであるかを確認すれば、テキスト処理については性能に差はなさそう。
　音声や動画が絡むと色々考える必要あり
cloud9でRuby on Rails開発環境構築"part3"[Bootstrap/Sass/エラーの日本語]

前回：[cloud9でRuby on Rails開発環境構築"part2"[view層とSlim]](https://qiita.com/T_KEIICHI/items/eb5b33a8c49666bcbbdb "part2")
**メニューバーとかボタンとか、リンクとか、見栄えが良くなるらしいよ！Bootstrap！**
例によってBootstrapと言う**gem**を追加しますので、**Gemfile**に追加します！

```text
#Gemfile(アプリケーションフォルダ直下）

gem 'bootstrap'
```
そして、恒例のbundleでインストール

```terminal
$ bundle
```
Rails new の直後は１つのCSSファイルを読み込むようになっているらしい。
(app/assets/stylesheets/application.css)

他のCSS（**Bootstrap**)は**application.css**から読み込む形で記述していく。

##CSSに効率よく表現できる形式『Sass』

まず、app/assets/stylesheets/application.cssを削除します。

```terminal
$ rm app/assets/stylesheets/application.css
```
代わりに新しく **app/assets/stylesheets/application.scss**
(拡張子が.cssではなく**.scss**にするように気をつけて）

```text
#app/assets/stylesheets/application.scssに

@import "bootstrap";
```
これでapplication.scss(を通じて自動的に生成される application.css)がアプリケーション内の各画面のHTMLから呼ばれるようにすることで、画面をBootstrapのデザインが当たった状態にします。

##.container (コンテナ)
今のままでは画面の見栄えが大きく変わりません。見栄えを具体的に変える為にBootstrapの**コンテナ**と言う部品を使うことにします。
**app/views/layouts/application.html.slim**ファイルを変更します。

```text
doctype html
html*********
******************
******************
body

↓#ここから
  .app-title.navbar.navbar-expand-md.navbar-light.bg-light
     .navbar-brand Taskleaf
  .container
↑#ここまでを追加

    = yield
```
##Railsのエラーメッセージを日本語で出せるようにする
作成するアプリケーションが日本語の場合は日本語翻訳を追加して利用すると良い。
**Github**の**rails-l18n**リポジトリに既に翻訳されたファイルがあるのでそれを利用する。
rawファイルをconfig/locales/ja.ymlとしてダウンロードする。

```terminal
$ wget https://raw.githubusercontent.com/svenfuchs/rails-i18n/master/rails/locale/ja.yml -p config/locales
```
さらに！デフォルトで日本語コンテンツを使うようにアプリケーションの設定を変更する。
**config/initializers/locale.rb**と言うファイルを作成！
中身は。

```text
Rails.application.config.i18n.default_locale = :ja
```
これでとりあえず準備万端！！

な

###はず.....
django + nginx ログイン済みユーザにのみ画像閲覧させる方法

djangoとnginxの組み合わせの際、
画像などの静的ファイルをcollectstaticで取り出してnginxに配置する方法が取られます。

ただし、**nginxに配置するとシステムにログインしなくても静的ファイルが見える**ので、
**ログイン済みのユーザに限定したい画像を配信したい**という要件で使える方法です。

# 前提

nginx → uwsgi → django
という構成で、nginxからdjangoにアクセスできること。

# 方法

djangoに画像URL用のviewを作成する方法です。
djangoのviewを経由するため、システムにログインしないとアクセスできないという仕組みです。

## ファイル構成

```
projectroot
  + projectname
    + settings.py
  + media
    + pictures
      + test.jpg
  + testapp
    + urls.py
    + views.py
```

testappというdjango内アプリケーションにmedia内のファイルにアクセスするviewを定義します。

## ソースコード

```python:settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
```

```python:views.py
from django.http import HttpResponse
import os
from projectname import settings


def picture(request, imgfilename):
    file_path = os.path.join(settings.MEDIA_ROOT , 'pictures/' + imgfilename)

    with open(file_path, "rb") as f:  # rbはread binaryのこと
        imgfile = f.read()
    return HttpResponse(imgfile , content_type="image/jpeg")
```

```python:urls.py
urlpatterns = [
    path('media/<imgfilename>', views.picture, name='picture'),
]
```

## アクセス

http://localhost:ポート/testapp/media/test.jpg
bachrcでなんやかんやしてAtCoderのコンテストの提出等にかかるコストを最小限にした話

# 想定条件
atcoder-cliおよびonline-judge-toolsをインストール済み

未インストールの方は[こちら](https://qiita.com/Adaachill/items/3d4ddad56c5c2cc372cd)を参考にしてください。

### 私の環境
Ubuntu18.04
### 私のAtCoder用ディレクトリの概要
home
┣　AtCoder
　　┣　ABC160
　　　　┣　a.cpp
　　　　┣　b.cpp
　　　　┣　c.cpp
　　　　　　　︙
　　┣　ABC161
　　┣　ABC162
　　　　　︙
　　┣　Contest　//コンテスト用デフォルトディレクトリ

上図のようになっています。詳しく見たい方は[こちら](https://github.com/0ga0takash1/AtCoder
)からどうぞ。
# はじめに
本ページで紹介させていただく関数たちは、
私が使いやすいと感じる、私の私による私のためだけの関数たちです。
また、私がコンテストにC++でしか参加していない影響で、C++にしか対応していません。

不便に感じるところはお好きに改造して各自幸せになってください。
どこかのだれかの参考になれば幸い。

そういったものです。
# やったこと
bashrcで関数をいろいろ作って定番のコマンドを一度に実行できるようにしました。
本記事では、コードやコマンドの意味、役割などの説明は省かせていただきます。

以下、作った関数を4つ紹介します。

## 1. コンテスト用ディレクトリを作り、そのディレクトリをAtomで開く関数
```bash:.bashrc
function accdir () {
    cd　~/AtCoder/;
    cp -a Contest/ $1;
    atom $1;
    cd $1;
}
alias acd=accdir
```
### 使用方法
以下の画像のように、

```none
acd ABC178
```
といった感じで打ち込むことで、
”AtCoder”ディレクトリの中に”ABC178”というディレクトリを新たに作り、
そのディレクトリをAtomで開き、そして端末では”ABC178”ディレクトリに移動しています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440679/5910672b-d43b-7048-fcba-50b19f6eca99.png" width=100%>

## 2. コードテスト、コード提出用ディレクトリを作る関数
atcoder-cliの機能でコードテスト＆コード提出用ディレクトリを作ります。
なぜわざわざディレクトリ名を”s”に変えているのか。その理由は次とそのまた次の関数を見ればわかります。

```bash:.bashrc
function accnew () {
    acc new $1;
    mv $1 s;
}
alias acn=accnew
```
### 使用方法
左下の画像のように一つ前のacdコマンドで作ったディレクトリ内で

```none
acn abc178
```
と打ち込むことで、ABC178のダウンロードする問題を指定するように促されます。
そこで選択し、Enterを押すと、
右下の画像のようにダウンロードされディレクトリが生成されます。

このコマンドは、atcoder-cliの特性上、**コンテストが開始してからしか使えない**ので、ご注意ください。
（すでに終了しているコンテストでは問題なく使えます。）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440679/05d60a97-1060-b977-4437-2d20e6476f56.png" width=49%> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440679/7e80b83a-7c66-4117-f479-e4eb4bc6185a.png" width=49%>

## 3. コードを提出する関数
```bash:.bashrc
function accsubmit () {
    path=$PWD;
    cpp='.cpp';
    name=$1${cpp};
    cp ${name} s/$1/;
    cd s/$1;
    acc submit ${name};
    cd;
    cd ${path};
}
alias acs=accsubmit
```
### 使用方法
下の画像のように、acdコマンドで作ったディレクトリ内で

```none
acs a
```
などと打ち込むことで、問題提出ができます。
第一引数に、`a`を入れるとa問題を提出。`b`を入れるとb問題の提出ができます。

こんな感じ。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440679/5c3c0b99-41d5-3381-7137-106c4e797cf0.png" width=100%>
<img src="" width=100%>

## 4. コードをテストする関数
```bash:.bashrc
function acctest () {
    path=$PWD;
    cpp='.cpp';
    name=$1${cpp};
    cp ${name} s/$1/;
    cd s/$1;
    g++ ${name};
    oj t -d ./tests/;
    cd;
    cd ${path};
}
alias act=acctest
``` 
### 使用方法
下の画像のように、acdコマンドで作ったディレクトリ内で

```none
act a
```
などと打ち込むことで、テストケースの検証ができます。
第一引数に、`a`を入れるとa問題を、`b`を入れるとb問題のテストができます。

こんな感じ。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440679/3726a080-5d0e-4f6d-f40e-e9760ef3192e.png" width=100%>
# さいごに
[こちら](https://github.com/0ga0takash1/Hakidame/blob/master/bash/.bashrc)で随時更新したものをあげているので、最新バージョンを見たい方はどうぞ。

皆さまも快適なbashライフをお過ごしください〜！

では。
EKSでMattermostを構築した話：0.概要編

## はじめに
- 社内の方針でKubernetesの知識を身に着けていくために、まずはEKSでMattermostを動かしてみようという話になりました。
- せっかく与えて頂いた機会なので、手を動かして構築を進めました。その結果、一応最低限のMattermostの機能は利用できるようになってきたので、ここまでの対応内容を数回に分けてアウトプットしていきたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415280/8388fe28-dbbc-9cbf-5229-bb137aed7b2a.png)
    - こんな感じでMattermostが動いています。

- 以下に構築内容の概要をまとめます。

## 構築した内容の概要
1. VPC作成
1. EKSクラスター作成
1. EKSクラスターでアプリケーションを稼働させる前にセットアップしておくべきツール
1. Mattermostのインストール
1. Mattermost Configの設定

## もう少し詳しい概要

### 1. VPC作成
- CustomerVPCの作成(CFn)
- 踏み台サーバの作成(CFn)

### 2. EKSクラスター作成
- eksctlでクラスター作成

### 3. EKSクラスターでアプリケーションを稼働させる前にセットアップしておくべきツール
- IRSA
- ALB Ingress Controller
- external dns
- Metrics Server
- Amazon EFS CSI ドライバー

### 4. Mattermostのインストール
- helm Chartsを利用したインストール

### 5. Mattermost Configの設定(helmのチューニング)
- S3連携
- RDS連携
- SMTP連携
- EFS連携
- ローリングアップデート
- fsGroupの設定
- 設定ファイルの扱い方

## まとめ
- というわけで、今後は概要に記載した内容について、順次掘り下げていきたいと思っています。

## 関連記事
- [EKSでMattermostを構築した話：1. VPC作成編 - Qiita](https://qiita.com/tnagano1981/items/75408d509c0660408c97)
- [EKSでMattermostを構築した話：2. EKSクラスター作成編 - Qiita](https://qiita.com/tnagano1981/items/fc5d96ddf9a3b5c4fb03)
- [EKSでMattermostを構築した話：3-1. EKSクラスターでアプリケーションを稼働させる前にセットアップしておくべきツール編 - Qiita](https://qiita.com/tnagano1981/items/c91d27fa2e286a96b6ff)
- [EKSでMattermostを構築した話：3-2. EKSクラスターでアプリケーションを稼働させる前にセットアップしておくべきツール編 - Qiita](https://qiita.com/tnagano1981/items/b477f3a6a21038b76db2)
- [EKSでMattermostを構築した話：4-1. Mattermostのインストール(helm理解編) - Qiita](https://qiita.com/tnagano1981/items/9c36cf9f0a6196fcf865)
- [EKSでMattermostを構築した話：4-2. Mattermostのインストール(helm適用編) - Qiita](https://qiita.com/tnagano1981/items/289d375135f64f5241a2)
- [EKSでMattermostを構築した話：5-1. Mattermost Configの設定(helmのチューニング01) - Qiita](https://qiita.com/tnagano1981/items/9e06f71c25ceccfaf6fb)
- [EKSでMattermostを構築した話：5-2. Mattermost Configの設定(helmのチューニング02) - Qiita](https://qiita.com/tnagano1981/items/f98b8d6455c5a93d6f2c)
Linux で録音と再生

モノラルで録音

```text
$ arecord -t wav -d 5 mono.wav
録音中 WAVE 'mono.wav' : Unsigned 8 bit, レート 8000 Hz, モノラル
```

録音を再生

```text
$ aplay mono.wav 
再生中 WAVE 'mono.wav' : Unsigned 8 bit, レート 8000 Hz, モノラル
```


ステレオで録音

```text
$ arecord -t wav -d 5 -c 2 stereo.wav
録音中 WAVE 'stereo.wav' : Unsigned 8 bit, レート 8000 Hz, ステレオ
```

録音を再生

```text
$ aplay stereo.wav 
再生中 WAVE 'stereo.wav' : Unsigned 8 bit, レート 8000 Hz, ステレオ
```

Ubuntu 20.04 で確認しました。
フロントエンドのメインコンテンツに画像や文字を入れていく方法

フロントエンドのメインコンテンツに画像や文字を入れる基本的なコーディングを解説していきます

```html:html

<div class="contents">
 <h3>文字を入れる</h3>
 <div class="contents-item"><img src="画像urlを入れる">
  <p>文字を入れる</p>
 </div> 
 <div class="contents-item"><img src="画像urlを入れる">
  <p>文字を入れる</p>
 </div> 
 <div class="contents-item"><img src="画像urlを入れる">
  <p>文字を入れる</p>
 </div>
 <div class="contents-item"><img src="画像urlを入れる">
  <p>文字を入れる</p>
 </div>
</div>
```

以上になります。
railsでNameError:

出会ったことのないエラーのためメモ代わりに

specを使用した単体テストコードでFactoryBotを使用すると下記のエラーが、、![スクリーンショット 2020-09-30 0.47.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/729084/d1309529-b9d7-fc1b-ac55-686eb53d9da3.png)

FactoryBotないの記述は問題なさそう、、
ググるとconfigの中をいじるか、buildされている側にclassの指定をしてあげればいいとのこと。
今回はclassをしてありそうでconfigを確認しようと、ふと思ったのがそもそもFactoryBotのgem入れてない！と気付き早速導入。
改善したと思ったら今度は下記のエラーが、、![Name Error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/729084/e584ff99-1f99-397e-2812-897295dbf277.png)

これも同じでFakerのgemを入れてないですね。
GemfileにFactoryBot、Fakerを記述し、忘れずにbundle install
rails sでサーバーを再起動後改善しました。

結構自分はGemfileへの記述を忘れてしまいます。。
基礎以前の話になりますが、config内の設定を変更する前でよかった。
SQL Server 構成情報確認SQL


## バージョン情報

```
Select @@version
go
```

```
SELECT  
  SERVERPROPERTY('ProductVersion ') AS ProductVersion
  , SERVERPROPERTY('ProductLevel') AS ProductLevel
  , SERVERPROPERTY('ResourceVersion') AS ResourceVersion
  , SERVERPROPERTY('ResourceLastUpdateDateTime') AS ResourceLastUpdateDateTime
go  
```

https://docs.microsoft.com/ja-jp/sql/database-engine/install-windows/latest-updates-for-microsoft-sql-server?view=sql-server-ver15

## 言語設定・ソート順序

```
SELECT
  SERVERPROPERTY('InstanceName') AS InstanceName
  , SERVERPROPERTY('MachineName') AS MachineName
  , SERVERPROPERTY('Collation') AS Collation
  , SERVERPROPERTY('CollationID') AS CollationID
  , SERVERPROPERTY('ComparisonStyle') AS ComparisonStyle
  , SERVERPROPERTY('LCID') AS LCID
  , SERVERPROPERTY('SqlCharSet') AS SqlCharSet
  , SERVERPROPERTY('SqlCharSetName') AS SqlCharSetName
  , SERVERPROPERTY('SqlSortOrder') AS SqlSortOrder
  , SERVERPROPERTY('SqlSortOrderName') AS SqlSortOrderName
go
```
## パラメータ設定情報

```
SELECT * FROM sys.configurations
go
```

参考：パラメータ設定更新
```EXEC sp_configure 'default language', 3 ;```


## データベース

```
SELECT
	database_id
	,suser_sname(owner_sid) as 'owner_name'
	,name
	,state_desc
	,recovery_model_desc
	,compatibility_level
	,collation_name
	,create_date
FROM sys.databases
;
```


## データファイル

```
select
  d.database_id
  ,d.name
  ,m.file_id
  ,m.name
  ,m.type_desc
  ,m.physical_name
  ,m.state_desc
  ,m.size
  ,m.max_size
  ,m.growth
  ,m.is_percent_growth
  ,m.is_read_only
from sys.master_files m
inner join sys.databases d
on (m.database_id = d.database_id)
order by d.database_id,m.file_id
;
```