OmniAICreator/Qiita-1.07M huggingface dataset:
mongooseでMongoDB に接続しようとしたら身に覚えのない機能に対するWarningが出た

## はじめに
MongoDB を利用する中、使っていない（特に指定していない）機能に対して Warning が出た。

```bash
(node:54073) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.
```

ensureIndex なんて書いた覚えはないので、ナンノコッチャと。Warning なので放置でも良いのだが、気持ち悪いので、解消することに。割と気になる性格。

## 動作環境
|Item|version|
|:-:|:-:|
|MongoDB|4.2.8|
|mongoose|5.10.3|
|node.js|12.18.1|

mongoose の最新は、2020年9月23日現在 5.10.6。週1更新！

## 解決方法

接続時に createIndex: true を指定すれば良い。

```javascript
mongoose.connect('mongourl', {
  useCreateIndex: true,
  useNewUrlParser: true,
  useUnifiedTopology: true
})
```

もしくは、

```javascript
mongoose.set('useCreateIndex', true)
mongoose.connect('mongourl', {
  useNewUrlParser: true,
  useUnifiedTopology: true
})
```

など。
なお、エラーメッセージでは、createIndex"es" を使えと書いてあるが、指定してもそんなものはないと怒られる。

おしまい。
Wireshark 3.3.0 (dev) でpacket diagram viewを表示する手順

## Wireshark 3.3.0(dev)にアツいアップデートが！その名も "Packet diagram view"

先日社内で[Wireshark](https://www.wireshark.org/)のアップデートで「これはアツい！」と話題になったのが[3.3.0の「Packet Diagram View」](https://www.wireshark.org/news/20200915.html)です。
以下のようにパケットの中身を視覚的に確認することができます。アツいですねー。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Look at this slice of awesome. The new Wireshark version in dev (3.3.0) has a packet diagram view. <br><br>A fantastic teaching and learning tool! When released, I&#39;ll be making pretty extensive use of this in my classes! Great job <a href="https://twitter.com/geraldcombs?ref_src=twsrc%5Etfw">@geraldcombs</a> and <a href="https://twitter.com/WiresharkNews?ref_src=twsrc%5Etfw">@WiresharkNews</a> team. <a href="https://t.co/f7zVwF89Gn">pic.twitter.com/f7zVwF89Gn</a></p>&mdash; Chris Sanders 🍯 (@chrissanders88) <a href="https://twitter.com/chrissanders88/status/1306262108665982976?ref_src=twsrc%5Etfw">September 16, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

早速表示してみたいところですが [表示] > [パケット ダイアグラム] が選択できません。
![](https://docs.google.com/drawings/d/e/2PACX-1vRt4jBr-BpP8W4jSSjJkvh9Vq7_Fys8nYHoQUD1SivFVbObFjK1FouVQfxeMzKb3UNNPPdvz8BQtuiE/pub?w=390&h=280)

## パケットダイアグラムを表示する方法

パケットダイアグラムの表示は設定で行います。
_※記載時点で 3.3.0 は Development Release です。今後挙動が変更される可能性があることを留意ください。_

Wiresharkの [編集] > [設定] から [外観] > [レイアウト] と進むと、ウィンドウ内のレイアウトとその中に表示する内容が選択できるようになります。
ここでパケットダイアグラムを指定すれば、そこに表示されるようになります。
![](https://docs.google.com/drawings/d/e/2PACX-1vSoIbWafiocgMtfsy0GAUFa5Z_3dtc_utmzgZGG-Cwu1vKm-VojqalAqz9Pr4n6oRCeOoYB0kuBFiLy/pub?w=755&h=368)

### Wireshark 3.3.0(dev) で packet diagram view を表示している様子

![Wireshark 3.3.0(dev) で packet diagram view を表示している様子](https://docs.google.com/drawings/d/e/2PACX-1vQoZQj6eKyx9zeCloqRmAgOv0FTJbcC2yY3oHxic8pfI_Fqs7YFLLkayUfkNkGihy7-QoxLBEn8FH7x/pub?w=936&h=512)

ダイアグラム内でフレームを選択すればバイトストリームの当該位置をハイライトしてくれます。
めっちゃんこオシャレ！
![](https://docs.google.com/drawings/d/e/2PACX-1vRJxvCzbr2GLaWy-JsQAatHF53IyV_PqFn_h3IZlVhjNQiBGjxUH7utd-f6BrFaaNsJEvvqaSa44rdm/pub?w=908&h=269)

## あとがき

こういった事が話題となる社内です！たまに[オープンハウスをやってたりする](https://careers.soracom.jp/event)ので、チェックしてみていただけると嬉しいです。
みなさんも、素敵なパケット生活を！

EoT
【Golang】Go言語基礎 構造体について②（埋め込み）

今回は[【Golang】Go言語の基礎　構造体について①](https://qiita.com/Kiyo_Karl2/items/95b718449a6b5940c33a)の続編です。

Goにはクラスという概念がありません。したがって継承という概念もないです。しかし、その代わりに構造体の埋め込み（Embedded)というものがあります。

##早速書いてみる

```go

package main

import "fmt"

type Vertex struct {
    //小文字だと他のパッケージからはアクセスできなくなる。
	x, y int
}

func (v Vertex) Area() int {
	return v.x * v.y
}

func (v *Vertex) Scale(i int) {
	v.x = v.x * i
	v.y = v.y * i
}

//構造体VertexをVertex3Dに埋め込む
type Vertex3D struct {
	Vertex
	z int
}

func (v Vertex3D) Area3D() int {
	return v.x * v.y * v.z
}

func (v *Vertex3D) Scale3D(i int) {
	v.x = v.x * i
	v.y = v.y * i
	v.z = v.z * i
}

//コンストラクタ
func New(x, y int) *Vertex{
	return &Vertex{x, y}
}

func main() {
	v := New(3, 4)
	v.Scale(10)
	fmt.Println(v.Area()) //=> 1200
	


}
```
↑のように構造体を埋め込むことができます。Vertex3Dの構造体では新しくzを追加しています。
埋め込んだ構造体（Vertex3D）では　Vertexで定義したx, yを使うことができます。継承とほぼ同じですね。

ちなみにfunc New の部分はコンストラクタです。rubyでいうinitializeのような処理をしていると思ってもらえると
理解しやすいと思います！


```go
(ここまでは上と同じなので省略）

func New(x, y, z int) *Vertex3D {
	return &Vertex3D{Vertex{x, y}, z}
}

func main() {
    //新しく5を追加する。
	v := New(3, 4, 5)
	v.Scale3D(10)
    fmt.Println(v.Area())
	fmt.Println(v.Area3D()) => 60000
}
```
試しに新しく定義したzに5を代入してみると60000が返ってきました！

##いつも最後まで読んでいただきありがとうございます
ご指摘やご質問などあればコメントいただけると嬉しいです！
CloudWatchでよく使うドキュメント

CloudWatch設定作成時にドキュメントを探すのが手間なのでざっくりした作成の流れと共にまとめます。

###サーバーで CloudWatch エージェントをインストールして実行する
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html

ドキュメントに従って、任意のディレクトリにダウンロードをしてインストールを行います。

インストールが完了すると、以下ディレクトリが作成されます。

```
/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d
```

インストールが失敗する場合は以下を確認
①インスタンスにロール「CloudWatchAgentServerRole」が割り当てられているか
②プロファイルが設定されているか


###ウィザードを使用して CloudWatch エージェント設定ファイルを作成する
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-cloudwatch-agent-configuration-file-wizard.html

ウィザードを使用して、対話式に設定を行えます。

```
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
```
手動作成も可能。

ログ設定部分

```
"file_path": "ログのパス",
"log_group_name": "任意の名前",
"log_stream_name": "{instance_id}"
```

configが完成したら、Agent起動

```
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/config.json -s
```
↑ コマンドの file: 以降は先ほど作成したconfigのパスを指定

※メモリ監視等入れる場合はcollectdを要求される場合があり↓

```
yum -y install collectd
ll /usr/share/collectd/types.db
```


サービス確認

```
systemctl status amazon-cloudwatch-agent.service
```


Agentの起動を確認したら、
コンソールでログが送られている事を確認する。
CloudWatch＞ログ＞ロググループ

###CloudWatch エージェントのトラブルシューティング
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/troubleshooting-CloudWatch-Agent.html

記事の途中にある「CloudWatch エージェントファイルとロケーション」にファイルの場所等が載っていて便利
ゼロから始めるDjango(part:1)

# 理由
仕事をしていてDjangoのライブラリに関連するものが多く、一度触ってみたいと思ったため
# 目的
- アプリケーションの作成の流れを理解する
- 使うことができるライブラリを理解する

# 参考文献
[はじめての Django アプリ作成、その 1 \| Django ドキュメント \| Django](https://docs.djangoproject.com/ja/3.1/intro/tutorial01/)

# 実践
## djangoのプロジェクトのスタート
```
django-admin startproject mysite
```
上記コードを実行するとdjango用のプロジェクトを`mysite`という名前で作成してくれる。

## プロジェクトの中身
そのプロジェクト構造は以下のようになっている。

```
mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
```
*外側のmysiteは重要ではないため好きな名前でよい

- manage.py プロジェクトの様々な操作を行うやつ
- 内側のmysiteはPythonパッケージ
- mysite/settings.py: Django プロジェクトの設定ファイル
- mysite/urls.py: Django プロジェクトの URL 宣言(コントローラーみたいなやつ？)
- mysite/asgi.py: プロジェクトを提供する ASGI 互換 Web サーバーのエントリポイント
エントリポイント：プログラムを実行するうえで、プログラムやサブルーチンの実行を開始する場所のこと(main.pyみたいなやつ)

-   mysite/wsgi.py: Webサーバー

## 開発用サーバー
manage.pyのあるディレクトリ、つまりは外側のmysiteで上記コードを実行すると立ち上がる。

```
python manage.py runserver
```
サーバーのポートを変えたい場合は下記のようにする。

```
python manage.py runserver 8080
```
# pollsアプリケーション
## 作成準備
manage.pyと同じ階層で下記のコマンドを実行

```
python manage.py startapp polls
```
pollsというディレクトリが自動生成される。中身は下記のようになっている。

```
polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py
```
`polls`の部分は任意。startappが大事。

urls.pyを追加し、urls.pyとviews.pyを作成する。

```python:polls/views.py
from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")
```

```python:polls/urls.py
from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]
```
## ルートURLconf
```python:mysite/urls.py
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]
```
- urlpatternsのリスト内にurlconfを追加。
- djangoではinclude()に遭遇するとそのポイントまでに一致したurlのところまでを切り取る。
- 次の処理のために残りの文字列をインクルードされたURLconfへ渡す。
`http://polls/hogehoge/` の場合は
`http://polls/(ここまで切り落とす)`, `hogehoge/(ここまでをpolls.urlsへ渡す)` 

## 実行結果の確認

下記のコマンドで実行結果を確認する

```
$ python manage.py runserver
```
 http://localhost:8000/polls/ にアクセスして、
「Hello, world.You`re at the polls index.」と表示されていれば成功
Spotify APIで再生情報をリアルタイムに取りたいと調べてた時のこぼれ話


Spotifyのweb APIで「再生中の曲をリアルタイムに取得したいなー」と思って、色々調べてた。
Spotifyと開発者コミュニティのやりとりがちょっと面白かったので、こぼれ話的にメモ。

-----

GETのAPIはすぐにみつかった。
https://developer.spotify.com/documentation/web-api/reference/player/get-the-users-currently-playing-track/

まぁ、そりゃあるよね。

が、曲が変わった時に教えてくれるようなwebhookみたいなのは、一向に見つからず。
ありそうでない。。。

「ポーリングは避けたいなー」と粘っていると...

GitHub Issuesでディスカッションされてた。既に2年前から。
https://github.com/spotify/web-api/issues/492

以下、ディスカッションを抜粋。

:speech_balloon: 開発者は、リクエスト上限を気にしつつ、ポーリングで何とか凌いでる様子。
https://developer.spotify.com/documentation/web-api/#rate-limiting

:speech_balloon: clientサイドのweb socketライブラリ作った人もいる（裏ではポーリングらしい）
https://github.com/spotify/web-api/issues/492#issuecomment-342029854

:speech_balloon: 月５万ユーザー持つような開発者も困ってる
https://github.com/spotify/web-api/issues/492#issuecomment-370070771

:speech_balloon: Spotify側も「必要性を認識してる」とコメントしつつ、２年間特にアウトプットなし
https://github.com/spotify/web-api/issues/492#issuecomment-356882740

:speech_balloon: 実はDiscordに対しては、web socketらしきものがサポートされてることが報告される
https://github.com/spotify/web-api/issues/492#issuecomment-370070771

:speech_balloon: 開発者たち「何で俺らには使わせてくれないんだ」とイラつき始める
https://github.com/spotify/web-api/issues/492#issuecomment-455553492
（気持ちはわかる）

:speech_balloon: Spotify側は、リバースエンジニアリングでパートナーとの秘匿情報がさらされてるからとGitHub Issueをlockする
https://github.com/spotify/web-api/issues/492#issuecomment-509317942

:speech_balloon: ディスカッションの場がオフィシャルコミュニティに移ったが、現在もSpotifyからのアウトプットは特になし
https://community.spotify.com/t5/Spotify-for-Developers/Access-to-websockets/m-p/4955299/highlight/true#M146
【Bash】パイプをセミコロンに書き換えるとイメージしやすかった

Bashを使った開発や作業では、パイプラインを繋げることが多々あるかと思います。
最近必要に駆られて学習を始めたのですが、今ひとつしっくり来ず・・・。
そんな中、以下のコードをみて、なるほど、と思ったので、メモ。

```bash

# パイプの方
command1 | command2

# セミコロンの方
command1 > tmp; command2 < tmp; rm tmp
```

セミコロンの方の例では、tmpというファイルを生成しcommand1の結果を保存しています。そして、その次の処理でそのデータを呼び出して、command2に渡し、仮作成したtmpファイルは不要なので、最後の処理で削除しています。

ただし、厳密には上記のコードには違いがあります。パイプの方は並列で処理が走り、より効率的です。理由がない限りはパイプの方で書きましょう。並列処理なのに前のコマンドの結果を待ってくれるのは素敵ですね。
Google Cloud Certified - Professional Cloud Architect に合格しました

# 資格取得に向けて

昨日 (2020/09/22)、タイトルの通り Google Cloud Certified - Professional Cloud Architect を取得しました
勉強期間は約 2 ヶ月です

この嬉しさを忘れないうちにこれから受けようと思っている方に自分なりにアドバイスなどを残します

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353538/bb38d0a2-d02e-8270-f7b3-fb0962ba6493.png)

> かっこいい…



## 想定する読者

- Google Cloud Certified - Professional Cloud Architect を受けようと思っている
- AWS Certified Solutions Architect – Associate を取って次、何を受けようか悩んでいる



## 本人スペック

- 今年 3 月に AWS Certified Solutions Architect – Associate を取得
- GCP の経験は昨年、PJ で GCE と Pub/Sub、IoT Core あたりを半年程触っていた程度
- 今年に入ってからの業務はもっぱらオンプレのインフラ屋さん



## 取ろうと思ったきっかけ

上でも書きましたが昨年、PJ で少し GCP を触っていました

ある時、「そういえば去年触ってた GCP、実はあんまりよく分からずにやってたな」と思い AWS の違いも含めてここは一度体系的に学んでおこうと思ったのがきっかけ

あと、正直これが自分の中で大きいですが最近の業務があまり楽しくなかったのでその欲求不満(?)的なものをどこかにぶつけたかったというのがあります



## モチベーション

**やると決めたら先に受験日を決めてしまう**

まじでこれ大事、受験料まで払ってしまえばもう逃げられないから勉強するしかない
落ちたら 2 万無駄になると思うとめっちゃやる気でる



# 勉強法

とりあえずやれることは色々やったのでご紹介します



## 公式ドキュメント

個人的に役立ったものをいくつか紹介します

- [『 1 行でわかる Google Cloud Platform』公開](https://cloud.google.com/blog/ja/products/gcp/google-cloud-platform-paperprint)
- [AWS プロフェッショナルのための Google Cloud](https://cloud.google.com/docs/compare/aws?hl=ja)
- [[Cloud OnAir] Google Cloud とつなぐ色々な方法 〜 つなぐ方法をゼロからご紹介します〜 ](https://www.slideshare.net/GoogleCloudPlatformJP/cloud-onair-google-cloud-2019131)
- [[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介](https://www.slideshare.net/GoogleCloudPlatformJP/cloud-onair-bigquery-201896-113180907)
- [[Cloud OnAir] Bigtable に迫る！基本機能も含めユースケースまで丸ごと紹介](https://www.slideshare.net/GoogleCloudPlatformJP/cloud-onair-bigtable-2018830)

Cloud OnAir は通勤中の電車などで暇つぶしがてらいろいろ見ておくといいと思います

また、公式ドキュメントではありませんがメルカリの開発者ブログも公式には載っていない Tips が多くありそこから気付く点もあるのでおすすめです

> 例えばこれ、 [メルペイでのSpannerとの戦いの日々](https://engineering.mercari.com/blog/entry/2019-04-18-090000/)



## 書籍

今回読んだのは以下になります

1. [Google Cloud Platform　エンタープライズ設計ガイド](https://www.amazon.co.jp/dp/B07C85YMCW/ref=cm_sw_r_tw_dp_x_Bs1AFbWDWRX9C)
2. [GCPの教科書](https://www.amazon.co.jp/dp/B07S1LG1Y1/ref=cm_sw_em_r_mt_dp_.p1AFbQFJ84G5)
3. [GCPの教科書II 【コンテナ開発編】](https://www.amazon.co.jp/dp/B088LZGPM5/ref=cm_sw_r_tw_dp_x_Ar1AFbQS53YAZ)

この中でどれか 1 冊だけ買うとしたら 2. の GCP の教科書をおすすめしますが、できれば 1. のエンタープライズ設計ガイドでざっくりと概要をつかんでから読んだ方がいいかと思います

GCP の教科書コンテナ編は、読んでおくに越したことはありませんが今回の資格取得に限っては別に読まなくてなんとかなります

ただ、内容としてはとても学ぶ点が多くあったので業務で GKE を扱うことになったら一度読み返すつもりです



## Udemy

Udemy で GCP の日本語コースは皆無です
ここは腹を括って英語コースを受講しましょう、意外となんとかなります

- [GCP - Professional Cloud Architect - Practice Exams - FREE!](https://www.udemy.com/course/gcp-professional-cloud-architect-practice-exams-by-category/)

- [Google Cloud Certified Professional Cloud Architect : P.Test](https://www.udemy.com/course/google-cloud-certified-professional-cloud-architect-ptest/)

上記のコースは、解説も割と丁寧に書かれています
勉強していると自分では結局どこが大事なのかわからなくなったりするので問題を解いて第三者の視点で重要なポイントをおさえるといいです



# 最後に

GCP は AWS と比べるとどうしても日本語の書籍などが少なく、勉強手段に困るかと思います

なんとなくクラウドを学びたくて、 AWS / GCP で悩んでいるならまずは AWS から勉強をすることをおすすめします
> 日本語書籍いっぱいだし、パブリッククラウドといえばやっぱり AWS が最初に上がるだろうしね!!
> GCP の説明をするときに AWS の同等サービスと比較しながら解説するドキュメントも多いから AWS から勉強した方が効率的と思う
アプリのデモ用gifを作る方法 (mac)

# はじめに
作ったスマホアプリ等のデモgif画像を作成するとき、いつも「画面録画どうやるんだっけ」となっていたのですが、シミュレータで動かしているなら、画面収録すれば良いだけだと最近気付きました。
ただ、画面収録の方法も良く忘れるので備忘録として残しておきます。


# 画面収録

macの場合`command + shift + 5`を押すと、画面収録の以下のような画面が出てきます。四角で囲った部分をクリックすると収録範囲を選択することができます。gifに変換する際にサイズを変換するので、この時のアスペクト比を覚えておくと良いです。
「収録」ボタンを押すと画面収録が開始されます。収録を停止する時は、メニューバーの「■」ボタンまたは、`command + control + esc`を押します。

デスクトップに収録した動画が保存されます。

![画面収録.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614264/dc7588cd-f0bf-8c82-ea61-d2bccb9e60b5.jpeg)


# gifへ変換

gifへの変換ツールはいろいろあると思いますが、自分は`ffmpeg`というソフトを使っています。
コマンドラインからサクッと変換でき、しかもhomebrewで一発で入ります。

```
$ brew install ffmpeg
```

ffmpefの詳しい使い方は、[こちら](https://qiita.com/cha84rakanal/items/e84fe4eb6fbe2ae13fd8 "それFFmpegで出来るよ！")の記事が参考になりました。
自分が変換時にいつも使っている設定は次になります。`-s`が画像のサイズ、`-r`はフレームレートの指定です。

```
$ ffmpeg -i 画面収録xx-xx-xx.mov -s 800x800 -r 10 demo.gif
```

# おまけ
qiitaでは直接gif画像の貼り付けができますが、githubのREADME.mdにで表示させるためには、どこかへ自分でアップロードし、そのリンクを貼り付ける必要があります。外部サービスを使っても良いですが、こう言うのは極力内部で完結したいです。と、言うことでgithub内で完結するいくつかの方法を紹介しておきます。

**issueを使う方法**
https://qiita.com/SLEAZOIDS/items/e6ebbc3aad53f2700492

**wikiを使う方法**
https://qiita.com/yamataku29/items/fb14fb99f5024e01b4b8

2番目の記事を見てて思いましたが、qiitaに解説記事を書いて、gifをアップロード済みならそのリンクがそのまま使えますね。(README.mdのためだけにqiitaにアップロードするのはやめましょう)

# 参考
Mac で画面を収録する方法 - https://support.apple.com/ja-jp/HT208721
Githubのwikiに画像やpdfをサクッとシンプルに貼り付ける方法 - https://qiita.com/SLEAZOIDS/items/e6ebbc3aad53f2700492
GithubのREADMEにGif画像を埋め込む - https://qiita.com/yamataku29/items/fb14fb99f5024e01b4b8
ターミナルからググる！

### 検索のためにブラウザ開くのがめんどい
1. トラックパッドでブラウザをフォーカスする
2. 検索バーをクリックする
3. キーボードに手を移す

なんてしていたら日が暮れてしまう！

ターミナルからshellでgoogle検索する

```sh
 function _search_on_oogle() {
   words="$(IFS="+"; echo "${${@:1}[*]}")"
   if [ "$words" != "" ]; then
     open "https://google.com/search?q=$words"
   fi
 }
 alias gg="_search_on_google"
```

上を.zshrcとかに書いておく


### こうできる！
```sh
$ gg go 技術書 おすすめ
```


### 他にも...

```sh
# google mapで検索
function _search_on_maps(){
  words="$(IFS="+"; echo "${${@:1}[*]}")"
  if [ "$words" != "" ]; then
    open "https://www.google.com/maps/search/$words"
  fi
}
alias map="_search_on_maps"
```

```sh
$ map 渋谷 焼肉 
```

などなど

楽しいターミナルライフを目指そう！

おすすめのshellスクリプトあったら教えてください!mm
Arch系のパッケージマネージャ Pacman の使い方

# はじめに

Raspberry Pi 4 に Manjaro を入れた。
初めてのArch系で、恥ずかしながら緊張しているよ。

```:確認環境
$ lsb_release -rd
Description:    Manjaro ARM Linux
Release:        20.09
```

# Pacman とは

Arch系ディストリビューションで採用されているパッケージマネージャおよびコマンド。

パッケージマネージャというのは、Debian や Ubuntu でいうところの apt, apt-get コマンドのこと。
または、RHEL や CentOS でいうところの dnf, yum コマンドのこと。

Arch Linux系である Manjaro では pacman コマンドを使用して各種ソフトウェアをインストールできるよ。

# Pacman の重要設定

Pacman の名の通り、pacman コマンド内で表示されるプログレスバーをパックマンにできるらしい。
最優先で設定変更するべきだ。

0. Pacman の設定ファイルを開く

    ```
$ sudo vim /etc/pacman.conf
```

0. オプションとして「ILoveCandy」を追加して保存

    ```
# Misc options
#UseSyslog
#Color
#TotalDownload
CheckSpace
#VerbosePkgLists
ILoveCandy <= この1行を追加！
```

以上！

# Pacman の使い方

apt と比較して書いていくよ。

## apt update

```
$ sudo pacman -Sy
```

`-Syy`と`y`を二つにすると、強制的にリモートの最新情報を取りに行く

## apt upgrade

```
$ sudo pacman -Syu
```

`-Syyu`と`y`を二つにすると、強制的にリモートの最新情報を取りに行く

## apt install

```
$ sudo pacman -S <package(s)>
```

## apt search

```
$ sudo pacman -Ss <package(s)>
```

# おわりに

新しい使い方をするたびに随時追加していこうと思う。
パット見で apt の purge や autoremove 相当のことをしようと思うと面倒なのかな？
Vue.jsでMaterial Iconsを使えるようにする

## 概要

Vue.jsでMaterial Iconsを使うときに毎回使い方を忘れるので、備忘も兼ねて利用方法をまとめました。

## ライブラリのインストール

まずはMaterial Icons用のライブラリをインストールします。

```
yarn add vue-material-design-icons
```

## コンポーネントとしてインポート

[Material Design Icons](https://materialdesignicons.com/)から利用したいアイコンを探してインポートします。
ファイル名はパスカルケースで宣言。

ex) `account-tie` -> `AccountTie.vue`

```ts:hoge.vue
import KabbadiIcon from 'vue-material-design-icons/Kabaddi.vue';

components: {
  KabbadiIcon,
},
```

## templateで利用

templateでコンポーネントとして宣言することで利用できます。
[公式リポジトリ](https://github.com/robcresswell/vue-material-design-icons)に使えるpropsの説明とかがあります。

```html:hoge.vue
<kabaddi-icon />
```

## 参考

- [公式リポジトリ](https://github.com/robcresswell/vue-material-design-icons)
- [アイコン一覧](https://materialdesignicons.com/)
今更聞けないJavaScriptのクラス

業務中にJavaScriptのクラスが出てきて、自分の中で咀嚼できていないな、と感じたのでメモがてらJavaScriptのクラスについて書いていこうかなと思います。

## 基本構文
```test.js
// class
class test {
  constructor(text) {
    this.text = text;
  }  
}

// classを使ってObjectを生成
let testObj = new test("test object");

// constructorで設定した値を表示してみる
console.log(testObj.text)
```
上記がclassの基本文法になります。
classとコメントが書かれたした5行がクラスになります。
classの中身には`constructor`というものが設定されています。
constructorというのはクラスがnewされたタイミングで実行され、引数をオブジェクトに保持させます。
今回だとtextにtest objectという値を保持させるようにしています。
そのためこちらのコードを実行すると、ログにtest objectと表示されます。

## メソッド
続いてクラスにメソッドを追加します。

```test.js
class test {
  constructor(text) {
    this.text = text;
  }
  // メソッド
  showText() {
    console.log(this.text);
  }
  // 静的メソッド
  static staticMethod() {
    console.log("static method")
  }
}

let testObj = new test("test obj")

// メソッドを実行する
testObj.showText()

// 静的メソッドを実行する
test.staticMethod()
```
classの中にメソッドを定義できます。
この時、functionという記述は不要です。
**オブジェクト名.メソッド名()**で実行できます。
また、staticをつけたメソッドは静的メソッドといい、**クラス名.メソッド名()**で実行ができます。

## その他機能
`getter, setter`　get/setをつけた関数をclass内で宣言することで使える。該当のメソッドを属性値にように呼べたりするので便利。
`extends` クラスはextendsを使えば継承することができる。宣言するクラス名の後ろで**extends 継承する親クラス**と書くことでできる。親クラスのメソッドや変数を子が使えるようになる。
`super` 親のコンストラクタを呼び出す時に使う。
`クラス式` クラス名を持たないクラスを作成できる。

```test.js
let test = class {
  constructor() {
    this.text = "text":
  }
}
console.log(test.text);
```

## 静的メソッドを使うタイミング
静的メソッドはオブジェクトを生成しなくても呼ぶことができます。
また、オブジェクトを生成してしまうと呼ぶことができません。
そのため、**静的メソッドはUtilなどの関数を作る**のに使われます。

## 個人的な所感
classはちゃんと使えるといい感じにコードがまとまりそう。
まだどんな時に使えばいいか（特にクラス式で匿名クラスを作るのはいつかなど）がしっかりとわかっていないので手を動かして覚えていきたい。
今回paiza.ioを使って動作を確認したが、とてもいいのでおすすめ。

## 参考文献
[クラス](http://www.tohoho-web.com/js/class.htm)
[JavaScript初心者にclassを伝える](https://qiita.com/JPNYKW/items/248f99c94c00c3d1aa27)
VB6　サンプルプログラム

備忘録としてVisualBasic6のサンプルプログラムを掲載します。

## フォルダー内にあるフォルダ名を取得する

``` VisualBasic
Private Sub Form_Load()
    ' FileSystemObject (FSO) の新しいインスタンスを生成する
    Dim cFso As FileSystemObject
    Set cFso = New FileSystemObject

    ' Folder オブジェクトを取得する
    Dim cFolder As Folder
    Set cFolder = cFso.GetFolder("C:\Users")
    Set subFolder = cFolder.SubFolders

    ' 不要になった時点で参照を解放する (Terminate イベントを早めに起こす)
    Set cFso = Nothing

    Dim stPrompt As String

    ' すべてのファイルを列挙する
    For Each subFolder In cFolder.SubFolders
        stPrompt = stPrompt & subFolder.Name & vbNewLine
    Next subFolder

    ' 不要になった時点で参照を解放する (Terminate イベントを早めに起こす)
    Set cFolder = Nothing

    ' 取得したすべてのファイルパスを表示する
    Call MsgBox(stPrompt)
    
End Sub
```
Vue.js~jestを使ってのテスト~

#はじめに
なかなかできなくてやっと簡単なテストならできたので
忘れないうちにメモ
間違いがあったらご指摘いただけると嬉しいです。

##テスト対象
```javascript
<template>
  <div>
    <p>{{num}}</p>
    <button class="increment__button" @click="increment">足す</button>
    <button class="decrement__button" @click="decrement">引く</button>
    <button class="reset__button" @click="reset">リセット</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      num: 0,
    };
  },
  methods: {
    increment() {
      return this.num++;
    },
    decrement() {
      if(this.num <= 0) return
      return this.num--;
    },
    reset() {
      return (this.num = 0);
    },
  },
};
</script>
```
ボタンをクリックで数字を足したり、引いたり
ただそれだけの物。

そしてこれをテストしてみる

##テストコード
```javascript
import Test1 from '../../src/components/test1'
import {mount} from '@vue/test-utils'

const wrapper = mount(Test1)
const vm = wrapper.vm
describe('test1', () => {
  it('初期値は0？', () => {
    expect(wrapper.html()).toContain('<p>0</p>')
  })
  it('buttonがあるか？', () => {
    expect(wrapper.contains('button')).toBe(true)
  })
})

describe('test2', () => {
  it('increment', () => {
    const button = wrapper.find('.increment__button')
    expect(vm.num).toBe(0)
    button.trigger('click')
    expect(vm.num).toBe(1)
    button.trigger('click')
    expect(vm.num).toBe(2)
  })
  it('decrement', () => {
    vm.num = 1
    const button = wrapper.find('.decrement__button')
    button.trigger('click')
    expect(vm.num).toBe(0)
    button.trigger('click')
    expect(vm.num).toBe(0)
  })
  it('reset', () => {
    vm.num = 5
    const button = wrapper.find('.reset__button')
    expect(vm.num).toBe(5)
    button.trigger('click')
    expect(vm.num).toBe(0)
  })
})
```
まず始めにテスト対象のコンポーネントを``mount()``の引数に入れて
それを``wrapper``として色々するみたい

###コンポーネントから取得
```javascript
const button = wrapper.find('.increment__button')
```
これは``Test1``コンポーネント内の``class="increment__button"``を取得
JavaScriptの``document.getElementById()``みたいな感じ？
そして今回のだと``click``イベントが各ボタンにあるので、それを``trigger()``を使う事で実行できる

```javascript
button.trigger('click')
```

####dataの取得

```javascript
wrapper.vm.num//0
wrapper.vm.num = 10
wrapper.vm.num//10
```
これでコンポーネントの``data``の``num``の値を取得
代入もできる

以上を踏まえてもう一度確認

```javascript
const button = wrapper.find('.increment__button')
    expect(vm.num).toBe(0)
    button.trigger('click')
    expect(vm.num).toBe(1)
    button.trigger('click')
    expect(vm.num).toBe(2)
```
最初の結果はなにもしてないので``(0)``
次に``click``イベントが実行されるのでインクリメントされた結果が``(1)``
となる。
残り二つのボタンもやってることはほぼ同じ
今わかってるのはここまで。

Vuex使用時とかのテストをできなきゃなぁ。。。
【Vue.js】Firebase独自のメソッドをまとめてみよう


#firebaseモジュールのセットアップ

```
$ yarn add firebase --save
```

```javascript:main.js
import firebase from "firebase";

const config = {
  apiKey: "",
  authDomain: "",
  databaseURL: "",
  projectId: "",
  storageBucket: "",
  messagingSenderId: ""
};
firebase.initializeApp(config);
```

#コンポーネントでの準備

```javascript:router/index.js
import signup from "@/components/signup";

export default new Router({
  routes: [
    {
      path: "/signup",
      component: signup
    },
  ]
})
```

```javascript:components/signup.vue
# コンポーネント毎に、モジュール読み込み
import firebase from "firebase";
```


#Usage ユーザー作成、認証系


サインアップ

```javascript:
signUp: function() {
  firebase
    .auth()
    .createUserWithEmailAndPassword(this.email, this.password)
    .then(user => {
      alert(user.email);
    })
    .catch(error => {
      alert(error.message);
    });
}
```

サインイン

```javascript:
signIn: function() {
  firebase
    .auth()
    .signInWithEmailAndPassword(this.email, this.password)
    .then(user => {
      alert("success");
      this.$router.push("/profile");
    })
    .catch(error => {
      alert(error.message);
    });
}
```


ログイン中ユーザーのデータ取得

```javascript:
data () {
  return {
    email: firebase.auth().currentUser.email
  }
}
```

ユーザーがログイン中なら、ユーザー情報を返すメソッド(ログインチェック)

```javascript:
firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    //ユーザーログイン時の処理
  } else {
    //ユーザーログアウト時の処理
  }
})
```


#Usage クラウドデータベース


firestoreの全件データを取得

```javascript:
firebase.firestore().collection("message").get()
  .then(function(query) {
    query.forEach(function(doc) {
      console.log(doc.data());
    });
  }).catch(function(e) {
    alert(e);
  });
```

firestoreの全件データの中から、条件を絞って取得

```javascript:
firebase.firestore().collection("message").where("name", "==", "tom").get()
  .then(function(query) {
    query.forEach(function(doc) {
      console.log(doc.data());
    });
  }).catch(function(e) {
    alert(e);
  });
```


firestoreにデータを追加

```javascript:
firebase.firestore().collection("message").add({
  name: this.nameData
})
  .then(function() {
    alert("成功しました");
  }).catch(function(e) {
    alert("失敗しました");
  });
```


firestoreのデータを削除

```javascript:
firebase.firestore().collection("message").doc("directMessage").delete(
  .then(function() {
    alert("成功しました");
  }).catch(function(e) {
    alert("失敗しました");
  });
```
mac > 文字コード変換 > nkf



## インストール

```
brew install nkf
```


## 文字コード調査

```
nkf -g hoge.txt
```

結果は以下のように表示されます
`UTF-8`



## 変換

### sjisへ変換


上書き

```:上書き
nkf -s --overwrite hoge.txt
```

名前を変えて変換

```:名前を変えて変換
nkf -s hoge.txt > pekehoge.txt
```


変換結果を確認

```
nkf -g hoge.txt
Shift_JIS
```

### utf-8へ変換

```:上書き
nkf -w --overwrite hoge.txt
```

```:名前を変えて変換
nkf -w hoge.txt > pekehoge.txt
```

変換結果を確認

```
nkf -g hoge.txt
UTF-8
```


# 参考

[Network Kanji Filter - Wikipedia](https://ja.wikipedia.org/wiki/Network_Kanji_Filter)

公式サイト	[nkf Network Kanji Filter Project Top Page - OSDN](https://osdn.net/projects/nkf/)

[【 nkf 】コマンド――文字コードと改行コードを変換する：Linux基本コマンドTips（51） - ＠IT](https://www.atmarkit.co.jp/ait/articles/1609/29/news016.html)
CentOS8.1 + Emacs26.1 + WSL2 with Ubuntu20.04 + VcXsrv で開発

## 複数の端末で開発環境を共通したい

- 家にはWindowsデスクトップ＋ラップトップ、MacBookPro, Linuxなんかがある
- 地味に細かい設定が異なるのが面倒
- 外部VPSサービスに開発環境を作ればいいじゃない

## WSL2のセットアップ

- いろんな人がやってるので割愛
- Windowsファイアウォールは切った。
- $DISPLAYの設定を入れた。↓ MicrosoftのWebサイトから引用

```bash

 export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk　'{print $2; exit;}'):0.0
```

## VcXsrvのセットアップ
- 参考サイトの通り 起動パラメタに `-ac` を付けた

## CentOS8のセットアップ
- `xorg-x11-xauth.x86_64` を入れる
- `Emacs` を入れる
- `日本語環境(ibus-mozc)を入れる`

```bash
$ sudo dnf install xorg-x11-xauth.x86_64 emacs 
```

- その他必要なのも、、、git, screen, zsh など

## Emacsが起動してもなんかおかしい！
- ここでドハマリ。 結論から言うと `init.el` に以下を追加する

```
(modify-frame-parameters nil '((inhibit-double-buffering . t)))
``` 

## 参考サイト
https://qiita.com/ryoi084/items/0dff11134592d0bb895c
PytorchのDatasetを層状にfoldingする

既存の`Dataset`をN-foldするときに、先頭から順に1,2,...N,1,2,...,N,1,2,...,N,1,2,...とデータセットを分割する。時系列データを分割するときに、特定の月や季節にデータが偏らないようにするときに使用する。

```python
from torch.utils.data import Dataset


class LayeredFoldWrapper(Dataset):
    def __init__(self, dataset, n_splits=5, fold=0, valid=False):
        self.dataset = dataset
        self.n_splits = n_splits
        self.fold = fold
        self.valid = valid
        self.valid_index = list(self._valid_index(len(dataset), n_splits, fold))
        self.train_index = list(set(range(len(dataset))) - set(self.valid_index))

    def __len__(self):
        return len(self._get_index_list(self.valid))

    def __getitem__(self, i):
        return self.dataset.__getitem__(self._get_index_list(self.valid)[i])

    def _valid_index(self, N, n_splits, fold):
        """
        N: 全データの数
        n_splits: foldのスプリットの数
        fold: 各foldを指定する値 0<=fold<=n_splits-1
        """
        assert(0<=fold<=n_splits-1)
        return range(n_splits - fold - 1, N+1, n_splits)

    def _get_index_list(self, valid):
        if valid:
            return self.valid_index
        else:
            return self.train_index
```
Spring boot 初期設定方法　gradleの実行まで

Spring bootの初期設定手順(eclipse)

1)プロジェクトを作成

以下の意味
●MyBatis　FrameWork
⇒オブジェクトとリレーショナルデータベースに関する処理をMapper(O/Rマッパー)で対照させる

●MySQL Driver
⇒MySQL に対応する JDBC ドライバ。MySQL Connectorを使用する。

●Spring Data JPA
⇒Spring FrameworkでJPAを利用してデータベースアクセスを行う「Spring Data JPA」というライブラリ。
「Spring Data」と呼ばれるデータベースアクセス関連ライブラリの一つです。
そもそも、JPAとは？
⇒「persistence.xml」と呼ばれるXML形式のファイルを用いて、データベースとの接続情報などの基本設定を行う。

●Spring Web
⇒Spring Web MVCモデルのこと
モデル（Model）「M」、ビュー（View）「V」、コントローラー（Controller）「C」で「MVC」

●Thymeleaf
⇒テンプレートエンジン
「Spring Boot」ではJSPではなく「Thymeleaf」を使う。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738783/1ec683b7-62c6-ea55-266c-f45ec47e5678.png)


2)bootRun タスク実行時の Spring プロファイルを設定

jvmArgs = ['-Dspring.profiles.active=foobar']

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738783/457b6b5d-1a33-c182-479f-bfd4b96ce258.png)


3)gradleを実行する
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738783/44dbfd40-9a30-7b18-0a25-824d002b8073.png)
入社3年目のSIerが読んだ本でタメになった本をまとめてみた。

##はじめに
SIer系の会社に入社して、3年が経ちこれまでに読んでタメになった本をまとめてみました。

##プログラム系

###JAVA
- スッキリ分かるJAVA入門

- スッキリ分かるJAVA入門　実践編

- スッキリ分かるJAVA入門　サーブレット&JSP入門

###C
- 新・明解C言語ポインタ完全攻略

###C++
- 新・明解C++入門

###C# 

- 現場ですぐに使える! Visual C# 2017逆引き大全 555の極意

###その他

- リーダブルコード

- プリンシプルプログラミング

##セキュリティ系

-システムはなぜダウンするのか

-セキュリティ技術の教科書

-暗号技術入門


##ネットワーク系

-基礎からわかるTCP/IPネットワークコンピューティング入門

-ネットワークがよくわかる教科書

##その他

-カイゼンジャーニー

-UNIXという考え方

-レガシーコードからの脱却

-知識ゼロから学ぶソフトウェアテスト

##おわりに
読んでも内容を忘れてしまうことも多いので、
定期的に読み直して学習を続けないといけないですね。
local環境でReactをhttpsで立てる(WSL)

# はじめに
wslのlocal環境でreactをhttpsで立てる際、少し特殊な設定が必要だったので備忘録として作業手順を残しておきます。

# SSL証明書の発行まで
こちらの記事を参考に作業を進めます。(ルート証明書のインストールまで)
https://qiita.com/recordare/items/d51f50dc634187e20538

# httpsでReactを立ち上げる
`mkcert -CAROOT`に移動し、`mkcert localhost`を実行する

次にReactのプロジェクトディレクトリに移動して、以下のコマンドを実行
`HTTPS=true SSL_CRT_FILE=$(mkcert -CAROOT)/localhost.pem SSL_KEY_FILE=$(mkcert -CAROOT)/localhost-key.pem npm start`

(公式: https://create-react-app.dev/docs/using-https-in-development/)

これで警告なくhttpsでlocalhost:3000にアクセスできる！！
pandasメモ

#pandas自分用メモ

```.py
import pandas as pd
import numpy as np

#csvをインポート、sampleはheaderがない場合
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")
sample = pd.read_csv("sample.csv",header=None)

#trainの行数、列数を調べる
train.shape

#trainの基本統計量
train.describe()

#trainの型を調べる
train.info()

#trainの平均値
train["y"].mean()

#trainの中央値
train["y"].median()

#trainのyの値が１００以上のものを抽出
train[train["y"]>100]

#trainのfruitの値が”リンゴ”のものを抽出
train[train["fruit"]=="リンゴ"]

#fruitが”リンゴ”で、yを昇順にソートして表示する
train[train["fruit"]=="リンゴ"].sort_values(by="y")

#fruitが"リンゴ"で、yを降順にソートして表示する
train[train["fruit"]=="リンゴ"].sort_values(by="y",ascending=False)

#fruitが"リンゴ”のときのyの値の平均値を出す
train[train["fruit"]=="リンゴ"]["y"].mean()

#temperatureが平均以上のデータを出す
train[train["temperature"]>train["temperature"].mean()]

#y,fruit,temperatureなど、２つ以上のデータを抽出する"
train[["y","fruit","temperature"]]
```
引数の渡し方

今日は`laravel`において`view`ファイルへの引数の渡し方について記録していくよ～

```TestController.php

  public function test(){
   $data1 = 1;
　 $data2 = 2;

   return view('test_view' , ['data1' => $data1 , 'data2' => $data2 ]);
}//1 2
```
`compact`関数を使って同じ出力になる書き方：

```TestController.php

  public function test(){
   $data1 = 1;
　 $data2 = 2;

   return view('test_view' , compact('data1' , 'data2'));
}//1 2
```
以上だよお～
[Linux] もっと早く知りたかったショートカットキー

※この記事はプログラミング初心者に向けて書いております。
#:running:　はじめに
**ショートカットキー**って便利ですよね。みなさんもショートカットキーをよく使われていると思います。
通常５秒かかる動作をショートカットキーを使うと１秒で済むなんてこともありますよね。
ほんの数秒の短縮だとしても、今後コードを書いていくことを考えると**膨大な時間の節約に繋がります。**
覚えるのは面倒くさいですが、初心者のうちにサクッと覚えてしまって、作業効率を上げていきましょう。
個人的にもっと早く知りたかったLinuxコマンドのショートカットを７つ選びました。
shellはbashです。


# １.&emsp; 「カーソルを行頭に」&emsp;  control + a
※｜←カーソルだと思ってください

```
$aaaaaa|
```
これが

```
$|aaaaaa
```

なんでプログラミングスクールで一番最初に教えてくれなかったのか謎。
矢印キーから卒業しましょう。

# 2.&emsp; 「カーソルを行末に」&emsp;  control + e 
```
$|aaaaaa
```
これが

```
$aaaaaa|
```
長いコマンドでイライラすることが減るでしょう。

# 3.&emsp; 「カーソルから行頭まで削除」&emsp;  control + u

```
$123|45678
```
これが

```
$45678
```
行末から使えば全て削除できますね。

# 4.&emsp; 「カーソルから行末まで削除」&emsp;  control + k

```
$123|45678
```
これが

```
$123
```
便利ですね。

# 5.&emsp; 「補完機能」&emsp;  tab

```
$やら
```
これが

```
$やられたらやり返す。倍返しだ！
```

例えとしてどうなのか疑問ですがこんなイメージだと思ってます。


# ６.&emsp; 「一つ前（後）のコマンド履歴を表示」&emsp;  矢印↑or 矢印↓

さっき使ったコマンドをまた使いたい！
そんな時に便利です。

# ７.&emsp; 「履歴を検索」&emsp;  control + r

 ```
(reverse-i-search)`': 
```
:の後に検索したい文字を打ちます。



#:speech_balloon:　最後に
以上7個のショートカットキーを紹介しました。他にも便利なショートカットがあるみたいなので、より効率を求める人は調べてみるといいかもしれませんね。
Rails6 Couldn't find User with 'id' = sign_outとなりログアウトができない

#エラー内容
![スクリーンショット 2020-09-22 13.02.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650686/785d571b-645a-8518-27d6-894a5111d05a.png)

##参考記事
https://qiita.com/chisaki0606/items/f1f03a6c226e49b5f7b3

##ログアウトができない
今までできていたはずのログアウトが突如できなくなる事態が発生してしまう。このエラーで１日を費やしてしまったので、同じようなエラーとなっている人の助けになったらと思い、本稿を投稿することにした。

##解決方法
参考記事の通りに

```config/initializers/devise.rb
config.sign_out_via = :delete
```
を下記のように変更する。

```config/initializers/devise.rb
config.sign_out_via = :get
```
しかし、このまま再びログアウトしてもエラーは解決しない。
というのも、devise.rbのコードは再起動しなければ反映されないため、そのままではエラーのままとなる。
そのため、

```
$ rails s 
```
として、```localhost:3000```に再びアクセスする必要がある。
そうしてあげると、エラーから脱出することができ、正常にログアウトすることができる。

###終わりに
最後の再起動が重要であり、私はこれをしていないため、沼にハマることになってしまいました。同じようなエラーが悩んでいる方々の助けになれば幸いです。
また、記述に誤りがあるようでしたら、是非ご指摘いただけると幸いです。
Ruby on Railsでグラフを表示する方法（LazyHighChart)

まだまだプログラミングを学び始めたばかりなので拙い記事になってしまうかもしれませんが自分への備忘録＆練習としてこういう記事を書いてきたいなと思います。よろしくおねがいします。

#LazyHighChartとは
簡単に言うとグラフを表示するgemです。
HighChartsというJavaScript製グラフライブラリをRubyで使えるようにしたよって感じのgemみたい
早めに書いておきますがグラフ自体の表示方法を変えたりするのはまだよくわかっていないので今回は実装までしか書きません。

#Gemの導入

```
gem 'lazy_high_charts'
```

まずはGemfileにこれを書いてあげてbundle install

これに加えてapplication.jsに

```
//= require highcharts/highcharts
//= require highcharts/highcharts-more
//= require highcharts/highstock
```

と加えてあげましょう。
これで準備はできました。

#Viewでグラフを表示する

まずView側の記述です。


```
<%= high_chart('my-first-chart', @chart) %>
```

この記述をしたところにグラフが描画されます。

#Controller側の設定

ここでグラフの種類を決めたり（棒グラフ、円グラフ、折れ線グラフなど）を決めていくわけですがまだ先述にもある通り細かいところがわかってないのでとりあえず私が実装させた記述を書きます。

```
  def create
    @post = Post.new(post_params)

    if @post.save
-----------------------------------------------------#グラフを表示するための記述
    @chart = LazyHighCharts::HighChart.new('graph') do |f|
      f.title(text: @post.select.name)
      f.xAxis(categories: ["Soldier", "Wizard", "Monk", "Fighter", "Gunner"])
      f.series(name: "", yAxis: 1, data: [@post.vs_soldier_id,@post.vs_wizard_id,@post.vs_monk_id,@post.vs_fighter_id,@post.vs_gunner_id])
      f.yAxis [
        {title: {text: "", margin: 0} },
        {title: {text: ""}, opposite: true},
      ]
      f.legend(align: 'none')
      f.chart({defaultSeriesType: "column"})
    end
-------------------------------------------------------------------------

    else
      render "new"
    end
  end
```

newアクションからストロングパラメーターで取得した値をcreateアクションで表示した時の記述です。

今回のは棒グラフが表示されます。
f.yAxis
f.legend
f.series
この3つは今回の実装でいらなかったんでよくわかってないです（すいません）

f.title
書いてあるとおり、ここに入れた値がグラフのタイトルになります。

f.xAxis
グラフの横軸の値です。今回はここは決まっていたんで文字列を入れてますね。

そしてf.seriesのなかにある
data: []
ここにデータを入れていきます。（ここに値を入れるために変数をあれこれしたんですが初心者にはここが辛かった…）

f.chart({defaultSeriesType: "column"})
ここの"column"がグラフの種類になるみたいですね。

以上です。

まだまだわかってないことがたくさんあってガバガバな記事なってしまいましたが少しずついいものが書けるよう頑張っていきたいです。では〜
AWS EC2 起動テンプレートのユーザーデータを使用して Pytorch用 jupyter notebook の自動起動設定をする

# はじめに
EC2の起動テンプレートにスクリプトを書いておくと、インスタンス作成時に自動的にスクリプトが実行されます。`Deep Learning AMI (Ubuntu 18.04) Version 34.0 - ami-0302aadfa73a0d917`を使用し、ディープラーニングが実行できるjupyter notebookを自動で起動する設定をします。

# 手順
起動テンプレート設定画面を開きます。

![スクリーンショット 2020-09-23 22.12.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/7136a90b-0a8e-4cfb-a5b4-9796a3af9c19.png)

`起動テンプレートを作成`を選択。`高度な詳細`を開く。

![スクリーンショット 2020-09-23 22.13.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/4e57666d-007f-7041-38c9-71464d5ec18d.png)

`ユーザーデータ`に下記のスクリプトを貼り付け。

![スクリーンショット 2020-09-23 22.13.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/82d931a8-f2b8-f52f-5792-6f849e10970b.png)


```bash
#!/bin/bash

# write conf
cat << EOF > /home/ubuntu/.jupyter/jupyter_notebook_config.py
c = get_config()
c.NotebookApp.ip = '0.0.0.0'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8080
c.NotebookApp.token = ''
EOF

chown ubuntu:ubuntu /home/ubuntu/.jupyter/jupyter_notebook_config.py

# set auto start
echo "/home/ubuntu/anaconda3/envs/pytorch_p36/bin/jupyter-notebook" > /home/ubuntu/start_jupyter.sh
chmod 755 /home/ubuntu/start_jupyter.sh
chown ubuntu:ubuntu /home/ubuntu/start_jupyter.sh

bash -c 'cat > /etc/rc.local' << EOF
#!/bin/sh

# DLAMI Configurations
/opt/dlami/start/dlami_start
# jupyter
su - ubuntu /home/ubuntu/start_jupyter.sh &
exit 0
EOF

# reboot
shutdown -r now
```
設定の意味は[Jupyter事始め](https://qiita.com/taka4sato/items/2c3397ff34c440044978)を読めば分かると思います。

ユーザーデータの実行ログは`/var/log/cloud-init-output.log`に出力されます。

`Deep Learning AMI (Ubuntu 18.04) Version 34.0 - ami-0302aadfa73a0d917`を前提にしているので、AMIを変えてOSやanaconda環境が変わると修正が必要になります。
M5stickVでソーシャルディスタンスを可視化する

先日[M5stackハッカソン](https://mashupawards.connpass.com/event/188452/)に参加したのでその時に製作したプロトタイプを紹介したいと思います。
今回のハッカソンはm5stackハッカソンということで、以前購入して引き出しに閉まってあった[M5stackBasic](https://www.switch-science.com/catalog/3647/)で参戦、参加にあたり[M5stickV](https://www.switch-science.com/catalog/5700/)を追加で購入しました。

#ソーシャルディスタンス
ハッカソン当日、M5stickVで何ができるかと模索していた時に公式サイトのクイックスタートにFace detectという項目を発見。顔の位置やサイズを取得できることがわかったので、Face detectを使用して顔のサイズを取得し近いか遠いかを判断してm5stackBasicの画面表示物を替える「ソーシャルディスタンス」というものを制作しました。


#完成品はこちら



##参考記事

顔の検出方法はこちらに書いてあります。
https://qiita.com/Toshiki0324/items/ef3edbdee2aeabc39433

##顔のサイズで変わる顔

M5stickVのFaceDetectを利用して顔の大きさを取得しています。
FaceDetectで取得した配列の5番目の値と100という大きさを比較しています。
取得できる値は[公式サイト](https://docs.m5stack.com/#/en/quick_start/unitv/v_function)に記載されています
[![Image from Gyazo](https://i.gyazo.com/b010d1e8c12c5f335eab49079b169d9f.png)](https://gyazo.com/b010d1e8c12c5f335eab49079b169d9f)

[![Image from Gyazo](https://i.gyazo.com/6fbe044e70be9514b96f0444daf88457.png)](https://gyazo.com/6fbe044e70be9514b96f0444daf88457)

###顔が小さい時(離れていると仮定)
顔が小さい時は距離が遠いと仮定しているのでソーシャルディスタンスが保てているのでにこにこマークです。
![IMG_1302.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206019/d98eab9f-1b76-3bbd-e661-0dd12db51138.jpeg)

###顔が大きい時(距離が近いと仮定)

顔が大きい時は距離が近いのでソーシャルディスタンスが保ってていないと怒っています。
![IMG_1309.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206019/1bba72eb-0758-9678-d580-4397f08b4b7b.jpeg)


#uiFLOW
uiFLOWは以下のような形で作りました。
[![Image from Gyazo](https://i.gyazo.com/6e3f768d66af199e9ecb35074f23ab28.png)](https://gyazo.com/6e3f768d66af199e9ecb35074f23ab28)

#発展

M5stickVは今回利用した[V-function](https://docs.m5stack.com/#/en/quick_start/unitv/v_function)の他にも[V-Training](https://docs.m5stack.com/#/en/related_documents/v-training)
といった方法もあり、あらかじめ登録したものを判別することができます。記事を書いていますので参考までにどうぞ
>[ペペロンチーノか、ペペロンチーノ以外か]
(https://qiita.com/Toshiki0324/items/59f6e98293d6e2dd945c)

似たようなものを判別するのは大変ですが、4000円ぐらいでここまでできるなんてすごい。製造業では部品の有無のポカヨケや、員数管理でも使えそう、カメラ内の物の動きも検知できるので防犯カメラもできそう。
アプリ開発でSwagger定義があるならPrismを使おう

スマホアプリの開発でバックエンドの人がSwagger定義（Open API Specともいう）を使ってくれてたらPrism使ったら良いよ、というお話。

# Prismとは
https://stoplight.io/open-source/prism/

- Stoplightという会社が作っている。APIの開発をスムーズに進めていくためのツールを色々提供している。
- Prismはそのツールのうちの1つで、いわゆるモックサーバー。OSSとして提供されている。
- 別のサービスだと本家のSwagger UIもレスポンスをモックすることができるし、API Sproutなんかもある。

# インストール＆使い方
```
$ npm install -g @stoplight/prism-cli
$ prism mock swagger.yaml
```
これだけ。簡単。デフォルトで`127.0.0.1:4010`のポートを使い、読み込んでいたswagger定義ファイルを更新すると自動でリロードもしてくれる。（これがSwagger UIのモックサーバには無い）

# レスポンスのカスタマイズ
応答をさせたいSwagger定義に`example`を書くとそれを下にレスポンスを返してくれる。
わからなくなったら本家のDocを読むべし。
https://swagger.io/docs/specification/adding-examples/

## 方法1: 個別に`example`を設定
```yaml
(略)
components:
  schemas:
    Pet:
      allOf:
        - $ref: '#/components/schemas/NewPet'
        - type: object
          required:
          - id
          properties:
            id:
              type: integer
              format: int64
              example: 123  # <-- これ

    NewPet:
      type: object
      required:
        - name
      properties:
        name:
          type: string
          example: foo  # <-- これ
        tag:
          type: string
          example: bar  # <-- これ
```

## 方法2: まとめて`example`を設定
```yaml
(略)
components:
  schemas:
    Pet:
      example:  # <-- これ
        id: 999
        name: hoge
        tag: moge
      allOf:
        - $ref: '#/components/schemas/NewPet'
        - type: object
          required:
          - id
          properties:
            id:
              type: integer
              format: int64

    NewPet:
      type: object
      required:
        - name
      properties:
        name:
          type: string
        tag:
          type: string
```

## 注意点
### 方法1、2両方設定するとどうなる？
Prismの場合は方法2の定義が優先されます。

### レスポンスの定義に違反するexampleの値はエラーになる？
Prismの場合はエラーになりません。気をつけましょう。

# 余談
最初はAPI Sproutを使おうとしていたところ、`$ref`を使っている定義を上手くハンドリングできないバグがあるようで、Githubのissueが1年以上放置されているので諦めました。
https://github.com/danielgtaylor/apisprout/issues/40


以上、誰かの役に立てば幸いです。
【ReactNative × Redux】本格的なTodoリストを作成しました

ReactNativeとReduxの勉強のアウトプットとして多機能なTodoリストを作成しました。
ReactNativeとReduxの組み合わせの資料は意外に少なく、うまく動作しないものが多かった印象です。そのため、ReactとReduxの少し古めの記事をReactNativeに置き換えてなんとか頑張ってみました。
そもそもJavaScriptなどの基礎知識が曖昧だったということもあってクオリティは低いかと思います。
制作期間はReactNativeに触れてからちょうど1週間です。（Reactを少しだけ勉強してたくらいです）

ソースコードはこちらになります。
https://github.com/s-amano/react-native-todo-list

#要件、機能、使用した技術など

- TODOのデータ型
 - id // 識別するための番号
 - completed // チェックしているかどうか
 - title // TODOのタイトル
 - description // TODOの詳細
 - createdAt // 作成日時

- 使用した技術
 - ReactNative
 - Redux

- 要件
 - 追加ができる
 - 編集ができる
 - 削除ができる
 - 作成日時のソート(昇順・降順)ができる
 - リアルタイム検索ができる
 - Doneチェックがつけられる（toggle機能）
 - Doneのチェックがついたもののみ表示できる
 - React Navigationを使った画面遷移
 - データの永続化

#実際に作ったアプリ
<img width="300" alt="スクショ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417968/6bf1eaaf-42c1-9662-2ef4-ac4724cc9fc8.png">
操作や機能の補足としては、
ナビゲーションの勉強のためtodoの追加は別ページにしており、
Todoの詳細ページ→編集ページの遷移ができます。
また、検索は1文字ごとに検索してくれます。



#詰まった部分、大変だった部分
正直なんども詰まりました。web上に情報があんまなかったので（削除機能でさえなかった）、逆に自分の頭の中で実装方法を考えて手を動かしてトライアンドエラーを繰り返すといういい経験になりました。
その中でも概念的に詰まった部分、エラーで詰まった部分をまとめてみたいと思います。

- 謎すぎるバグ→正体これでした→https://qiita.com/tenshinhan_yamucha/items/6923c78fb53024c71a8b

- stateとはViewに表示されているデータやUIの状態などのアプリケーションが保持している情報のこと
　→ソートの条件や実際のtodoなど
- 全体のデータフローとしては、ActionをStoreへdispatch（送信）すると、Storeのstateが変更されるという感じ
- Actionはアクション（何が起きたのか）とそれに付随する情報を持つオブジェクト
- store内ではactionをreducerが受け取りstoreに対して新たなstateオブジェクトを作成

また、

- Reducerに働いてもらうためには、ActionをStoreにDispatchする。
- Stateを取得するには、StoreからgetStateする。
 - React側でReduxを使ったり、stateの情報を取ってくるのには、上記2つが必要で、それをcomponent側（reactのview側）で意識せずに使いたいので、containerで、以下を定義し、reactとreduxをconnectする
  - mapStateToPropsは、Store.getState()のような役割をして、ComponentのpropsにStateの中身を詰め込んでくれる
  - mapDispatchToPropsは、ActionCreatorをラップした、actionをStoreにDispatchしてくれる関数をpropsに詰め込んでくれる
- 上記をcontainerで定義すれば、componentでpropsとして受け取り描画したり、関数を直接使えるのでリファクタリングしやすいし可読性が高まる


#アプリの課題、追加でやりたいこと

上記で一応アプリの紹介は終わりですが、「もしこの先も勉強のためにこのアプリの作成を続けるとしたらなにをするのか＝このアプリの課題」について箇条書きで述べたいと思います。

- テスト導入
- Typescriptで書いてみたい
- redux-thunkなどによる非同期処理→前に作ったDjangoのAPIを使ってもいいかも
- フォームにバリデーションをつけたい→propTypesというものでできそう。
汎用ポインタとは

①汎用ポインタとは

汎用ポインタとはvoid*型のことを表します

汎用ポインタに対してはどの型のポインタ変数でも代入することが可能です

 

②汎用ポインタを使用するメリット

どの型のポインタ変数でも代入することが可能なため、関数の仮引数に汎用ポインタを使用することで引数にどの型の取りうるか分からない際に対応できるようになります
C#でExcelブックの「名前」を全消去する

# 動機

古ーいExcelファイルをコピーしてつかっていると、ときどき出る<b>[コレ](https://www.google.co.jp/search?q=excel+%E5%90%8D%E5%89%8D+%E3%82%B3%E3%83%94%E3%83%BC+%E3%81%86%E3%81%96%E3%81%84)</b>がうざすぎて、C#アプリからExcelブックの「名前」を削除するソフトをつくってみた。

# 手動で消す場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/8d4b1288-a65c-1eeb-039d-8393b302c673.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/79a8a4ab-936d-bf8f-f915-4254805b2a98.png)

全選択ができず、1つずつ消す羽目になる。数が多いとストレスがえぐい・・

ほんとMS Officeってクソ・・・


# 注意事項

むやみに「名前」を消すと、数式やマクロが動作しなくなるおそれがあります。
そのエクセル自体で使用していなくても、ほかのツールがそのエクセルファイル内の「名前」の使用を前提にしたシステムになっている場合もありえます。

# ソースコード

```csharp

using System;
using System.Drawing;
using System.Runtime.CompilerServices; // to use [MethodImpl(MethodImplOptions.NoInlining)]
using System.Runtime.InteropServices;
//using System.Text.RegularExpressions;
using System.Windows.Forms;

using Excel = Microsoft.Office.Interop.Excel;
//using Microsoft.Office.Core;

class ExcelNameRemover : Form
{
    Button btnStartTryGet;


    [MethodImpl(MethodImplOptions.NoInlining)]
    void TryGetActiveBook()
    {
        try {
            var oExcelApp = (Excel.Application)Marshal.GetActiveObject("Excel.Application");
            
            if (oExcelApp == null) {return;}

            dynamic book;
            book = oExcelApp.ActiveWorkbook;

            var res = MessageBox.Show("Are you sure to delete all names in the excel: \"" + book.Name+"\"", "Confirmation", MessageBoxButtons.OKCancel );
            if (res == DialogResult.OK ) {
                dynamic names = book.Names;
                int count=0;
                foreach(dynamic name in names){
                    name.Delete();
                    count++;
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                }
                Console.WriteLine(count.ToString() + " names are deleted.");
            }
        }
        catch(Exception e) {
            if (e is Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ||
                e is COMException ) {
                
                Console.WriteLine(e);
                // もみ消す
                return;
            }
            throw e;
        }
        finally {
        }
    }


    ExcelNameRemover()
    {
        Controls.Add(btnStartTryGet = new Button(){
            Text = "Remove all names",
            Location = new Point(0, 0),
            Width = 200
        });
        btnStartTryGet.Click += (s,e)=>{
            TryGetActiveBook();
            GC.Collect();
            GC.WaitForPendingFinalizers();
        };
    }

    [STAThread]
    static void Main(string[] args)
    {
        //DumpTextOfActiveSheet();
        Application.Run(new ExcelNameRemover());
    }
}
```

# コンパイル方法

※dllのパスは環境に依存すると思います。

```compile.bat

csc ^
 /r:C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll ^
 /r:C:\Windows\assembly\GAC_MSIL\office\15.0.0.0__71e9bce111e9429c\Office.dll ^
 %*
```

`compile.bat ファイル名.cs`
でコンパイルできます。
ラズパイで今後やりたいことをメモしていく

##この記事は

勉強と興味のためにRaspberryPi 3を買ったはいいが、やってみたいことだらけなのに触る時間がなくやりたいことがどんどん増えていく。
ので、このページに備忘録としてまとめていく。
そういう記事。


##やりたいこと

###IoT関係

- 自室の4箇所+窓の外の1箇所に温度センサー(温湿度？)を設置し、一定時間ごとに温度を計測してログをためこむ。最終的にspreadsheetやwebブラウザなどでグラフ化して表示する

参考
[Raspberry Piのセンサーで検出したデータをPythonでテキストログに出力させる - Qiita](https://qiita.com/Brutus/items/d9b06b76dd9bf2c23d1a)
[CO2センサを部屋につけてログを取る - Qiita](https://qiita.com/sgrk/items/366beb3d08f792097f46)
[ログローテーションの設定方法 - Qiita](https://qiita.com/mk34/items/d55e08a5c657e2e022ee)
[Raspberry Pi(ラズパイ)で温度測定してログを取ってみる - ＷＩＣの中から](https://temcee.hatenablog.com/entry/thermo)

- 赤外線LEDとリモコン受信つきの照明を使って、部屋の照明を音声認識やtwitterからの指示でONOFFできるようにする。

参考
[Raspberry Pi Zero で赤外線リモコンを作る - Qiita](https://qiita.com/ww24/items/32d2a78c20e6dcc2e68c)
[Raspberry Pi3で赤外線リモコンを作る - なになれ](https://hi1280.hatenablog.com/entry/2017/10/16/202254)
[ラズパイとTwitter（ツイッター）を連携 - Raspberry Π](http://rasp0035.hatenablog.com/entry/2017/05/24/100000)
[Raspberry PiからTwitterへ情報発信！(1) Twitter API編 | Device Plus - デバプラ](https://deviceplus.jp/hobby/raspberrypi_entry_023/)