OmniAICreator/Qiita-1.07M huggingface dataset:
【Git】コマンドラインベースでブランチを削除する最も簡単な方法

Gitでブランチを削除する方法です。
ローカルブランチ、リモートブランチそれぞれについて書きました。
いろいろな方法がありますが、最も簡単と思われるものをチョイスしています。

## 対象ツール・環境
- Git
- OS：Windows10
- コマンドプロンプト
- リモートリポジトリ：CodeCommit

## 手順
### 1. ローカルブランチを削除する
(1)削除するブランチが作業中の場合は別のブランチに切り替える

```terminal
> git checkout 別のブランチ（名）
```
(2)以下のコマンドを実行し、対象ブランチを削除

```terminal
> git branch -D 削除するブランチ名
```
【例】ローカルのdummy1ブランチ（作業中）を削除する場合

```terminal
> git checkout master     ## masterブランチに切り替え
> git branch -D dummy1    ## dummy1ブランチを削除
```

### 2. リモートブランチを削除する
(1)以下のコマンドを実行し、対象ブランチを削除

```terminal
> git push origin :削除するブランチ名
```

【例】リモートのdummy2ブランチを削除する場合

```terminal
> git push origin :dummy2
```

#### ※補足事項

- 対象ブランチをfetchしていなくても削除可能
- ローカルで対象ブランチ由来のブランチで作業中でも削除可能

でした。

## 参考
- [Gitでローカルブランチ・リモートブランチを削除する方法](http://www-creators.com/archives/1062)
lodash の備忘録

# 頻繁に呼び出しが起こらないようにするためのもの。

mousemove のイベント実行など、高頻度で実行されてしまうのを回避する場合に使用するもの。

### 高頻度で呼ばれる例
```js

const start = Date.now();
setInterval(
  ()=>{ console.log('〇', Date.now() - start); },
  0
);
```
↑ の場合の出力例。
〇 3
〇 5
〇 10
〇 15
・・・

### _.throttle() を使う。
```js
const start = Date.now();
setInterval(
  _.throttle( ()=>{ console.log('〇', Date.now() - start); }, 5000),
  0
);
```
↑ の場合の出力例。
〇 2
〇 5004
〇 10005
〇 15859
・・・
★ 最初に1回実行し、以降は何度呼ばれても 指定秒数(5000) 後にしか呼ばれない。

### _.debounce() を使う。
```js
const start = Date.now();
setInterval(
  _.debounce( ()=>{ console.log('〇', Date.now() - start); }, 5000),
  0
);
```
↑ の場合の出力例。
※ 一度も呼ばれない。

★ 何回呼ばれても、最後に呼ばれてから 指定秒数(5000) 経過しないと呼ばれない。

なので、上記例の場合は永遠に呼ばれない。
`_.debounce()` と `_.throttle()` のどちらを使うかは、このことを考慮して使い分ける。
Apache Tomcat 9 ドキュメントまとめ

## Apache Tomcat 9

Apache Tomcat 9 は Servlet 4.0 と JavaServer Pages 2.3 を実装している。

[Apache Tomcat 9 \- Documentation Index](http://tomcat.apache.org/tomcat-9.0-doc/)

> Apache Tomcat version 9.0 implements the Servlet 4.0 and JavaServer Pages 2.3 specifications from the Java Community Process, and includes many additional features that make it a useful platform for developing and deploying web applications and web services.

## Java Servlet 4.0
- [JSR-000369 Java Servlet 4.0 Specification \(Final Release\)](https://jcp.org/aboutJava/communityprocess/final/jsr369/index.html)
- [Servlet 4\.0 API Documentation \- Apache Tomcat 9\.0](https://tomcat.apache.org/tomcat-9.0-doc/servletapi/)
- [Index of /repositories/releases/javax/servlet/javax\.servlet\-api/4\.0\.0](https://maven.java.net/content/repositories/releases/javax/servlet/javax.servlet-api/4.0.0/)

## JavaServer Pages 2.3
- [JSR-000245 JavaServer Pages 2.1 \(Maintenance Release 2\)](https://jcp.org/aboutJava/communityprocess/mrel/jsr245/index2.html)
- [Index of /repositories/releases/javax/servlet/jsp/javax\.servlet\.jsp\-api/2\.3\.0](https://maven.java.net/content/repositories/releases/javax/servlet/jsp/javax.servlet.jsp-api/2.3.0/)
NetBackup メディアIDの保持期間削除スクリプト

ここ最近Windows OSでPowerShellスクリプトを組む機会に遭遇したのでまとめておく。
新人の頃、NetBackupのサポート時代からあった問題。2002年ごろだったかな。この仕様を変えるつもりはないんだろうなぁ。

##NetBackupのボリュームプール設計のコツ
この問題は、テープバックアップをジョブスケジューラで回す場合に絶対的について回る。

テープメディアの保持期間の**Expire**状態から**Available**状態への遷移中に、バックアップを実行すると、使用可能なテープメディアがないと判断されてしまう事象。
これは、テープの保持期間を強制的に削除することで解決できるのだが、外部運用スケジュールミドルウェア（JP1/AJSなど）でジョブ実行している場合は作りこみをせねばならない。

なぜこの問題が発生するかというと、テープのローテーションを最低限の本数で回そうとすると、上書きをどこかでしないといけないのだが、上書きをするためにはテープの保持期間が切れている必要がある。テープの保持期間が切れている状態とは、テープに取得したバックアップデータの保持期間がすべて期限切れとなっている状態である。例えば保持期間7日間のバックアップデータを取得した場合は、24*7時間経過した後でなければそのテープは上書き用として利用できない。
さらに、ボリュームプールに複数のテープが登録されている場合は、保持期間を持つテープが優先的にバックアップ対象として選択され、追記書きされる仕様となっていることにも注意だ。そのため、ボリュームプール設計において、各ボリュームプールに1本ずつメディアIDを登録するなどの工夫をしておくと、運用上扱いやすい設計となる。

##前提条件
前提として、ボリュームプール内のすべてのメディアの保持期限をクリアするので、テープを1本だけクリアしたい場合はこのスクリプトの例を応用して作成してほしい。

保持期間が残っているメディアのみ対象にするなどの改修が必要なので注意。

##vmqueryコマンドによるメディアの状態確認
テープメディアが下記のように設定されている状態を例に説明する。

```
# /usr/openv/volmgr/bin/vmquery -b
メディメディロボッ  ロボッロボット 側面/ 光         # マウント/  最終
アID   ア形式 ト形式  ト#    スロット 断面  パートナークリーニングマウント時間
-------------------------------------------------------------------------------
LTOD01  HCART  TLD      0       1     -       -          23     yyyy/mm/dd HH:MM
LTOD02  HCART  TLD      0       2     -       -           5     yyyy/mm/dd HH:MM
LTOD03  HCART  TLD      0       3     -       -           6     yyyy/mm/dd HH:MM
LTOD04  HCART  TLD      0       4     -       -           1     yyyy/mm/dd HH:MM
#
```
また、ボリュームプールの構成は以下例とする。
4本のテープメディアを3つのボリュームプールに所属させる。
2本は同じボリュームプールに所属している構成だ。（`test_pool_03`に2本設定されている）

```
ボリュームプール名　メディアID
---
test_pool_01　　　LTOD01
test_pool_02　　　LTOD02
test_pool_03　　　LTOD03
test_pool_03　　　LTOD04
```


##配列にボリュームプール内のメディアIDを入れる

PowerShellスクリプトで以下のように実装する。
ボリュームプール名は`$v_TARGET_MEDIA`変数にローテーションで定義するファンクションを別途実装しているが、ここでは割愛し、`test_pool_01`を手動設定した例にて説明。

```
        $v_TARGET_MEDIA = "test_pool_01"
        try{
            $media_array =@("C:\Program Files\Veritas\Volmgr\bin\vmquery" `
                                 " -b -pn "$v_TARGET_MEDIA `
                                  | ?{ $_ -match '^ *LTOD'} | Select-Object -first 2 | %{ $_.Split()[00] })
            
        }catch{
                return 1
        }
```

vmqueryコマンドが異常終了した場合は、return 1を返すので、ループの判定等に使用してほしい。

##保持期間のクリア処理

保持期間のクリアは`bpexpdate`コマンドを使用する。
メディアIDしか指定できないため、このような作りとする必要がある。
※ボリュームプールを指定可能としてしまうと、本来クリアしてはならないバックアップまで利用不可としてしまうので、製品仕様としては致し方ない。

配列`$media_array`に代入したすべてのメディアIDに対して保持期間のクリアを実行する。

```
        $MediaCount = $media_array.Count
    
    do{
        $media_count++
        try{
            $v_RESULT = "C:\Program Files\Veritas\NetBackup\bin\admincmd\bpexpdate" `
                             -m "$media_array[$MediaCount]" -d 0 -force
        }catch{
                return 1
        }

        }while($media_count -lt $MediaCount)
```
ここでもコマンドが異常終了した場合は、return 1を返すので、ループの判定等に使用してほしい。
arpコマンドでDNSのパケットが発生する件について

待望の[ぶぅちゃんズ Advent Calendar 2019](https://qiita.com/advent-calendar/2019/bu-chans) 3日目。

OSによるが、`$ arp -a`というコマンドを実行するとなぜかプロトコルがARPではなくDNSのパケットが発生する。

直感に反する行為で混乱を招いたため、その理由を調査した。

# ARPとは

ARPとは、IPアドレスからMACアドレスを解決するために使われるプロトコルであり、OSI参照モデルではネットワーク層に値する。(データリンク層と表記する場合もある。)

同一のネットワークに接続されたものどうしは、MACアドレスで通信を行うため、ARPテーブルというIPアドレスとMACアドレスの対応表をキャッシュとして持っている。これを頼りにMACアドレスを求めてデータを送信する。

ARP要求パケットをブロードキャストして、該当するIPアドレスを持つコンピュータがARP応答パケットを返す。これによりARPテーブルは更新され、一定時間経過すると削除される。

# ARPが発生しない理由
`arp -a`コマンドはARPテーブルの内容を表示するためのものである。
自分が持つキャッシュを参照しているだけなので、パケットは発生しない。

# DNSが発生する理由
`arp -a`コマンドを実行すると以下のようになる。

```
$ arp -a
? (192.168.80.82) at de:ad:be:ef:ca:fe on en0 ifscope [ethernet]
? (192.168.80.1) at fe:ed:ba:be:fa:ce on en0 ifscope [ethernet]
...
```

発生するDNSのパケットを解析すると、ARPテーブルにある全てのIPアドレスについてDNSで問い合わせている。

DNSサーバに対応するドメイン名があれば、この`?`の部分にドメイン名が表示されるのだ。

そのためDNSパケットが発生している。

# おまけ
## ARPについての豆知識
ARPは自分のIPアドレスが他に使われていないか確認するために使われることもある。
その場合は、自分のIPアドレスをセットしたARP要求パケットを送信し、応答があれば使われていると判断される。

これはGratuitous ARPであり、ネットワークスペシャリストに出題されている。(平成28年度秋期午前II問6)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404817/89805791-6bd3-608f-bb34-1178a561cddd.png)

正解はア。

# え?これプログラミングの記事だったの?
まあ。
jestでapiのスナップショットテスト 

![alt](https://user-images.githubusercontent.com/26253721/39765058-e8d0eae4-531b-11e8-9305-4c852f269517.png)
jestのスナップショットテスト使ってますか？
あるファイルに、変更があるか否かを判定するだけのテストですね。

実はスナップショットテストで、APIをテストすることが出来るんです。
APIに変更があったら教えてくれるのでとても便利ですよ。

ただし、テスト出来るのは、純粋で副作用のないAPI（同じリクエストに、同じレスポンスが帰ってくる）に限りますが、とても少ない記述量で、e2eテストを記述できるのは便利です。

## 以下サンプル

``` apiSnap.test.js
const axios = require('axios')

test('starwars api test', async () => {
  let response
  try {
    response = await axios.get('https://swapi.co/api/people/1')
    expect(JSON.stringify(response.data)).toMatchSnapshot()
  } catch(e) {
    fail()
  }
})
```

responseはJSON.stringifyでstringに変換してからsnapshotとして保存します。
json stringifyを使うと1行で、snapshotを作成出来ます。
ORM（O/Rマッパー、O/Rマッピング）とは

# ORMとは
ORMとは、`Object / Relational Mapping`の略であり、
オブジェクトとDBをマッピング（対応づけ）するための技術や機能のことです。

## もう少し詳しく
Webアプリケーション開発をしているときでは、必ずと言っていいほど次の場面に遭遇します。

* オブジェクト指向型言語を利用したプログラミング
* DBに接続し、データのやりとりを行う

このとき、データの取得や追加のSQL文をソースコードに直接記述するのは良い方法ではありません。
ORMを利用して、DBのデータをオブジェクトにマッピングしてからプログラム内でデータの操作を行う方が適切です。

## ORMのメリット

* DBの構成が変わっても、ソースコード本体に影響なく改修できる
* DBのデータを一つのオブジェクトとして扱うことができる
* ORMがキレイに作られていれば、他のコンポーネントでも利用することができる
* →DBのデータ構成が変わった時ORMのみ改修すれば良い、という状況になる


## 例

| 名称      | 用途 |
|:--------:|:----:|
| Doctrine | php |
vimでdeleteキーが ^? になってしまった時の無理やりキーマップ法

# 結論

`vim ~/.vimrc`

```vim
set t_kb=^?
```

参考
https://vim-jp.org/vimdoc-ja/term.html

`set t_kD` だと本来的なDelete。


これ、 `tmux` をデフォルト設定で使うと起こりやすいようだ…。
Rails5 の belongs_to  の required: false と optional: true の違いは？ 同じっぽい。


[Rails5からbelongs_to関連はデフォルトでrequired: trueになる - Qiita](https://qiita.com/iguchi1124/items/218e35a145f372062ea4)

[Rails 5 makes belongs_to association required by default | BigBinary Blog](https://blog.bigbinary.com/2016/02/15/rails-5-makes-belong-to-association-required-by-default.html)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2680








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Puppet Server を dockerで動かして、Ubuntu 20.04 からagent接続

## 参考

* [Install Puppet Server on Docker - The Startup - Medium](https://medium.com/swlh/install-puppet-server-on-docker-fe4a80cbe3be)

## 起動

```sh:puppetmaster
# https://hub.docker.com/r/puppet/puppetserver

mkdir -p code

docker run \
 -it -d \
 --restart=always \
 --name puppet \
 --hostname puppet \
 -p 8140:8140 \
 -v $(pwd)/code:/etc/puppetlabs/code/ \
 puppet/puppetserver:6.12.0
```

* 他のバージョンを動かしたい場合は、`6.12.0`の箇所を`2.7.2`にするだけでよい。

```sh:manifest格納場所の作成
mkdir -p ./code/environments/production/manifests/
```

```sh:code/environments/production/manifests/site.pp
node default {
  file {'/tmp/example-ip':
    ensure  => present,
    mode    => '0644',
    content => "Here is my Public IP Address: ${ipaddress_eth0}.\n",
  }
}
```

### 実行

* `docker exec -it コンテナID /bin/bash` でコンテナに入って以下実施

```sh
# dry-run
puppet agent --test --noop

# 実行
puppet agent --test
```

```sh
# 念のため、signed一覧
puppetserver ca list --all
```

## Ubuntu 20.04 に agent 追加

* deb一覧は https://apt.puppetlabs.com/
* dockerコンテナの`tcp 8140`を開けておくこと。

```sh
wget https://apt.puppetlabs.com/puppet6-release-focal.deb
dpkg -i puppet6-release-focal.deb

apt update

apt install -y puppet-agent
# /opt/puppetlabs にインストールされる。
```

puppetサーバーの名前解決ができるようにしておく。(`docker --hostname` で指定したホスト名)

```sh:/etc/hosts
#127.0.0.1 puppet
192.168.0.6 puppet
```

```sh
# puppetserverに接続
#   proxy接続中は接続が失敗する。403 "Access violation"

export PATH=$PATH:/opt/puppetlabs/bin

puppet agent --server puppet -t --noop --verbose
```

```sh:念の為、puppetサーバーで確認
# 自動でsignされている

puppetserver ca list --all
```

```sh:実行
export PATH=$PATH:/opt/puppetlabs/bin

# dry-run
puppet agent --server puppet -t --noop

# 実行
puppet agent --server puppet -t
```
HTMLで複数のidを指定した場合

htmlに同一名のidを指定してそれらを一括して適用させる関数をJavaScriptで書いたのだが、htmlに複数の同一名idは文法違反らしく、getElementById　で指定したものは複数あるうちの初めの一つにしか適用されていなかった。
ぱっと見エラーが表示されるわけではないので初心者には要注意のミスだと思う
Rasberry Pi がなくても無料でそれなりの監視カメラができた（プログラミングとは関係がない備忘録）

（この記事は2019年11月8日現在の検証資料です）
　
#IoTをもっと活用したい
（スマホやタブレットで）気軽にクラウド接続保存の（Google Drive など）自宅の監視カメラを作りたいなあと思っていて、どのような方法があるかQiitaでも検索をしたところ、Rasberry Pi の事例が多くヒットした。スクラッチ開発では大変だなあと思っていた反面、Google Play上で相当数のアプリが転がっており、アプリ毎に何ができて何ができないのかよくわからない状況でもある。ネット検索してもどれもいまいちで無料版だとできることも限られているのかと思いきや、こりゃすごいというアプリを発見。英語や日本語資料は極めて少ないが50万ダウンロード、7000のレビューが既に投稿されていたアプリ。どうも韓国で作成されたアプリで SeeCiTV というAndroidアプリ。現在ではiOS版はまだないとのこと。使ってみたら結構便利、動体検知については高機能で無料版でもできることが多すぎて（広告は表示されるが）既製品使えばいいや！と思って、開発自体を諦めてしまったことに関する備忘録になる。機密性がなければこの監視カメラをすぐにでも利用しないのはもったいないと感じた。
#SeeCiTVの何がすごいの？制限は？
＊＊＊＊＊できなさそうなこと（制約条件）＊＊＊＊＊
・日本語版はない。英語で我慢すれば使える。
・無料版は1つのGoogleアカウントで2台まで（カメラ1台、リモートコンソール1台（それぞれ反転可）の使い方を想定、有償版であれば複数カメラを一つのリモートコンソールで管理できる、有償版は決済通貨によるが月額400〜500円程度の様子（安い！））
・無料版の動画解像度が低い(最大で640x480、ECOモードというものがあり更にサイズを落とすために３パターンの切り替えができる)
・無料版は動画ファイル毎の最大秒数が10秒（10秒毎に区切られてしまう）、時間毎にキャプチャ設定する場合の制限がある（無料版では最大で30分に4回まで）
・常時録画しておくというより、定期的なキャプチャか侵入者など物体移動を検知した際の録画の選択になる（大きな騒音が始まったことを通知、確認する機能はないので赤ちゃんが泣き叫ぶ際の見守りという目的には使えそうにない）
・ストリーミングサーバーが無料版と有償版で異なり、どちらにしてもストリーミングについてはアプリが関係するサーバーを経由する様子
＊＊＊＊＊コンソールからカメラに接続して＊＊＊＊＊
・カメラ機能のON/OFF
・バッテリー残量確認、ネット回線信号強度確認、動体検知録画/定期キャプチャの変更・確認
・フラッシュのON/OFF
・ナイトモードのON/OFF
・画面縦横変更
＊＊＊＊＊できること＊＊＋＊＊＊
・動体検知時点の少し前からの録画が保存される（これ重要）
・Googleアカウントの認証に加えてカメラ接続のパスワード設定（デフォルトでは1234）
・Google Driveへの自動アップロード、アップロード後、端末上にファイルを残すか自動削除するか選択（Google DriveにSeeCiTV_Motion, SeeCiTV_Picture というフォルダが作成され、その配下に格納されていきます）
・録画時、接続時等にカメラ側で音を鳴らすか鳴らさないか選択
・デバイス名の命名
・デバイス間での音声通話、音声確認（カメラとリモートコンソールでライブで音声やりとり、確認ができる、侵入者がいたらこら〜〜〜と怒ることも（笑）オフィス内で社員への指示や自宅でお子さんとのやり取りにも使える？）、エコーキャンセルやノイズ除去など音声調整機能がある
・WiFiかSIM回線でGoogle Driveへの自動保存（若干のタイムラグはあるがリアルタイムに近い）
・ライブストリーミングとストリーミング中のクライアント側でのキャプチャ、録画（ストリーミング中はカメラ側ではキャプチャ、録画は停止する（逆にクライアントサイドでキャプチャや録画ができるようになる））
・動体検知時のコンソールへのポップアップ通知（この機能は非常に便利、何もなければ何も検知されていない・侵入者がいないとみなせるので・・・）
・コンソールからカメラ接続時点のキャプチャ自動保存
・バックグラウンドで自動開始、自動復旧

普段は動きがない在庫の保管庫の監視（常時録画を避けられるのでデータ量が小さくて済む）や出先・旅行先で自宅を確認する目的（侵入者がいれば端末破壊・盗難されてもクラウドにはデータ保管がされている）など広範囲に活用できると思うし、スクラッチ開発で監視カメラアプリを開発しようとした際のベンチマークアプリになることは間違い無いと思う。

空いていたAndroidタブレットと無料のGoogle Driveの活用で、追加コストなしで24時間365日見張れる監視カメラができてしまった。

#アプリの場所
https://play.google.com/store/apps/details?id=com.code.bluegeny.myhomeview&hl=ja
Googleスプレットシートで翻訳できる関数

エクセルなんてお客様からいただくだけで
ほとんど扱ったことなかったのですが、
今後、使う機会も多くなってきそうなので
ちょっと楽しそうなのをピックアップ

#まあこれ見てもらえれば全てなんですが
 - [Google Translate Formula in Sheets [Screencast]](https://www.youtube.com/watch?v=VcyhrKKP2ZI)


#翻訳の書き方はこちら

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528622/d8e281ca-4bfa-a4e2-58c7-ce6856383585.png)

わかりやすいように
`A1`に`タイトル（翻訳元）`、
`B1`にも`タイトル（翻訳したい言語）`
を書きます

`A2`に`翻訳元の言葉`を書きます
`B2`に`=GOOGLETRANSLATE(A2, "auto", "en")`
と書きます

```bash:ところで、なんですが

=って打つと関数というやつが発生して
そこからスペルを打とうとすると
関数の候補とかでるんですねー
```


#=GOOGLETRANSLATE(A2, "auto", "en")

`A2`が翻訳したいセル番号
`auto`が翻訳元`auto`だからよしなにということで

#よしなにって結構みんな使うよね

`en`がこの場合`英語に翻訳`しますよ
ということらしいです

#OK！あとはグイーッと引っ張るだけ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528622/42d3dc1f-f50b-fecc-9e9b-d99f48ad579f.png)

あとは、`Japanese（A）`のほうにいろいろ翻訳してほしい文字を書いてから
その右の`English（B）`のほうの`Helloを囲むの青い枠の■`を
したにグイーッと引っ張っていけば縦に翻訳してくれます

>Helloを囲むの青い枠の■を
したにグイーッと引っ張っていけば

これいいっすよね
package.jsonのversionをコマンド(ワンライナー)で取り出したい

PWAとかやってると、index.htmlのmetaタグにversionを記載したかったりするはずです:santa:
その際に、適当にバージョンふるのもいいですが、自分はpackage.jsonのバージョンで運用していて、かなり簡単にバージョン取り出せたので、そのコマンドを共有します:fish:

# TL;DR

- package.jsonのバージョンを取得
- npxコマンド使用
- package.jsonのパースとかしない、コマンドのみ
- シェル上で取り出す（CIとかで使用）


# 環境

- npm 5.2.0以上だそうです（npx使用するので）

# 【結論】version取得コマンド

```bash
npx -c 'echo "$npm_package_version"' 

# 1.0.0
```

これで取得した値でindex.htmlを上書きできますね:santa:


# npxコマンドとは
[この記事](https://qiita.com/tonkotsuboy_com/items/8227f5993769c3df533d)を参考にしていただくと早いのですが、簡単にいうとローカルのパッケージを使用するコマンドです:fish:

npxを使用すると、

```bash
(node_modules/.bin/eslint)

or

$(npm bin)/eslint
```

↓

```bash
npx eslint
```

で短いコマンドで実行できますね:santa:

# controller内などjavascriptで取得したい

普通にrequireで取り出せますね:santa:

```javascript

const packageJson = require("package.json")

const version = packageJson.version
```


おしまい:santa:

# 参考

- [GitHub Issue](https://gist.github.com/DarrenN/8c6a5b969481725a4413#gistcomment-2193788)
インスタンスを複製した後におこなう、Mackerel関連作業

## 1. mackerelの状態の確認

おそらくインスタンスが起動してもそのまま mackerel-agentが通知を飛ばし続けるはず。

` $ cat /etc/mackerel-agent/mackerel-agent.conf`
で　APIkey を確認する


` $ mackerel-agent once`
で、一度だけメトリックスを収集


## 2. エージェントのアンインストール

※ centOSの場合

https://mackerel.io/ja/docs/entry/howto/install-agent/rpm

* 退役させる：Hosts > サーバーの設定 > 右下の「このホストを退役させる」
* sudo yum erase mackerel-agent
* /var/lib/mackerel-agent/id にホストIDの記録されたファイルを削除する
NestJSでTypeORMを使ってmigrationを試してみる

# はじめに
最近MySQLに触る機会があったのですが、「migrationできるようにして欲しい」と頼まれ、「migrationって何ぞや？」となったので備忘録としてこの記事を書きました。
自分もDB初心者なので、同じような方向けです

### 環境
- windows10 Pro
- nestjs 6.7.2
- typeorm 0.2.19
- ts-node 8.1.0

# 早速migrationに触れてみる
### migrationについて
migrationとはDBに保存されているデータを保持しながらカラムを変更したりテーブルを作成したりするための機能です。
「このテーブル追加したい...」「この要素はいらなかったなぁ...」というときにDBを削除して作り直すのではなく、migrationファイルを基にDBのスキーマ等を変更することができる便利なものです。

**注意**
基本的にDBが既に作成されている前提で手順を書いています。
nestjsにおけるDBの触り方は公式のドキュメントが参考になると思います。
→[NestJS公式ドキュメント](https://docs.nestjs.com/)

## 1．必要なライブラリを入れる
`npm install typeorm`
`npm install ts-node`
この2つが必要になります
## 2．config関係の設定を行う
1. package.jsonのscripts部分に以下を追加する

```json:package.json
"scripts": {
     // スクリプト一覧
   "typeorm": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js --config ormconfig.js"
```
migrationの設定に関しては`--config ormconfig.js`の部分でormconfigを参照させるようにしています。
2. ormconfig.jsにmigrationの内容を追加する

```javascript:ormconfig.js
// 予めmigrationディレクトリを用意しておく
// 筆者はtypescriptで書いているため*.tsとなっている
migrations: ['src/migration/*.ts'],
  cli: {
    'migrationsDir': 'src/migration'
  }
```
## 3．migrationファイルを作成する
migrationファイルは以下のコマンドで作成できます。
`npm run typeorm migration:create -- -n [filename]`
ここのfilenameは任意のもので大丈夫だと思います。
コマンドを実行すると`[unixtime]-[filename].ts`というファイルが生成されます。名前のunixtimeは作成時刻をunixtimeにしたものです。
## 4. migrationファイルを編集する
実際にデータベース対する変更の処理を書いていきたいと思います。
3.で作成したファイルをのぞいてみると、ある程度ひな型がすでにできています。

```typescript:[unixtime]-[filename].ts
import { MigrationInterface, QueryRunner } from "typeorm";

export class [filename][TIMESTAMP] implements MigrationInterface {    
    async up(queryRunner: QueryRunner): Promise<any> {        
    }

    async down(queryRunner: QueryRunner): Promise<any> {         
    }
}
```
※formatterを使っている人は初期状態だとめちゃめちゃ怒られるかもしれません

ひな型には`up`と`down`があり、migrationを実行する際は`up`の中身が実行され、migrationで実行した内容を元に戻す際は`down`の中身が実行されます。

試しに「staffというtableのcolumnであるiconの名前をimageに変更する」という処理を書いてみます。

```typescript:111111-test.ts
import { MigrationInterface, QueryRunner } from "typeorm";

export class test111111 implements MigrationInterface {    
    async up(queryRunner: QueryRunner): Promise<any> {   
        await queryRunner.renameColumn('staff', 'icon', 'image');
    }

    // 元に戻す処理なのでupと反対の処理を記述
    async down(queryRunner: QueryRunner): Promise<any> {   
        await queryRunner.renameColumn('staff', 'image', 'icon');      
    }
}
```
QueryRunnerを用いることで簡単にDBに対する操作を記述することができます。renameの他にもさまざまな処理が可能になっています。
→[公式ドキュメント](https://typeorm.io/#/migrations)
また、新たにmigrationを実行する際には再度3．のコマンドでmigrationファイルを作成する必要があります。

## 5．migrationを実行する
- upの内容を実行するには以下のコマンドを叩く
`npm run typeorm migration:run`
このコマンドを叩くと、**(保留も含む)実行されていない全てのmigrationを時系列順に実行します**
なので何かしらの処理が保留状態になっていたりするとそれも実行されます。

- downの内容を実行するには以下のコマンドを叩く
`npm run typeorm migration:revert`
このコマンドを叩くと**最後に実行されたmigrationファイルのdownの内容が実行されます**
なので新規でmigrationファイルを作成して`npm run typeorm migration:revert`を行っても`:run`をしていなければ、1つ前のmigrationファイルのdownが実行されます。
また、`:revert`は1回前に戻すだけなので、複数前のバージョンに戻す際は回数分`:revert`を実行する必要があるみたいです。

# 最後に
少ししかmigrationについて触っていないので不備がかなりあると思いますが、誰かしらのお役に立てられれば幸いです。
Node.jsでキー入力を検知する

# 概要
Node.jsアプリケーションを単体で動かしている時に、押されたキー情報を取得する方法

# 背景
Node.jsアプリケーションを単体で動かしている場合(コンソールから制御)において、キーの押下をトリガーにキーの状態そのものを取得する方法として, `readline`がFirebaseと一緒に使えなかったり、`ffi`パッケージが入らなかったため。

# 実装手順
## 1.`npm install keypress` でパッケージを導入 
今回は [keypress - npm](https://www.npmjs.com/package/keypress)を利用します。
ターミナルで下記コマンドを入力してください。

```
npm install keypress
```

## 2. 使ってみる

以外、殆どが公式npmページからのコピペですが、少し補足をしています。  
重要なところにコメントを付けているので、そちらをご参考にしてください。

``` JavaScript 
//1. ライブラリを読み込む
var keypress = require('keypress');

//2. keypressを標準入力に設定
// make `process.stdin` begin emitting "keypress" events
keypress(process.stdin);
 
// 3. keypressイベントの購読を開始
// listen for the "keypress" event
process.stdin.on('keypress', function (ch, key) {

  // 4. key. で入力情報を取得
  console.log('got "keypress"', key);

　//Ctrl + c入力のときの処理
  if (key && key.ctrl && key.name == 'c') {
    process.stdin.pause();
    //強制終了するなら　process.stdin.exit();
  }
});
 
// 5. プロセス実行中のキー入力を拾うように設定
process.stdin.setRawMode(true);
process.stdin.resume();
```

ご覧の通り、`key.name`でキーの名前の取得が出来たり,key.”any key”(上の例だとkey.ctrl)でctrlやshiftが押されているかどうかの判定もできるようです。

# 最後に
Node.jsの経験がほとんどなく、なんならサーバーサイドの経験がnullに近い状態だったので色々大変でした。
でもこうして触っていると色々できるなぁと思うこともあり、[ニコ生コメでLチカ](https://github.com/tabe0000/niconama_tech_prj)させてみたり、[ニコ生コメントではちゅねにネギを振らせてみた](https://www.nicovideo.jp/watch/sm35859661)りして遊べて色々楽しいなとか思い始めました。今後、もう少し本格的にサーバーサイドもやってみたいなと思います。

もし、不備、誤記、もっといい方法があるよ！ などございましたらお気軽にお申し付けください。



# 参考文献
[keypress - npm](https://www.npmjs.com/package/keypress)
.NET Core 3.0 でのChartの取り扱い方


まずは、以下のパッケージ（System.Windows.Forms.DataVisualization）をNuGetからインストール。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114606/90a09402-21bf-6ba2-1fb5-2741b4bcdf1f.png)
次に、コンパイル時に以下のパッケージ(System.Data.SqlClient)がないといわれるので、事前にインストール。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114606/fcdca91d-385a-b1bd-82f0-65e4a2ad63f1.png)
あとは、FormのDesigner.csにChartを配置するコードを記述するのみ。

[参考元](https://devblogs.microsoft.com/dotnet/announcing-net-core-3-preview-4/)

追記：
気が付いたら、実行時にOledb.dllを参照するDataVisualization（多分、.net framework用？）を参照するようになって動作しなくなったので追記。
プロジェクトの中身（.csprojファイル）から、以下のような内容を削除。

```
    <ItemGroup>
      <Reference Include="System.Windows.Forms.DataVisualization, Version=4.0.0.0, Culture=neutral>
      <HintPath>System.Windows.Forms.DataVisualization.dll</HintPath>
      </Reference>
    </ItemGroup>
```

晴れて、SqlClientを参照するようになり、動作上問題はなくなった。
なぜこのような記述が追加されたかは不明。。。
JavaScript：演算子「!」(否定) を用いて、各型／値の boolean 型への変換について

## 検証

演算子「!」(否定) にて各型の値を boolean 型(真偽値) へ変換を行う

### 確認

``` JavaScript:true_or_false.js
    class TestClass {
        constructor(in_value01, in_value02) {
          this.in_value01 = in_value01;
          this.in_value02 = in_value02;
        }

        get property01() {
          return this.add_method01();
        }

        add_method() {
          return this.in_value01 + this.in_value02;
        }
    }
    // ----------
    console.log('!true = ' + !true);
    console.log('!false = ' + !false);
    console.log("!undefined = " + !(undefined));
    console.log("!'' = " + !'');
    console.log("!'A' = " + !'A');
    console.log("!'ABC' = " + !'ABC');
    console.log("!(-10) = " + !(-10));
    console.log("!(-1) = " + !(-1));
    console.log("!0 = " + !0);
    console.log("!1 = " + !1);
    console.log("!10 = " + !10);
    console.log('!(new TestClass(2, 3)) = ' + !(new TestClass(2, 3)));
```

### 結果

``` JavaScript:output
!true = false
!false = true
!undefined = true
!'' = true
!'A' = false
!'ABC' = false
!(-10) = false
!(-1) = false
!0 = true
!1 = false
!10 = false
!(new TestClass(2, 3)) = false
```

## 結論

型により、演算子「！」(否定)にて、真偽値(boolean)へ変換を行った場合は、
***```「0」,「''」,「undefined」,「false」```***
のみが「false」になった。
***※ 演算子「!」(否定)がついているため、上記結果では否定の「true」という結果になっている***

【表1 まとめ】

|　　　対象             |　　　!(対象)　　　|
|:---------------------|:------------------:|
|true                  |false               |
|false                 |true                |
|undefined             |true                |
|''                    |true                |
|'A'                   |false               |
|'ABC'                 |false               |
|(-10)                 |false               |
|(-1)                  |false               |
|0                     |true                |
|1                     |false               |
|10                    |false               |
|(new TestClass(2, 3)) |false               |

## 追記

こちらにこれらの boolean 変換のことの記述があることを教えていただきました
[MDN Web Docs 用語集: ウェブ関連用語の定義 > Truthy](https://developer.mozilla.org/ja/docs/Glossary/Truthy)

> JavaScript において、 truthy は Boolean コンテキストに現れた時に true とみなされる値のことです。 falsy として定義された値 (つまり、false, 0, "", null, undefined, NaN) を除くすべての値は truthy です。
ついにstableになったRustのasync/awaitを試してみる

# :tada:祝！Rust 1.39.0
[ついに、Rust 1.39.0になりました！](https://blog.rust-lang.org/2019/11/07/Rust-1.39.0.html)そこで、既に他の方も書かれているかもしれないですが、安定化した`async`/`.await`を試してみたいと思います(なお、筆者はRust及び非同期初心者です)。

## 基本的な`async`/`.await`
最も基本的な使い方は、

```rust
async fn f() {
    let future = /* impl Futureな何か */;
    future.await;
}
```

です。簡単！と思ったのですが、`.await`は`async`関数またはブロックの中でしか呼べず、また`.await`をしないと実際には処理を開始してくれないので、(簡単には)`async`でない`main`関数から呼び出せません...困った。

## `futures` crateとの併用
`futures 0.3`を使えば簡単に`async/.await`できるみたいなので、試してみました。

### 基本
まず、`async fn`で非同期処理したい関数を作成します(ここまでは`std`でできます。)

```rust
async fn long_task(task_id: usize) {
    println!("Task {} on {:?}", task_id, std::thread::current().id());
    std::thread::sleep(std::time::Duration::from_secs(1));
    println!("Task {} done", task_id);
}
```

追記: 今更ながらちゃんと[ドキュメント](https://doc.rust-lang.org/std/thread/fn.sleep.html)をみたら **`std::thread::sleep`は`async fn`内では使ってはいけない** と書いてありました。同様のことを行うには各runtime(tokioやasync_std、futuresの場合はfutures-timerというクレート)の`Delay`を使うとできるそうです。

続いてこれを`main`関数から呼び出すわけですが、ここで`futures::executor::block_on`を使います。

```rust
fn main() {
    let task = long_task(0); // ここではまだ実行されない
    futures::executor::block_on(task); // ここで実行される(.awaitの代わりのようなもの)
}
```

これで **`main`関数と同じスレッドから** `long_task`関数が呼び出せました。

### 別スレッドでの処理
非同期処理するからには異なるスレッドで実行したいので、それを試してみます。そのためにまず`futures`に`thread-pool` featureを加えて、`futures::executor::ThreadPool`を作ります。ビルダーから作っても良いですし、単に`new`するだけでも大丈夫です。
別スレッドで処理してもらうために`spawn`系を呼び出すのですが、単に`spawn`してそのまま終わってしまうとやはり実行されない(ことがある)ので、後で`join`するために今回は`spawn_with_handle`を用いました。その結果、以下のような感じになりました。

```rust
use futures::{
    executor::{block_on, ThreadPool},
    future,
    task::SpawnExt,
};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut pool = ThreadPool::new()?;
    let mut futures = Vec::new();
    for i in 0..20 {
        futures.push(pool.spawn_with_handle(long_task(i))?);
    }
    block_on(future::join_all(futures));
    Ok(())
}
```

## 感想
現状、`std`だけだと非同期処理を書くのはちょっと大変そうです。もちろん、`futures` crateもRustで書かれているので頑張れば以上のことを`std`だけでできるはずですが、ソースコード見ても私にはなかなか難しそうだったので、素直に外部crateを使うことにします。ありがたや～
rubocopの起動をチョッパヤにする

## 概要

rubocop でコードのチェックをしているが、検査が始まるまでにどえらい時間がかかるのでなんとかしたい

## 原因

ファイルのリストアップに時間がかかっているっぽい。
プロジェクトのファイル数に比例してロード時間が伸びる。

## 解決策

Exclude に除外するディレクトリを登録
gemとかJSのライブラリのディレクトリを除外する

```ruby
AllCops:
  Exclude:
    - '.direnv/**/*'
    - '.git/**/*'
    - 'bin/*'
    - 'db/schema.rb'
    - 'config/**/*'
    - 'lib/tasks/**/*'
    - 'log/**/*'
    - 'node_modules/**/*'
    - 'public/**/*'
    - 'tmp/**/*'
    - 'vendor/**/*'
```

## 結果

before

```shell
$ rubocop  0.18s user 0.09s system 1% cpu 13.618 total
```

after

```shell
$ rubocop  0.18s user 0.09s system 13% cpu 1.939 total
```

チョッパヤ

## おまけ

rubocop_lineup を使うとmasterとの差分ファイルだけrubocopで検査できるぽい
https://github.com/mysterysci/rubocop_lineup

```ruby:Gemfile
gem 'rubocop_lineup', require: false
```

```shell
$ rubocop -r rubocop_lineup
Running via Spring preloader in process 22592
Inspecting 7 files
.......
```
仮想デスクトップでエクセルを立ち上げるとデスクトップが移動してしまう問題

##何が問題？
Windows10で仮想デスクトップをWin+Ctl＋Dでたくさん作って、デスクトップ1でエクセルを立ち上げた状態とします。
その後、デスクトップ2でエクセルを立ち上げようとすると、デスクトップ1に移動してしまって、なんだかなぁとなってしまうのです。

![desktop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51562/6c168909-3b0b-25b7-cd32-59a2195144a0.png)

Windowsの仮想デスクトップの機能では、どのデスクトップにも共通でアプリを表示させることができます。
でも、今回は別々のデスクトップで別々のエクセルで仕事をしたい、こんなときになるべく作業効率を落とさない苦肉の策を書いておきます。

##エクセルを別プロセスで立ち上げる
結論から言うと、

```
>excel /x
```
により、別プロセスで立ち上げると作業しているデスクトップでエクセルは起動してくれます。
ということで、こんなバッチを作ればいいんです。

```
@echo off

c:
cd "C:\Program Files (x86)\Microsoft Office\root\Office16"
start "" excel -x
```

このバッチをタスクバーにピン留めしたいのですが、バッチファイル自体はそうすることができないようです。

そこで、一旦コマンドプロンプトをピン留めし、リンク先とアイコンを変更します。
![propertywindow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51562/a15c16d0-9d92-a00e-6f92-2f4aab8bea4b.png)


これで、新しいデスクトップでエクセルを始めに立ち上げたいときにタスクバーのアイコンをクリックすると、デスクトップ内にエクセルが立ち上がるようになります。

##デフォルトで立ち上がるテンプレートを消す
でも実はまだ問題があり、新しくエクセルを立ち上げると空のブックが立ち上がります。
このせいで、すでにエクセルを立ち上げているデスクトップに移動してしまいます。

この問題を回避するために、デフォルトで立ち上げようとするファイルを削除しておきます。
C:\Users\[ユーザ名]\AppData\Roaming\Microsoft\Excel\XLSTART

ここにあるファイルを削除します。
ちなみにこの場所は、[ファイル]>オプション>セキュリティ センターの「セキュリティセンターの設定(T)」ボタンをクリックし
信頼できる場所の一覧から確認できます。
![securitycenter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51562/d8a58e28-6b0e-8a9f-3031-e8d57bd3e260.png)



これで、作業デスクトップ内でエクセルが立ち上がるようになりました。


##今後したいこと
マウスの右クリックメニューから、既存のエクセルファイルを別プロセスで立ち上がることができたらなおいいですよね～

バッチでなく、アプリで別プロセスで立ち上げられたらいいのですが、
”送る”に対応していない単純なアプリなら、[GitHab](https://github.com/takeuji/excel_launcher4virtual_desktop)に置いています。
MacにMavenをインストール(memoレベル)



1、https://maven.apache.org/download.cgi にアクセス

2、Binary tar.gz archive(バージョンは必要に応じて)を適当な場所にdownload
   例：apache-maven-3.6.2-bin.tar.gz

3、apache-maven-3.6.2-bin.tar.gzを解凍　(double clickすれば解凍できる)
　 例：apache-maven-3.6.2

4、/usr/local配下に移動
　Finderを開き、shift+command+Gを実行、/usr/localを入力して、移動させる
　解凍したファイル(例：apache-maven-3.6.2)を/usr/localに移動

5、コマンドを実行

```
$ cd ~
$ vi .bash_profile
```

6、bash_profileファイルを修正

```.bash_profile.
export M3_HOME=/usr/local/apache-maven-3.6.2
M3=$M3_HOME/bin
export PATH=$M3:$PATH
```

7、コマンドを実行

```
$ source .bash_profile
```

8、コマンドを実行。バージョンが表示できたら、ok

```
$ mvn --version
Apache Maven 3.6.2 (40f52333136460af0dc0d7232c0dc0bcf0d9e117; 2019-08-28T00:06:16+09:00)
Maven home: /usr/local/apache-maven-3.6.2
Java version: 1.8.0_211, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk/Contents/Home/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.14.5", arch: "x86_64", family: "mac"
```

参考リンク：
https://qiita.com/saitoryc/items/737ee9e711f1ebe0dcfa
【Rails】gemなしで検索機能を実装する

# 実装環境
Rails 5.1.7
Ruby 2.4.0
Slimで実装


#やりたいこと
実装済のuserを検索したい
検索条件はあとから追加できるようにしたい
今回は名前検索を行う

# 参考記事
https://freesworder.net/rails-search/ 
https://www.sejuku.net/blog/71189
※ 個人的にわからないところがいっぱいだったので調べながら

```ruby:models/user.rb
class User < ActiveRecord::Base
  def self.search(search)
    if search
      User.where(['name LIKE ?', "%#{search}%"])
    else
      User.all
    end
  end
end
```

```slim:検索フォーム
= form_tag users_path, method => 'get' do
  p
    = text_field_tag :search, params[:search]
    = submit_tag "Search", :name => nil
```

``` ruby:controllers/users_controller.rb
class UsersController < ApplicationController
  def index
    @users = User.search(params[:search]
  end
end
```

# 補足: LIKEによるあいまい検索
SQLにはLIKE句を使ったあいまい検索の構文がある
` ~ WHERE 列名 LIKE '%検索値%' `
`~ WHERE 列名 LIKE '検索値_'`

% → 0文字以上の任意の文字列
_ → 任意の1文字

```ruby:
ModelClass.where("列名 LIKE ?", "%値%") # 値(文字列)を含む
ModelClass.where("列名 LIKE ?", "値_" # 値(文字列)と末尾の一文字
#Rails で has_many の association を delete_all してもレコードが削除されないのだが？

# model

```rb
class User < ApplicationRecord
  has_many :books
end
```

```rb
class Book < ApplicationRecord
  belongs_to :user
end
```

# 挙動のイメージ

```
Book.size 
# 3
```

```
user.books.size
# 3
```

```
user.books.delete_all

user.books
# []

user.books.size
# 0
```

```
Book.size 
# 3
```


# 理由

レコードは削除されず association の id が nil になってるっぽい

```rb
Book.first
=> [#<Book:0x00005604c5560390
  user_id: 1]

user.books.delete_all

Book.first
=> [#<Book:0x00005604c5560390
  user_id: nil]
```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2679








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Aurora MySQL の Audit Log の有効化

備忘録です。

結論として、以下の作業をまとめて実施する必要があります。

## Aurora の設定
### パラメータグループの変更
audit_log を出力するためにはパラメータグループに以下のパラメータの設定が必要です。

| parameter name | value | 
|:-----|:-----|
| server_audit_logging | 1 |
| server_audit_logs_upload | 1 |
| server_audit_events | CONNECT, QUERY,TABLE |
| server_audit_incl_users | (特定のユーザーのログののみ出力する場合は、こちらでユーザー名を指定） |

なお、 **デフォルトのパラメータグループでは設定の変更が行えない** ため、注意をしてください。（Audit Log を有効にしたい場合は、その Aurora クラスタ固有のパラメータグループを割り当てる必要があります。）

### Aurora クラスターのログ出力定義の変更
ログのエクスポート画面で「監査ログ」をチェックして保存をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44364/09495c9e-2c79-307d-aa0f-94862aa96435.png)

この作業により自動的に CloudWatch Logs のイベントストリームが作成され、Audit Log が出力されるようになります。

## 設定の拡張
パラメータグループのうち

- server_audit_incl_users
- server_audit_excl_users

を設定することで、どのユーザーの Audit Log を出力するかを制御することができます。

それぞれの設定範囲が重複した場合どちらが優先されるかは、公式ドキュメントに記載されています。以下はその内容を引用します。

> ・server_audit_excl_usersとserver_audit_incl_usersが未指定の場合(デフォルト値)は全てのユーザが記録されます
> ・server_audit_incl_usersにユーザを設定し、server_audit_excl_usersを指定しない場合、server_audit_incl_usersに指定したユーザのみ記録されます
> ・server_audit_excl_usersにユーザを設定し、server_audit_incl_usersを指定しない場合、server_audit_excl_usersに指定したユーザ以外が記録の対象になります
> ・server_audit_excl_usersとserver_audit_incl_usersに同一のユーザを設定した場合は、server_audit_incl_usersの優先度が高いため記録の対象になります

https://aws.amazon.com/jp/blogs/news/auditing-an-amazon-aurora-cluster/
Puppet 6をCentOS8で動かす

## 参考

* [How To Install Puppet 6.x On Ubuntu 18.04 / Ubuntu 16.04 & Debian 9](https://www.itzgeek.com/how-tos/linux/ubuntu-how-tos/how-to-install-puppet-on-ubuntu-16-04.html)

* 使用port `tcp:8140`

## インストール

```sh
# puppet6のリポジトリ追加
yum install -y \
  "https://yum.puppet.com/puppet6-release-el-8.noarch.rpm"

# パッケージのインストール
yum install -y \
  puppetserver puppet-agent

# メモリ使用量を256mbに抑える
sed -i -e 's/2g/256m/g' /etc/sysconfig/puppetserver
```

## 初期設定

```diff:/etc/puppetlabs/puppet/puppet.conf
+ [master]
+ dns_alt_names = puppetserver.local
```

```sh
puppetserver ca setup
puppetserver start
```

```diff:/etc/puppetlabs/puppet/puppet.conf
+ [main]
+ certname = puppetclient1.local
+ server = puppetserver.local
```

```sh
puppet resource service puppet ensure=running enable=true
puppetserver ca list --all
puppetserver ca sign --certname puppetclient1.local
```

## 実行

```sh
# dry-run
puppet agent --test --noop

# 実際に実行
puppet agent --test
```

## ルール記述

```puppet:/etc/puppetlabs/code/environments/production/manifests/site.pp
node 'puppetclient1.local' {
     file { '/tmp/puppetdir':
	     ensure => 'directory',
	     owner => 'root',
	     group => 'root',
	     mode => '0755',
	  }
}
```

```sh
# dry-run
puppet agent --test --noop

# 実際に実行
puppet agent --test
```

----


## Dockerfile

```sh
Dockerfile 
FROM centos:8

# タイムゾーン
RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# packages
RUN yum install -y \
 "https://yum.puppet.com/puppet6-release-el-8.noarch.rpm"

RUN yum install -y \
 puppetserver puppet-agent

RUN yum install -y \
 epel-release
RUN yum install -y \
 screen

RUN sed -i -e 's/2g/256m/g' /etc/sysconfig/puppetserver
```

```sh
docker run --rm \
 --hostname puppetserver.local \
 -it $IMAGE \
 /bin/bash
```
Python/Django アプリでよく使うコード【都道府県】

# この記事の背景

例えば店舗情報を登録するようなアプリの場合、その店舗の都道府県を設定することがあると思います。

この機能をいつでも使えるように、備忘録的にこの記事に残しました。

# コード

```python:models.py

class Pref(models.Model):
    code = models.CharField(max_length=2)
    name = models.CharField(max_length=4)
    
    def __str__(self):
        return str(self.name)
```

```python:views.py

def upload(request):
    if 'csv' in request.FILES:
        form_data = TextIOWrapper(request.FILES['csv'].file, encoding='shift_jis')
        csv_file = csv.reader(form_data)
        for line in csv_file:
            pref, created = Pref.objects.get_or_create(code=line[0])
            pref.code = line[0]
            pref.name = line[1]
            pref.save()

        return render(request, 'pref/upload.html')

    else:
        return render(request, 'pref/upload.html')
```

# importするCSVファイル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206150/c1e05851-11ea-aa7c-5bb4-fb1124a05cc8.png)

以上です。
Raspberry PiのMathematicaでセンサを扱う

　ラズベリーパイ（以下、ラズパイ）はMathematicaが無償で利用できます。ラズパイ4になってCPUの処理能力が上がったので、3Dの描画も延々と待たなくて済むようになりました。ラズパイは、GPIOやI2C、SPIなどのハードをアクセスできるのが特徴のLinuxマシンです。現在は、Raspbian Buster が2019年6月から利用できるようになりました。
#ターミナルからMathematicaを立ち上げる
　sudo Mathematicaと実行すれば、root権限でMathematicaが立ち上がります。通常piユーザは、GPIO、I2C、SPIをroot権限がなくてもアクセスできます。ここでは、MathematicaでMEMSセンサのBME280から温度を読み出し、グラフ化します。
#BME280のデバイス・ドライバの登録
　ラズパイには、コンパイル済みのセンサのデバイス・ドライバがたくさん用意されています。詳細は、/boot/overlays/READMEに書かれています。といっても簡単な説明だけです。ドライバの多くはiioです。
　最初は、メイン・メニューのPreferencesからRaspberry Pi Configurationをクリックし、Interfaceのタブを選び、I2Cにチェックを入れOKを押すことで、I2Cインターフェースを有効にします。Buster からは、リブートは不要になりました。
![ras202-e0df932a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/95a03d55-3b83-74cd-05fe-1393d8262b09.png)
```
　　sudo nano /boot/config.txt
```
で、設定ファイルconfig.txtを開き、最後の行に、
```
　　dtoverlay = i2c-sensor,bme280,param=0x76
```
を加え、上書きで保存し、終了、リブートをすると、BME280がI2Cインターフェースで有効になります。確認は、i2cdetect -y 1を実行し、0x76にUUと表示が出るとOKです。
![bme01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/2e85097e-57e6-d1bc-19d8-e139a90dfd0f.png)
　その前にセンサの接続をします。
#BME280はアマゾンで購入
　820円で、翌日配達でした。
>　　　「HiLetgo BME280 温度 センサー 湿度 センサー 気圧 センサー Arduino センサー 大気圧センサ 温湿度センサー ブレイクアウト Arduinoに対応 [並行輸入品]」

　次のようにI2Cで接続します。BME280自体はSPIとI2Cの両方に対応していますが、このボードはI2C専用になっていますし、デバイス・ドライバもI2C用です。
![BME280b-400wri.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/fda6e381-78b0-6e43-0a3c-4cc7fcc748e7.png)
#温度データの読み取り
　デバイス・ドライバを組み込むと、/sysの下に読み取ったデータがテキスト・ファイルで、随時更新されています。
![ras208.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/0996d162-a481-78c6-d6aa-0ca3d67bf570.png)

　次のように読み取ります。整数で、千倍の値が書かれています。
```
　　cat /sys/bus/i2c/devices/1-0076/iio:device0/in_temp_input
```
　Pythonで、
```
f = open('/sys/bus/i2c/devices/1-0076/iio:device0/in_temp_input')
Temp = round(int(f.read()) / 1000.0, 1)
f.close
print(Temp)
```
で読み出せます。　　
#MathematicaでPythonのプログラムを利用する
　MathematicaからPythonのプログラムを利用するには、ExternalSessions機能を使います。Pythonのプログラムは関数にします。ExternalValueでその関数を呼び出し、値を受け取ります。

```
dataList = {};
Do[
session = StartExternalSession["Python"];
 
ExternalEvaluate[session, "def temp():
    f = open('/sys/bus/i2c/devices/1-0076/iio:device0/in_temp_input');
    Temp = round(int(f.read()) / 1000.0, 1);
    f.close;
    return Temp
"];
 
v = ExternalValue[session, "temp()"];
DeleteObject[session];
AppendTo[dataList, v]
, {v, 1, 10}
]
dataList
ListLinePlot[dataList]
```
　実行中の様子です。10回読み込み、グラフを描きました。
![math101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/e9d1f664-412d-b87d-00d2-a73a8c5b5e57.png)

　リアルタイムにグラフを更新するプログラムは、https://www.denshi.club/pc/raspi/linux-3-mathematicabme280.html　を参考にしてください。
MacOS10.15にアップデートした後に、PhpStormのインデックス中が繰り返されて止まらない

筆者、MacOS10.15にアップデートしました。
その後に、PhpStormでこれまで使っていたプロジェクトを起動すると、
インデックス中が繰り返されて止まらない症状にみまわれました。

具合が悪いのは、インデックス中が始まると作業しているタブが閉じられてしまい、繰り返されると全く作業が進まないです。

▼試したこと
1. PhpStormのキャッシュの破棄・再起動
2. 隠しフォルダ.ideaを削除
3. PhpStormを最新版へアップデート
4. プロジェクトビューのフォルダを右クリックして、ディレクトリをマーク→除外
全部ダメです。

▼なおった方法
1．　プロジェクトを新しく作ってから、前まで使っていたファイルを新しいプロジェクトに入れる
単純なプロジェクトだったらこの方法でいいですが、ライブラリの読み込みなど面倒です。

２．　ターミナルで既存プロジェクトフォルダを tar で圧縮。これまでと違う場所に解凍。
なぜか、直りました。
筆者の場合、母艦がmacminiで、モバイルは、macbook proを使っていて、ドロップボックスに入れて同期しながら、どこでも作業できるようにと思い、ドロップボックスに解凍してやりました。


ターミナル圧縮コマンド 

```ターミナル
cd プロジェクトフォルダの上の階層
tar -cvf ファイル名.tar フォルダ名

```



なぜかわかりませんが、直りました。

OSアップデートは、何かとトラブルがありますね。
互換性を維持してもらいたいものです。

それでは、また。
plunkerでtensorflow.js その21

#概要

plunkerでtensorflow.jsやってみた。
推定の結果を、次の推定に使う実験、やってみた。

#結果

うまくいかん。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d8f3729e-1234-c120-a562-36b5b49a088d.png)


#成果物

https://embed.plnkr.co/MAKFPJtgXfTAWLt2RDmx/

以上。
railsでtext_areaで入力したまま表示する（改行、段落）

form_forやform_withなどのtext_areaのフォームに文字を入力した際、

- 改行
- 段落

などつけて入力したのに、いざ表示させると改行も段落もない・・ということみなさん多いと思います（初心者だけでしょうか？）
railsヘルパーの「simple_format」を使っても、行の改行は反映されるけど、

- 連続した改行（空白のままの改行）
- 段落（スペースキーで１文字分の空白を作る）

は反映されません（と思います）
少なくとも私は反映されませんでした

rails初心者の私も先ほどまで、どうすればいいのかわからずググっていたら解決法がありましたので、ご紹介しようと思いますが、まだよく理解はできてないので、詳しく知りたい方は下記のリンクをご覧ください。

以下参考にしたサイト
https://www.ryotaku.com/entry/2019/06/25/%E3%80%8Csimple_format%E3%80%8D%E3%82%84%E3%80%8Csafe_join%E3%80%8D%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%80%81%E6%AD%A3%E5%B8%B8%E3%81%AB%E6%94%B9%E8%A1%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%81%9B


結論
　「safe_join」を使おう！

どういうことかというと、例として以下のようにtext_areaを作成します

```new.html.erb
<%form_with model: @novel, local:true do |f|%>
<%=f.label :テキストを入力してください%>
<%=f.text_area :text %>
<%=f.submit "登録する"%>
<%end%>
```

で、これで作成したフォームに、

```
１（１段改行）
２（２段改行）

　３（先頭に１文字分スペースを追加）
```
と例として入力してみます


```show.html.erb
<%=simple_format(@text)%>
```

と表示すると、

```
１（１段改行）
２（２段改行）
３（先頭に１文字分スペースを追加）
```

と表示されてしまいます。
２段改行は１段しか改行されておらず、段落もなくなってしまいます
（simple_formatは、一応連続した改行にも何かしらの処理は働いてるらしいのですが、こちらの意図する形の表現にはなってくれませんでした）

ここで、safe_joinの登場です

```show.html.erb
<%=simple_format(@text)%>
⬇️こう書き換える
<%=safe_join(@text.split("\n"),tag(:br))%>
```

すると、改行も段落も反映することができました!

なぜ反映されるかはよくわかりませんが・・

simple_formatは、文字列を自動的に`<p>`で括られるそうですが、safe_joinを使用すると`<p>`を無視することができるそうです

なにはともあれ、表示できてよかったです

※　追記
　　半角でのスペースは反映されませんでした。
　　どなたかわかる方がいらっしゃればご教示願います・・
新人向けチートシート: terminal

### カーソル移動

```
Ctr-a: 先頭
Ctr-e: 末尾
Ctr-u: 先頭まで削除
Ctr-c: 画面をクリア
```

###コマンド補完

```
<tab> #パスやコマンドの入力中にtabを押すと補完
<ctrl> + r #入力後に文字列を入れることでコマンド履歴から検索して補完
```

###基本

```
cd <path> #pathに移動
cd - #移動前のpathに移動

pwd #ワーキングディレクトリのパスを表示
ls #カレントディレクトリの内容表示

mv <originalPath> <newPath> #ファイルを移動、名前変更
cp <originalPath> <newPath> #ファイルのコピー

rm <filePath> #ファイルを削除
rm -r <dirPath> #ディレクトリを削除

tar -zcvf <path>.tar.gz <path> #圧縮
tar --exclude <pattern> -zcvf <path>.tar.gz <path> #patternを除いて圧縮
tar -zxvf <filename> #展開

history #コマンドの入力履歴を確認

export LANG=en_US #ターミナルの言語を英語に切り替え
```

###ファイル・ディレクトリを検索する

```
find <path> -name <pattern> #<path>以下の<pattern>を含むファイル・ディレクトリを検索する
```

###ファイルの中身を表示する

```
cat -n <path> #ファイルの中身を行数と表示する
tail -f <path> #ファイルの内容を入力を待ちながら表示(ログなどがリアルタイムで追加されることを確認したい場合)
vimdiff <path1> <path2> #ファイルの差分を確認する

vim <path> #ファイルをvimエディタで開く
```


###特定の文字列を含む文書検索・絞り込み

```
grep -R <pattern> <path> #<pattern>を含んだ行をpath内のファイル全て再帰的に検索
grep -A <number> #指定した行数、ヒットした行の後も表示(After)
grep -B <number>　#指定した行数、ヒットした行の前も表示(Before)
grep -i #<pattern>の大文字小文字を無視(ignoreCase)
tail -f <fileName> | grep --line-buffered "<pattern>" #tailされる内容に対して、表示内容を絞りたい場合
```

###プロセス管理系

```
ps -eF | grep <pattern> #パターンが含まれる起動中のプロセスを表示

kill <pid> #pidのプロセスを終了
kill -9 <pid> #pidのプロセスを強制終了
```

###権限変更系

```
chmod -R <permission> <path> #path以下のフォルダ・ディレクトリの権限を再帰的に変更
chown -R <user>:<group> <path> #path以下のフォルダ・ディレクトリのuser, groupを再帰的に変更
```

###ネットワーク

```
curl -sL ipinfo.io #端末のグローバルIP確認
```

###新人向けチートシート
* [vim](https://qiita.com/taisukek/items/37dac57fd3332fa2beb1)
* [git](https://qiita.com/taisukek/items/1c4fbb4ea4f7c2d4fad1)
［Android］Android端末をリモートから操作する（scrcpy）

# はじめに

Android開発ではエミュレータで動作確認することも多いですが、
やはり最終的にはAndroid端末の実機で動作確認しますよね。

そのときにリモートで操作できたら便利だよな〜って調べたら、
[scrcpy](https://github.com/Genymobile/scrcpy)を使えば簡単にできることがわかったのでまとめます。

# scrcpy とはなんなのか？

scrcpyは端末の映像表示、操作をUSBまたはTCP/IP経由で行うアプリケーションです。
Windows・Linux・Macで利用できるアプリケーションなので全てのAndroid開発環境で利用できます。

# scrcpy の特徴は何か？
scrcpyですがGitHubのREADMEによると次の特徴があるそうです。
私は特にデバイスに何かインストールする必要がないところが良いなと思いました。
(インストールするのすごく抵抗がありますし…消すの面倒なのでよいですよね…)

- 動作が軽い
- なめらか(30〜60fps)
- 画質が良い（1920x1080）
- 低遅延（35〜70ms）
- 起動が早い(1秒以内に表示される)
- デバイスに何かインストールする必要がない

# scrcpy のインストール

scrcpyですがMacでは次の手順でセットアップできます。

(1) 次のコマンドでADBをインストールする（既にインストールしてある方は飛ばしてください）

```
> brew install android-platform-tools --cask
```

(2) 次のコマンドでscrcpyをインストールする
 
```
> brew install scrcpy
```

# scrcpy でリモートで操作してみる

Android端末とPCをUSB接続し、scrcpyでリモート操作してみます。

## 端末の映像を表示する

接続された端末が1つであれば次のコマンドで映像を表示できます。

```
> scrcpy
```

すると次のようにウィンドウに映像が表示されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/83d5ba7a-97a5-7a95-9bed-1be480aaea95.png" Height="420px">

もし接続された端末が複数ある場合はシリアルを指定すれば表示できます。

```
> adb devices
List of devices attached
35PDU18126005270	device
> scrcpy -s 35PDU18126005270
```

## 端末をタッチで操作する

表示されたウィンドウをアクティブにしてタッチで操作できます。

![Nov-07-2019 21-44-20.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/901891e0-6c43-c417-5c3c-b66378190f28.gif)

## 端末をキーボードで操作する

表示されたウィンドウをアクティブにすればキーボード操作できます。次のような感じで文字を入力できます。

![Nov-07-2019 21-49-43.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/8cfa919f-c7f0-2fe7-cafe-aac0c040230b.gif)

## APKをインストールする

表示されたウィンドウにAPKファイル（署名済み）をドラッグ＆ドロップするとアプリをインストールできる。
インストール状況はコンソールに次のように表示されます。

```
2019-11-08 08:34:46.877 scrcpy[2593:11773] INFO: Request to install app-release.apk
2019-11-08 08:34:46.877 scrcpy[2593:13219] INFO: Installing app-release.apk...
Performing Streamed Install
Success
2019-11-08 08:34:52.875 scrcpy[2593:13219] INFO: app-release.apk successfully installed
```

![Nov-08-2019 08-38-03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/3292d570-d007-e382-93ae-c8ef9931fe89.gif)

## ファイルを転送する

表示されたウィンドウにファイルをドラッグ＆ドロップするとファイルがコピーされます。
ファイルコピーの状況はコンソールに次のように表示されます。

```
2019-11-08 08:45:23.561 scrcpy[2593:13219] INFO: droidkun1.png successfully pushed to /sdcard/
```

![Nov-08-2019 08-49-11.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79387/a7b3694f-7e41-ec24-905f-d9a4b7e71b7d.gif)


# おわりに

[scrcpy](https://github.com/Genymobile/scrcpy)を使えば簡単にリモート操作できます。
他にもscrcpyでは動画録画とか色々できるみたいなので今後試していけたらな〜と思いました。

# 参考文献
- [scrcpy](https://github.com/Genymobile/scrcpy)
- [Introduction scrcpy](https://blog.rom1v.com/2018/03/introducing-scrcpy/)
- [操作したアプリ| Miche Timer](https://play.google.com/store/apps/details?id=kaleidot725.michetimer)
WindowsでVBSをスケジューラ化する

###背景
毎日1回ファイルを確認してメイン処理の判断をさせたかった

しかし直接VBSファイルを指定しても起動しませんでした

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/66f13f18-a4c2-d168-af9a-e8564c849a34.png)
※写真はbatを指定していますが、これでもうまくいきませんでした

###うまくいかない場合(うまくいく場合もある？)

- batファイルからVBScriptを実行
  直接VBSを指定せずに、batを作成してそれを指定します
　参考記事には、batの中にVBSのフルパスを書くだけとありますが、
　私の場合はうまく行かず、cscript VBSのフルパスと書きました。

- 「開始（オプション）」にパスを設定
　今回の場合はC:\Users\e256654\Desktop\rpa\overwork\を指定します

上記の作業をすると、やっと動きました！
なんでスクリプトを直で叩けないんだろうね。。。

今どきbatなんて、、、ましてやPowerShellはもっと覚える気もない

[参考記事](http://jinichiblog.com/pc/post-965/)
GPSカー その19

#概要

GPSで自動走行する、コンテストがある。
実機を作ってみた。
2019のプロファイルをリストにしてみた。

#考察

測位は、RTK。
モジュールは、ZED-F9P。
機体は、tamiya。
一択。

#成果物

https://embed.plnkr.co/nkCBnNoECp9LeXVXtRmz/

以上。
COBOLでサイン付数値型（S9）から文字型（X）へ符号付き数値をMOVEする

## 前書き
前職でコボラーしてたときの同僚に質問されたら少し詰まったのでメモ書き
## やりたいこと
サイン付数値(S9)を符号付けたまま文字型(X)にMOVEしたい。
S9 SIGN IS LEADING SEPARATE CHARACTERで定義して出力すれば同じでしょ？となるのですが、
値がゼロだったら、同じ場所に特定の文字列を出したいとかCSVデータなんかではそんな要件がよくあります。
## 結論から
S9 SIGN IS LEADING SEPARATE CHARACTERで定義した変数をREDEFINE句経由でXに代入することで実現できました。

```:S9->S9SC->X
IDENTIFICATION DIVISION.
program-id. teeeest.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 int PIC S9(8) VALUE -12345.
01 disp_rec.
  02 d PIC x(9).
  02 cc REDEFINES d.
    03 eee PIC s9(8) SIGN IS LEADING SEPARATE CHARACTER.
PROCEDURE DIVISION.
    MOVE int TO eee
    DISPLAY "d:" d
EXIT.
```
```:Output
d:-00012345
```
なぜかS9 SIGN IS LEADING SEPARATE CHARACTERをXタイプの変数にMOVEするのだと符号が外れてしまう。
理由の追求はめんどいのでしない（笑）
この辺の情報はネット上には全然なくて困った；

```
IDENTIFICATION DIVISION.
program-id. teeeest.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 int PIC S9(8) VALUE -12345.
77 ints PIC S9(8) SIGN IS LEADING SEPARATE CHARACTER.
77 str PIC X(9).
01 disp_rec.
  02 d PIC x(9).
  02 cc REDEFINES d.
    03 eee PIC s9(8) SIGN IS LEADING SEPARATE CHARACTER.
PROCEDURE DIVISION.
    MOVE int TO ints
    MOVE ints TO str
    MOVE int TO eee
    DISPLAY "str:" str
    DISPLAY "d  :" d
EXIT.
```

```:Output
str:00012345 
d  :-00012345
```