OmniAICreator/Qiita-1.07M huggingface dataset:
Splunk BOSS of the SOCを可視化（Parallel Coordinates）

[Sankey Diagram](https://qiita.com/toshikawa/items/c27439bdf839dbb41bc9)に引き続き、Parallel Coordinatesも

ダウンロードは[ここ](https://splunkbase.splunk.com/app/3137/)、使い方は[ここ](https://docs.splunk.com/Documentation/ParallelCoordinates/1.3.0/ParallelCoordinatesViz/ParallelCoordIntro)

こちらは拍子抜けするくらい簡単だった。

```Splunk:SPL
index=botsv1 sourcetype="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational"  EventCode=3 src=*srv.waynecorpinc.local 
| table src dest app
```

[その５](https://qiita.com/toshikawa/items/c549c65bfc3b3a048c49)にでてきたC＆Cサーバの挙動をSysmonのログから可視化してみる。

##結果
![qiita3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130729/68054e6b-4be0-e941-acc4-f98416e070a3.png)

##解説
[EventCode=3](https://www.ultimatewindowssecurity.com/securitylog/encyclopedia/event.aspx?eventid=90003)でサーバのネットワークの挙動を検索
どのプログラムが動いているのかを表示してみた。

単純に表示したいものを`table`にすると表示してくれるのでとても簡単。

なお、端末の挙動を検索するとBOT化されているのがわかる。
今回は表示量の削減のために除いた。

表示の一番最後あたりに__3791.exe__が見える。

##まとめ
とりあえず一通りみるには便利かも。
表示量が多いと省略されてしまうので、そこだけ注意しなければいけない。

:sweat:Sysmonいいな。
AWS認定　ソリューションアーキテクト プロフェッショナル（SAP）対策

先日、AWS認定のソリューションアーキテクトプロフェッショナル（SAP）の試験を受けてきたのでそれの対策を投稿します。

筆者のAWSレベル
---
* 3年ほど前に、EC2を使ったサーバー構築や、Route53、DirectConectなどを使って、既存データセンターとAWSを接続するなどの、インフラよりの構築経験あり。その後、AWSに携わるプロジェクトには巡りあえず、触る機械はなし。プライベートの趣味で少しコンソールを触る程度。
* AWS認定のソリューションアーキテクトアソシエイト（SAA）は取得済み。AWSの基本的な理解はあり。

対策１：AWS WEB問題集
---
https://aws.koiwaclub.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319276/566fc3d8-6503-20d6-0651-040e1f7f906e.png)

SAPプランは有料ですが、正直受験後に言えるのはこれはめちゃくちゃ使える。ほぼ同様の内容もかなり出題された印象があり、最短で勉強するならこれをひたすら勉強するのが良いかと思われる。購入する価値めちゃくちゃあり！！

対策2：udemyのAWS問題集
---
https://www.udemy.com/

かなり問題集も豊富でかなり試験対策としては有用です。こちらも有料ではあるが、問題集もたくさんある。ただSAPの問題集は英語しかなかった。。SAAは日本語あるっぽいが。。

対策3：AWS Well-Architected Framework
---
https://aws.amazon.com/jp/architecture/well-architected/

AWSが公式で発表している、システム設計・運用における大局的な考え方やベストプラクティスが記載されている.
別名ウェルアーキ。AWSの人もこれをよく読んでいるとのこと。
直接の試験対策には繋がらならないかもしれないが、大枠を捉えるのに読むことは有意義。

対策４：AWSトレーニング
---
* 無料：Exam Readiness: AWS Certified Solutions Architect – Professional 
 https://aws.amazon.com/jp/training/?nav=tc&loc=1  
AWSが提供する無料のe-learning。SAP対策で現時点では英語しか無いが予備問題などもあり。

* 有料：Advanced Architecting on AWS 
https://aws.amazon.com/jp/training/course-descriptions/advanced-architecting/  
料金は２０万ほど、対象はSAAを取得済みで、さらに踏み込んだレベルを勉強したいひとが受けるコース。SAP向けの対策コースという位置付けも含んでおり、内容は幅広いが試験対策などもアドバイスをもらえた。グループディスカッションなどもあり自身の知識を再認識するばとしてもよかった。ただ高いので自腹でうけるのは厳しい。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319276/2bb6ff79-4d80-4f65-ebf5-3cf9860beefe.png)

* 有料：予備試験 
4000yenで受けれる。一度どれくらいの実力があるか受けてみるとよい！


その他
---
* ブラックベルト：  
　各サービスのの詳細など弱い部分の補強に使える。ただ多すぎるのとどれをすれば良いかわからなくなるため、網羅的に対策するときになかなか使えない。
* クラウドデザインパターン：  
ウェルアーキ同様大枠を捉えるのによい。ただし2019/10/6の時点でwebにアクセスできず。併催した？


まとめ
---
自分がソリューションアーキテクトプロフェッショナルを受けるに当たって対策をまとめました。個人的にはWEB問題集が一番よかったかと。同じようなWeb問題集と同じような問題が出題されていたのは驚いた。(WHY?)
ちなみに自分は会社からAWS研修も参加させてもらい受験したにも関わらず、受からなかったので別途再受験予定です。やっぱりプロフェッショナルはかなり深い要素を求められるため、実際の構築経験などがないと厳しい印象。。
今回の情報が今後受ける人に有用になれば幸いです。
SAP Cloud PlatformのABAPトライアル環境を触ってみる(2.テーブル作成とデータ登録)

#はじめに
SAP公式チュートリアルを参考に、ABAPトライアル環境を触ってみたいと思います。

#前提
以下の初期設定が完了している状態から始めます。
[SAP Cloud PlatformのABAPトライアル環境を触ってみる(1.初期設定編)](https://qiita.com/mahko2/items/8e26b2c6986478958b57)

また、ABAP RESTful Programming Modelについては以下をお読みください。
[Get to Know the ABAP RESTful Programming Model](https://developers.sap.com/tutorials/abap-environment-restful-programming-model.html)


#今回使用するチュートリアル
2019/10/05時点のチュートリアル(SAP公式)をもとに書きます
チュートリアルの説明が基本的にはわかりやすいため、私が躓いたところや、気になった箇所のみ記載していこうと思います。

今回の参照元チュートリアルはこちら↓。こちらを見ながら当記事を読んでください。
[Create Table Persistence and Generate Data](https://developers.sap.com/tutorials/abap-environment-persistence.html)


#Step 1: Step 1: Create ABAP package

パッケージ名XXXについてですが、ABAP Trial環境は共有環境であるため、重複しないものを。

#Step 2: Create database table

こちらのテーブル名のXXXも同様に重複しないものを。

#Step 3: Create ABAP class

ここでは、STEP2で作成したテーブルへのデータ登録(INSERT)と、出力処理(WRITE)を行っています。
ソースコードもシンプルなため、理解は簡単かと思います。

#Step 4: Test yourself
ご自身で♪

これでおしまい。
UITableViewDiffableDataSourceを使ってみよう

記事の内容はこちらを参照してください。
https://mishimay.github.io/e5cd61b55a1011c93190/
<!--



## UITableViewDiffableDataSourceでできること

UITableViewDiffableDataSourceは以下の2つの整合性を担保してくれます。

  - UITableViewのデータソース
  - UITableViewのCell表示とアニメーション

これにより、UITableViewのよくあるクラッシュ要因であるCellの追加・削除・移動時のデータソースとCell表示アニメーションの不整合を防ぐことができるようになります。

iOS 13 以上がターゲットのプロジェクトではよほどのことがない限りUITableViewDiffableDataSourceを使うのがおすすめです。


## 実装例
```swift
class MyTableViewController: UITableViewController {

    // Hashableに準拠したSection・Item用の型を用意。
    enum Section: CaseIterable {
        case top
        case main
    }
    struct Item: Hashable {
        let title: String
        let detail: String
    }

    // dataSourceを用意。
    private lazy var dataSource: UITableViewDiffableDataSource<Section, Item> = {
        let dataSource = UITableViewDiffableDataSource<Section, Item>(tableView: tableView) { (tableView, indexPath, item) -> UITableViewCell? in
            let cell = tableView.dequeueReusableCell(withIdentifier: "MyIdentifier", for: indexPath)
            cell.textLabel?.text = "\(item.title) \(item.detail)"
            return cell
        }
        // アニメーション方式を指定。
        dataSource.defaultRowAnimation = .fade
        return dataSource
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "MyIdentifier")

        // tableViewのdataSourceに指定。
        tableView.dataSource = dataSource

        // 表示したいデータをsnapshotに入れてdataSourceに反映する。
        // snapshotは現在のdataSourceを元に作ることもできる。
        // `var snapshot = dataSource.snapshot()`
        var snapshot = NSDiffableDataSourceSnapshot<Section, Item>()
        snapshot.appendSections(Section.allCases)
        snapshot.appendItems([Item(title: "title", detail: "detail")], toSection: .main)
        dataSource.apply(snapshot)
    }

}
```


## 環境
Xcode 11.1
Swift 5



-->
Macのトラックパッドの設定をしよう

# はじめに
Webアプリケーションを作るぞ！とMacbookProなどを購入したけど、トラックパッド使いにくい！
クリックするのに押し込んだり、ドラッグするのに左手でクリックしながら右手でカーソル動かすとかやりずらすぎる！

という方向け。
~~というより設定してもらうと私が触るときに操作しやすい~~



# タッチしてクリックできるようする
システム環境設定→トラックパッド

画像のようにチェックボックスにチェックを入れる
<img width="668" alt="トラックパッド１.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489761/1bde1817-8470-29d7-2260-d5b4a29de8fa.png">

<img width="668" alt="トラックパッド２.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489761/e1aa324e-f46f-2fd8-b60d-69e293877f8f.png">

<img width="668" alt="トラックパッド３.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489761/bcdc6870-12e7-e1f9-7a89-f3390e336626.png">

# ３本指ドラッグを有効にする
設定→アクセシビリティ→マウスとトラックパッド→トラックパッドオプション

画像のようにチェックボックスにチェックを入れてセレクトボックスを「３本指のドラッグ」にする
<img width="375" alt="３本指.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489761/5d3b2602-f789-26cc-0f61-471dacc54971.png">


# 最後に
Macのトラックパッドは（個人的に）Windowsの追随を許さない便利さです。
しかし、設定を怠るとその素晴らしさも失われてしまいます。
「不便だな〜」と思ったら、"トラックパッド　おすすめ設定"とかでググると
いろんな情報が出てくると思いますので、自由にカスタマイズしちゃいましょう。
ddrescueでセクター不良が出てたHDが復旧できた

# PCを抱えて新しい(中古の)パソコンがほしい…パターン

ddrescueでセクター不良が出てたHDが復旧できたのでご報告。パソコンを抱えて新しい(中古の)パソコンがほしいということでご来店、話を聞いていくとどうやら今まで使っていたものが動かなくなったので新しいものがほしいとのこと、PCを起動してみるとOSが起動しない。win10が入ってるらしいのでOS再インストで行けるかなーと思ったけど、その前に簡単にハードの動作確認。メモリは正常、HDに不良セクタがいくつかある模様。(あー今時珍しくOSやちゃってるパターンね)。データいるかどうか聞いたら、いるって言うからやるだけやってみるけど、ダメかもよ。ほんとにデータ欲しいならデータ復旧屋さんってあるからそっち持って行ったほうがいいと思うけどどうって聞いたら、だめならだめでいいっていうから、やるだけやった。結果、セクター不良9カ所で最終的に読み出しできなかったのは1セクター。

# /dev/sdaから/dev/sdb に書きだす
内蔵ディスクは終了しちゃってるので別のディスクに書きだしてHDごとを交換する感じで進める計画。UbuntuをUSBに入れてるのがあるのでそれでPCを起動、DiskUtilityで内蔵のディスクを確認し、外付けUSBに同じ容量のHDをつなげて読み込み元と書きだし先(sdaとsdbが間違ってないか)をちゃんと確認。あとは以下コマンドを一つづつ実行。とは言え、うちクラスの片手間中古屋さんからすれば500GのHDでまともな状態なのなんてめったに入ってこないけどみたいな状態になるも、とりあえずデータが移せればいいやということで、SMARTエラーが出てないやつを何とか発見。起動時間えぐいことになってますけどってなるも、悪魔のささやきで一蹴。

```console
$ sudo ddrescue -f -n /dev/sda /dev/sdb logfile     
$ sudo ddrescue -d -f -r3 /dev/sda /dev/sdb logfile  
```
一回目は不良セクタ以外をコピって、2回目で不良セクタ部分を3回リトライ。
最後にHDを交換してPCを起動、ちゃんと起動できた。交換したHDもそこそこやばいということと、完全に復旧したいならデータ復旧やさんがあるからそういうとこにもってけばやってくれると思うよって教えてあげておしまい。




# 参考文献
[死にかけのHDDからのデータ吸い出しには GNU ddrescue が良いらしい](https://over80.hatenadiary.jp/entry/20140407/ddrescue)
CentOS8でVSCodeでRemote開発できるようにする

# はじめに
VirtualBoxにCentOS8をインストールして、VSCodeで `Remote - SSH` で繋ぐまでの流れをここに記します。

インストールしたCentOS8のソフトウェアは『最小限のインストール』を選択しています。
インストールするときの注意点は、全てのネットワークにちゃんと『この接続が利用可能になったときに自動的に接続する』のチェックを付けることです。
また、インストール完了後にドライブの自動アンマウントがされていないので、手動でアンマウントすることを忘れないでください。おそらく、インストール完了の再起動で、再びインストール選択画面になります。

# VSCodeのRemote開発までにしておきたい準備
- 公開鍵認証によるSSHログイン
    - Remoteログインの簡略化のため
- sudo権限を付与
    - 開発時に必要になることが予想されるため
- インストールパッケージの更新
    - 脆弱性などへの対応のため

## 公開鍵認証によるSSHログイン
### （クライアント）鍵の準備

```.sh
ssh-keygen -t rsa -f ~/.ssh/develop_rsa
scp ~/.ssh/develop_rsa.pub develop:.
```

### （サーバー）公開鍵を登録

```.sh
mkdir ~/.ssh
cat develop_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh/
```

一度ログアウトして、パスワード無しでログインできることを確認してください。

## sudo権限の付与
まずは、rootユーザーに `su -` でログインします。
ログインが完了したら、対象のユーザーに `wheel` グループを付与します。

```.sh
gpasswd -a develop wheel
groups develop
```

グループの付与が完了したら、一度sshからもログアウトして、再度sshでログインしてください。
その後、 `wheel` グループが付与されていることを確認してください。

## インストールパッケージの更新
```.sh
sudo dnf update
```

おそらくカーネルもアップデートされていると思うので、再起動します。
カーネルのデフォルトに指定されているものを `sudo grubby --default-title` で確認しておきましょう。
新たにインストールされたカーネルのバージョンが指定されているはずです。

# VSCodeのRemoteSSHを試す
もし、VSCodeの拡張機能として `Remote - SSH` をインストールしていない場合は、インストールしてください。

左側にあるActivityBar内にあるRemoteExplorerから、 `develop` にアクセスしてみましょう。
すると、エラーとなり、アクセスできないことと思います。
そのエラーをこれから解決していきましょう。

## `tar` がない
実際にアクセスしてみると、以下のようなログが出力されて、エラーになります。

```.log
remote-ssh@0.46.1
win32 x64
SSH Resolver called for "ssh-remote+develop", attempt 1
SSH Resolver called for host: develop
Setting up SSH remote "develop"

（中略）

> Installing to /home/develop/.vscode-server/bin/b37e54c98e1a74ba89e03073e5a376128
> 4e3ffb0...
> 
> Downloading with curl

（中略）

> Download complete
> bash: 行 188: tar: コマンドが見つかりません
> mv: 'vscode-server-linux-x64*/*' を stat できません: そのようなファイルやディレ 
> クトリはありません
> WARNING: tar exited with non-0 exit code
> WARNING: /home/develop/.vscode-server/bin/b37e54c98e1a74ba89e03073e5a3761284e3ff
> b0/node doesn't exist. Download/untar may have failed.
> WARNING: /home/develop/.vscode-server/bin/b37e54c98e1a74ba89e03073e5a3761284e3ff
> b0/server.sh doesn't exist. Download/untar may have failed.

（中略）

"install" terminal command done
Install terminal quit with output: a3cf400d-2c9d-47b9-8a86-bd67fcc560d4##32##
Received install output: a3cf400d-2c9d-47b9-8a86-bd67fcc560d4##32##
The VS Code Server failed to start
TELEMETRY: {"eventName":"resolver","properties":{"outcome":"failure","reason":"ExitCode"},"measures":{"resolveAttempts":1,"exitCode":32,"retries":1}}
------
```

このログによると、エラーの原因は `tar` コマンドがないことです。
どうやら『最小限のインストール』を選択してインストールをすると、 `tar` パッケージがインストールされていないようです。
なので、 `tar` パッケージをインストールすれば解消されます。

```.sh
sudo dnf install tar
```

`tar` のインストールが完了すれば、RemoteSSHをもう一度試してみましょう。
アクセスできる状態になっていることと思います。
Alexa Skill 開発のためにやったこと

#はじめに
内定先からの課題で、Alexa Skill開発をすることになりました。
Alexa Skillについて何も知らない状態で、その時にしたことやつまづいたことの備忘録です。

#やったこと
1.　何をしたらいいか調べる
2.　公式のチュートリアルをする
　　-  [Alexa公式 動画シリーズ「Alexa道場」](https://developer.amazon.com/ja-JP/alexa/alexa-skills-kit/webinars)
　　-  [Alexaスキル開発トレーニング ブログで基礎から学んでみよう](https://developer.amazon.com/ja-JP/alexa/alexa-skills-kit/training/build-a-skill)
3.　開発に必要なすべき事をもう一度理解する
　　-  クライアント側　→　インテントが必要
　　-  サーバー側　　　→　Lambdaが必要


#つまづいたこと
- Lambdaへアップロードするファイルは大元のファイルではなく、子階層のもの
    - Eg.)MyAlexaSkillというファイルに、nodeのファイルやindex.js等が入っているとする。
   この時、MyAlexaSkillを圧縮するのではなく、その下のnodeのファイルやindex.js等をまとめて圧縮するべし。
- ユーザーの発話にはslotが不可欠。自由発話は非推奨。
- ユーザーの発話をトリガーとしてLambdaを動かせる。
- インテントから別のインテントへ飛んで欲しかったので、インテントチェーンというやり方もある。
    - [インテントチェーンを使って別のインテントのダイアログを管理する](https://developer.amazon.com/ja/blogs/alexa/post/b3939b11-5cef-4598-b2f9-c7ad904e1692/understanding-intent-chaining)

#終わりに
- IAMロールの設定やアカウントの作成などつまづき易いところは先人の方々がまとめて下さっていました。
- 開発者コンソールにログインしたアカウントで、Amaon Alexaアプリにログインし、実機ではないですが、実機テストとしました。アプリ下部の真ん中のボタンを押した上で話しかけると開発物を試せます。

#参考
[ASK SDK V2 for Node.js - PersistenceAdapter の使い方](https://qiita.com/toshimin/items/7c2ff8d61052cf59824a)
生年月日の入力セレクトボックスを動的に変化させる

# はじめに
ユーザー登録を行うとき、生年月日を入力してもらうためにセレクトボックスを
用いるとします。ここで、生年月日のセレクトボックスの中身にHTMLやhamlで
直接データを入れ込んでしまうと4/31や2/31などが選択できてしまいます。

なので、年と月の情報をもとに日のセレクトボックスの中身を動的に変化させてみます。
実装にはJavascriptを用います。
（JQueryが入っているのでJavascriptのみの場合と記述方式が異なります）

# 環境
Rails 5.2.2.1
Ruby 2.5.1
jquery-rails 4.3.5
haml-rails 2.0.1

# 完成したもの

```ruby:app/views/入力フォームが書いてあるファイル
= f.select :birth_year,["--"], {},{class: "セレクトボックスを修飾するクラスを入れる", id:"select_birth_year"}
  %label
    年
= f.select :birth_month, ["--"], {},{class: "セレクトボックスを修飾するクラスを入れる", id:"select_birth_month"}
  %label
    月
= f.select :birth_day, ["--"], {},{class: "セレクトボックスを修飾するクラスを入れる", id:"select_birth_day"}
  %label
    日
```

```javascript:app/assets/javascripts/registration.js
$(document).on('turbolinks:load', function () {
  // ユーザーの誕生日の閏年を動的に変化させる
  // 誕生日の配列を宣言
  var birth_year = [];
  var birth_month = [];
  var months = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

  // 現在の年を取得する
  var date = new Date();
  var this_year = date.getFullYear();
  var oldest_year = 1900;

  // 誕生年月の配列を自動生成
  for (var i = this_year; i >= oldest_year; i--) {
    var year = { var: i, txt: String(i) };
    birth_year.push(year);
  }
  for (var i = 1; i <= 12; i++) {
    var month = { var: i, txt: String(i) };
    birth_month.push(month);
  }
  // hamlの年と月のセレクトボックスに配列内容を反映させる
  for (var i = 0; i < birth_year.length; i++) {
    $("<option>", {
      value: birth_year[i].var,
      text: birth_year[i].txt
    }).appendTo('#select_birth_year');
  }
  for (var i = 0; i < birth_month.length; i++) {
    $("<option>", {
      value: birth_month[i].var,
      text: birth_month[i].txt
    }).appendTo('#select_birth_month');
  }

  // 年、もしくは月のセレクトボックスの中身に変更があったら日の内容を変更する
  $('#select_birth_year, #select_birth_month').change(function () {
    // 日が入っているセレクトボックスの中身を空っぽにする
    $('#select_birth_day').empty();
    // 日が入るセレクトボックスにデフォルト値の'--'を入れる
    $("<option>", {
      text: '--'
    }).appendTo('#select_birth_day');
    // ２月の日にち、すなわちmonths[1]を28にセットし直す
    months[1] = 28;
    //　年と月に入力されている情報を取得する
    var year = $('#select_birth_year').val();
    var month = $("#select_birth_month").val();
    // yearとmonth共に数字が入力されている、すなわち共に'--'でないときに実行
    if (year != '--' && month != '--') {
      // monthに２月が選択されている時実行
      if (month == 2) {
        // yearが閏年の時、2月の日付が格納されているmonths[1]の値を29にする
        if (year % 4 == 0 && year % 100 == 0 && year % 400 == 0) {
          months[1] = 29;
        }
      }
      // 日を入れる配列を宣言し、閏年を考慮したデータを格納してhamlの日の
      // セレクトボックスに反映させる
      var birth_day = []
      for (var i = 1; i <= months[month - 1]; i++) {
        var day = { var: i, txt: String(i) };
        birth_day.push(day);
      }
      for (var i = 0; i < birth_day.length; i++) {
        $("<option>", {
          value: birth_day[i].var,
          text: birth_day[i].txt
        }).appendTo('#select_birth_day');
      };
    };
  });
});
```
2019-10-06 LPC > LPCXpresso54628 > bug? > GPIO > 二入力の割込を認識しない

```txt:動作環境
OS: Ubuntu 18.04 LTS
基板: LPCXpresso54628
IDE: MCUXpresso IDE v11.0.1 [Build 2563] [2019-09-01]
```

### 概要

- GPIO割込のSDKサンプルgint.cがある
- 一入力の割込: 正常動作
- 二入力の割込: 認識しない

### 準備と実行

1. Quickstart PanelからImport SDK example(s)... を選択
2. driver_examples > gint を選択
3. 他の設定はデフォルトのままとしてプロジェクトを作成
    - プロジェクト名(例: 191006_1100_GPIO_interrupt)
4. gint.cをビルドして実行する
    - 一入力の割込(GINT0): SW2 > 正常動作
    - 二入力の割込(GINT1): SW3 or SW4 > 認識しない

SW3 or SW4のところをSW3だけにすると認識するため、SW3が壊れているということではなさそう。

SDK exampleで正常動作する環境と、異常動作になる環境があるのだろうか?

```gint.c
/* Select one input, active low for GINT0 */
#define DEMO_GINT0_POL_MASK ~(1U << BOARD_SW2_GPIO_PIN)
#define DEMO_GINT0_ENA_MASK (1U << BOARD_SW2_GPIO_PIN)

/* Select two inputs, active low for GINT1. SW2 & SW3 must be connected to the same port */
#define DEMO_GINT1_POL_MASK ~((1U << BOARD_SW3_GPIO_PIN) | (1U << BOARD_SW4_GPIO_PIN))
#define DEMO_GINT1_ENA_MASK ((1U << BOARD_SW3_GPIO_PIN) | (1U << BOARD_SW4_GPIO_PIN))
```


### 関連

- [Group GPIO input interrupt for Two pins (or more) cannot trigger well.](https://community.nxp.com/thread/417620)
    - > 1. When you set the OR mask here, the first button triggers the interrupt, so the second button is not recognized as a new state (no interrupt).
CentOS7 系で squid が利用できる file descriptor の数を増やす方法

以下の記事と関連しています。
https://qiita.com/intrajp/items/01752dbe12a617f8b617

結論から言うと、Systemd により動作しているデーモンは、/etc/security/limits.conf を読まないので、
設定しても意味がありません。

```
#This file sets the resource limits for the users logged in via PAM.
#It does not affect resource limits of the system services.
```

むしろ、単独にオーバーライドしたい値のみを設定できます。

現在の値を確認します。

```
$ cat /proc/<PID>/limits
Limit Soft Limit Hard Limit Units
...(snip)...
Max open files 1024 4096 files
...(snip)...
```

以下のファイルに記述します（コマンドで作成可能です）。

```
/etc/systemd/system/<サービス名>.service.d/override.conf
```

コマンドですが、以下のとおりです。

```
# systemctl edit squid.service
```

override.conf には、オーバーライドする設定を記述します。
ただし、設定する値は、/proc/sys/fs/nr_open 未満にする必要が
あります。
（一例）

```
[Service]
LimitNOFILE=10000
```

最後に、次のコマンドを実行します。

```
# systemctl restart squid
```

もう一度、以下のコマンドを実行して確認しましょう。

```
$ cat /proc/<PID>/limits
```

（参考）
man 5 systemd.exec
 PROCESS PROPERTIES
AWS CDK CLIをデバッグする

GitHubからCloneした[AWS CDK CLI](https://github.com/aws/aws-cdk)をローカルでデバッグする手順をまとめました。
もっと効率いい方法があったら教えて下さい！

# Overview
1. `tsc`, `tslint` をインストール
2. `pkglint`, `cdk-build-tools`, `awslint`, `cdk`をビルド
3. jsファイルにdebuggerを仕込む
4. ビルドしたCDK CLIで任意のCDKアプリケーションを実行

toolsとCDK CLI本体の依存関係はこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96286/aa2e8e95-0f94-30d9-ca8c-f9123b022950.png)

# 1. `tsc`, `tslint` をインストール

```
npm install -g tsc
npm install -g tslint
```

# 2. `pkglint`, `cdk-build-tools`, `awslint`, `cdk`をビルド

※パスは適宜読み替えてください。

```
cd aws-cdk/tools/pkglint
npm run build
```

```
cd aws-cdk/tools/cdk-build-tools
PATH=$PATH:~/.ghq/github.com/aws/aws-cdk/tools/pkglint/bin
npm run build
```

```
cd ~/.ghq/github.com/aws/aws-cdk/tools/awslint
npm run build
```

```
cd aws-cdk/packages/aws-cdk
PATH=$PATH:~/.ghq/github.com/aws/aws-cdk/tools/cdk-build-tools/bin
PATH=$PATH:~/.ghq/github.com/aws/aws-cdk/tools/awslint/bin
npm run build
```

# 3. jsファイルにdebuggerを仕込む

nodeアプリケーションのデバッグ方法は以下を参照してください。
https://nodejs.org/api/debugger.html

```
vi aws-cdk/packages/aws-cdk/bin/cdk.js
```

結果として、こんな感じになります。

```cdk.js
    async function cliSynthesize(stackNames, exclusively) {
        // 省略......
        debugger; // debuggerを仕込む。
        appStacks.processMetadata(stacks);
```


# 4. ビルドしたCDK CLIで任意のCDKアプリケーションを実行

```
cd ${APPLICATION_DIR}/cdk
node inspect ~/.ghq/github.com/aws/aws-cdk/packages/aws-cdk/bin/cdk synth -v
```

以上です。
UiPathで列の数字の合計を計算したい場合

UiPathでロボットを開発するとき、しばしばvb.netの知識を求められることがあります。

今回は、UiPathで列の数字の合計を計算したい局面が出てきたので、それをメモ代わりに残しておきたいと思います。

# 単純に列の数字の合計を計算したい場合

例えば、果物とそれを何個買ったかを表しているデータテーブルがあるとします。

単純に果物の種類にかかわらず、何個買ったか？を求めるにはどうしたらいいでしょう。

|    果物    |　購入個数 |
|:------------------:|:------------------:|
|        りんご        | 4 |
|        みかん        | 8 |
|        ばなな        | 2 |
|        ばなな        | 5 |
|        ばなな        | 7 |
|        りんご        | 1 |
|        ばなな        | 3 |


UiPathではこのように表します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/054f4f78-62d7-6570-e5a7-d283143f13ac.png)

左側の「sum」はint型の変数です。

右側の式は以下のようになっています。

```
Integer.Parse(dt1.Compute("sum(購入個数)").ToString)
```

# ばななの購入個数の合計を計算したい場合

こちらの場合は、果物列がばななの場合という条件を追加してあげることで実現します！

```
Integer.Parse(dt1.Compute("sum(列2)", "果物=ばなな").ToString)
```


# おわりに

まだまだUiPathでロボット開発する際にvb.netの知識が求められます。

早く、vb.netを知らなくてもアクティビティ配置するだけでロボ開発できるようになるといいですね！
C++ OpenCV webカメラを再生と静止させる

## 背景
webカメラを使ってデモプログラムを作成したいと考えていました。
さらに、これまではbool値を使うことから避けていたのですが、
今回を機に、トライしてみました。


## 実装環境
windows 10 64bit
visual studio 2017
言語　C++
opnecv 4.1.0

C++でOpenCVを使うための環境設定は以下の記事をご確認ください。
[環境設定 OpenCV for C++](https://qiita.com/yusa0827/items/d6b19800ccd0798d04c9)

## 参考コード
bool値でwebカメラから取得した画像を流したり、止めたりしています。
bool値を変える際には、SPACEキーとEcsキーを使用します。
SPACEキー：再生中の映像を停止
Ecsキー：停止中の映像を再生


```c++:[3]_webcamera_with_bool.cpp

#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>

/* SPACE と ESC で停止と再開を繰り返す */
#define CV_WAITKEY_SPACE  32 /* stop */
#define CV_WAITKEY_ESC    27 /* restart */ 
#define CV_WAITKEY_TAB     9 /* break */
#define CV_WAITKEY_ENTER  13 /* write */

int main()
{
	cv::VideoCapture cap(0);//デバイスのオープン
	if (!cap.isOpened())//カメラデバイスが正常にオープンしたか確認．
	{
		//読み込みに失敗したときの処理
		return -1;
	}

	bool working = true;  // 1=動作中, 0=停止中
	static int num_ = 1;  //フレーム番号
	cv::Mat frame; //取得したフレーム
	while (cap.read(frame))//無限ループ
	{
		switch (working)
		{
		case true:
			// wait for SPACE key to stop
			if (cv::waitKey(1) == CV_WAITKEY_SPACE) { /* stop */
				working = false;  
			}

			// ここで必要な画像処理を行う

			cv::imshow("win", frame);//画像を表示．
			cv::waitKey(1);// 1ms待って、画像を表示させる

		default://false
			// wait for ESC key to restart
			if (cv::waitKey(1) == CV_WAITKEY_ESC) {  /* restart */
				working = true;  
			}
		}

		num_++;//インクリメント、1つ増加させる
		//出力
		std::cout << "working =" << working << ", num_ = " << num_ <<  std::endl;
	}

	cv::destroyAllWindows();
	return 0;
}
```

## 実行結果
以下のような結果となりました

![図ｓｄｆさｆ1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503403/25e56aee-6a90-cd0c-977a-58427eb2de87.png)


## 反省点
入力キーを押したときに処理する場合、
そのコードはなるべく処理範囲内の上に書いたほうがいいということ。
後ろのように乗せると、入力キーの反応が悪かったりします。
（もしかしたら、自分のPCのスペックかもしれませんが。。。）
処理時間の長さに依存するかもしれません。←こっちのほうが可能性としては高い

## Gituhub
コマンドプロンプトで適当なディレクトリ（フォルダ）に進み、
以下のコードを実行すると確認できます。
また、git cloneの使い方は以下の記事を参考にしてください。
[環境設定 git clone](https://qiita.com/yusa0827/items/5302ff9de67aef3a01a5)

```
git clone https://github.com/yusa0827/20191005_Cplus2_webcamera_with_bool
```


## 参考文献

[C++ switch文のサンプル](https://itsakura.com/cpp-switch)
GolangでMySql(GCP)に接続する方法

##対象読者

- GCP環境のMySqlを作成したが、Golangからどのように接続すればよいのか分からない。

##やる事

#####1.[github.com/GoogleCloudPlatform/cloudsql-proxy/proxy/dialers/mysql](https://github.com/GoogleCloudPlatform/cloudsql-proxy/tree/master/proxy/dialers/mysql)をインポート

##使い方

[Github](https://github.com/GoogleCloudPlatform/cloudsql-proxy/blob/master/proxy/dialers/mysql/hook_test.go)に使い方が書いてありました。(知らずに試行錯誤してしまったので反省...)

##解説

接続に必要な部分に絞って解説します。

```go

import (
	"github.com/GoogleCloudPlatform/cloudsql-proxy/proxy/dialers/mysql"
)

func ConnectDB() {
	cfg := mysql.Cfg("[1.プロジェクト]:[2.リージョン]:[3.インスタンス名]", "[4.ユーザ名]", "[5.パスワード]")
	cfg.DBName = "[6.DB名]"
	db, err := mysql.DialCfg(cfg)
	if err != nil {
		log.Fatal("Error connecting server")
	}
	defer db.Close()
}
```

必要な情報は大まかに6つです。
####1.プロジェクト→プロジェクトIDを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466621/11dd79d0-b179-5759-ad34-e04574688c56.png)


####2.リージョン→SQLのリンクのロケーション情報を入力します。
####3.インスタンス名→SQLのリンクのインスタンスID情報を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466621/3542690d-2d60-6495-29f4-8b285e44b6a8.png)

>1～3までの情報を:で挟んでmysql.Cfgの第一引数に渡します。("[1.プロジェクト]:[2.リージョン]:[3.インスタンス名]")

####4.ユーザ名→SQL>インスタンスID>ユーザから、ユーザ名とパスワード情報を入力します。

>4の情報をmysql.Cfgの第ニ引数に渡します。

####5.パスワード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466621/e23108f3-f6b4-f15d-9ede-f72f227746d9.png)

>5の情報をmysql.Cfgの第三引数に渡します。

####6.DB名→SQL>インスタンスID>データベースから、DB名情報を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466621/847759a2-c265-b245-6af4-c8c67d6f0036.png)

>6の情報をcfgのDBNameプロパティにセットします。

これで上記のソースのようにすればMySqlに接続できます。

##反省点
Golang=>MySqlの接続方法はすぐに分かったのですが、GCPクラウドへの接続が必要になる為、どのようにソースを書けばいいのか分からず無駄に悩んでしまいました。
これからはGithubをよく読んで公式のサンプルソースが無いか探してみるようにします。
【Ansible】ワイルドカードでディレクトリを検索して中身をコピーする

# やりたいこと
タイトルのまんまです。
commandモジュールshellモジュール使わずやってみよう！と始めました。

# やりかた

たったこれだけですが、意外と手こずりました。。

```yaml
- name: ディレクトリを探す
  find:
    paths: /hogehoge/
    patterns: "copy*"
    file_type: directory
  register: find_result

- name: 中身をコピー
  synchronize:
    src: "{{ item.path }}/"
    dest: /fugafuga/copyto/
  with_items: "{{ find_result.files }}"
  delegate_to: "{{ inventory_hostname }}"
```

# 簡単に説明
## ディレクトリを探す
まず、findモジュールでディレクトリを探します。
https://docs.ansible.com/ansible/latest/modules/find_module.html

例では`/hogehoge/copy*`ディレクトリを探しています。
結果を`find_result`に格納します。

## 中身をコピー
synchronizeモジュールでコピーします。
https://docs.ansible.com/ansible/latest/modules/synchronize_module.html

例では事前に探したディレクトリの中身を`/fugafuga/copyto/`以下にコピーしています。

synchronizeモジュールはローカルからリモートに同期するモジュールですが、
`delegate_to`キーワードを使うとリモート内で（リモートからリモートに）同期できます。
`inventory_hostname`は処理中のリモートのことです。
https://docs.ansible.com/ansible/latest/user_guide/playbooks_delegation.html#delegation

コピー元のパスは`find_result.files.path`に入ってますが、filesが配列になってるので `with_items` で一つずつ取り出して処理します。
https://docs.ansible.com/ansible/2.4/playbooks_loops.html#using-register-with-a-loop

# まとめ
commandモジュールやshellモジュールは強力ですが、最終手段にしたいですよね。
実は最初commandモジュールで実装していたのですが、リファクタリングしてたら詰まった！という事例でした。
Ansibleのメリット生かす為にもAnsibleライクな実装を心がけたいですね。
Raspberry Pi Zero W で最新鋭のウェブ地図をつくる

Raspberry Pi Zero W が手に入ったので、国連ベクトルタイルツールキット (UNVT) を動かすための準備を進めている、という話です。

# 基本構想（これまでのあらすじ）
基本構想は、次の通りでした。

- Raspberry Pi の上に Rasbian を入れて、その上に Docker を入れて、 Docker の中で使いやすい本物の Linux にアクセスできるようにする。
- その上で、Tippecanoe と Node.js を中心に、UNVT のツールを Dockerfile レベルで導入する。
- その上のレイヤに、実際のテストデータと、個別の変換プログラムと、個別のホストソフトウェアを入れる。
- このようにすることで、ヘッドレスな Raspberry Pi 一台でベクトルタイルのウェブ地図環境が全て動くという形を作り、デモンストレーションやキャパシティビルディングにおける取り付きを良くする。

今回、Rapberry Pi 3+ から Raspberry Pi Zero W に移ってみることで新たに直面した挑戦は、次の２点です。

- イーサネットケーブルがないので、外部からの接続は WiFi のみに頼ることになる。基本的に、同じアクセスポイントに接続したところから ssh で入るという形を目指す。
- チップのアーキテクチャが arm32v6 と古い。少し古い Docker を使う必要がありましたし、また、Docker 上では debian:unstable ではなくて arm32v6/alpine を使う必要がありました。

# WiFi 頼り。だから wpa_supplicant.conf 重要
Zero W をヘッドレスで動かす場合、アクセス手段は WiFi を通じた ssh 接続に頼ることになるでしょう。WiFi の接続情報を、Zero W に差す MicroSD 上の `/wpa_supplicant.conf` に書き込む必要があります。その内容は、次のようにするそうです。

```conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
  ssid="あなたの SSID"
  psk="あなたの WiFi パスワード"
  key_mgmt=WPA-PSK
} 
```

その他、同じく MicroSD 上（ブートディレクトリ?）に `ssh` という名前のからファイルを置いておくと、 ssh 接続が enabled になるそうです。

いずれ、複数台運用などの場合に備えてホスト名の変更などをする必要があると思いますが、ホスト名の変更などは、ログインしてから `sudo raspi-config` で行うのが良いようです。

# Docker は 18 系を使う
Zero W の CPU のアーキテクチャは arm32v6 と古いらしく、最新の Docker だとコアを吐くなどしてうまく動かないそうです。私の場合には、docker run コマンドでコンテナの中に入れず、そのまま戻ってきてしまうという症状にあたりました。

Rapbian 上で Docker のバージョンを指定して導入することで、上記の症状を回避しました。今、私の手元で安定して支えているのは、18.06.1-ce, build e68fc7a です。

具体的には、私は次の方法で導入を行なったと記憶しています。

```console
curl -fsSL https://get.docker.com -o get-docker.sh
chmod u+x get-docker.sh
VERSION=18.06 ./get-docker.sh
sudo usermod -aG docker pi
```

# Alpine Linux に移る
arm32v6 では debian:unstable は動かないようですので、Docker コンテナイメージのベースを arm32v6/alpine にしなければならないことになりました。

そこで、[rasv](https://github.com/un-vector-tile-toolkit/rasv) を代替する新たな [v6](https://github.com/un-vector-tile-toolkit/v6) というレポジトリを作り、そこで Dockerfile を開発することにしました。

私は、 Alpine Linux をざっくりと次のようなものであると理解しています。

- ベースは busybox で、もともと組み込み用途で考えられたもの。busybox は単一のバイナリに複数のアプリケーションを含んだもの。
- 標準シェルは bash ではなくて ash であり、a は almquist の略。
- musl libc に基づいている。

# 現在
現在、 ogr2ogr をソースからコンパイルして得る目的で、 PROJ をソースからコンパイルしているところです。Zero W はコアが貧弱なので、コンパイルには時間をかけなければなりません。

また、Zero W はメモリが 512 MB と貧弱なので、バッファあふれも含めて、メモリの負担が重くなる作業については良く注意してかかる必要がありそうだと感じています。
【GAS】Google Driveの指定フォルダ内にある画像ファイルを全取得する

## 目的
- Google Driveで管理している指定フォルダ内にある画像ファイルを全取得したい
- 画像データを直接呼び出せるURLのフォーマットで取得をしたい

## ディレクトリ構造
```
parentFolder
│
├ childFolder
│   ├ id_1.jpg
│   ├ id_2.jpg
│   ├ id_3.jpg
│   └ id_4.jpg
│
├ childFolder2
│   └ ...
├ childFolder3
│   └ ...
└ childFolder4
    └ ...
```

## 結果
- inputData
    - prentFolderのid
    - childFolderの名前
- outputData
    - id_1.jpgの画像URL
    - id_2.jpgの画像URL
    - id_3.jpgの画像URL
    - id_4.jpgの画像URL

## 実装

 ```js
 //検索ワード
  var targetFolderName = "指定フォルダの名称";

  //対象の親フォルダを取得
  var parentFolderID = "parentFolderID";
  var parenFolder = DriveApp.getFolderById(parentForderID).getFolders();
  
  var childFolderID;
  while (parentFolder.hasNext()) {
    var folder = parentFolder.next();
    var folderName = folder.getName();
    if(folderName == targetFolderName){
      childFolderID = folder.getId();
      break;
    }
  }
  if(!childFolderID){
    Logger.log("存在しないフォルダです。");
    return;
  }

  /************************************************
  必要な場合、同手順を検索対象の画像ファイルがあるフォルダまで行う
  ************************************************/

  //対象フォルダに入っている画像の全取得
  var files = DriveApp.getFolderById(childFolderID).getFiles();
  
  var file;
  var fileID;
  var pictureURL;
  while (files.hasNext()) {
    file = files.next();
    fileID = file.getId();
    pictureURL = "https://drive.google.com/file/d/" + fileID + "/view?usp=sharing";
    Logger.log(pictureURL);
  }
  if(!pictureURL){
    Logger.log("指定したフォルダに画像は存在しませんでした。");
    return;
  }
 ```
SQL文を書く時に気を付けていること

SQL関連で、自分が今までに教わってきたことを一部まとめてみます。
## 早い段階で取得するデータを絞る
クエリを速くするには、とにかく早い段階で取得するデータ量を少なくする必要がある。
サブクエリをたくさん含む複雑なクエリを作成する場合も、
最後にまとめてWHEREで絞るのではなく、各サブクエリ内でレコード数を減らすことが重要だ。

```:SELECT文の評価順序
1.FROM
2.ON
3.JOIN
4.WHERE
5.GROUP BY
6.HAVING
7.SELECT
8.DISTINCT
9.ORDER BY
10.TOP（LIMIT）
```

上記のSELECT文の評価順序から
可能な場合は、WHEREで条件指定するよりも、JOINのONで条件指定するほうが、
取得されるデータ量が少なくなるため、処理がはやくなることがわかる。
他にも

- ルールベースのオプティマイザの場合は、WHEREは選択条件が少なくなる条件から記述する
 - 検索条件が複数ある場合、抽出する件数が少なくなる条件から先に行う
 - インデックスが貼られていたり、カーディナリティ度が高い場合、それが先に評価されるので注意が必要。正確な評価順序は統計情報とプランナに依存する
- 結合時にはあらかじめ結合の件数を減らす
 - LEFTなどで結合する際は、各々の件数を減らした上で結合する
- ソート処理はできるだけ少ない件数で行う
 - ソート処理は負荷が大きい処理のため、できるだけ少ないデータで行った方が高速になる。

などに気を付ける。

## SELECTでは必要なカラムのみを取得する
レコード長が長いときや、フィールド数が多いときには、取得するカラムを絞ることで検索速度が上昇する。
「＊」を指定すると、参照系のSQL文では、すべてのフィールドを繰り返してコピーするため、リソースを無駄に使うことになる。

```.sql:before
SELECT *
FROM Order
```
```.sql:after
SELECT id
      ,name
FROM Order
```
## 演算はできるだけ避ける
- WHEREでインデックス列に算術演算子や関数を使用しない
 - インデックス列に算術演算や関数を指定するとインデックスが有効にならないため、検索速度が低下する。

```.sql:before
-- priceはインデックス列とする
SELECT id
FROM Order
WHERE price * number > 10000
```

```.sql:after
-- priceはインデックス列とする
SELECT id
FROM Order
WHERE price > 10000 / number
```

- サーバサイドで計算する
 - アクセスが多い処理の場合、簡単なSQLでデータを取得後、サーバーサイドのプログラミング側で計算するということもある。

## Oracleの場合、"IS NULL"や"IS NOT NULL"を単独で使わない

これらの条件を指定するときは、単独で指定 するのではなく、何らかの絞り込める条件を合わせて指定する。
条件を表すWHEREにIS NULL/IS NOT NULLを指定したときは、インデックスを定義したフィールドであっても、全表走査が行われるためである。

例えば、問い合わせの結果を変更せずに「val > 5」の条件を付加できるなら

```.sql:before
SELECT name
FROM Order
WHERE id IS NULL
```
```.sql:after
SELECT name
FROM Order
WHERE id IS NULL AND val > 5 
```
とする。
また、NULL比較をしなくても良いようにNULL値に意味を持たせないようにするといった対策も有効である。

一方で、MySQL、SQL Server、PostgreSQLの場合は、NULLを条件にしたときもインデックススキャンされる。
参考:[IS NULLはインデックスを使うのか](https://techblog.istyle.co.jp/archives/1514)

## さいごに
SQLは、テーブルの件数やインデックスが貼られているかどうかなどによっても最適解は異なります。
どのデータベースを使用するかによって方言が異なるため、リファレンスを確認すること、また、このような記事を鵜呑みにしないで実際にパフォーマンステストをしてみることも大切です。
自分も引き続き精進します。
ご清覧ありがとうございました。
Nuxt.jsのライフサイクルを知っておく

# ライフサイクルを知る意味
- ライフサイクルの中のそれぞれの責務を知ることで適切なタイミングで適切な処理を差し込むことが出来、想定外の動作や不具合を防ぐ。

# Nuxt.jsのライフサイクルはVue.jsのそれとはレイヤーが違う
- 以下で登場するイメージ画像のうち1枚目がNuxt.js単体で考えたイメージで2枚目がそこにVue.jsのライフサイクルを挟み込んだもの

# Nuxt.jsのライフサイクルのイメージ
- イメージは[Nuxt.jsビギナーズガイド](https://www.amazon.co.jp/Nuxt-js%E3%83%93%E3%82%AE%E3%83%8A%E3%83%BC%E3%82%BA%E3%82%AC%E3%82%A4%E3%83%89%E2%80%95Vue-js-%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AB%E3%82%88%E3%82%8B%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-%E8%8A%B1%E8%B0%B7-%E6%8B%93%E7%A3%A8/dp/4863542569)より拝借。

<img width="426" alt="スクリーンショット 2019-10-06 9.48.46.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303093/0d57031a-81bc-e800-4211-0f5e98c60472.jpeg">

# Nuxt.js + Vue.jsのライフサイクルイメージ
- イメージは[Nuxt.jsのライフサイクル覚書](http://lab.astamuse.co.jp/entry/2019/05/29/114500)より拝借。
<img width="694" alt="スクリーンショット 2019-10-06 10.13.44.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303093/5585361b-ac09-067f-8a12-8d2312eb52be.jpeg">



### 1.Incoming Request(ユーザからのアクセス)
  - `nuxtServeInit`アクションが呼ばれる（Vueストアのルートストアに`nuxtServeInit`が定義されている場合のみ
  - ここでVueストアに関する初期化処理を記述することが出来、初期化が行われる
  - 必ず入れたいデータ（認証情報とか）を放り込む

### 2.middleware(ミドルウェア)の呼び出し
  - マスタデータの取得、複雑な認証などに代表されるグローバルで単一的な機能を提供する部品を呼ぶ

### 3.validate
  -  ページコンポーネントのvalidate関数の呼び出しが行われる
  -  こちらは<font color="red">ページのバリデーション</font>であってデータのバリデーションではない
  -  バリデーションを通して合致しないページをエラーとして返す
  -  asyncDataにて代替えされることも

### 4.asyncData() & fetch()
  - Vueコンポーネントのローカルステートに影響がない部分でのasyncData/fetchが行われる

### Render以降でVue.jsのライフサイクルが挟み込まれる
### ※プラグインはこれより前に呼ばれる


以上！！
しょぼいメモリ環境で Haskell stack build用にswap領域を増やす

# 問題
GCE(Google Compute Engine)の f1-micro（vCPU x 1、メモリ 0.6 GB）無料インスタンスでメモリが足りず、`Hello World`すら`stack build`できない。

Haskell は、ビルドするだけでもメモリが4GB必要らしい。 :yum:

# 解決策 A

1. メモリを16GBくらいにする :weary: 

# 解決策 B

1. swap領域を作る
2. swapをONにする
3. ビルドする
4. すごくすごく長い時間ビルドが終わるのを待つ :sob:
3. ビルドが終わったら、OFFにする

## swap領域用のファイルを作る

```bash:bash
sudo mkdir -v /var/cache/swap
cd /var/cache/swap

# このddコマンドは、すごく時間がかかる
sudo dd if=/dev/zero of=swapfile bs=1K count=4M

sudo chmod 600 swapfile
sudo mkswap swapfile
```

## swapをONにする
```bash:bash
sudo swapon swapfile
```

## swapの確認
```bash:bash
swapon -s
```

## swapをOFFにする
```bash:bash
sudo swapoff swapfile
```

# パクリスペクト元

- [Building Haskell (specifically “lens” library) in a low memory environment](https://medium.com/@saurabhnanda/building-haskell-specifically-lens-library-in-a-low-memory-environment-5ef58ec294a2)
- [Build Cabal with "stack build", out of memory in Ubuntu with 1G RAM host.](https://www.reddit.com/r/haskell/comments/cmx7dl/build_cabal_with_stack_build_out_of_memory_in/)
- [How do I add swap after system installation?](https://askubuntu.com/questions/33697/how-do-i-add-swap-after-system-installation/796997#796997)

# おまけ
## ddコマンドのオプション

| オプション       | 意味 |
|-----------------|------------------|
| `if=/dev/zero`  | 入力ファイルを `/dev/zero` にする |
| `of=swapfile`    | 出力ファイルを `swapfile` に指定する |
| `bs=1K`         | ブロックサイズを 1KB にする |
| `count=4M`      | 回数を 4M回(400万回) にする |

`\0` で埋めた4GB(1KB * 4M)のファイルを作っているみたい。

## その他

再起動後もswap領域を有効にしたい場合、 `/etc/fstab` をどうにかするらしい。
eksctl で IRSA使おうとしたら防壁に阻まれた件

## 結論

AWSのkubernetes便利ツールeksctlは便利だけど、proxy環境下では　IRSAの設定(open-id-connect-provider)が出来ない

——— 追記
現在は対応しているようです。
ただし、まだ試していませんが、最新のソースを見る限り動くように見えます。

## 概要
AWSから正式にIRSA(IAM Roles for Service Accounts)サポートのアナウンスがありました。

IRSAは、今までだと kiam や　kube2iam を使って POD 単位に IAM の設定をしていましたが、AWSが公式に同じような機能を実装したものです。
[詳細はこちら。](https://aws.amazon.com/jp/blogs/news/introducing-fine-grained-iam-roles-service-accounts/)

早速使ってみました。クラスターはできるのですが、なぜかエラー出ます。

```
2019-10-02T14:27:07+09:00 [✖]  connecting to issuer OIDC (https://oidc.eks.ap-northeast-1.amazonaws.com:443/id/123456AAAAAAAA): read tcp 10.100.92.52:59412->54.65.237.84:443: read: connection reset by peer
```
どうやら、 opene id connect providerの作成でエラーになっているようです。

```
2019-10-02T14:27:07+09:00 [▶]  DEBUG: Validate Response iam/GetOpenIDConnectProvider failed, attempt 0/13, error NoSuchEntity: OpenIDConnect Provider not found for arn arn:aws:iam::.......略
```

## 調査

とりあえず、チュートリアルをコピペしてみたのですが。動きません。
そのほか、色々試してみたのですが、どうしても上手くいきません。

結局ソースを確認するしかないので、調べてみました。
エラーメッセージを頼りにとりあえず　grep。

ありました。

```golang:pkg/iam/oidc/api.go
// getIssuerCAThumbprint obtains thumbprint of root CA by connecting to the
// OIDC issuer and parsing certificates
func (m *OpenIDConnectManager) getIssuerCAThumbprint() error {
        config := &tls.Config{InsecureSkipVerify: m.insecureSkipVerify}

        conn, err := tls.Dial("tcp", m.issuerURL.Host, config)
        if err != nil {
                return errors.Wrapf(err, "connecting to issuer OIDC (%s)", m.issuerURL)
        }
        defer conn.Close()
```

むむ、proxyには対応してないようです。

これを試しているのは、proxy が必要な環境なので、おそらくこれが原因でしょう。

[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_create_oidc_verify-thumbprint.html)に書いてある、OIDC IdP(Open ID Connect ID Provider)のCAの取得手順である、以下の操作をそのまま実装しているようです。

```text
3. ウェブブラウザに表示されるドキュメントで、"jwks_uri" を検索します(ウェブブラウザの検索機能を使用して、ページでこのテキストを見つけます)。 テキスト "jwks_uri" の直後のコロン (:) の後に URL があります。URL の完全修飾ドメイン名をコピーします。https:// または最上位ドメインより後のパスは含めないでください。

4. OpenSSL コマンドラインツールを使用して、次のコマンドを実行します。keys.example.com を、ステップ 3 で取得したドメイン名に置き換えます。

openssl s_client -servername keys.example.com -showcerts -connect keys.example.com:443
```

## それでどうしたか

今回は動作検証が目的なので、素直に直接インターネットに出られるインスタンスを立てました。あまり参考にならずにすみません ```_o_```
簡単にVPNサーバー(L2TP/IPsec)を構築できるAnsible Roleをつくった

## はじめに
外出先や野良wifiから安全に通信できるように、VPNサーバを構築します。
設定するファイルが多く、構築が大変だったので[Ansible Role化](https://github.com/shomatan/ansible-role-l2tp-ipsec-server)しました。
お手持ちのPlaybookに組み込むことで、簡単にVPNサーバーを構築できます。
また、L2TPクライアントはたいていのOSで標準サポートされているので、特にアプリをインストールすることなく利用可能です。

### VPNの概要
L2TPは、ネットワーク間でのVPN (Virtual Private Network) 接続を実現するトンネリングプロトコルです。L2TP自体は暗号化の仕組みを持ちませんが、IPsecを併用することでデータの機密性や完全性を確保したVPN接続を実現するL2TP/IPsecがあります。スマートフォンなどに搭載されているL2TPクライアントからインターネット越しに構築したVPNサーバーとのセキュアな通信を可能にします。

### 環境
[今回作ったAnsible Role](https://github.com/shomatan/ansible-role-l2tp-ipsec-server)は以下の環境で動作確認を行っています。

#### ローカル
- Ansible 2.6.5

#### サーバー側
[ConoHa VPS](https://www.conoha.jp/vps/)のCPU1コア、メモり512M

- CentOS 7
- Ubuntu 16.04 LTS
- Ubuntu 18.04 LTS

#### クライアント側
- macOS
- Android 10
- iOS 13

## 注意事項
- このRoleは、**firewalld(CentOS) / ufw(Ubuntu)を有効**にします。事前にSSHポートを開けておいてください。
- **事前共有鍵やログイン情報は機密情報**なので[Ansible Vault](https://docs.ansible.com/ansible/latest/user_guide/vault.html)を利用するなどして管理してください。

## 手順
### Roleの取得
今回作ったAnsible Roleは[Ansible Galaxy内](https://galaxy.ansible.com/shomatan/l2tp-ipsec-server)に配置していますので、`ansible-galaxy`コマンドから取得できます。
`requirements.yml`ファイルに以下を追加します。

```yaml:requirements.yml
- shomatan.l2tp-ipsec-server
```
その後、以下のコマンドでRoleを取得します。

```bash:command
ansible-galaxy install -p roles -r requirements.yml
```

### Playbookの作成
必要最低限のパラメータを示します。
今回は`vpn.yml`としてPlaybookを作成します。

```yaml:vpn.yml
- name: Run the vpn server group of hosts.
  hosts: all
  become: true
  roles:
    - role: shomatan.l2tp-ipsec-server
      l2tp_ipsec_server_host: vpn.example.com 　　　　　　　　 # ServerのPublic IPまたはdomain
      l2tp_ipsec_PSK: presharedkey 　　　　　　　　　　　　　　  # 事前共有鍵
      l2tp_ipsec_server_bind_interface: eth0                # Public側のネットワークインターフェース
      l2tp_ipsec_server_users:
        - { username: user, password: pass, ipaddress: "*"  # ログイン情報
```

### 実行
inventoryファイルは適宜作成してください。
以下のコマンドを実行して、VPNサーバーを構築します。

```bash:command
ansible-playbook vpn.yml
```

### クライアントの設定
- サーバー: `l2tp_ipsec_server_host`の値
- 事前共有鍵: `l2tp_ipsec_PSK`の値
- ユーザー名: `l2tp_ipsec_server_users`の`username`
- パスワード: `l2tp_ipsec_server_users`の`password`

## 終わりに
CentOSとUbuntuでIPsecのライブラリが異なるので、設定に苦労しました... Androidから繋がらないとか...

## 参考
- [L2TP/IPsec](http://www.rtpro.yamaha.co.jp/RT/docs/l2tp_ipsec/index.html)
- [CentOS7でl2tp方式のVPNサーバーを建てる](https://qiita.com/yume_yu/items/09f57a8923341c5b2316)
- [strongSwan + xl2tpd でVPN(L2TP/IPsec)を構築する](https://qiita.com/namoshika/items/30c348b56474d422ef64)
javascript で何度も調べてしまうこと

長らく使う機会が無いと、忘れちゃっている事ってありますよね。
何度もGoogle 検索をかけてしまうjavascript の命令があります。
そんな項目を自分のためにメモしておこうかと思います。

## 32ビット unsigned int
32ビット integer をunsigned に変換するには

```example.js
var num = 0xDF0A212;
var numb=num<<4;
console.log(numb);    //-552984288 と表示
numb=(numb&0xFFFFFFFF) >>> 0;
console.log(numb);    //3741983008 と表示
```

## 円周率

```example.js
Math.PI
```

小文字piと書いてしまい苦労してしまいました。


## 文字→数字、数字→文字変換

```example.js
var a=28;
console.log(a.toString(10));　// "18" と表示
console.log(a.toString(16));  // "1C" と表示
console.log(parseInt("10") + parseInt("20"));		//30
console.log(parseFloat("10.5") + parseFloat("20.3"));	//30.8
console.log(Number("105e2") + Number("203e2"));		//30800
```

## 配列の初期化

大、中、小括弧のどれだったか、すぐ忘れてしまいます。

```example.js
var tmp=[];
tmp=[0,1,2];
console.log(tmp);

var tmp2=[];
tmp2=[[0,1,2],[11,12,13]];
console.log(tmp2);
```

## 文字列の文字数をカウントする

``` exsample.js
var name="abscdef";
console.log(name.length);
```

## console.log で改行したくない
console.log に変えて、process.stdout.writeを使います。

```exsample.js
var name="abscdef";
for(var i=0; i<name.length; i++){
    process.stdout.write(name[i]);
}
process.stdout.write('\n');
```

## 連想配列

```exsample.js
var meibo=[];
meibo['Jason Voorhees']=[];
meibo['Jason Voorhees'].height=192;
meibo['Jason Voorhees'].weight=114;
meibo['Freddy Krueger']=[]
meibo['Freddy Krueger'].height=170;
meibo['Freddy Krueger'].weight=73;
meibo['Bubba Sawyer']=[]
meibo['Bubba Sawyer'].height=182.88;
meibo['Bubba Sawyer'].weight=106.6;
```

参照は以下のように記述します。

```
console.log(meibo['Jason Voorhees']);
```

```exsample.js
var meibo2=[
    { name:'Jason Voorhees', height:192, weight:114 },
    { name:'Freddy Krueger', height:170, weight:73 },
    { name:'Bubba Sawyer', height:182.88, weight:106.6 },
];
```

参照は以下のように記述します。

```
console.log(meibo2[1]);
```

## 文字列を分割

分割するキーワードをsepstrに設定します。ここではスペースです。
要素の数はlengthでわかります。

``` example.js
var line={"ab cd ef gh"};
var sepstr = " ";
var p = line.split(sepstr);
console.log(p.length);
```

## setInterval

- 設定時間ごとに起動するsetInterval

``` example.js
var count = 0;
var t=setInterval(function() {
    console.log(count++);
	if(count>=10){
		clearInterval(t);
	}
}, 1000);
```

- 設定時間後に起動するsetTimeout

``` example.js
setTimeout(function(){
    console.log("timeout\n");
}, 1000);
```

こちらを参照しています。
https://techacademy.jp/magazine/5537
curl: (60) Peer's Certificate issuer is not recognized　への対処方法

CentOSを利用していて、yumやcurl、dockerを利用するときに
curl: (60) Peer's Certificate issuer is not recognized というエラーが表示された。

最終的には解決したが、意外と時間かかったのでメモ。

# 【一時的な回避策】
1. curlの場合
2. yumの場合

### 1. curl の場合
-k オプションをつけて、強制的に接続する
ただし、一時的なエラー回避策に過ぎない。

```bash
$ curl -k https://www.yahoo.co.jp
```

### 2. yumの場合
/etc/yum.conf に sslverify=false を追記。
こちらも、一時的なエラー回避策に過ぎない。

```bash:/etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever
### 省略 ###
distroverpkg=centos-release
sslverify=false #<------- ここに記述

#  This is the default, if you make this bigger yum won't see if the metadata
# is newer on the remote and so you'll "gain" the bandwidth of not having to
# download the new metadata and "pay" for it by yum not having correct
# information.

```

# 【解決策】CA証明書のインストール

探し方が悪かったか、結局はこの方法で解決した。
原因は、社内に導入しているセキュリティソフトの設定。
ネットワークにアクセスするときに、指定のCA証明書がないとダメだったようです。
##【手順】
1. CA証明書をもらう
2. CA証明書を配置
3. コマンド実行、確認

### 1. CA証明書をもらう
社内のセキュリティ担当者やネットワーク担当者に相談し、
curl:(60) Peer's...が発生して通信できないことを伝え、CA証明書をもらいます。
（CA証明書のファイル名は mycacert.crt とします）

### 2. CA証明書を配置
もらったCA証明書は、/usr/share/pki/ca-trust-source/anchors/ に配置します。

```bash
$ sudo cp mycacert.crt /usr/share/pki/ca-trust-source/anchors/
```

### 3. コマンド実行、確認
update-ca-trustコマンドを実行し、念のため通信が正常かを確認します。
問題なければ、curl:(60) Peer's...のエラーが消え
同様のエラーが出ていたアプリケーションも問題解消するはずです。

```bash
$ sudo update-ca-trust extract
$ curl https://google.co.jp
```
# Ubuntu20.04の場合（2021-09-30追記）
Ubuntuの場合、CA証明書のインストールは下記のようにする
update-ca-certificatesコマンドを実行した時に、1 added のように表示されたら成功

```bash
$ sudo mkdir /usr/local/share/ca-certificates/extra
$ sudo cp mycacert.crt /usr/local/share/ca-certificates/extra
$ sudo update-ca-certificates 

Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.

```

# その他
- CA証明書とは
    - <b>C</b>ertificate <b>A</b>uthority certificate
    - 日本語訳は、「（公開鍵証明書）認証局の証明書」
    - 所有者はパブリックキーに対応したプライベートキーの持ち主と証明できる
    - 認証局は、セキュリティベンダーや公的機関など多岐にわたる
    - 適用例：CA証明書の所有者に限定したサービスを提供したい

# 参考
 - [独自のルートCA証明書を追加する方法（Ubuntu, CentOS 7）](https://cloudpack.media/14148)
 - [Wikipedia（認証局）](https://ja.wikipedia.org/wiki/認証局)
AWSにクレジットカード登録ができない

## 状況：　AWSに登録ができない
　名前や住所などは登録できるのですが、支払い情報の登録が出来ず、AWSのサービスの利用が出来ない状態でした。

### 以下のようなアラートが出る
　支払い登録の画面で、以下のようなアラートが出ていました。

**デフォルトの支払い方法が無効です。有効期限が切れている場合は、カード情報を編集して更新する必要があります。銀行で身分確認を求められる場合があります。請求書のお支払いの失敗や、AWS のサービスの使用に支障が生じるのを防ぐために、必要な手順を実行してください。**

同じカードで他の買い物は出来ていたのですが、なぜかAWSの認証だけうまくいきませんでした。
ちなみに楽天カードです。


## 解決方法: カード会社に電話し、認証を外してもらう
  Amazonのカスタマーセンターにメールで問い合わせたところ、なんと当日中に返信がありました。
原因としては、カード会社の認証で弾かれてしまっていたとのこと。
解決策としては、カード会社に連絡し、認証を一時的に外してもらう必要があるとのことでした。

具体的な認証の内容などは申し訳ありませんが私にはよくわかりません。
ただ、カード会社に連絡すると、やはり認証が問題だったとのこと。
「本日中のみ認証を外すので、30分後にもう一度お試しください」と言われ。試すとすんなりと登録が完了しました。

## 備考　Amazonのサポートの質に感動
　メール形式の問い合わせで、まさか当日中に回答が来るとは思いませんでした。
内容も非常に丁寧なもので、回しものではありませんが、かなりAWSのサービスが好きになりました。
今後も何かあれば問い合わせてみようと思います。
たまに使いたい Docker コマンド

## 未使用のコンテナ、ネットワーク、イメージ、ボリュームを削除する

```shell
docker system prune -a --volumes
```

https://docs.docker.com/engine/reference/commandline/system_prune/

## ある名前を含むコンテナを一括削除する

コマンド

```shell
docker ps -a --format "{{.Names}}" | grep {削除したいコンテナ名} | xargs docker rm
```

例

```shell
docker ps -a --format "{{.Names}}" | grep hoge | xargs docker rm
```

https://docs.docker.com/engine/reference/commandline/ps/

## ある名前を含むイメージを一括削除する

コマンド

```shell
docker images --format "{{.Repository}}" | grep {削除したイメージ名} | xargs docker rmi
```

例

```shell
docker images --format "{{.Repository}}" | grep hoge | xargs docker rmi
```

https://docs.docker.com/engine/reference/commandline/images/

## タグ付けされていないイメージを一括削除する

コマンド

```shell
docker rmi $(docker images -f dangling=true -q)
```

https://docs.docker.com/engine/reference/commandline/images/

## ある名前のイメージより前に作成されたイメージを一括削除する

コマンド
タグは指定してもしなくても良い

```shell
docker rmi $(docker images --filter "before={削除したいイメージ名:タグ}" -q)
```

例

```shqll
docker rmi $(docker images --filter "before=hoge:latest" -q)
```

https://docs.docker.com/engine/reference/commandline/images/

## ボリュームを一括削除する

コマンド

```shell
docker volume rm $(docker volume ls -q)
```

https://docs.docker.com/engine/reference/commandline/volume_ls/
https://docs.docker.com/engine/reference/commandline/volume_rm/


## ある名前を含むネットワークを一括削除する

コマンド

```shell
docker network rm $(docker network ls --filter name={削除したいネットワーク名} -q)
```

例

```shell
docker network rm $(docker network ls --filter name=hoge -q)
```

https://docs.docker.com/engine/reference/commandline/network_ls/
https://docs.docker.com/engine/reference/commandline/network_rm/
2019-10-06 LPC > LPCXpresso54628 > fsl_gpio.hがないけれどいいの? > board.hからインクルードしているから不要

```txt:動作環境
OS: Ubuntu 18.04 LTS
基板: LPCXpresso54628
IDE: MCUXpresso IDE v11.0.1 [Build 2563] [2019-09-01]
```

### 関連

- [2019-10-05 LPC > LPCXpresso54628 > Lチカ > SDK Exampleを使う例 > Quickstart Panel | プロジェクトの作成、ビルド、デバッグ、停止まで | USER LEDsのポートとピン](https://qiita.com/7of9/items/44d2198d8ee2ff3c8e66)


### 疑問点

- `#include "fsl_gpio.h"`があるプロジェクトとないプロジェクトがある
    - ある: import SDK example(s)...で生成したプロジェクト
    - ない: 新規プロジェクト
- ない方であっても、GPIO_PortInit()などの関数を使用してもエラーにはならない
    - どこからインクルードしているのだろう


### fsl_gpio.hをインクルードしているファイル

プロジェクトのトップフォルダに移動し、下記を実行した。

```shell
$ grep -r fsl_gpio.h | grep include
source/gpio_led_output.c:#include "fsl_gpio.h"
drivers/fsl_gpio.c:#include "fsl_gpio.h"
board/board.h:#include "fsl_gpio.h"
```

`board.h`からインクルードされている。
このファイルは上記の二者ともにインクルードしている。

SDK exampleの`#include "fsl_gpio.h"`はなくても動く。明示的にしておきたかったのかも。

### 関連

- ["New Project" wizzard and Pins tool MCUXpresso for LPC845](https://community.nxp.com/thread/499864)

> 1.) The wizzard asks for driver inclusion. Why aren't the chosen drivers not automatically included, e.g. #include "fsl_gpio.h" in main.c when I chose the GPIO driver in the wizzard?

答え: board.hからインクルードされているから不要
ということなのかもしれない。