OmniAICreator/Qiita-1.07M huggingface dataset:
HerokuのDB更新時のActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR:  column ... does not existの対処方

#PG::UndefinedColumn: ERROR
ローカル環境に置ける**rails db:migrate**はエラーが起きなかったが、
本番環境(Heroku)に **heroku run rails db:migrate**をすると出るエラー

#今回起きた要因
これが発生した要因として
今までは普通にできたが、不要なカラができてしまったので削除する。
そしてHerokuも同様に反映させようとしたが今回のエラーが発生。
ゆえに今回は**カラム削除のDBファイル**がからんでいると推測。

#エラー内容 &対処法

`PG::UndefinedColumn: ERROR:  column "string" for relation "users" does not exist`

とでていた。
そこで**users**テーブルの削除したファイルを見てみると


```ruby:..._remove_delete_to_users
 class RemoveDelete2ToUsers < ActiveRecord::Migration[5.1] 
   def change 
     remove_column :users, :job, :string 
     remove_column :users, :string, :string 
     remove_column :users, :basic_overtime_pay, :string 
     remove_column :users, :integer, :string 
     remove_column :users, :uid, :string 
     remove_column :users, :string, :string 
     remove_column :users, :image, :string 
     remove_column :users, :string, :string 
     remove_column :users, :encrypted_password, :string 
     remove_column :users, :string, :string 
     remove_column :users, :reset_password_token, :string 
     remove_column :users, :string, :string 
     remove_column :users, :note, :string 
     remove_column :users, :string, :string 
   end 
 end 
```

このように**カラムの型**がたくさんある状態になっている。
そこでここを整理整頓してみる。

```ruby:..._remove_delete_to_users
 class RemoveDelete2ToUsers < ActiveRecord::Migration[5.1] 
   def change 
     remove_column :users, :job, :string 
     remove_column :users, :basic_overtime_pay, :integer 
     remove_column :users, :uid, :string 
     remove_column :users, :image, :string
     remove_column :users, :encrypted_password, :string 
     remove_column :users, :reset_password_token, :string
     remove_column :users, :note, :string 
   end 
 end 
```

ここで改めて **heroku run rails db:migrate**をすると
通った！！！
ロールバックするさいもカラムと型が合わずにうまくいかない！
みたいなことがあるみたいなのです。
今回のように同じエラーがでてるかたは参考にしてみていただけると幸いです。
ArchLinuxで起動アニメーションをやりたい！（Plymouthをインストールする方法）

#前提
ArchLinuxでもUbuntuみたいに起動アニメーションをやりたかった...。
2019年8月27日現在の情報です。
既にインストールやyay導入は終わっているものとします。

#インストール
AURからインストールします。

```bash
$ yay -Syy
$ yay -S plymouth
```

#Grubの設定

かんたんにGrubの設定を`grub.cfg`に反映できるように以下のパッケージをインストールします。

```bash
$ yay -S update-grub
```

`/etc/default/grub`にカーネルパラメータを追記します。
私の環境では最初は既に

```
GRUB_COMLINE_LINUX_DEFAULT="loglevel=3 quiet"
```
となっていたので

```
GRUB_COMLINE_LINUX_DEFAULT="loglevel=3 quiet splash udev.log-priority=3"
```
というように変更しました。

その後、grub.cfgに設定を反映させるために

```bash
$ sudo update-grub
```
を実行してください。

# ディスプレイマネージャーの設定
今回はlightdmという前提で行います。
sddm等の場合はそれぞれに置き換えてください。

まずはデフォルトのディスプレイマネージャーを無効化します。

```bash
$ sudo systemctl disable lightdm
```

次にplymouthに対応したユニットを有効化してください。

```bash
$ sudo systemctl enable lightdm-plymouth.service
```

#  mkinitcpioの設定


`/etc/mkinitcpio.conf `を編集します

```bash
$ sudo nano /etc/mkinitcpio.conf
```

`HOOKS=`という行に移動し、`base vdev`のあとに`plymouth`と追加してください。

設定できたら、initrdを更新してください。

```bash
# mkinitcpio -p linux
```

linux-ltsカーネルの場合はこちらを実行してください。

```bash
# mkinitcpio -p linux-lts
```

# テーマのインストール
あとはUbuntuと一緒です。
好きなだけカスタマイズしてください。

# 最後に
いかがでしたでしょうか？誤字などがあったら教えて下さい。
最後に [私のTwitter](https://twitter.com/Hayao0819)をフォローしてくれると嬉しいです。
LeetCode / Excel Sheet Column Number

[https://leetcode.com/problems/excel-sheet-column-number/]

Given a column title as appear in an Excel sheet, return its corresponding column number.

For example:

A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28
...

[先日の記事](https://mhiro216.hatenablog.com/entry/2019/08/24/171325)はFrom列インデックスTo列名でしたが、今回はFrom列名To列インデックスの変換がお題です。
From列インデックスTo列名の問題が解ければ、こちらも易しいです。

#### 解答・解説

##### 解法1
英字に相当する値を、26のn乗(nは1の位であれば0, 10の位であれば1, 100の位であれば2,,,)に掛け、合計を取ればOKです。

```python
from string import ascii_uppercase

class Solution(object):
    def titleToNumber(self, s):
        """
        :type s: str
        :rtype: int
        """
        d = {}
        for i,e in enumerate(ascii_uppercase):
            d[e] = i+1
        ans = 0
        for i,e in enumerate(s[::-1]):
            ans += d[e] * pow(26,i)
        return ans
```

こちらの解法が先に思いついてしまいましたが、文字列数分のループを2度回してしまっているところが改善すべき点です。

##### 解法2

アスキーコードを取得するord関数を使えば、ord(char) - 64 に対して26のn乗を掛けるだけで済むので、1度のループで済みます。

```python
class Solution(object):
    def titleToNumber(self, s):
        """
        :type s: str
        :rtype: int
        """
        return sum((ord(char) - 64) * (26 ** exp) for exp, char in enumerate(s[::-1]))
```
パッと分からないスケールの変換を考える

## 初めに
あるスケール(幅)のデータ(0~1等)を別のスケール(0~100等)に変更したいという場合が時々ある。
※生データは0~1だが、ページでの表示で0~画面の幅の値に変換したい等

こんな時、0~1→0~100とかなら0~1側の値を×100するだけでOKだし簡単
しかし、40~320→5~200にしたいとかになると、おバカなので頭がこんがらがってしまう。
ので変換式を考えてみようと思った。

## 結論
スケール $A:\\{x|a<=x<=b,a \neq b\\}$ の値$x$からスケール $B:\\{y|c<=y<=d,c \neq d\\}$ の値$y$への変換は

$y = (x-a) * \frac{(d-c)}{(b-a)} + c$
で表す事が出来る。
※以降$a \neq b$と$c \neq d$の記載は省略します。

## 導き方
まずは$A:\\{x|a<=x<=b\\}$からaを0にしたスケール、$A':\\{x'|0<=x'<=b'\\}$ に変換する事を考える。
すると、$b'=b-a$となり、$x'=x-a$で表す事が出来る。

つまり
$A:\\{x|a<=x<=b\\}$ → $A':\\{x'|0<=x'<=b-a,x'=x-a\\}$

同様に$B:\\{y|c<=x<=d\\}$からcを0にしたスケール、B'は

$B:\\{y|c<=x<=d\\}$ → $B':\\{y'|0<=y'<=d-c,y'=y-c\\}$

と出来る。

次にA'からB'への変換を考えると、
$y' = x' * \frac{(d-c)}{(b-a)}$
と出来るので、x'とy'をx,yに直すと
$y-c = (x-a) * \frac{(d-c)}{(b-a)}$
となる。

これをyについて解けば
$y = (x-a) * \frac{(d-c)}{(b-a)} + c$
と出来る。

実際に例に上げた
40~320→5~200を考えてみると
xが40の時
$(40-40) * \frac{(200-5)}{(320-40)} + 5 = 5$

xが320の時
$(320 - 40) * \frac{(200-5)}{(320-40)} + 5 = 200$

xが180(中央値)の時
$(180 - 40) * \frac{(200-5)}{(320-40)} + 5 = 102.5(5～200の中央値)$

となっている。
C#でWindows Serviceを作る（５）

#概要
前回の記事[C#でWindows Serviceを作る（４）](https://qiita.com/yossihard/items/302189ca9f91f8ad7d56)の続き。
イベントログの実装を行います。

#環境
Windows 10
Visual Studio 2017 Community

#手順
イベントログはWindowsで管理されるログです。
出力したログ情報は、イベントビューワーで見ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/5b3235f6-dc99-3903-6ceb-9c41883b4aba.png)


ServiceBaseクラスの派生クラス（デフォルトだとService1.csというファイル。私のプロジェクトではServiceTest.cs）をデザイナーで開きます。
⇒ソリューションエクスプローラで該当ファイルをダブルクリックしてください。

その後、ツールボックスから、コンポーネントの中にある「EventLog」を選択し、
デザイナーにドラッグ＆ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/47d9c200-fc73-f540-ea56-a8994d0dafc6.png)


次にドロップしたEventLogコンポーネントをクリックして、プロパティタブを開きます。
nameを適宜変更します。
ここではServiceEventLogにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/73cc2eb9-6f3a-b23b-26af-7a9041946596.png)

ここまで（コンポーネントを追加すること）で、EventLogクラスのインスタンス（ServiceEventLog）が生成されます。
⇒ServiceTest.Designer.csに定義されていますね。

続いてServiceTest.csのコードを表示し、コンストラクタに処理を追加します。

```C#:ServiceTest.cs
    ServiceTest()
    {
        InitializeComponent();

        // ---------- 以下が追加した処理 ----------
        ServiceEventLog = new System.Diagnostics.EventLog();
        if (!System.Diagnostics.EventLog.SourceExists("ServiceTest"))
        {
            System.Diagnostics.EventLog.CreateEventSource(
                "ServiceTest", "Application");
        }
        ServiceEventLog.Source = "ServiceTest";
        ServiceEventLog.Log = "Application";
        // ----------------------------------------
    }

```

これでイベントログを出力する準備ができました。
試しに、前回Overrideして生成したOnPauseやOnContinueのイベントハンドラ内にログ出力処理を追加してみます。
ログ出力はWriteEntry関数を使用します。

```C#:ServiceTest.cs
    protected override void OnContinue()
    {
        ServiceEventLog.WriteEntry("OnContinue Called.");
        base.OnContinue();
    }

    protected override void OnPause()
    {
        ServiceEventLog.WriteEntry("OnPause Called.");
        base.OnPause();
    }
```

イベントビューワーを起動して、ログを確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/24ee8c91-df2a-7517-cd20-bd1f934ab671.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/ae4499de-d540-58b9-34bb-bbecad3748a9.png)

追加したイベントログがちゃんと保存されています。

次回は周期実行処理の実装について書きます。
Wordpressのインストール画面でCSSが効かず悩んでた話

仕事で新しいサーバにWordpressをインストールしようとしたのですが、
インストール画面でCSSが効いてくれなくてずっと悩んでたのですがわりとしょうもないことだったのでここに吐いておきます。

※僕の認識違いかもしれないし間違っているかもしれませんがもし気づいた方がいたら教えていただけると嬉しいです。


＝＝＝＝

【クライアント】→(80or443）→【ALB】→80→【サーバ（EC2）】

という構成です。（実際にはちょっと違ってます）

WPをインストールする前にALBやらSSL証明書の設定は完了させていました。
つまりhttpであれ、httpsであれ、最終的にはhttpsで接続する状態にしていたのです。

この状態でサーバのドキュメントルートにwordpressの資材をおいておいてブラウザにてアクセスすると・・・

ページは表示されるんですけど、なんの装飾もされていないHTMLがそのままでちゃってたんです。

ブラウザで確認してみるとどうやら混在アクティブコンテンツがうんぬん・・・。
どうやらhttpsで接続しているのにHTMLの中にhttpへのリンク（cssの読み込み）が埋め込まれてて、そのリンクへのアクセスは遮断したとのこと。

いやまあ結論としては、**インストールするときはいったんhttpsで接続しないでhttpでアクセスしてあげれば問題ない**んですけど、それに気づかずずっと、nginxの設定とか、WPのphpファイルとかをいじって対処しようとしてたんです。かれこれ5時間位はハマってましたかね。HAHA。

というわけで最終的に、
１．ALBの設定いじり、httpでもサーバでアクセスできるようにする
２．インストール画面にとんでCSSが効いてることに感動して設定していく
３．WPの管理画面からサイトのURLをhttpからhttpsに変える（これが大事）
４．ALBの設定をもとに戻す（常時https）

するとおそらくcssの読み込みへのリンクもhttpsに変わってくれて幸せになる気がします。
もちろんCSSが効いてなくても初期設定とかは進められるのでぶっちゃけ何も問題はないんですけど知らない状態でやってたので、「あれ、どっか設定ミスってるのかな・・・」って思っちゃったんです。

冒頭にも書いたけどもしかしたらなにか勘違いしてて見当違いのこと書いてるかもしれません。
WP大臣みたいな方いたらこっそり教えて下さい。
ページングで使う開始/終了インデックスの計算。ついでに総ページ数も

検索結果を1ページで全て表示させず、ページングしたい時
sqlにしろ、リストを絞るにしろ開始インデックスが必要になる。

実装の度に思い出すのが面倒な為、備忘録として記事にしておく

## 開始インデックス

開始インデックスを求めると

```
開始インデックス = (ページ番号 - 1) * 1ページ辺りの表示件数
```

になる。
※ページ番号は1始まり、インデックスは0始まり

## 終了インデックス

またsqlの場合は、limit 件数 offset 開始インデックス+1 となるので、気にする必要はないが、
終了インデックスもあると何かと便利だったりする(x ～ y/n件中みたいな時とか)

ので考えると

```
終了インデックス = min(ページ番号 * 1ページ辺りの表示件数 - 1,リストのサイズ - 1)
```

または

```
終了インデックス = min(開始インデックス + 1ページ辺りの表示件数 - 1,リストのサイズ - 1) 
```
※開始インデックスの式を利用する場合

になる。

## 総ページ数
ついでに、総データ件数から総ページ数を求めると

```
総ページ数 = ceil(リストのサイズ / 1ページ辺りの表示件数)
```

になる。
Swift4のKVOを理解する

# はじめに

Swift4からKVOのやり方が変わったので備忘録です。

Objective-CまではNSStringでキー名を渡していたので、間違いが発生しやすかったです。
Swift4からはKeyを`\`を使用して表現できるため、コンパイラチェックの恩恵が受けられるようになりました。


# サンプルコード

``` swift:ObservedObject.swift
class ObservedObject: NSObject {

    @objc dynamic var count: Int = 0

    func start() {
        Time.scheduledTimer()
    }

    @objc func addCount(_ sender: Timer) {
        count += 1
    }
}
```

``` swift:ViewController.swift
class ViewController: UIViewController {
   @objc var obj: ObservedObject?
    var observation: NSKeyValueObservation?

    override func viewDidLoad() {
        observation = observe(\.obj!.count, option: [.old, .new]) { object, change in
            print("value=\(change.newValue)")
        }

        obj?.start()
    }

}

```

## 参照
[Using Key-Value Observing in Swift | Apple Developer Documentation](https://developer.apple.com/documentation/swift/cocoa_design_patterns/using_key-value_observing_in_swift)
[Swift4のKVOに感動した。 - Qiita](https://qiita.com/ObuchiYuki/items/d00ce5f44725672184da)
[Expressions — The Swift Programming Language (Swift 5.1)](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html)
[Swift]2以上の刻みで増加させるforのループ方法

# はじめに

Objctive-CからSwiftへ書き換える上で、forの使い方が大きく変化しています。
インデックス情報が不要ならば、for-inの使いかたはそれほど変わっていないのでObjective-CやJavaなどの経験があればとくに困ることはないと思います。

しかし、インデックス情報が必要になる場合は、Swiftのお作法を覚える必要がでてきたので、備忘録として残しておきます。
なお環境は、Xcode10.2.1です。

## 1ずつ増加する

``` swift
for (i, value) in 0..<10.enumerated() {
}
```

ちなみに、dropfirst()で作成された配列には、元のインデックス情報が残っているので、インデックス情報を合わせるためにzip()を使用する必要があります。


# 1以外の数値を増加する

Objective-Cなどの伝統的なforの記載で、1以外の値を増加させる方法は以下のようなやり方です。

``` objc
// 伝統的なforの記述方法はSwiftでは使えない！
// 2づつ増加させる
for (int i=0; i < 10; i * 2) {
}
```

しかしSwiftではどうやってこれを実現するのでしょうか。
その方法は、stride()を使用します。ちなみにstrideの意味は「大股に歩く」だそうです。ナイスネーミング！

stride()で開区間( < )と閉区間( <= )はどうすればいいのでしょうか。
toではなくthroughに変更します。

## 含めない場合 ( < )
``` swift
for i in stride(from: 0, to: 10, by: 2) {
    print("index=\(i)") // 0, 2, 4, 6, 8
}
```

## 含めたい場合 ( <=)
``` swift
for i in stride(from: 0, through: 10, by: 2) {
    print("index=\(i)") // 0, 2, 4, 6, 8, 10
}
```

# 参照

[Control Flow — The Swift Programming Language (Swift 5.1)](https://docs.swift.org/swift-book/LanguageGuide/ControlFlow.html)
微分方程式の一般解

メモがてらに微分方程式について復習をしたので記録しておきます。

今回出会ったのはこんな式

```math
D^2(D-2)^2\phi=0\\

ここで\\
D=\frac{d}{dt}
```

このときの一般解を求めよって感じですね。
まずこの式が成り立つには二つの場合があります。
１つめは

```math
D^2\phi=0
```

２つめは

```math
(D-2)^2\phi=0
```

１つめに関しては両辺を２回積分してやって

```math
\phi=C_{1}+C_{2}t
```

ですね。Cは任意の定数です。２つ目に関しては

```math
\phi=e^{\lambda t}
```

としてやって特性方程式を立てれば、λ=2(！重解）が得られます。
なので、２つ目の式を満たすφは

```math
\phi=e^{2t}(C_{3}+C_{4}t)
```

となる。重解の場合は上式のように、任意定数の一つにtがかかります。
微分方程式の一般解はそれぞれを足し合わせれば良いので


```math
\phi=C_{1}+C_{2}t+ e^{2t}(C_{3}+C_{4}t)
```

これで良いはずです。まだまだ未熟者ですので間違っていたりしたらご指摘ください。
float32 -> bfloat16 変換では NaN と丸めを考慮すると完璧

bfloat16 は, 16bit で浮動小数点数を表します.

同じような表現として, fp16(half)がありました(2000 年くらい?).
fp16 は, 古くは半精度型としてシェーダの型だったり, OpenEXR などの HDR 画像フォーマットのひとつとして長らく知られてきました.

昨今のニューラルネットの流行りで, bfloat16 という表現が機械学習関連で最近(2012?)出てきました.

## 仕様

https://en.wikipedia.org/wiki/Bfloat16_floating-point_format

仮数部のビットを切って, 16bit に収めるフォーマットです. 
指数部のビット数は fp32 と同じなので, fp32 と同じダイナミックレンジ(値の幅)が扱えます.
bfloat16 はダイナミックレンジはほしいけれども, 精度はそれほど不要というものにうまくハマりそうです.

fp32 から下位 16bit を切るだけでよいので, fp16(half)と異なりデータ変換が楽です.

## 精度は?

A Study of BFLOAT16 for Deep Learning Training
https://arxiv.org/pdf/1905.12322.pdf

機械学習の用途では, AlexNet, ResNet, deepspeech(RNN), etc でだいたい fp32 と同じ結果が得られています.

## 変換で気をつける点があります

MIOpen の bfloat16 変換を見ていましたら,

https://github.com/ROCmSoftwarePlatform/MIOpen/blob/master/src/kernels/bfloat16_dev.hpp

NaN の扱いと丸めに対する対処が入っていました.

### 丸め

tensorflow の bfloat16.h の解説のほうが参考になります.

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/lib/bfloat16/bfloat16.h

(tensorflow では, ほかにも別の bfloat16 コードがいくつか存在していてつらい)


### その他

LogLuv32 という, 32bit で Luv を表現するフォーマットがあります.

https://en.wikipedia.org/wiki/Logluv_TIFF

Luv 空間で convolution, pooling するようなネットワークだと, いくらかデータ圧縮が見込めるかも?
(とはいえ, 6bytes -> 4bytes なので劇的に小さくなるわけではない)

ColorNet: Investigating the importance of color spaces for image classification⋆
https://arxiv.org/pdf/1902.00267.pdf

## まとめ

単純に下位 16bit を切っても多くのケースではうまくいくかもですが,
NaN と丸めの対処をしてあげると完璧ですね.
AWSでサーバーを準備してみる。

# 目的
AWSでWEBサーバー、DBサーバーを作成する。
個人的にAWSを試してみるために行った作業手順をまとめた記事になります。

## はじめに
AWSのアカウントを作成する。
https://portal.aws.amazon.com/billing/signup#/start

## ネットワークの構築
### VPCを作成する。
AWSマネジメントコンソールからVPCをクリックし、VPCの作成ページに移動し、
vps-sampleというVPCを作成する。

VPC作成をクリックすると下記の様なページが表示されるので、それぞれの項目を入力する。
（画像は入力後）

<img width="731" alt="vpc-sample.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321636/b9eb0b2c-fa56-1774-eb04-fbb0ac77f876.png">

### subnetを作成する。
#### publicSubnetを作成する。
インターネットにつながる設定のサブネット。WEBサーバーなど外部からアクセスがある場合に使う。
サブネットのページより作成をクリック。
名前：public-subnet-sample-1a
VPC：vpc-sample
アベイラビリティーゾーン：ap-northeast-1a
IPv4 CIDR ブロック：10.0.10.0/24

#### privateSubnetを作成する。
上記と同様にして、名前：private-subnet-sample-1aを作成する。

下記だけ変更しておく。
IPv4 CIDR ブロック：10.0.20.0/24

### ルーティングを作成する。
作成したpublic-subnet-sample-1aからインターネットに接続できる様に設定する。

#### インターネットゲートウェイを作成する。
インターネットゲートウェイからインターネットゲートウェイを作成をクリックし作成する。
名前：igw-sample

#### インターネットゲートウェイをVPCにアタッチする。
アクションよりVPCをアタッチをクリックする。
<img width="530" alt="igw-vpc-attach.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321636/cd83d682-bd48-ab6a-79f4-15e2b3da9c8d.png">

作成したvpc-sampleを選択しアタッチする。

#### ルートテーブルを作成
ルートテーブルをクリックし、ルートテーブル作成をクリックする。
作成画面が表示されるので、作成したvpc-sampleを選択し作成。

#### subnetを関連づける。
作成したルートテーブルを選択すると、下に詳細が表示されるので
サブネットを関連づけるを選択し、サブネットの関連付けを編集をクリックして、public-subnet-sample-1aを選択する。

#### ルートの編集を行う。
サブネットを関連づけるの隣にあるルートをクリックし、ルートの編集をクリックする。
送信先に「0.0.0.0/0」を入力し、ターゲットには、先ほど作成した、インターネットゲートウェイを選択する。

## 作成したVPC上にサーバーを設置する。
### EC2インスタンス
EC2インスタンスはWebサーバーとして使用できる仮想サーバー。
EC２のインスタンスを作成し、必要なものをインストールしていく。

#### EC２インスタンスを作成する。
##### AMIを選択する。
今回は無料枠で使えるAMI（Amazonが提供しているテンプレートの様なもの）を選択。
<img width="1223" alt="ami.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321636/6948d467-b8b1-505a-4023-1f8400a23b67.png">

##### インスタンスタイプを選択する。
こちらも無料枠であるt2.microを選択する。

##### 詳細設定
VPCは作成したvpc-sampleを選択し、サブネットはpublic-subnet-sample-1aを選択する。
privateに設置してしまうと外部からアクセスできなくなる。

インターネットインターフェイスでは、プライベートipの設定ができる。
サブネットのIPを10.0.10.0/16にしたので、10.0.10.10を設定しておく。

##### ストレージを選択する。
デフォルトの設定のまま進める。（汎用SSD）

##### セキュリティグループを作成する。
セキュリティグループのページを開き、セキュリティーグループを作成をクリックする。

##### キーペアを選択し、インスタンスを作成する。
キーペアは、サーバーにアクセスするために必要。こちらは、なくすと作り直す必要があるので注意する。

## まとめ
これで、一旦WEBサーバーのインスタンスの作成は完了しました。
作成したEC2インスタンスには、apacheやnginxや、PHPなどを入れていけばWEBサーバーとして稼働できます。（>> [PHPの環境構築はこちら](https://qiita.com/teketeke/items/c3a77636d1669637a365)）
RDSなどデータベースを使用しない場合はここまでやれば完了です。
WSLでLabelImgを使う

LabelImgをWSL(Ubuntu)で使うことになった際に手間取ったのでメモ。
#まずはチュートリアルに従う
チュートリアル：https://github.com/tzutalin/labelImg

するとpyenvを使っていたために、PATHの関係でエラー吐かれるので設定する。
→https://qiita.com/musaprg/items/efccb436f8d79b25074b

#次はXServerに関するエラー
チュートリアル通りに実行していくと、こんなエラーメッセージが吐かれる。

```
qt.qpa.screen: QXcbConnection: Could not connect to display 

Could not connect to any X display.
```
調べていくとGUI関係のパッケージや設定が必要だと分かる。
そこでお誂え向きな記事を発見
→https://www.atmarkit.co.jp/ait/articles/1812/06/news040.html
WSL2の人は
->https://qiita.com/momomo_rimoto/items/51d533ae9529872696ce
VcXsrvは私用で既にWindowsに入れていたため、WSL側でポチポチすればOK
#あとはLabelImgを動かすだけ
Windows側で保存した画像を使うためファイルパスがやや面倒。
wslpathコマンドを何度も調べては忘れるため、ここにメモしておく
→https://laboradian.com/wslpath-command-for-wsl/
HTTPリクエストについて

#HTTPリクエストについて

##1.get
__get__ = 通常のアクセス。ページを表示。

##2.post
__post__ = フォームを使ってデータを送信。
・何か新しいデータを追加するとき
・ログインの処理をするときにデータを送る場合


##3.patch / put
__patch / put__ = データの更新を行う。
※若干ニュアンスが違う。
・__patch__ => 現在保存されているデータがあって、そのデータを更新したい場合
・__put__ => 現在データがあるかどうかわからない状態でput形式でのデータを送る。もしデータが入っていなかったら「新規作成」を行い、もしデータが入っていたらそのデータに「上書き保存」をする。


##4.delete
delete = データの削除を行う。
rails viewの繰り返しでitemの一覧を表示する方法

railsのviewでアイテムをfor文を使って表示しています。

```erb
<%for i in 0..4 do%>
    <li><%=link_to @ranking_articles[i].title,article_path(@ranking_articles[i].id)%><span>(<%=@previews[i]%>)</span></li>
<%end%>
```
python3で入力を受け付ける場合のinput() 関数の使い方

python3で入力を受け付ける方法を書いていきます。
競技プログラミングで使えると思います。

### 環境
python3を使用

### 受け取る入力が複数行かつ特定の行にのみ複数列の文字がある形式で入力を受け取る場合
具体的には以下のような入力を取得

```
a
b c
s
```
入力を受け付けるためのコード例

```python
a = int(input())
b,c = map(int,input().split())
s = input()
```

input()とすると戻り値は文字列でかえってくるので、
int(input())のようにすると整数型で値を取得できる。

また、inputの仕様としてinput()を実行したあとは
2度目にinput()を実行してもaが入力されないことで分かるように自動的に改行される
普段c#やRuby,JavaScriptをやっていた自分ははじめこの仕様に違和感があった。（便利なのだが）

### for文とinput()関数の合わせ技

```
A
B
C
X
```
このように一行一文字に並んでいる入力をfor文を使って一気に取得することもできる。

```python
a,b,c,x = map(int,[input() for i in range(4)])
```

これにはリスト内包表記を使っている。
内包表記に関しては以下の記事が詳しい。
[内包表記のあれやこれ。](https://qiita.com/ogrew/items/20a3d9a7edf1f7bd6a2c)
fastqファイルから配列情報だけを抽出する方法

fastqファイルは1リードが4行で表示され、2行目に配列（ATGC）が書かれてあります。
awkを使って以下のように書けば、2行目のみ抽出できます。

```
awk '{if(NR%4==2){print}}' ○○.fastq
```

また、fastqがfastq.gzと圧縮されているときはまずはzcatで展開して、awkで2行目のみ抽出します。

```
zcat ○○.fastq.gz  | awk '{if(NR%4==2){print}}' 
```
AtCoder_入力読み取り用スニペット

#概要
Atcoder入力読み取り用スニペット
中身の動作は以下参照
[AtCoder_入力読み取り用マクロ](https://qiita.com/iwato/items/0011cdb136c50e4e286a)


Code→基本設定→ユーザスニペット
から設定

```json:cpp.json
{
	"AtCoderInput": {
		"prefix": "acin",
		"body": [
			"int $1, $2;",
			"cin >> $1 >> $2;"
		],
	},
	"AtCoderInput1": {
		"prefix": "acin1",
		"body": [
			"int $1;",
			"cin >> $1;",
			"vector<int> $2($1);",
			"for(int i = 0; i < $1; i++) {",
			"    cin >> $2[i];",
			"}"
		],
	},
	"AtCoderInput2": {
		"prefix": "acin2",
		"body": [
			"int $1, $2;",
			"cin >> $1 >> $2;",
			"vector<vector<int>> $3($2, vector<int>($1));",
			"for(int i = 0; i < $2; i++) {",
			"    for(int j = 0; j < $1; j++) {",
			"        cin >> $3[i][j];",
			"    }",
			"}",
		],
	},
}
```
[Ubuntu] ファイルをコピーするスクリプトファイル

ビルドしたファイルをアプリケーションの実行用ディレクトリに手動でコピーしていたら、
先輩から
「バッチファイルで出来ないのか？!」と有難いお言葉を頂いた。
忘れてもいいようにメモしておく。

#スクリプトファイルを作る
　　#!/bin/bash
　　
　　cp (コピーするファイル名) (コピー先)　


#ダブルクリックで実行できるようにする
　　そのままだとダブルクリックした際にテキストファイルとして開いてしまう。


　　ファイルマネージャーみたいなのを開き、
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408204/0d4fa065-b6bf-ae87-6fb0-f88612c339bb.png)
　　メーニューから[編集(E)]-[設定(N)]を選択
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408204/ddfabc06-3269-d327-a177-33fa5b4c026d.png)
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408204/aed8fa19-e56b-85da-29d4-3b7de6f44353.png)
    ダイアログが開いたら　[動作]タブを選択して、
　　"実行可能なテキストファイル"の項目で
　　"クリックしたら実行する(R)"か"毎回確認する(A)"を選択
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408204/9abcc44d-6fcb-8413-cf4d-3754a13104f4.png)


※スクリプトファイルの先頭が #!bin/sh だとコピーが実行されなかった・・・

以上
チェーンルールの基本　常識

こんにちは。
Qiitaでは珍しいと思われる機械系エンジニアです。
(情報も好きですが、本職は機械です。まだまだ新人ですが)

今日は弾性力学の教科書を読んでいて、ハマった点について記録がてら書いておこうと思います。
わかっている人にはかなり初歩的なことなので、読む必要はないと思われます。

今日はチェーンルールを使った変数変換の方法を復習します。
おそらくどの業界でも微分方程式は出てくるし、変数変換もよく行われると思います。

なので、参考書なので”変数変換を行うとこの式が得られる。”
みたいな記述にえ！？？！？何が起こった？？！！
みたいな人が居たら少しは役に立つのかもしれません。


今回私が悩んだのは次のような一行

"φがrのみの関数とすると、次の式"

```math
\frac{d^4 \phi}{dr^4} + \frac{2}{r}\cdot\frac{d^3\phi}{dr^3}-\frac{1}{r^2}\cdot\frac{d^2\phi}{dr^2}+\frac{1}{r^3}\cdot\frac{d\phi}{dr}=0
```

”は、t=log rとして変数変換を行うことで以下の式が得られる。”

```math
D^2(D-2)^2\phi=0
```

"このときD=d/dtである。"

あっさりと書いてありましたが、当初どうしてこの式で展開できるのかさっぱりわかりませんでした。
まあ解けちゃえば何をこんなところで躓いていたのだろうとなるのですが、導出過程を載せておきます。

まずチェーンルールより


```math

\begin{align}
\frac{d\phi}{dr} &= \frac{d\phi}{dt}\frac{dt}{dr} \\
&=D\phi\frac{1}{r}\\
&=D\phi\cdot e^{-t}
\end{align}

```

これはおそらくいいと思います。ちゃんと書くならφ(r)→φ(t)ですね。

僕がうまくできていなかったのは次の段階ですね。
僕はここで

```math
\frac{d^2\phi}{dr^2} =(\frac{d\phi}{dt}\frac{dt}{dr})^2

```
みたいなことをして導出がうまく行っていませんでした。当然です(汗)
上司に見せたら怒られますね、、、
面倒だけど丁寧に書くとこうなりますね。

```math

\begin{align}
\frac{d^2\phi}{dr^2} &= \frac{d}{dt}(D\phi\cdot e^{-t})\frac{dt}{dr}\\
&=(D^2\phi \cdot e^{-t}- D\phi\cdot e^{-t})\frac{dt}{dr}\\
&=(D^2\phi - D\phi)e^{-2t}\\
\end{align}

```

ふうう。だいぶ疲れました。もう二つありますね、、

```math

\begin{align}
\frac{d^3\phi}{dr^3} &=\frac{d}{dt}((D^2\phi - D\phi)e^{-2t})\frac{dt}{dr}\\
&=(D^3\phi-2D^2\phi
-D^2\phi+2D\phi)e^{-3t}\\
&=(D^3\phi-3D^2\phi+2D\phi)e^{-3t}
\end{align}

```

ここまで来たらもう一息！！

```math
\begin{align}
\frac{d^4\phi}{dr^4} &=\frac{d}{dt}((D^3\phi-3D^2\phi+2D\phi)e^{-3t})\frac{dt}{dr}\\
&=(D^4\phi-3D^3\phi-3D^3\phi+9D^2\phi+2D^2\phi-6D\phi)e^{-4t}\\
&=(D^4\phi-6D^3\phi+11D^2\phi-6D\phi)e^{-4t}\\

\end{align}
```

やっとできましたーーーー！！後はこの四式を最初の式

```math
\frac{d^4 \phi}{dr^4} + \frac{2}{r}\cdot\frac{d^3\phi}{dr^3}-\frac{1}{r^2}\cdot\frac{d^2\phi}{dr^2}+\frac{1}{r^3}\cdot\frac{d\phi}{dr}=0
```

に入れれば完成です。興味ある方はやってみてください。
うーーん疲れた。
数式の展開でよく躓くのは僕の実力不足ですね笑
Gutenberg IconButton コンポーネント和訳

このページは Gutenberg の IconButton コンポーネントの[リファレンス](https://github.com/WordPress/gutenberg/blob/master/packages/components/src/icon-button/README.md) 2019年1月15日版を和訳したものです。

# IconButton

アイコンボタンは、ユーザーが実行できるアクションを表し、インターフェイスとの対話方法を提供します。特に以下のような場所でよく出てきます:

- ボタングループ
- ツールバー

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124288/68fb4a02-12b3-57d5-bbf4-f88e9ef2a1a0.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124288/b1de9b72-210e-dcaa-f71f-0a1cf88a5981.png)

## 目次

1. デザインガイドライン
2. 開発ガイドライン
3. 関連コンポーネント

# デザインガイドライン

## ベストプラクティス

アイコンボタンは以下のようにすること:

- **アクションを示す明瞭で正確なアイコンを選ぶこと。**
- **クリックやタップによるアクションの始動を明確に伝えること。**
- **枯れた色を適切に用いること。** 例えば、赤ボタンはアンドゥが困難、もしくは不可能である場合のみに使うこと。
- **インタフェースにおいて一貫した配置を行うこと。**

## 解説

アイコンボタンはそれほど強調されません。ページ上ではあまり目立たないため、重要度の低いアクションに使用します。重要の度合いはコンテキストによって異なるでしょうが、通常は、誰かに実行してもらいたいメインのアクションに対する補足的な位置付けです。アイコンボタンは、コンテンツから注意をそらしたくない場合にも役立ちます。

# 開発ガイドライン

##  使い方

```jsx
import { IconButton } from '@wordpress/components';

const MyIconButton = () => (
	<IconButton
		icon="ellipsis"
		label="More"
	/>
);
```

# 関連コンポーネント

- `Toolbar` コンポーネントは `IconButton` コンポーネントで構成されています。
【受験記録】Microsoft Azure Fundamentals(AZ900)

## 前提
- SIer勤務3年目
- アプリケーション開発者
- インフラはほぼ分からない
- クラウドのメリット、デメリットはなんとなくわかる。
- 受験日 2019/8/25

##試験概要
クラウドの基本＋Azureのサービス、料金体系など

問題数:44問
時間:60分
合格点:700点/1000点
-問題のうち、いくつか「Aをしたいです。Bをします。目的は達成されていますか？」のような問題があり、それらの問題は一度、回答をしてしまうと振り返ることができませんでした。
- その他の問題は一度回答した後でも、戻って振り返り、変更をすることができました。画面で"後でチェックする"というボタンもあり、すべて回答後、チェックを付けた問題がどれかわかるようになっていました。

セクション名
- コアAzureサービスの理解(30~35%)
- セキュリティ、プライバシー、コンプライアンス、信頼の理解(30~35%)
- Azureの料金とサポートの理解(25~30%)
- クラウドの概念の理解(15~20%)

## 勉強方法
1. MicroSoftの勉強会でもらった試験対策講座の問題×2周(そもそも受験しようと思ったのが講座受講したからです。。。)
1. [MSの公式サイト](https://docs.microsoft.com/ja-jp/learn/paths/azure-fundamentals/)の各モジュールの知識チェック、まとめの模擬問題×1周

## 感想
- クラウドを知っている人ならAzure独特の内容さえ確認すれば受かりそう。
- 難易度としては高くないと思う。クラウドの資格の導入としては良さそう。(他の資格を受けたことがないので、受けたときに更新します。)
Railsの勉強会に行ってきた話

こんにちは。はじめての投稿になるので、よろしくお願いします。
#感想
とても楽しい時間を過ごすことができました。
技術的な話としては、MVC構造は1960年代？ごろから使われていたものらしく、結構古いもののようで、それをRailsは未だに使っていて大丈夫なの？っていうのが話題にでたときに、Railsが批判されてる理由が少しわかった気がしました。

自由時間に現役のエンジニアの方からアドバイスをもらうことができて、とても参考になりました。きつい時もあるけど、楽しくコードを書いていこうというのが励みになりました。勉強会の後に、数人で食事に行き、業界のことなどいろいろ話ができて楽しかったです。ちなみに奢ってもらっちゃいました笑

Ruby界隈は、親切な人が多いなと思いましたし、いろんな所でイベントがあり、活発なのでまた行ってみたいと思いました。
プログラミング学習（三日目）ProgateでRuby On Rails レッスン3

#今日学んだこと
##find_byメソッドで、データベースからデータを取得
モデル名.find_by(カラム名:値)で、指定したカラムの値を持つレコードを取得できる
例えば、
**>a = Post.find_by(id:3)**
で、変数aにpostsテーブルのidが3のレコードを代入できる。
そしてここから、
**>a.カラム名**
とすれば、idが3の指定したカラム名の値を出力できる。

##ルーティングのURLに:idで、任意のすべての値を適用
具体的に言うと、

```ruby:routes.rb
get "/home/:id" => "home#about"
```

とすると、URLが「/home/a」でも、「/home/xyz」でも、「/home/1234567890」でも、
homeコントローラのaboutアクションを指定されると言う訳。
ちなみに、ルーティングはファイルの上から順に該当するURLを探すので、:idを使う場合は下の方にやらないとやばい。

###paramsの使い方
そして上のURLの:idに該当する値は、コントローラ内のアクション内で取得できる。
paramsにハッシュで入っているらしく、params[:id]とやると取得できる。

##入力フォームを作成し、データベースに保存する方法。
これが少し複雑で難しかった。
「form_tag」と「redirect_to」と「post」を使う

まずhtml.erbファイルに入力フォームを作るのだが、
**`<%= form_tag("送信先のURL") do %>`**
**`<textarea name="test"></textarea>`**
**`<input type="submit" value="送信">`**
**`<% end %>`**

と作る。form_tagで送信先のURLを設定しつつ、入力内容の属性をname属性とし｛test:"入力した内容"｝というハッシュで、指定したURLに対応するコントローラのアクションへと送られる。
ちなみに、textareaにname属性を付与しないと送信できないらしい。

そしてそのアクションへ入力内容が送られるわけだが、まずそこでここではpostsテーブルを用いているので、Postインスタンスを作成し保存する。その際にparamsを使い、任意のカラムが入力された内容になるインスタンスを作成する。
こんな感じ(postsテーブルにはcontentカラムがある)
`**def create**`
`**  @inputfile = Post.new(content:params[:test])**`
`**  @inputfile.save**`
`**  redirect_to("送信先のURL")**`
`**end**`

ちなみに「redirect_to」とは、アクションに対応するビューファイルが無い時にエラーにならないために、処理？データ？をほかのアクションへ送るメソッドである。

##データの並べ替え
orderメソッドを用いて、「order(カラム名:並び順)」と指定するとその指定した並び順になる。昇順が「:asc」、降順が「:desc」
@posts=Post.new.order(id: :asc)とすると、idが1から並ぶ。

結構抽象的に書いた分、早く書けたが少しわかりにくい可能性が、、、
AtCoder_入力読み取り用マクロ


#概要
AtCoderにて毎回入力する内容を書くのが面倒臭いので、
変数名を指定すれば、入力読み取りしてくれるマクロを作りました。

#数指定の入力
はじめに入力する数が指定され、その後指定された数だけ値が入力される場合

```cpp

#define INPUT1(n, array)                                                           \
    int n;                                                                     \
    std::cin >> n;                                                             \
    std::vector<int> array(n);                                                     \
    for(int i = 0; i < n; i++) {                                               \
        std::cin >> a[i];                                                      \
    }
```

###使い方
```:入力
5
1 2 3 4 5
```


```cpp
#include <bits/stdc++.h>
using namespace std;

#define INPUT1(n, array)                                                           \
    int n;                                                                     \
    std::cin >> n;                                                             \
    std::vector<int> array(n);                                                     \
    for(int i = 0; i < n; i++) {                                               \
        std::cin >> a[i];                                                      \
    }

int main(){
 INPUT(num,array);//入力読み取り

 //読み取り内容確認
 cout << n << endll;
 for(const auto a : array){
  cout << a << endl;
 }

 return 0;
}
```


##数指定の入力（二次元）
はじめに幅と高さが指定され、その後指定された数だけ値が入力される場合

```cpp

#define INPUT2(x, y, field)                                                    \
    int x, y;                                                                  \
    std::cin >> x >> y;                                                        \
    std::vector<std::vector<int>> field(y, std::vector<int>(x));               \
    for(int i = 0; i < y; i++) {                                               \
        for(int j = 0; j < x; j++) {                                           \
            std::cin >> field[i][j];                                           \
        }                                                                      \
    }
```

###使い方
```:入力
3 4
1 2 3
4 5 6
7 8 9
10 11 12
```


```cpp
#include <bits/stdc++.h>
using namespace std;

#define INPUT2(x, y, field)                                                    \
    int x, y;                                                                  \
    std::cin >> x >> y;                                                        \
    std::vector<std::vector<int>> field(y, std::vector<int>(x));               \
    for(int i = 0; i < y; i++) {                                               \
        for(int j = 0; j < x; j++) {                                           \
            std::cin >> field[i][j];                                           \
        }                                                                      \
    }

int main(){
 INPUT2(x,y,field);//入力読み取り

 //読み取り内容確認
 cout << x << " " << y << endl;
 for(int i = 0; i < y; i++) {
        for(int j = 0; j < x; j++) {
          cout << field[i][j];
        }
      cout << endl;
    }

 return 0;
}
```
AWSのサービスいくつかを3分で掴む


AWSについて無知すぎたため自分基準で調べてみました。

優しめのマサカリください！
# AWSの特徴
- Amazonが運営する**クラウドコンピューティングサービス**
- 柔軟にスケーリングが可能
- 各サービスを簡単に連携できる

# 主なサービス
## サーバ、コンピューティング
- **EC2** - Elastic Compute Cloud
    - クラウドコンピューティングサービス
    - サーバー置き場

- **Lambda**
    - サーバレスで必要時のみコードを実行可能

## データベース
- **RDS** - Amazon Relational Database Service
    - よくあるリレーショナルデータベース
    - 自動バックアップ

- **ElastiCashe**
    - 高いパフォーマンスのインメモリデータストア、メモリキャッシュ
    - DBの問い合わせ結果を一時的にキャッシュすることで高速化
    - Redis/Memcachedに対応
        - Redis - 高速なKeyValueデータストア
        - Memcached - 分散メモリキャッシュサーバ

## ストレージ
- **S3** - Amazon Simple Storage Service
    - ストレージサービス
    - 99.999999999%の耐久性（設計上）

- **EBS** - Elastic Block Store
    - EC2用のストレージサービス

## ネットワーク系
- **Route53**
    - DNSシステム

- **ELB** - Elastic Load Balancer
    - ロードバランサー
        - トラフィック分散
    - 複数のアベイラビリティーゾーンの複数のEC2インスタンスに分散

- **VPC** - Virtual Private Cloud
    - 仮想ネットワークの作成
        - インターネットへの公開
        - 社内LANとの接続
    - 基本的に必須

- **CloudWatch**
    - AWSのモニタリング（ログ）サービス
    - しきい値でのアラートなどを設定可能
    - Logs
        - EC2やS3のログファイル監視
    - Events
        - AWS環境の変化時にイベントを生成可能

## コンテナ
- **ECS** - Elastic Container Service
    - コンテナを動かせる
    - EC2のクラスタ構成を作りロードバランサーで負荷分散、コンテナの死活管理と自動復旧などを行ってくれる

- **Fargate**
    - ECSから派生したサービス
    - EC2インスタンスが不要なコンテナサービス

- **EKS** - Elastic Kubernetes Service
    - コンテナアプリのデプロイなどをKubernetesを用いて簡単に実行できる
    - Kubernetes
        - クラウド上のコンテナを一元管理できる

## セキュリティ
- **IAM** - Identity and Access Management
    - AWSのユーザアカウントやグループに対するアクセス権を設定
    - 無料

- **ACM** - AWS Certificate Manager
    - SSL,TSL証明書の作成と管理


## 特にお世話になった参考文献様
- ELB
    - ネットワーク視点で見るAWS ELB(Elastic Load Balancing)のタイプ別比較[NLB対応] / Classmethhod
        - https://dev.classmethod.jp/cloud/aws/describe-elb-types/
    - ELBの比較表に補足事項を書き加えてみる（NLB編） / Serverworks
        - http://blog.serverworks.co.jp/tech/2018/07/25/elb-comparison/
- ECS
    - ECSの概念を理解しよう / まーぽんって誰がつけたの？
        - http://www.mpon.me/entry/2017/11/19/200000
- Fargate
    - AWS FargateとECSの違いは？ / Qiita @ABCompany1
        - https://qiita.com/ABCompany1/items/5f3fcea04052415dc875
[スクレイピング]ResponseがShift_jisだった

<h2>はじめに</h2>
Shift_jisとかいう<strike>古代</strike>文字コードを拾得してしまった場合の対処法
ちなみにWindows環境の場合です。

今回は某５ちゃんねるを例にさせてもらう。

<h2>Responseを出力する</h2>
<h4>そのまま出力してみる</h4>

```python:test.py
headers = { 'connection': 'keep-alive' }
response = requests.get(target_url, headers=headers, stream=False)

print(response.text)
```

```console
UnicodeEncodeError: 'cp932' codec can't encode character '\x93' in position 33: illegal multibyte sequence
```

UnicodeEncodeErrorがでる。
案外知られてないが、Pythonで出力する場合

cp932というshift_jisの亜種ともいえる文字コードに変換してから出力されるわけだが
その際、cp932に変換できない文字が含まれているとエラーが出る。

```python:test.py
print("😂")
```

ただ無視して出力することもできる。

```python:test.py
print("😂".encode('cp932','ignore').decode('cp932', 'ignore'))
```

ただ今回のResponseを無視して出力してみると

```console
<a href="1440930335/l50">1: VBvO}XiVer.6.0 j part65 []~]&copy;2ch.net (487)</a>
<a href="1529199088/l50">2: X§￠±± 149C (635)</a>
<a href="1556284220/l50">3: E}/KXbh 83 (75)</a> sequence
```

文字化けしてしまう


そもそも今回はShift_jisを取得したはずなのに
Unicodeを変換しようとしていること自体がおかしい

つまりResponseの文字コードの設定がいかれてるので
response.encodingを正しく設定してあげる。

```python:test.py
response.encoding = 'shift_jis'
```

```console
<a href="javascript:changeSubbackStyle();" target="_self" class="js">表示スタイル切替</a>&nbsp;
<a href="/tech/kako/kako0000.html"><b>過去ログ倉庫はこちら</b></a> <a href="/tech/"><b>板TOPはこちら</b></a></small></div>
<div><small id="trad">
<a href="1551746188/l50">1: 人工知能ディープラーニング機械学習の数学 ★2 (224)</a>
…
```

できました。

<h2>Beautiful Soupに渡す</h2>

```python:test.py
response.encoding = 'shift_jis'
soup = bs4.BeautifulSoup(response.text, 'html.parser')
print(soup.prettify().encode('cp932','ignore').decode('cp932', 'ignore'))
```

返ってくるのはUnicode

また

<blockquote>Beautiful SoupはUnicodeDammitと呼ばれるクラスを使って与えられたドキュメントのエンコーディングを調べ、元のエンコーディングがなにであろうともUnicodeに変換します。</blockquote>

と便利な機能があるのでresponse.content(bytes型)を渡す。

```python:test.py
soup = bs4.BeautifulSoup(response.content, 'html.parser')
print(soup.prettify().encode('cp932','ignore').decode('cp932', 'ignore'))
```

```console
…
<a href="1411797173/l50">
     371: 【C/C++】統合開発環境CLion【JetBrains】 (49)
</a>
…
```

BeautifulSoupにはbytes型を渡そう。

また今回はWindowsに標準出力するために
.encode('cp932','ignore').decode('cp932', 'ignore')
というめんどくさいことをしているが、返ってくるのはUnicodeなので
普通に操作するだけならそのままで扱える。

<h2>まとめ</h2>
実際、文字コードは難しい
import cv2して ImportError: DLL load failedが出たときに手っ取り早く試せること

# 状況

AnacondaでOpenCVをインストールして、いざ使ってみようと import cv2 してみたら 
```
Import Error: DLL load failed: 指定されたモジュールが見つかりません。
```
というエラーが出てOpenCVが使えない。
OpenCVのインストールには、Anaconda Promptで以下のコマンドを打つことによっておこなった。
```
conda install -c conda-forge opencv
```

# 試してみたこと

OpenCVをアンインストールして、適当にバージョンを指定しなおして再インストールする。具体的には、以下のようなコマンドを実行する
```
conda uninstall opencv
conda install -c conda-forge opencv=4.0.1
```
注
 - バージョン番号4.0.1の部分は、自身の都合の良いように適当に変えてください。
 - Import Errorの原因はいろいろありそうですので、上記方法で解決しないこともあるかもしれません。本記事は、とりあえず手っ取り早く試せる一手法といったカンジです。
 - 以下は参考にした記事
 http://hokatsu.net/machine-learning/opencv-import-cv2-dll-load-failed/
 https://qiita.com/Mopepe51/items/a28616356a85abcf6d99
Substans Painterで色相を変える

自分用メモ

#やり方
変更したいレイヤに右クリックでAdd levelsを付与する
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459710/2a54e8eb-3b31-4929-f7bd-66cc51a274f3.png)

- 上の三つの調整バーで色相を変更
- 下二つで彩度が変更できる
- 左下を右へ持っていくと白く，右下を左へ持っていくと黒くなる

色違いとか作るのに便利なので重宝したい．
AWS東京リージョンの障害を回避するインフラ構成とは？

WS東京リージョンの大規模障害で多数のサービスに影響がでました。
今回の障害はなぜ起きたのか？そして回避策はなかったのか？
AWSからも公式メッセージがでたので、検証してみます。

今回の障害は東京リージョンの1つのゾーンで発生した障害です。
これはインフラ構成によっては回避できる事案です。

では、どの様にすればサービス停止を回避できたのでしょうか？
以下詳細に検証していきます。

## 目次

1. AWS東京リージョンの障害の原因と影響
2. EC2をマルチAZとマルチリージョンにする
3. DBはAuroraを使う
4. 責任の所在について

## 1. AWS東京リージョンの障害の原因と影響

今回の東京リージョンの障害の原因は冷却システムの不具合でした。
冷却システムが動かなくなり、サーバーがオーバーヒートしてしまいました。

その影響で、EC2(サーバー機能)とRDS(データベース)が使えなくなりました。

東京リージョンの1つのゾーンで広範囲のサーバーに影響範囲が広がり、
多数のサービス、アプリ、ゲームに影響がでて一時サービス停止を余儀なくされました。

## 2. EC2をマルチAZとマルチリージョンにする

ではどのような構成にすれば、今回の障害が起きても、
サービス停止を回避できたのでしょうか？

AWSのデータセンターにはリージョンとゾーンという概念があります。
リージョンは東京、大阪、オレゴン、台湾などのエリア別、国別の場所。
ゾーンは東京リージョンの範囲内の独立した別の場所の事です。

東京リージョンには複数のゾーンが存在します。

今回は東京リージョンの1つのゾーンで起きた障害なので、
複数箇所のゾーンにEC2をおいて、分散しておけば良かったのです。

しかしそれだけではなく、マルチリージョンといって、
大阪リージョンにもEC2を分散しておくとより安全でした。

## 3．DBはAuroraを使う

東京リージョンのRDSの障害を回避するにはどうすれば良かったのでしょうか？

ゲームや、Webサービスで一番大切なデータはユーザーのデータです。
なぜなら、課金して買ったダイヤやレベル、ユーザの投稿内容、フォロアー情報
などが消えたり、不整合を起こして使えなくなってはいけないのです。

それに、なるべくEC2と地理的に近いゾーンに置いて、
すこしでもアクセス速度を速くする必要があります。

なので殆どの国内向けゲームとWebサービスのRDSが、
東京リージョンに集中していました。

今回の障害でも回避を難しくしたのはこのRDSの障害だったでしょう。
AWSのRDSのドキュメントにはこのように記載されています。
>AWS リージョン間でのリソースのレプリケーションは自動的に実行されないため、ユーザーが特に指定して行う必要があります。
>Amazon は、アベイラビリティーの高い最新のデータセンターを運用しています。しかし、非常にまれですが、同じ場所にあるインスタンスすべての可用性に影響する障害が発生することもあります。もし、すべてのインスタンスを 1 か所でホストしている場合、そのような障害が起きたとき、インスタンスがすべて利用できなくなります。

まさに今回の障害がその非常にまれなパターンに当てはまるでしょう。

ではどの様に回避すれば良かったのか？

結論はAurora(高性能のセキュリティ、可用性、信頼性があるデータベース)を
最初から選択すべきでした。

可用性というのは、複数箇所に分散していて、障害に強い性能の事です。

結果論ですが、東京リージョンのRDSを使っている時点で、
今回の障害は回避不可能でした。

なぜならデータベースはEC2のように複数リージョンに分散して、
データの整合性と速度を保つのは非常に難しく、通常そんな事はしません。

じゃあ、高可用性 (マルチAZ)で複数ゾーンにまたいで
設置するれば良いという意見もありますよね？

しかし今回の障害では、マルチAZでもレプリケーションに失敗した報告がありました。

なので、完全に回避するにはAuroraの高可用性マネージドサービスDBを使えば良かったのです。

## 4. 責任の所在について

AWSでは「責任共有モデル」といって、AWSと利用者の責任を共有して分担するモデルがあります
今回の障害はハード側でサーバーのオーバーヒートというAWS側の果たすべき責任です。
しかしながら、東京リージョンの一部のゾーンの障害です。
利用者側の責任でマルチゾーンなどの構成を組む事で、回避できた障害でもあります。

[東京リージョン(AP-NORTHEAST-1)で発生したAmazon EC2とAmazonEBSの事象概要]（https://aws.amazon.com/jp/message/56489/）

>この度の事象発生時、異なるアベイラビリティゾーンの EC2 インスタンスや EBS ボリュームへの影響はございませんでした。複数のアベイラビリティゾーンでアプリケーションを稼働させていたお客様は、事象発生中も可用性を確保できている状況でした。アプリケーションで最大の可用性を必要とされるお客様には、この複数アベイラビリティゾーンのアーキテクチャに則ってアプリケーションを稼働させることを引き続き推奨します（お客様にとって高可用性に課題を生じ得る全てのアプリケーションのコンポーネントは、この耐障害性を実現する方法の下で稼働させることを強く推奨します）。

AWS側のアナウンスでも、最大限の可用性を考慮してインフラ構成を組んでねって言ってます。

Amazonの利用規約でもサービスレベルアグリーメント（SLA)を設定しています。

EC2ではマルチAZ構成で99.99％ です。
0.01%は落ちるかもしれないけど、
ゆるしてねってAmazonは規約で決めています。

月で計算すると、24時間 × 30日 × 0.01% = 4.32分です。

RDSのSLAはマルチAZで99.95％でした。
月で計算すると、24時間 × 30日 × 0.05% = 3.6時間です。

RDSはマルチAZでも使えなかったとしても
復旧まで9.5時間でしたので、これもSLAの範囲超えてるかも？？

保証対象になった企業いたのかな？

オーバーヒートと一部基盤破棄する規模の物理障害を
9.5時間で完全復旧させてしまうのは、かなり手早い復旧でしたね。

## まとめ

今回の東京リージョンの大規模障害は本当にレアケースで、
多大な影響範囲でしたよね。

対応したインフラエンジニアの方々はかなり焦ったのではないでしょうか？

今回学んだのはAWSでも落ちるときは落ちるんですね。
なのでマルチAZ、マルチリージョンで冗長構成にしましょうって事ですね。

そしてDBはAurora一択ですね。
Auroraと同じような冗長構成を自分で組むとコストが５倍かかります。
それとそもそも難しすぎて、同じ冗長構成を普通は組めません。
おとなしくAuroraに課金して安心、安全をお金で買いましょう。

以上、AWS東京リージョンの障害についてでした。
#Ruby #Rails で 日付同士の差分が 何週間ぐらいかを 計算しようとしてみた記録 ( ActionView::Helpers::DateHelper が使えない ))

#Ruby #Rails record to calculate how many weeks the difference between dates is (ActionView :: Helpers :: DateHelper cannot be used))


`ActionView::Helpers::DateHelper` が週に対応してないようなので

```rb
require 'action_view'
require 'action_view/helpers'

include ActionView::Helpers::DateHelper

distance = if some_date.between?(1.weeks.after, 1.month.after)
             distance_weeks = (some_date - Date.current).to_i / 7
             "#{distance_weeks}週間"
            else
              distance_of_time_in_words(Time.zone.now, some_date)
            end

```

https://edgeapi.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2356








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
UnityのProBuilderをLWRP/HDRP対応する

# はじめに

UnityでLWRP/HDRPに設定してProBuilderでゲームオブジェクトを作ると従来のシェーダーが使われているのでピンク色になってしまいます。ですがProBuilder 4.1.0以上でLWRP/HDRP対応マテリアル/シェーダーが追加されたのでその設定方法を解説します。


# LWRP/HDRP向け設定手順

1. Package ManagerからProBuilder 4.1.0以上をインストールします。
1. Unity2019.1以上
	1. HDRP SupportもしくはLWRP SupportのImport in projectボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/24515da5-d11f-b04a-5f2b-c40ab503ba8a.png) 
	1. `/Assets/Samples/ProBuilder/4.1.0/`にマテリアルとシェーダーがコピーされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/23c306f5-2452-6780-bf8d-6832e0923588.png)

1. Unity2018.4以下
	1. Package ManagerがImport in projectボタンに対応していないのでUnityのプロジェクトタブ内の`/Packages/ProBuilder`をエクスプローラで開き、`Samples~`フォルダ内の`HDRP`もしくは`LWRP`をプロジェクト内にコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/c00e3b3b-d39f-5888-eab4-4f1c83f5e912.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/a1ac4f7c-defb-9bb8-dae7-e9c8627f5e47.png)
1. コピーしたマテリアルはプロジェクトタブ内でプレビューがピンク色になっている事がありますが再インポートで正常に表示されます。
マテリアルはプロジェクト内のどこに配置しても構わないのですがファイル名を変えると自動割り当てされなくなるので注意してください。

以上の設定でProBuilderでゲームオブジェクトを作った時にLWRP/HDRPのマテリアルが自動で割り当てられます。

余談ですがマテリアルの自動割り当ては https://github.com/Unity-Technologies/com.unity.probuilder/pull/165 で取り込まれているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/c71d119c-0369-5fd0-fce9-0d17a1f6cc0f.png)

# ProBuilder 4.1.0未満の場合

1. https://github.com/Unity-Technologies/com.unity.probuilder/tree/v4.1.0/Samples~ に4.1.0のLWRP/HDRP向けのマテリアルとシェーダーがあるのでプロジェクト内にコピーします。
1. Unityの環境設定 > ProBuilder > Mesh Settings > Materialにコピーしたマテリアルを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/905d8d15-0b38-68cf-8783-cd72d0bc46c3.png)
iOSアプリが立ち上がるまでの処理内容

##目的
iOSがbuildされて、どのように立ち上がっているのかという根本的な仕組みを見直す。

##iPhoneアプリが起動するまで

```
#import
#import "AppDelegate.h"

int main(int argc, char *argv[]) {
  @autoreleasepool {
　　//AppDelegateのクラス名を指定
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
  }
}
```
上記のように、main関数を実行することによりアプリが起動します。この点に関しては、CやC++のソースコードと同じになります。
UIApplicationMain関数を実行する際に、AppDelegateのクラス名を指定しているため、AppDelegateでアプリ起動時・起動後に処理を実行できるようになります。
次にAppDelegateクラスの処理内容です。
この処理で、アプリの起動後やアプリがバックグラウンドに移動する際などに、処理を実行することを可能にします。

```
// AppDelegate.swift
import UIKit

// Main関数の自動実装
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

//アプリを起動する際に呼ばれるメソッド
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

    // 中略
}
```
上記がAppDelegateのソースコードです。
上から4行目を見ると、＠UIApplicationMainという記述があります。これはmain関数を自動実装してくれるものであり、iOSアプリではmain.swift ファイルを用意しなくても、このコードを記述することでmain.swiftファイルを省略できます。そのため最初に記述した、main.swiftのファイルは実際はxcode上にない場合もあるので注意してください。
Pythonでジャガード係数を求める【Jaccard係数】

#ジャガード係数とは
ジャガード係数は分母に和集合、分子に積集合の大きさをそれぞれ入れて計算することができます。
これにより、集合同士の類似度を計算することができます。数式は次の通りです。


$$
J( A, B ) = \frac { \mid A \cap B \mid } { \mid A \cup B \mid  }　 = \frac { \mid A \cap B \mid } { |A| + |B| - \mid A \cap B \mid }
$$


このジャガード係数をPythonで書くと以下のようなコードになります。


```jaccard.py

def jaccard(data1, data2):
    items = 0
    for item in data1:
        if item in data2:
            items += 1
    return items / (len(data1) + len(data2) - items)

data1 = ['Action', 'Comedy', 'Parody', 'Sci-Fi', 'Seinen', 'Super Power', 'Supernatural'] #One Punch Man
data2 = ['Action', 'Comedy', 'Historical', 'Parody', 'Samurai', 'Sci-Fi', 'Shounen'] #Gintama°

jaccard(data1, data2) #0.4
```
#追記
集合体を使うとよりわかりやすいです。

```jaccard2.py
data1 = ['Action', 'Comedy', 'Parody', 'Sci-Fi', 'Seinen', 'Super Power', 'Supernatural'] #One Punch Man
data2 = ['Action', 'Comedy', 'Historical', 'Parody', 'Samurai', 'Sci-Fi', 'Shounen'] #Gintama°

set_data1 = set(data1)
set_data2 = set(data2)
numerator = len(set_data1 & set_data2) # {'Action', 'Comedy', 'Parody', 'Sci-Fi'}
denominator = len(set_data1 | set_data2) # {'Action', 'Comedy', ..., 'Super Power', 'Supernatural'}

print(numerator / denominator) # 4 / 10 --> 0.4
```

#参考
[pythonでデータ間の類似度を計算する方法いろいろ](https://qiita.com/shim0mura/items/64918dad83d162ef2ac2)
[【技術解説】集合の類似度(Jaccard係数，Dice係数，Simpson係数)](https://mieruca-ai.com/ai/jaccard_dice_simpson/)
[pythonでJaccard係数を実装](https://qiita.com/pontyo4/items/d0910514e1b9f46c1c98)
[自然言語処理する時に計算するJaccard係数をPythonで計算する方法まとめ](https://www.st-hakky-blog.com/entry/2018/01/18/183840)
#Rails の ActionView::Helpers を直接 include して i18n チックに xヶ月 x日 x年 みたいなのを表示する例

#Rails' ActionView :: Helpers is included directly to display i18n ticks like x month x day x year


rails console で動作確認した

# ja.yml

なぜかトップレベルに設定する必要がありそう？

```yaml
ja:
  about_x_hours:
    one: 約1時間
    other: 約%{count}時間
  about_x_months:
    one: 約1ヶ月
    other: 約%{count}ヶ月
  about_x_years:
    one: 約1年
    other: 約%{count}年
  almost_x_years:
    one: 1年弱
    other: "%{count}年弱"
  half_a_minute: 30秒前後
  less_than_x_seconds:
    one: 1秒以内
    other: "%{count}秒未満"
  less_than_x_minutes:
    one: 1分以内
    other: "%{count}分未満"
  over_x_years:
    one: 1年以上
    other: "%{count}年以上"
  x_seconds:
    one: 1秒
    other: "%{count}秒"
  x_minutes:
    one: 1分
    other: "%{count}分"
  x_days:
    one: 1日
    other: "%{count}日"
  x_months:
    one: 1ヶ月
    other: "%{count}ヶ月"
  x_years:
    one: 1年
    other: "%{count}年"
```

# rails console

```rb
require 'action_view'
require 'action_view/helpers'

include ActionView::Helpers

distance_of_time_in_words(Time.zone.now, 3.months.after)
# => "3ヶ月"
```

# Ref

https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml

# ja.yml 設定例

https://edgeapi.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2355








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Qiitaに投稿を始めた頃の自分へ ~100投稿目の振り返り~

# 目的

- Qiitaに毎日1投稿をして100投稿に達した今の自分から投稿を始めた頃の自分にアドバイスを送る
- たかが100投稿だがどうして続けられたのかを客観的に振り返る

# 投稿を始めた頃の自分にアドバイス

- 投稿のテンプレートを作っておこう  
投稿のテンプレートを前もって作成すると一貫して見やすい投稿になるよ！  
- Qiitaのトップ記事をチェックしよう  
いいねをたくさんもらっている人はどんな投稿をしているかチェックしよう！  
テンプレートを作る時の勉強にもなる！  
- 自分のページにGoogleアナリティクスを設定しよう  
どんな時間にどのくらい見られているかわかるので便利！  
使い方がわからなくてもとりあえず使って設定してみよう！  
- 記事のMarkdownデータをGit管理しよう  
リモートでも投稿内容の編集が可能になるようにGitで管理しよう！  
- 正直最初は見向きもされない、自分用のメモと割り切って継続して投稿してみよう  
書き方も固まっていない状態で、あんまり閲覧数は伸びない。  
これはしょうがないことなので割り切ってどんどん投稿しよう!  
- ほかの人が投稿した内容にコメントを残そう  
自分がしてもらったら嬉しいことを他の人にどんどんやろう!  
「解決できました！ありがとうございます！」と一言でもいいのでコメントを残そう!  
- 小さな記事でも誰かのためにはなる  
「こんなミクロな内容書いても必要かな」とか考えない!  
考えている暇あったら投稿内容を考えた方がマシ!
- 投稿を日課にしよう  
慣れるまで大変だけど日課にしちゃえばそのうち

# 継続できたことに対しての振り返り

※たかが100投稿ですが振り返らせてください。

- 投稿開始時から閲覧者からのレスポンスがあった
- 日課になった
- ほかの人の投稿へのリンクを貼って省略するところは省略した
- 長い投稿は1日で仕上げようとせず、Git管理して隙間時間で作成した
- 「Qiitaでいいねをたくさん貰いたいなら継続して投稿してみて」的な話を聞いた
- Qiitaの記載方法がMarkdownだった
- 第三者から見てもらえる明確な勉強結果を記せる場所だった
CardDAV サーバー

(初出: 2019-02-23)

先日も触れたが現状で日本人向けと思われる CardDAV サーバーは iCloud が最大手であり、これを嫌う場合は ownCloud Contacts くらいしかないように思われる。ownCloud よりも Nextcloud の方が機能的には進んでいる雰囲気だが、Contacts については [t-bucchi 氏のパッチが取り込まれる](https://petit-noise.net/blog/phonetic-name-patch-is-merged-by-owncloud-contacts/) よりも前にフォークしたようで、残念ながらふりがなが使えない。手元のサーバーで ownCloud は (Nextcloud も) 稼働はさせているが、試しに ownCloud のホスティングサービスを探してみた。

いくつもあるのだが、oCloud.de はかなり前から目にしていたような気がするので見に行ってみると、容量 1GB の無料プランがある。ownCloud / Nextcloud はしばしば Dropbox のようなサービスと紹介されているが、そうした観点からでは容量 1GB はいかにも手狭で、無料プランらしいと言える。しかし ownCloud / Nextcloud の真価は CalDAV / CardDAV にあるのかもしれず、こちらに着目するのであれば容量 1GB はかなり使いでがある。そこで早速使ってみることにした。

今まで使ってきたサーバーは大手町の某所に収容されているようだが、ここから ocloud.de へ traceroute してみると千葉→サンタクララ→ニューヨーク→アムステルダム→フランクフルトとつながり、RTT は 250ms 程度だった。それなりだが、シェルを使うわけではないので問題はない。当面無料プランで十分だが、oCloud.de は 500GB プランでも月額1,000円程度なので価格競争力もそこそこある。もちろん iCloud の 2TB で月額1,300円には到底及ばないし、ホスティングだから構成の自由度も低いのだが、代替手段としては検討の余地があるだろう。
Laravel + Blade + Vue.jsで、Vue.jsのコンポーネントの属性に渡す変数が正しくエスケープされていないとエラーが出る

## 環境と背景事情
1. LaravelでVue.jsを使用している（セットアップは[このページ](https://blog.pusher.com/why-vuejs-laravel/)を参考にしました）
2. bladeテンプレート内に、直接Vue.jsのマークアップを表記している。
3. 上記のbladeテンプレには、Vue.jsコンポーネントを使用しており、属性でテキストデータを渡している。
4. 上記のコンポーネントで、ユーザが入力したテキストデータを表示させている。

## 問題
ユーザが入力データに引用符やHTMLコードを用いると、Vue.jsのページのコンパイル時にエラーが発生して、ページが表示されない。

## 解決策

Vue.jsコンポーネントのテキストデータを渡す属性値に、PHP関数の"json_encode"を用いてエンコードした。

## エラー表示例

```
[Vue warn]: Error compiling template:
```

HTMLコードをそのままコピペした場合：

```
avoid using JavaScript keyword as property name: "if"
```

引用符が混じっているテキスト：

```
invalid expression: Invalid or unexpected token in
```

その他：

```
invalid expression: Unexpected number in
```

```
invalid expression: Unexpected string in
```

コンソール出力例：
<img width="559" alt="Screen Shot 2019-08-27 at 11.16.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145550/9658e141-a393-326c-82f2-fa4d0ac70d14.png">
## 問題があったコード例

bladeテンプレートに記述されたVue.jsのマークアップ

```
<project-list-items 
            :title="{{ $project->title }}"
            :description="{{$project->description }}"
/>
```

エンコードも何もせずにそのまま値を渡している。

## 問題解決後のコード例

json_encodeを用いてエンコードした。

```
<project-list-items 
            :title="{{ json_encode($project->title) }}"
            :description="{{ json_encode($project->description) }}"
/>
```