OmniAICreator/Qiita-1.07M huggingface dataset:
macOS：ウィンドウを最小化するときのスローモーションを復活させる

## 背景
macOS El Capitanくらいまではウィンドウを最小化するときに，Shiftキーを押しながら最小化ボタンを押せばジニーエフェクトをスローモーションにできたのですが，今のメインマシンのMojaveで試したらできなくなってて少し悲しくなりました...　しかし復活させる方法がありました！

## 方法
Terminalにて
`$ defaults write com.apple.dock slow-motion-allowed -bool true && killall Dock`
を入力＆実行！

## 参考
[How to enable slow genie effect in macOS 10.13 High Sierra?](https://apple.stackexchange.com/questions/303106/how-to-enable-slow-genie-effect-in-macos-10-13-high-sierra)
RやRStudioでJava (jdk)のバージョンが高すぎてh2oライブラリが使えなかったのを解決した話

#動機
久しぶりに書いたと思ったらまたPATHの話です。
Mac向け。Winの人はごめんね。
学校でR環境下でh2oという深層学習ライブラリを使えという課題が出た際に私だけjdkのバージョンが引っかかって課題が進まなかったのを解決した怒りの手記。

#解決方法
#####R環境下で使うjdkのバージョンを下げる。以下、具体的手法。

####今Javaは何がいくつ入ってんの？

Rコンソールではなくターミナルを起動し、

```
/usr/libexec/java_home -V
```
と打ち込んで調べよう。入っているJavaのバージョンが全て出てきます。こういう感じです。
<img width="565" alt="スクリーンショット 2020-01-16 2.32.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204334/41006fa7-3681-b2a0-d364-0201428416e6.png">


####h2oライブラリが使えるjdkを持ってる？

h2oライブラリはjdkと協働します。このとき、jdkのバージョンが7から12の間じゃないとテコでも動かないようです。
最近のjdkのバージョンは13だよ！！！！！！！！

####対象のバージョンのjdkを持っていない人は手に入れよう
Javaのバージョンを確認したときに対象バージョンが入っていなかった人はダウンロード&インストールしよう。[公式サイトから手に入るぞ](https://www.oracle.com/technetwork/java/javase/downloads/index.html)(一番上で目立っている13ではなく中段にあるLTSの11をDLしよう)。

手に入れたら念のため、再びターミナルで

```
/usr/libexec/java_home -V
```
でちゃんと入ったか見てみてください。

####jdkのバージョンを下げよう
ここめちゃくちゃ注意してほしいんですが、ターミナルでJavaプログラムをいじるときに使うjdkと、R環境が参照するjdkのpathは違います。
以下の方法を使うと、普通に使うときのjdkのバージョンは13のまま、R環境下で用いるjdkのバージョンは11になります。やったね。

#### FinderでRenvironファイルを検索
　RenvironファイルはR環境における.bash_programみたいなもののようです。R (とRStudio)を導入していればこのファイルがあるはず。これを適当なエディタで開いて、一番下にでも

```
JAVA_HOME=/Library/Java/JavaVirtualMachines/openjdk-11.0.2.jdk/Contents/Home
```

と書き込みましょう。

####完了！！
以上です。これでRが参照するjdkがダウングレードしました。
Rコンソールで

```R:
library(“h2o”)
localH2O = h2o.init(ip = "localhost", port = 54321, startH2O = TRUE, nthreads = -1)
```

とでも打ってみてh2oを使ってみましょう。
なんかh2o自体のバージョンが古いとかなんとか言われますが、使用自体はできます。

お疲れ様でした。

#追記
現在配布されているLTS11は11.0.2ではなく11.0.6のようです。手に入れたバージョンをしっかり確認して、都度PATHを変更して使ってください。
回路シミュレータ Qucs in Ubunt18.04

# Qucsとは
回路シュミレータの一種

# 環境
Ubuntu18.04

(今回入れたのは Qucs0.0.18)

# Install
基本的に[github](https://github.com/Qucs/qucs)のREADMEを見ればいける

まず

```bash
sudo apt install build-essential
sudo apt install libqt4-dev libqt4-qt3support
sudo apt install automake libtool libtool-bin gperf flex bison
```

[ここ](https://sourceforge.net/projects/qucs/files/qucs/)から好きなバージョンをダウンロード

展開

```bash
tar xvfz qucs-0.0.18.tar.gz
cd qucs-0.0.18
./configure
sudo make install
```

# 起動
bashで `qucs`

# バグ(?)
起動はできたがアイコンが表示されない...

---

`simulation`を押すと
>/usr/local/bin/qucsator: error while loading shared libraries: libqucs.so.0: cannot open shared object file: No such file or directory

とエラーを吐いた
どうやらライブラリを読み込めていないみたいなので

```bash
sudo ldconfig
```

で解決した(多分rebootしても解決する)

---

# 参考
- [Qucs(github)](https://github.com/Qucs/qucs)
- [#131 qucsator does not see the libqucs.so.0](https://sourceforge.net/p/qucs/bugs/131/)
ネットサークル「TeamKitten」のメンバー管理APIをNodeで書き直した

[TeamKitten](https://teamkitten.tk)というインターネット上のサークルのリーダーをやっている[TinyKitten](https://tinykitten.me)です。

最近goa(v1だったかな)で書いていたメンバー管理用APIをNode.js(NestJS)で書き直したことと、エコシステムについて書いていきます。

**晩酌中に書いてるので普段以上に文が意味不明になってるかと思いますがご容赦ください。**

## そもそもなぜ移行したか？
いままでgoaというGolangで書いたDSLをよしなにSwaggerと実装テンプレートに落とし込んでくれるすぐれものを使っていました。が、
**突然のアップデートでgo getすらできなくなる**
という事態が発生ししばらく安定して動くコードで騙し騙しで動かしていました。
しかし、APIにバグが見つかりどうにも現行コードベースでは修正できないと判断し移行した次第です。

## goaをアップグレードすればよかったのでは？
それもそうなのですが、goa自体にそれほど固執がなかったのと、チーム内にGolangを書けるメンバーがいなかったのでNode.jsを使ったNestJSフレームワークに白羽の矢が立ったわけです。
それにデザインから書くのが割と面倒だったので。デザインから書くことで助かったことも割と多かったですが、うちのAPIはそこまでクリティカルなものではないので。

## NestJSとは？
NestJSとは、AngularにインスパイアされたサーバーサイドNode.jsフレームワークです。
Angularにインスパイアされたということで、書き方もほぼAngularです。
仕事でAngularを長年（というほどでもない）使っているので、割とすんなり書ける感じでそこも選ぶ要因の一つでした。

## スタックはどのように変わった？
![teamkitten-gcp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244632/51c1e73f-6b5c-62e0-3e1f-54204247ea9a.png)
goaを使っていたときはGCPを使っていました。なんとなくGoogleに揃えたかったのと、AWSのコンソールが複雑怪奇だと当時思ってたからです。
上記の図の通り、シンプルにすべてのTeamKitten内部サービスからGAEのAPIにアクセスし、バックではデータベースにCloudSQL(MySQL)、オブジェクトストレージにCloudStorageを用いていました。
今はどう変わったかというと、単純にAWSになりました。(ALBとかRoute53も増えてますが...)
![teamkitten-aws.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244632/cfad62ca-aaca-0275-26eb-00ec030f2540.png)
このような図はあまり書いたことがなく見づらくて恐縮です。
ポータル、[公式サイト](https://teamkitten.tk)、すごいBOT等のエコシステムにAPIをつないでいます。（後述）
費用に関しては、個人的な機械学習に使ったEC2も混じっているのではっきりとは言えませんが、今の時点で\$100程度請求されています。（多分\$30くらいが機械学習）
GCPのときは\$50しませんでした。費用削減の余地はありそう。

## 良かった点は？
仕事ではTypeScript・Angularを扱っているのでスムーズに書ける点でした。
NestJSのドキュメントは割と充実しているので英語さえ多少読めればすぐに扱えます。
テストコードもだいたいAngularっぽいです。(JasmineがJestになってますが）

## 苦労した点は？
仕事柄、GoよりもJavaScript(ここではTypeScript)を扱うことの方が慣れているので、割とサクサク書くことができました。
が、強いて言うならTSLintを怒らせたくないがためにレスポンスのスネークケースをキャメルケースに置き換えたり、最初からデザインから書くわけではないのでSwaggerがまだ整備できていない点でしょうか。（多分クライアントを作るのは自分だけなのでそれほど必要はないですが)

## エコシステムのポータルとは？
![FireShot Capture 006 - TeamKitten Portal - portal.teamkitten.tk.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244632/9a9908aa-2d3f-2940-ef62-2b88c5d2580e.png)
メンバーの方々がログインして、自己紹介・アイコン・スクリーンネーム（ログイン用に使える名前）・カバーイメージなどを自主的に変更できるチーム内サービスです。
EXCメンバー（一般メンバーより偉いメンバー）は他の人のパスワード、担当を変更できたりします。
リーダー権限のメンバー（自分だけ）は、メンバー削除、権限降格・昇格などが可能にしてます。
また、監査という機能を新APIには実装して、誰が誰の情報をいじったかを可視化できるようにしました。これで権限を使って勝手なことをするメンバーがいたとしても、すぐに検出できます。（この機能は上位メンバーのみ見れます）
このサービスは今まではNuxt.jsで書かれていましたが、自分の個人的な趣向とまともなUIフレームワークを欲していたのでIonic 4にしました。
![FireShot Capture 007 - TeamKitten Portal - portal.teamkitten.tk.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244632/8cff570b-da35-883e-8a48-1522a81b97dc.png)
新APIに対応させるために改装中です。

## エコシステムのすごいBOTとは？
これに関してはチーム内の機密情報なのですが、DiscordのBOTです。まあおもちゃみたいな存在とだけ言います。あとはメンバーの照会ができます。

## まとめ
適当に取り留めもなく書いてしまいましたが、Node.js化して正解でした。
メンバーもNode.jsならできるという方もいますし、個人的にもTypeScriptが一番しっくり来るので良かったです。

## GitHub
[サークルの公式GitHubチーム](http://github.com/teamkitten)
[API](https://github.com/TeamKitten/API)
[Portal](https://github.com/TeamKitten/AngularPortal)
UE4ぷちコン「映像編」に参加しました

ぷちコン映像編に参加しました。
コンテストのテーマが「日の出」なので、太陽が存在しない世界に太陽が産まれる瞬間を作品にしました。

映像なので、処理負荷とか考えなくて良いし気楽そうとか思っていたら、意外につまずいたところがあったので、ちょっとした知見をUE4の映像制作に興味がある人に向けて書いておこうと思います。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ぷちコン映像編に応募しました！<a href="https://twitter.com/hashtag/UE4?src=hash&amp;ref_src=twsrc%5Etfw">#UE4</a><a href="https://t.co/796hrkhgvo">https://t.co/796hrkhgvo</a> <a href="https://t.co/cstuxSduwg">pic.twitter.com/cstuxSduwg</a></p>&mdash; altalt (@altalt_jp) <a href="https://twitter.com/altalt_jp/status/1216814746323668992?ref_src=twsrc%5Etfw">January 13, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# シーケンサー
Shotトラックを使って、シーケンサーでカット割りを行いました。
最初、カメラトラックだけでやろうとして、カメラが増えてごちゃごちゃになっていましたが、Shotトラックを使ってスッキリさせることができました。
一番上の階層に音楽をおけば、Shotを動かしても各Shot内で音楽がきちんと再生されるのが便利でした。

![Sequencer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390524/dbccc858-9897-dc31-3513-30d96ae38005.png)

各Shotで必要なアセットはサブレベルに分けてLevelVisibilityで管理しました。
サブレベルはデフォルトではロードされないので、Always Loadedに設定するか、BPでよんであげる必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390524/e904af14-18bd-63e9-1237-bb93b0dae5ab.png)

あとはレベルBPとかで再生すれば、Playを押したときに流れるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390524/4a6fa3b2-4b56-942d-b4f9-2b358f127eba.png)


# パーティクル
最初、パーティクルの発生位置を動かしていたのですが、そうすると下の絵のように流れていってしまうという残念な感じになりました。

![Niagara.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390524/82e8e6fc-b7c3-a6a5-28d6-063f6f57c777.png)

そこで、発生位置は変えず背景全体を下にスクロールするという方法でしのぎました。

![Niagara2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390524/0313c1c6-eee6-355e-1d64-20eef50fbbf8.png)

あとカットが変わるときにパーティクルを発生させると、いきなり散っている状態にならなかったので、見えないところで少し前から発生させるなどしています。
これはTickを無理やり回すとか、Niagaraの設定とか他の方法がありそうな気がしますが時間もなかったので今回はいろいろ力技です。

# サビの追加
ロボットを錆びさせたかったのですが、使用したParagonのマテリアルはけっこう複雑な組み方をされていて、テクスチャもエクスポートできないようになっていたので、ちょっと困りました。
ただ、テクスチャをよく見ると、Curvatureマップっぽいものが見つかったのでこのあたりを使って、Megascanのサビマテリアルを最終結果にBlendしたら意図した感じになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390524/5d206fc6-eef4-9528-9073-824b9858549a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390524/2717c6cb-2a9f-aed1-c05a-1edc0068ef2a.png)

# 最後に
思っていたよりいろいろ難しいところもありましたが、リアルタイムにすごい画をバンバンだしてくれるので熱中することができました。
また、UEのマテリアルエディターが2Dにも3Dにもとにかく強力なので、これもUEで映像制作する強みだと思います。
シーケンサーにMaterial Parameter Collectionトラックが用意してあるので、マテリアルの制御も簡単です。
ただ、UEに慣れていない人がUMGとかPostProcess Materialを触るのは大変かと思うので、ちょっとした効果を足すのにシーケンサーに2Dレイヤーが欲しいなと思いました。
機会があればまた映像制作にも挑戦してみたいです。
webpackerを高速化した話

webpackerの高速化をしようと色々試したら、灯台下暗しだったひとのお話。

### 環境
rails5.2.3
rails/webpacker v4.2.2
capistrano v3.x

# あらまし
デプロイがクッッッッッッソ遅い
デプロイ1回につきアセットのビルドに早くても200秒程度かかる。キレそう。
まあ待てないこともないけど結構辛い
とくにjs関係ないfixのデプロイに数分待たされるのはかなりしんどい

## 1) sourcemapをオフ
webpackのsourcemapを作ってる時間って割と長い。
自分の場合、200秒のデプロイ時間のうち、100秒くらいはsourcemapの作成に取られてた
高速化の手段としては有効だと思うけど、sourcemap消したくなかったので今回はパス
あとwebpackerでこの設定いじるのはなかなかめんどくさいので、webpackerマンは覚悟した方がいい

https://webpack.js.org/plugins/terser-webpack-plugin/

## 2) SplitChunksPluginでよしなに
webpackの便利機能に[SplitChunksPlugin](https://webpack.js.org/plugins/split-chunks-plugin/)っていうのがある。詳しくは知らんけど。
アプリケーションとライブラリでチャンクを分けるとかするといいらしいって先輩が言ってた
しかしwebpackerでこの設定いじるのなかなかめんどくさいんだよなぁ(2回目)、ということでパス
誰か脱webpackerしやすいライブラリをつくってくれ〜〜〜

https://webpack.js.org/plugins/split-chunks-plugin/

## 3) public_output_pathをsharedにする
最終的に行き着いたのがこれ

```ruby:deploy.rb

...

# Default value for linked_dirs is []
# public_output_pathに指定しているディレクトリを追加(今回は"public/packs"になってる)
append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system", "public/packs"

...

```

capistranoだと、linked_dirsを設定するとそのディレクトリがsharedになる(=バージョンに関わらず共通のディレクトリになる)のだが、そこにpublic_output_pathを追加していなかった。要はwebpackの結果を毎回0から作り直していてた。(・ω<) てへぺろ☆
この設定をすると正しくキャッシュが効くようになったようで、3分はかかってたビルドが最短30秒くらいで済むようになった

ここからは余談。
いま扱っているプロジェクト、実は脱Sprocketsもできてないのだが、デプロイ時にSprocketsはキャッシュっぽい挙動をしてるのに、webpackerはしていない、もしかしてwebpackerキャッシュしてないのでは？と気づいたことからこの策が浮上した。
ちなみにSprocketsのキャッシュ先はデフォルトのpublic/assets以下なのだが、これをlinked_dirsに入れた覚えはない。じゃあどこで？と調べて見ると、[capistrano/rails](https://github.com/capistrano/rails)で `require 'capistrano/rails/assets'` するときによしなにしてくれていた。いや、webpackerもよしなにしろよ！！！

あと、今の所副作用はないけど、webpackの挙動全然知らないマンなので、このやり方まずいですよ！って感じだったら教えてください

# 結論
誰か脱webpackerしやすいライブラリをくれ！！！(懇願
Optunaを用いて RF or lightGBM を最適化

## 個人的な備忘録

Boston住宅価格データを使用

``` model.py
# !pip install optuna lightgbm
from functools import partial

import optuna
import lightgbm as lgb

from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_validate
from sklearn.metrics import mean_absolute_error
from sklearn import datasets

def objective(X, y, trial, clf = 'RandomForestRegressor'):
    """最小化する目的関数"""
    
    if clf == 'RandomForestRegressor':
        # RF のとき
        params = {
            'n_estimators': int(trial.suggest_loguniform('n_estimators', 1e+2, 1e+3)),
            'max_depth': int(trial.suggest_loguniform('max_depth', 2, 32)),
        }
        model = RandomForestRegressor(**params)
    
    
        kf = KFold(n_splits=5, shuffle=True, random_state=42)
        scores = cross_validate(model, X=X, y=y, cv=kf, n_jobs=-1, scoring='neg_mean_absolute_error')
        score = -1*scores['test_score'].mean()
        
    
    elif clf == 'LGB':
        # LGB のとき
        params = {
            'objective': 'regression',
            'max_bin': int(trial.suggest_int('max_bin', 255, 500)),
            'learning_rate': 0.05,
            'num_leaves': int(trial.suggest_int('num_leaves', 32, 128)),
            'metrics': 'mae'
        }
        
        lgb_train = lgb.Dataset(X, y)
        res = lgb.cv(params, lgb_train, num_boost_round=1000, early_stopping_rounds=10, nfold=5, shuffle=True, stratified=False, seed=42)
        score = res['l1-mean'][-1]

    return score

def main(): # 例としてボストンの住宅価格データを使用
    dataset = datasets.load_boston()
    X, y = dataset.data, dataset.target
    f = partial(objective, X, y)
    study = optuna.create_study()
    study.optimize(f, n_trials=30)
    print('params:', study.best_params)


if __name__ == '__main__':
    main()

```
【Unity】[Serializable]なSoundPlayerという名前のクラスを作るとビルドは通るがAndroid実機で落ちる

##はじめに
タイトルままです。
調べても対処法が出てこず、2時間ぐらい詰まったのでメモ。
##環境
**開発環境**
Unity 2019.2.17f1
Windows 10
**確認Android環境1**
FireHD 10(Fire OS 5.3.7.0)
**確認Android環境2**
BlueStacks4(OnePlus 5)

##エラー本文
```logcatで怪しかったところ.txt
01-15 01:46:13.567: E/Unity(15508): The file '/data/app/com.XXX.XXX-2/base.apk/assets/bin/Data/level0' is corrupted! Remove it and launch unity again!
01-15 01:46:13.567: E/Unity(15508): [Position out of bounds!]
```

##解決法
[System.Serializable]なSoundPlayerというクラスの名前を別のものにする（今回はSoundProviderという名前にリネームして解決）

**Before**

```SoundPlayer.cs
namespace Hoge
{
    [System.Serializable]
    class SoundPlayer{
        [SerializeField]
        AudioClip hogehoge;
~~中略
```
**After**

```SoundProvider.cs
namespace Hoge
{
    [System.Serializable]
    class SoundProvider{
        [SerializeField]
        AudioClip hogehoge;
~~中略
```

##原因
正直よく分からないですが、元々System.Media名前空間にSoundPlayerというクラスがあります。
>SoundPlayer クラス (System.Media) | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/api/system.media.soundplayer?view=netframework-4.8

おそらくですが[Serializable]ではない同名のクラスが存在するとこのエラーが発生すると考えられます。apk起動時にシーン内のオブジェクトに紐付いたHoge名前空間のSoundPlayerをSystem.Media名前空間内のSoundPlayerでデシリアライズしようとしているとか。

##おまけ：解決に至るまで試したこと
上記のエラーをググるとエディタ関係のエラーで参照が切れていると発生するといった記事が出てきます。
が、検索結果に出てきた「LibraryとTempフォルダを削除」、「Reinportする」をしてビルドしても症状は変わらず。

この時点で完全に手詰まりで頭を抱えました。
Previewの「2D Pixel Perfect」パッケージを外してみたりしたものの改善せず。
音を付ける前は起動できていたので最近追加した音周りが怪しいということで音周りのコードを確認しました。
で、SoundPlayerという名前のクラスが別にあったので、自作のSoundPlayerの方の名前を変えたら解決しました。

当てずっぽうだったので、あんまり褒められたものではありませんが、なんとか前に進むことができました。
間違って消してしまった git stash を元に戻す（PowerShell）

# 前置き

ある時Gitに残ったStashを整理しようとVSCodeのGitLensを使って消していたのですが、うっかり作業中のStashまで消してしまいました。焦ってGoogle先生に助けを求めたところ、以下の記事に助けられました。

[git stashをコミットもなしに消してしまった時の対応 \- Qiita](https://qiita.com/shotakeu/items/430a09dddeeac444dcf6)

コマンドがMac向けでしたので、Windowsユーザの自分用にPowerShell向けに書き直してみました。

# 環境
* Windows 10
* PowerShell 6.2.2
* git version 2.17.1.windows.2

# 本題


まず、Git内にある宙ぶらりんのオブジェクトを確認します。
[Git \- システム管理](https://git-scm.com/book/ja/v2/Appendix-C%3A-Git%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89-%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E7%AE%A1%E7%90%86)

```powershell:powershell
> git fsck --lost-found
Checking object directories: 100% (256/256), done.
Checking objects: 100% (189/189), done.
dangling commit 5bb836c4a1ecfbcca27d87f66a53007380962efb
dangling commit 7c75d438ab033ddafe60833325b216e8b7355636
dangling commit 137af08c3282051d0ea00c62da76af6d5fb9ae3c
```

ここではcommitだけですが、blobなども出てきたりするのでフィルタをかけます。

```powershell:powershell
> git fsck --lost-found | ?{ $_ -match "commit" }
```
`?`は`Where-Object`のエイリアスです。（下で出てくる`%`は`ForEach-Object`です）
結果は上と同じですね。（サンプルが悪くて申し訳ないです）
こうして残ったコミットから残したいコミットを探し出すのですが、一々`git show`するのも手間なのでコミットIDを使って一覧にしてしまいます。

```powershell:powershell
> git fsck --lost-found | ?{ $_ -match "commit"} | %{ ($_ -split ' ')[2] } | %{ git show --no-patch $_ }
Checking object directories: 100% (256/256), done.
Checking objects: 100% (189/189), done.
commit 5bb836c4a1ecfbcca27d87f66a53007380962efb
Merge: 96ff14c ecb531e
Author: *********
Date:   Thu Oct 26 20:52:35 2017 +0900

    comment
commit 7c75d438ab033ddafe60833325b216e8b7355636
Author: *********
Date:   Thu Jan 16 01:35:01 2020 +0900

    test
commit 137af08c3282051d0ea00c62da76af6d5fb9ae3c
Author: *********
Date:   Thu Jan 16 01:35:36 2020 +0900

    test
```

こうして一覧にされた宙ぶらりんのコミット群の中から該当するコミットをチェリーピックします。

```powershell:powershell
git cherry-pick -n -m1 <commit id>
```

これでローカルに復活させることができました。めでたしめでたし。

サンプルに適当なローカルリポジトリでやりましたが、意外と2017年のコミットとか残っていたりするんですね。多少びっくりしました。


# 参考URL

* [git stashをコミットもなしに消してしまった時の対応 \- Qiita](https://qiita.com/shotakeu/items/430a09dddeeac444dcf6)
* [Look up commit log for commit ID in Git \- Stack Overflow](https://stackoverflow.com/questions/13398819/look-up-commit-log-for-commit-id-in-git/13398872#13398872)
Simulink API (5) 2種類のブロックプロパティとSimulinkモデルの動き その1

# 2種類のブロックプロパティとは

今回は、”Simulinkブロックパラメータ”の説明をしつつ、Simulinkモデリングの基本・重要な考え方を2回に分けて述べたいと思います。(文章力大事だね。。。)

Simulinkのブロックプロパティの値を取得する方法としてget_param関数があります。
例えば、図のGainブロックのゲイン値を取得したい場合、次のようになります。
![API6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324583/119853e1-c486-0b10-d5b9-3c739c609ddb.png)

```matlab:
gainValue = get_param(gcbh,'Gain')
gainValue =

    '5'
```
このプログラム自体は、どのブロックがどういう名前のプロパティを持っているか？がわかっていれば簡単なので、これ以上深堀りしません。

では、同じ図のGainブロックの出力信号のデータ型は同じget_paramを使ってどの様に取得すれば良いでしょうか?

```matlab:
portType = get_param(gcbh,'CompiledPortDataTypes')
portType = 

  0×0 empty struct array with fields:

    Inport
    Outport
    Enable
    Trigger
    State
    LConn
    RConn
    Ifaction
    Reset
```
はい、間違いです。何も得られませんでした。

Q : Gainブロックの出力信号のデータ型に設定したプロパティ値は何でしょうか？
であれば、次のコマンドで正解ですが、

```matlab:
get_param(gcbh,'OutDataTypeStr')

ans =

    'Inherit: Same as input'
```

「Gainブロックの出力信号のデータ型は」と問をたてているところがポイントです。

Simulinkは「シミュレーション実行が可能な」ブロックダイアグラムで手軽に実機レスなシミュレーション環境を構築できます。Simulinkブロックは、このシミュレーション実行可能なブロックライブラリで、プロパティ種別として2つのタイプがあります。

1. 静的なプロパティ
2. コンパイル型プロパティ

#### 1. 静的なプロパティ
静的なプロパティとは、シミュレーション実行に依らず、一意に定まるプロパティです。

#### 2. コンパイル型プロパティ
コンパイル型プロパティとは、シミュレーション実行直前にresolveされるプロパティです。
データ型、単位、次元、サンプル時間などのプロパティが属します。
では、先程間違えたコマンドの前に「シミュレーション直前」の状態を作ってからプロパティを取得してみましょう。

###### 手順1. コンパイル状態(シミュレーション直前状態)を作り、モデルをロックさせます。

```matlab:
feval(bdroot(gcs),[],[],[],'compile');
```
Simulinkのキャンバスがグレーになり、モデルの状態が"Compiled"となります。
データ型も更新されGainブロックの出力データ型はdoubleだった表示がint16になります。
![API7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324583/f2890378-4f4c-f058-c020-0073fb155096.png)

###### 手順2. コンパイル型のプロパティを取得します
```matlab:
portType = get_param(gcbh,'CompiledPortDataTypes')

portType = 

  struct with fields:

      Inport: {'int16'}
     Outport: {'int16'}
      Enable: []
     Trigger: []
       State: []
       LConn: []
       RConn: []
    Ifaction: []
       Reset: []
```

###### 手順3. コンパイル状態を解除します
```matlab:
feval(bdroot(gcs),[],[],[],'term');
```
はい、出来ました！一件落着。。。

「Simulinkってシミュレーション実行できる」っていうのが大切なんですよね。
Simulink APIを使ってプログラムを作成するときにも、Simulinkモデルは生き物のように扱わないと痛い目にあいます。


次回、その2へ続きます。

修正1:
Gainブロックの出力信号のデータ型に設定したプロパティ値のコマンドが抜けておりましたので、追加しました。
エンディアンについて学んでみた

※　今回は自分の備忘録的に描くので，内容は薄いです

プログラムを組んでいる際，以下のような現象が起こった．

* 行った事

FLASHから読み取ったバイナリデータを，Print文で表示した

* 結果

FLASHから実際に読み取ったデータと，Print文で表示したデータの順序が逆だった．

これの原因分からんとなったので，エンディアンについて調べることにした．

#エンディアンとは

２Byte以上のデータを保存する際に，どのような順序でデータを保存するかの種類をエンディアンで表している．

内容解説サイトは以下が1番詳しいと思う．
https://corgi-lab.com/programming/c-lang/warn-endian/

各エンディアンの種類については下記サイトの説明が分かりやすい
http://www.ertl.jp/~takayuki/readings/info/no05.html

どのエンディアンを採用しているかは，CPUのアーキテクチャ依存で決まる．
Windows10(Intel系)などはリトルエンディアンを採用しているらしい．
ARM系はどちらでもOKなバイエンディアンらしい．

#エンディアンの変換方法
以下サイトに変換用関数説明有り．
https://corgi-lab.com/programming/c-lang/warn-endian/

#ネットワークバイトオーダーを変換しないといけない理由

先ほど記載した通り，WIndows10(intel系）ではリトルエンディアンを採用している．
しかし，ネットワークの世界ではビックエンディアンが標準で採用されている．これは，インターネットができたばかりの時にビックエンディアンが多く採用されていたためである．
（この話は
http://wisdom.sakura.ne.jp/system/winapi/winsock/winSock4.html
参照）

今回はここまで．追記したくなったら追記する
未ログインのユーザに対して仮ユーザを作成しログインさせる

ユーザーが登録する前のアクティビティを、登録後に引き継ぎたいときに実装が必要になった。

# 選択肢
- サーバーで未ログインのアクティビティを保持する
  - ユーザーが登録する前に、ユーザーレコードを作成する
  - 登録時には、作成していたユーザーレコードを使い回す
- クライアントで未ログインのアクティビティを保持する
  - ユーザーが登録する前には、クライアントでアクティビティを保持しておく
  - 登録時には、クライアントで保持していたアクティビティをサーバーに引き継ぐ

クライアント側でアクティビティの記録を書き換えられると厄介なので、今回はサーバーでアクティビティを保持する手法を取った。当然ユーザーレコードが大幅に増えてしまうが、そこは許容した。

# Laravel のミドルウェアを使う
Laravelのミドルウェアを利用する。ミドルウェアを利用することで、アプリケーションにアクセスしたときにログイン状態でなければユーザーのレコードを作成し、ログインさせることが簡単にできる。

```bash
$ php artisan make:middleware RegisterIfNotAuthenticated
```

RegisterIfNotAuthenticated クラスは次のように書く。 `Auth::login($hogehoge)` によって `$hogehoge` インスタンスでログインさせることができる。 `$hogehoge` インスタンスのクラスは、 `Authenticatable` を継承している必要がある。

参考:http://recipes.laravel.jp/recipe/78

```php
<?php

namespace App\Http\Middleware;

use App\User;
use Closure;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;

class RegisterIfNotAuthenticated
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (!$request->user()) {
            $user = new User;
            $user->user_id = (string)Str::uuid();
            $user->name = '';
            $user->email = null;
            $user->email_verified_at = null;
            $user->password = null;
            $user->save();

            Auth::Login($user);
        }

        return $next($request);
    }
}
```

このミドルウェアによって、未ログインアクセスのたびにユーザーが発行される。
material-ui-dropzoneでapplication/octet-streamのMime typeが登録できなかった話

## 内容
ずっと出来ると思っていたcadファイルをアップロードしようと思ってやってみたら、拒否されてしまったのでそれを解決したお話

## 結論
acceptedFilesのjwwみたいな感じで拡張子を指定してあげればうまく出来たよ

```
<DropzoneDialog
    open={open}
    onSave={handleSave.bind(this)}
    dialogTitle={"ファイルをアップロードする"}
    acceptedFiles={['image/*', 'application/*, .jww , .dwg , .dxf , .jwc , .p21']}
    dropzoneText={"アップロードしたいファイルをドラッグアンドドロップするかクリックして選択ください"}
    cancelButtonText={"アップロードをやめる"}
    submitButtonText={"アップロードする"}
    onDrop={handleCheck.bind(this)}
    showPreviews={true}
    maxFileSize={5242880}
    onClose={handleClose}
            />
```
Mac でデフォルト NIC のプライベート IP アドレス を調べる方法

## デフォルトの NIC を調べる

有線 LAN と無線を同時接続している時など、複数 NIC がある場合、まずはデフォルトの NIC の名前を特定する必要があります。

```zsh
DEFAULT_INTERFACE=`route -n get default | grep 'interface' | awk '{print $2}'`
echo $DEFAULT_INTERFACE
```

## NIC からプライベート IP アドレス を調べる

NIC 名がわかれば以下のコマンドで簡単に IP アドレスを調べられます。

```zsh
DEFAULT_IP_ADDRESS=`ipconfig getifaddr $DEFAULT_INTERFACE`
echo $DEFAULT_IP_ADDRESS
```

## まとめ

.zshrc とかに仕込んどくと便利かもしれません。

```zsh
echo 'export DEFAULT_INTERFACE=`route -n get default | grep '"'"'interface'"'"' | awk '"'"'{print $2}'"'"'`' >> ~/.zshrc
echo 'export DEFAULT_IP_ADDRESS=`ipconfig getifaddr $DEFAULT_INTERFACE`' >> ~/.zshrc
```
勉強　独り言　

rubyとrailsについて独り言を書く、
間違っている点もあるかと思います。

rubyは配列
def
end
で区切り
本文は　変数＝ハッシュ　から始まる。
例、cars = []
case input
  when "0"
    register_data(cars)
  when "1"
    show_cars(cars)
  when "2"
    exit
  else
    puts "無効な値です"
  end
end
のようにcaseを使い、もしーの場合を使うことができる。
when２を選択したなら、exitなので終了する。
２を押さない限り終了しない。

railsはバグ、エラー問題を中心に解いた。
エラー時の濃い赤い線にはshowなどエラーの場所を教えてくれている。
薄い赤い線にも場所が書いてあったりする。
上から英文を読むとだいたいの場所がわかる場合もあるが。
MVC、７つのアクションを理解していないと解けない問題が多い。

投稿フォームはshowのform withと関係があり
ホームページの見た目はshow。
中のシステムのどこと関係があるのか理解して
コードを書く。
関係性が分からないと解けない。
見た目はshow
では、中身は？？後日改めて記載する。
閲覧数とかのKGMって？

初投稿です〜
Youtubeアプリとかで見る閲覧数30Kとか、
自信なかったので調べてみました〜

・K　＝　1000
・M　=　1,000,000　=　100万
・G　=　1,000,000,000　=　10億

つまり30Kだと3万、300Mだと３億です、、、
すごい数、、、

Youtuberってすごいね！
QRコードにしてクリップボードに格納するExcelマクロ

#### これは
QRコードにしてクリップボードに格納するだけのちょっとしたExcelマクロです。


```vb
'アクティブセルの値をQRコードにしてクリップボードに格納
Sub QRCodeFromCellValue()
    With ActiveSheet.OLEObjects.Add("BARCODE.BarCodeCtrl.1")
        .Object.Style = 110
        .LinkedCell = ActiveCell.Address
        .Top = .Top + ActiveCell.Height
        .CopyPicture , xlBitmap
       .Delete
    End With
'    ActiveCell.Offset(1).Select
'    ActiveSheet.Paste
End Sub
```
#### 使い方
QRコードに変換したい文字列のセルを選択した状態で、このマクロを実行。
あとは、好きなところに貼り付けてください。
![barcode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164214/37ee56c0-df6a-a6b4-4249-5812c943da76.png)

#### 使い道
・・・わかりません。

#### 補足
* 参照設定：Microsoft Access BarCode Control 14.0
* Office 365 Business のExcelで試しました。他のバージョンで動くかどうかはわかりません。
* 日本語には非対応みたいです。また、文字数の上限はたぶん255文字だと思います。
FlutterでGoogle Mapを使ってみる

# FlutterでGoogle Mapを使ってみる

## はじめに

FlutterでGoogle Mapを使ってみたく色々と調べたので、メモ程度に使い方を書いてこうと思います。
Flutterのインストールなど事前準備は[flutter.dev](https://flutter.dev/docs/get-started/install/windows)を参考にしてください。
まずはFlutterでGoogle Mapを使う準備からサンプルコードを表示するまで。

## Google Mapの設定

- パッケージ[google_maps_flutter](https://pub.dev/packages/google_maps_flutter)の設定

    pubspec.yaml

```yaml
dependencies:
  flutter:
    sdk: flutter

  google_maps_flutter: latest viersion
```

- APIキーの取得

    APIキーの取得は[ここ]((https://cloud.google.com/maps-platform/))から。


![Screenshot_API_Google_Maps_Platform_Google_Cloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140080/1f6c679f-f2d5-23da-a4f4-83aa6b1e38a8.png)

「使ってみる」を押下。

![Screenshot_API_Google_Maps_Platform_Google_Cloud_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140080/0c98c8b0-ba6b-d810-d17f-6f4d753b3745.png)

「マップ」を選択して「続行」を押下。

![Screenshot_API_Google_Maps_Platform_Google_Cloud_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140080/b7376e19-bd19-048b-e09f-e36874dcf212.png)

アプリケーションの名前を設定して「Next」を押下。
この後、APIキーが作られる。

- APIキーの設定

    Androidの設定。私はiOSは使っていないので、iOSをお使いの方は他の記事を参考にしてください。
    android/app/src/main/AndroidManifest.xml に取得したAPIキーなどを設定する。

```xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="your package name">
    <!-- add current location, from here-->
    <uses-permission android:name=
    "android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name=
    "android.permission.ACCESS_FINE_LOCATION"/>
    <!-- to here -->
  
    <application
        android:name="io.flutter.app.FlutterApplication"
        android:icon="@mipmap/ic_launcher"
        android:label="flutter_app_name">

        <!-- Add the following entry, with your API key -->
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="Your API Key" />
```

これで動くようになるはず。
[google_maps_flutter](https://pub.dev/packages/google_maps_flutter)にサンプルコードがあるので使ってみてください。

![Screenshot_1579099139.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140080/5e5f830f-87fa-788a-7553-620c2e987ee9.png)

次はGoogleMapクラスのパラメータを使ってみようと思います。
ご覧いただきありがとうございました。
【備忘録】統合開発環境Eclipseでjavaプログラムを実行～gitを使ってみた

#【備忘録】統合開発環境Eclipseでjavaプログラムを実行～gitを使ってみた

初めて統合開発環境Eclipseをインストールし、「Hello world!」の出力までできたので、
そのコードをgithubにpushしてみた。

今後Eclipseを使用していくにあたり、備忘録として残しておく。

1. github上にリモートリポジトリを作成
 1. githubの画面右上部の「+(プラス)」ボタンを押下し、**New Repository**を選択
 2. **Repository name**にリポジトリの名前を入力し、**Create repository**を押下

2. 「新規Javaプロジェクト」の作成
 1. メニューより[ファイル]→[新規]→[その他]を選択。ウィザードが出てきたら[Javaプロジェクト]を選択して次へをクリック。
 2. 「関連付けられたパースペクティブを開きますか？」のウィンドウがでてきたら「はい」を選択。
 3. 「新規Javaプロジェクト」ウィンドウが表示されるので、[プロジェクト名]欄に、任意のプロジェクト名をつけて「完了」ボタンをクリック。

3. 「新規Javaクラス」の作成
 1. 新規のプロジェクトを作成したら、「Javaパースペクティブ」が表示される。（「ようこそ」の画面が表示されたままの場合は閉じる）
 2. Eclipseのメニューより、[ファイル]→[新規]→[クラス]を選択して「新規Javaクラス」ウィンドウを表示する。
 3. 名前に「クラス名」を入力。Javaではクラス名の頭文字を大文字にするのが慣例となっているので、クラス名は半角の英数字で分かりやすい名前をつける。**public static void mail(String[] args)**と**コメントの生成**にチェックを入れて「完了」ボタンをクリック。

4. Javaプログラムの記述 ～ Hello World！ ～
 1. （// TODO 自動生成されたメソッド・スタブ）の下に、「System.out.println("Hello World!");」の１行を追加。
 2. ソース・コードを書いたら、Eclipseのメニューから[ファイル]→[保管]を選択してコードを保存。

5. Javaプログラムの実行
 1. Javaプログラムを実行するには、Eclipseメニュー下の緑色の「実行」アイコンをクリック。（もしくは、メニューより[実行]→[実行]を選択するか、ショートカットキーの[Ctrl+F11]を押下）
 2. プログラムがエラーなく完了すると、下の「 コンソールビュー 」に「Hello World!」と表示される。

6. Gitリポジトリを作成する(git init)
 1. Eclipseの「パースペクティブを開く」アイコン、もしくはEclipseメニューの[ウィンドウ(W)]→[パースペクティブを開く(R)]→[パースペクティブ(O)]→[その他(O)]をクリック。
 2. 「パースペクティブを開く」ウィンドウから「Git」を選択して「完了」ボタンを押下。

7. 新規ローカルGitリポジトリの作成（初期化）
 1. 「Gitパースペクティブ」を開いたら、「新規ローカルGitリポジトリの作成」をクリック。
 2. 「新規Gitリポジトリの作成」－「リポジトリー・ディレクトリー」に任意のフォルダーを指定して「完了」ボタンをクリック。

8. Gitリポジトリを追跡する(git add)
 1. 新規リポジトリを作成をしたら、管理対象のJavaプロジェクトをGitリポジトリと共有する。「Javaパースペクティブ」アイコンをクリックして、先ほど作成したJavaプロジェクトのパースペクティブに戻る。
 2. 「Javaパッケージ・エクスプローラー」ビューで右クリック→メニューから[チーム]→[プロジェクトの共用]を選択。
 3. 「Gitリポジトリーの構成」ウィンドウのリポジトリー欄に、先ほど作成したGitリポジトリを選択して「完了」ボタンをクリック。
 4. 追跡対象のファイル(pushしたいファイル)を選択して、右クリックメニューから[チーム]→[索引に追加]をクリック。Javaのファイルを索引に追加する事で、ファイルの変更履歴を追跡する。

9. Gitリポジトリをコミットする(git commit)
 1. 追跡対象となったファイルは、「コミット」することでリポジトリの変更履歴として記録される。パッケージ・エクスプローラーで、変更履歴を管理するファイルを選択し、右クリックメニューから「 [チーム]→[コミット]」を選択。
 2. 「Git ステージングビュー」が表示され、先ほど索引に追加したファイルが「ステージされた変更」ボックスにリストされている。「ステージ」とは、Git用語で索引に追加(add)すること。
 3. ファイルの変更履歴を保存（コミット）するには、「コミット・メッセージ」にコメントを記述してから「コミット」ボタンをクリックする。
 4. コミット履歴を確認。パッケージ・エクスプローラーの右クリックメニューから[チーム]→[ヒストリーに表示]を選択。ヒストリーから「コミットID」や「メッセージ」などを確認する事ができる。

10. pushする
 1. リポジトリと連携しているプロジェクトを右クリックし、「チーム＞リモート＞プッシュ」を選択。宛先リポジトリ（1.でリモートリポジトリ作成の際に自動生成されたURLのこと）、ソース参照(master)、宛先参照(master)を選択し、完了する。これでリモートリポジトリへのプッシュが完了。


参照
---
[Eclipseのインストールから使い方まで～EclipseでJavaプログラムを実行してみよう！](https://proengineer.internous.co.jp/content/columnfeature/7853)
[EclipseでGitを使う（4）プッシュまでの流れをまとめる。](https://tech.pjin.jp/blog/2015/07/01/git-on-eclipse-4-how-to-push/)
S3に静的HTMLファイルやSPAのスクリプトを配置して公開する

S3はファイルを補完するだけでなく、以下の手順を踏むことでHTTPサーバとしても利用することができます。
EC2などのサーバを立てなくても簡単にHTMLページが公開できます。
また、ReactやVueなどで作ったスクリプトを配置することもできます。費用はファイルサイズやアクセス数をベースに計算され、安価で簡単に情報公開ができるのでおすすめです。

## S3バケットの作成

バケットを作成していない場合は、Create bucketボタンを押して、S3バケットを作ります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/ddea939d-fe4d-d22b-cae7-3bb9516fd969.png" width=60%>

最初のBucket nameは同じ名前のバケット名を（同じリージョンで）ほかの人が使っているとエラーが出ます。
重複しないバケット名を入れて、Nextを押して次に行きます。②～④は、一旦そのままの設定で構いません
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/a5ac4b4a-f1ac-5a40-5efd-30c10c77c341.png" width=60%>



## Public access ブロックの解除

次に、Public access Blockの解除を行います。
前の手順で作成したバケットのチェックボックスをチェックした状態でEdit public settingsボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/b4c385f8-5834-0e88-41b0-d56390c0f022.png)

Block all public accessのチェックボックスを外し、Nextを押します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/c8533605-75db-9af4-8a60-afa78caa11aa.png" width=80%>

すると、以下の様にPublic accessを許可してもよいかを確認する画面が出ます。ウインドウ下の入力欄に”confirm”と入力し、Confirmボタンを押します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/2caae0df-0570-f5d3-a058-478e0b4ea243.png" width=80%>

私はこの手順を踏むことでデータが公開された！と思ってしまいましたが、この段階ではPublic access blockを外しただけで公開設定をいれたわけではないので、公開はされていません。
次にBucketポリシーを変更して公開設定を行います。



## Bucketポリシーの設定
次に、対象のバケット名をクリックし、バケットの中身の一覧画面に移動し、上に表示されるPermission＞BucketPolicyの順にタブをクリックします。
タブの下にBucketPolicyEditorが表示されますので、以下に示したBucket policyを設定します。
example-bucketとなっている部分については、作成したバケット名に変更してください。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/c86afe76-5781-fbd0-a61a-8a6abaaeb3dd.png" width=80%>


```json:"bucketpolicy"
{
  "Version":"2012-10-17",
  "Statement":[{
	"Sid":"PublicReadGetObject",
        "Effect":"Allow",
	  "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::example-bucket/*"
      ]
    }
  ]
}
```

## Static website hosting の設定

最後に、Propertiesタブ＞Static website hostingをクリックし, index document欄に初期ページとして表示するファイル名を設定します。ファイル名の指定なしにルートディレクトリを参照するURLを表示しようとした場合、ここで設定したファイルが自動的に読み込まれるようになります。
また、Error documentを設定すると、存在しないページなどを表示しようとした場合にここで指定したページが表示されるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77722/e5029c6e-610f-fc97-afc4-bb67dc4668cb.png)


これで設定完了です！
タイトルのすぐ下に表示されているEndpointのURLをクリックすると、S3のルートディレクトリに登録されているindex.htmlを参照できます。




参考ページ
https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteAccessPermissionsReqd.html
M5StackにGroveセンサを接続する時の注意点をメモ

##概要
M5StackにGroveに磁気スイッチを付けようとした時に、詰まったところをメモりました。

##M5StackにGroveセンサを簡単につなげられると思ってはいけない
M5StackはPortもたくさんあり、Groveコネクタもありで至れり尽くせりなデバイスですが、これにGroveのセンサを接続する時には注意が必要

###M5Stackへの接続方法
- I/Oポート
- BUSポート
- Groveコネクタ

接続しようとしたスイッチはこちら
[![Image from Gyazo](https://i.gyazo.com/579bffcc9327a100190165fe0957bbc2.png)](https://gyazo.com/579bffcc9327a100190165fe0957bbc2)

このスイッチを安直にもGroveコネクタに接続しようとしてました。

[![Image from Gyazo](https://i.gyazo.com/a0ab943c1cc9c0f47d62f1a65f4fc5c9.png)](https://gyazo.com/a0ab943c1cc9c0f47d62f1a65f4fc5c9)
ここです。

しかし、これでは動きませんでした。
(動くのかもしれないけど、やり方はわかりませんでした)

###M5StackのGroveコネクタはI2C通信のみ
M5StackのGroveコネクタはArudinoのBase ShieldにあるGroveコネクタのようには使えませんでした。

それはM5StackのGroveコネクタはI2C通信にしか対応していないためです。
GroveのセンサはI/Oポートで行うようなシリアル通信で入力を行う必要があります。

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

つまり、ここにジャンパワイヤで繋げれば使うことができます。
GCPのSecret Managerを試した

## 背景

[Google Cloud Secret Manager のご紹介](https://cloud.google.com/blog/ja/products/identity-security/introducing-google-clouds-secret-manager) で新機能※ベータの公開を知りました。
従来は都度KMSで復号したりするのが辛かったので
簡単に扱えるようになったら嬉しいと思って試用してみました。

## やったこと

### 下準備

基本的にはサービスからアクセスさせる想定なので、今回はサービスアカウントを作成しました。
![serviceaccount.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43116/af900505-3eb8-0031-f0c2-f34791dc1a54.png)

「Secret Manager のシークレット アクセサー」の権限をつけておきます。
![aut.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43116/1b21f845-8499-159b-7064-dec822bd05a5.png)
参考: [シークレット マネージャーの役割](https://cloud.google.com/secret-manager/docs/access-control?hl=ja#%E3%82%B7%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%88-%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BC%E3%81%AE%E5%BD%B9%E5%89%B2)

サービスアカウントの発行時にjsonでキーを発行し、読み込んでおきます。

```shell:環境変数でクレデンシャルを設定
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/service_account_key.json"
```

### シークレットの作成

管理者の権限で実施します。
![secre.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43116/b0d79f0c-7df9-1f68-a7b3-8738667591f6.png)

### シークレットの取得

[サンプルコード](https://github.com/googleapis/nodejs-secret-manager/blob/master/samples/accessSecretVersion.js)を参考に、node.jsのスクリプトから取得します。

```shell:ライブラリを読み込む実行ファイルの準備
$ mkdir secret-manager-test
$ cd secret-manager-test
$ npm init -y
$ npm install @google-cloud/secret-manager 
$ touch index.js
```

```javascript:index.js
const {SecretManagerServiceClient} = require('@google-cloud/secret-manager');
const client = new SecretManagerServiceClient();

async function accessSecretVersion() {
  const [version] = await client.accessSecretVersion({
    // バージョンは'latest'で最新バージョンを参照することも可能
    name: 'projects/{my-project}/secrets/TEST_API_KEY/versions/1',
  });

  const payload = version.payload.data.toString('utf8');

  console.info(`Payload: ${payload}`);
}

accessSecretVersion();
```

実行するとシークレット作成時に定義した値が表示されます。

```shell:実行
$ node index.js
Payload: this is secret key
```

## 解決できず

現状は「Secret Manager のシークレット アクセサー」を無条件で付与しているため
プロジェクト内で定義されているすべてのシークレットにアクセスできてしまいます。

権限付与時に条件を絞ることもできますが、うまく設定することができず…。

## まとめ

簡単に使うことはできましたが
このままではセキュリティ上本番では使い難いので、もう少し検証が必要です。
Firebaseとその周辺の知識について

今回の目的は、

- Firebaseやその周りの用語について理解する

です。


# Firebaseとは
firebaseはGoogleが提供するバックエンドサービスです。
サービスの早期リリースを考えるときに、ひとまず立ち上げるためのBaaS（Backend as a Service）です。
ウェブサービスほどサーバーを必要としないモバイル向けのサービスとなっています。
各BaaSにはAndroidやiOSのSDKがあるので、煩わしい認証はSDKがFirebaseと連携してくれるので、大幅に工数を削減できます。
SDKとは何でしょうか。

# SDKとは
SDKとは、ソフトウェア開発キットの略称です。
その技術を使って開発するために必要なものが揃えてあるイメージです。
iOSでいうiOS SDKはXcodeに同梱されており、iPhoneアプリを開発するために必要なものが揃えられています。
例えばこのページを見てみます。
https://firebase.google.com/docs/auth/web/google-signin
ここで**Firebase SDKでログインフローを処理する**ということが書いてありますが、これは、
JavaScriptを使ったFirebaseの最適な開発環境でログインフローを作成する
という意味です。
「FirebaseをJavaScriptプロジェクトに追加します。」というフローを通すことで、FirebaseSDKが使用できるようになり、Firebase SDKでログインフローを実装できるようになります。



# Firestoreとは
Cloud Firestoreは、Firebaseのモバイルアプリ開発用の最新データベースです。かつてのRealtime Databaseをさらに強化しています。これから主力で使用されるデータベースです。

参考資料
https://www.topgate.co.jp/firebase01-what-is-firebase
Macで論文からベクター画像を切り出す方法

# はじめに
PDFの図表等を切り出してVector画像として保存する方法を覚えたので、ここに紹介する.
ベクター形式(pdf,eps等)で画像を保存をしておくと、スライドなどに載せて拡大してもボケずに表示させられるので便利

# 方法
Macに標準搭載されているプレビューを用いる.

1. PDFファイルをプレビューで開く
<img width="596" alt="スクリーンショット 2020-02-04 22.10.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290071/05f469fa-ec45-7902-5ff6-183137f83526.png">

2. プレビュー右上の「マークアップツールバーを表示」を選択
<img width="400" alt="スクリーンショット 2020-02-04 22.19.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290071/21580264-9faf-7bee-7a28-ced9642b9d50.png">

3. ツールが出てくるので左から２番目の「長方形で選択」を選択し、目的の図表を枠線で囲む
<img width="202" alt="スクリーンショット 2020-02-04 22.21.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290071/5e61f627-9292-32a3-73d3-0d3a1690ffb3.png">

4. 目的の図表等を囲んだ後、ツールバーの右端に出てきた「切り取り」を選択
<img width="255" alt="スクリーンショット 2020-02-04 22.25.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290071/7f9e9d10-6329-75d1-703d-36ad732fc3de.png">

5. サムネールからドラッグ&ドロップして好きな場所に保存
(ここではデスクトップにそのまま置いてます)
<img width="470" alt="スクリーンショット 2020-02-04 22.30.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290071/4013f96b-7ac2-db72-d040-12a7c5669740.png">

6. 切り出した画像は余白が残っているので次のコマンドを実行して詳細にトリミングしましょう
<pre>$ pdfcrop (ファイル名).pdf

実行するとcropという文字列が追加されたファイルができますが、出力ファイル名を指定したいときには，以下のようにコマンドラインの最後にファイル名を加えます.
`$ pdfcrop (ファイル名).pdf (新しいファイル名).pdf`

# おわりに
切り取りした後、そのままプレビューを終了すると元のページが復元できないので、切り取りが終わったら `command + Z` でページを元に戻すかバックアップをしておきましょう

# 参考文献
[pdfcropのコマンド](https://texwiki.texjp.org/?pdfcrop)
Next.jsにてhooksを使いつつgetInitialPropsも使う方法

#function.getInitialProps で使える

以下のような感じ。

```
import React, { useState } from "react";

function Home(props) {
  
  const [count, setCount] = useState(0);
  console.log(count);

  return (
    <>
      <h1>Home</h1>
    </>
  );
}

Home.getInitialProps = async ({ pathname, query, asPath, req, res }) => {
  return { values: "test" };
};

export default Home;

```
buttonを丸角に！

#SwiftにおけるButtonの装飾についての備忘録
Swiftにおいてcss的な役割をするものは何だろうと思い、調べた結果を以下に記します。



```swift:ViewController.swift

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var nextButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        nextButton.layer.cornerRadius = 20 //ここで丸角を指定
    }
}
```

・buttonの名前をnextButtonとしました。


#### 結果
<img width="511" alt="スクリーンショット 2020-02-04 23.45.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256549/10e87307-c2f9-097c-1ca3-bbf40ba02081.png">



以上になります、ご参考までに。。。
wifi接続のリスク軽減方法

## なぜこの記事を書こうと思ったか
某映画の予告でフリーWifiに接続したら端末の情報を読み取られてしまい、
そこから事件に発展するという１シーンがありました。
こわいですよね…。

![computer_sagi_virus_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567450/285d30b9-e29b-39b6-401b-0f357f9f2487.png)


そこで、ここまでやることが実際可能なのか？と考え、ちょっと調べてみました。


検索して出てきた情報を見ると、

通信情報の傍受はおろか、この映画の通りスマホの中身まで見ることもできるようです。
※「スマホ 乗っ取り wifi」「wifi 通信 傍受」でいろいろ情報が出てきます。


確かに公共のフリーwifiを使おうとすると必ずトップ画面に警告が出てきますよね。


ではどのようにしてこの問題を防ぐかを調べたところ、
以下の**３つの方法**があるそうです。


## 傍受を防ぐために
こちらが傍受を防ぐ方法です。

・テザリングやモバイルwifi接続
・有料(鍵付き)wifi接続
・VPN接続


以下に簡単にまとめてみました。

### ・テザリングやモバイルwifi接続
これはフリーのwifiを使わないで通信を行うという選択ですね。
まあ、通常の生活でそこまでして(セキュリティを気にして)
セキュリティの高いwifiを使うか、というところになりますが…

自身の持つ機器については一般に公開していないため、傍受については一番安全です。
また、携帯の電波が届いていれば使えるという利点もあります。
ですが、スマホやモバイルwifiの通信料金がかかってしまいます。


### ・有料(鍵付き)wifi接続
暗号化通信して公共のwifi(au Wi-Fi SPOT等)に接続する方法です。

暗号化はしてありますが、100%安全というわけではないです。
(ですが無料wifiに比べたらかなり安全です)
こちらも月額課金ですが、モバイルwifi等を使うよりは安く済みます。


### ・VPN接続
Virtual Private Network接続のことです。

仮想的な専用線をつなぎ(トンネリング)、
正しい相手か認証してから暗号化した通信を行います。

VPN接続を使えば、フリーwifiを使いつつ安全性を上げることができます。
(VPN自身の暗号化方式による安全性問題もあるので必ず安全とは言えません)
回り道をしているため必然と回線速度が遅くなります。


---

多分Qiitaをよく読んでいる方は知っていることかもしれませんが、
思い立ったので書いてみました！
【Vue.js】Vuexを使ったとき、フォームでv-modelを使うと不具合が出る問題の対処

## はじめに
Vuexを使って状態管理すると、フォーム入力で`v-model`を使うと、
**「ちょっと！勝手にstate変えずにちゃんとmutation通してくれるかな:weary:」**
と怒られる問題があります。

自分はこれに対して**どうするのがベスト**か分からず、試行錯誤を繰り返していました。

そんな時に、**手間がかからずラクな方法**を[こちらのブログ](http://arm4.hatenablog.com/entry/2018/05/30/122712)で発見したので、メモしておきます。

## 環境
```yaml
OS: macOS Catalina 10.15.3
Vue: 2.6.10
vuex: 3.1.2
```

## 前提
ユーザー情報を入力するフォームがあったとします。

今回はシンプルな例にするため、そのユーザー情報の中でも`name`を入力する`<input>`タグを例にします。

## `v-model`を使った場合
```vue:sample.vue
<template>
<!-- 略 -->
  <input v-model="user.name" >
<!-- 略 -->
</template>
```

シンプルにこれでOKです。

が、Vuexを使ってこの`user`の情報を管理している場合は冒頭の
**「ちょっと！勝手にstate変えずにちゃんとmutation通してくれるかな:weary:**
と怒られる問題が発生します。

これを**大した手間をかけずに**解決する方法が以下です。

## 改善後

### `<input>`タグ内

```vue:sample.vue
<template>
<!-- 略 -->
  <input
    :value="user.name"
    @input="updateUser($event, 'name')"
  >
<!-- 略 -->
</template>
```
ここで`<input>`タグ内のinputイベントで次の`updateUser`メソッドが発火、このときのDOMイベントが`$event`に入ります。

### `<input>`タグのあるコンポーネントの`methods`内

```vue:sample.vue
<script>
//略
  export default {
//略
    methods: {
      updateUser(event, key_name) {
        this.$store.commit('updateUserState', { 
      value: event.target.value, key_name });
      }
    }
  }
//略
</script>
```

先程のDOMイベントから入力された文字列`value`を抜き出し、`key-name`と共に以下**Vuexストア内**の`mutations`で定義された`updateUserState()`の引数として渡します。

### Vuexストア内

```javascript:store.js
export default ({
//略
  mutations: {
    updateUserState (state, { value, key_name }) {
      state.user[key_name] = value;
    }
  }
//略
})
```
最後に、この`updateUserState()`でストアの`user`の値を変更し、ストア内と`<input>`タグ内に入力された文字列が同じになります。

以上です！
使い回しやすいコードで**超助かりました**:relaxed:

## おわりに
最後まで読んで頂きありがとうございました:bow_tone1:

どなたかの参考になれば幸いです:relaxed:

## 参考にさせて頂いたサイト（いつもありがとうございます）

- [Vuex使った時にフォームのバインディングにv-model使うと怒られる問題の解決法 - nanisore oishisou](http://arm4.hatenablog.com/entry/2018/05/30/122712)
面接でポートフォリオはなんのwebサーバーで動かしているのか聞かれてよく分からなかったので調べた

# 面接でポートフォリオはなんのwebサーバーを使っているのか聞かれました
プログラミング教室で教えてもらったのは、`rails s`とすればlocalhost:3000にアクセスすれば動く。そんな感じだったので、webサーバーやアプリケーションサーバーについて意識することはありませんでした。なんのサーバーを使っているのか気にしたことがありませんでした。なので、なにも答えられずww
基本が分かっていなかったので、一体どういうことか調べてみました。

## webの仕組みをさらっと復習

webの仕組みは下の図のようになっています。
![webの仕組み.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417196/ccba21ed-c0b9-6939-7737-13ed04b40de9.png)
クライアントが要求を出して、静的な処理ならwebサーバーがリクエストを返します。動的な処理の時、webサーバーはアプリケーションサーバーに処理を要求して、リクエストを返します。
非常にわかりやすい例があったので、引用します。

> 四則演算のアプリケーションが実装されているAPサーバでクライアントが「1＋1は？」というリクエストを送ると、Webサーバはこれを「動的コンテンツ」と判別してAPサーバにリクエストを投げます。受け取ったAPサーバは四則演算ができるのでDBサーバにリクエストを投げなくても「1＋1＝2」という答えをWebサーバに返すことができます。
しかし、「リンゴとバナナの合計金額は？」というリクエストが飛んでくると、APサーバにはリンゴとバナナの値段のデータが存在しないため、DBサーバにリクエストする必要があります。そして、DBサーバからリンゴとバナナの値段が返ってきたらAPサーバは計算して結果をWebサーバに返します。
参考：[ミドルウェアについて知ろう](https://thinkit.co.jp/article/11837)

## Rubyのwebサーバーは？
自分でwebサーバーの設定をした記憶がなかったので、そもそもなぜlocalhost:3000にアクセスするとリクエストが返ってくるのかという疑問がでてきました。

## webrickがwebサーバーみたいなもの
Rubyは標準でwebrickというwebサーバー用のフレームワークがあります。webサーバーとは違うようですが、webサーバーと同じような動きをすると認識しています。なので、手元で動かすだけなら、ApacheやNginxなどのwebサーバーは必要ないようです。webrickがあるから簡単にアプリケーションを動かすことができているという分けですね。

## ApacheやNginxはどういう時に使うの？
> ApacheやNginxは静的ファイルの配信やリクエストのバッファリング、レスポンスの圧縮など、アプリケーションではやらないHTTP上で起こる汎用的な問題を解決するミドルウェアです。
参考：[Railsに標準装備されているWEBrickではなく、本番でNginxやApacheに変更するのは何故ですか？](https://jp.quora.com/Rails%E3%81%AB%E6%A8%99%E6%BA%96%E8%A3%85%E5%82%99%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8BWEBrick%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F-%E6%9C%AC%E7%95%AA%E3%81%A7Nginx%E3%82%84Apache%E3%81%AB%E5%A4%89%E6%9B%B4)

とのことで実際に本番環境でパフォーマンスをあげるために使うというイメージで理解しました。
webサーバーはなくても動くみたいで、設計によって必要かどうか判断すると良いということで理解していますが、実際のところほとんどの場合webサーバーは使っているのではないでしょうか？

## まとめ
webの仕組みについて改めて復習した次第です。webサーバーについて調べることができて少し理解が深まりました。

## 参考
[webrickを使ったアプリケーションの起動](https://www.javadrive.jp/rails/ini/index3.html)
[Rails開発におけるwebサーバーとアプリケーションサーバーの違い](https://qiita.com/jnchito/items/3884f9a2ccc057f8f3a3)
[webサーバー、アプリケーションサーバー、Rackといった仕様や概念と、WEBrick、Unicorn、Pumaといった実装の関係が頭の中で結びつきません](https://ja.stackoverflow.com/questions/17813/web%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc-%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc-rack%e3%81%a8%e3%81%84%e3%81%a3%e3%81%9f%e4%bb%95%e6%a7%98%e3%82%84%e6%a6%82%e5%bf%b5%e3%81%a8-webrick-unicorn-puma%e3%81%a8%e3%81%84%e3%81%a3%e3%81%9f%e5%ae%9f%e8%a3%85%e3%81%ae%e9%96%a2%e4%bf%82%e3%81%8c%e9%a0%ad%e3%81%ae%e4%b8%ad%e3%81%a7%e7%b5%90%e3%81%b3%e3%81%a4%e3%81%8d%e3%81%be%e3%81%9b%e3%82%93)
[WEBrickを使ってみよう！](https://thinkit.co.jp/article/117/1?page=0%2C1)
Twitterの投稿日時をURLからJavaScriptで求める。

# tl;dr
* 年に3度くらい、ツイートの投稿日時ってどこを見ればよいんだっけ、と悩むため忘備録として記事にする
* URLからJavaScriptを使って求めるものとする

# はじめに
* Twitterは閲覧環境によって米西海岸の時刻で表示されるなどして、実際の投稿日時を勘違いする問題が稀によくあった。※ 既に改善されていたらすみません。
* 情報リークやデマなどのイベントを追っかけるのに、一刻も早く正しい時系列で事態を把握したいのに、えーっと、、となってしまうのがイヤ。
* 以前はhtmlタグのなかにepochが埋め込まれていたこともあったように思うが今は無さげ。こういう事があるためHTMLは当てにしたくない。
* Twitterはだいぶ前から、Snowflakeという時刻情報を組み込んだIDを使っており、今回はこれを利用する。

# やりかた
* ブラウザ(筆者はChrome v79で確認)で、任意のツイートページを開く。
* Developer Consoleを開き、下記のJavaScriptを実行すると、ツイート投稿日時が日本時間で表示される。

```JavaScript
alert(new Date(Number((BigInt(window.document.URL.split("/")[5])>>22n) + 1288834974657n)).toLocaleString('ja-JP'))
```

# 説明
* Snowflakeでは64bit整数のうち、timestampで42 bit、worker-idで10 bit、sequenceで12 bitをアサインしている。
* URLからツイートのIDを取り出す( URLを `/` でスプリットして5番目の数値)。
* timestampを22bitシフトして取り出したのち、オフセット値である `1288834974657` を加算して、日本語ロケールの時刻として表示する。
* よく使う人はBookmarkletにすれば便利だと思います。

# 補足
* なおIEやEdgeといったBigInt(ES2020)に対応していないブラウザでは使えない。
* Snowflake採用以前の、大昔のツイートは今回の方法は使えない。
* Snowflakeのオープンな開発は大分前から止まっており、IDの仕様は既に変わっている可能性もあるが、観測できる範囲では時刻情報は正確そう。
anyenvを使って環境構築をする。

# anyenvを使って環境構築をする。
以前業務でもanyenvを使ってrbenvやpyenvをインストールすることがあったので、メモとしてまとめました。

## anyenvとは
複数の開発言語を、バージョン管理するツール。python用のpyenv,ruby用のrbenv、PHPなどを簡単に環境構築することができる。

##手順

```
$ brew install anyenv
```
で、ローカルPC上にanyenvをインストールすることができる。
この時、.bashprofileにて、パスを通さなければならない。
.bashprofileは、ターミナルを開いたときに実行されるファイル。

openコマンド等で、ホームディレクトリ配下にある、.bashprofileを開く。（無ければ作成してください）

```
export PATH="$HOME/.anyenv/bin:$PATH"
eval "$(anyenv init -)"
```

## **env系のインストール

```
anyenv install -l
```

で、インストールできる開発言語のenv一覧を表示することができる。

pyenvのインストール

```
anyenv install pyenv
```
pyenvで、インストールできるpythonのバージョン一覧表示

```
pyenv install -l
```

```
pyenv install {任意のバージョン}
```
でインストールできる。

pyenv command not found等と出てくる場合は、パスが通っていない可能性が高いので、.bash_profileを確認してみる。

```
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```
で、おそらくpyenvコマンドが実行できると思います。

全体で利用するバージョンの設定は、

```
pyenv global {インストールしたpythonのバージョン}
```
pyenv globalコマンドで、使うバージョンは自由に切り替えられます。

他のenv系も、同じ要領で行けるのでとても楽です。
Backtraderのインストール

backtraderの日本語記事が少なかったので自分が書いてみることにしました。
つまづいたことや動かしてみてわかったことを書き留めていこうと思います。
間違っている部分を見つけたらコメント等で指摘していただけると幸いです。

backtrader人口が増えてもっと解説記事が増えたらいいなー、と願ってます。

私の動作環境
 `Windows8.1pro 64bit`
 `Anaconda3 2019.10`
 `(backtrader用の仮想環境をPython3.5で構築)`

#Python3.5仮想環境にJupyternotebookインストールするときの注意
Anaconda3のインストールや仮想環境の構築に関してはわかりやすくて詳しい記事がたくさんありますのでそちらを参考にしてみてください。
私の場合、仮想環境にJupyternotebookをインストールしたら起動時にカーネルエラーが発生しました。Win32apiが見つからないという趣旨のことが書かれていて仮想環境にPIP経由でpywin32をインストールすることで解決できました。

こちらの記事に詳しく書かれています。
*Anacondaの仮想環境で個別のPython環境を作る方法 | エビワークス* 
https://ebi-works.com/anaconda-env/

PypIのbactraderページではPython3.7まで対応とあるのですが、Python3.5で開発という記述があったので念の為に3.5で仮想環境を作りました。こちらにbactraderをインストールしていきます。

#backtraderインストール
Anacondapromptから仮想環境を立ち上げます。私はenvbactraderという環境名にしました。インストールの際にこの [plotting]をつけるとmatplotlibも一緒にインストールされます。

```python:install.py

(envbacktrader) C:\Users\xxxx pip install backtrader[plotting]

```

念のためconda listコマンドでパッケージを確認してみます。

```python:condalist.py

(envbacktrader) C:\Users\xxxx conda list

# packages in environment at C:\Users\xxxx\Anaconda3\envs\envbacktrader:
#
# Name                    Version                   Build  Channel
backtrader                1.9.74.123               pypi_0    pypi
blas                      1.0                         mkl
bleach                    3.1.0                      py_0
ca-certificates           2019.11.27                    0
certifi                   2018.8.24                py35_1
colorama                  0.4.3                      py_0
cycler                    0.10.0                   pypi_0    pypi
decorator                 4.4.1                      py_0
defusedxml                0.6.0                      py_0
entrypoints               0.2.3                    py35_2
icc_rt                    2019.0.0             h0cc432a_1
#......省略
```

無事インストールされました。
herokuのデータのバックアップとローカルのデータベースへのリストア

しょぼいメモを残します
データベースでpostgresqlを使っている時のみです。

## バックアップ
```
curl -o latest.dump `heroku pg:backups public-url -a アプリ名`
```  

## リストア
```
pg_restore --verbose --clean --no-acl --no-owner -h localhost -U ローカルのDBユーザー名 -d ローカルDB名 latest.dump
```