OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonでのメモ帳で編集したファイルの取り扱い方法

すでに作ってある設定ファイルをWindowsのメモ帳で編集したら、その後ファイルが開けなくなりました。破損したかと思ったのですが、何回やっても同じでした...。

# 理由

utf-8にはBOM(Byte Order Mark)有りと無しの2種類があるようです。

Windows 10 では May2019Update(1903)でメモ帳のデフォルトがUTF-8 BOM無しになりましたが、これ以前のバージョンではBOM有りで保存され変更できません。
（動作確認のためにたまに使う環境だったのでUpdateしていない環境でした）

# 対応方法

エンコード「utf-8-sig」を使うと良いようです。

```:ファイルを開く
f = open(path,'r', encoding='utf-8-sig')
```

```:ConfigParserを使う
config = configparser.ConfigParser()
config.read(conf,"utf-8-sig")
````

utf-8-sigはBOM有りも無しも両方きちんとハンドリングできるようですので、Windowsでファイル編集を考慮する必要がある場合は、utf-8-sigを使うと良いでしょう。

# 参考

+ [Python Tips： Python で UTF-8 の BOM ありなしを見分けたい](https://www.lifewithpython.com/2017/10/python-detect-bom-in-utf8-file.html)
+ [メモ帳のデフォルト保存がUTF-8 BOMなしになった(Windows 10 May 2019 Update 1903)](https://www.aruse.net/entry/2019/06/14/163712)

# むにゃむにゃ

普段Mac使いなのであまり気にしていなかったので、びっくりしました。
クラウドIDE の初めの一歩は Google Cloud Shell が良いと思う。

# はじめに: disclosure

筆者は Eclipse ECD project の [committer](https://accounts.eclipse.org/users/mmuranaka#tab-projects) で、本来的には Eclipse/Che をお勧めすべき立場です。加えて、Eclipse/Che を用いたホスティングサービス [PizzaFactory/Camino](https://camino.pizzafactory.jp/) にも関わっているので、なおさら。

しかし、まあ実際のところ、クラウドIDE には特有の癖とか敷居の高さがあることは否めないな、とも思っています。クラウドIDE 全体のユーザ数が増えていくべき時期に、クラウドIDE 製品間でパイの奪い合いしても詮無いです。

というわけで、敢えて Eclipse/Che をお勧めから外します。

# 初めの一歩は、どれがベストか

タイトルで既にネタバレしましたが、本稿執筆時点でのオススメは、Google Cloud Shell 付属のエディタです。
このサービス、Shell って名前がついているので、コマンドラインシェルしか提供していないかのように感じるのですが、ウインドウ右上にエディタを起動するアイコンボタンがあります。

![Screenshot 2019-10-10 at 13.41.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5414/26830983-7434-6e5c-a9f7-6d783c4fc060.png)

これを押すと、エディタが立ち上がります。

これから先の操作概要については、[既に Qiita で記事になっている](https://qiita.com/cryptcoin-junkey/items/21e69e0eb9f5c5c5a5ee)ようなので、そちらに譲るとして。

このエディタの実体が Eclipse/Theia をベースにしていることは About メニューを見れば明白です。

![Screenshot 2019-10-10 at 13.21.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5414/43cebd21-1db6-6577-4a56-0b15eebd8801.png)

Theia は、GitPod や Eclipse/Che でも採用されている IDE フレームワークです。エディタエンジンとして Microsoft が開発した Monaco を採用しており、結果として VS Code と互換性の高い使用感が得られます。

たとえば F1 キーでコマンド一覧が出る、とか。

![Screenshot 2019-10-10 at 13.25.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5414/f2b1231f-d217-cd34-59bb-445cb6bc6ede.png)

つまり学習コストが低く、または学習したことの横展開が期待できます。
覚えることは少なくて済むに越したことはないですね。
## でも、お高いんでしょう?

[公式情報を参照](https://cloud.google.com/shell/docs/pricing?hl=ja)すると GCP ユーザには無料で提供とあります。

> Google Cloud Shell は、Google Cloud Platform ユーザーに無料で提供されています。

GCP は従量制なので、他のサービスを使わない限り、この IDE は無料で使えます。[^1]

[^1]: 本稿執筆時点では、です。後の価格改定はあり得ます。


## Azure とか PaizaCloud とかじゃダメなの?

ダメではないです。Azure Cloud Shell も同様のエディタ機能があり、Monaco ベースのエディタ・エンジンを採用しています。
しかし、シェルの利用自身は無料ですが、ストレージが有料です。コスト面で、ベストとしてはお勧めはできません。既に Azure に利用料を払って使っている方には、悪くない選択肢だと思います。筆者も Azure Cloud Shell は頻繁に使っています。[^2]

[^2]: 本稿とは関係ない余談ですが、PizzaFactory/Camino は Azure 上で動作しているので。

日本人としては、国産の PaizaCloud も推したいところではあるのですが、現時点での料金体系では利用時間の制限が…。クラウドIDE には、ローカルに置く IDE やエディタと同様に、ある程度普段使いしてみることでこそ見えてくる得失ってあります。

他のクラウドIDE、AWS Cloud9 等もダメではないです。ただ、それらをいきなり試すような属性の方々は、たぶんこの本稿のタイトルに惹かれて読んだりはしないのでは、と。あと、PaizaCloud 同様に無償枠の問題はあります。

# まとめ

というわけで、クラウドIDE に興味あるけれども二の足を踏んでいらっしゃる方は、まずは Google Cloud Shell のご試用をお勧めします。

そして、もしクラウドIDE へのご興味が増すようでしたら、Eclipse/Che や、そのホスティングである [PizzaFactory/Camino](https://camino.pizzafactory.jp) の採用をご検討いただければと。ソフトウェア・エンジニアの皆様が Google Cloud Shell では足りないと思うであろう機能を、整えています。
プログラミング問題「4クイーン方陣」


|5|7|11|13|
|--:|--:|--:|--:|
|101|103|107|109|
|191|193|197|199|
|821|823|827|829|

上の4*4正方行列は、互いに行列が異なる、4つのマスのどの合計値も、1134となる。
例：
5+103+197+829=1134
101+7+827+199=1134

「互いに行列が異なる、4つのマスのどの合計値も、同一の値となる」計算が成立する4次正方行列を、本問では「4クイーン方陣」と呼ぶ。

1. 16個の数値を引数にとり、4クイーン方陣であるかどうかを判定するメソッドisFourQueensSquare(int v1,int v2...v16):booleanを作成せよ。メソッドは、4クイーン方陣であればtrueを返し、4クイーン方陣でなければfalseを返すものとする。
2. 4*4の配列を引数にとり、4クイーン方陣であるかどうかを判定するメソッドisFourQueensSquare(int v[][]):booleanを作成せよ。
3. 互いに異なる16個の素数からなる4クイーン方陣を生成するメソッドcreateFourQueensSquare(int min):int[][]を作成せよ。ここで、minは、4クイーン方陣を構成する素数の最小値を指定する値である。(min <= 素数の最小値)

おまけ。
4. 互いに異なる16個の素数からなる4クイーン方陣は無限に存在するか。証明せよ。


本来は、子供向け算数クイズだったらしいのですが、あえて新人研修のプログラミング問題っぽくしてみました。個人的な興味で「16個の数が全て違う素数」という縛りを入れたら思いついたのが上の方陣です。4つ子素数で構成しました。これより16マスの合計値が小さい素数4クイーン方陣を考えるとかすると、面白いかもしれません。
DockerでConfluent(Kafka)の開発環境を簡単構築

#はじめに
Confluent(Kafka)の開発環境をDockerを使って10分で構築する方法を記載します。
(開発環境と限定しているのは、冗長化や分散化を行っておらずデータの欠損を招く恐れがあるからです。)

##前提条件

* Dockerが動作する環境がある事
* Dockerホストのメモリが8GB以上あること(満たなくても動くことがありますが、私が使った感覚ではよく落ちました)
* 環境構築を行うDockerホストがインターネットと接続している事
* Docker-Composeをインストールしている事
* gitコマンドのインストールしていること

※　前提手順の環境構築する手順記載していませんので、必要に応じて他の人の記事を参照してください。"Docker-Compose 導入"などのキーワードで出てきます。

# 環境構築手順と簡易解説

(1) githubからdocker-compose.yamlファイルの入手

```
# git clone https://github.com/confluentinc/examples
# cd examples
# git checkout 5.3.1-post
# cd cp-all-in-one
```
* ブランチ名`5.3.1-post`の数値はConfluentのバージョン番号を指しています。2019年10月現在のLatestで記載しています。

(2) Dockerイメージのダウンロードとコンテナの起動

```
# docker-compose up -d --build
```
* コマンドが終了してもバックグラウンドで各デーモンが起動中の場合があります。GUI[`http://localhost:9021`]でステータスを確認してください。

(3) 稼働状況の確認

```
# docker-compose ps
     Name                    Command               State                Ports
------------------------------------------------------------------------------------------
broker            /etc/confluent/docker/run        Up      0.0.0.0:29092->29092/tcp,
                                                           0.0.0.0:9092->9092/tcp
connect           /etc/confluent/docker/run        Up      0.0.0.0:8083->8083/tcp,
                                                           9092/tcp
control-center    /etc/confluent/docker/run        Up      0.0.0.0:9021->9021/tcp
ksql-cli          ksql http://localhost:8088       Up
ksql-datagen      bash -c echo Waiting for K ...   Up
ksql-server       /etc/confluent/docker/run        Up      0.0.0.0:8088->8088/tcp
rest-proxy        /etc/confluent/docker/run        Up      0.0.0.0:8082->8082/tcp
schema-registry   /etc/confluent/docker/run        Up      0.0.0.0:8081->8081/tcp
zookeeper         /etc/confluent/docker/run        Up      0.0.0.0:2181->2181/tcp,
                                                           2888/tcp, 3888/tcp
```
* Steteが全てUpである事を確認します。

ブラウザから、http://(DockerホストのIPアドレス):9092/　へアクセスしてステータスを確認
![Qiita Confluent Docker 開発環境 .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480189/501949b3-9dcd-6769-48f3-e40e3b218676.png)
[確認項目]

* クラスタがrunning 
* Brokers が 1　　(動作しているブローカーノードの数)
* KSQL Clusters が 1　(動作しているKSQLサーバの数)
* Connect Clueters が 1 (動作しているKafka Connectサーバの数)

※　Docker上のステータスがUPしてからそれぞれのノード(サーバ)がRADYになるまで時間がかかります。
　　もし0の場合は数分待っててからブラウザのページを読み込みしてください

以上で、テスト環境の構築が終わりました。簡単でしたでしょうか？

# 起動停止と再起動、削除方法

起動停止

```
# docker-compose stop
```

再起動

```
# docker-compose start
``` 

環境の削除

```
# docker-compose down
```
※　Docker イメージは残ります。

# 補足

Docker環境は開発やテストやデモを行うときに非常に便利です。

Confluent社がデモシナリオを[GITHUB](https://github.com/confluentinc/examples)に公開しています。
これらのシナリオを実行する時にも利用できるので環境を用意するだけでも面白いと思います。

# 関連コンテンツ

[Apache Kafkaのメッセージ送受信について(REST-PROXY利用)](https://qiita.com/akiyoshi_tomita/items/31de8c3fdb9808095329)
【相手のために敢えて褒めない】フィードバック入門を読んで分かったこと

掲題の本を読みました。自分が気になったところについて、振り返りをしてみようと思います。

本の情報：
https://www.php.co.jp/books/detail.php?isbn=978-4-569-83290-6

## 読む動機
- 経験学習モデルによると、大人は自分の経験の内省から多くの学びを得ているらしい。ということは、**経験を学びに変える術を身に付ければ、日常のすべてが勉強になるので効率的だ**と思ったため。
- 上記の効果的な学びを相手に提供できれば、**組織で成果を出すことに貢献できる**のではないかと思ったため。

## 読む前の疑問

- フィードバックの理想状態とは？
- いくら大切とはいえ、相手が聞く耳を持ってくれなくなるリスクを背負ってまでやることだろうか？やる人が嫌われるし、辛いだけでは？
- フィードバックを知ることで、自分自身も成長できるだろうか？

## 読後に分かったこと

フィードバックの目的は、人の成長を促進すること。**理想状態は、つねに自分自身にもフィードバックをし続けられるようになること**。

耳の痛いことを相手に言うのはつらいが、軽減するためのテクニックはある。**１人がフィードバックを受け持つ相手の数を5~7人に減らし**たり、**フィードバックをする人の役割は「嫌われて、感謝されること**」だとあらかじめ決めて心理的負担を軽くしたり、**同じ立場の人と知り合いになって孤独感を軽減したり**、など。ただし、辛いものはつらい。覚悟するべし。いったい何を覚悟すればいいのかというと、本書にはこうある。

> フィードバックは
> 腹をくくってください。
> 逃げないでください。
>> (本書 p.147)

逃げない、ということ。罪悪感から**変にフォローを入れてはいけない。ここが自分がもっともハッとさせられたことである**。

ファシリテーションのテクニックには、自分の意見を聞いてもらうために、ポジティブなことを後に言って話を締めるものがある。これは、「自分の話を聞いてもらうため」には効果があることだ。しかしフィードバックの場合、「相手の成長を促すために敢えて厳しいことを言う」行為なので、「でも、お前にも良いところがあるよ」などとフォローすると、**厳しいことを指摘した効果が薄れてしまう**。

フィードバックをしたり、自分も受けると、コンフォートゾーンから、緊張状態へと移る。**あえて定期的にフィードバックを受けることで、自分の伸びしろが増え、成長し続けることができる**。しかし、**コンフォートゾーンに戻すような言動をしたり、そもそも言ってることが事実と乖離していたり**しては、フィードバックの意味がない。

その場しのぎの褒め言葉は相手の成長に寄与しない。**真のフォローとは、「指摘したことが直っているか」を継続的にフィードバックし続けること**だ。**相手の成長に寄与するかどうかを第一に考えること**。

## 自分の行動を変えようと思ったこと
- フィードバックに関しては、淡々と事実を伝える。自分の好き嫌いで判断しないこと。
- 自分を緊張状態に置くために、定期的に自身をフィードバックさせる。**厳しいことを言われたときは、あえて反論せず、辛い気持ちを受け止めたあとで、言われたことに向き合うようにしたい**。


## 参考情報
- [【経験学習モデル】「経験」こそ大人の学びの「一丁目一番地」である](http://jibunhack.com/10454/)
- [コンフォートゾーンとは何か？ そこから抜けだし成長するための近道は](https://www.lifehacker.jp/2014/07/140727comfortzone.html)
cloud pubsubで配信済みのメッセージを再送する

pubsubのサブスクライバ側でat-only-once対策として過去に受け取ったメッセージはスルーする処理を実装しました。
実装したのでちゃんと動くかテストをしようと思いましたが、同じメッセージが複数送られるまで待つのは現実的ではありません。

同じmessage_idを意図的に再送できないか調べると、どうやらseek機能を使うことで配信済みメッセージを未配達として再度処理できるようです。

https://cloud.google.com/pubsub/docs/replay-overview?hl=ja

## gcloud Consoleでポチポチしてseekさせる
![スクリーンショット 2019-10-10 1.22.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174923/25e89d36-45ea-40b9-0bac-7dedccea0ef4.png)
↑ここから設定できます。

- テストしたいメッセージを配信する
- 再送させたいメッセージが配信される以前の時刻を指定してシークさせる

もしくは

- サブスクリプションのスナップショットを作成
- テストしたいメッセージを配信する
- スナップショットまでシークさせる


以上の操作でメッセージが再送されます。

## なんで再送されるのか

配信されたメッセージはサブスクリプション側で「確認済み」ステータスになります。
特定の時間までseekさせるとseek時点以前のメッセージは「確認済み」ステータスに、以後のメッセージは「未確認(未配信)」となります。

あるサブスクリプションが


| 時間       |message_id |ステータス    |
|-----------------|------------------:|------------------:|
| 00:00|000000000000001|確認済み|
| 00:05|000000000000002|確認済み|
| 00:10|000000000000003|確認済み|

の時に00:03にseekさせると

| 時間       |message_id |ステータス    |
|-----------------|------------------:|------------------:|
| 00:00|000000000000001|確認済み|
| 00:05|000000000000002|未確認|
| 00:10|000000000000003|未確認|

となり、message_id:000000000000002と00000000000000３のmessageが再送されます。
この時message_idは同じものが付与されるため、at-only-once現象を擬似的に再現できました。
MySQL8変更点(grantとパスワードポリシー)

ドットインストールで学習中に
「あれっ？あれっ？」
となって
「あ、そうなんだ」

となったことの
#備忘録


## 環境
vagrant + centos7 + MySQL8.0.17

対しドットインストールが
MySQL5.6.36


## そもそも学習教材に環境合わせろよ
という話でもあるんですが、
これからを見据えて新しい方触っておく
＆
差分を見つけながら学習できる

ということで最新verを入れてます。
これからもこの姿勢は変えないつもりではいます。


## ユーザー作成＆権限付与が同時にできなくなってる。

5.7までは

```zsh
$ create myapp_user@localhost identified by 'password';
$ grant all on myapp.* to myapp_user@localhost;
```

というユーザー作成とユーザーに対する権限付与が

```zsh
$ grant all on myapp.* to myapp_user@localhost identified by 'password';
```

って感じで一本化できていました。
つまり```grant  権限　on DB名.* to ユーザー identified by 'パスワード'```

ただ8からは

```zsh
$ grant all on myapp.* to myapp_user@localhost identified by 'password'
ERROR 1064 (42000) at line 12: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'identified by 'password'' at line 1
```
みたいなerrorがでます。

ただこれも優しくて
「構文ちゃう、新しいバージョンのマニュアル確認せえ」
ってわざわざ言ってくれるありがたさ。

ちなみに
これでも、まだダメなとこあります。


## パスワード検証コンポーネント


**password = 'password'はダメ**

ver8.~ではデフォルトで従来の
パスワード検証プラグインから
パスワード検証コンポーネントに変更されていて
（プラグインも一応まだ使えるが、公式でそのうち無くすからね、移行手順はこうだよみたいな記述もあり）

ver8のコンポーネントではデフォルトで
MEDIUMポリシーが適用されていて
条件は
・数字は１つ以上
・小文字は１つ以上
・大文字は１つ以上
・特殊文字を加える
・長さは合計８文字以上
っていうことなので
password
これは全然満たしてないので使えません。

３段階（LOW,MEDIUM,STRONG）があり
LOWだと条件が
・長さが８文字以上
のみなのでpasswordが使えます。また、その長さも一応変えられるみたい。

STRONGだと
MEDIUM条件に加えて
・長さ４文字以上のパスワードの部分文字列が辞書ファイル内の単語と一致してたらダメ
っていうのも加わります。

また、プラグインからコンポーネントに変更されたタイミングで
varidate_password.check_user_nameっていうシステム変数も追加されているようで
・パスワードと名前同じはあかんやろ
っていうようなチェックもデフォルトで入ってます。


## 結論
**ちゃんとしたパスワード入れたら問題ない**


## 末筆

他、打ち当たり次第追記する所存。


そしてこの記事を書くにあたり
MySQL5.6, 5.7, 8.0のリファレンスマニュアルを読み比べました。
読み比べてみると変更点も浮き彫りになるし
なんだかまだ自分がプログラミングを始めていない段階での世界情勢を分かった気になれて良かったと思います。オススメ。

ver8.0
https://dev.mysql.com/doc/refman/8.0/en/validate-password.html

ver5.6
https://dev.mysql.com/doc/refman/5.6/en/validate-password.html






また今少しずつPythonを勉強しているんですが
２系と３系の変更点の記事をよく見かけます。
そういう記事だけじゃなくて
公式の読み比べ
っていうことをちゃんとしていこうと、台風前の穏やかな気候と共に考える。
データベースオブジェクトの取得方法

# SSMS (SQL Server Management Studio) を利用する

※[【SQL】データベースのオブジェクトのスクリプト生成][]

---

1. SSMSのオブジェクトエクスプローラからデータベースを指定し、右クリック→タスク→スクリプトの生成を選択します。
![001](http://moriroom.my.coocan.jp/site1/images/p2576_1.png)

2. 下図の画面で「次へ」
![画面](http://moriroom.my.coocan.jp/site1/images/p2576_2.png)

3. [オブジェクトの選択]画面で[特定のデータベースオブジェクトの選択]を選択し、テーブルやビューなど出力するオブジェクトにチェックする。
![画面](http://moriroom.my.coocan.jp/site1/images/p2576_3.png)

4. [スクリプト作成オプションの設定]画面で「詳細設定」ボタンを押します。
![画面](http://moriroom.my.coocan.jp/site1/images/p2576_4.png)

5. オプション画面で条件を変更し「ＯＫ」ボタンを押します。
   - [インデックスのスクリプトを作成] False → True
   - [トリガーのスクリプトを作成] False → True
   - [オブジェクトの有無を確認する] False → True
![画面](http://moriroom.my.coocan.jp/site1/images/p2576_6.png)
![画面](http://moriroom.my.coocan.jp/site1/images/p2576_6.png)

6. [スクリプト作成オプションの設定]画面で以下の条件を指定し、「次へ」ボタンを押します。
   - 出力の種類：スクリプトを指定した場所に保存　を指定
   - ファイルに保存　を指定
   - オブジェクトごとに１つのファイル
   - ディレクトリ名を選択
   - 名前を付けて保存 [ANSIテキスト]を選択
   ![画面](http://moriroom.my.coocan.jp/site1/images/p2576_7.png)

7. [概要]画面で「次へ」ボタンを押します。
![画面](http://moriroom.my.coocan.jp/site1/images/p2576_8.png)

8. [スクリプトの保存またはバブリッシュ]画面で処理終了すれば「完了」ボタンを押します。
![画面](http://moriroom.my.coocan.jp/site1/images/p2576_9.png)

9. エクスプローラで格納先を確認します。
![画面](http://moriroom.my.coocan.jp/site1/images/p2576_10.png)

---

# SQL で取得する

## ビューを取得する SQL

```sql
SELECT
  v.name
  , s.definition 
FROM
  sys.views v
  INNER JOIN sys.sql_modules s
    ON v.object_id = s.object_id 
ORDER BY
  v.name
```
---

## ストアドを取得する SQL

```sql
SELECT
  p.[name]
  , s.definition
FROM
  sys.procedures p
  INNER JOIN sys.sql_modules s
    ON p.object_id = s.object_id 
ORDER BY
  p.name
```
---

# 参考サイト

- [【SQL】データベースのオブジェクトのスクリプト生成][]

[【SQL】データベースのオブジェクトのスクリプト生成]:<http://moriroom.my.coocan.jp/site1/?p=2576>
Laravel(5.5)のLengthAwarePaginatorから表示中の件数from~toを手っ取り早く取り出す

# 要約

ペジネーターをJSON形式にするとfrom, toが取れるので、`json_encode`を一旦かませる。

## やりたいこと

Laravelのページネーションで、現在表示中のページで
`${from} ~ ${to}件表示中` 的なのをやりたい。
例を上げると`11 ~ 20件表示中` みたいなのです。

## 対応

[Laravel5.5日本語ドキュメント](https://readouble.com/laravel/5.5/ja/pagination.html)によるとペジネーターをJSON形式にするとfrom, toが取れると記述がある。

一旦JSONにしないといけない。
なので`json_encode` をかませてから `json_decode` で表示する。

以下具体例

```php
// hoge.blade.php
{{ (json_decode(json_encode($pager)))->from }} ~ {{ (json_decode(json_encode($pager)))->to }}件表示中
```

## 参考

[Laravel5.5日本語ドキュメント](https://readouble.com/laravel/5.5/ja/pagination.html)
2019-10-10 WRF > WPS v3.7とv4.1の違い > ALBEDO12Mの定義での使用データ(default)がalbedo_ncepからalbedo_modisへ変更された

```txt:動作環境
CentOS release 6.9 (Final)
CentOS Linux release 7.7.1908 (Core)
```

WRF (Weather Research and Forecasting Model)関連。

### geogrid.exeでエラー

CentOS 6.9 + WRF v3.7のシステムをCentOS 7.7 + WRF v4.1.1(WPS v4.1)に移行しようとしたところ、geogrid.exe実行時に下記のようなエラーがでるようになった。

```
...
2019-10-10 22:16:46.768 --- INFORM: Using default data source for ALBEDO12M.
2019-10-10 22:16:46.768 --- ERROR: Could not open /home/XXX/WPS/GEOG_DATA/albedo_modis/index
```


## `geogrid/GEOGRID.TBL.ARW`ファイルの違い

### WPS v3.7

```
...
name=ALBEDO12M
        priority=1
        dest_type=continuous
        z_dim_name=month
        masked = water
        fill_missing = 8.
        interp_option=default:four_pt+average_4pt+average_16pt+search
        rel_path=default:albedo_ncep/
...
```


### WPS v4.1

```
...
name=ALBEDO12M
        priority=1
        dest_type=continuous
        z_dim_name=month
        masked = water
        fill_missing = 8.
        interp_option=albedo_modis:four_pt+average_4pt+average_16pt+search
        interp_option=albedo_ncep:four_pt+average_4pt+average_16pt+search
        interp_option= lowres:four_pt+wt_average_4pt+wt_average_16pt+search
        interp_option=default:four_pt+average_4pt+average_16pt+search
        rel_path=albedo_modis:albedo_modis/
        rel_path=albedo_ncep:albedo_ncep/
        rel_path= lowres:albedo_modis/
        rel_path=default:albedo_modis/
...
```


### 違い

v3.7ではdefaultとしてalbedo_ncepを使用していた。
v4.1において、albedo_ncepのパスは指定されているが、defaultとしてはalbedo_modisを使うようになっているようだ。


### ファイル取得

ファイルは以下から取得できる。
http://www2.mmm.ucar.edu/wrf/users/download/get_sources_wps_geog.html
BigQueryはじめました： 日付ごとに増えていくユニークな値の累計（備忘録）

## 前提

login_log_table　→ 大量のログイン履歴が入ってるTBL
login_date → ログイン日時
user_id → 会員ごとにユニークなID

## やりたいこと

日毎にログイン人数がどう増えていってるかを見たい。

例えば、2019/10/1 に 100 人がログインして、2019/10/2 にはまた 100 人（その中50人が1日にもログインしていた人）がログインしたとして、

loginYmd | count
--- | ---
2019-10-01 | 100
2019-10-02 | 150

という結果になってほしい。

## これでなんとかなった、という備忘録

```
SELECT loginYmd,
       cumulative_count from
  (SELECT *, count(*) OVER (ORDER BY loginYmd) cumulative_count
   FROM
  (SELECT user_id, min(FORMAT_TIMESTAMP('%Y-%m-%d', login_date,'Asia/Tokyo')) as loginYmd
      FROM my_dataset.login_log_table
      WHERE FORMAT_TIMESTAMP('%Y-%m-%d', offer_date,'Asia/Tokyo') BETWEEN '2019-10-01' AND '2019-10-02'
      GROUP BY user_id) t) AS TEMP
GROUP BY loginYmd, cumulative_count
```
PhpStormのstyleの色指定で色選択が便利

phpstormで開発する際にviewのコードを修正することもありますよね。

そんな時にcssもhtmlもそうですがスタイルでcolorを記述していると、
行番号の横にカラーコードに応じた色が表示されるのと
色の部分のクリックすると「色の選択」がモーダル上でGUIで操作できるので便利です。

行番号の隣に指定している色見本が表示される。

![スクリーンショット 2019-10-10 12.57.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/7f55f326-1080-afb4-7f9b-b254aed714c3.png)

色の部分をクリックすると色指定モーダルが表示される。

![スクリーンショット 2019-10-09 18.54.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/1a74fbe0-a122-bb86-418e-ea4745c3bd39.png)

使用環境
PhpStorm 2019.2.2
Rails ページ移動した際にリロードしないとJSが機能しない

調べた所どうやらTurbolinksが原因でJavaScriptが動かない・起動しないみたいです。
##Turbolinksとは
Gemに最初から組み込まれているもので以下の２つの機能を持ったものです

- リンクでのページ遷移の際に、非同期でhtmlリクエストを送り、headタグでのcss/js/imgの再読込を省略することで、画面遷移を高速化する。
- ブラウザの進む・戻るによる画面遷移では、キャッシュを利用し復元することで、htmlのリクエストを行わない。
つまり再読み込みを省略しているためjsが機能しなくなってるみたいです

[参照]https://freelance-in-six-month.com/tech-blog/rails-turbolinks-js-notworking/

##対象方法
1.**$(document).on('turbolinks:load', function() {　　を記入する**
jsファイルの冒頭に

```js
$(document).on('turbolinks:load', function() {
処理内容〜
```
を記入する事でロードしてくれるので機能します
2.**Gemを消してしまう**
TurbolinksのGemを消してしまう事でロードされない事を防ぐ事ができる
ただ元々はTurbolinksは高速化する機能がメインですので消すより1番の方をするのが良いのかと個人的に思いました。
rpmfind.netでRPMを探す

# TL;DR

* RPMを探すのには、[rpmfind](https://rpmfind.net/linux/RPM/)を使うとよい

`yum`などでインストールできるパッケージを探すのに、どうしたらいいのかな？と思って調べて見た結果です。


# rpmfind.net

サイト自体は、こちらです。

[https://rpmfind.net/linux/RPM/](https://rpmfind.net/linux/RPM/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/2a5c99f5-47be-398d-4cb2-b40a06626951.png)

ここから、キーワードで検索したり、いくつかのカテゴリなどに分けてRPMを探すことができます。各ディストリビューションのオフィシャルリポジトリのみならず、サードパーティ製のリポジトリも検索対象に入っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/d7868efc-d7c3-4822-f19f-c76330750dae.png)

例えば、`redis`で検索。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/a19940e4-b749-c15e-82ca-a3635f07d7a9.png)

`redis`だけでなく、アーキテクチャに`x86_64`を指定して絞り込み。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/5e1e526a-08dd-b098-9274-f1f86adafd76.png)

サードパーティ製のリポジトリである、Remiが入っているのが見えていますね（`redis`のみでも、スクロールすれば現れますが）。

他にも`System`が指定できたりしますが、これらのキーワードにどんなものを指定するのかは、ページ内に記載があります。

>  The search service can find package by either name (apache), provides(webserver), absolute file names (/usr/bin/apache), binaries (gprof) or shared libraries (libXm.so.2) in standard path. It does not support multiple arguments yet...
>
> The System and Arch are optional added filters, for example System could be "redhat", "redhat-7.2", "mandrake" or "gnome", Arch could be "i386" or "src", etc. depending on your system

あとは、見つかった情報を元に`yum`リポジトリなどを探してもよいでしょう。

[Available Repositories for CentOS](https://wiki.centos.org/AdditionalResources/Repositories)

[Fedora Repositories](https://fedoraproject.org/wiki/Repositories/ja)

検索だけではなく、リポジトリのメンテナーやディストリビューションから探すこともできます。

* [The list of RPM indexed by maintainer](https://rpmfind.net/linux/RPM/Vendors.html)
* [The list of RPM indexed by distribution](https://rpmfind.net/linux/RPM/Distribs.html)


# `rpmfind`

ところで、`rpmfind`というコマンドもあったようです。

[ネット上にあるRPMパッケージを検索するには](https://www.atmarkit.co.jp/flinux/rensai/linuxtips/297findrpmonnet.html)

ですが、今は入っている様子がなく…。

`rpmfind`を[https://rpmfind.net/linux/RPM/](https://rpmfind.net/linux/RPM/)で調べると、こちらしか見つからず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/0bfccdcc-47b3-87b8-f64d-8ff3f0be5752.png)

今は`rpmfind`はコマンドではなく、[https://rpmfind.net/linux/RPM/](https://rpmfind.net/linux/RPM/)を使うというので良いのでしょうね。
rails5.2 credentials.yml.encでDB情報を管理

## 困りごと
DockerでRails環境を構築してそのイメージで開発・本番環境を運用している。
DBはRDSのmysqlを使用している。
database.ymlに平文でDBのユーザー、PASSを書くのはまずいので、DockerFileに環境変数としてユーザとPASSを記載して、gitにあげないようにしていた。
だけど、DockerFileの修正等が入ると、本番環境のDockerFileも修正しないといけないのでめんどくさい。
チームで開発するなら、DockerFileもgitにあげて置きたい。

## 解決策
credentials.yml.encを使う。
awsのアクセスキー等をこちらで管理していたので、同じように機密情報はこちらで管理してみよう。

```credentials.yml.enc
aws:
   access_key_id: AAAA
   secret_access_key: BBBB

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: 1111111111aaaaaa...

db_user xxxxx
db_pass yyyyy
```

```database.yml
production:
  <<: *default
  adapter: mysql2
  encoding: utf8
  database: db_name
  username: <%= Rails.application.credentials[:db_user] %>
  password: <%= Rails.application.credentials[:db_pass] %>
  host: ABCDEFG
```
credentialsの中身をとるには以下

```
Rails.application.credentials[:db_user]
Rails.application.credentials[:db_pass]
```

## まとめ
これでDockerFileをgitにあげても、DB情報がバレずにすみます。
環境ごとにDockerFileをさわるのは、環境がずれたりなにより、めんどくさい。
CI/CDも可能になるので挑戦してみたいです。
WordPressで「中央揃え」「右寄せ」にしたらSVGファイルが消えたときの対処法

WordPressで**「中央揃え」「右寄せ」**にした**SVGファイルが消えた**ときの対処法です。
結論から言うと、**「画像の寸法」を指定**してあげればOKです。
![スクリーンショット 2019-10-09 15.45.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395404/c7a6b2de-0f6f-67cb-0f8e-d0426d0f823c.png)
******************
illustratorなどで作成した画像（SVGファイル）をWordPressの固定ページ等に挿入したとき、デフォルトの「左寄せ」では表示されるのに、「中央揃え」「右寄せ」にすると画像が消えてしまいます。
![スクリーンショット 2019-10-10 12.16.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395404/41af9bc8-82d1-c230-0299-731b52cbd3ac.png)
👇【左寄せ】では表示されるのに…
![スクリーンショット 2019-10-10 12.18.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395404/c65caf91-9e53-cf55-2d78-6c3e6767abdc.png)
👇【中央揃えや右寄せ】では真っ白に消えてしまう！
![スクリーンショット 2019-10-10 12.16.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395404/bb14e9a8-4876-0ae5-0d9b-1fb0e5dd40b3.png)
この時、画面右側の**「画像の寸法」に適当な数値を指定してあげれば直ります**。
![スクリーンショット 2019-10-09 15.45.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395404/c7a6b2de-0f6f-67cb-0f8e-d0426d0f823c.png)
このとおり！
![スクリーンショット 2019-10-10 12.17.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395404/66ee3353-cb65-72b2-9854-ff562c3dc5db.png)
参考にしてみてください☆
参考：[image block svg image became disappear](https://translate.google.com/translate?hl=ja&sl=en&tl=ja&u=https%3A%2F%2Fwordpress.org%2Fsupport%2Ftopic%2Fimage-block-svg-image-baecame-disappear%2F&anno=2)
VisualStudioCodeのターミナル各タブに名前を付ける

タイトル通り。この部分がいつも「bash」とかで複数並ぶと見づらいにも程がある。
どれやねん。使いたいターミナル。

<img width="1340" alt="スクリーンショット 2019-10-10 12.16.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42110/5f72f7b5-b6b0-253d-4999-16c9c09d0c56.png">


# 手順

そういうときはこうやる。

```
Windows
Ctrl + Shift + P

Mac
cmd + shift + p
```

で、すべてのコマンドの表示を行い
「terminal rename」
と打ってみましょう。Terminal:名前の変更 というコマンドが出るのでそれを選ぶと・・・

<img width="718" alt="スクリーンショット 2019-10-10 12.21.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42110/f1dbaaef-b964-7b66-bfc3-bc1b90136a55.png">


その後、自由入力になるので「server」とか打ち込めばあら不思議。

<img width="694" alt="スクリーンショット 2019-10-10 12.21.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42110/cf66fec2-4de4-c4c9-dd3f-ba8ffce63692.png">


使いやすいタブになりましたとさ。めでたしめでたし。

<img width="587" alt="スクリーンショット 2019-10-10 12.22.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42110/6fbb9463-2a0e-ed52-bc72-e78b440558f8.png">
ssd_keras   エラー　【 : cannot connect to X server】


ssd keras の、videotest_example.py をGPU上での実行中に起きたエラー


## X server とは？？

X window system という UNIX系(CUIベース)の OS にGUI要素を加えるためのシステムがあって、 そのシステム内でのサーバーを X server という。

この時の server というのは、 client - server モデルでの server のことだが、http通信などの時とは異なって、**ユーザーの手元にあるコンピューター**が`server`、**ブラウザ**やその他のエミュレータが`client `なのに注意

![mage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266096/f62049b4-3260-d5cd-fb47-b1f55a93a562.png)


## SSDのコード元
https://github.com/rykov8/ssd_keras


↑これを keras v2で使えるようにしたもの。

```python
print(cv2.__version__)    # 4.1.0
print(keras.__version__)     # 2.1.3
print(tf.__version__)     # 1.4.0
```

今からcloneするなら keras2でも動くやつがおすすめ。


## 解決法

cv2 の imshow() を使っていたのでそこの一文を削除した。
docker のコンテナ内で、X server が立ち上がってなかったのが原因

解決策は２つあって、

1. コンテナ内で X server を立ち上げる
- X serverを使用するもの（描写ライブラリなど）を使用しない。

今回は描写部分を抜いても動作的に問題はなかったので、②を選択。
****.html ⇒ ****.blade.php 一括変換

laravel化するにあたり、旧.htmlファイルを.blade.phpに一括置換する

```
$ for filename in *.html; do mv $filename ${filename%.html}.blade.php; done
```

# .htmlで流入した場合、.htmlが無いURLにリダイレクト
SEO落ちるのも嫌なので301リダイレクトを一括でかけておく

``` routes/web.php
Route::get('/{uri}.html', function ($uri) {
  return redirect()->secure($uri, 301);
})->where('uri', '.*');

// index.html ⇒ indexが増えそうなので、indexも外す
Route::get('/{uri?}index.php', function ($uri = null) {
  return redirect()->secure($uri, 301);
})->where('uri', '.*');

Route::get('/{uri?}index', function ($uri = null) {
  return redirect()->secure($uri, 301);
})->where('uri', '.*');
```

# /hogehoge/testで、resources/hogehoge/test.blade.phpを読ませる
Route用のヘルパーを作成

``` apps/Helper/RouteHelper.php
<?php
namespace App\Helpers;

class RouteHelper {
    public static function getDynamicViewPath($page_name)
    {
        if (file_exists(base_path().'/resources/views/'. $page_name)) {
            return str_replace('/', '.', $page_name) . '.index';
        } else {
            return str_replace('/', '.', $page_name);
        }
    }
}
```

routeに以下を追加

``` routes/web.php
Route::get('/hogehoge/{page_name}', function($page_name){
    return view(RouteHelper::getDynamicViewPath('hogehoge/' . $page_name));
});
```

# 感想
素直にRoute::view('hogehoge/test', 'hogehoge.test');とか一つ一つ書けばよかったかも。めんどい
【チーム共有】Laravelプロジェクトをdockerでチーム開発できるようにした

#概要

今あるLaravelプロジェクトをチームで開発するためにdockerを導入しました。
導入コストがかからないようにlaradockを採用。
その時のことをメモ。

また、今回は他所のリポジトリで既に管理しているプロジェクトと`Laradock`を取ってきますが、
新しく作成するgit管理ファイルでまとめたいのでそれぞれのフォルダ内にある`.git`ファイルを削除して親ディレクトリ(まとめディレクトリ)でまとめる、という風にしています。

このやり方が漠然と、良くない事なのかもしれないと思いながらこれをしているので
もし問題点や他にいいやり方等があれば教えて頂けると嬉しいです。
(もしくはこれが無意味だ、等)


#前提

- プロジェクトをgitで管理していること
- PCにdocker環境が整っていること (以下にURLだけ投げときます)
- `.gitignore`に予め`laradock/`が追記されていること

※`.gitignore`の編集は**プロジェクトにおいて権限がある方に済ませてもらいましょう**


※windows10 home (toolbox)でも試しましたが
うまくいかなかったのでこの記事では諦めてください、、

[docker -- windows10 pro]()
[dokcer -- mac]()

#目標

この記事での手順を通して、メンバーそれぞれが自身のローカル環境で
共通のLaravelプロジェクトの開発、およびそのコードのgithubでの管理を目標とします。

# 目標ディレクトリの構成

`project`
   |
   | - `laradock`
   |
   | - `src`(Laravel project) -- app等々

※laradockはgit管理対象から外します
※単なるプロジェクト(project)とした表記は親ディレクトリで
Laravel プロジェクトとした表記はLaravel project を指しています

#参考記事

[error:500でハマった時見つけました](https://oyasu.github.io/2017/06/laradock/)

##Laravel プロジェクトをクローン

- `git clone`します

```
git clone {管理しているLaravelプロジェクトリポジトリのURL}
```

クローンしたプロジェクトに`.env`を用意しておきます

-- mac

```
cp .env.example .env
```

-- windows

```
copy .env.example .env
```

## Laradock クローン

- プロジェクト用のディレクトリの作成 & 中に移動

```
cd {プロジェクト名}
```

- Laradock をクローン

```
git clone https://github.com/Laradock/laradock.git
```

- `.env`をコピー生成

-- mac

```
cd laradock && cp env-example .env
```

-- windows

```
cd laradock && copy env-example .env
```

- `docker-compose.yml`のapache2 serverのports

`/laradock`にある`docker-compose.yml`の`apache2 server`の欄のportsの部分を以下のように書き換えてください。

portについて、ローカルの他のwebサーバー系と面倒なことが起きないように`localhost:8002`で受け付けるようにしています。

![スクリーンショット (76)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508788/e87edd7d-dedd-4228-66a6-153ec279d39d.jpeg)


※.envに変数を書いてそこから取ろうとしたのですが、うまくいかなったので直書きしています。
どなたかもしわかればご教授ください、、

- `apache2/sites`の`default.apache.conf`を編集

エディタで以下のように編集してください

2行目の`ServerName`を`localhost`に変更します
3.6行目の`/var/www/`を`/var/www/{Laravelプロジェクト名}/public`に変更します


![スクリーンショット (80)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508788/6dd65057-4c48-25b3-d9e6-ac151d2bc7fc.jpeg)



##コンテナ立ち上げ

実際にローカル環境を立ち上げてみます

```
cd laradock && docker-compose up -d apache2
```

立ち上げたコンテナに入っていきます

```
docker exec -it laradock_workspace_1 bash
```
`/var/www`に入ると思うので、プロジェクトディレクトリに入って`composer`を入れていきます

```
cd { プロジェクト名 } && composer install
```

次にLaravel プロジェクトのAPP_KEYを生成します

```
php artisan key:generate
```

このコマンドが正常に完了したのち、ブラウザで`localhost:8002`に入り、
プロジェクトのトップページが表示されていれば成功です



上の部分までできたら、あとは実際に開発していくのみです。

では。
グリードアイランドのスペルバトルをするアプリを作ってみた

※あくまで個人での製作途中のものです

- 漫画『HUNTER×HUNTER』に出てくる「グリードアイランド」（冨樫義博考案）。
あれをそのまま位置ゲーやら流行りのAR・VRゲームにしたかったが、自分の技術的に無理すぎてとりあえずスペルカード（呪文）だけを作って見事にクソアプリ化したので報告します。

## だいたいのUI
![ui.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80546/f4291231-9978-4b13-dcc0-c472d8596d3a.gif)


## スペル：強奪でSSランクのカードを奪う。
![rob.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80546/5fcc4379-57ca-79b8-df0f-1cd0661481c5.gif)


## スペル：反射で相手の攻撃を跳ね返す

![hansya.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80546/6589577d-9543-d699-aa29-99c907d7b9ab.gif)

### ♡技術要素♤

サーバーサイド（API）：Node.js(Typescript)
フロントエンド（主にUI）：Angular(をIonicフレームワークで使う）
Ionicはクロスプラットフォームでwebだけでなく、iOS/Android,Electronのアプリとしてもビルドできるようなので選びました。

スペルバトルはどうしてもリアルタイム感を出したかったので一部websocketを使ったインタラクティブになっております。（たぶん）

### ♤機能♡（メモリの無駄づかい）

- ユーザー作成（Firebase Authentication)
- 新規登録時にスペルカード・アイテムカードを自動付与
- スペルバトル（実装済みカードは数種類）
- チャット
- 戦闘履歴確認画面

### †つけたい機能†（暗黒大陸編）

- すれちがい通信的な位置情報マッチング
- 探索・ショップ
- ポケモンGO的なマップ移動と探索
【小ネタ】動画ファイルをD&Dしたら圧縮してくれるwindowsバッチ

[ffmpeg公式](https://www.ffmpeg.org) からWindowsのバイナリをダウンロードし、以下のバッチファイルを解凍したフォルダ配下に置く。

```powershell
for %%f in (%*) do (
  echo %%f
  %~dp0\bin\ffmpeg.exe -i "%%f" -pix_fmt yuv420p -preset medium -map 0:0 "output\%%~xnf"
)
pause
```

圧縮オプションはお好みで。
SORACOM Napterの監査ログをcliで取得してみる

# これは
2019/10/9に、SORACOM Napterの監査ログを取得できる機能がリリースされました。
[SORACOMエンジニアブログ](https://blog.soracom.jp/blog/2019/10/09/starts-to-provide-audit-log-feature-on-soracom-napter/)では、WEBコンソールから確認する手順が紹介されていますが、今回はこれをcliから行ってみようと思います。

なお、Napterをcliから使う方法は[「SORACOM Napterをcliから使ってみる」](https://qiita.com/kkimura/items/50375cac7b4cc99d36a1)を参照してください。
また、本機能を利用するにはcliのバージョンは0.4.9以上にしてください。

# Napterで接続する

まずは監査ログの対象(Napterでの接続)を作成するために、Napterでssh接続します。

```bash
%soracom port-mappings create --body @napter.json
{
	"createdTime": **********,
	"destination": {
		"imsi": "**************",
		"port": 22
	},
	"duration": 1800,
	"endpoint": "**********:*****",
	"expired": false,
	"expiredTime": *******,
	"hostname": "******.napter.soracom.io",
	"imsi": "***************",
	"ipAddress": "*****",
	"operatorId": "*****",
	"port": ****,
	"source": {
		"ipRanges": [
			"******"
		]
	},
	"tlsRequired": false
}
```

接続できたらsshでログインしてみましょう。

# 監査ログを取得する

では、監査ログを取得してみます。

```bash
%soracom audit-logs napter get
[
        {
                "connectionId": "*************************",
                "createdAt": *****************,
                "direction": {
                        "destinationIPAddress": "************",
                        "destinationPort": 22,
                        "sourceIPAddress": "***********",
                        "sourcePort": **
                },
                "imsi": "***********",
                "operatorId": "*************",
                "tls": false,
                "type": "CLOSED"
        },
        {
                "connectionId": "************************",
                "createdAt": ****************,
                "direction": {
                        "destinationIPAddress": "************",
                        "destinationPort": 22,
                        "sourceIPAddress": "***********",
                        "sourcePort": **
                },
                "imsi": "************",
                "operatorId": "*****",
                "tls": false,
                "type": "CONNECTED"
        },
.....
]
```

こんな感じで簡単に取得できます。

指定できるオプションは以下の通りです。

|オプション|機能説明|
|----------|--------|
|--fetch-all|自動的にページネーションする。デフォルトでON？|
|--from int|取得するログの開始時刻。unixtime millisなので、出力の「createdAt」の値を参考に|
|--last-evaluated-key time|ページネイトしたときの最後のエントリの「createdAt」を入れると次のページから取得される|
|--limit int|取得するエントリー数|
|--resource-id|リソースのIDで取得するものを指定・・とあるが、connectionIdを指定しても効かなかったので何か別の物？|
|--resource-type|リソースタイプ。"ACCESS"とか指定できるのかと思ったらどうも"Subscriber"しか指定できない模様。今後の拡張で使われる？|
|--to int|取得するログの終了時刻。--fromと同じく範囲指定に使う|

すいません、ちょっとオプションは調べきれていませんが、from/to/limit/last-evaluated-keyなどをうまく使ってページネイト処理を作りやすいようになっていますね。

# まとめ

監査ログは取得して別の形式に成形して利用することが多いと思いますので、cliで取得できるのはとても便利です！
毎月の報告書作成のバッチなどで是非有効活用してください。
YARDの出力ディレクトリを指定する

20分ググる事になったので備忘録として残しておきます。

# やり方

-o オプションを付けましょう

```
yardoc -o 出力したいディレクトリ 出力したいファイル
```

例

```
yardoc -o doc/yard app/models/user.rb
```


# おまけ

というかhelpを参照しろって話ですね。。

```
$ yardoc -help
```

```
（前略）
    -o, --output-dir PATH            The output directory. (defaults to ./doc)
（後略）
```
2019-10-10 CentOS 7.7 > patch > my_patch_191010_exec > シンボリックリンクファイル対応パッチスクリプト (CentOS 6.9とCentOS 7.7で動作確認済)

```txt:動作環境
CentOS release 6.9 (Final)
CentOS Linux release 7.7.1908 (Core)
```

## 関連

WRF (Weather Research and Forecasting Model)のシステムをCentOS6.9からCentOS7.7へ移行中の調査にて気づいた事項。

- [2019-10-10 CentOS 7.7のmv > StackOverflow掲載とは異なる動作 > シンボリックリンクは解除されない](https://qiita.com/7of9/items/2f3334a3a819e923c225)
- [CentOS 6.9 | CentOS7.7 > patchコマンド > シンボリックリンクファイルへの振舞いが異なる](https://qiita.com/7of9/items/3f827a5c9883fd83224f)

## 概要

- CentOS 6.9で使用していたスクリプトがCentOS 7.7で動かなくなった
- patchコマンドの振る舞いが変わったことによるようだ
- patchコマンドをCentOS 6.9とCentOS 7.7両方で使えるように独自のpatchコマンドを実装した


## 独自のpatchコマンド

```bash:my_patch_191010_exec
#/usr/bin/env bash
set -eu

#echo "$#"

if [ $# -lt 2 ]; then
	echo "[cmd] [file] [patch_file]"
	echo ""
	echo "about: patch command to work on CentOS 6.9 and 7.7"
	echo "  On CentOS 7.7, symbolic file is not patched by default"
	echo "  making XXX.rej file, instead."
	echo ""
	exit 0
fi

echo "original: $1"
echo "working: wrk.$1"

mv $1 wrk.$1
cp wrk.$1 $1
rm wrk.$1
patch $1 $2
```

## 使用例

### 準備

サンプルとなるファイルを作る。

```
$echo "TEST" > test_1 
$echo "TESS" > test_2
$diff test_1  test_2  > diff.1to2
```

my_patch_191010_execに実行権限を付ける。

```
$chmod +x my_patch_191010_exec
```

### 使用例1 > ファイル指定あり

試しにLN_TESTというファイルをシンボリックリンクで作る。

```
$ln -fs test_1 LN_TEST
```

それにパッチをあてる例。

```
$ ./my_patch_191010_exec LN_TEST diff.1to2 
original: LN_TEST
working: wrk.LN_TEST
patching file LN_TEST
```

LN_TESTはシンボリックリンクではなく通常のファイルとなり、`TESS`という内容になっている。

### 使用例2 > ファイル指定なし

```
$ ./my_patch_191010_exec 
[cmd] [file] [patch_file]

about: patch command to work on CentOS 6.9 and 7.7
  On CentOS 7.7, symbolic file is not patched by default
  making XXX.rej file, instead.
```
VSCodeでPHPの開発をする

## 結果
期待以上にサクサクだった。

## 環境情報

- MacOS High Sierra 10.13.6
- zsh 5.7.1
- Homebrew 2.1.12
- phpenv v0.9.0-rc.1

## 参考

- [Visual Studio Code on macOS](https://code.visualstudio.com/docs/setup/mac)

## 手順

### caskを使えるように

```shell
brew tap homebrew/cask
```

### VSCodeをインストール

```shell
brew cask install visual-studio-code
```

### 必要そうなextensionをインストール

##### ・ [PHPのインテリセンス](https://marketplace.visualstudio.com/items?itemName=bmewburn.vscode-intelephense-client)
```shell
code --install-extension bmewburn.vscode-intelephense-client
```

##### ・ [アノテーション @~](https://marketplace.visualstudio.com/items?itemName=neilbrayfield.php-docblocker)
```shell
code --install-extension neilbrayfield.php-docblocker
```

##### ・ [()をペアでカラーリング](https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer)
```shell
code --install-extension coenraads.bracket-pair-colorizer
```

##### ・ [.envのシンタックス、ハイライト](https://marketplace.visualstudio.com/items?itemName=mikestead.dotenv)
```shell
code --install-extension mikestead.dotenv
```

##### ・ [yamlのLanguageSupport](https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml)
```shell
code --install-extension redhat.vscode-yaml
```

##### ・ [アイコン](https://marketplace.visualstudio.com/items?itemName=pkief.material-icon-theme)
```shell
code --install-extension pkief.material-icon-theme
```

##### ・ [xdebug](https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-debug)
```shell
code --install-extension felixfbecker.php-debug
```

### codeコマンドを有効にする
```shell
cat << EOF >> ~/.zprofile
# Add Visual Studio Code (code)
export PATH="\$PATH:/Applications/Visual Studio Code.app/Contents/Resources/app/bin"
EOF
```
*※ bashの方は、~/.bash_profileへ*

### xdebug.iniを設定

##### phpenvのxdebug.iniの状態
```shell
zend_extension="~/.phpenv/versions/7.2.20/lib/php/extensions/no-debug-non-zts-20170718/xdebug.so"
xdebug.remote_enable=true
xdebug.remote_autostart = On
xdebug.remote_port=9000
xdebug.remote_host=127.0.0.1
```

### VSCodeのxdebugを設定

##### プロジェクトのパスをVSCodeで開く
```shell
code {プロジェクトのパス}
```

##### メニュー「Debug」 > 「Open Configrations」を設定

```shell
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "XDebug",
            "type": "php",
            "request": "launch",
            "port": 9000
        },
        {
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 9000
        }
    ]
}
```

### Xdebugを使ってみる

1. ブレークを貼る
2. 左の虫のアイコンから
3. 受けの状態にしてローカル環境にアクセス
4. 操作する

<img width="1519" alt="vscode_xdebug.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463117/c54444b8-9702-1cb6-3789-c37de46e3068.png">
vim・neovimでできるマークダウン　[リアルタイムプレビュー完備]

# 執筆におけるツールでベストなもの探し
　技術書店に向けて色々皆んなで使えるツールを探していたわけだけれども、reviewとか設定がめんどいし、サブタイ長いと消えるし、図もズレるし、目次が作られなかったりした。Texも良いけど、使える人と使えない人が混在したチームだと使いにくい。Typoraとかもあるけど、変換がやや面倒。

# テキストエディタにプラグイン突っ込むだけなの
vimやneovimを利用している方なら使ってる人も多いと思いますが、３つのプラグインを入れるだけで簡単にマークダウン設備が整います。設定も数行で快適な環境を手に入れることができます。

## 第1のプラグイン:plasticboyのmarkdown
[plasticboy/vim-markdown](https://github.com/plasticboy/vim-markdown)

このプラグインがメインプラグインです。マークダウンを可能にします。

## 第2プラグイン:previm
[previm/previm](https://github.com/previm/previm)

コレでブラウザ表示が可能になります。
このプラグインの設定で必要なのは、

- マークダウンファイルの拡張子指定
- ctl+pをプレビュー展開のキーマップにする
- 折りたたみの機能が自動でついてるので、その設定を打ち消す

## 第3のプラグイン:open-browser.vim
[tyru/open-browser.vim](https://github.com/tyru/open-browser.vim)

コレがないとprevimの設定をもう少し頑張んなきゃいけないので、コレを使って諸々の設定を完了させてもらいます。

# 記述する
　私はdein.vimでプラグインを使って管理しているので、tomlの書き方で書いています。dein.vimのインストールは記事を見るより、READMEに書いてある通りにやった方が間違い無いです。たまにgit cloneしてる記事とかありますけど、curlコマンド使えば良いのにといつも思います。READMEでもcurlを使ってインストールする手順が記載されています。自分は~/.cache/deinでshコマンド打ってインストールしました。deinと名のついたディレクトリがあるのが一番わかりやすいと思ったからです。この中にreposってディレクトリができてここに自動的にtomlに書いたプラグインをインストールしてってくれます。

[Shougo/dein.vim](https://github.com/Shougo/dein.vim)

後、私はneovimを使っているので、.config/nvim直下にinit.vimを置いて、deinのインストール用の記述を加えてあります。ここまでやれたら後はガンガンプラグインを突っ込める状態になります。楽ですねぇ〜。

```dein.toml
[[plugins]]
repo = 'plasticboy/vim-markdown'

[[plugins]]
repo = 'previm/previm'
hook_add = '''
    autocmd BufRead,BufNewFile *.md  set filetype=markdown
    nnoremap <silent> <C-p> :PrevimOpen<CR>
    let g:vim_markdown_folding_disabled=1
    let g:previm_enable_realtime=1
'''

[[plugins]]
repo = 'tyru/open-browser.vim'
```

# 使用感
楽ですね、こんだけの設定で良い訳ですからね。
READMEとかを書いてみて、ctl+pしてみてください。ブラウザでプレビュー確認できますよ〜。しかも編集するとリアルタイムでプレビュー可能です。reviewなんて一々保存しないと反映されませんからね。間違いなくこっちの方が楽です。ただ、リアルタイムを維持するためには、一度開いたウィンドウからオープンプレビューしたもの出ないとできないです。途中でエディタを閉じたら、ブラウザも閉じて、もう一度プレビューを出す必要があります。以上、楽チンマークダウン環境設定でした。
他アプリのフルスクリーン上にウインドウを表示する

Macアプリで他のアプリが表示しているフルスクリーンスペース上にウインドウを表示する方法を記載します。

結論から書くと下記の３つが適切に設定されていれば表示できます。

* NSPanel
* NSWindow.StyleMask
* NSWindow.CollectionBehavior

---

環境:
* macOS10.14.6
* Xcode10.1

```Swift
let rect = NSRect(x: 100, y: 100, width: 300, height: 200)
let styleMask: NSWindow.StyleMask = [.titled, .nonactivatingPanel]
let window = NSPanel(contentRect: rect, styleMask: styleMask, backing: .buffered, defer: true)
window.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
window.makeKeyAndOrderFront(nil)
```

## NSPanel
NSWindowのサブクラスとして定義されています。
iOSでは聞きなれないクラス名ですがmacOSでは昔からあって、用途はメインウィンドウに付属させるサブパネルのような表示に用います。
今や滅多に使いませんが。

```Swift
let window = NSPanel(contentRect: rect, styleMask: styleMask, backing: .buffered, defer: true)
```

NSWindowと同じように初期化して使います。Storyboardで生成してもOKです。

## NSWindow.StyleMask
ウインドウの表示スタイルです。

```Swift
let styleMask: NSWindow.StyleMask = [.titled, .nonactivatingPanel]
```

`.nonactivatingPanel` 
これが必要になります。
アプリをアクティブ化しない付属パネルのような挙動になり、他のアプリのフルスクリーンスペース上に表示できるようになります。

## NSWindow.CollectionBehavior
ウインドウの挙動を指定できます。

```Swift
window.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
```

`.canJoinAllSpaces` 
全てのスペースに表示できます。メニューバーなどがこのスタイルです。

`.fullScreenAuxiliary` 
フルスクリーンウインドウと同じスペースに表示できます。


## 結果
Safariのフルスクリーンウインドウ上に表示。
<img width="720" alt="window_on_fullscreen.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156085/73435cc8-a5c3-7a31-5db1-425925032020.png">
Raspberry PI Zero(Raspbian Buster Lite）にPygameをインストール

desktop版だとPygameはプリイン済みだが、Buster Liteにインストールしてみる。
desktop版よりも余計なモノが入っていなくて再生が安定しそうだったので。

``` sh
sudo apt-get update
sudo apt-get -y install python-pip
sudo apt-get -y install libsdl-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev
sudo apt-get -y install libsmpeg-dev libportmidi-dev libavformat-dev libswscale-dev
sudo pip install pygame
```
*args、extract_options!とは？引数で可変長を受け取る＜Rails＞

##はじめに
コードリーディングをしていたら、
引数の中に「*」（アスタリスク）があったので、なんだ？と思い調べたことをまとめたいと思います。

結論から言うと、この書き方で**可変長で引数を受け取ることができる**のです。


要は、呼び出した引数が０の場合でもnilになるだけでエラーは出ないですし、逆に複数あったとしても全て受け取ることができるのです。

##例えば・・・

```
def hoge(*args)
  p args
end

hoge()
# => nil
hoge(1,2,3)
# => [1, 2, 3]
hoge(1,2,dog:3,cat:4)
# => [1, 2, {:dog=>3, :cat=>4}]
```
というように、複数を受け取ることはもちろんのこと、ハッシュ形式の値も受け取ることができます。
ここで押さえておきたいことが、複数の値は受け取っても**全て配列の中に収まる**ということです。

さらに、「**」とアスタリスクを二つに並べることもできます。

```
def hoge(**args)
  p args
end

hoge(1,2,3)
# => ArgumentError: wrong number of arguments (given 3, expected 0)
hoge(1,2,dog:3,cat:4)
# => ArgumentError: wrong number of arguments (given 2, expected 0)
hoge(dog:3,cat:4)
# => {:dog=>3, :cat=>4}
```
どうでしょう。複数の値は受け取りますが、逆にハッシュ形式のものしか受け取らなくなりました。
そして、今度は配列の中ではなくて**ハッシュ形式のまま**受け取っていますね。


さらに使い方を変えてみます。

```
def hoge(args1,args2,*args3)
  p args1
  p args2
  p args3
end

hoge(1,2,3,4,5)
# => 1
# => 2
# => [3, 4, 5]
hoge(1,2,3,dog:4,cat:5)
# => 1
# => 2
# => [3, {:dog=>4, :cat=>5}]
```
通常の引数がそれぞれ１つずつ値を受け取った後、最後にまとめて*args3が受け取っています。

##extract_options!
周辺で`.extract_options!`が使用されており、これも調べてみました。

```
def hoge(*args)
  p args
  p args.extract_options!
  p args
end

hoge(1,2,3,4)
# => [1, 2, 3, 4]
# => {}
# => [1, 2, 3, 4]
hoge(1,2,3,dog:4,cat:5)
# => [1, 2, 3, {:dog=>4, :cat=>5}]
# => {:dog=>4, :cat=>5}
# => [1, 2, 3]
```
これからわかることは、`extract_options!`をメソッドにすると、argsに入っているハッシュの値を奪い取ってしまうということですね。
奪い取られた後のargsには、ハッシュの値は無くなっています。

##おまけ

個人的に気になったので、引数の順番を変えて実験してみました。

```
def hoge(args1,*args2,args3)
  p args1
  p args2
  p args3
end

hoge(1,2,3,4,5)
# => 1
# => [2, 3, 4]
# => 5
```

ふむふむ、間に置くと後ろの引数は最後の一つだけ取り出すのね。

```
def hoge(args1,*args2,**args3)
  p args1
  p args2
  p args3
end

hoge(1,2,3,4,5)
# => 1
# => [2, 3, 4, 5]
# => {}

hoge(1,2,3,4,{cat:5},6)
# => 1
# => [2, 3, 4, {:cat=>5}, 6]
# => {}
```
この場合は、最後にハッシュ形式を置かないと受け取るものがないので空になってしまう。
Mysqlにて、datetime型のデータに対してdate型でgroupbyする

```sql
select date_format(cu.created_at, '%Y/%m/%d') as 日付,
       count(cu.user_id)                      as 利用者数
from coupon_used as cu
where cu.code in ("2019", "2018")
  and cu.created_at >= "2018-01-01 00:00:00"
  and cu.created_at < "2020-01-01 00:00:00"
group by date_format(cu.created_at, '%Y/%m/%d');
```

`date_format`便利

ちなみに、asで定義したdate_formatは`group by`で使用できた。

```sql
select date_format(cu.created_at, '%Y/%m/%d') as 日付,
       count(cu.user_id)                      as 利用者数
from coupon_used as cu
where cu.code in ("2019", "2018")
  and cu.created_at >= "2018-01-01 00:00:00"
  and cu.created_at < "2020-01-01 00:00:00"
group by 日付
```

`group by 日付`面白い

変数定義みたいにindex保存されてるのかな

SqlでLoopとかも書いてみたいけど、その域になったらクエリビルダ使用したほうがいいな笑
lsしてそのままファイルを圧縮する

ログが溜まって来たときの対処で使いました
まとめてではなく、ファイル一つづつ圧縮したいときに便利。


`ls [キーワード]*.log | xargs -n1 -i tar cvzf {}.tar.gz {}`

 同階層に`[キーワード]*.log.tar.gz`ファイルが作成されます。
`[キーワード]*.log`は残ってしまうので・・・

`rm [キーワード]*.log` で削除すればOK。
Angularの開発ステップ　初期に入っていないLibraryを入れたい時

# モチベーション
初期には入っていないlibraryを使いたかった。
※ちなみに使いたかったのは、@angular/cdk　
※drag&dropの挙動をするコンポーネントを作りたい時に上司に聞いたら教えてくれた。

# やること
### ①package.jsonにLibraryを追加する
```
{
  "name": "task-management",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
//　省略
  "private": true,
  "dependencies": {
    "@angular/animations": "~8.2.7",
    "@angular/common": "~8.2.7",
    "@angular/compiler": "~8.2.7",
    "@angular/core": "~8.2.7",
    "@angular/forms": "~8.2.7",
    "@angular/platform-browser": "~8.2.7",
    "@angular/platform-browser-dynamic": "~8.2.7",
    "@angular/router": "~8.2.7",
    "bootstrap": "^4.3.1",
    "rxjs": "~6.4.0",
    "tslib": "^1.10.0",
    "zone.js": "~0.9.1",
    "@angular/cdk": "*" //　←追加
  },
// 省略
}

```
※最初devDependenciesに追加しようとしていた。
※dependenciesとdevDependenciesの違いがよく分からなかったので調べてみた。
https://qiita.com/chihiro/items/ca1529f9b3d016af53ec
※↑を読んでもピンとこなかったので、同僚に聞いたら以下の答えをもらった。
dependencies：アプリケーションの動作に必要なもの
devDependencies：Buildや開発補助ツールとして開発時に必要なもの
※version指定については、以下を参照
https://qiita.com/chihiro/items/5826678bc9287fb57a28

### ②npm iをする
package.jsonに書いてあるものを取りに行ってくれる。
tsファイルに@angular/cdkのimport文を書いてもコンパイルエラーは出なくなったよ！

# まとめ
【前提】npmインストールをすると、package.jsonにあるものを取って来るよ
１．package.jsonに欲しいlibraryを追加しよう
２．npm iでそいつを取ってこよう
【メモ】Macで複数ファイルの名前を一括置換

- 名前変更したいファイルを全部選択
- 右クリックでメニュー表示
- 置換処理設定でGO

![スクリーンショット 2019-10-10 11.15.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126335/35cf8f1d-b8fc-b540-1f9f-6a4d5422062b.png)
![スクリーンショット 2019-10-10 11.15.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126335/80dde95a-1723-a0d2-0fe4-0d7d91003d01.png)

らくちーーんｗ
PWAっていったい何？

#PWAとは？
PWAとは、「Progressive Web Apps」の略称で、モバイル向けWebサイトをGooglePlayストアなどで見かけるスマートフォン向けアプリのように使える仕組みです。
Googleが定める要素を備えたWebサイトであり、オフラインやプッシュ通知に対応するためのブラウザAPI(Service Workerなど)を利用しているWebサイトをPWAと呼びます。
PWAを実装することでプッシュ通知やホーム画面へのアイコン追加など、アプリの特徴的な機能をWebサイトに持たせる事ができます。これにより、UX向上やユーザーエンゲージメントの改善にもつながるとして注目されています。
(参照：https://www.seohacks.net/basic/terms/pwa/)

とのことです。
よく分からないですが、簡単に言うとブラウザのURLバーを非表示にして全画面表示させたり、プッシュ通知を送れるようにしたりして、webサービスをあたかもアプリのような振る舞いにさせてしまおう！
という理解をしています。
#PWA化をするメリット・デメリット
###メリット
1.アプリじゃないからインストール不要
PWA化すると動きはまるでアプリのようになりますが実態はwebサービスなのでAPP STOREやPLAY STOREから探して、インストールしてという面倒くさい手順を省けます。
また開発側としてはアプリ化させる際の面倒な手続きなど省けるのもメリットなのかな？

2.オフラインでも動く
ページ遷移など本来はオンラインでしか動かないような処理もキャッシュを使ってある程度オフラインでも動いてくれるようです

3.プッシュ通知の受信ができる
アプリではよく見る通知を受け取れるようになり、最新の情報が送れるようになります。
###デメリット
OS、ブラウザのバージョンによってはサポートされていないことが多々ある。
これが一番大きなデメリットだと思います。
Androidでは動くのにiOSだとうまくいかない。Chromeなら大丈夫なのにsafariはダメ。
みたいなことがちょくちょくありました。
#実装方法
1.httpsを有効にする
2.manifestを作る
3.ServiceWorkerを作る
この３つだけで実装できるので実装自体はとても簡単です。
#実際に直面した問題
###iOSのsafariではPWAが完全にサポートされていない
PWAの機能で「ホーム画面に追加」の通知ポップアップを出すという機能があります。
![images (20).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504042/0b014d0b-c1c8-2165-d2fb-464175ce74e5.jpeg)

この画像の下の通知です。
これがiOSだとどうやっても表示させられませんでした。
自分が調べた限りではまだサポートされていないとのこと。
もし方法があればご教授願います。。
###「ホーム画面に追加」通知のデザイン変更が煩雑
「ホーム画面に追加」通知ですがPWA既存の機能で、どこかに明示的にCSSが書かれていたりするわけではありませんでした。
なので、本来ポップアップが出るタイミングで別のJavaScriptでポップアップを制御して、用意したCSSを表示させ、ホーム画面に追加orキャンセルの処理をしてと、たかがデザイン変更に滅茶苦茶苦労させられました。
これももし何か有効な手段を知っている方がいらっしゃればお教えいただければと思います。