OmniAICreator/Qiita-1.07M huggingface dataset:
PHP の小数演算で結果がおかしくなるパターンと対応策

株式会社オズビジョンのユッコ (@terra_yucco) です。
先週は一週間有休をいただき、漆黒の FF14 をがっつりプレイしてきました。
今週からまた、ぽつぽつ Qiita を更新していきます。

# 小数演算

人間の計算は基本的に 10 進数の上に成り立ちますが、コンピュータは内部的には値を 2 進数で保持します。
その結果、小数の演算では、想定する値が算出されないことがあります。

## 不具合のあるコード

以下は元値 (1000) と係数 (0.7 や 0.6) によりパーセントで該当する値を求めたいコードになります。

```terminal
$ php -a
Interactive shell

php > echo floor(1000 * (0.7 / 100));
6
php > echo floor(1000 * (0.6 / 100));
6
```

1 例目は個人的には 7 になってほしいです。というか皆さんそうだと思います。

## 対応するには

他にもいくつか解はあるようですが、この問題に対応した際には、改修コストなどを考えて string キャストを選択しました。

```terminal
php > echo floor((string)(1000 * 0.6) / 100);
6
php > echo floor((string)(1000 * 0.7) / 100);
7
```

無事に 7 になりました。

## 影響範囲を調査するためのコード

結果は膨大になってしまうので割愛しますが、どのような係数を指定したときに値が想定からずれるのかを調べるため、以下のテストコードを書いて範囲を調べました。
(これがこの記事のメイン)

- 内部を 0-50 50-100 の 2 つに分割しているのは、1 つにすると vagrant のメモリが不足したため
- 今から見返すと 50 が 2 回登場している (ﾉ∀`)ｱﾁｬｰ

最初の方だけ列挙すると、以下のケースで、string キャストありなしで差分が出ました。

- 0.7
- 1.4
- 2.8
- 4.1
- 5.6
- 7.1
- 7.3
- 8.2
- 9.7
- 11.2

```php
<?php

/**
 * 小数計算処理全般のテスト
 */
class CalculatorTest extends CIUnit_TestCase
{
    /**
     * @param $計算元値
     * @param $係数
     * @param $計算結果小数
     *
     * @dataProvider 小数算出処理のバリエーション用データ_0_50
     */
    public function 小数算出処理のテスト_0_50($計算元値, $係数, $計算結果小数)
    {
        $target = new Calculator();
        $this->assertEquals(
            $計算結果小数,
            $target->decimals(
                $計算元値,
                $係数
            )
        );
    }

    /**
     * @return array
     */
    public function 小数算出処理のバリエーション用データ_0_50()
    {
        $data = array();
        for ($i = 0; $i <= 50; $i = round($i + 0.1, 2)) {
            array_push($data, array(
                '計算元値' => 1000,
                '係数' => $i,
                '計算結果小数' => (string)(1000 * $i) / 100)
            );
        }
        return $data;
    }

    /**
     * @param $計算元値
     * @param $係数
     * @param $計算結果小数
     *
     * @dataProvider 小数算出処理のバリエーション用データ_50_100
     */
    public function 小数算出処理のテスト_50_100($計算元値, $係数, $計算結果小数)
    {
        $target = new Calculator();
        $this->assertEquals(
            $計算結果小数,
            $target->decimals(
                $計算元値,
                $係数
            )
        );
    }

    /**
     * @return array
     */
    public function 小数算出処理のバリエーション用データ_50_100()
    {
        $data = array();
        for ($i = 50; $i <= 100; $i = round($i + 0.1, 2)) {
            array_push($data, array(
                '計算元値' => 1000,
                '係数' => $i,
                '計算結果小数' => (string)(1000 * $i) / 100)
            );
        }
        return $data;
    }
}
```

# Conclusion

小数の計算をする場合には、こういうケースもあるので気を付けよう、というお話でした。
きちんとやるのであれば BCMath を入れるのが本来はよさそうです。
gst-launch-1.0の典型的なパイプライン記法


# はじめに

gst-launch-1.0のパイプラインを構築するにあたり、マニュアル[^1]では分かりにくい部分を捕捉するつもりで本稿を書いた。

[^1]: gst-launchマニュアル https://gstreamer.freedesktop.org/documentation/tools/gst-launch.html

# 典型的な記法

## 1. 単純な接続の例

まずは最も単純な結合を考える。下記は3つのエレメント video1, video2, video3 を結合する例である。
![simple_connect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252224/5a68c16f-a26c-a0cb-3e1a-22c1160e4520.png)

```
video1 ! video2 ! video3
```

と書く。

## 2. 多重化をほどく例

映像と音声の両方が含まれたコンテナから映像と音声を取り出す(demux)の例である。
![demux_example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252224/cf828944-d0a9-ae2e-0be9-f32950d558b1.png)

```
container1 ! demux name=aaa aaa.video_0 ! video1 aaa.audio_0 ! audio1
```

文は次のように3つに分かれている。

- container1 ! demux name=aaa
- aaa.video_0 ! video1
- aaa.audio_0 ! audio1

分岐するdemuxのところで識別子としてaaaを与えている。スペースが区切り文字となっているため、video1とaaa.audio_0が接続しているように見えるがそうではない。

## 3. 多重化する例

異なるソースからの映像と音声を一つのコンテナにまとめる多重化(mux)の例である。
![mux_example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252224/d0c67621-6ba3-161b-335b-66c3b797796a.png)

```
mux name=bbb ! container2 video3 ! bbb.video_0 audio2 ! bbb.audio_0 
```

こちらも文法を考えると次の3つに分かれている。

- video3 ! bbb.video_0
- audio2 ! bbb.audio_0
- mux name=bbb ! container2

muxのところで識別子bbbを与えているため、パイプラインでは先頭に来ている。

## 4. 上の1~3を合わせた例

![mux_demux.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252224/ffaed776-985d-9e1e-0d80-6018cf75df81.png)

```
mux name=bbb ! container2 container1 ! demux name=aaa aaa.video_0 ! video1 ! video2 ! video3 ! bbb.video_0 aaa.audio_0 ! audio1 ! audio2 ! bbb.audio_0
```

こちらもパースして見ると図の通りということが分かる。

- container1 ! demux name=aaa
- aaa.video_0 ! video1 ! video2 ! video3 ! bbb.video_0
- aaa.audio_0 ! audio1 ! audio2 ! bbb.audio_0
- mux name=bbb ! container2

# まとめ

この記事ではgst-launch-1.0の典型的なパイプラインの記述方法について

- 通常の接続
- 多重化の分解
- 多重化の実施
- 上記3つの組み合わせ

を説明した。
Lightsail環境で、１つのIPアドレスに対して複数ドメインのSSLサーバー証明書を適用する。

基本的には、以下のサイトの説明通りで良い。
[Apacheに、複数ドメインのSSL証明書を導入する - CLOVER🍀](https://kazuhira-r.hatenablog.com/entry/20180803/1533306833)

つまり、デフォルトでは１つしかない`<VirtualHost _default_:443>`タグをコピーして、
別のドメインでアクセスされた時用に もう１つ記載する。 

Lightsail環境においては、`/opt/bitnami/apache2/conf/bitnami/bitnami.conf`ファイルが
`/etc/httpd/conf.d/ssl.conf`の様な位置づけになっているというのが肝か。

```/opt/bitnami/apache2/conf/bitnami/bitnami.conf
<VirtualHost _default_:443>
  ServerName hoge.com
  DocumentRoot "/opt/bitnami/apache2/htdocs"
  SSLEngine on
SSLCertificateFile "/opt/bitnami/apache2/conf/server.crt"
SSLCertificateKeyFile "/opt/bitnami/apache2/conf/server.key"
　　：

<VirtualHost _default_:443>
  ServerName test.com
  DocumentRoot "/opt/bitnami/apache2/htdocs"
  SSLEngine on
SSLCertificateFile "/opt/bitnami/apache2/conf/server2.crt"
SSLCertificateKeyFile "/opt/bitnami/apache2/conf/server2.key"
　　：
```

その後、`sudo /opt/bitnami/ctlscript.sh restart apache`を実行して、設定を再読込みさせれば良い。

なお、下記記事で「違うドメインでも同じ証明書を使い回せる」とあったので試してみましたが、
今回の環境では上手くいきませんでした。
[複数バーチャルホストに複数SSLのApache設定：俺ならこう書く](https://samuraishockdo.info/ja/webmagazine/seo/apache-ssl)


### 備考
上記の、.crtファイル と .keyファイルは、以下の要領で作成。

```
bitnami@ip-xxx:/etc/letsencrypt$ ./letsencrypt-auto certonly --webroot -w /opt/bitnami/apache2/htdocs/ -d <ServerName>

sudo cp /etc/letsencrypt/live/<ServerName>/privkey.pem /opt/bitnami/apache2/conf/server2.key
sudo cp /etc/letsencrypt/live/<ServerName>/fullchain.pem /opt/bitnami/apache2/conf/server2.crt
```
Heroku CLIをAWS Cloud9で使えるようにする

https://devcenter.heroku.com/articles/heroku-cli

:point_up:からダウンロード.

Other installation methodsのリンクからページに移動.

（```$ cd ~/environment/```で移動してからやるとよい）

TarballsのLinux(x64)のリンクアドレスをコピー.

```
$ curl -OL "(URL)を貼る"
```
ダウンロード、スタート.
.
.
.
.
.
.
##Heroku CLIのインストール.

```
$tar zxf heroku-linux-x64.tar.gz
$ sudo mv heroku /usr/local/

(確認)
$ ls /usr/local/heroku/ 

$echo 'PATH=/usr/local/heroku/bin:$PATH' >> $HOME/.bash_profile
$source $HOME/.bash_profile > /dev/null
```

##最後に確認

```
$ heroku -v
```
バージョンが表示されたらOK！
.
.
.
.
.
.

####終わったら消す！

``` 
$ rm -f heroku-linux-x64.tar.gz
```

####これで完了.
Leetcode #881: Boats to Save People

```swift
func numRescueBoats(_ people: [Int], _ limit: Int) -> Int {
    var people = people.sorted()
    var numOfBoat = 0
    var start = 0
    var end = people.count - 1
    while start <= end {
        if people[start] + people[end] > limit {
            end -= 1
        } else {
            start += 1
            end -= 1
        }
        numOfBoat += 1
    }
    return numOfBoat
}
```
テスト8

```vb

Public Sub HTMLsource()
'HTMLソースの全てを取得
'参照設定
'「Microsoft HTML Object Library」、「Microsoft Internet Controls」
Dim ie As InternetExplorer
Dim txtInput As HTMLInputElement

Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.Navigate "https://sports.yahoo.co.jp/"

Do While ie.Busy = True Or ie.readyState < READYSTATE_COMPLETE
    DoEvents
Loop

Set txtInput = ie.document.getElementById("msthdsbox")
txtInput.Value = "AAA"

End Sub

```
[備忘録] vuejs エラー Elements in iteration expect to have 'v-bind:key' directives

# Eslintが何か言っている
`v-for` タグにて、
`Elements in iteration expect to have 'v-bind:key' directives`

# エラーの意味
https://vuejs.org/v2/guide/list.html#Maintaining-State
各項目に一意のキー属性を指定する必要があります とのこと

# 解決
```
<th v-for="value in columns">{{ value }}</th>
👇
<th v-for="(value, key) in columns" :key="key">{{ value }}</th>
```
IBM Cloud Internet ServicesのEdge Functionでハイフン付きのサブドメインをトリガーに指定する方法

しょうもないバグ？を見つけてしまったので共有します。

IBM Cloud Internet Services（以下、CIS）のEdge Function（CloudflareのWorkersに相当）ではURLをトリガーに処理を行いますが、トリガーに指定できるURLはそのCISで管理しているドメインまたはそのサブドメインです。

しかし、ハイフン(-)を含むサブドメインを指定するとなぜかエラーになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/6e31f01a-33c6-a35a-7855-00d360a2a66e.png)

この場合の対処ですが、いったんハイフンを除いて保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/a4dd7da6-9e60-1d71-b4d5-0b4d1b2374c9.png)

そして保存後に編集ボタンを押すと、今度はハイフンを付けてもエラーにならず保存できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/b0a613e3-f761-145f-f31c-109a62ae41ea.png)

ああ、しょうもない。
ls -la folder/. と ls -la folder/*の違い

毎回再帰処理を実装する時にググっているので備忘録程度に記録。`chmod`とかで権限の処理をする時とかにこういうの考える必要があったりする。

## `ls -la folder/.`
-  カレントディレクトリのfolder自体の設定も表示される
- folderはそのまま表示。再帰的に表示はされない

```
ubuntu@ip-192-168-1-209:~$ ls -la folder/.
total 12
drwxrwxr-x  3 ubuntu ubuntu 4096 Jul  8 12:22 .
drwxr-xr-x 10 ubuntu ubuntu 4096 Jul  8 12:21 ..
drwxrwxr-x  2 ubuntu ubuntu 4096 Jul  8 12:22 folder2
-rw-rw-r--  1 ubuntu ubuntu    0 Jul  8 12:22 test_cd.txt
```

## `ls -la folder/*`
- folder直下に置いてあるファイルシステムが再帰的に表示
- カレントディレクトリのfolder自体の設定は表示されない
- 再帰的に表示したfolderは設定も表示される

```
ubuntu@ip-192-168-1-209:~$ ls -la folder/*
-rw-rw-r-- 1 ubuntu ubuntu    0 Jul  8 12:22 folder/test_cd.txt

folder/folder2:
total 8
drwxrwxr-x 2 ubuntu ubuntu 4096 Jul  8 12:22 .
drwxrwxr-x 3 ubuntu ubuntu 4096 Jul  8 12:22 ..
-rw-rw-r-- 1 ubuntu ubuntu    0 Jul  8 12:22 test.txt
```
TECH ~Day14~

学習を始めてから早くも２週間が経ち、中間試験までの日にちが近づいてきました。今までの学習はほとんど知識を入れる学習ばかりだったのでいざ問題を解くという場面になった時にどれだけ今までの学習が活かせるのか、とても不安です。
最近は特に忙しくなってきたので、学習を効率よく行うにはどうすればいいのか常に考えています。

<h2>学習内容</h2>
・部分テンプレート
・render
・render partial　オプション
・git, git clone, git hub
・bundlerによるgem管理
・bundle exec　コマンド


・部分テンプレート
ツイッターなどでツイート画面などがHTML構造的に同じもの。
同じHTML構造の部分を共通化していくことによって、無駄なくビューファイルを作ることができる。この共通化された部分を「部分テンプレート」という。


・render
部分テンプレートを呼び出す際に利用するメソッド。


・render partial　オプション
renderに「:partial」というオプションをつけることで、明示的に部分テンプレート名を指定し、部分テンプレートを表示することができます。

！部分テンプレートのファイル名はアンダーバー「_」から始まる。


・git, git clone, git hub
git
ソースコードの変更履歴、バージョン等を記録するツールで、開発する際には、ひっすと言えるツールです。facebookやgoogleも利用している。

git hub
チーム開発やソースコードの共有にとても便利なサービス。
自分のソースコードを保管できるため、エンジニアの履歴書のような役割も果たす。

git clone リポジトリURL　ディレクトリ名
git cloneコマンドは、外部のサーバーにあるgitで管理されたソースコードを自分のパソコン（ローカル環境）にダウンロードするコマンド。
実際に使用する際には「git clone リポジトリURL ディレクトリ名」という形でターミナルで実行して行う。



・bundlerによるgem管理
bundlerを利用してインストールしたgemは、railsの各プロジェクトではなく、rubyのバージョンごとにある保存場所にインストールされています。

「bundle show[gemの名前]」というコマンドを入力するとbundlerでインストールしたgemがどこに保存されているか確認できる。



・bundle exec　コマンド
bundler execは二つ以上のrailsアプリケーションを同じバージョンのrubyを利用して作成している際に必要となるコマンド。

「bundle exec rake db:create」
　↑データベースの作成コマンド

「bundle exec rails s」
　↑サーバーの起動
vscodeのMarkdownで `  backquoteが自動で閉じるようにする

## 変更するファイル

`$installDir/resources/app/extensions/markdown-basics/language-configuration.json`の中身を書き換えます。  
windowsの場合`C:\Users\%username%\AppData\Local\Programs\Microsoft VS Code`が`$installDir`になっていました。  

## 変更内容

`autoClosingPairs`に ` を付け足します。  

``` json
"autoClosingPairs": [
	{
		"open": "`",
		"close": "`"
	},
]
```

同様に任意の言語で`autoClosing`を追加する事ができます。
~~なお、vscodeのUpdateでファイルの場所及び中身が変更される可能性があります。~~
追記：Updateで変更した中身が元に戻りました、毎回変更するの面倒！

## 参考
[How to enable automatic quote wrapping when pressing " or ' with selected text in Markdown and text files?](https://www.reddit.com/r/vscode/comments/6y0waa/how_to_enable_automatic_quote_wrapping_when/)
Leetcode #520: Detect Capital

```swift
func detectCapitalUse(_ word: String) -> Bool {
    var countOfCapital = 0
    for char in word {
        if char >= "A" && char <= "Z" {
            countOfCapital += 1
        }
    }
    if countOfCapital == word.count || countOfCapital == 0 {
        return true
    }
    
    if let char = word.first, char >= "A" && char <= "Z", countOfCapital == 1 {
        return true
    } else {
        return false
    }
}
```
Strong Parameters~ヘルスケアwebサービスを自分で作る医者の日記~

12章で

```
def user_params
      params.require(:user).permit(:password, :password_confirmation)
    end
```
登場
7章を見返すと
Strong Parametersか！
読み直してやっと理解できた、、、


リスト 7.18のコメントと、上の再録コメントでも重ねて指摘しているように、この実装は最終形ではありません。その理由は、paramsハッシュ全体を初期化するという行為はセキュリティ上、極めて危険だからです。これは、ユーザーが送信したデータをまるごとUser.newに渡していることになります。ここで、Userモデルにadmin属性というものがあるとしましょう。この属性は、Webサイトの管理者であるかどうかを示します (この属性を実装するのは10.4.1になってからです)。admin=’1’という値をparams[:user]の一部に紛れ込ませて渡してしまえば、この属性をtrueにすることができます。これはcurlなどのコマンドを使えば簡単に実現できます。paramsハッシュがまるごとUser.newに渡されてしまうと、どのユーザーでもadmin=’1’をWebリクエストに紛れ込ませるだけでWebサイトの管理者権限を奪い取ることができてしまいます。

以前のバージョンのRailsでは、モデル層でattr_accessibleメソッドを使うことで上のような危険を防止していましたが、Rails 4.0ではコントローラ層でStrong Parametersというテクニックを使うことが推奨されています。Strong Parametersを使うことで、必須のパラメータと許可されたパラメータを指定することができます。さらに、上のようにparamsハッシュをまるごと渡すとエラーが発生するので、Railsはデフォルトでマスアサインメントの脆弱性から守られるようになりました。

この場合、paramsハッシュでは:user属性を必須とし、名前、メールアドレス、パスワード、パスワードの確認の属性をそれぞれ許可し、それ以外を許可しないようにしたいと考えています。これを行うには、次のように記述します。

params.require(:user).permit(:name, :email, :password, :password_confirmation)
このコードの戻り値は、許可された属性のみが含まれたparamsのハッシュです (:user属性がない場合はエラーになります)。

これらのパラメータを使いやすくするために、user_paramsという外部メソッドを使うのが慣習になっています。このメソッドは適切に初期化したハッシュを返し、params[:user]の代わりとして使われます
埋め込み~ヘルスケアwebサービスを自分で作る医者の日記~

edit アクションでページ内に埋め込み
updateで更新するとな、、、

```
<% provide(:title, 'Reset password') %>
<h1>Reset password</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(@user, url: password_reset_path(params[:id])) do |f| %>
      <%= render 'shared/error_messages' %>

      <%= hidden_field_tag :email, @user.email %>

      <%= f.label :password %>
      <%= f.password_field :password, class: 'form-control' %>

      <%= f.label :password_confirmation, "Confirmation" %>
      <%= f.password_field :password_confirmation, class: 'form-control' %>

      <%= f.submit "Update password", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>
```
MaterializecssのCarouselを使用して、3秒ごとに画像が自動で切り替わるページを作る

# 概要
TECH::EXPERTのカリキュラムでオリジナルのミニアプリを作成する機会があり、
その一部のページでMaterializecssのCarouselを使用し、3秒ごとに画像が切り替わるページを作成したので紹介します。
## MaterializecssのCarouselとは
画像をくるくると回せる機能です。
[![Image from Gyazo](https://i.gyazo.com/0b1f06c9caade35f10835a6572fb5407.png)](https://gyazo.com/0b1f06c9caade35f10835a6572fb5407)
https://materializecss.com/carousel.html
##自分が作成したページ紹介
[![Image from Gyazo](https://i.gyazo.com/9caccbf39e60af8e670ecacdedd5bc88.gif)](https://gyazo.com/9caccbf39e60af8e670ecacdedd5bc88)
##作成する前提
MaterializecssがCDNで読み込めている
##編集するファイル
・ビューファイル
・CSSファイル
・jsファイル
###ビューファイル
```erb:about.html.erb
<section class="about-main" >
  <div class="carousel carousel-slider" data-indicators="true" id="big3" >
    <div class="carousel-fixed-item">
      <div class="container">
        <h1 class="white-text">Work Hard See Result</h1>
      <% if user_signed_in? %>
        <a class="btn waves-effect white black-text darken-text-2" href="/" target="_blank">HOME</a>
      <%else%>
        <a class="btn waves-effect white black-text darken-text-2" href="/users/sign_in" target="_blank">Log in</a>
      <%end%>
      </div>
    </div>
    <div class="carousel-item big3pic" id="benchpress">
      <div class="container">
        <h3 class="white-text">Bench Press</h3>
        <p class="white-text">chest</p>
      </div>
    </div>
    <div class="carousel-item big3pic" id="deadlift">
      <div class="container">
        <h3 class="white-text">Dead Lift</h3>
        <p class="white-text">back</p>
      </div>
    </div>
    <div class="carousel-item big3pic"  id="squat">
      <div class="container">
        <h3 class="white-text">Squat</h3>
        <p class="white-text">legs</p>
      </div>
    </div>
  </div>
</section>
```
"carousel carousel-slider" を用いました。
"carousel-fixed-item"は固定して表示したいものを書きます。
"carousel carousel-item"の部分がそれぞれの画像のクラスです。

###CSSファイル
```CSS:style.css
#big3{
  height: 100vh;
}
#benchpress{
  background-image: url('benchpress.jpg');
  background-size: 100%;
}
#deadlift{
  background-image: url('deadlift.jpg');
  background-size: 100%;
}
#squat{
  background-image: url('squat.jpg');
  background-size: 100%;
}
```
それぞれidを付与してるので、idによって画像を変更してください。
###jsファイル
```JavaScript:about.js
$(document).ready(function(){
  $('#big3').carousel(
  {
    dist: 0,
    padding: 0,
    fullWidth: true,
    indicators: true,
    duration: 100,
  }
  );
  autoplay()
  function autoplay() {
      $('#big3').carousel('next');
      autoplay: true,
      setTimeout(autoplay, 3000);
  }
});
```
autoplayの関数を定義してます。
id=big3に対して3000ミリ秒で次のcarousel-itemを
表示するように設定してます。

オプションは下記を参照しました。

- [1] dist: 0, => 遠近ズーム0
- [2] padding: 0, =>　中央以外の項目の余白0
- [3] fullWidth: true, => carouselを全幅のスライダーへ
- [4] indicators: true, =>　インジケータを表示
- [5] duration: 100, =>　次のスライドへ移動しきるまでの時間100ミリ秒

[![Image from Gyazo](https://i.gyazo.com/29ad03688fe5123e54ef17b790b73c6b.png)](https://gyazo.com/29ad03688fe5123e54ef17b790b73c6b)
letter_opener でメール内容がブラウザで表示されない

# letter_opener でメール内容がブラウザで表示されない

表題のとおりなのですが、
[letter_opener](https://github.com/ryanb/letter_opener#rails-setup)の設定を正しく行っても、うまくブラウザに表示されない場合....

Railsであれば、`ApplicationMailer`の `from`を確認しましょう。
`from`が設定されていないと、ブラウザで表示されません・・・・

これ調べるので１日使ってしまった・・・・orz


自分用メモではあるのですが、
他の同じハマリをしている方達への教訓となれば幸いです。
Laravelのマイグレーションファイル名は形式が決まっているようなのでメモ

Laravelでcreated_users_table.phpというマイグレーションファイルを作成して、実行したところ、エラーがでた。

```php:database/migrations/create_users_table.php作成
$ php artisan migrate

   Symfony\Component\Debug\Exception\FatalThrowableError  : Class '' not found

    436|     public function resolve($file)
    437|     {
    438|         $class = Str::studly(implode('_', array_slice(explode('_', $file), 4)));
    439|
  > 440|         return new $class;
    441|     }
    442|
    443|     /**
    444|      * Get all of the migration files in a given path.

```

ああ、マイグレーションファイル名の形式は指定されているみたい。。

正しいファイル名は下記を参考

```
2019_07_05_052836_create_users_table.php
```

ついでに、

```php
$class = Str::studly(implode('_', array_slice(explode('_', $file), 4)));
```

が何をしているかっていうと、

`Str::studly`はLaravelのヘルパ関数で、文字列をアッパーキャメルケースに変換。
https://readouble.com/laravel/5.7/ja/helpers.html#method-studly-case

implodeは指定の文字列で連結
explodeは指定の文字列で分割
array_sliceは配列の一部を展開

流れを出力してみると、

```php

$file = "2019_07_05_052836_create_users_table";
$file = explode('_', $file);
var_dump($file);

$file = array_slice($file, 4);
var_dump($file);

$file = implode('_', $file);
var_dump($file);

```

```:出力結果
array(7) {
  [0]=>
  string(4) "2019"
  [1]=>
  string(2) "07"
  [2]=>
  string(2) "05"
  [3]=>
  string(6) "052836"
  [4]=>
  string(6) "create"
  [5]=>
  string(5) "users"
  [6]=>
  string(5) "table"
}
array(3) {
  [0]=>
  string(6) "create"
  [1]=>
  string(5) "users"
  [2]=>
  string(5) "table"
}
string(18) "create_users_table"
```


取得できた```create_users_table```に対して、```Str::studly```でアッパーキャメルケース(CreateUsersTable)に変換して、

```php
return new $class;
```

インスタンスを生成しているのですなぁ。

これは、自分でも使えそうなので、覚えておく。
AWS S3のオブジェクトの更新をトリガーとして発火する LambdaFunctionを作成する

# はじめに
以前、[CloudFrontの配信元のファイル(S3)が更新されたら自動的にキャッシュをクリアする仕組みを作る](https://qiita.com/Shi-nakaya/items/e6ac79dd35506d4c9fbc)という記事を作成しました。

その対応の中で「S3のオブジェクトの更新をトリガーとして発火する LambdaFunction」が必要となります。

当記事では具体的な設定方法を紹介します。

LambdaFunctionの中身の件についてはこちらの記事にて記載しております。
[AWS S3バケット名からCloufFrontのキャッシュをクリア(CreateInvalidation)するAPIをコールする](https://qiita.com/Shi-nakaya/items/32f8d049a0262e29efe3)

# 具体的な設定方法
1. イベント発火元のS3バケットを選択
2. 「プロパティ」-「Events」-「詳細はこちら」をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265300/adda0412-9a0f-1ce9-2368-d88f33b8a81c.png" width=80%>
3. 「通知の追加」をクリックして、[送信先]にLambdaFunctionを選択、[Lambda]に自分の実行したいLambdaFunction名を選択する

<img width=50% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265300/5ec461fd-1c8d-2d4a-5170-b958f01500d1.png">

以上で完了です。

# 終わりに
設定自体は見つけてしまえば簡単です。
設定が反映されるまでは3分くらいかかる為、留意して下さい。
※実はLambdaFunction側からでも簡単に設定できます。
Lattice Diamond をインストールする

#はじめに
なんか秋月で安く売ってるFPGA[（これ）](http://akizukidenshi.com/catalog/g/gI-11003/)を使いたい
でもXilinxでもIntelでもないぞ…どうしたら使えるんや
とりあえず開発環境を作ってみる

#Lattice Diamond のインストール
＊私の環境はWindows 10 Education(1903) マシンはVAIO S11 ABEです


http://www.latticesemi.com/ja-JP/Products/DesignSoftwareAndIP/FPGAandLDS/LatticeDiamond

- Latticeのサイトに登録してLattice Diamondをダウンロード
- 同時にライセンスを取得（サイトの指示に従う）
- exeを起動してインストール
- 待つ
- 初回起動時にライセンスがないって怒られるので、メールで来たライセンスファイルを C:\flexlm\licence.dat に配置（C:\flexlm がなかったので作った）
- 起動する


![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72691/ff564f1a-76b4-ac8d-2fdf-3ac5290757a9.png)

#次回は
実際になんかいじってみようと思う
TECH ~Day13~

<h2>学習内容</h2>
・アソシエーション
・n + 1問題
・includesメソッド
・後置if
・updateメソッド


・アソシエーション
モデル間の関連付けを管理する機能のこと。
定義しておくことでモデルをまたいだデータの呼び出しをより簡単に行うことができる。


・n + 1問題
データを呼び出す際に大量のSQLが発行されてしまう問題。


・includesメソッド
これはn+1問題を解消することができる。
指定された関連モデルをまとめて取得することで、SQLの発行回数を減らしてくれる。
書き方
　includes(:モデル名)


・後置if
最後のendを省略してif文を処理の後方に配置する書き方。
elsif、elseに当たる条件分岐がなく、かつ処理が一行で完結する場合に用いる。


・updateメソッド
Active Recordのうちの一つ。
updateメソッドはモデルのインスタンスに対して使用することで、引数内の情報にレコードを更新することができる。



<h2>コメントを投稿するためのルーティングの記述方法</h2>
・resourcesメソッド
・ルーティングのネスト


・resourcesメソッド
Railsの基本となるコントローラの７つのアクションで記載した７つのアクション名に対してのルーティングを自動で生成するメソッド。
７つのアクションを簡単に定義するメソッド。


・ルーティングのネスト
ネストとは入れ子構造とも呼ばれ、ある記述の中に入れ子構造で別の記述をする方法である。
ルーティングでいうと、あるコントーラへのルーティングの記述の中に、別のコントローラへのルーティングを記述するということを示す。
Leetcode #482: License Key Formatting

```swift
func licenseKeyFormatting(_ S: String, _ K: Int) -> String {
    var answer = String()
    var count = 0
    var str = Array(S)
    for i in stride(from: str.count - 1, through: 0, by: -1) {
        if str[i] != "-" {
            if count < K {
                count += 1
            } else {
                count = 1
                answer += "-"
            }
            answer += str[i].uppercased()
        }
    }
    return String(answer.reversed())
}
```
構造体の中身が変化したときのReactivePropertyの動作

# 主文
構造体は値型だから値が変わらないと変化にならないよ気をつけようね

# 構造体

```cs
public struct TestStruct {
	public int amount;
	public bool flag;
}
```



# 例１

以下のコードは１秒毎に`Struct has been changed`が出力される（厳密には1/200の確率で）
構造体の値が変わるから当然


```cs

ReactiveProperty<TestStruct> teststruct = new ReactiveProperty<TestStruct>(new TestStruct());

void Start () {

		teststruct.Subscribe(_=>{
			Debug.Log("Struct has been changed.");
		});

		Observable.Interval(System.TimeSpan.FromSeconds(1f)).Subscribe(_=> {
			var s = teststruct.Value;
			s.amount = Random.Range(1,100);
			s.flag = Random.Range(0,2) == 0;
			teststruct.Value = s;
		});
}

```


# 例２


これも１秒毎に`Struct has been changed`が出力される（厳密には1/200の確率で）
構造体の値が変わるから当然

```cs

ReactiveProperty<TestStruct> teststruct = new ReactiveProperty<TestStruct>(new TestStruct());

void Start () {

		teststruct.Subscribe(_=>{
			Debug.Log("Struct has been changed.");
		});

		Observable.Interval(System.TimeSpan.FromSeconds(1f)).Subscribe(_=> {
			teststruct.Value = new TestStruct(){
				amount = Random.Range(1,100),
				flag = Random.Range(0,2) == 0
			};
		});
}

```

# 例３

この場合は**１回しか出ない**（初期値の代入時のみ）
初期値が1,falseで、毎回更新のたびに1,falseのものを入れてるから変化がないとの判断

```cs

ReactiveProperty<TestStruct> teststruct = new ReactiveProperty<TestStruct>(new TestStruct(){amount = 1, flag = false});

void Start () {

		teststruct.Subscribe(_=>{
			Debug.Log("Struct has been changed.");
		});

		Observable.Interval(System.TimeSpan.FromSeconds(1f)).Subscribe(_=> {
			var s = teststruct.Value;
			s.amount = 1;
			s.flag = false;
			teststruct.Value = s;
		});
}

```

# 例４

これも**１回しか出ない**
値が変わらないとOnNextが送られない

```cs

ReactiveProperty<TestStruct> teststruct = new ReactiveProperty<TestStruct>(new TestStruct(){amount = 1, flag = false});

void Start () {

		teststruct.Subscribe(_=>{
			Debug.Log("Struct has been changed.");
		});

		Observable.Interval(System.TimeSpan.FromSeconds(1f)).Subscribe(_=> {
			teststruct.Value = new TestStruct(){amount = 1, flag = false};
		});
}

```


# 値が変わらなくても必ず通知して欲しい

`ReactiveProperty.SetValueAndForceNotify`を使えば良い

```cs

ReactiveProperty<TestStruct> teststruct = new ReactiveProperty<TestStruct>(new TestStruct(){amount = 1, flag = false});

void Start () {

		teststruct.Subscribe(_=>{
			Debug.Log("Struct has been changed.");
		});

		Observable.Interval(System.TimeSpan.FromSeconds(1f)).Subscribe(_=> {
			teststruct.SetValueAndForceNotify(new TestStruct(){amount = 1, flag = false} );
		});
}

```
『Webを支える技術』を読んだまとめ

初心者の自分が『Webを支える技術』を読んで、なるほど！と思ったことなどを箇条書きでまとめました。


![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282504/5d89fcb2-24dc-bf41-6a1b-e9193dc1433e.jpeg)



## さまざまなWebの用途
* Webサイト
* 各種デバイスからの設定画面などのインターフェイス
* プログラムからの窓口であるAPI

## Webの歴史

### Web以前
* 最初はインターネットにWebはなかった
* 起源はARPANET
* TCP/IPとバケツリレーのUUCP

### Webの誕生
* CERNのBerners-Lee
* ブラウザMosaic

### Webの標準化
* HTTP
* URI
* HTML
* W3C設立

### RESTの誕生
* Representational State Transfer

## RESTとは

### リソース
* Web上に存在する、名前を使ったありとあらゆる情報
* リソースの名前としてのURI

### RESTの構成

６つの要素を組み合わせたアーキテクチャスタイル

* クライアント/サーバ
 - データストレージの機能のみでよくなる
* ステートレスサーバ
 - 実装を簡略化できる
 - 修正としてのCookieでのセッション管理
* キャッシュ
 - 処理時間を短縮できる
* 統一インターフェイス
 - アーキテクチャがシンプルになる
 - 独立性が向上する
* 階層化システム
 - 負荷分散
 - アクセス制限
* コードオンデマンド
 - 新しい機能を追加できる

WebはRESTという分散ネットワークシステムの理論があったからこそ成功した。


## URIとは

* Uniform Resources Identifier 
* 統一リソース識別子

### 基本構文
* URIスキーム
* ホスト名
* パス

絶対に重複しない

## URIの設計

### URIの設計指針
* プログラミング言語依存の拡張子を使わない
* 実装依存のパス名を使わない
* メソッド名を使わない
* セッションIDを含めない
* リソースを表現する名詞であること

### URIとしての意識
* リソースの名前である
* 寿命が長い
* ブラウザがアドレス欄に表示する

## HTTPの基本

HTTPとはTCP/IPをベースにしたプロトコルである。

### TCP/IPとは
* 階層型プロトコル
 - ネットワークインターフェイス層
 - インターネット層
 - トランスポート層
 - アプリケーション層

### HTTPはステートレス
* ステートフル代表はFTP
 - スケールアウトさせにくい

### HTTPメソッド
* CRUDと対応

### ステータスコード
* 1xx: 処理中
* 2xx: 成功
* 3xx: リダイレクト
* 4xx: クライアントエラー
* 5xx: サーバエラー


後半に関しては今と状況が違う部分もあったのでまとめませんでした。
Webの歴史や技術の標準化の流れが生々しく、今のRESTが確立するまでにもたくさんの葛藤があったのが印象的です。
たしかに自分がインターネットを初めて体験した90年代中頃ではネットスケープが強かったり、ブラウザ間の表示が大きく違っていたりでホームページ（当時）を作るのに苦労したなと懐かしい気持ちになりました。
技術の進歩と、きちんとしたRESTやURIやHTTPの定義を改めて学べる書籍でした。
Eclipseでフォーマット機能を指定箇所だけオフ

Eclipse IDE for Enterprise Java Developers 2019-06 (4.12.0)で確認。

Window -> Preferences -> Java -> Code Style -> Formatter -> Edit -> Off/On Tagsを開いてEnable Off/On tagsにチェックを入れる。
![eclipse-off-format.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31934/050022e4-955b-defc-325a-9168ad9a175b.jpeg)

ソースコードで、フォーマットのOFF開始が```//@formatter:off```、ONで再開させるのに```//@formatter:on```を使用する。以下のような感じ。

```java
//@formatter:off
list
  .stream()
  .filter(s -> s.endsWith(".txt"))
  .map(s -> NumberUtils.toInt(s))
  .collect(Collectors.toList());
//@formatter:on
```
rails スラッシュを複数挟んでもnot foundにならない

同僚から

> Rails のルーティングは連続するスラッシュは単一扱いされるらしい。
>   localhost:3000/utilities///////hoge/39
> の様にスラッシュを複数挟んでもnot foundにならないのはなんでなん？

という質問を受けたので、備忘録として書いておきます。

僕が調べた感じ、railsの名前解決の流れは
https://qiita.com/kkyouhei/items/1203f5aa521c065a7097
らしい。

そこで通る
`Journey::Router::Utils.normalize_path(path)`
にて

```ruby
 def self.normalize_path(path) 
     path = "/#{path}"
     path.squeeze!('/')
     path.sub!(%r{/+\Z}, '')
     path = '/' if path == ''
     path
 end
```

https://github.com/rails/journey/blob/master/lib/journey/router/utils.rb#L14

引数に含まれる文字が複数並んでいたら 1 文字にまとめる

`.squeeze!('/')`をしているから

https://docs.ruby-lang.org/ja/latest/method/String/i/squeeze.html

履歴にも残してはいけないものを書いていたので上げ直しです。
ごめんなさい
【2019年最新】テキストエディタ「Brackets」の初期設定方法とおすすめの拡張機能

「Brackets」の初期セットアップについてメモ。
<img width="1234" alt="thumbnail_brackets.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89106/0a4a50c5-9437-f5b2-52cb-32386f2055e4.png">

#「Brackets」とは
・Adobe Systems株式会社が2014年より提供しているテキストエディタ
・最初から日本語のため初心者にオススメ

#ダウンロード

ダウンロードサイト：http://brackets.io/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89106/fc4fa665-efe1-76ba-6043-7ac34cb79314.png)

#テーマの変更
以前は「Sublime Text」というテキストエディタを愛用していたのですが、その標準テーマ「Monokai」と類似している「Monokai+」をインストールしました。

###**▼ デフォルトのテーマ「Brackets Light（Default）」**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89106/bf8bf63f-0c93-5a19-c9b4-2f5946913ced.png)


###**▼ Sublime Text風のテーマ「Monokai+」**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89106/4e88fc81-f3ec-5eaa-62ae-1c51e3b89809.png)

###**▼ 変更方法**
① 画面左下の「拡張機能マネージャー」をクリック
② 左から2番目のタブ「テーマ」をクリック
③「Monokai+」を検索
④「インストール」をクリック
![monokai.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89106/39c3182d-cbbb-dd61-9c1d-0b7898a4a2da.gif)

##拡張機能のインストール

###**「Add HTML template」**
HTMLの雛形をワンクリックで表示。
![AddHtmlTemplate.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89106/e2582b10-3c96-8ccc-5bdf-c0c3a8fcb3fa.gif)

###**「Beautify」**
ソースコードを「Ctrl＋Shift＋L」で自動整形。
![Beautify.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89106/8a9fbe0a-b08d-5544-f946-4c23b02de1bd.gif)

###**「Emmet」**
HTMLやCSSを省略記法で簡単に記述。
例：「！＋Tab」でHTML雛形を記述
例：「header>nav.g_navi>ul>li*5>a」でheader＋nav＋liリストを記述
![emmet.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89106/7f8526b0-9f81-d3f3-56c4-0ee472c30ffa.gif)

###**「Color Highlighter」**
CSSのcolor系プロパティ値を色指定した時に、コード上で色をハイライト表示。
![colorhighlighter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89106/76cacfe7-5026-a6bb-69ec-e44be0451307.gif)

###**「Brackets CSS Class Code hint」**
id・classセレクタの入力候補を表示。

###**「colorHints」**
一度使用したことのある色をサジェスト。

###**「Custom Work」**
タブを表示。

###**「Indent Guides」**
インデントの位置にガイドを表示。

###**「More HTML5 Code Hints」**
HTMLの要素名や属性名のヒント表示。

###**「Autoprefixer」**
css保存時に、ベンダープレフィックス（-webkit）を自動付与。
おにぎり１００円セールを一瞬で確認できるonigiriコマンドを作りました🍙


## おにぎり１００円セール🍙を一瞬で確認できるツールを作りました。
おにぎり１００円セールって魅力的じゃないですか？セブンイレブンでおにぎり100円セールがやっていたら基本的に鮭いくらおにぎりを買うのですが時々初日に間に合わなくて悲しい思いをする事があるのでそんなことをなくす目的で🍙おにぎり100円セールをCLIから確認できる物作りました。


## 構成
`onigiri-api`と`onigiri-cli`の2つの構成で動いています。

- #### onigiri-api
  Cloud Function
  - クローラー Cloud Schedulerを使用してCloud Functions動かし定期的におにぎり100円セールの更新情報をFirestoreに追加します。
  - API 実行されると、Firestoreから値を取得してJSONでレスポンスを返します。

- #### onigiri-cli
  Node.jsで、上記のおにぎりAPIから取得したJSONをパースして表示します。



## おにぎりCLI

インストールするには`npm`を入れておく必要があります。

```bash
yarn global add onigiri-cli
```

パスが通っていれば、`onigiri`コマンドで起動します。

```bash
onigiri
```

## 実行結果
![onigiri.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257048/e40770f7-e656-6aa8-760f-339090328677.gif)
あまり実行されていないと3秒くらいレスポンスにくらいかかりますね




## おわり

- XPathがあまりわからないので基本的に簡単にかけるようにと、ライブラリを使うのですが、今まではGitHubでスターが多かったので[Cheerio - ★](https://github.com/cheeriojs/cheerio)というライブラリを使用していたのですが、Cheerioより[jsdom - ★12000↑](https://github.com/jsdom/jsdom)の方が圧倒的に書きやすかった。(※jsdomはかなり遅いらしい）

- おにぎり100円セールが行われていなかったのでおにぎり100円セールを行っているときのHTMLを`web.archive.org`から2つ以上ダウンロードしてきて、パースをする、プログラムを書くことができたがおにぎり100円セールがやっているときに作ったほうがもう少し楽しかったかもしれない。

- おにぎり100円セールはあまり起こらないので誰でもおにぎり100円セールを開催できるようにしたい。
- ミニストップは毎日１００円セールをやっている

## ps
今日ファミリーマートがおむすびセールの告知をしたようで動いていた。。。
<img width="807" alt="Image 149.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257048/77301bcb-0dab-d28a-03fc-b66f155556e7.jpeg">
クラス継承の名前変更、削除（aliasとundef )

# aliasについて
クラスの継承において、既に存在するメソッドに別の名前を割り当てたいときにaliasを使う。書き方としては、引数にメソッド名かシンボル名を指定する。

~~~
alias 別名　元の名前
または
alias :別名　：元の名前
~~~

実際のコードで確認すると、

~~~ruby
class Class1
    def hello
        "hello"
    end
end

class Class2 < Class1
    alias old_hello hello

    def hello
        "#{old_hello}, again"
    end
end

obj = Class2.new
p obj.old_hello                 #=> "hello"
p obj.hello                     #=> "hello, again"
~~~

# undefについて
定義されたメソッドをなかったことにしたいときに、undefを使う。書き方として、aliasと同様に引数にメソッド名かシンボル名を指定する。

~~~
undef メソッド
または
undef :メソッド
~~~

~~~ruby
class Class1
    def hello
        "hello"
    end
end

class Class2 < Class1
    undef hello
end

obj1 = Class1.new
obj2 = Class2.new
p obj1.hello       #=>"hello"       
p obj2.hello       #=>エラー(undefined method `hello')              
~~~

同じクラス内に用いても、

~~~ruby
class Class1
    undef hello
    def hello
        "hello"
    end
end

obj1 = Class1.new
p obj1.hello        #=> エラー（undefined method `hello' for class `Class1'）  
~~~
PythonでError Handlingをどのような場合でコード上に書くべきか

# What is this?
備忘録的なあれです。
Golangを書いている後、Pythonを書き始めるとエラーをどうあつかったらいいかわからなくなりました。

Golangは基本的に、なにかメソッドを書く際には、必ずといっていい程、エラーも同時に返り値として設定します。そのおかげで、「このエラーはraiseさせよう」とか、「ここはpanicでええやろ」とか、「ここは例外的に処理させねばとか」、逐一考える機会が与えらえて良いなあという印象を受けました。

一方で、Pythonはコード上にて明示的吐き出されません。プログラムを実行した際に、ようやく「ああ、ここはこういうエラーが吐き出されのね、ふーん」みたいなことが多々ありました。

Golangから改めてPythonを触った自分は、エラー出た場合に、`try except` で例外処理として、エラーを吐き出すべきなのか、そのままエラーをシステムに吐かせればいいのか、わからなくなりました。

そこで、今回では、どのような場合にエラーを`try except`でログを吐き出すべきなのか、備忘録的に記載していきます。

# エラーを例外処理する場合
結論からいうと、
「エラーログに付加要素を付け加えたい場合に例外処理をするべき」
です。

どういうこっちゃかというと、例えばデータベースに接続して検索するケースを挙げます。
下記のような、Mysqlに接続するとします。

```python
import mysql.connector

class DataBaseRepository:
	def  __init__(self):
		self.conn = mysql.connector.connect(
            database=MYSQL_DATABASE,
            host=MYSQL_HOST,
            user=MYSQL_USER,
            password=MYSQL_PASS,
            charset='utf8mb4',
            autocommit=True,
            connection_timeout=60,
        )

    def get_users(self, user_id: int, group_id: int) -> [str]:
    	"""
    	get username
    	:return list of username
    	"""
    	cursor = self.conn.cursor
    	sql = 
    	f"""
    	SELECT name
    	FROM users
    	WHERE user_id = {user_id}
    	  AND group_id = {group_id}
    	"""
    	cursor.execute(sql)
    	return cursor.fetchall()

    def close(self):
        self.conn.close()

    def __del__(self):
        self.close()
```

DataBaseに接続して、`get_users`　で `user_id` と `group_id` が一致するuserの `name` を取得します。(そのほかのメソッドは、説明は省きます)

このコードを用いた下記のような2種類実行のコードがあるとします。

- 例外処理を書く場合

```python
from logging import getLogger

if __name__ == '__main__':
	logger = getLogger(__name__)

	repo = DataBaseRepository()
	user_id = 100
	group_id = 1
	try:
		user_names = repo.get_users(group_id, gender_id)
	except:
		"""
		ここにどうような処理を書くべき？
		"""

	if len(user_names) == 0 {
		logger.warn('user_name size is zero!')
	}
```


- 例外処理を書かない場合

```python
from logging import getLogger

if __name__ == '__main__':
	repo = DataBaseRepository()
	user_id = 100
	group_id = 1
	user_names = repo.get_users(group_id, gender_id)
	if len(user_names) == 0 {
		logger.warn('user_name size is zero!')
	}
```

どっちがいいと思いますか？
どっちでも、エラーがでるときは十分ありうるコードなのです。DataBaseのカラムが存在しないかもしれないし、Connectionが確立されてないかもしれないし、そもそもレコードがないこともありえますね。

その場合、より多くの情報があった方が不足の事態に対処しやすいです。
この情報が `付加要素`　となるわけです。 

例えば、今回の場合だと、`group_id`　と `gender_id`があった方が、断然エラー対応しやすいです。
なので、エラーがでる部分を例外処理でくくって、付加要素を加えます。

- 例外処理を書く場合

```python
from logging import getLogger

if __name__ == '__main__':
	logger = getLogger(__name__)

	repo = DataBaseRepository()
	user_id = 100
	group_id = 1
	try:
		user_names = repo.get_users(group_id, gender_id)
	except Exception as e:
		"""
		ここにどうような処理を書くべき？
		"""
		logger.error(f'Failed to get user_name of group_id:{group_id} and gender_id:{gender_id}')
		raise(e)

	if len(user_names) == 0 {
		logger.warn('user_name size is zero!')
	}
```


これで、エラー対応が楽になるはず。。。

# まとめ
要約すると
「エラー対応がしやすいように、付加要素的なエラーログを意識しましょう」
以上。

何か、ご意見やご指摘あれば、何卒コメント欄にご記入いただけますと幸いです。
RailsでNotNull制約を後からカラムに追加する方法2種類

初投稿です！
Migrationファイル生成してNotNull制約を既存のカラムに追加する際、少し手間取ったのでメモ。

## change_column_nullメソッドを使った場合

```ruby
class ChangeColumnsAddNotnullOnTasks < ActiveRecord::Migration[5.2]
  def change
    change_column_null :tasks, :title, false
    change_column_null :tasks, :created_at, false
    change_column_null :tasks, :updated_at, false
  end
end
```

NotNull制約を付与する：**false**（change_column_nullメソッド）

```ruby
change_column_null :テーブル名, :カラム名, false
```

NotNull制約を解除する：**true**（change_column_nullメソッド）

```ruby
change_column_null :テーブル名, :カラム名, true
```

## change_columnメソッドを使った場合の書き方

```ruby
class ChangeColumnsAddNotnullOnTasks < ActiveRecord::Migration[5.2]
  def change
    change_column :tasks, :title, :string, null: false
    change_column :tasks, :created_at, :datetime, null: false
    change_column :tasks, :updated_at, :datetime, null: false
  end
end
```


NotNull制約を付与する：**false**（change_columnメソッド）

```ruby
change_column :テーブル名, :カラム名, :データ型, null: false
```

NotNull制約を解除する：**true**（change_columnメソッド）

```ruby
change_column :テーブル名, :カラム名, :データ型, null: true
```

Default値（初期値）を設定したい時は、default: をつける

```ruby
class AddNotnullToDeadlineOnTasks < ActiveRecord::Migration[5.2]
  def change
    change_column :tasks, :deadline, :datetime, default: "", null: false
  end
end
```

マイグレーション実行時にエラーが起きてあたふたしたのですが、
change_column_nullの場合の書き方と、change_columnの書き方がまぜこぜになってしまったのが原因でした！
Eclipseのマニアックな保存アクション

# Eclipseのマニアックな保存アクション
Eclipseの保存アクションで、importの編成とか、ソースの整形辺りは使う人も多いかと思います。
が、Eclipseの保存アクションには他にも追加アクションが用意されています。
中々面白いものもあるので、紹介していきたいと思います。

## どこから設定するか
設定＞Java＞エディタ＞保管アクション＞追加アクション＞構成
から設定できます。

## forループを拡張forループに変更する

こんな感じです。

```java
		String[] a = { "hoge", "fuga", "piyo" };
		for (int i = 0; i < a.length; i++) {
			String s = a[i];
			System.out.println(s);
		}
///変換後
		for (String s : a) {
			System.out.println(s);
		}

```
i をループ内で利用している場合や、i=0から始まらない場合などは変換しない中々頭の良いやつです。
が、絶妙に残念なことにListなどについては変更してくれません。

確かに拡張forループに渡せるものはIterableの継承クラスなので、
厳密には配列のような単純変換をして100％挙動を保証は出来ません。

ただ、今更配列を使ってforループを回す機会なんてほとんどないので、多分設定してもほとんど役に立つことはないでしょう。悲しい。

## 関数型インターフェースインスタンスに変換
javaのラムダ式は匿名クラスと相互変換できますが、
これをsaveAction時にどちらかに統一する設定です。

使うとしたらラムダ式に変換の方でしょうか。
ただ、「匿名クラスを使用」の方を選択した上で、StreamAPIをガリガリ使っているコードで
SaveActionを起こすとコードが一気に増殖して見た目的に楽しいです。
PredicateとかConsumerとかBiFunctionとか普段意識せずに書いている無名クラスがたくさん見られます。
実用性があるのかと言われると皆無ですが。

## 不要なコード＞冗長な型変数を除去
変数をnewした場合などの型宣言で、自動的にダイヤモンド演算子を使ってくれます。
ここまで実用性に乏しい機能ばかり紹介してきましたが、
これはそれなりに使えるかと思います。
Eclipseのコードアシストは

```java
List<String> l = new ArrLi//ここでコードアシストを使うと
List<String> l = new ArrayList<String>();//こうなる

```
こんな感じにダイヤモンド演算子を使ってくれませんが、これをONにしておくとSaveActionで消してくれます。
(どうせなら最初からやれと言いたいところですが)
tracebackを文字列で取得する時はTracebackExceptionを使おう

# TL;DR
```py
''.join(traceback.TracebackException.from_exception(exc).format())
```

# 従来の方法
tracebackを文字列で取得する方法として [traceback.format_exception()](https://docs.python.org/ja/3/library/traceback.html#traceback.print_exception) がよく紹介されています。

```py
import traceback

try:
    1/0
except Exception as e:
    t = traceback.format_exception(type(e), e, e.__traceback__)
    print(t)

# ['Traceback (most recent call last):\n',
#  '  File "/path/to/script.py", line 4, in <module>\n    1/0\n',
#  'ZeroDivisionError: division by zero\n']
```

この書き方は冗長です。エラーひとつに対して `etype`, `value`, `tb` の３つの引数を与えなくてはなりません。
(引数 `e_type` は Python3.5 からは無視される仕様となったため、 `None` で代用できます)

# より単純な書き方
Python3.5 から [TracebackException](https://docs.python.org/ja/3/library/traceback.html#tracebackexception-objects) が導入され、より単純に同じことを実現できるようになりました。

```py
import traceback

try:
    1/0
except Exception as e:
    t = list(traceback.TracebackException.from_exception(e).format())
    print(t)

# ['Traceback (most recent call last):\n',
#  '  File "/path/to/script.py", line 4, in <module>\n    1/0\n',
#  'ZeroDivisionError: division by zero\n']
```

`TracebackException.format()` は文字列のジェネレータを返す点に注意してください。


# 謝辞
`TracebackException` について教えてくださった python.jp の [atsuoishimoto](https://twitter.com/atsuoishimoto) さんに感謝申し上げます。
 の
reactのコードの整形を自分でしてるの？！ 面倒なコード整形を自動化したいあなたのためのprettier入門

## 動機
割愛

## prettierとは？
割愛

## 早速使ってみよう！！
###prettierのinstall

```
yarn add prettier
  or
npm install prettier
```

これでprettierのコマンドが使えるようになります！！
（もしかしたら、パスを通す必要があるかも。下記のprettierのコマンドでエラーが出たら、この記事にコメント！！）

### prettierの実行

```
prettier [opts] [filename ...]
```
とすると、ファイルを整形してくれたり、整形できてないところのチェックをしてくれます！

```git:exaple
prettier --wire App.js
→App.jsファイルを自動整形してくれます！
prettier --check App.js
→App.jsファイルでおかしなコードがあるところを教えてくれます！
```

<details><summary>prettier --wire App.jsの例文
\<SimpleSlider>の箇所が変わっています！！
インデントが７個くらいあるとこを２個に変更してくれました！！（めちゃ嬉しい）</summary><div>

```js:App.js
import React from "react";
import Test from "./components/Test";
import SimpleSlider from "./components/SimpleSlider";
import "./App.css";

function App() {
  return (
    // この配下にrootコンポーネントを書いていく
            <SimpleSlider />
  );
}

export default App;

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

import React from "react";
import Test from "./components/Test";
import SimpleSlider from "./components/SimpleSlider";
import "./App.css";

function App() {
  return (
    // この配下にrootコンポーネントを書いていく
    <SimpleSlider />
  );
}

export default App;
```
</div></details>

### けどさ、毎回prettierコマンド打つのだるくない？yarnでやってるんやけ、yarnコマンド使いたくない？？
はい。yarn devやyarn start等のコマンドを皆さんも打ってますよね？
そっちの方がスタイリッシュで格好よくないですか？
yarnコマンドの設定に関しては、package.jsonのscriptsの箇所の役割です！
このセクションでは、package.jsonを少し見てみましょう！！


### "yarn run fmt"でprettierの自動整形を行う
まずは、Qiitaの記事を参考にして、上記のコマンドでprettierを使えるようにしましょう！！
何事も小さいところから少しずつ試すことが大事です。

```json:ブリボンのreact練習ディレクトリ
"scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "fmt": "prettier --write \"src/App.js\""  →→→ ここのところがprettierのコマンドのところ！！
  },
```

scriptsの"fmt"の箇所を上記のようにします！
すると、App.jsファイルのみ、prettierで自動成形されます！！


### ブリボンあほか？App.jsファイルだけ整形しても意味ないやん
はい。すみません。
全ファイルを自動整形しないと意味ないですよね。。
下記のようにscriptsの箇所を変更ください。

```
"scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "fmt": "prettier --write \"src/**/*.js\""
  },
```

### さらなる高みへ！VSCodeでsave時にprettierを走らせる！
やることは二つです。
一つ目はプラグインでPrettier Pluginのインストール
二つ目はVSCodeのsettings.jsonで下記のコマンドを追加

```
 "editor.formatOnSave": true
```


## あとがき
ブリボンは、タスクで初めて使うパッケージを導入する時、自分のローカル環境を使います。
practice-reactというプロジェクトを立ち上げて、そこにパッケージをインストールして遊んでいます。
今回のprettierも例外ではなく、自分のローカルを爆速で開発できるようにすること、prettierのお勉強をすること、以上2点の目的により、ローカル環境をいじってみました！！

随時変更・追加していきます！！
（6/9日曜に作成）
（6/9日曜に修正）

## 参考文献
[公式ドキュメント](https://prettier.io/docs/en/cli.html) 
[Qiita記事１（prettierをyarn run コマンドでできる箇所の参考）](https://qiita.com/shinshin86/items/c8b1f6b22b1bef3074c7)
Ubuntu初心者必見！よく使うコマンドをマスターしよう！ーーかい氏のページを参照

##Ubuntu初心者必見！よく使うコマンドをマスターしよう！  
[かい氏のページを参照](https://www.sejuku.net/blog/84286#i)

CUI初心者のため、そこから勉強中。
Ubuntuの階層が無知だったため、「端末」の操作からの勉強になってしまいました。

　一応、Webクリエイターエキスパートの資格は持っておりますが、それ以降JavaScript、jQuery、PHPでかなり苦しんでおります。「いちばんやさしい◯◯の教本」シリーズで基礎学習をしております。
　その後今は「いちばんやさしいPythonの教本」でPythonを学習中。

Webクリエイターとして働けるところまで、書き込みをしようと思っております。

宜しくお願い致します。
コードのチェックはESLintに任せよう！ ブリボンの初めてのESLint

## 作成趣旨
前回、prettierでコードの自動整形を試してみたブリボン。
prettierのQiita記事は[こちら](https://qiita.com/ryubb_SU/items/58e441c68a3ae9588320)
ESLintと組み合わせれば、もっと自動にコードの整形をしてくれるぞ！という情報を得まして、早速練習用リポジトリでESLintを導入してみました。

## ESLintとは？
・JavaScriptの構文チェッカー
・細かな設定をすることができる

要は、変なコードを書いていないか（ **;** 忘れや  **import** ミスなど）を教えてくれる便利なやつです。
prettierと組み合わせると、変なコードを自動認識した上で、コードの整形までやってくれます。

## 早速使ってみよう！！

```
yarn add ESLint
```

eslint --initをターミナルで呼び出すことで、対話的にeslintの設定ファイルを作ってくれるらしいです。
今回は、Qiitaの記事を元にファイルを生成しました。

```.eslintrc.json
{
  "extends": ["eslint:recommended"],
  "plugins": [],
  "parserOptions": {},
  "env": { "browser": true},
  "globals": {},
  "rules": {}
}
```
まずは、こんな感じで簡単に作ってみましょう！！
[参考: ESLint 最初の一歩](https://qiita.com/mysticatea/items/f523dab04a25f617c87d)

## eslint コマンドを使おう！
```
eslint src/App.js
```
上記のコマンドで、src配下のApp.jsファイルの構文チェックができる。

## yarn lintでESLintを使う
```package.json
"lint": "eslint src/**/*.js"
```
上記でsrc配下の全ファイルが、ESLintによりふるいにかけられます。


## 以下余談です

### やったこと
```
yarn add eslint-plugin-prettier
yarn add eslint-plugin-react
```

### 解決したエラー
####Parsing error: Unexpected token <
 **解決方法**

```
yarn add babel-eslint
```
```.eslintrc.json
{
    "parser": "babel-eslint",
}
```

#### yarn startできない

```
    "babel-eslint": "10.0.1",
    "eslint": "^5.16.0",
```
上記のバージョンを使用する

#### 関数コンポーネントで **React** を使っていなくても、宣言しないと使えないのに、明示的に使っていないという理由で、エラーを吐きだす。

```
yarn add eslint-plugin-react
```
```.eslintrc.json
"extends": ["eslint:recommended", "plugin:react/recommended"],
```


[参考](https://qiita.com/kurkuru/items/d4eebd34f0898c6a2d5a)

## 参考文献
[ESLint 最初の一歩](https://qiita.com/mysticatea/items/f523dab04a25f617c87d)
[ESlint rules](https://eslint.org/docs/rules/)
[ESLintで構文チェック(Webpack)](https://qiita.com/oreo3@github/items/8977dce409db6f64e6cf)
[JSプログラマーのイラッとする「クセ」はESLintを導入して対処しよう](https://www.webprofessional.jp/up-and-running-with-eslint-the-pluggable-javascript-linter/)
[Uipath]メール送信アクティビティの簡易比較

### remark
[自身のblog](https://rpa.adgj.pw/items/uipath-%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%81%E4%BF%A1%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%93%E3%83%86%E3%82%A3%E3%81%AE%E7%B0%A1%E6%98%93%E6%AF%94%E8%BC%83)にも同じ内容をポストしています。

## メール送信のアクティビティ、たくさんある

そう、たくさんある。2019.4.3で確認してみると、

- Send Exchange Mail Message
- Send Lotus Notes Mail Message
- Send Outlook Mail Message
- Send SMTP Mail Message

と、4種類。Lotus Notesとかあるのね……。

というわけで、それぞれのアクティビティの使い分けと、設定項目の比較をしたいと思う。
ただしLotus Notesはちょっと触ったことないのでパス。分かる人は教えてください。

## LET'S 比較

### Send Outlook Mail Message

ロボットとして動作する端末（以下、ロボット）にMicrosoft Outlookがインストールされていて、かつアカウントの設定がされている場合に利用できる。

#### メリット

- アカウントが複数ある場合も考慮されていて、送信時に利用するアカウントを文字列で指定できる
  - 何を指定すればいいのかはちょっとわからない
- **接続周りの設定をする必要がない**ことと、接続周りの設定を「**ロボットで管理しなくて済む**」ので、基本的にはこれがオススメ

#### デメリット

- 次のような場合には使えない（というか**自動化されない**のでオススメできない）
  - **自動で送信する設定がされていない**場合
    - 「接続したら直ちに送信する」「一定時間ごとに送信する」が入ってないと、送信トレイに入ったまま送られない
  - 接続時に**認証を求められる**場合
    - 実例として、Office365へのアクセス時にSSO認証を実施しなければならないケースでは、この認証をクリアしないとアクティビティ動作が完了しない（待機中となり、例外も発生しない）

### Send SMTP Mail Message

Outlookがなくても送信できる超汎用型。直接、SMTPサーバー（メールを送信するサーバー）とやり取りするタイプ。

#### メリット

- Outlookがいらないので、そのあたりのライセンスや管理がいらない
- 前述の「自動化されない」事象が発生しない

#### デメリット

- 接続周りの設定を持たせなくてはならない（サーバー情報、認証情報（ユーザー名、パスワード））
  - セキュリティリスクと捉えられる場合は利用できない可能性が高い
- 送信済みのメールが**メーラーには残らない**（可能性がある）
  - メールの送信サーバーはあくまで送るのが仕事なので、送ったメールをコピー取ったりしないことがほとんど
  - もしかしたらWebメールの場合には、送ったメールをキャッチする仕組みがあるかもしれない

### Send Exchange Mail Message

Outlookがなくても送信できる汎用型その2。こちらはSMTPサーバーではなく、Exchangeサーバーとやり取りする。
「Exchangeサーバーって何？」ってひとは、せっかくなので調べてみよう。
最近ユーザーが増えているOffice365はクラウド上でExchangeが動いているので、このアクティビティでも対応することができる。

#### メリット

- Outlookがいらないので、そのあたりのライセンスや管理がいらない
  - ただExchangeのアカウントがいる分、何かしらライセンス持ってると思うのでそんなに意味ないかも
- Outlookの場合の「自動化されない」事象が発生しない
- SMTPの場合の「メーラーに残らない」事象が発生しない
  - Exchangeは、送ったメールも管理するようになっている

#### デメリット

- 接続周りの設定を持たせなくてはならない
  - どの情報を使うかによって、セキュリティリスクの大小が変わってくるのもポイント
    - Exchangeの場合は一般的に、同じIDで他のサービスなどにもアクセスできる仕組みとなっているので、悪用された場合のリスクが若干高い気がする
    - この辺はID管理のポリシー次第なので、当てはまらない場合もある
- 送信者を他の名前に（偽装）することができない
  - これはExchangeの仕様で、Exchangeからメールを発信するときはIDに紐付いている名称で送信される
  - 個人のIDでロボットを作ってしまうと、（セキュリティリスクもそうだけど）個人から送ってるように見える



## まとめ

| 項目           | Outlook | SMTP | Exchange |
| -------------- | :-----: | :--: | :------: |
| 設定項目の数   |    ○    |  △   |    △     |
| 設定の簡単さ   |    ○    |  △   |    △     |
| セキュリティ   |    ◎    |  ×   |    ×     |
| 自動化しやすさ |    △    |  ◎   |    ◎     |
| メール管理     |    ◎    |  △   |    ◎     |

メリット・デメリットをしっかりと理解した上で、使い分けしていこう。