OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Studio Codeダウンロードの流れ

![スクリーンショット 2019-11-13 21.23.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15820/aa0b57b0-8c00-b6b7-f1bc-b066a1e87bce.png)
![スクリーンショット 2019-11-13 21.23.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15820/db2c923e-1014-1d5b-0a95-923098c9b74c.png)
![スクリーンショット 2019-11-13 21.23.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15820/2a3173ed-59bf-652d-9311-750669a56f83.png)
![スクリーンショット 2019-11-13 21.23.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15820/edf3ba97-de2b-c4c5-e398-ec1e4430ffd8.png)
![スクリーンショット 2019-11-13 21.23.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15820/5e7359fd-6dd8-7385-d9d3-39d81a649c63.png)
![スクリーンショット 2019-11-13 21.22.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15820/c8891111-3c4c-fd86-1782-9fcc6e33ed6f.png)
[ゼロから作るDeep Learning]ニューラルネットワークの主なパラメータ更新手法

# はじめに
この記事は**ゼロから作るディープラーニング 7章学習に関するテクニック**を自分なりに理解して分かりやすくアウトプットしたものです。
文系の自分でも理解することが出来たので、気持ちを楽にして読んでいただけたら幸いです。
また、本書を学習する際に参考にしていただけたらもっと嬉しいです。


##SGD
SGDは、今までのように勾配を求めたら学習係数をかけて現在のパラメータと引き算をする事でパラメータを更新する手法です。
<img width="183" alt="スクリーンショット 2019-11-13 15.30.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/f53f11e8-34a5-1160-9f9b-3b3161329c3f.png">
この方法は単純で実装もしやすいのですが、勾配が示す向き＝正確な最小値への方向ではないので、損失関数の最小値となるパラメータの地点までギザギザと効率の悪い探索をしてしまうのが弱点です。


##Momentum
速度という概念が追加された手法。勾配から現在の地点の損失関数の最小値の地点に転がっていく速度を求めて、それをパラメータに加算する事でパラメータを更新します。
<img width="168" alt="スクリーンショット 2019-11-13 15.38.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/bebb251d-5301-1819-673e-7fa2dd53c68e.png">
<img width="319" alt="スクリーンショット 2019-11-13 15.38.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/91ec55ec-266c-0b0a-dd41-28ce2b3a5076.png">
SGDのようにジグザクな探索をしてしまいますが、SGDよりもジグザグが軽減されて丸みを帯びたジグザク探索になるので、効率の悪さは軽減されている。

##AdaGrad
最初は学習係数を大きくして更新を行い、どんどん学習係数を小さくして更新を行う**学習係数の減衰**というテクニックを使った手法。
最初は大きくパラメータが更新され、徐々にパラメータの更新は小さくなっていく。
<img width="225" alt="スクリーンショット 2019-11-13 15.53.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/2b34e000-2fd2-38d8-e2df-c913ca4e36ec.png">
<img width="218" alt="スクリーンショット 2019-11-13 15.53.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/78ae12e8-4329-c82f-cba7-5bded3db2f04.png">
この手法を使う事で、さらにジグザグ探索を軽減することができ、効率の良い探索をすることができる。

##Adam
2015年に提唱された新しい手法で、MomentumとAdaGradを合体させたような手法。
複雑な為ここでは説明は控えるが、すごく効率の良い探索をすることができる。

現在主に使われている手法は、単純なSGDとすごく効率は良いが複雑なAdamである。
Zabbix 4.2 4.4で使える Prometheusのexporterの値を全自動で連携して監視する方法

タイトルの通り、Zabbix 4.2や4.4で使えるPromehteusのexporterの値をディスカバリして全自動で監視連携する方法を紹介します。

[公式ドキュメント](https://www.zabbix.com/documentation/4.4/manual/config/items/itemtypes/prometheus)

Prometheusのexporterはとても幅広くいろんな製品に対応しているので便利です。
Prometheusだけで完結する運用現場ならこんなことする必要はないですが、Zabbixに連携して統合的に管理したいといった時にはこの方法を使うとちょっと楽になるかもという話です。

## 連携の手順

以下のような3ステップで実行すればOKです。

- ① exporterから情報取得するHTTPエージェントアイテムを登録
- ② ①のアイテムを親にした依存アイテムのディスカバリルールを作成
    - (Prometheus→JSON変換、LLDマクロ化を実施)
- ③ ②のアイテムプロトタイプとして依存アイテムをLLDマクロを使って登録

## 手順1 expoerterから情報取得するHTTPエージェントアイテムを登録

<img width="624" alt="http_agent_item.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45851/9317480e-dad3-04b1-54e9-7ef9fb1bcc90.png">

タイプをHTTPエージェントに設定し、URLのところにexporterのエンドポイントのURLを指定します。(http://ホスト名/metricsとか)
設定をテンプレート化するなら、このURL部分はテンプレートのマクロ化しておくと良いと思います。
取得結果はPrometheusのフォーマットのテキスト形式で返ってくるので「テキスト」にしておきます。

<img width="714" alt="http_agent_item_result.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45851/61d5ea55-23a6-6d20-c35b-1fb87ee80d49.png">

取得結果は上記のような感じで/metricsにアクセスした時の生データです。

## 手順2 依存アイテムのディスカバリルールを作成

ディスカバリルール自体をHTTPエージェントにしても構わないのですが、そうすると手順3で設定するアイテムプロトタイプもHTTPエージェントにしないといけなくなったりして、exporterへの呼び出し機会が増えてしまうので、手順1でまとめて取得してその値を活用するように依存アイテムで対応します。


<img width="591" alt="discovery_rule1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45851/4368ed52-b34e-4763-d8fc-7291f756a3d5.png">

<img width="490" alt="discovery_rule2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45851/05605378-99ca-120d-4014-5d3c11bb1728.png">

前処理(Preprocessing)で、Promehteusのフォーマットから特定のメトリクスの情報を取り出してJSON変換させます。
ここのParametersの指定の仕方は色々と可能ですが、この後のアイテムプロトタイプとペアで紐づくようにメトリクスの名前毎にディスカバリさせるような感じのフィルタ指定が良いと思います。
上記例の場合はKONG APIのexporterからkong_http_statusというメトリクス部分をディスカバリする例です。

<img width="530" alt="discovery_rule3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45851/d795013b-a85d-3d57-b163-ff27ed327626.png">

LLDマクロとしてどのような名前のマクロにJSON変換したどこの部分の値を登録するかを指定します。

## 手順3 依存アイテムのアイテムプロトタイプを作成

最後にLLDマクロを使ってアイテムプロトタイプを作成します。ここでも手順1で作成したアイテムを親にした依存アイテムで設定します。


<img width="545" alt="item_prototype1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45851/62376a46-88aa-c2c1-fd6c-1015bfb4e6e3.png">
<img width="611" alt="item_prototype2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45851/b5268079-e315-7ffb-c1df-70f6f46ccae2.png">

前処理(Preprocessing)で手順2で設定したLLDマクロを活用して、複数の項目があった時にそのディスカバリ結果を展開して自動作成されるように定義します。

今回の場合は、httpのステータスコード毎やサービス毎でexporterで取得できるメトリクスだったので、{#CODE}や{#SERVICE}という名称をラベルとして指定して取得できるようにしています。

## まとめ

手順はこれだけです。exporter毎にメトリクスの仕様は決まっていると思うので、仕様に合わせてテンプレート化しておけば、Zabbix Agentもいらずでいろんな監視ができますね。
初心者によるプログラミング学習ログ 159日目

# 100日チャレンジの159日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

159日目は

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>159日目<br><br>今日もメンターさんのwebサイトコーディング課題<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a> <a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1194344202366152704?ref_src=twsrc%5Etfw">November 12, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
herokuにrails + mysql2 をデプロイするときの注意

追記

こちらに書きました。
https://dev.to/n350071/a-trap-point-at-push-your-rails-app-to-heroku-which-uses-mysql-14j

---

だいたい、[herokuでMySQL環境作ってやんよ!!!](http://tokidoki-web.com/2018/06/heroku%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AEcleardb-mysql%E3%82%92/)の内容で行ける。

ただし、Railsの場合は、`mysql://`のところを`mysql2://`としないとハマるので注意が必要です。

この質問に感謝。
https://teratail.com/questions/189312
純正raspberryや他ubuntu系列にmotioneye入れる方法

# 必要パッケージ類のインストール 
sudo apt install -y python-pip curl libssl-dev libcurl4-openssl-dev libjpeg-dev

# 基盤ソフトを入れる
sudo apt install -y motion 

# motioneyeのインストール
sudo pip install motioneye

# motionの設定ファイル
mkdir -p /etc/motioneye
cp /usr/local/share/motioneye/extra/motioneye.conf.sample /etc/motioneye/motioneye.conf

# motionのメディアディレクトリ
mkdir -p /var/lib/motioneye

# initスクリプトの追加とmotionEyeサーバ起動
cp /usr/local/share/motioneye/extra/motioneye.systemd-unit-local /etc/systemd/system/motioneye.service
systemctl daemon-reload
systemctl enable motioneye
systemctl start motioneye

# motionEyeをアップグレード方法
sudo pip install motioneye --upgrade
sudo systemctl restart motioneye

# ブラウザからアクセス方法
http://(インストールしたマシンのIPアドレス):8765/
初回ログイン
Usename: admin
Password: (なし)
Perfumeボイスを高位合成/HDLコード生成でZynq実装！その1

# Perfumeボイス
Perfumeの独特な機械っぽいボイスはVocoderというエフェクトを使っている。
https://www.youtube.com/watch?v=KbiSxunJatM

Vocoderの曲はこの辺で見れる。https://www.youtube.com/watch?v=0kEHP2aUItA

VST Pluginなんかでフリーでもあると思うが、ZynqのボードZed Boardに実装してみようと思う。

# Zynq
ARM Cortex-AとFPGAが1チップになったものだが、今回は信号処理部分はFPGA側に実装予定。
Zed BoardにはAudio Codec(AD/DA)が実装されていて、Mini Pin Jackのアナログオーディオ入出力が付いている。これを使う。


# Vocoderアルゴリズム
昔買ったエフェクター自作術とかって本にアナログ回路でVocoder作成例が載っていたので、これをディジタル化することにした。一部抜粋（問題あれば削除します。）

![vocoder_schema.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/045bcc95-37f9-1231-5e1f-4621be8b95b9.png)

基本的にはオクターブバンドのBPF、Envelope Follower、VCA(Voltage Controled Amplifier)で構成されている。下図はブロック図。

![vocoder_blockdiagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/06938e4c-090f-4771-39db-0939779955e5.png)

# まずはOctave Filter設計

MATLABでOctave Filterを設計

```matlab:
%% Design octave filters
% Parameters
BandsPerOctave = 1;
N = 4;           % Filter Order
F0 = 1000;       % Center Frequency (Hz)
Fs = 44100;      % Sampling Frequency (Hz)

f = fdesign.octave(BandsPerOctave,'Class 1','N,F0',N,F0,Fs);
%% Design filters

F0 = validfrequencies(f);
Nfc = length(F0);
for n=1:Nfc
    f.F0 = F0(n);
    Hd(n) = design(f,'butter', 'FilterStructure', 'df1sos');
end
%% Visualize
hfvt = fvtool(Hd,'FrequencyScale','log','color','white');
axis([0.01 Fs*1.2e-3/2 -90 5])
title('Octave-Band Filter Bank')
```

フィルタの応答
![OctFiltBank.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/579149b5-bee7-4738-73b6-f4cfbbd846bd.png)

音声信号入力してシミュレーションできるよう、Simulinkブロック生成

```matlab:
%% Simulink block generation
for n=1:Nfc
    realizemdl(Hd(n), 'Blockname', ['Octave' num2str(n)])
end
```

生成されたのがこれ。
![octFiltModel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/84b07bfe-2e8e-616a-009b-698a9727b4a4.png)



[その２](https://qiita.com/SacredTubes/items/e8bfe5d005a821886a61)に続く・・・次回はEnvelope Filterなど作っていきたいと思っています。
javascriptで配列の末尾の要素を格好よく取得する

何とかArray.reduceRight()の使い道がないかなぁと考えていたら思いついたので。

Arrayの末尾が欲しいけど、``array[array.length-1]``は何か恰好悪いし、
``array.pop()``だと元の配列が破壊されてしまうからダメと言うシーンに。

# コード
``` javascript
const last = array.reduceRight(v => v);
```

# 解説
reduceRightに第二引数を与えなかった場合、accumulatorの初期値には末尾の要素がセットされます。
後は第一引数のコールバック関数でaccumulatorをそのまま返し続ければそのまま末尾の要素が結果として返ります。
(空配列に対して呼び出した場合はundefined)

# 注意事項
逆順にループを回すことになるので計算量的には極めてダメなパターンです。
対象となるArrayの長さが短いことが保証されているシーンだけにしましょう。
[SwiftUI]UIViewRepresentableにおける差分更新を最適化する

SwiftUIでは、UIViewをSwiftUIの世界に持ち込む際にUIViewRepresentableを利用します。
UIViewRepresentableはラップするUIViewのassociatedtypeと、UIViewの生成と更新を行う関数を保証するprotocolです。

```swift
public protocol UIViewRepresentable : View where Self.Body == Never {
    associatedtype UIViewType : UIView
    func makeUIView(context: Self.Context) -> Self.UIViewType
    func updateUIView(_ uiView: Self.UIViewType, context: Self.Context)
}
```

UIKitを使っていると、このUIViewRepresentableこそがビューの実体であるように思えますがUIViewRepresentableはあくまでもUIViewの生成と更新を行うだけでありUIViewのインスタンスはSwiftUIが独自に管理することになります。

さて、SwiftUIはビュー構造の中で変数が更新されるとbodyを再評価します。
通常SwiftUIのコンポーネントは内部的に差分の確認を行いますが、UIViewRepresentableの場合は無条件に更新関数がコールされます。

つまり更新関数の中で負荷の高い処理が行われている場合、その処理の結果が等価である場合も処理が通過してしまうということです。
これを防ぐ方法として、最終的にUIViewに渡す変数を全て保持しておけば良いですが実際はUIViewRepresentable側に隠しておきたいこともあると思います。

私の場合は、hashValueを元に前回の更新内容を比較して同じであれば処理をしないような以下のprotocolを定義しました。

```swift
protocol UIViewOptimizedRepresentable: UIViewRepresentable {
    associatedtype Value: Hashable
    var value: Value { get }
    init(_ value: Value)
    func shouldUpdateUIView(_ uiView: Self.UIViewType, context: Self.Context)
}

extension UIViewOptimizedRepresentable {
    func updateUIView(_ uiView: Self.UIViewType, context: Self.Context) {
        guard uiView.tag != self.value.hashValue else { return }
        shouldUpdateUIView(uiView, context: context)
        uiView.tag = self.value.hashValue
    }
}
```

hashValueはtagに隠していますが、気に入らない方はObjCRuntimeで隠しても良いと思います。
【初めての】Markdown記法で使う文字の出し方

# なぜこの記事を書いたのか
Qiitaで記事を書く中でMarkdownに使用する文字がキーボードで出せず、毎回書き方例のページからコピーしていました。
これが手間に感じたので、よく使う物の入力方法を記事化しました。
人によっては当たり前の情報もあるかもしれませんが、参考になれば幸いです。

## 装飾系
### コードのインライン表示

`こうするやつ`です。
`Shift + Option + _`を押します。
\`この記号を入力します。グレイヴ・アクセントと言うようです。

## 挿入系
### Markdownのエスケープ
例えば、コードのインライン表示を`こうするやつ`から\`こうするやつ\`です。
`Option + ¥`を押します。
記号１つひとつの直前に\を入力します。
Yocto LinuxをUbuntu 19.10で作る

#Yocto Linuxのメモ書き


### dockerビルド用のDockerファイル

Dockerfileを作る

```Dockerfile
FROM ubuntu:16.04
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get dist-upgrade -y && apt-get autoremove --purge -y \
 && apt-get install -y \
     gawk wget git-core diffstat unzip texinfo gcc-multilib \
     build-essential chrpath socat cpio python python3 python3-pip python3-pexpect \
     xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev \
     xterm \ 
     locales \
 && rm -rf /var/lib/apt/lists/*

# Locales
RUN dpkg-reconfigure locales \
 && locale-gen en_US.UTF-8 \
 && update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
ENV LC_ALL   en_US.UTF-8
ENV LANG     en_US.UTF-8
ENV LANGUAGE en_US.UTF-8
```

### dockerイメージ作成

下記コマンドでイメージ作成

```
sudo docker build -t yocto:latest .
```
### docker作業
イメージを動かす

```
sudo docker run --rm -u $(id -u):$(id -g) -v $(pwd):$(pwd) -w $(pwd) -i yocto:latest /bin/bash
```
現在のフォルダをdocker上にマウントして、ファイル作成

```
git clone -b pyro git://git.yoctoproject.org/poky
git clone -b pyro git://git.openembedded.org/meta-openembedded
git clone -b pyro git://git.yoctoproject.org/meta-raspberrypi
cd poky

souce poky/oe-init-build-env

bitbake-layers add-layer ../../meta-raspberrypi
bitbake-layers add-layer ../../meta-openembedded/meta-oe
bitbake-layers add-layer ../../meta-openembedded/meta-python
bitbake-layers add-layer ../../meta-openembedded/meta-browser
bitbake-layers add-layer ../../meta-openembedded/meta-networking
```

local.confのMACHINE名をファイルを置き換える
```
MACHINE ?= "raspberrypi3"
```

ビルドコマンドで実行
```
bitbake rpi-basic-image
```
[FileMaker]ダイアログが読まれないので目立たせた

# はじめに
ユーザ「なんか上手く動かんのやけど」
ワテ「何かメッセージでエラー出てなかったです？？」
ユーザ「あー、読まんと閉じてもたわ」

というやり取りをやったことありませんか？？
僕はかなりありますｗ

特に処理に時間がかかる系のスクリプトだと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130476/856f6f4b-cd3a-211d-15d3-7fee648750c8.png)
というカスタムダイアログを出して、ユーザに知らせたいけど、
その処理でエラーが出た時には
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130476/f9f9df97-ce09-3474-50be-e67311f8a2d3.png)
というカスタムダイアログを出しても


ユーザ「(完了のメッセージ出たわ)」


という認識で読まずに閉じられるんですよね。。。
別でログを落としても、ユーザが気付かずに先に進むことで、
リカバリーが大変になったりも。。。

なんせ、**処理失敗したらその時に気付いて欲しい！**
そのためには。。。文字を読まなくても、普段と違うのを感じれれば異常に気付く？と思い、
**ダイアログを変える**ことにしました。


## こんなダイアログ作りました。
**【完了のとき】**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130476/69d84590-429c-85ee-3dc4-c0d967a44c86.png)
**【エラーのとき】**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130476/ae61471f-90a1-ec08-f094-e37616cce6e0.png)

もはや**文字を読まなくても**違いが分かりますよねｗ
このダイアログにしてからは、読まれないことはなくなり、

ユーザ「黄色いのでたんスけど、見てもらえません？」

と問い合わせが来て、傷が浅いうちに対応できるようになりました。


## 他にもこんなことできます。
**【質問】**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130476/9f3e184d-afac-eec4-f515-2a74b28c6947.png)

- ボタンは3つまで表示可能。
- ダイアログのタイトルも書けます。
- もちろん文章の改行もOK。
- 戻り値で押下ボタンが分かります。

**【緊急】**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130476/731a6da8-e151-ab79-eee0-c0149bffcb78.png)

- ボタンラベルの変更
- デフォルトボタンの変更

(緊急の色がユーザがドキッっとしてしまうので、運用では使ってないです；)


## 使い方
[Github](https://github.com/manabuuuuun/FileMakerSample)でサンプルファイルを公開してます。
ファイル名：CustomDialog.fmp12
FM16、FM17で動作確認をしています。
「testレイアウト」で、いろいろ遊んでみてください！

各ソリューションへ持っていく方法は、
「DispCustomDialog」スクリプトのヘッダコメントの、【その他】に記載しています。
(レイアウトのコピーがもうちょっと簡単になればな～～)

どのメッセージを出すか？文言はどうするか？は引数で指定します。
その際、カスタム関数「SetProperty」「GetProperty」を使用して、必要なものだけ引数に指定します。
上記カスタム関数の説明は、[こちらの記事](https://qiita.com/manabuuuuun/items/21f9382386b8f952b19b)を参考くださいｍｍ


## 最後に
入力フィールドが設定できないので、完全に標準のカスタムダイアログに置き換わる事はできませんが、
ちょっとでもユーザに優しくなれればと思いますー！
CarrierWaveを使ってみた-画像のアップロード＋画像リサイズ機能の実装

画像をアップロードする機能を実装するために「CarrierWave」を使ってみたので、備忘録もかねてまとめます。
今回は画像（Image）をアップロードする想定＋その画像のリサイズもできるように実装することを想定してます。
基本的にはREADMEをベースに記載してます。

#Carrier Waveとは
Ruby on RailsなどのRackベースのアプリケーション向けにファイルをアップロードすることを可能にする'gem'。

##How to[使うための準備]
まず、carrierwaveの最新版をインストールします。

```:terminal
$ gem install carrierwave
```
次にRailsのGemfileに以下を追記します。

```rb:Gemfile
gem 'carrierwave', '~> 2.0'
```
最後にサーバーをリスタートし、変更を適用させてください。
*CarrierWaveのversion 2.0では、Rails 5.0以降・Ruby 2.2以降が要求されます。 

```:terminal
$ bundle install
```

##How to[画像アップロード機能]
アップローダーを生成します。

```:terminal
$ rails generate uploader image
```
これによって、以下のフォルダ・ファイルが生成されます。
app/uploaders/image_uploader.rb

モデルに紐づける場合は、モデルファイル内に以下の記載をしましょう。

```rb:model
mount_uploader :image, ImageUploader
```

##How to[リサイズ機能]
リサイズ機能を実装するには「Imagemagick」（画像処理ライブラリ）が必要となります。
まずはターミナルで「Imagemagick」をインストールしましょう。

```:terminal
$ brew install imagemagick
```
さらにRailsでリサイズ機能を実装するには、「RMagick」か「MiniMagick」というgemが必要となります。
READMEでは「MiniMagick」が推奨されているので、「MiniMagick」をインストールします。

```rb:Gemfile
gem 'mini_magick'
```

```:terminal
$ bundle install
```

リサイズ機能の詳細については、アップローダーのファイルに記載をします。
今回は通常のリサイズに追加でサムネイル用のリサイズも記載します。

```rb:app/uploaders/image_uploader.rb
include CarrierWave::MiniMagick
 process resize_to_fit: [800, 800]
 
 version :thumb do
   process resize_to_fill: [200,200]
 end
end
```
*resize_to_fit ：縦横比を維持したまま、width, heightを100pxにリサイズする。
*resize_to_fill ：縦横比固定でリサイズをして、さらにgravityで指定された位置をくりぬきます。
詳細は以下参考のwebサイトがわかりやすかったので、そちらご参照ください。


以上となります。最後までご覧いただき、ありがとうございました！
今後も学習した事項に関してQiitaに投稿していきますので、よろしくお願いします！
記述に何か誤りなどございましたら、お手数ですが、ご連絡いただけますと幸いです。

###参考
README
https://github.com/carrierwaveuploader/carrierwave/blob/master/README.md
Imagemagickとは
https://www.ossnews.jp/oss_info/ImageMagick
画像リサイズの種類
http://noodles-mtb.hatenablog.com/entry/2013/07/08/151316
JavaScriptで取得してきたDOMにイベントをトリガーするワンライナー

メモ書きです
Chrome DevToolsなどで実行すると幸せになるひとがいるかもです

## 取得した一つ目の要素に対して実行
``` javascript
document.querySelector('.className').dispatchEvent(new Event('mouseover', { 'bubbles': true }));
```

## 取得した全ての要素に対して実行
``` javascript
document.querySelectorAll('.className').forEach(e => {e.dispatchEvent(new Event('mouseover', { 'bubbles': true }))});
```

## 補足
- .classNameの箇所は[CSSセレクター](https://developer.mozilla.org/ja/docs/Learn/CSS/Building_blocks/Selectors)を指定しDOMを取得します
- mouseoverの箇所は実行する[イベント](https://developer.mozilla.org/ja/docs/Web/Events)を指定します
- IEでは起動しなさそう

## 参考
- Event: https://developer.mozilla.org/ja/docs/Web/API/Event/Event
- Eventのバブリング: https://www.webprofessional.jp/event-bubbling-javascript/
- https://stackoverflow.com/questions/2228376/trigger-onmouseover-event-programmatically-in-javascript
- https://qiita.com/ryounagaoka/items/a48d3a4c4faf78a99ae5
ワードプレスに外部HTMLファイルを設置してショートコードで呼び出す

ワードプレスのページ設定では出来ない複雑なページを作成したり、手早くランディングページ
を作成するために直接HTMLファイルをthemes直下に置くことでショートコードで呼び出せます。

ほとんどがこちらの[コード７区さん](http://ailaby.com/inc_html/#comment-32193)の手順にしたがっています。

個別テーマ直下にindex.htmlを入れたlandingpageフォルダを置きます。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137730/e2c8e2ab-d3ac-af19-7323-c6ba99f1e4a9.png)

functions.php内に下記のコードを記入します。

```php
function includeFile($atts) {
 
	if (isset($atts['file'])) {
		$file = $atts['file'];
		return file_get_contents(dirname(__FILE__) . '/' . $file);
	}
 
}
add_shortcode('include', 'includeFile');

```
これでショートコードを各ページから呼び出せます。
上記のlandingpageフォルダの例だと
```
[include file='landingpage/index.html']
```

これでHTMLが呼び出されますが、内部に画像のリンクがある場合、パスが違うため画像が表示されません。
ここで躓きました。
結局、ワードプレスの管理画面のメディアに画像を保管し、絶対パスか相対パスで指定することで表示されます。
絶対パス

```
src="https://[pageURL]/wp-content/uploads/2019/11/landingpage.png"
```
相対パス

```
src="wp-content/uploads/2019/11/landingpage.png"
```

これでＯＫです。
【初めての！】Visual Studio Codeのインストールと日本語化

# Visual Studio Code とは
Microsoft社が開発したオープンソースのテキストエディタです。
様々な機能がありながら、軽快な動作のため人気があります。

早速インストールしていきます。

# 環境
- MacBook Air (11-inch, Mid 2012)
- macOS Catalina バージョン 10.15.1

# Visual Studio Code のインストール
1. 利用環境に合わせてここからダウンロードします。

    https://code.visualstudio.com/Download

2. ダウンロードしたZipファイルを解凍します。
3. 解凍後に現れる`Visual Studio Code`というファイルをアプリケーションフォルダに移動します。
4. ダブルクリックして開きます。
4.1. 以下のメッセージが表示される場合があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285846/5dc7c8c2-eca3-181c-2754-35b39275248b.png)
4.2. そのまま`OK`ボタンを押し、システム環境設定 > セキュリティとプライバシー > 一般 の「ダウンロードしたアプリの実行許可」欄の`このまま開く`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285846/45e323b2-806d-2aae-381b-8abdac359796.png)
4.3. そのまま開くを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285846/9255ee68-4288-9376-1217-185a34b2f09c.png)
4.4. Visual Studio Code が起動しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285846/dcbc926d-b2ec-1385-5f53-b94101e18b68.png)

# Visual Studio Code の日本語化
1. 左側の４つの四角のひとつが欠けたようなマークをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285846/d84e4d7e-2e8d-a2af-abbb-6529146d880e.png)
2. 検索ワード入力欄に`Japanese`と入力します。
3. `Japanese Language Pack for Visual Studio Code`を選択し、`Install`ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285846/b7a8f294-a61a-257c-3dcf-fba9b65ec42d.png)
4. 再起動が必要ですので`Restart Now`を押します。
5. VS Code再起動後、日本語になったようですがもう少し設定が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285846/7e0412c5-f397-adb3-b867-1a5ac733d860.png)
6. `Command + Shift + P` を押して、`Configure Language`と入力し、**Configure Display Language** コマンドを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285846/7eee315e-8ab7-1bbd-403a-2c8c32fa1e8d.png)
7. `ja`を選択してEnterを押します。
8. 再起動を促されますので、そのまま再起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285846/3a42b1a0-f720-74c8-636f-20b6f65bfab2.png)
9. 以上で完了です！
kintoneカスタマイズ基礎-モバイルの動作-

# kintoneのアプリをモバイルで開いた時に、アラートを出す
```js

(function() {
    "use strict";
    //レコードの一覧、詳細画面で適用する
    var events = ['mobile.app.record.index.show',
                    'mobile.app.record.detail.show'
                ];
    kintone.events.on(events, function(event) {
        alert('このアプリはモバイル対応しておりません。TOP画面に戻ります。');
        location.href = 'アラートを閉じた後に飛ばしたいURL';
    });
})();
```
[Pandoc]複数のmarkdownからpdfに変換し、目次の前に表紙をつける

## 結論
とりあえず方法を知りたい方向けに先にTipsだけのせときます。

**`-B`を使用してカバーページを指定する。**
  
以上、解散！
  
  

---
以下の事項に興味のある方は続きをどうぞ。

- 環境構築が少なくてすみそうな方法
- powershellで作成
- 複数ファイルのmarkdownを1つのpdfにする
- pdfのマージン
- 目次の付け方

みたいなことが書いてあります。

## 環境
業務内で資料作成方法を横展開するため、環境構築がやさしそうな構成を考えました。
dockerを使えるならそれが一番楽そうです。
どうしてもgitで文書管理をしたかったんや。(excelはもういや!)

- windows
- pandoc v2.7.3
  - wkhtmltopdf
- plantUML(使用しなくてもok)

## Powershellで実行
使い慣れているのでPowershellです。
複数のmarkdownファイルを一つにまとめます

```PowerShell
Set-Location ../
# 表紙とREADME.mdを除いたすべてのファイルパスを取得
$files_except_cover = Get-ChildItem ./ -Recurse -Name -include *.md -Exclude README.md, *cover.md
# 表紙のパス
$cover_path = Get-ChildItem ./ -Recurse -Name -include *cover.md
# ファイル名
$pdf = "main.pdf"

pandoc `
    # 目次の前に入るmarkdownを指定します
    -B $cover_path `
    # 目次が自動で付きます。-toc-depthはどこの見出し(h)まで目次をつけるか
    --toc -toc-depth=2 `
    # 見出しを採番します。見出しの行に{.unnumbered}をつけることで採番をキャンセルできます
    -N `
    # 複数ファイルをまとめて書き出し
    $files_except_cover -f markdown -t html5 `
    # cssの適用(githubのcssを拾ってきています)
    -c "./pdf/css/github.css" `
    # pdf化した際の、余白の設定
    -V margin-top=12 `
    -V margin-right=5 `
    -V margin-left=5 `
    -V margin-bottom=12 `
    # 書き出す場所と名前
    -o "./pdf/$($pdf)" `
    # タイトルがないとエラーを吐くのでつけてます
    --metadata pagetitle=タイトル
```

## 表紙のMarkdownとCSS
めちゃくちゃ簡素な表紙ですがないよりまし。

```markdown
<div class="box-title">
    <p>
    <span class="title">ここがタイトル</span>
    </p>
    <p>
    <span class="sub-title">こちらサブタイトル</span>
    </p>
    <p>
    <span class="author">一応著者名も</span>
    </p>
    <p>
    <span class="date">日付はよろしく</span>
    </p>
</div>

<!-- 改ページ -->
<div style="page-break-before:always"></div>
```

```css
/* ざっくりCSSなので参考程度で */
.box-title {
  margin-top: 40%;
}

.box-title,
.box-title p {
  text-align: center;
}

.title {
  font-size: 80px;
}

.sub-title {
  font-size: 64px;
}

.author {
  font-size: 32px;
}

.date {
  font-size: 32px;
}

```
## PlantUML
pandocのフィルターで変換もできるけど、色々ややこしかったので、
ローカルでpngに変換してからmarkdownにリンクを書き込み、pdf変換にしています。
環境構築的には楽です。(なんどもいうけどdockerが良さそうよ)

## まとめ
まだまだいい方法がありそうですが、コスト的にここで妥協します。
良さそうな方法を思いつき次第更新します。

## 参考
[pandocでマークダウンをPDF化する(LaTexなし)](https://qiita.com/KI1208/items/46aa9adcdf36a7a716d1)
[Pandoc ユーザーズガイド 日本語版](http://sky-y.github.io/site-pandoc-jp/users-guide/)
Hello World！ 目指せエンジニア！

初めまして。 ゆきたかといいます。

趣味でコーヒーを自家焙煎しています。

webエンジニアを目指して学習を始めました。
HTML/CSS、Ruby、Rails、Javascript、jQueryを触っています。

学習した感想や、気づいたことをアウトプットしていきたいと思います。

よろしくお願い致します。
任意ビット数の素数作成 Python コード RSA

```python

from random import randrange, getrandbits
def is_prime(n, k=128):
    """ Test if a number is prime
        Args:
            n -- int -- the number to test
            k -- int -- the number of tests to do
        return True if n is prime
    """
    # Test if n is not even.
    # But care, 2 is prime !
    if n == 2 or n == 3:
        return True
    if n <= 1 or n % 2 == 0:
        return False
    # find r and s
    s = 0
    r = n - 1
    while r & 1 == 0:
        s += 1
        r //= 2
    # do k tests
    for _ in range(k):
        a = randrange(2, n - 1)
        x = pow(a, r, n)
        if x != 1 and x != n - 1:
            j = 1
            while j < s and x != n - 1:
                x = pow(x, 2, n)
                if x == 1:
                    return False
                j += 1
            if x != n - 1:
                return False
    return True
def generate_prime_candidate(length):
    """ Generate an odd integer randomly
        Args:
            length -- int -- the length of the number to generate, in bits
        return a integer
    """
    # generate random bits
    p = getrandbits(length)
    # apply a mask to set MSB and LSB to 1
    p |= (1 << length - 1) | 1
    return p
def generate_prime_number(length=1024):
    """ Generate a prime
        Args:
            length -- int -- length of the prime to generate, in          bits
        return a prime
    """
    p = 4
    # keep generating while the primality test fail
    while not is_prime(p, 128):
        p = generate_prime_candidate(length)
    return p
print(generate_prime_number(2048))

```

2048ビットの素数例：

20948172001047358695787926888543743007121894047281908178348238095923963654562944507571635573909599330750753908673791853434139259413498165407600798568046507417382554220603146857898880242139067942230420218948994690003175384321032039386546524503466171675149316582304280062366747568422231701323955309340021375493571986613299600962261395718838935046659674806867659406735896778288176596852814927057082033184374768674561673765820787184619224336304267299492915726404455278589609784860501087313584245593398727512979161685117567902676990934207293923153569022277053938151385766936395777706415035184876785227611987928216386762133
Dart: String.fromEnvironment()の値が取得できない

## 問題

dart2.6の`dart2native`で遊ぼうとしたら`String.fromEnvironment()`でハマりまくったのでメモがてら記事にしました。
`dart2native`コマンドで`-D`フラグをつけて定数を埋め込んでワンバイナリにできるようなので試しに下記のコードで確認しようとしたところ・・・。

```dart:main.dart
void main() {
  print(String.fromEnvironment('hoge'));
}
```

```bash
$ dart2native -Dhoge=fuga main.dart -o main
$ ./main
null
```

**`null`しかでない！！**
どこが悪いのか一向に変わらず2時間ほど格闘していました。。。

## 結論

> `const`つけよう

```dart:main.dart
void main() {
  print(const String.fromEnvironment('hoge'));
}
```

`String.fromEnvironment()`をconstで宣言しなければいけなかったというしょーもないオチです。
そもそも`fromEnvironment`って環境変数を取れそうみを出しつつそうじゃない部分が気に食わないのですが。
ちなみに環境変数は`dart:io`の`Platform.environment['環境変数名']`なので覚えておきましょう。

## 最後に

`dart2native`と`String.fromEnvironment()`でワンバイナリ+埋め込まれた定数を扱えるようになったのでそろそろサーバサイドDartに本気を出すのもいいのではないかと思う今日この頃です。
手始めにgoで書いてたcliツールとかdartで書き直してみようかと思います。
これを機にflutter以外のdartにも目を向けてもっとdartにのめり込みましょう :+1:
PID file creation will be removed in Sidekiq 6.0 に対応する

## はじめに
sidekiq起動時のlogに以下が表示されるようになったので対応をする

```
WARNING: PID file creation will be removed in Sidekiq 6.0, see #4045. Please use a proper process supervisor to start and manage your services
WARNING: Logfile redirection will be removed in Sidekiq 6.0, see #4045. Sidekiq will only log to STDOUT
WARNING: Daemonization mode will be removed in Sidekiq 6.0, see #4045. Please use a proper process supervisor to start and manage your services
```

[詳細はこちらのissue](https://github.com/mperham/sidekiq/issues/4045)

## 結論
sidekiqのprocess管理をsystemdにする（`systemctl` を使用する）

## 参考記事
[unicornとsidekiqをユーザレベルのsystemdで自動起動](http://ossan-engineer.blogspot.com/2015/09/unicornsidekiqsystemd.html)
[*.serviceの書き方](https://qiita.com/masami256/items/ef0f23125cf8255e4857)
[systemdサービス管理ガイド](https://dev.classmethod.jp/cloud/aws/service-control-use-systemd/)

## 手順書

### 設定例
[sidekiqのexampleにある](https://github.com/mperham/sidekiq/blob/master/examples/systemd/sidekiq.service)

```/etc/systemd/system/sidekiq.service
#
# systemd unit file for CentOS 7+, Ubuntu 15.04+
#
# Customize this file based on your bundler location, app directory, etc.
# Put this in /usr/lib/systemd/system (CentOS) or /lib/systemd/system (Ubuntu).
# Run:
#   - systemctl enable sidekiq
#   - systemctl {start,stop,restart,reload} sidekiq
#
# This file corresponds to a single Sidekiq process.  Add multiple copies
# to run multiple processes (sidekiq-1, sidekiq-2, etc).
#
[Unit]
Description=sidekiq
# start us only once the network and logging subsystems are available,
# consider adding redis-server.service if Redis is local and systemd-managed.
After=syslog.target network.target

# See these pages for lots of options:
#
#   https://www.freedesktop.org/software/systemd/man/systemd.service.html
#   https://www.freedesktop.org/software/systemd/man/systemd.exec.html
#
# THOSE PAGES ARE CRITICAL FOR ANY LINUX DEVOPS WORK; read them multiple
# times! systemd is a critical tool for all developers to know and understand.
#
[Service]
Type=simple
WorkingDirectory=/var/www/my_service/current/
# If you use rbenv:
# ExecStart=/bin/bash -lc '/home/deploy/.rbenv/shims/bundle exec sidekiq -e production'
# If you use the system's ruby:
ExecStart=/usr/local/rbenv/bin/rbenv exec bundle exec sidekiq -e staging

# use `systemctl reload sidekiq` to send the quiet signal to Sidekiq
# at the start of your deploy process.
ExecReload=/usr/bin/kill -TSTP $MAINPID

User=user_namge
Group=user_group
UMask=0002

# Greatly reduce Ruby memory fragmentation and heap usage
# https://www.mikeperham.com/2018/04/25/taming-rails-memory-bloat/
Environment=MALLOC_ARENA_MAX=2

# if we crash, restart
RestartSec=1
Restart=on-failure

# output goes to /var/log/syslog
StandardOutput=syslog
StandardError=syslog

# This will default to "bundler" if we don't specify it
SyslogIdentifier=sidekiq

[Install]
WantedBy=multi-user.target
```
【PyQt】QtChartで複数軸のグラフを表示

# はじめに
 今までPythonでのグラフ表示・作成には[pyqtgraph](https://github.com/pyqtgraph/pyqtgraph)を使用していました。しかし、ここ3年くらいアップデートもされていないようなので、どうせならQtがサポートしているものに乗り換えたい、、、ということで、[QtChart](https://doc.qt.io/qt-5/qtcharts-index.html)を使ってみました。

# 環境
+ Windows 10
+ Python 3.7.3
+ PyQt5 5.13.1
+ PyQtChart 5.13.1

# インストール
`$ pip install PyQt5`

`$ pip install PyQtChart`

# 作成したサンプル
![qchart_sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404447/2cb9f42d-4d44-b16b-5e44-41aa649d4bcd.png)

X軸が時間、Y軸が電流・電圧というものを作成しました。

ソースは以下の通り。

```python:qchart_example.py
import random
import sys

from PyQt5.QtChart import (QChart,
                           QChartView,
                           QLineSeries,
                           QValueAxis,
                           QDateTimeAxis)
from PyQt5.QtCore import (QDateTime,
                          Qt)
from PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import QApplication


app = QApplication(sys.argv)

cur_series = QLineSeries()
vol_series = QLineSeries()
now = QDateTime.currentDateTime()

# 適当なデータを作成
for i in range(100):
    cur = 5 * random.random()
    vol = 20 * random.random()
    time = now.addSecs(i).toMSecsSinceEpoch()  # QLineSeriesにappendするための処理
    cur_series.append(time, cur)
    vol_series.append(time, vol)

chart = QChart()
chart.legend().hide()
chart.addSeries(cur_series)
chart.addSeries(vol_series)

# X軸を作成
time_axis_x = QDateTimeAxis()
time_axis_x.setFormat("hh:mm:ss")
chart.addAxis(time_axis_x, Qt.AlignBottom)
cur_series.attachAxis(time_axis_x)
vol_series.attachAxis(time_axis_x)

# Y1軸を作成
cur_axis_y = QValueAxis()
cur_axis_y.setTitleText("Current[A]")
cur_axis_y.setLinePenColor(cur_series.pen().color())  # 軸とチャートの色を同じにする
cur_axis_y.setRange(0, 5)
chart.addAxis(cur_axis_y, Qt.AlignLeft)
cur_series.attachAxis(cur_axis_y)

# Y2軸を作成
vol_axis_y = QValueAxis()
vol_axis_y.setTitleText("Voltage[V]")
vol_axis_y.setLinePenColor(vol_series.pen().color())  # 軸とチャートの色を同じにする
vol_axis_y.setRange(0, 20)
chart.addAxis(vol_axis_y, Qt.AlignRight)
vol_series.attachAxis(vol_axis_y)

cur_vol_chart_view = QChartView()
cur_vol_chart_view.setChart(chart)
cur_vol_chart_view.setRenderHint(QPainter.Antialiasing)  # チャートを滑らかに表示するため
cur_vol_chart_view.show()

sys.exit(app.exec_())

```

# 参考URL
+ https://doc.qt.io/qt-5/qxyseries.html#at
+ https://doc.qt.io/qt-5/qvalueaxis.html#setRange
+ https://doc.qt.io/qt-5/qlineseries.html
+ https://doc.qt.io/qt-5/qtcharts-datetimeaxis-example.html
+ https://doc.qt.io/qt-5/qdatetime.html#currentDateTime
+ https://doc.qt.io/qt-5/qdatetimeaxis.html#tickCount-prop
+ https://doc.qt.io/qt-5/qtcharts-multiaxis-example.html
rangeを使った写経

やったーーー。
写経からの一人で実装できたよ!!!!


1から100までの数字を表示。
3の倍数だったら数字の代わりにFizzを表示。
5の倍数だったら数字の代わりにBuzzを表示。
3と5のばいすうだったら数字の代わりにFizzBuzzを表示。

https://aiacademy.jp/texts/show/?id=161


これどーゆー時に使えるものかとか全然わからんけどとりあえず一人でかけて理解できてうれしい。
やったーーー
初心者が独学で失敗したこと

WEB系企業に転職を目指し、独学で学習中です。
やらなければよかった、選択を間違えたという失敗談を記します。
※学習中のため、失敗が増えるたびに更新します。
（2019/11/20)内容順に項目を並べていましたが、追記順（後尾に追加）に変更しました。タイトルを変更しました。

#PCにコストをかけすぎた（かも）
WEB系ならmacbook！ということで、何はともあれmacbook airをメモリ増設で発注しました。
macという選択肢は良かったのですが、増設により届くまで１週間ほどかかりました。
（届くまでの間はprogateをやっていました）

オーバースペックだったかもしれません。
あと、選ぶのに時間をかけすぎました。やっと選んで発注してもそれからすぐには届きません。

####（教訓）macならなんでも良かった気がします。

（windowsをベースに解説してある書籍が意外と多いので、人によってはwindows PCでも問題ないかもしれません）


#Rubyから始めたのに、PHPに手を出した
地方在住・年齢（アラフォー）・独学という悪条件があったため、途中でPHPに一旦切り替えましたが、学習の進捗がかなり難航しました。

テキスト選びに失敗したのかもしれませんが、２０１９年時点ではRubyの方がPHPより「定番」と言われる学習ツールが充実しており、かつ、少なくとも関西ならばPHPとRubyでそれほど求人件数も変わりませんでした。

しかも、 何か一つやったら、あとから言語を変えても遅くないようです。

####（教訓）とりあえず、Rubyから始めて問題なさそうです。

#Windows推しっぽい書籍を選んでしまった

具体的にいうと、「気づけばプロ並みPHP」という本なのですが、本当にどハマりしてしまいました。

環境構築（XAMPP）が全く進まない・¥マークの表示など、ほとんどの時間を本筋とは別のところで使ってしまい、力尽きました。

ちなみ、上記書籍はPHPなのかSQLなのかHTMLなのか、よくわからないままごちゃごちゃになってしまったのも辛かったです。

####（教訓）自分の環境に近い書籍や教材を選ぶ
####（教訓）WEB系を目指すならば、WEB系の仕事についている著者の書籍を選ぶ

ちなみに、もっとも環境設定などで詰まることがないのは「ドットインストール」だと思います。
「〜〜以降のバージョンではこの作業は不要となりました」など注意喚起してくれ、アップデートが早いです。

#余分なスペースを入れてしまい、バグ発生

最初Progateを始めたときに、すごく印象に残ったのが「スペースや改行を入れて、見やすくしなさい」という文言。それに基づいてやっていましたが・・・

スペースを入れてはいけないところがあるというのは最初知らずにかなりハマったことがありました。

全角と半角、特に全角スペースを入れてしまうとダメと色々な教材でよく注意されます。
加えて、スペースをそもそも入れてはいけないところがあるというのも要注意でした。
（知らなかったですし、見やすければいいのだと思っていました）

特に書籍はスペースがわかりにくいので、ホントに注意が必要です。

####（教訓）スペースはときどき、入れてもダメ、入れなくてもダメ。

#Railsチュートリアルでcloud9を選択した

これは現在進行中（２０１９年１１月）です。

railsチュートリアルの第１章で、ローカル環境開発かIDE(cloud9)かを選ぶ際に、チュートリアルの文章的にはcloud9推しという感じだったので、cloud9を選びました。
が、cloud9に起因すると思われるエラーから抜け出すのに時間がかかっています。

ちなみに、チュートリアルで最初にcloud9推しっぽい（と感じた）のですが、そのあとすぐに説明の中心がローカルが基本となり、肩透かしをくらった気分になりました・・・。

####（教訓）Railsチュートリアルではローカル環境開発がおすすめ

#いちいちシャットダウンしてしまう

隙間時間にもできる限り先にすすめていく独学のため、いちいちシャットダウンしてしまうと、作業を開始するのにすごく時間がかかってしまいます。

icloud9 などは毎回作業が必要だったり、時間が経つと勝手にきれていたりして、
私はどこから始めて良いかわからなくなってしまったり、しなくてもいいことを再度してしまったり、
コードがおかしくなるということが数回ありました。

閉じるだけだと、すぐに前と同じ環境で始められて、すごく便利です。

####（教訓）macbookはシャットダウンせず、閉じるだけ

#ググって、設定を変えてしまう

独学のため、何かエラーが出ると、とりあえずググって解決方法を探します。

ところが、これが結構落とし穴で、ググっているときは藁をもすがる思いで、該当しそうなアドバイスを探してあれこれやってみるのですが、これがとんだ落とし穴にはまること数回・・・。

あっちこっちの情報からひっぱてくるので、通常考えられないようなところにボトツネックが発生。にっちもさっちもいかなくなります。

####（教訓）設定は安易にいじらない

#ファイルの作成場所が違うことに気づかない

Railsチュートリアル4.4.5 ユーザークラスにて、いくらirbから
```require './example_user'```
としても
```LoadError (cannot load such file -- ./example_user)```

結局、VSCodeにて、ファイル（example_user.rb）を違うフォルダの中に作ってしまっているだけでした・・・。そりゃ、ググっても解決しませんよね・・・。

####（教訓）ファイルを追加するときは、追加する場所に要注意

#"_" と "-"を間違える

Railsチュートリアル　リスト７．２２にて、
@extend .has-error;と書くべきところ、　@extend .has_error;　としていました。

何回も何回も見たのに・・・。
ついに、チュートリアルのせいにしていましたが、全然違いました。イージーミス。
ごめんなさい、疑って・・・。

####（教訓）記号の間違いに注意する


###【更新履歴】
2019/11/18 ２項目追加
2019/11/20 1項目追加
2019/11/27 1項目追加
spleeterを試してみた

##**はじめに**
リップシンクのために楽曲のヴォーカルと楽器を分離できるツールを探していたところ
[spleeter](https://gigazine.net/news/20191107-spleeter/)というツールが最近公開されたことを知り早速試してみました。

##**準備**
pipを使ってspleeterをインストールします。

```python
pip install spleeter
```

##**試してみた**
曲を突っ込んで分離するだけならこれでいけるみたいです。
multiprocessingを使ってる関係で `if __name__ == '__main__'`の記述がないと
永遠にループするようです。(気づかずに1時間ほど回しっぱなしにしてた↓↓↓)

```python
from spleeter.separator import Separator


def test():
    separator = Separator('spleeter:2stems')
    separator.separate_to_file(r"楽曲ファイルのパス", r"保存先のディレクトリ")


if __name__ == '__main__':
    test()
```

##**感想**
けっこういい感じに分離できます。多少分離できてない所はありますが、まあ仕方ないかな~くらいで
良い感じです。
パラメーターも色々調整できるっぽいです。
Firebase Cloud MessagingのFCMトークン更新タイミングについて

# FCMトークンの仕様
Firebase Cloud Messagingを使ってアプリへのプッシュ通知テストをする際に、Firebaseコンソール上で対象デバイスのFCMトークンを登録する必要があります。
![スクリーンショット 2019-11-13 18.24.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6380/b96ec29a-dffc-ede4-7486-c76491810e8b.png)
このFCMトークンがデバッグ中にいつのまにか変わっていることがあり、挙動を把握するためドキュメントで仕様を確認してみました。

OS毎に挙動が異なるようだったので、それぞれの生成・更新タイミングをメモしておきます。
# Android

【参照】[Android で Firebase Cloud Messaging クライアント アプリを設定する | Firebase](https://firebase.google.com/docs/cloud-messaging/android/client?hl=jp)

## 生成タイミング
> アプリを初めて起動すると、クライアント アプリのインスタンスの登録トークンが FCM SDK によって生成されます。単一のデバイスを対象にする場合、またはデバイス グループを作成する場合は、FirebaseMessagingService を拡張して onNewToken をオーバーライドすることで、このトークンにアクセスする必要があります。
> 
> https://firebase.google.com/docs/cloud-messaging/android/client?hl=jp#sample-register

## 更新タイミング
> トークンは最初の起動後にローテーションされている可能性があるため、更新された最新の登録トークンを取得することを強くおすすめします。
> 
> 登録トークンは次のような場合に変更されることがあります。
> 
> - アプリによってインスタンス ID が削除される場合
> - アプリが新しいデバイスで復元される場合
> - ユーザーがアプリをアンインストール / 再インストールする場合
> - ユーザーがアプリのデータを消去する場合
> 
> https://firebase.google.com/docs/cloud-messaging/android/client?hl=jp#sample-register

# iOS
【参照】[iOS で Firebase Cloud Messaging クライアント アプリを設定する | Firebase](https://firebase.google.com/docs/cloud-messaging/ios/client?hl=jp)
## 生成タイミング
> デフォルトでは、FCM SDK はアプリの起動時にクライアント アプリのインスタンスの登録トークンを生成します。APNs デバイス トークンの場合と同様に、このトークンを使用すると、ターゲットとする通知をアプリの特定のインスタンスに送信できます。
> 
> https://firebase.google.com/docs/cloud-messaging/ios/client?hl=jp#access_the_registration_token

## 更新タイミング
> iOS が通常、アプリ起動時に APNs デバイス トークンを配信するのと同じ方法で、FCM は FIRMessagingDelegate の messaging:didReceiveRegistrationToken: メソッドによって登録トークンを提供します。FCM SDK は、アプリの初期起動時ならびにトークンが更新または無効化されるたびに、新規または既存のトークンを取得します。いずれの場合も、FCM SDK は有効なトークンを使用して messaging:didReceiveRegistrationToken: を呼び出します。
> 
> 登録トークンは次のような場合に変更されることがあります。
> 
> - アプリが新しいデバイスで復元される場合
> - ユーザーがアプリをアンインストール / 再インストールする場合
> - ユーザーがアプリのデータを消去する場合
> 
> https://firebase.google.com/docs/cloud-messaging/ios/client?hl=jp#access_the_registration_token

# これまで受信できていた場合はトークン更新の有無を確認
Cloud Messagingの動作確認中、急にテスト通知が届かなくなった場合は、上記タイミングでFCMトークンの更新がかかっていないか確認しましょう。
よく忘れる＆困った時に便利な git コマンド

## ブランチ作成と削除
ローカルブランチ作成

```
$ git checkout -b LOCAL_BRANCH_NAME
```

リモートブランチ作成

```
$ git push -u origin REMOTE_BRANCH_NAME
```

ローカルブランチ削除

```
git branch --delete LOCAL_BRANCH_NAME
```

リモートブランチ削除

```
git push --delete origin REMOTE_BRANCH_NAME
```

## 作業スペースのクリア
作業スペースの修正内容を全て戻す

```
$ git reset --hard HEAD
```
※修正した内容が全て無くなるので注意。

### 役に立ったコマンド


push前のコミットログを表示する

```
git log origin/master..master
```

一番最新のコミットした内容をステージング状態に戻す

```
git reset --soft HEAD^
```

ステージング状態のファイルを作業スペースに戻す

```
git reset HEAD ファイル名
```

戻りたいコミットに戻る

```
git reset --hard [コミットid]
```

最新のコミットに戻る、HEADの位置はそのままで、ステージング・作業スペースの変更のみ消える

```
git reset --hard HEAD
```

### 補足
- ステージング：修正内容をaddした後、commitする前
- 作業スペース：修正内容をaddする前



## 参考サイト
https://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe
【Ruby】Nokogiriでhtmlのデータをcsvファイルに出力

#概要
アウトプット用に、学習した内容を紹介していきます。
本日はNokogiriというライブラリを用いて、簡単なhtmlからデータをCSVに出力してみようと思います。

#環境
Mac OS Mojave 10.14.6
Ruby 2.5.3
エディタ VSCode
Nokogiri 1.10.5

#htmlで取得したデータをcsvに
以下のhtmlから、rowクラスのtitleとdescriptionを取得してcsvファイルに出力します。

```html:training.html
<html>

<head>
  <meta charset="utf-8" />
</head>
<div class="row">
  <div class="title">タイトル１</div>
</div>
<div class="row">
  <div class="title"></div>
  <div class="description">解説２</div>
</div>
<div class="row">
  <div class="title">タイト",ル３</div>
  <div class="description">解説３</div>
</div>

</html>
```
これをcsvファイルに出力するコードが以下。

```Ruby:html_to_csv.rb
require 'nokogiri'
require 'CSV'

html = File.open('./training.html','r')

doc = Nokogiri.parse(html)

# div class="row"の取得
doc_row = doc.css('div.row')

doc_csv = []
# doc_csvにtitleとdescriptionを格納
doc_row.each do |row|
  doc_csv << [
    row.css('div.title').text,
    row.css('div.description').text
  ]
end

# Fileに出力
File.open('training.csv', 'w') do |file|
  # bomを付加
  file.print("\uFEFF")

  doc_csv.each do |row|
    file.puts(row.to_csv)
  end
end
```
`doc = Nokogiri.parse(html)`で開いたhtmlファイルをNokogiriで解析し、docに格納します。
rowクラスごとにtitle、descriptionを取得したいので、まず`doc_row = doc.css('div.row')`でrow以下の階層を取得します。
その下のループでは、doc_csvにtitleとdescriptionの配列を一つずつ格納します。
最後に`FILEに出力`以下で、csvファイルへ出力します。
bomを付けることで、エクセルで開いても文字化けせずに表示してくれます。

`CSV.generate(bom)`などでもbomを付けることができますが、Rubyの2.5系でCSV.generateにバグがあるようです。この場合はRubyのバージョンを変更して用いる必要があります。

```:training.csv
タイトル１,""
"",解説２
"タイト"",ル３",解説３
```
titleとdescriptionが取得できました。またtitleやdescriptionが存在していない場合も空白として出力されています。
Heroku勉強推進＆スケジュール

#１．事前準備（期間：2週間）
##Level1 （1週目）
- [Heroku Enterprise を使用したアプリケーションの開発](https://trailhead.salesforce.com/ja/content/learn/trails/heroku_enterprise)
 - Heroku Enterprise の基礎
 - Heroku Flow
 - Salesforce と Heroku のインテグレーション
 - クイックスタート: Heroku への Java アプリケーションのリリース
 - Salesforce に統合する Heroku アプリケーションの開発

##Level2 （2週目）
- **[Node js開発者のためのHeroku入門](https://www.youtube.com/watch?v=e69qk50BMjA&t=1172s)**
- **[Ruby開発者のためのHeroku入門](https://www.youtube.com/watch?v=DlmIUsXuZyo)**
- **[PHP開発者のためのHeroku入門](https://www.youtube.com/watch?v=ePrE8kTAY2E)**
- **[Python開発者のためのHeroku入門](https://www.youtube.com/watch?v=3aKhkOoLMaE)**
- [Heroku Pipelineを使ってみる](https://qiita.com/yo-iida/items/f99566fe4617f848fa39)
- [GitHubアカウント作成とリポジトリの作成手順](https://qiita.com/kooohei/items/361da3c9dbb6e0c7946b)
- [heroku 初級編 - GitHub から deploy してみよう](https://qiita.com/sho7650/items/ebd87c5dc2c4c7abb8f0)
- [Node.jsでのHerokuチュートリアル前編](https://qiita.com/shti_f/items/b4b5d830672d908eff4e)
- [Node.jsでのHerokuチュートリアル後編](https://qiita.com/shti_f/items/a384b4724610462f6d8c)

#2.知識Share （期間：6週間）
##Level1（3週目～6週目）　：　LT資料作成
※基本的に「事前準備」から抜粋した内容です。

- [Heroku入門(Windows)](https://qiita.com/xuwenzhen/items/81ed1960476dcaf88759)
- [01.Herokuの概要](https://qiita.com/xuwenzhen/items/3e1e5c1482d7ed61bcd3)
- [02.Git＆GitHubの紹介](https://qiita.com/xuwenzhen/items/eb484f9e4745d3b9154a)
- [03.Heroku+Node.jsの使い方](https://qiita.com/xuwenzhen/items/f093f2c3f5505ceff141)
- [04.Heroku を使用した 継続的インテグレーションと継続的デプロイ](https://qiita.com/xuwenzhen/items/24aa224e984b807ae924)
- [05.Salesforce と Heroku のインテグレーション方法](https://qiita.com/xuwenzhen/items/a73c0328ddd53422f04b)
- [06.Heroku Connect 紹介](https://qiita.com/xuwenzhen/items/9138c85d690e6bf5189b)

#Level2（7週目～8週目）　：　Demo 作成
- [07.Heroku Demo作成（Node JS）](https://qiita.com/xuwenzhen/items/1d6f27c8fdf0da4ee9ab)

#3.Heroku資格
「PL/SQL」実行環境構築

Oracle社が非手続き型言語であるSQLを独自に拡張したプログラミング言語、
「PL/SQL※1」を実行できる環境を構築しましたので、記事にさせていただきました!o(*^▽^*)o
※1 Procedural Language = 手続き型言語

こちらから「Oracle Database 12c Release 2」をダウンロードしました。
https://www.oracle.com/technetwork/jp/database/enterprise-edition/downloads/index.html

1.「setup.exe」を管理者権限で実行
![2019-11-11_11h26_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383237/8a2e654f-018f-970e-1201-494d84b20f7b.png)
2.「セキュリティ・アップデートをMy Oracle Support経由で受け取ります。」のチェックを外しました。
![2019-11-11_11h26_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383237/ba85c413-7fb6-0bb3-0555-a2423ac10ae9.png)
3.「データベースの作成および構成」を選択
![2019-11-11_11h29_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383237/9a159de2-df73-44d0-5fc1-f9d1be23f654.png)
4.「デスクトップ・クラス」を選択
![2019-11-11_11h29_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383237/7ae0e6d6-8bca-2c91-bace-7a9b59ee1232.png)
5.新規Windowsユーザの作成で「ユーザ名」「パスワード」を入力
![2019-11-11_11h31_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383237/383af38d-1b0a-2562-043c-d623597e3280.png)
6.「グローバル・データベース名」「パスワード」を入力
![2019-11-11_11h36_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383237/55949683-dd7e-c402-d5fa-15c6a14d856e.png)
7.「インストール」を押下
![2019-11-11_13h42_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383237/ef87de07-46fa-a0f8-1d20-6852039ddfb4.png)
8.成功しました。
![2019-11-11_14h10_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383237/a4773c2b-d8db-53a6-ff46-517d9cad8e63.png)
9.自動的にダウンロードされた「Sqlplus」を起動
「sqlplus / as sysdba」と入力して、Enterキーを押下
![2019-11-11_14h14_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383237/bd5ba26a-14a5-8f5b-df2a-51c84011afd6.png)
インストール時に自動的に作成された管理ユーザー・アカウント「sysdba」で接続する。
パスワードは、認証機能をOSに代行しているので不要とのこと。

```
sqlplus / as sysdba
```
SYSDBAシステム権限とは？
すべての権限を持つデータベース管理者用で、データベースがオープンでないときもデータベース・インスタンスにアクセスできるシステム権限です。
権限の制御は完全にデータベース外で行われているようです。

10.PL/SQLを実行して動作を確認して完了です＼(^o^)／
![2019-11-12_16h47_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383237/58f0eaa5-7687-7167-f278-c21dc82c3654.png)
C#，WebClientのDownloadStringで403されるときの対処

# 動いてたコードが動かない...?!でも僕何もしてないもん!!!
昔書いたスクレイピングのためのプログラムが突然動作しなくなりました．
確認すると，webページをダウンロードする箇所でexceptionをもらっている様子．具体的には，403エラーをサーバーから返されたようです．

[このページ](https://maitakeramen.hatenablog.com/entry/2018/01/20/215349)では，一部のwebサイトはChromeなどを使用するとアクセスできるが，自前のプラグラムでそのwebページのhtmlをダウンロードしようとすると，403でダウンロードできないことが述べられています．

本投稿では，そのようなページをなんとかダウンロードできるように頑張った結果を報告します．とりあえず，[ここ](https://maitakeramen.hatenablog.com/entry/2018/01/20/215349)で達成されていなかった，`https://www.nike.com/jp/`のページをダウンロードすることを目標にします．

また筆者はネットワーク雑魚勢なので，問題があればご指摘お願いします．


# 403されたコード

以下のコードでは，`DownloadString`の引数に`https://www.google.co.jp/`を指定すると問題なく実行できます．
一方`https://www.nike.com/jp/`を指定すると，403をもらいます．

```c#:base.cs
using( var wc = new System.Net.WebClient() ) {

  var html = wc.DownloadString( @"https://www.google.co.jp/" ); // OK!!!
  //var html = wc.DownloadString( @"https://www.nike.com/jp/" ); // NG...

  Console.WriteLine( html );
}
```

# 解決策

HTTPのヘッダに，何かしら指定しました．

```c#:modified.cs
using( var wc = new System.Net.WebClient() ) {

  wc.Headers.Add( "accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3" );

  var html = wc.DownloadString( $@"https://www.nike.com/jp/" ); //OK!!!

  Console.WriteLine( html );
}
```

このソースコードでは，keyが`accept`，valueが`text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3`という謎のヘッダをリクエストに取り付けました．

このヘッダの正体は，Chromeで`https://www.nike.com/jp/`にアクセスするときに使用されていたヘッダの一部を借用したものです．どのようなヘッダが使用されていたかは，Chromeのデベロッパーツールを使用すると確認できます．すなわち，Chromeでアクセスできるんだからその状況を再現してやろう，というコンセプト．

![403.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319806/43176df8-0e97-d68b-fe37-dfc89eee9f46.png)

スクショからはいろいろなヘッダが取り付けられていたことが確認できますが，`https://www.nike.com/jp/`のページをダウンロードするだけなら，`accept`ヘッダだけつけておけば問題ないようです．他のwebページでは必要なヘッダは異なるはずです．どのヘッダを取り付けると403を回避できるかは，片っ端からヘッダを付けたり外したりするとわかります．パワープレイ．

# 結論
適当なヘッダを取り付けておけば，とりあえずwebページは落ちてきます．
リクエストを送るwebサーバーごとに，リクエストに取り付けておくべきヘッダはもちろん異なるはずです．うまく対処しましょう．
リクエストにヘッダを取り付けない状態ではサーバーが403を返す理由を考えると，機械的にアクセスするのは避けるべきなのかなあとも思ったりはします．