OmniAICreator/Qiita-1.07M huggingface dataset:
UnityでVSCodeの補完機能が使えない

PC:Win10
Unityのバージョンを2019にするとVSCodeをUnityで使いやすくなると聞いたので開いたが、もろもろのソフトを入れたはずなのに補完機能が使えなかったので共有。実は今まで補完機能をほとんど使っていなかった、、、

[参考にしたサイト]
・unityでVSCodeを開く適切な方法として
https://qiita.com/honmaaax/items/da39d7b854c39c3ea110

・入れたソフトな、設定など
https://qiita.com/riekure/items/c45868f37a187f8e1d69
https://qiita.com/kamanii24/items/399f956f2bf6bec76884

これらの記事を参考にさせてもらって入れたんだけど補完ができなかった。

VSCodeに以下の文言が出ていた
OmniSharp.MSBuild.ProjectManager Attempted to update project that is not loaded:

検索したところこのサイトに引っ掛かり
https://stackoverflow.com/questions/55535177/omnisharp-msbuild-projectmanager-attempted-to-update-project-that-is-not-loaded

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/07a520fc-95f0-8e69-eed6-0afeeb936100.png)
この回答のようにVSCodeの左上にあるファイルから基本設定→設定をクリック
すると、検索できる窓があるので
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/9e9595ac-0c87-b2f9-2d96-daf28ce3fbc4.png)
ここで編集をクリック
コードをコピペ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/baa2bad5-4e58-2bbb-9f2a-03c9d9374d98.png)

C#のスクリプト編集に戻ってv3と打つとVector3と出てきた。
これでおそらく動いたと思われる。

もし参考になれば！
Siderの導入(コードレビューツール)

#書いてあること
1.Siderとは
2.Sider導入
- SiderにGithubでログインする
- リポジトリを追加する
- プルリクエストを作成する
- レビューを受けて修正する

3.参考ページ
4.終わりに


##Siderとは
コードレビューツールを一括導入できる
プルリクエストが作成されると自動でコードレビューを行ってくれます⭐︎

##2.Sider導入
**GitHubアカウントを持っていることが前提です**
#####1.SiderにGithubでログインする

[https://sider.review](https://sider.review)からSiderに飛ぶ
`Sign in via Github`をクリック
認証ボタンの`Authorize Sider`をクリック
同意にチェックして`続ける`をクリック

#####2.リポジトリを追加する
追加するリポジトリで使用している言語・フレームワークをチェックし
`+オーガニゼーションを追加する`ボタンをクリック（Siderインストール）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540209/d4a9c959-2c11-0cf4-94b4-258694d5fd67.png)

`Only select repositories`をクリックしてリポジトリを選択する
`install`をクリック

一覧画面に飛ぶので追加したいリポジトリを`設定する`をクリック
言語を選んで`オープンなプルリクエストを解析する`

**なんか勝手にプルリクエスト？ブランチ？ができてる(　˙-˙　)**
本来はこんなページになってクローズができるはず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540209/b2d47a92-fd22-3028-76ae-4d6554d82bb7.png)


＊指摘されたものの、個人で問題がないと判断したコードは、「クローズ」することができます。
全てのコードが修正もしくは「クローズ」されると、解析結果がグリーンになります。

修正を行いクローズのようですがひとまず見た感じ大きなエラーなどはなかったので
`Marge pull request`→`confirm merge`で全部マージしました。
最後にPushとPullを行い終了。

##参考ページ

[Siderでコードレビューを自動化してプロジェクトのエントロピーを維持する](https://www.1915keke.com/entry/2018/12/19/234137)

##終わりに
SiderとRuboCopをそれぞれ導入してみて
始める前はSiderの方がワンクリックで複数見れるのかなぁと思ってましたが
やってみたらそうでもなかった（ただ単に知識不足なだけだと思いますが）
RuboCopはローカルでチェックしてからリモートにあげられるので安心(でもリモートにあげ直す手間がある)
Siderはリモート上で行えるのですぐに本番環境（AWS）に連携できるがマージしたときミスしてないか心配。
自分はメンタルチキンなので今はローカルでいじる方が安心ですが、慣れてきたら面倒になるんだろうな・・・とも思ってます。
ひとまずは覚書程度にみていただければと思います。
記述の不備やアドバイス等ございましたらご指摘いただければ幸いです！
Goで日本語コメントを書く悩み

この記事はGo2 Advent Calendar 15日目の記事です。

## コメントの悩み
まずは復習から。

とりあえず関数を例にします。Goでは関数などのシンボルの上に、 `関数名[半角スペース]内容...` という形式でコメントを書くことで、自動的に関数とコメントを紐付けてドキュメント化してくれます。複数行書くこともできます。

```go
// Hoge reports whether the hoge is fuga.
// hogehoge. hogehoge.
func Hoge() {}
```
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348791/ab6bc690-fb64-2139-a3f5-0e9e6db778ef.png)
便利ですね。

**問題は、このコメントを日本語で書くとき起こります。**

社内で使うツールなどは、分かりやすさ優先でドキュメントは日本語にすることが多いかと思います。個人的にも、そうした方がベターだと考えます。

そういったときよく見かける（自分の観測範囲内）のがこんなコメント。

```go
// Hoge はhogeがfugaかどうかを調べる。
func Hoge() {}
```

先述の通り、 `関数名[半角スペース]内容...` というルールを守っているためドキュメント化されますが、この書き方にはいくつかの懸念があります。

* 見た目の問題: 謎のスペースが挟まっている。typoにすら見えるかもしれない。
* 言葉の問題: 主語からきっちり始めるのが読みやすいとは限らない。

仕様上、英語ほど自然に書くのは無理とはいえ、なんかすっきりしないなあ……と思っていました。（個人の感想です）

## 一つの解決案

そこで、自分は以下の形式で書くようにしています。

```go
// Hoge - hogeがfugaかどうかを調べる。
func Hoge() {}
```

関数名の後に ` - ` を挟んでいます。特に記号にこだわりはないのですが、`:` などよりスペースを挟んでも違和感がないものを選定しました。

メリット：

* 少し見た目がすっきりする。（主観）
* 主語に縛られないため、日本語的に自然に書ける。（主観）

デメリット：

* 一つ余計なコーディング規約を増やしてしまう。
* 誰も使っていない書き方。

独自記法なのが心苦しいですが、今の所はこのスタイルで統一することで十分綺麗にドキュメント化できていると思っています。

**何か他にいい案あれば是非コメントで教えてください！**

というわけで、短いですが以上になります。ありがとうございました。
[入門編]　link_to の使い方

# link_toの基本
### link_toとは
link_to = HTMLでいうaタグのこと。
非常によく使う機能なのでメモ
### 記述方法
```
<% link_to "第一引数（表示されるテキスト）", 第二引数：リンク先（〇〇path), 第三引数：オプション %>
```
**第一引数**：例えばTOPページへ　など実際にリンクとしてクリックされる部分の表示です。
**第二引数**：URL、root_pathなどの内部リンクや https//〇〇のような外部リンク　など実際にリンクをクリックされた時に遷移するリンク先です。
(ちなみに内部リンクは　rails routes で確認することができます。)

**第三引数**：こちらは省略可能で**何もない場合はGET**となります。
**GET**：HTMLファイルや画像ファイルの取得
**POST**：文章や画像を送信
**DELETE**：データを削除
**PUT**：リソースの作成、置換
**PATCH**：リソースの部分的置換

data: { confirm: 'Are you sure?' }
上記のように「confirm」を追加すると、リンクをクリックしたときに以下のようなメッセージが表示され、「OK」をクリックすると実行されます。

```:例
 link_to 'Destroy', item, method: :delete, data: { confirm: 'Are you sure?' } %>
```
Vue.js テーブルの対象行を抜き出して詳細表示・編集する方法

# 概要
Vue.jsを使って、テーブルの選択した行のデータを編集フォームに表示し、
フォームで編集したデータをテーブルの対象行に戻す（更新する）といった機能の実装をしたので、
その時のメモ。

# 環境
* Vue.js 2.6.10

# 実装機能概要
編集ボタンを押すと、
![table1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220144/41569a33-28ad-5899-7db0-d795eda425c8.png)

対象行のデータを抽出し、
![table2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220144/a738a007-25cc-18ad-eb2d-9cbc52e4d250.png)

保存ボタンを押すと、
![table3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220144/f2a6f6b3-ac7f-b6c0-bd15-305466e76367.png)

抽出してきた行のデータを入力内容で更新する。
![table4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220144/18ac74fe-b858-8a42-500e-f732b079ba1a.png)

# 詳細
実装したコードのサンプルは以下のコードになります。
ポイントとしては、

* 編集開始時に、編集対象のインデックスを保持
* 編集フォームのデータとテーブルデータのオブジェクトの参照を分離するため、```Object.assign()```を使って、別オブジェクトとしてデータを作成している
* ```splice()```を使い、編集対象のインデックスのデータのみを更新する

といったところだと思います。

```vuejs
<template>
  <div>
    <div class="detail">
      <label>
        No：
        <input type="number" v-model.number="form.no" />
      </label>
      <label>
        Name：
        <input type="text" v-model="form.name" />
      </label>
      <label>
        Content：
        <input type="text" v-model="form.content" />
      </label>
      <button type="button" @click="onSave">保存</button>
      <button type="button" @click="onCancel">キャンセル</button>
    </div>
    <hr />
    <div class="table">
      <table border="1">
        <thead>
          <tr>
            <th style="width:120px;"></th>
            <th style="width:50px;">No</th>
            <th style="width:150px;">Name</th>
            <th style="width:300px;">Content</th>
          </tr>
        </thead>
        <tbody>
          <tr v-for="(d,index) in data" :key="index">
            <td>
              <button type="button" @click="onEdit(index)">編集（{{ index + 1 }}行目）</button>
            </td>
            <td>{{ d.no }}</td>
            <td>{{ d.name }}</td>
            <td>{{ d.content }}</td>
          </tr>
        </tbody>
      </table>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      form: {},
      data: [
        { no: 1, name: "test1", content: "テスト" },
        { no: 2, name: "test2", content: "なし" },
        { no: 3, name: "test3", content: "～～～～～～～～～" }
      ]
    };
  },
  methods: {
    onSave() {
      this.data.splice(
        this.currentTargetIndex,
        1,
        Object.assign({}, this.form)
      );
      this.form = {};
    },
    onCancel() {
      this.form = {};
    },
    onEdit(index) {
      this.currentTargetIndex = index;
      this.form = Object.assign({}, this.data[index]);
    }
  }
};
</script>

<style>
</style>
```

# まとめ
そんなに複雑な実装でもないし、あまり使いどころはないかもしれないけど、
実際に作った機能なのでメモとして残しておこうと思う。

複数のデータを一括で登録・編集するといった機能を実装するときには使えるかもしれない。
【macOS】homebrewでMySQL8.0を入れ直す

##はじめに
rootユーザーでログインできない、何かしらに権限がない、など、
MySQLの環境周りで色々いじくりまわした挙句、全く解決しなかった際に
最初から入れ直すという選択をして解決したのでやったことを記載。

##環境
macOS Mojave 10.14.6
mysql  Ver 8.0.18 for osx10.14 on x86_64 (Homebrew)

##手順
・MySQLをアンインストールする

```
$ brew uninstall mysql
```

・消したMySQL関連ファイルの残骸を削除

```
$ sudo rm -rf /usr/local/mysql
$ sudo rm -rf /Library/StartupItems/MYSQL
$ sudo rm -rf /Library/PreferencePanes/MySQL.prefPane
$ sudo rm -rf /Library/Receipts/mysql-.pkg
$ sudo rm -rf /usr/local/Cellar/mysql*
$ sudo rm -rf /usr/local/bin/mysql*
$ sudo rm -rf /usr/local/var/mysql*
$ sudo rm -rf /usr/local/etc/my.cnf
$ sudo rm -rf /usr/local/share/mysql*
$ sudo rm -rf /usr/local/opt/mysql*
```

・MySQLをインストールする

```
$ brew install mysql
```

・起動してルートユーザでログインできることを確認（パスワードなし）してexit

```
$ mysql.server start
$ mysql -u root
$ exit
```

・セキュリティとパスワードの設定

```
$ mysql_secure_installation
```

実行するとY/Nで色々聞かれるので、以下は好みで設定

```
secure enough. Would you like to setup VALIDATE PASSWORD plugin?
```
→パスワードの脆弱性チェックをしてくれるVALIDATE PASSWORDプラグインを使うか？（自分はNo）
→業務で使うならYesにした方がいいと思うが、けっこうチェック内容が厳しくてパスワードが通りにくい

```
Remove anonymous users?
```
→anounymousユーザを消すか？（自分はYes）

```
Disallow root login remotely? 
```

→リモートでのrootユーザへのログインを禁止するか？（自分はYes）

```
Remove test database and access to it?
```

→テストデータベースを消すか？（自分はYes）

```
Reload privilege tables now?
```
→すぐに変更を反映するか？（自分はYes）

・ログイン

```
$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.18 Homebrew
```

できた！！！

## おまけ
GUIツールとして使っているSequel Proで接続するための設定変更
Sequel ProはMySQL8.0の認証方法「caching_sha2_password」に対応できていないため、
「mysql_native_password」に戻す必要がある。（connectしようとするとエラーになる）

```
mysql> ALTER USER 'ユーザー名'@'ホスト名' IDENTIFIED WITH mysql_native_password BY 'パスワード';
mysql> FLUSH PRIVILEGES; 
```

## まとめ
休日プログラミングをするために環境を作ろうとしたら
なかなかうまくいかず環境を作るだけで1日の大半をかけてしまった
そんなことがよくありますね・・・
1人エンジニア会社とfreeeでの開発スタイルの違い

この記事は、freeeデータに関わる人たち Advent Calendar 2019の14日目の記事になります。

こんにちは、freeeのAnalyticsチームにいる笹尾です。
freeeに転職してもうすぐ1ヶ月が経ちます。

この記事では、前職とfreeeとの開発スタイルの違いについて感じたことを書きます。
主に、納品先の違いと開発を担当する人数の差によって生まれるものです

＜免責＞
ここでの話は私個人の主観に基づくものです。会社の意見ではありません。
また、私が開発しているのは外部向けではなく社内で利用する分析用のシステムです。

## 会社や開発環境の違い
#### 前職（会社名出して良いの変わらないので、「前職」と書きます）
・分析コンサルをやっている会社で、私は開発を担当
・プログラムの納品先は<b>お客様先</b>
・会社が出来て5年くらい
・開発の担当者は、数年は<b>自分1人</b>。他は営業とか分析官とか


#### freee
・クラウド会計サービスをやっている会社で、私は(今は)開発を担当
・プログラムの納品先は<b>自社</b>
・会社が出来て8年くらい
・開発の担当者は、<b>Analyticsチーム内に3人</b>、会社全体で見ると数百人(？)

＊開発スタイルの差い影響するところを太字にしています。

## 納品先の違いについて
納品先が客先か自社かによって、
・開発スピード
・納品後の対応
に差があるように思います。

まず開発スピードについてですが、納品物が客先の場合は、完成を納品期日に間に合わせることがマストになります。どんな理由があっても、「納品物が間に合わなかった」という事実だけで、失敗になります。
そのため、早く納品に耐えうるプログラムを完成させることを優先して作業を行います。YAGNIマンセー。
（万が一、どうやっても間に合わないことが分かった場合は、「期日までに絶対必要な機能は何か」と「期日後に追加納品していくプラン」をお客様と相談します。。。これは他の手が尽きた時の最終手段です）

一方、納品物が自社の場合は、最初に決まった期日に間に合わなかった時の問題が小さいことが多いです。あくまで客先納品と比べればの話で、中には大問題な場合もありますが、比較的そのような案件の割合は少ないでしょう。関係者にいついつまで延びるということを伝えるだけで済む場合もあります。スケジュールが遅れている時の、胃の痛みもマシです。

オマケで、納品物の金額は開発にかかる人日に基づくため、早く開発できる方が客先への見積もりが安くなって案件を受注しやすくなります。 

次に、納品後の対応についてです。
例えば納品物に問題が見つかった場合は、納品物を使うのが客先か自社かで対応にかかるコストが違います。いずれも関係者への謝罪から始まり、調査と修正を行うのですが、この作業の心理的コストの差は大きいです。
また、自社内なら「あー、すみません、修正したのでもう一度処理を流してもらえますか」で済むようなことが、客先だと様々なやりとりや確認が発生します。問題が発生した時の対応は、自社の方がまだ楽です。
一方で、客先納品の方が楽なこともあります。
それは納品物から手が離れることです。
納品後に機能の追加や修正の要望があれば、(基本的に)新しい仕事になるので、それほど依頼は発生しません。大雑把に言えば、納品物の内容を忘れてしまっても、後で後悔する可能性は小さいです。依頼が来たときに、少し多めに苦労すれば良いのです。
これが自社内で使われるシステムだと、機能追加や修正の要望、バージョンアップの依頼が簡単に発生することでしょう。納品物の内容を忘れることはできませんし、予めそういった依頼が来ることを想定した作りにしておく必要があります。

まとめると
・客先納品：開発速度が大事。YAGNI原則マンセー
・自社納品：保守性や拡張性が大事。
ということです。


## 開発担当者の人数の違い
前職では3年くらいは開発者は私1人でした。当然納品物は1人で作ります。
freeeでは開発者は会社全体でたぶん数百人、今のプロジェクトでは3人で作っています。
それによって何が違うかというと、
・作るものの規模
・チーム開発にかかるコスト
が違います。
前者については当たり前なので、説明はしません。
チーム開発にかかるコストで大きいのは、コミュニケーションコストとソース管理のコストでしょうか。意思決定者に聞かないと進められない・コミュニケーションロスによる不要な作業の発生・他の人が作った機能を学習する時間などなど。
一人開発だと、作業者＝意思決定者ですし、コミュニケーションロスはそもそも発生しません。書き方が良くないこと(可読性や拡張性が低い等)が分かっていても、それほど問題ありません。前述の通り、開発速度優先だったので、ここに時間を使うべきではありません。直すなら、いったん完成させてからです。
またgitも使いません。<b>開発中のコードはローカルPCでコピペでした。</b>
(＆一応ファイルサーバーにも最新ソースをバックアップ)
ちなみに、開発中のコードをコピペで履歴管理するのって古いやり方ですが結構良いんですよね。どうせ遡ることって滅多にないので、<b>その稀な事態が発生したときに不便を感じればよく</b>、トータル時間で考えると履歴管理は最小コストのやり方で良いと思ってます。繰り返しになりますが、納品に耐えうるものが完成するまでは速度優先です。
この辺り、チーム開発ではそうも言ってられず、避けられないコストになっています。
コミュニケーションコストもソース管理のコストもなるべく減らす方法を取り入れていかなければなりません。（ただ、その方法を取り入れるのに学習コストがかかるという、悶々とした気持ちがあります）


## freeeに転職して
freeeは自社納品でチーム開発なので、それに適した開発スタイルに慣れていかないといけません。
ソースはgit管理でPR＆レビュー、クラウド管理はterraform、CI/CD、IAMの設定は最小権限などなど。
色々と学ぶことが多い毎日ですが、早くパフォーマンスが発揮できるように頑張ります。


## 最後に
この記事からなにか学ぶっていうようなものは無いと思いますが、
強いて言えば、スタートアップの段階の企業は、いきなり高度な開発スタイルを整えるのではなく、会社規模がある程度の段階になるまでは速度重視で突っ切った方が良いかもしれません・・・どうせ最初の頃は開発以外の作業も多々担当することになるので
ローカル環境でOneSignalのテストする方法

# 当記事について

OneSignal(*1)をローカル環境でテストする際のハマりどころと手順についての記録。

*1 ... 手軽にWebプッシュ通知を実装できるWebサービス

# ハマりどころ

## ローカルテストの方法がググりづらい

Googleで検索しても、なかなか公式ドキュメントの記述にたどり着けない。

**解**: 「OneSignal FAQ」で調べると、その[FAQ](https://documentation.onesignal.com/docs/web-push-setup-faq)の中に記述がある。

## ローカルテスト用アプリの登録

ローカルテストをするための設定項目が、アプリの登録画面や登録後の設定画面上に見当たらない。

**解**: 大前提としてWebプッシュ機能は、OneSignalダッシュボードで指定されたサイトURLでのみ使用できる。そのためOneSignal上でプロダクト用とローカルテスト用のアプリを分けて登録する必要がある。

## LOCAL SETTINGの項目が見つからない

「LOCAL SETTING(ローカル環境でテストをできるようにするか)」という項目が
公式のドキュメント上では存在しているのだが、実際に登録用のウィザードを開くと表示されていない。

**解**
`SITE URL`に`http://localhost`もしくは`http://127.0.0.1`を入力すると表示される。

# 手順

1\. OneSignalのヘッダーから`+ New App`を押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215954/004e1b9b-d2b9-e7b8-adfb-5c872cb34f81.png)

2\. 任意のApp名を入力して`ADD APP`を押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215954/d0deb746-a5e2-b8de-f942-d6f6ab6b8c8f.png)

3\. `Web Push`を選択して`NEXT`を押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215954/78533d0b-b21b-a88d-bf94-b02f864e83ec.png)

4\. `Typical Site`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215954/aa8efaf9-b6b5-ec7b-ca17-987a5ccb446e.png)

5\. 任意のSITE NAMEを入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215954/7af47dab-4da2-5ca6-7b84-0bcbdb0de623.png)

6\. SITE URLにを`http://localhost:ポート番号`入力

ここで`http://localhost`もしくは`http://127.0.0.1`を入力するとLOCAL SETTINGについてのトグルが表示される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215954/427d60e4-c64e-3917-8166-55454d477424.png)

7\. LOCAL TESTINGのトグルを`ON`に変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215954/5e6ee520-d963-5894-2b3a-e9647918bcad.png)

8\. `ADD PROMPT`を押下してPermission Prompt Editorを開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215954/38fc2838-8b8e-7e76-d07c-41b9bbe0a2e3.png)

9\. 任意のPROMPT TYPEを選択して`SAVE`を押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215954/050e4b14-a764-7b50-00ad-efc70f745e05.png)

10\. 任意のWelcome Notificationを入力

- デフォルトでも登録は完了できる
- あとで変更できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215954/82b5bff3-d1b7-1bbc-2c2c-7fbead679419.png)

11\. Advanced項目を設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215954/d7684568-c556-4011-0839-708d30725a96.png)
Goで同じディレクトリ・パッケージも同じ関数を呼び出してもエラーが出る

goでディレクトリもパッケージも同じなのにbuildでこける。

```
go run server.go
```

server.goと同じディレクトリにあるのに呼べないのなんで、、！！

ディレクトリはこんな感じ

```
├server.go
└data.go
```

server.goでdata.goのメソッド読んでいる

### 解決策

以下のコマンドで丸ごとbuildするらしい

```
go build

//または

go build server.go data.go
```
reducerを遅延させてみる

ファーストビューの効率化のために、ファーストビューのタイミングで不要なものを遅延ロードにしていたのですが、reducerを遅延させるのもいいかなと思えてきました。

## reducerが必要となるタイミング

コンポーネントを描画した直後に`dispatch`を行う必要性というのは、そうそう生じないものです。ユーザーインタラクションでしか`dispatch`が行われない、ということでしたら、コンポーネントを作成したタイミングで遅延ロードを開始して、そこから1秒もしないうちにロードされる、というようなタイミングでじゅうぶん間に合います。

そして、巨大なオブジェクトを取り扱うreducerは、往々にして多くのコードを必要とします。

とはいえ、ふつうの`React.useReducer`では、reducer関数は同期的に必要となってしまいます。

## `useLazyReducer`を作ってみた

ということで、遅延ロードでreducerをロードするようなHooksを立ててみました。

```js
// ロード前は何もしないreducerを入れておく
const temporaryReducer = (store, _action) => store;

export default function useLazyReducer(lazyReducer, initialArg, initializer) {
  // 遅延データを入れる
  const reducerRef = React.useRef(temporaryReducer);

  React.useEffect(() => {
    lazyReducer().then((obj) => {
      reducerRef.current = obj.default;
    });
  }, [lazyReducer]);

  const reducer = React.useCallback(
    (store, action) => reducerRef.current(store, action),
    []
  );

  return React.useReducer(reducer, initialArg, initializer);
}
```

仕掛けとしてはごく単純で、reducerとしてセットする関数はrefの中身につなぐだけ、としておいて、遅延ロードでrefを書き換える、というものです。`lazyReducer`として渡すものは、`React.lazy`に倣って、「`{default: reducer関数}`を`resolve`する`Promise`を返す関数」を受け取るようにしてあります。

## 使用感

遅延ロードが間に合わないぐらいのタイミングでユーザー操作に入るのは現実的に困難ですので、これで十分に間に合っている印象です。
rails Prefixを変更する方法

##Prefixを変更する方法
変更する方法は`routes.rb`でPrefixを書き換えることです。

newアクションをもつUserコントローラーを作ったとします。

コンソールでrails routesでルーティングを調べてみると

```
   Prefix Verb URI Pattern          Controller#Action
users_new GET  /users/new(.:format) users#new
```

defaultではPrefixがusers_newとなっています。

users_new_pathではなくsignup_pathを使いたいなら

```routes.rb
 get 'users/new'
 ↓
 get 'sighup', to:'users#new'
```
上記のように書き換えることでsignup_pathが使えるようになります。
ストックといいねの違い

ストックは、この記事の今後の優良化に「今後の更新に期待、いいねの伸び率監視、ブックマーク代わり」で、いいねは「マジで役に立った！面白いね！いいね！」であるんじゃないだろうかと気づいた

結構適当に役に立たない~~記事を書いて~~メモを残しているのですが、意外にストックされてしまったり、いいねをいただいたりするので、そんな気がして、そう思い込んでストックやいいねを受け取ってみる！システム上やっぱ「ストックされた記事っていつか更新しなければ！」ってみなさんも思いますよね？

ところで皆さんストックは更新されるとメールが届く機能があるので是非使ってみては？（じ、自分でハードルを上げた...?）

などとQiitaニワカが申しております

ところで、小生はいまだにQiitaのマークダウン記法がなれてないのでここにリンクを貼っておきますゆえ、参照されたし

#Markdown記法 チートシート
https://qiita.com/Qiita/items/c686397e4a0f4f11683d

追記：コメントありがとうございます
マークダウンの書き方は、投稿画面やコメント欄の上にある ？ をクリックすると表示されます。チートシートへのリンクも表示されます。

そもそもQiitaってなんだ？w
↓
#Qiitaってなに？よく分からない人向けQiita基礎知識
https://ferret-plus.com/1856

以上（これを言っておけばとりあえず締めれる）
VScodeでTeX(Mac)

#はじめに
備忘録として記事を書いています．

特に，自分で設定するときに，VSCodeのsetting.jsonの設定で他の記事の設定ではうまくいかなかったため，困っていました．似たような人がいれば，setting.jsonの設定を私の設定で試してみるのもアリだと思います．

#対象
・Macユーザー(macOS 10.12 Sierra以上)
・VScodeはインストールしている人
・TeXはインストールしていない人

#手順
1)MacTex2019をダウンロード&インストール
2)Xcode Command Line Toolsのインストール
3)tlmgrで最新版にアップデート
4)ヒラギノフォントの埋め込み設定
5)VSCodeの設定をいじる．

※4)までの手順は[ここ](https://doratex.hatenablog.jp/entry/20190502/1556775026)の記事（以下，「参考サイト」と呼びます．）を参考にしました．これからの解説も，この記事に書かれていることを前提に記述しています．写真付きで丁寧に教えてくださっているので参考にしてみてください．

#1)MacTex2019をダウンロード&インストール
僕は参考サイトでも奨励しているとおりに[ミラーサイト](https://texwiki.texjp.org/?MacTeX#mirror)からダウンロードを行いました．特に，[先ほどのサイト](https://texwiki.texjp.org/?MacTeX#mirror)の[一番上のサイト](http://ftp.jaist.ac.jp/pub/CTAN/systems/mac/mactex/)からダウンロードを行いました．

インストールについては参考サイトどおりに進めて行きました．インストール後はインストーラーはゴミ箱に移動させました．

#2)Xcode Command Line Toolsのインストール
ターミナルでコマンド`xcode-select --install`を入力し，Xcode Command Line Toolsのインストールを行いました．

ただ僕の場合，既にインストールされていました．

#3)tlmgrで最新版にアップデート
管理者ユーザでコマンド`sudo tlmgr update --self --all`を入力しTeX Live レポジトリの内容を最新版に更新しました．

結構時間がかかります．


#5)VSCodeの設定をいじる
ここが一番苦労しました．コンマの打ち忘れなどに気をつけてください．コピペする場合も，前後のコードとうまく合わせてください．

    {
        // 他の設定
        "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~",
    
        // LaTeXの設定
        // コマンドの設定
        "latex-workshop.latex.tools": [
            {
                "name": "ptex2pdf",
                "command": "ptex2pdf",
                "args": [
                    "-interaction=nonstopmode",
                    "-l",
                    "-ot",
                    "-kanji=utf8",
                    "-synctex=1",
                    "%DOCFILE%.tex"
                ],
            },
            {
                "name": "ptex2pdf (uplatex)",
                "command": "ptex2pdf",
                "args": [
                    "-interaction=nonstopmode",
                    "-l",
                    "-u",
                    "-ot",
                    "-kanji=utf8 -synctex=1",
                    "%DOC%"
                ]
            },
            {
                "name": "pbibtex",
                "command": "pbibtex",
                "args":[
                    "%DOCFILE%",
                    "-kanji=utf8"
                ],
            }
        ],

        // 保存したときの一連の処理
        "latex-workshop.latex.recipes": [
            {
                "name": "toolchain",
                "tools": [
                    // "ptex2pdf",
                    // "pbibtex",
                    // "ptex2pdf",
                    // "ptex2pdf",

                    "ptex2pdf (uplatex)",
                    "pbibtex",
                    "ptex2pdf (uplatex)",
                    "ptex2pdf (uplatex)"
                ]
            }
        ],

        "latex-workshop.view.pdf.viewer": "tab"
    }

#参考
(1)[TEX Wiki-MacTeX](https://texwiki.texjp.org/?MacTeX)
(2)[macOSでのVSCode環境構築備忘録](https://qiita.com/uoyuki/items/c172235a0caf2f637ea4)
(3)[MacTeX2019のインストール&日本語環境構築法](https://doratex.hatenablog.jp/entry/20190502/1556775026)
Mac Visual Studio Code のターミナルのShellをZshに変更する

# 目的

- Visual Studio CodeのターミナルShellをZshに変更する方法のメモを書く  
※本作業はPCにすでにZshが入っており、terminalでは使用できていることを条件とする。

# 実施方法

1. Visual Studio Code(以降、VScode)のエディタ画面の左上の「Code」をクリックする。
1. 「基本設定」→「設定」と進む。
1. 「設定の検索」に`terminal.integrated.shell.osx`と入力する。
1. 「settings.jsonで編集」をクリックする。
1. 開いたファイルに下記の内容を追記する。場所はどこでもOK

    ```
    "terminal.integrated.shell.osx": "/usr/local/bin/zsh"
    ```

1. PCを再起動させてからVScodeのターミナルを開く
1. 下記の内容が出力されるがEnterを押す

    ```
    This is the Z Shell configuration function for new users,
    zsh-newuser-install.
    You are seeing this message because you have no zsh startup files
    (the files .zshenv, .zprofile, .zshrc, .zlogin in the directory~).  
    This function can help you with a few settings that should make your use of the shell easier.

    You can:

    (q)  Quit and do nothing.  The function will be run again next time.

    (0)  Exit, creating the file ~/.zshrc containing just a comment.
         That will prevent this function being run again.

    (1)  Continue to the main menu.

    --- Type one of the keys in parentheses --- 
    ```

1. 下記コマンドを実行してshellがZshになっているか確認する。

    ```terminal
    echo $SHELL
    >/usr/local/bin/zsh
    ```
NEMで課外活動の証明をしたかった話

# はじめに
この記事は[nem#2](https://qiita.com/advent-calendar/2019/nem-2)アドカレの14日目の記事です。

近畿大学で2019年7月1日より始動していた、[「ブロックチェーン研究プロジェクト」](https://search.act.kindai.ac.jp/act_activity/projects/1129/)に参加していました。
本プロジェクトでは[@daoka](https://qiita.com/daoka)さんを講師として、3チームにわかれて、それぞれブロックチェーン技術を用いたサービスの設計・開発を行っていました。

- [モバイルオーダーアンドペイ (MOAP)](http://www.news2u.net/releases/167467)
- ポートフォリオサービス
- フリーテーマ -> よみとも

の三つから参加するチームを選択することができ、僕は「ポートフォリオサービス」のチームに参加しました。

# ポートフォリオサービス is なに

近畿大学では、本プロジェクトのように、大学が主体となってさまざまなイベントが[ACTプロジェクト](https://search.act.kindai.ac.jp/act_activity/)として開催されています。
しかし、現状では成績以外での評価は難しくACTプロジェクトなどへの参加率や貢献度といった課外活動を評価することができていません。

そこで、NEMを使って自己証明をするためのプラットフォームを作成しようといった内容になります。

## 初期構想
活動の履歴をアポスティーユを用いて、改竄がないことを証明し、それを学生の成績以外の面での活動の評価指標のひとつとして活用するためのwebアプリケーションの作成

学生の課外活動を記録し、その記録をそれぞれアポスティーユすることで、改竄されていないことを証明するサービスを設計していました。

構想した機能は
- 活動記録のアポスティーユ
- 活動記録の可視化
- 課外活動の評価
- 課外活動の記録を用いた検索

などを構想していました。

### 問題点
しかし、様々な問題点がそこにはありました。

- ストレージ
- テキストデータのコピーと監査
- 手数料
- NEMを使う意義・意味

アポスティーユしたからといってストレージが不要になるわけではないことやストレージで管理するべきでないデータも含まれる？(あまり詳しくはわかってないです)、テキストデータ(テキストデータに限った話ではないが)をアポスティーユした際に、コピーするのは容易であること(喜憂だった気がする)、単純にリクエストの度に監査をしていたら手数料どうなるの？という疑問、そしてこれが一番大きな問題点でNEMを使っている意義、意味はあるのかと言う問題

### NEMを用いたサービス開発と使う意義・意味

初期の構想でも、最終的な構想でも、ここが一番難しくデリケートであると僕はこのプロジェクトを通して感じました。

今回の初期構想では、データの改竄がないことを証明するためにアポスティーユをつかうといったものでしたが、はたしてそれは本当にブロックチェーンというシステムで実現するべきであるのかが重要だと思いますが、

> 学生の課外活動を記録し、その記録をそれぞれアポスティーユすることで、改竄されていないことを証明するサービス

において、ここに改竄がないことを担保するのは、ブロックチェーンシステムで担うことよりも、大学が担保するほうが適切なのではないかと考えました。

確かにアポスティーユを使うことでデータが改竄されていないことを証明することはできますが
大学内での課外活動を記録し、可視化するといった要求からは大学が情報を担保するべきであると考えました。

### 使う意義・意味を考える

そしてブロックチェーンを使う意義や意味を考える中で、意義・意味の見出し方についての僕なりの答えを探しました。

これまで、僕たちはポートフォリオサービスを設計する上で、ブロックチェーンをどうやって使うかを考えていました。
ブロックチェーンを使ってどうやったらポートフォリオサービスを作るかに囚われていたのです。

ポートフォリオサービスの設計をし、どこをブロックチェーンシステムに置き変えることで、サービスがよくなるかに着目し、初めからブロックチェーンを使った設計をするのではなく設計したサービスのどこをブロックチェーンに置き換えるかを考えるべきだとかんじました。

この結論は一般的かもしれません(サービス設計とかわからん学生なんや)しかし、使う意義・意味を考える上でこれまでの発想とは逆の考え方をすることで設計を見直し、アポスティーユを使わないことを選択しました。

## 最終的な構想

モザイクを利用してイベント参加、イベントでの貢献をモザイクの授与という形で点数化、可視化を行う。
まだ、これだけでは先程同様使う意義・意味と言った問題はクリア出来ていないのではないかという部分もありますが、モザイクを利用しているため、ここに学生へのインセンティブを考えて行くことで、NEMを使う意義・意味を与えることが出来るのではないかと思っています。

# まとめ

- ブロックチェーン技術を使うことをベースにサービスを設計するのは難しい
- ブロックチェーンを使わずに設計をし、ブロックチェーンを使うことでより良くなる部分を考えると良さそう
- 完成させたかった
集中力についてまとめてみた

##はじめに
 プログラミングに限らず何かを成し遂げるために必要な要素ってありますよね。
よく言われるのが「やる気がない」とか、「気合が足りない！」とか、「やる気はあるのになんか続かない」なんていう話。

 でも、そんな簡単に自分をコントロールできるなら苦労はしないはず。
今回は科学的な根拠に基づいた方法で、**最高に集中**している状態に持っていくための方法を
以下では**大事なポイントを３つ**に分けてまとめました！！
　　　　

##POINT１
あまり知られてない集中力の性質とは

####1日の集中力は有限

実は集中力は**前頭葉**からきています。そして、**1日の使える量というのは決まっている**(鍛えて絶対量を増やすことも可能だが今回は省略します)のです。

そんな集中力ですが、実は私たちは**生活の些細なことでどんどん消費**してしまいます。
例えば朝の服選び。コンビニで何を買うか、などなど「悩む」「不安」「我慢」などの感情は集中力の大敵なようです。

スティーブ・ジョブズ氏や、マークザッカーバーグ氏が同じような服を来ていたのはそういった理由があるのかもしれませんね。

##POINT２
集中力を高めるために自分でできること

####環境

* スマホをおかず、机の上は整理整頓青いものを置く
青はおちつかせる、効果があり、逆に赤色は集中して作業をする際には逆効果なんだとか…

* 作業中は自分自身を鏡で見れる状況を作ってみる
鏡もいい自分の姿を見ることで自制心UPとのこと。

Daigo氏自身学生時代は親に学習障害を疑われるほど落ち着きがですが、今では圧倒的な集中力で今のような圧倒的な地位を確立されています。
※Daigo氏の著書「超集中力」

####食事
血糖値の乱高下に要注意→対策として低GI食品、ダイエットにもオススメの食品
血糖値スパイクとは？？→食後の血糖値の乱高下のこと。[詳しくはこちら](http://shinclinic.jp/original26.html)

ちなみに僕のオススメはローソンの低GIバームクーヘンです！
小腹が減った時にちょうどいい大きさと甘さです。ぜひ


####やることの習慣化
悩んだり、選んだりという過程をできるだけ少なくする。
前述の通り、「悩む」という行為は集中力に負の効果を及ぼすため、なるべく必要ないことはルーティーンで無意識に解決して、変化が求められるなように集中力を投下できるが理想的ですね

##POINT３
集中力を回復させるには？

####寝る
「スタンフォード式最高の睡眠」によると、睡眠は体の真の部分いわゆる**「深部体温」**が下がっている時に寝ると**質の高い睡眠**が取れる。お風呂で浴槽に浸かるタイプの人であれば約９０分後を目安に眠りに入れば最高の睡眠で集中力を抜群に回復できる

####眼球を癒す
**目玉の疲れを脳の疲労と勘違いしてしまうケース**がよくあります。
眼精疲労の人や、目の疲れが出やすいデスクワークの方は目のケアをしてみると生産性UPに繋がるかもしれませんね

####瞑想
瞑想のやり方　ずばり**何も考えないで目を瞑る**こと。

ただ非常に奥が深く、また何も考えないでぼーっとするのも難しいのでの頭の中で幽体離脱して、自分を客観的にみてみたり、呼吸の吸うこと、履くことに全部の意識を集中してみるなどさまざまな方法があります。

瞑想を行う効果　睡眠中など脳を使ってるつもりじゃなくても、普段の脳内では**「デフォルトモードネットワーク（DMN）」**と呼ばれる活動がおこなわれています。これが休んだはずなのにすっきりしない理由だ、とも言われています。
その**DMNを瞑想によって鎮める**ことができるようです。。
カナダのブリティッシュ・コロンビア州の公立校で、9歳前後の生徒99人を対象にした研究では、毎日3分×3回の瞑想を4ヶ月おこなった生徒グループとそうでないグループとの算数の成績を比較したところ、15%高いスコアを獲得したそうです。

####アクティブレスト
**筋トレ、運動などの軽く体を動かして脳をリフレッシュさせる方法です。**

休憩中に軽く散歩をする人は多いでしょうが、最近の研究では、**どんなに軽い運動でも想像以上のメリットを得られる**ことがわかってきました。

たとえば学生を対象にした実験では、最大心拍数の約30％という負荷で10分の運動を行っただけでも被験者の脳機能が改善し、認知テストの結果では集中力と記憶力に有意な向上が見られています。「最大心拍数の約30％」という負荷は、ほぼ**普通のウォーキング**と変わりません。

###まとめ
実態のないように見える「集中力」のでしたが、性質をしっかり理解して利用することで1日の生産性を何倍も高めることができるようですね。
##最後に
集中力とはささいなもので使ってしまう**とてもデリケート**なものです.
だからこそセルフ管理できるようになれば他者と圧倒的な差がつけられそうと思い今回**自戒の意味も込めてまとめてみました**。

性質を理解し、回復と要因を整えて、自分をコントロールできるようになって自分だけの精神と時の部屋を作ることを目指そうと思います！笑
C言語のコンパイルで無駄な機械語コードが生成される意味がわかりません

次のC言語のプログラムをclangでコンパイルしました（clangは3.4-1ubuntu3、OSはAWS上のUbuntu Ubuntu 14.04.5で32bit）。

```sample.c
#include <stdio.h>
int func(int a, int b)
{
    return a + b;
}
int main()
{
    int x = 1;
    int y = 2;
    int c;
    c = func(x, y);
    printf("%d\n",c);
    return 0;
}
```
clangでコンパイルしたコードをobjdump -dで逆アセンブルした結果の抜粋です。

```objdump.s
 8048464:       89 4c 24 04             mov    %ecx,0x4(%esp)
 8048468:       e8 b3 ff ff ff          call   8048420 <func>
 804846d:       8d 0d 30 85 04 08       lea    0x8048530,%ecx
 8048473:       89 45 f0                mov    %eax,-0x10(%ebp)
 8048476:       8b 45 f0                mov    -0x10(%ebp),%eax
```
わたしが教えていただきたいのは、
mov %eax,-0x10(%esp)
の後で、
mov -0x10(%esp),%eax
がなぜ必要なのかということです。eaxレジスタの値は変わっていないので、不要じゃないかと感じるのです。なにか、特別な理由があるのでしょうか。ちなみに、gccでコンパイルしても生成されるのは似たようなコードでした。
識者の方、教えていただけると幸いです。
【UE4】ランドスケープをスタティックメッシュに変換する方法とハマったところの紹介

## はじめに
ランドスケープをスタティックメッシュに変換する方法を紹介します。
これの方法を利用することで以下のことが実現できます。

- ランドスケープで作成した地形を背景として利用できる
    - ランドスケープのをそのまま背景として利用するのはちょっと・・・という場合に便利
- スタティックメッシュに変換したランドスケープを地形として利用する
    - 負荷等の理由で、クオリティを落としてでもランドスケープををそのまま利用したくない場合に便利

あと、これを実現するうえで私がハマったポイントがあったので、それらも絡めて紹介をしたいと思います。

## 動作確認環境
- Windows
- UE4.24.0

今回は[Affordable Landscapes - Premium](https://www.unrealengine.com/marketplace/ja/item/a08ddbe0e67e42d3b44377c231e275f9)というアセットを使います。
ハイクオリティな地形データがいろいろ入っているアセットです。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55107/ed44baf9-d4ab-0e5b-71ce-0c7d1128cf22.png)

こんな感じです。いやぁ圧巻。
![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55107/c990944c-ee68-efb4-6dd3-0418af93c186.jpeg)

## 方法
出力したいランドスケープを選択し、出力したいLODを選択してください。
図では4を選択します。ハイクオリティ(LOD0に近い方)すぎると出力も出力した結果も重くなるので注意。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55107/cfcb54ea-cf9e-9e14-dc27-0a769e94d6bf.png)

出力したいランドスケープを選択した状態で ファイル > 選択されたものをエクスポート を選択してください。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55107/93e72b67-b89f-3573-e314-abe99bbab415.png)

出力するファイル形式を選んで保存してください。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55107/73b646ec-9ac1-b2d6-052c-72eb11ac30cf.png)

今回はobj形式とfbx形式で出力してみました。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55107/c8d6ecf8-27bd-48f5-7b41-5c21bc9c2f12.png)

出力したファイルをプロジェクトにドラッグアンドドロップでインポートするのですが・・・。
1点注意があり、obj形式だと以下の図のように分割された状態でインポートされてしまいます。
1024個のスタティックメッシュが出来上がりました・・・。
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55107/e146ac4f-45a4-2ba2-bae6-f30475f87be5.png)

中身を見ても、何が何だかわかりません・・・。
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55107/96671f9f-fbb8-5034-bb71-028fb2007972.png)

よーく見ると、ちっちゃく地形が存在しているのがわかります。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55107/81d08cb9-ae1e-d6f8-ff5c-bf75447c2814.png)

このように、obj形式で出力してインポートすると分割された状態のスタティックメッシュが出来上がってしまいます。
一応出力されたobjファイルの中身をイイ感じに編集すればこんなことにはならないのですが、さすがに手間です。

今度はfbx形式で出力したものをインポートしてみます。
こちらは1つのスタティックメッシュとしてインポートできました。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55107/36d85b52-ba57-48a7-d898-e20b340fcf33.png)

これをレベルに配置してみます。ちゃんとした地形であることが確認できました。
ということで、ランドスケープを出力する際にはobj形式は避けたほうが良いということがわかりました。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55107/bc7df6cd-26ec-3c0c-dd91-3ff4c662f74d.png)

## おわりに
需要があるかはわかりませんが、ランドスケープをスタティックメッシュに変換する方法を紹介しました。
この方法ははじめに紹介した目的以外でも様々な応用ができるかもしれません。

以上、レッツエンジョイUE4！
WinSCPコマンドラインでサーバログイン、ファイルダウンロードアップロード

# 概要
WinSCPにはコマンドラインインターフェースがあり、これにより複数のサーバにログインして一気にファイルをアップロードする、など、いろいろできます。
今回はAWS EC2にあるファイルのダウンロードとアップロードを行います。

# したいこと
1. ダウンロード先（以降、EC2(hoge)とする）からzipファイル(/home/ec2-user/test.zip)をダウンロード
2. 上記ファイルをアップロード先（以降、EC2(piyo)とする）にアップロード
3. アップロードしたZIPファイルの解凍と削除

上記を1コマンドで行うスクリプトを作成します。

# サーバ状況
EC2(hoge)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/deaf1bba-6a52-e62e-0569-04691d900d5a.png)

EC2(piyo)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/0df0922f-de89-d9d4-163b-4a607f7710b9.png)


# コマンド
WinSCPをインストールしたディレクトリにWinSCP.comファイルがあります。
コマンドプロンプトで以下を実行します。

```
winscp.com /script=updown.txt
```
実際のダウンロード、アップロード処理は別ファイルに記述し、/scriptパラメタに指定します。

``` updown.txt
# 入力を求められたとき自動でNOで答える
option batch on
# 実行しているコマンドのechoを表示するか
option echo on
# getやputでファイルの上書きなどの確認を行うか
option confirm off

#EC2(hoge)からZIPダウンロード
## ログイン(セッションスタート)
## -privatekey 秘密鍵ファイルを指定する。ppk形式。
## -hostkey SSH key fingerprintsを指定する。
open scp://ec2-user@13.231.179.203:22/ -privatekey=ksatou.ppk -hostkey="ssh-ed25519 256 2/fGEolaTkr+D/JQy4b2LvV4wVqoY/M+757ezS84Rbk"

## ファイルをローカルPCにダウンロード
get /home/ec2-user/test.zip G:\tmp\test.zip

# ログアウト(セッションクローズ)
close


#EC2(piyo)へzipをアップロード
open scp://ec2-user@13.114.198.4:22/ -privatekey=ksatou.ppk -hostkey="ssh-ed25519 256 /KO8oL/XL9W7s1+AtroOAJuwAek6KPsgvuz3Nk4XwiM="

## アップロード
put "G:\tmp\test.zip"

# callでシェルコマンドが使用できる
# unzipでアップロードされたzipを解凍
call unzip test.zip

# zipファイルの削除
rm test.zip

close
```


# 結果
コマンド実行結果
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/a0ef924a-d7cb-95d6-0150-f4766c75e3da.png)

ダウンロードの確認
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/6bf0eec1-3f4f-5b71-6c43-c45b67dd9250.png)

アップロードと解凍、削除の確認
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/8a365dab-108c-625d-a0b5-ebda6a144bfc.png)

#参考
https://winscp.net/eng/docs/scriptcommand_open
https://qiita.com/ptiringo/items/90f5246f554da80b1774
ポリモフィック



## ポリモフィックのロジックを考えてみる

### 前提

- 下記が存在する
 - Articleモデル
 - Eventモデル
 - Commentモデル

### 記事を参考に実装してみると下記になる

```ruby
2.3.0 :008 > Comment.first.commentable
  Comment Load (0.3ms)  SELECT  "comments".* FROM "comments" ORDER BY "comments"."id" ASC LIMIT ?  [["LIMIT", 1]]
  Event Load (0.2ms)  SELECT  "events".* FROM "events" WHERE "events"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
 => #<Event id: 1, name: "e1", content: "e_contet", created_at: "2019-12-08 02:19:18", updated_at: "2019-12-08 02:19:18">
```



### 参考記事

https://ruby-rails.hatenadiary.com/entry/20141207/1417926599
Gmailに送られてくる予約完了メールからカレンダーに自動登録する

# 何ができる？

Gmailに特定のメールが届くとカレンダーに予定が追加されます。
特定のラベルがついたメールを読み込んで、中身をあれやこれやしてカレンダーに追加していきます。

# きっかけ

謎解きイベントの予約を頻繁に取っているのですが、カレンダーに予定を入れていくのが面倒になってきたので自動化した次第です。
[自動追加](https://support.google.com/calendar/answer/6084018?co=GENIE.Platform%3DDesktop&hl=ja) されないかなーと思ったのですがされる対象が限られているんですね。
最初はIFTTTやMS Flowだけでなんとかならないかなーと思ったのですが、なんともならなかったのでGASを書くことにしました。

# やったこと

## ラベルの設定

GASとは直接関係ありませんが、これが失敗しているとこの後総崩れするので大事です。
今回は特定のメールアドレスから送られてくること、特定のキーワードがタイトルに含まれていることが確定していたので、
from と subject を検索条件で指定してあげるとうまくいきました。

検索条件の例

> from:info@event.example.com subject:予約が完了しました

## メールの取得

特定のラベルがついたメールを取得するようにします。

```javascript
// 検索条件。Gmailの検索欄と同じものを指定できる。
var terms = "label:イベント予約 is:unread";
var max = 100;
// スレッド形式で該当するメールを取得する。
var threads = GmailApp.search(terms, 0, max);
```
取得されるメールはスレッド形式となっています。１時間以内くらいで複数回予約をとるとスレッドにまとめられるようです。どういう条件なのか知りたい。

## カレンダーへの追加

カレンダーオブジェクトを取得し、所定の形式に加工してイベントを登録します。加工部分は後述します。
それ以外にも、ラベル付けや既読状態をフラグとして使っています。

```javascript
// 前項で取得したメール
var threads = getThreads();
var calendar = CalendarApp.getCalendarById("calendarid@group.calendar.google.com");
for(var j in threads){
  for (var k in threads[j]) {
    var message = threads[j][k];
    // 既読を処理済み扱いしてスキップするときはこうする
    if(!message.isUnread()) continue;

    try {
      var result = // ここで加工する

      // タイトルと開始・終了時刻までは必須。
      var event = calendar.createEvent(result.title, result.starts, result.ends, result.metadata);
      Logger.log("Added: %s %s - %s", result.title, result.starts, result.ends);
    }
    catch (ex) {
      Logger.log(ex);
      var failed = GmailApp.getUserLabelByName("Failed");
      // 登録失敗のラベルをつける
      message.getThread().addLabel(failed);
      continue;
    } finally {
      // 既読にして処理済みとする
      message.markRead();
    }
  }
}
```

## 本文やタイトルから予定に必要な情報を取得する

タイトルと本文を取得したあとは[正規表現チェッカー](https://www.softel.co.jp/labs/tools/regex/) で頑張ります。

```javascript
// タイトルと本文を取得する
var subject = message.getSubject();
var body = message.getBody();
// あとは正規表現で頑張る。
var order = body.match(/---------------お申込情報--------------([\s\S]+)決済方法/)[1];
var location = order.match(/会場 ?:[\s]+(.+)/)[1];
var title = order.match(/公演名 :[\s]+(.+)/)[1];
var date = order.match(/([0-9]+年[0-9]+月[0-9]+)日\([月火水木金土日]\)/)[1].replace(/[年月]/g, "/");
var time = order.match(/[0-9]+:[0-9]+/g);
var starts = new Date(date + " " + time[0]);
var ends = new Date(date + " " + time[0]);
ends.setHours(ends.getHours() + 2);
 
var result = { title: title, starts: starts, ends: ends, metadata: { location: location } };
```

## トリガーの構成

実行する関数を決めて、トリガーを設定します。今回は処理時間がシビアではないもののできればすぐ確認したいので、実行間隔5分おきとしています。

![スクリーンショット 0001-12-14 15.03.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7589/9d84911a-c0b7-e929-77fc-fcc86775858d.png)


# その後

実行してみると無事登録できました。ただ、たまに書式が変わるので登録に失敗することがあるので、定期的にメンテナンスが必要ですね。。。。
Python学習ノート_000

　Pythonを勉強しようと何回も思ったのに行動しなかった。

　最近は[「人気プログラミング言語、PythonがJavaを抜き2位に--GitHub「Octoverse」レポート」](https://japan.zdnet.com/article/35145190/)という新聞を読みました。（１位はJavaScript）

　**Pythonは絶対に学ぶべき理由は下記の３つがあります。
全部は私に対して魅力的です。**

- [x]  Pythonは稼げるプログラミング言語  
 :thumbsup_tone4: *私はお金が欲しい（副業でもいい）*
- [x]  AIエンジニアになれる  
:thumbsup_tone4: *私はAIに対して興味がある*
- [x]  文法がシンプルで書きやすい  
:thumbsup_tone4: *私はそんなに勉強する時間がない*
 
このために、本を一冊購入して独学はじめました。
[「Head First はじめてのプログラミング 
―頭とからだで覚えるPythonプログラミング入門」](https://www.amazon.co.jp/dp/4873118743/)  
**Qiita**を選ぶ理由は会社に仕事のため技術アーティクルを検索時には一番出て参照できるのは**Qiita**です。この**Qiita**を利用して学習の履歴を残ります。
raspberry pi4 の初期設定 (pi 無効化、ssh 認証変更、IP固定化) とカメラ回り(raspivid、ffmpeg)

ただの忘備録です。マウスとキーボード無しで画面を出してカメラのテストをする場合は、自動ログインにしておくこと。

## pi3 からの変更点

- **重要:** HDMI コネクタが Mico になった。
- **重要:** 電源コネクタが USB-C になった。

## pi アップデート
https://qiita.com/tanuwo/items/04df160281153c0e24bc

    sudo apt update
    sudo apt upgrade -y
    sudo shutdown -r now

## pi アカウント無効化
アカウント名を変更して対処
https://qiita.com/kenchang/items/849c82f16ba5eafe070d

削除して追加
https://makezine.jp/blog/2017/09/secure-your-raspberry-pi-against-attackers.html

## IP固定化
https://qiita.com/BearcubThaw/items/cde2494556d609115fb6

## SSH認証変更(鍵認証)
https://wings2fly.jp/yaneura/raspberry-pi-ssh-by-key-authentication-method/

## pi カメラ v2 を使う
https://www.pc-koubou.jp/magazine/17276

カメラ生存確認

    vcgencmd get_cammera

静止画撮影

    raspistill -o hoge.png

動画撮影

    raspivid -o hoge.h264 -t 10000 -fps 30
    raspivid -o hoge.h264 -w 1920 -h 1080 -t 10000 -p '100,100,1920,1080' -fps 30

再生

    omxplayer hoge.h264

h264 で録画すると fps は何を指定しても見掛け上は 25fps になる。25fps でない動画をそのまま vlc media player などで再生すると fps が 25 で再生されるため、正常な表示にならない。正常に表示させるためには、ffmpeg などで -vf fps=30 などと指定してやってから、fps のデータが有効な mp4 などのフォーマットに変換する必要がある。

変換方法は https://qiita.com/kitar/items/59f80bba2ca997e0f5e6 より。

    ffmpeg -i hoge.h264 -movflags faststart -vcodec libx264 -acodec libfaac -vf fps=30 hoge.mp4
【GitHub Actions】tags-ignore, branches-ignoreで指定していないタグ、ブランチでワークフローが動かない問題の解決法

GitHub Actionsで特定のタグもしくはブランチにpushされた場合のみ、ワークフローを実行しないようにしようとした際にハマったのでその内容と解決策を記載しておく。

# 特定のタグやブランチではワークフローを実行しないようにしたかった

GitHub Actionsで、特定のタグもしくはブランチにpushされた場合のみ、ワークフローを実行しないようにしたい場合、以下のように設定すると思う。

`v1.0.0` などのタグがpushされた場合は実行させない場合

```yml:workflow.yml(tags-ignore)
on:
  push:
    tags-ignore:
      - 'v*.*.*'
```

`dev` ブランチにpushされた場合は実行させない場合

```yml:workflow.yml(branches-ignore)
on:
  push:
    branches-ignore:
      - 'dev'
```

上記の設定を行うことで特定のタグ(`v1.0.0`など)やブランチ(`dev`)ではワークフローが実行されなくなる。

# 未指定のタグやブランチでもワークフローが実行されない問題が発生

しかし、上記の設定の場合、以下の問題が発生する。

- `workflow.yml(tags-ignore)`：タグに対するpushにしか反応しなくなり、**`dev` ブランチなどにpushした場合に実行されない。**
- `workflow.yml(branches-ignore)`：ブランチに対するpushにしか反応しなくなり、**`v1.0.0` などのタグにpushした場合に実行されない。**

すなわち、**`tags-ignore`ではブランチへのpush**、**`branches-ignore`ではタグへのpush**に対してワークフローが実行されない。

# 解決策

GitHub Actionsの仕様に、この動作について記載がないように見えたので、サポートに問い合わせてみた。
その結果、以下のように設定を変更することで、特定のタグやブランチのみを実行対象から外すことができると回答いただいた。

`v1.0.0` などのタグがpushされた場合は実行させない場合

```yml:workflow.yml(tags-ignore)の改善後
on:
  push:
    tags-ignore:
      - 'v*.*.*'
    branches:  # 追記
      - '*'    # 追記
```

`dev` ブランチにpushされた場合は実行させない場合

```yml:workflow.yml(branches-ignore)の改善後
on:
  push:
    branches-ignore:
      - 'dev'
    tags:     # 追記
      - '*'   # 追記
```

すなわち、 **対象外にしたいものがタグの場合は全ブランチに対して実行するよう** に、 **ブランチの場合は全タグに対して実行するよう** に **明示的に記載** すればよい。

これは仕様上、**`tags-ignore` や `branches-ignore` を指定した場合、デフォルトでブランチやタグが無視される** ようになっているためとのこと。

# まとめ

真に特定のタグやブランチに対するpushに対してのみ、ワークフローを実行したくない場合は、以下のようにすればよい。

- 特定のタグのみ実行対象外にしたい場合：`tags-ignore` と `branches` を併用
- 特定のブランチのみ実行対象外にしたい場合：`branches-ignore` と `tags` を併用
Run Crowi on CentOS7 x GCP

幾通りか試したが、うまくいった方法。Crowi興味ある。サクッと試したい人向け。
CentOSだとバイナリ取ってきて起動が早いかも？

追記：少し試して、Crowiはサブドメイン運用ができないとわかったため、個人的にはあまりお勧めできなくなってしまった。（https://github.com/crowi/crowi/issues/162)

## GCP要件
n1-standard1以上**必須**。f1, g1は`npm install`でお亡くなりになったので。

```bash

yum -y install git-core
```

## nodejs 10.xのバイナリを取ってくる
11.xだとダメみたい？ここから。https://nodejs.org/dist/latest-v10.x/

```bash
cd #$HOMEへ
curl https://nodejs.org/dist/latest-v10.x/node-v10.18.1-linux-x64.tar.gz -o nodejs.tgz
mkdir nodejs && tar xfz nodejs.tgz -C nodejs  --strip-components 1
echo "export PATH=$PATH:$HOME/nodejs/bin" >> .bashrc
source ~/.bashrc
```


## crowi ビルド、インストール

```bash
cd #$HOMEへ
git clone --depth 1 https://github.com/crowi/crowi.git
cd crowi
npm install
npm run build
```


## mongoのバイナリを取ってくる

ここから。https://www.mongodb.com/download-center/community

```bash
cd #$HOMEへ
curl https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.2.tgz -o mongo.tgz
mkdir mongodb && tar xfz mongo.tgz -C mongodb --strip-components 1
echo "export PATH=$PATH:$HOME/mongodb/bin" >> ~/.bashrc
source ~/.bashrc
sudo mkdir -p /data/db && sudo chown $USER /data/db
```


## mongodb起動

mongoは普通に起動するとjournalingが起動してディスクを食べていくようだ。
なのでジャーナリングなしで起動する。

```bash
mongod  --nojournal
```


## crowi 起動
```bash
cd $HOME/crowi
npm start
```


## ポートフォワードして、ローカルから繋ごう


ブラウザから`localhost:3000`で繋がる。

```bash
gcloud compute ssh instance-1 -- -N -L 3000:localhost:3000
```


## 疑問

動いたCrowiのバージョンはdevが取れないんだよなぁ。。masterブランチはdev版てこと？

```
Crowi Version
1.8.0-dev
```
こちらのリリース版を取ってきた方がいいのかも。
```https://github.com/crowi/crowi/releases/tag/v1.7.9```
Ruby on rails helperの役割

##helperの役割
viewで使うメソッドを定義することです。
helperにメソッドを定義することで、viewがDRYになります。

##helperをviewに呼び出す方法
viewでhelperにあるメソッドを指定します。

例として、`application.html.erb`にhelperで定義したメソッドを呼び出してみます。

```application_helper.rb
def full_title
 "full_title"
end
```

```application.html.erb
<title><%= full_title %></title> 
```
viewで"full_title"が表示されます。
年末まで毎日webサイトを作り続ける大学生 〜57日目 JavaScriptのクロージャーとプロトタイプを学ぶ〜

##はじめに
こんにちは！@70days_jsです。

クロージャーとプロトタイプを学びました。

57日目。(2019/12/14)
よろしくお願いします。

##サイトURL
https://sin2cos21.github.io/day57.html

##やったこと
クロージャーとプロトタイプを学びました。
![test3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/739f1cb8-ff93-5c5f-0ba8-20fc4c58d8ec.gif)

中でクロージャーとプロトタイプを使っています。

html

```html
  <body>
    <div id="text">count数:</div>
    <input type="button" id="button" value="button" />
    <div id="object">object Method:</div>
  </body>
```

javascript

```javascript
//クロージャー

function displayText() {
  let text = document.getElementById("text");
  let count = 0;
  return function() {
    count++;
    text.innerHTML += "<br>" + count;
  };
}
let count1 = displayText();
let count2 = displayText();

count1();
count1();
count2();
count2();
count2();
//____________プロトタイプ___________

let button = document.getElementById("button");
let object = document.getElementById("object");
button.addEventListener("click", createMyObject);

function createMyObject() {
  let userName = prompt();
  if (!userName) {
    userName = "nanashi";
  }

  function Human(name) {
    this.name = name;
  }

  Human.prototype.greet = function() {
    object.innerHTML += "<br>greet: Hello!" + this.name;
  };

  Human.prototype.sayName = function() {
    object.innerHTML += "<br>sayName: I' am " + this.name;
  };

  let user = new Human(userName);
  user.greet();
  user.sayName();
}
```

###クロージャー

まずクロージャーの方ですが、これは以下のような形をしています。

> function displayText() {
  let count = 0;
  return function() {count++;}
}

関数displayText()のなかに変数countと、無名関数があります。
その後、関数を変数に入れています。↓

> let count1 = displayText();
let count2 = displayText();
count1();//1
count1();//2
count2();//1
count2();//2
count2();//3


こうすることで、countの数はcount1とcount2で別々にカウントされます。
関数displayText()のなかに変数countと、無名関数を入れて操作することで、外部からcountは操作されずに、count1とcount2を使って別々にcountを増やしていくことができます。

個人的にクロージャーとは、**「自分を囲むスコープ内で宣言された変数に参照できる関数」**である、

と解釈しています。


ちょっとまだ完璧に理解できた自信がないので、もし間違った認識でしたらご指摘よろしくお願いいたします。


###プロトタイプ

まず前提として、「JavaScriptにおいてオブジェクトとは、連想配列である」という認識です。
さらに、オブジェクトの生成方法にクラスタイプベースと、プロトタイプベースの二種類があるという認識です。

それで、JavaScriptはプロトタイプベースの方に属します。

以下の部分がコンストラクタです。

> 
  function Human(name) {
    this.name = name;
  }

newを使いオブジェクトを生成しています。

>let user = new Human(userName);

メソッドの追加は以下のように行います。

> Human.prototype.greet = function() {...};

追加したメソッドはオブジェクトを格納している変数を経由して使えます。↓

> user.greet();



##感想
低迷中...
飛躍の前のしゃがみこみだと信じて頑張ろう。

最後まで読んでいただきありがとうございます。明日も投稿しますのでよろしくお願いします。

##参考
1. [クロージャ - JavaScript | MDN] (https://developer.mozilla.org/ja/docs/Web/JavaScript/Closures)
2. [や...やっと理解できた！JavaScriptのプロトタイプチェーン - maeharinの日記] (https://maeharin.hatenablog.com/entry/20130215/javascript_prototype_chain)

参考にさせていただきました。ありがとうございます。
opencvを用いた特徴量の検出（コーナー検出）

#はじめに
opencvを用いて画像の特徴量の検出について。今回はコーナー（曲線など）の検出をしていく。
2パターンの検出方法を行う。
基礎的なことについては、以下のページ参照
[Pythonによる二値化画像処理の基本](https://qiita.com/jin237/items/04ca3d0b56e10065c4e4)⇒https://qiita.com/jin237/items/04ca3d0b56e10065c4e4

#やってみよう
opencvを用いるが、コーナー検出には2つの方法がある。
###"cv2.cornerHarris"によるコーナー検出
エッジがあらゆる方向に高い輝度変化を持つ領域として想定。

```python
#サンプル画像からコーナーの検出
import matplotlib.pyplot as plt
%matplotlib inline
import cv2


#画像読み込みと二値化
img = cv2.imread("sample.png",0)
#コーナーの検出
corners = cv2.cornerHarris(img, 3,1,0.04)
plt.imshow(corners, cmap='gray')
plt.savefig('gray_pltsample')
```

![gray_pltsample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533115/fa1cd282-09a0-bfc1-c713-09a0f103c0c4.png)

```
img = cv2.imread("sample.png", 0)
```
によって、画像の読み込みと同時に"0"が二値化画像としての読み込みを可能とする。
本来であれば、"cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)"のように書くこともできるが今回は処理を見やすくするために、この方法を使った。
matplotlibによって、表示と保存を行っている。
また、

```
corners = cv2.cornerHarris(img, 3,1,0.04)
```
については、
3 = 近傍画素範囲(blocksize)
1 = カーネルサイズ(ksize)
0.04 = Harris検出器フリーパラメータ(k)

blockSize - コーナー検出の際に考慮する隣接領域のサイズ．
ksize - Sobelの勾配オペレータのカーネルサイズ．
k - 式中のフリーパラメータ．

理論については、[Harrisコーナー検出](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_feature2d/py_features_harris/py_features_harris.html)を参照。


###"cv2.goodFeaturesToTrack"によるコーナー検出

```python
import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('sample.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

corners = cv2.goodFeaturesToTrack(gray,100000000,0.01,10)
corners = np.int0(corners)

for i in corners:
    x,y = i.ravel()
    cv2.circle(img,(x,y),3,255,-1)

plt.imshow(img),plt.show()
```
![gFTT_lenna.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533115/e8a6d1ed-e4ce-3685-3b2b-59f9251a8ee1.png)

特徴点に対して、点を打つことができる。今回は多めに設定してみたが、あまり結果に対する変化はない。この赤点を工夫してみれば、もう少しわかりやすくなったりするかもしれない。

#さいごに
コーナーの検出を行った。簡単にできることなのでぜひ理論も含めて、理解してみるといい。上記の紹介したもの以外にもあるので、ほかの記事で書いてみようと思う。
Firestoreの対話型シェルをいきなり起動する

Firestoreでちょっとしたクエリの実験するときにNode.jsのREPL(Read-Eval-Print-Loop)使って対話型シェルを利用している人は多いと思います。その時、毎回`node`コマンドを実行したあとに`.load スクリプト名`などとして接続をしている人はまさかいませんね? 人によってやり方は様々だと思いますが私のスクリプトを以下に貼っておきます。


```javascript:db
#!/bin/bash                                                                                                                                                                     
node --require await-outside/repl -i -e "                                                                                                                                                                    
  const firebase = require('firebase-admin');
  var serviceAccount = require('./.service-account.json');
  firebase.initializeApp({
      credential: firebase.credential.cert(serviceAccount)
  });
  var db = firebase.firestore();
"
```

このスクリプトを開発環境のFirebaseプロジェクトのトップにでも設置しておけば`./db`のコマンドでFirestoreへの対話型シェルが出現します。以下のような感じで実行できます。便利でしょ?

```bash
$ ./db
> await db.collection('tests').doc('hoge').set({name: 'oreore'});
WriteResult {
  _writeTime: Timestamp { _seconds: 1576307204, _nanoseconds: 63907000 } }
> (await db.collection('tests').doc('hoge').get()).data()
{ name: 'oreore' }
```

### 設置方法

設置方法を簡単に開設しておきます。やるべきことはパッケージのインストールとFirebaseサービスアカウントのキーの配置です。

#### パッケージのインストール

ここで使うのはこの2つ

```bash
npm i firebase-admin --save
npm i await-outside --save
```
サクッとインストール。

#### サービスアカウントのキーの配置

Firebaseコンソールにログインしてサイドメニューの`Settings>ユーザーと権限`からたどって`新しい秘密鍵の生成`をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10446/4c74b33f-86aa-2a45-6c4f-297371347705.png)

ここから得られるjsonを`.service-account.json`という名前で、冒頭の`db`スクリプトと同じディレクトリに配置します。このファイルは機密情報を含んでいるので忘れずにgitignoreしときましょう。

あ、dbスクリプトに実行権限を与えることもお忘れなく。

以上

#### Special Thanks

* https://qiita.com/maruware/items/5aebea2f86f5e44a2591
* https://stackoverflow.com/questions/8425102/how-do-i-load-my-script-into-the-node-js-repl
thisでインスタンス内のデータにアクセス！ ❏Vue.js❏

メソッドを作る際に、インスタンス内のデータを利用したい時があります。
そこで使うのが`this`です。

<br>
開発環境はJSFiddleです。
https://qiita.com/ITmanbow/items/9ae48d37aa5b847f1b3b

#使い方
this.`インスタンス内のプロパティ`

`sayHi`メソッドでインスタンス内の`message`を返します。


```html:html
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<div id="app">
  <p>{{ sayHi() }}</p>
</div>
```

```javascript:javascript
new Vue({
  el: "#app",
  data: {
    message: "hello world!"
  },
  methods: {
    sayHi: function() {
      return this.message;
    }
  }
})
```

【出力結果】
`hello world!`

<br>
`this`はこれからたくさん使いそうだ。。。

<br>
ではまた！