OmniAICreator/Qiita-1.07M huggingface dataset:
メモ：ActiveStorageで格納した画像をCloudfront配信する

この記事は
===

* Rails5.2からActiveStorageという添付ファイル系のライブラリが入っています
* これがオフィシャルな割にCDN対応しておらず結構微妙です
* 性能的にCloudfrontで配信したかったので、若干試行錯誤したのでメモです

ActiveStorageの流れ
===

AWSと連携する場合、だいたい下記のような流れで利用されます。

ファイルアップロード
---

* ブラウザからアップロードファイルを受け付け
* AWSのAPI経由でS3にファイルを配置
* と同時に、そのファイルのパスだとかファイルタイプ、サイズだとかのメタ情報をRails内のテーブルに保持

ファイルダウンロード
---

* 格納しておいたメタ情報から、表示したいファイルのリンクを作成
    * このリンクはパーマネントなもの
    * Railsサーバを指している
* ブラウザからRailsへ画像表示のリクエストを投げる
* RailsはAWSのAPI経由で5分間限定のS3へアクセス可能なURLを払い出し、そこへのリダイレクトをブラウザへ返却

ActiveStorageの問題点
===

* 上の流れでまずいのは、ActiveStorageでアップロードしたファイルを参照するには都度Railsを経由する必要があるという点です
* つまり100枚の画像を表示する場合、瞬間的に100回Railsへアクセスが行くという事になります（あかん！）
* 5分ごとにリンクをexpiredさせたいような、非常にセンシティブな情報（電子書籍とかね）をアップロードするサービスであれば、この方が都合がいいのかもしれませんが、そうでもないシステムにはきつい仕様です

公式な対応
===

* [GithubのIssueでRails5.2のリリース前からもう2年近く議論されている](https://github.com/rails/rails/issues/31419) ようなのですが、今の所公式な対応はありません
    * [このへんのPR](https://github.com/rails/rails/pull/36729)を見るとだいぶ進んできているようなムードはありますが
* なので、自力で適当に逃げるしかないのが現状です

対応方針
===

で、対応内容ですがベタです

* (A)CloudfrontでS3バケットを参照できるようにします
  * Cloudfrontのサブドメインが払い出されます
* (B)Rails上でS3上のファイル名を割り出します
  * ```User.has_one_attached :photo```だとすると、```user.photo.blob.key```の値がファイル名です
  * ちなみにS3ではこのファイル名で、バケット直下にずらーーーーーっと並んでます（男らしい）
* そして(A)+(B)のURLに参照すればアクセス可能です
  * cloudfrontのサブドメインが```xxx```で、ファイル名が```XXXXXXX```であれば、 ```https://xxx.cloudfront.net/XXXXXXX```

対応詳細
===

事前準備
---

  * 事前にActiveStorageはaws連携で使えるようにしておいてください
  * また、アップロード先のS3バケットをCloudfrontで公開状態にして、URLでアクセスできるようにしておいてください（詳細は割愛）

普通の画像表示
---

* 通常こんな感じでActiveStorage経由のURLを埋め込むと思います
* これの代替となるヘルパを作ります

```erb:erb

<img src="<%= rails_blob_path user.photo %>" />
```

ヘルパの準備
---

* ActiveStorageの設定ファイルはこんな感じとします

```yaml:storage.yml
local:
  service: Disk
  root: <%= Rails.root.join("storage") %>

amazon:
  service: S3
  access_key_id: <%= ENV['S3_ACCESS_KEY'] %>
  secret_access_key: <%= ENV['S3_SECRET_KEY'] %>
  region: ap-northeast-1
  bucket: <%= ENV['S3_BUCKET'] %>
```

* こんな感じのヘルパを追加します
* 上記storage.ymlのキーで分岐して、開発環境には影響が出ないようにしています

```ruby:xxx_helper.rb
  def cdn_ready_blob_path(attachment)
    service = Rails.application.config.active_storage.service
    if service == :local
      # 元々のヘルパ
      rails_blob_path(attachment)
    elsif service == :amazon
      # S3上でのファイル名を取得してURLを組み立てる
      key = attachment&.blob&.key
      "#{Settings.cloudfront.url}/#{key}"
    end
  end
```

* SettingsだとかでCloudfrontで発行されたドメインを環境別に定義しておきます
* ステージングとか環境でCloudfrontのdistributeを分けることができます

```yaml:settings/production.yml
cloudfront:
  url: 'https://xxx.cloudfront.net'
```

CDN対応した画像表示
---

* このヘルパを使ってさっきのビューを書き直します

```erb:erb

<img src="<%= cdn_ready_blob_path user.photo %>" />
```

これで
---

* Cloudfrontから直接ファイルが配信できるようになりました！

終わりに
===

* 今後も公式のライブラリとしてやってくのならオフィシャルにCDN対応してほしいですねー！
* ちなみにこの辺しっかりしてたライブラリの[paperclip](https://github.com/thoughtbot/paperclip)はActiveStorageに譲ってdeprecatedという・・・
Visual Studio CodeでSalesforceの開発環境を構築する

Visual Studio CodeでSalesforceの開発環境を構築する
■JDKインストール（※JAVA HOME設定）
■VS Codeインストール
■Node.jsインストール
■Salesforce CLIインストール
■Salesforce Extension Packインストール


Visual Studio CodeでSalesforceの開発環境を構築する(winter '19)
https://base.terrasky.co.jp/articles/5f2tk

https://qiita.com/GRGSIBERIA/items/b8cd4a2b3635d1bb0391

https://qiita.com/enopii/items/96b3d69c364964dc51ce

npm入門
https://qiita.com/maitake9116/items/7825d90c09f3e2f87dea

Install Salesforce Extensions for VS Code
https://forcedotcom.github.io/salesforcedx-vscode/articles/getting-started/install

SFDC：Salesforce Extensions for Visual Studio Codeを試してみました
https://tyoshikawa1106.hatenablog.com/entry/2019/07/23/204220
Anacondaにある仮想環境を別の端末でも使えるようにする

# 概要

Pythonでの開発をするために仮想環境を作っている人は多いと思います。

仮想環境を作るためのツールとして、Anacondaが有名です。

この記事ではAnacondaの環境を別の端末に複写する方法を記述します。

移送元と移送先では、Dropboxなどでファイル共有できていると便利です。

個人的な備忘録としての意味合いもあるので、あまり細かい点には触れていません。。。

# 移送元端末での操作

移送元ではまず環境の設定内容をExportします。

以下の手順で実施します。

## 1. 環境のある場所に移動
Anacondaを立ち上げて、移送したい環境からターミナルを開きます。

多分デフォルトのままでOKですが、別の場所が開かれている場合は `cd`などで移動します。

## 2. 環境をymlファイルに出力

次のコマンドを入れます。

```
conda env export > ファイル名.yml
```
すると今開いている場所にymlファイルができます。

## 3. requirements.txtを作っておく

コマンドで次のように打ちます。
```
pip freeze > requirements.txt
```
これで出来上がりです。

このrequirements.txtや先ほど作ったymlは、Dropboxなどで移送元、移送先で共有するようにしましょう。便利です。

移送元ではこれだけです。


# 移送先端末での操作

当然ながら、Anacondaがインストール済みであることが前提です。

## 1. ymlファイルをインポート

とりあえずもともとあるbase(root)のところからターミナルを開きます。

インポートするymlファイルのある場所に移動します。

そして次のコマンドを打ちます。

```
$ conda env create -n 新たな環境名 -f ファイル名.yml
```

たいてい次のようなエラーになります。

```
ResolvePackageNotFound: 
  - openssl==1.1.1c=he774522_1
  - sqlite==3.28.0=he774522_0
  - vc==14.1=h0510ff6_4
  - vs2015_runtime==14.15.26706=h3a45250_4
  - wincertstore==0.2=py37_0
  - python==3.7.3=h8c8aaf0_1
```

そこでこれらの記述をインポートするymlファイルから削除します。

そしてもう一度コマンドを入れます。

```
$ conda env create -n 新たな環境名 -f ファイル名.yml
```

端末のスペックによっては結構時間がかかりますが、遅くても数分で完了します。

## 2. requirements.txtの読み込み

だいたい出来上がった状態ですが、仕上げとして移送元のrequirements.txtを読み込みます。

次のコマンドです。

```
pip install -r requirements.txt
```

以上で完了です。
商品購入後の商品にSOLDを表記（某フリマアプリのSOLD機能）

#前提条件
[Payjpに登録したクレジットカードで商品購入を実装する(Rails)](https://qiita.com/takachan_coding/items/d21c0d2621368c9b0d9b)
#####を参考に実装しました。
---
##1.購入ボタンを押したら購入者のIDが商品に登録されるように実装

```ruby:purchase_controller
def  done
 @product_purchaser= Product.find(params[:id])
 @product_purchaser.update( purchaser_id: current_user.id)
end
```
##2.商品一覧の商品にSOLDを記載
```ruby:index.html.haml
      -if product.purchaser_id.present? 
        .items-box_photo__sold
          .items-box_photo__sold__inner
            SOLD
```
####上記のコードを商品の個別の枠の一番下に配置
```ruby:index.scss
  .items-box_photo__sold{
    width: 0;
    height: 0;
    border-top: 60px solid #ea352d ;
    border-right: 60px solid transparent;
    border-bottom: 60px solid transparent;
    border-left: 60px solid #ea352d ;
    z-index:100;
    position: relative;
    top:-320px;
    &__inner{
      transform: rotate(-45deg);
      font-size: 28px;
      margin:-35px 0px 0px -55px;
      color: #fff;
      letter-spacing: 2px;
      font-weight: 600;
    }
  }
```
###商品詳細がある場合も同様に実施

<img width="512" alt="394b2565159434840c5ea18302271fce.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454698/7ead062f-b71e-5640-7094-4dbad5687a45.png">

##こんな感じ！！
[HTML/CSS]FLOCSS設計のWEBサイトまとめ

FLOCSS設計するときのための、FLOCSSで設計されたサイトを参考にするための、さいとのまとめ。


[IMAGINATION 未来行動スコープ](https://iotnews.jp/wbc/)

[株式会社ロコガイド \| 地域のくらしを、かしこく、たのしく](https://locoguide.co.jp/)

[SHIPS MAG セレクトショップSHIPS \(シップス\) にまつわるファッションマガジン SHIPS 公式サイト｜株式会社シップス](https://www.shipsltd.co.jp/shipsmag/)

増えてく予定。
VSCode Live Share で、いろいろ試した

# 概要

VSCode Live Share で色々試した
大変未来を感じた
いくつか気づいたところ。

# まとめ

- プログラミングがはかどる。
    - 困っているところをすぐみてもらえる
- VSCode からコミットすると、一緒に作業した人を、 `Co-authored-By` を自動でつけてくれる
- Live Share Audio は、うまくつながると非常に便利だが、うまくつながらないときもあった
    - Live Share 先に、エクステンションをいれていて手元にいれていないと会話できないかもしれない。
        - 手元にいれわすれていた。
            - しかし、未だにうまくいかないときもある。クリーンインストールがよいのかもしれない。
- ターミナルの共有は、便利だが、表示が崩れる感じがする。
    - 横幅が８０文字なのに、４０文字で開業されて表示されるようなケース
    - 縦に１０行くらい表示される予定がが、４行程度しか表示されない
    - セッションを開始した人は、この問題がおこらなかった
- いろいろ問題があるような気もするが、それを超えて未来感があった
【Python3】他言語エンジニアのためのPythonチートシート《オブジェクト指向編》

# はじめに
Python以外のプログラミング言語を習得しているエンジニア向けのチートシートです。

オブジェクト指向編と銘打っていますが、オブジェクト指向自体ではなく、
それを実現するために必要なモジュールとクラスの書き方についてまとめています。

※随時更新していきます。

## モジュール
### 組み込みモジュール
```python
import random as rand
print(rand.randint(0, 100))
# >> 77
```
- Pythonには標準で多くのモジュールが用意されている

### 自作モジュール
```python
from hoge import hello_python
hello_python()
# >> ほげ
# >> Hello Python!
```

```python:hoge.py
def hello_python:
    print("Hello Python!")

print("ほげ")        # import時に実行される

if __name__ == "__main__":
    print("ふが")    # importでは実行されず、直接呼出時に実行される
```
- モジュールをインポートすると、そのモジュールのコードは全て実行される

## クラス
### クラス定義
```python
class Hello:
    count = 0                    # クラスプロパティ

    def __init__(self, lang):    # コンストラクタ(第一引数(self)はインスタンス自身)
        self.__lang = lang       # インスタンスプロパティ
        Hello.count += 1

    def say(self):               # インスタンスメソッド
        print "Hello " + self.__lang + "!"

    @classmethod                 # クラスメソッド
    def say_count(cls):          # 第一引数(cls)はクラス自身
        print("インスタンスは" + cls.count + "個だよ")

    @staticmethod                # スタティックメソッド
    def say_hello():             # 第一引数にselfやclsを取らない
        print("Hello World!")

hello = Hello("Python")          # インスタンス化

hello.say()
# >> Hello Python!

Hello.say_count()
# >> インスタンスは1個だよ

Hello.say_hello()
# >> Hello World!
```
- クラスはヘッダーとスイートから成る複合文で、プロパティ(変数・属性)とメソッド(関数)を持つ
- 慣習として、クラス名は大文字で始まるキャメルケース、プロパティ名・メソッド名は全て小文字でスネークケース
- クラスプロパティ・クラスメソッドは全てのインスタンスに影響する

### 継承
```python
class SubHello(Hello):            # Helloクラスを継承
    def __init__(self, lang, ver):
        super().__init__(lang)    # 親クラスのコンストラクタ
        self.__ver = ver

    def ask(self):
        print(self.__lang + self.__ver + "?")

    def say(self):                # オーバーライド
        print("Hello " + self.__lang + self.__ver + "!")

sub_hello = SubHello("Python", "3")

sub_hello.ask()
# >> Python3?

sub_hello.say()
# >> Hello Python3!
```
- 継承元クラスを「親クラス、スーパークラス、基底クラス」、継承した新しいクラスを「子クラス、サブクラス、派生クラス」と呼ぶ
- super()で親クラスを参照
- 子クラスでは親クラスと同名のメソッドが再定義でき、子クラスのインスタンスから同名のメソッドを呼び出した場合は、子クラスのメソッドが実行される

### プロパティ（ゲッター・セッター・マングリング）
```python
class Code():
    def __init__(self, lang):
        self.__hidden_lang = lang

    @property                # ゲッター
    def lang(self):
        return self.__hidden_lang

    @name.setter             # セッター
    def lang(self, input_lang):
        self.__hidden_lang = input_lang

code = Code("Python")

print(code.lang)             # ゲッター
# >> Python

code.lang = "JavaScript"     # セッター
print(code.lang)
# >> JavaScript

print(code.__hidden_lang)    # マングリング
# >> エラー(※エラー表示は省略)

print(code._Code__hidden_lang)
# >> JavaScript
```
- インスタンスプロパティ名の先頭に二つのアンダースコアを付けると、直接アクセスをある程度防ぐことができる

---
基礎編もあります！
[【Python3】他言語エンジニアのためのPythonチートシート《基礎編》](https://qiita.com/hrgm_cmk/items/e4a3b5b80912adb8cce5)
Railsでメールを扱うときに困ったこと

## DKIM&SPFレコードを設定する

メールサーバの設定の問題だとは思うのですがDKIM、SPFレコードが設定されていない状態でRailsのActinoMailerでメールを送信した際にスパムだと判定されて迷惑メールフォルダに分類されてしまい、問い合わせが発生したことがあります。

[Rails ActionMailer 便利小ネタ集](https://qiita.com/tomomomo1217/items/4b566273f303768cd6fe#%E3%82%B9%E3%83%91%E3%83%A0%E6%89%B1%E3%81%84%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%81%AE%E3%83%A1%E3%83%BC%E3%83%AB%E8%A8%AD%E5%AE%9A)でも書かれているんですがSPFレコードだけでは不十分なケースがあるのでどちらか、ではなくDKIM&SPFレコードの両方を設定するようにしましょう。

開発段階では`letter_opener`などで送信していて気づかず、本番やステージングに導入してから発覚&調査することになり大変だったのでメールを扱うときは事前に設定されているかどうかを確認しておくほうがよいです。

結構見落としがちであとから発覚するタイプの問題なので事前にきちんと潰しておくと安心して開発に専念できます。

## ActionMailerで例外をキャッチする方法

メールアドレスにミスがあったり、そもそもの設定がおかしくてSMTPサーバに送信が行えない、あるいはタイムアウトをしたときの例外をキャッチする方法を誤認していた。
特にこの手の例外のキャッチはサンプルコードなどには記載されていないのが一般的でどう調べるかで大変困った。

結論から言うと`ActionMailer`を継承したクラス内で例外をキャッチするのではなく、呼び出す側で以下のように`begin~rescue`を行う必要がある。
クラス内で例外をキャッチできると勘違いしていたがこれはどうにも出来ないのではないかと思うがもし実装できる方法があるなら教えてほしい。

当初mailメソッド内で発生した例外だろうと考えていたので以下のように実装していたのだがこの実装では例外がキャッチできなかった。

```ruby
class UserNotifier < ActionMailer::Base
  default :from => 'any_from_address@example.com'

  # send a signup email to the user, pass in the user object that   contains the user's email address
  def send_signup_email(user)
    @user = user
    mail( :to => @user.email,
    :subject => 'Thanks for signing up for our amazing app' )
  rescue StandardError => e
    # ↓が実行されると思っていたが実行されなかった、何故？？？
    Rails.logger.error("failed send mail. #{e.message}")
  end
end
```

その後いろいろ調べた結果、[ruby-on-rails – ActionMailerでのエラー例外の捕捉方法](https://codeday.me/jp/qa/20190215/261953.html)を発見。
呼び出し元で`rescue`すれば良いという情報を得る。

```ruby
if @user.save
  begin
    UserNotifier.send_signup_email(@user).deliver
  rescue Net::SMTPAuthenticationError, Net::SMTPServerBusy, Net::SMTPSyntaxError, Net::SMTPFatalError, Net::SMTPUnknownError => e
    Rails.logger.error("failed send mail. #{e.message}")
  end
```

ここからはまだ未確認なので推測を含む形になるのだが、`mail()`はメール送信を行っているわけではない。
これは呼び出し元で`deliver()`を呼び出していることから明らか。

なので実際にSMTPサーバとのやりとりでエラーになるのは`deliver()`内で発生するため上の`send_signup_email`で`rescue`をしても絶対に実行されない、ということになる。

わかってみれば至極当たり前の話なのだが`mail()`内で例外が発生していると思い込んでいたため変なハマり方をしてしまった。

恐らくRailsに詳しい人がいればシュッと解決できたのだと思うが相談出来る人がいなくてドツボにハマってしまった。
ActionMailerの中のコードなども読んでいたのだがどうにも気づかず無為に時間を使ってしまったので自戒としてQiitaで供養しておく。

## 参考になった記事など

- [ActionMailerは何をしているのか](https://qiita.com/fursich/items/bb75a06714bcad6a0afb)
- [ActionMailerで送信依頼の結果を取得する](http://aligach.net/diary/20180725.html)
- [Rails ActionMailer 便利小ネタ集](https://qiita.com/tomomomo1217/items/4b566273f303768cd6fe)
- [Rails の ActionMailer でメール送信処理](https://qiita.com/hirotakasasaki/items/ec2ca5c611ed69b5e85e)
OWASP ZAP 2.8.0経由でHTTPのサイト閲覧したいのに勝手にHTTPSになって困った

# 解決方法

<img width="1098" alt="スクリーンショット 2019-08-14 16.02.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/0c6b1d27-fe59-bd51-e630-993b357b104e.png">

HUDをOFFにする

公式の正誤情報でてました
https://www.sbcr.jp/support/15210/

# 経緯

- 徳丸本(安全なWebアプリケーションの作り方)を進めていた。
- ZAPをプロキシに設定してhttpで`example.jp`にアクセスすると勝手にhttpsになる問題発生
- `3.3 CORS（Cross-Origin Resource Sharing）`の`33-001a:シンプルなリクエスト(CORS対応)`から、Firefoxのコンソールに以下のようなエラーがでて、クロスサイトの通信ができなかった
    - (スキームが違うので別オリジンとなってしまうため当然だが)

```
混在アクティブコンテンツ “http://api.example.net/33/33-002a.php” の読み込みをブロックしました
```

# HUDとは

ZAP経由でサイト閲覧した時に、画面上に色々表示してくれる機能
ZAP 2.8.0からHUDがデフォルト有効になった模様（追加された？）

<img width="993" alt="スクリーンショット 2019-08-14 16.19.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/fca286e0-fd76-abd2-dd3f-5e093b9274cf.png">

徳丸本の手順通りにFoxyProxyを使っていると以下のようにうまく表示されないかも

<img width="665" alt="スクリーンショット 2019-08-14 16.13.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/0c2ab3b8-3a79-f116-7fe3-cb41d9604a09.png">

# 原因の考察
HUDの表示は、ブラウザのHTMLにiframeで挿入されている
iframeのsrcは`https://zap//zapCallBackUrl/`以下略
httpのサイトにiframeでhttpsのサイトを埋め込むことはできないから(混合コンテンツ)
ZAPが勝手にhttpsで通信するようにしてるんじゃないかなあ


以上
入力コントロールのフォントサイズを14pxにしたらモバイル端末からそのコントロールにfocusしたタイミングで画面が自動ズームされる件について

## 入力コントロールのフォントサイズを14pxにしたらモバイル端末からそのコントロールにfocusしたタイミングで画面が自動ズームされる件について

```css
input[type=text] {
  font-size: 16px;
  transform: scale(0.8);
}
```

どうもコントロールのフォントサイズが16px未満だと自動でズームされるようです。まあ級数的に見づらいレベルに入っているのは事実なので親切なんでしょうけど、崩れは崩れなので修正。

## 上記対応をやったらAndroid標準ブラウザで表示が崩れた件について

```css
input[type=text] {
  font-size: 16px;
  transform: scale(0.8);
  -webkit-transform: scale(0.8);  /* ←これを追加 */
}
```
どうもscale()がうまく効いていなかったっぽい。

## 参考
[iOSでinputのフォーカス時に画面がズームするのを防ぐ](https://qiita.com/volkuwabara/items/b285cc312587c73a4812)
[(CSS)Android標準ブラウザで崩れる場合の対処](https://qiita.com/kt-tsutsumi/items/bd2933b5fd4028d73979)
[W3Q Archive](http://w3q.jp/t/10468)

全人類がChrome使ってくれればいいのに。
.NET Core 2.1 で AWS X-Ray を使う

.NET Core 2.1 のアプリで AWS X-Ray を利用しようとしてちょっとハマってしまったのでメモ。

AWS のドキュメントしか読まずにプログラム書いてて、
Github のプロジェクトサイト見ようとしてなかったので、
関係ないこと調べまくる羽目になりました。

詳細はプロジェクトサイトの How to use に書いてあります。
https://github.com/aws/aws-xray-sdk-dotnet

.NET Core 2.1以上を利用する場合、
app.UseXRay() ミドルウェアは何はさておき最初に呼び出す必要があるので注意。
【備忘録】GitHub経由でHerokuにデプロイするまでの流れ

# 大まかな流れ
1.GitHubにリモートリポジトリをつくる
2.ローカルリポジトリをつくり、リモートリポジトリにプッシュ
3.HerokuにAppをつくり、GitHubと連携


## GitHubにリモートリポジトリをつくる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/92c9008b-efc6-bbf3-475b-38af88aa4665.png)


## ローカルリポジトリをつくり、リモートリポジトリにプッシュ
ターミナルを開き、ローカルリポジトリをつくるディレクトリに移動し、下記コマンドを打つ。

```
git init
git commit -m "初回コミット"
git remote add origin https://github.com/{GitHubのユーザー名}/{リモートリポジトリ名}.git
git push -u origin master
```

#### やってること
①git init：ローカルリポジトリをつくる
②git add：ディレクトリやファイルをインデックスに登録
③git commit：変更をローカルリポジトリにコミット
④git push：リモートリポジトリにプッシュ


## HerokuにAppをつくり、GitHubと連携
①「Create new app」をクリックし、次の画面でApp名を指定して「Create App」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/ee081861-a4de-af02-8d45-46f6f41295d5.png)

②Setting>Buildpacksで開発言語に合わせたBuild Packを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/1aa9e418-580c-d2cd-c95b-a2be59703dc0.png)


③Deploy＞Deployment methodの「GitHub」をクリック（下図赤枠）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/4654538d-4c88-1a06-92dd-32253be30cc2.png)

④GitHubでつくったリモートリポジトリを検索し、「Connect」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/e9f52e78-a59d-ec7a-9a6a-b564976c7593.png)

⑤Deploy>Automatic deploysの「Wait for CI to pass before deploy」にチェックを入れ、「Enable Automatic Deploys」をクリック。※
 その後、Deploy>Manual deployの「Choose a branch to deploy」がmasterになっていることを確認したうえで「Deploy Branch」をクリック、手動Buildする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/a2ffe1d9-6bfc-f118-5b33-5e4d85c0ca1f.png)
※ チェックを入れるとDeploy前にHeroku CIが動き、自動的にソースコード内で設定されたユニットテストが実行される。
　 そのテストコードがすべてパスしたら、Deployするフローとなる。



# 参考にさせて頂いた記事
>[heroku 初級編 - GitHub から deploy してみよう -](https://qiita.com/sho7650/items/ebd87c5dc2c4c7abb8f0)
ScalaでUnix timestampからLocalDatetimeを取得する

特にScalaに限った話ではなく、Javaでも同様です。自分用のメモです。

Unixのtimestampが与えられたとき、それを`java.time.LocalDateTime`に変換するには、

```scala:main.scala
import java.time._

def fromUnixMilliSecond(ts: Long): LocalDateTime =
  LocalDateTime.ofInstant(Instant.ofEpochMilli(ts), ZoneOffset.UTC)
```

という感じに書けます。

ミリ秒ではなく、秒の場合は

```scala:main.scala
import java.time._

def fromUnixSecond(ts: Long): LocalDateTime =
  LocalDateTime.ofInstant(Instant.ofEpochSecond(ts), ZoneOffset.UTC)
```

と書けます。

`Instant`は元のtimestampの単位が、秒かミリ秒かによって呼ぶメソッドが異なるので、分かりやすい感じがします。

## 参考
https://qiita.com/liguofeng29/items/c643c6f81afc62aac77d

https://docs.oracle.com/javase/jp/8/docs/api/java/time/LocalDateTime.html#ofInstant-java.time.Instant-java.time.ZoneId-

https://docs.oracle.com/javase/jp/8/docs/api/java/time/Instant.html#ofEpochMilli-long-

https://docs.oracle.com/javase/jp/8/docs/api/java/time/Instant.html#ofEpochSecond-long-
【備忘録】Trello Webhook関連

# Trello Webhook
Webhookを使用すると、Trelloで発生したアクションに関する更新（JSON形式のデータ）を受信できる。Webhookのレスポンスの具体例（JSON）は[Trello Developers Guides](https://developer.atlassian.com/cloud/trello/guides/rest-api/webhooks/)を参照。



# Webhookの生成、更新、削除
Webhookの生成、更新及び削除については下表のとおり。
ターミナルからCurlコマンドを打たなくても、[Trello APIリファレンス>Webhooks](https://developers.trello.com/reference#webhooks)に必要情報（APIキー、トークン、Webhook ID等）を入力してボタンを押すだけで生成、更新、削除でき、非常に便利。

| Request URL | Method | Content |
|:--|:--:|:--:|
| https://api.trello.com/1/webhooks/ | POST | Webhookの生成 |
| https://api.trello.com/1/webhooks/id | PUT | Webhookの更新 |
| https://api.trello.com/1/webhooks/id | DELETE | Webhookの削除 |



# 具体的な手順
1. [Trello APIリファレンス](https://developers.trello.com/reference)にアクセス
2. Members＞【Get】/members/{id}で、API ID、トークンの他、ユーザー名（デフォルトから変更していなければ、Trelloのプロフィールに表示される『user』から始まる12桁の英数字）を入れてリクエスト
3. Members＞【GET】/members/{id}/boardsで、API ID、トークンの他、2のレスポンスで取得したユーザーIDをメンバーID欄に入れてリクエスト
4. Webhooks＞【POST】/webhooksで、API ID、トークンの他、callbackURL（必須）にトークBot等のCallback URL、idModel（必須）に3のレスポンスで取得したボードID、description（任意）にボードの説明を入れてリクエスト
5. 正常にWebhookが生成されれば、4でステータスコード200のレスポンスが返ってくる（そこにWebhook ID等も記載あり）



# Webhook IDの確認
下記URLにアクセスすると、今、登録中のWebhookのIDが確認できる。
IDだけ見ても何のWebhookか分からなくなるので、Webhookの生成時には説明を必ずつけること。

https://trello.com/1/tokens/{自分のトークン}/webhooks/



# そもそも自分のAPI情報がわからないときは
下記URLにアクセスする。

https://trello.com/app-key
iOSアプリ開発において、Firabaseへのログ送信が正常に動作しているか確認する方法


実装時に教えてもらったデバック方法の覚書です。

## 前提
- firebaseのアカウントが存在し、アクセスできる
- firebaseへのイベントやログ送信機構が実装されている

## 準備

### xcodeのデバッグオプションの有効化

デバッグモードを有効にするために、Xcodeに下記のオプションを与えてビルドします。

デバックオプション：```-FIRDebugEnabled```

Edit Schemeを開く

![Pasted_Image_2019_08_14_15_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37873/98249dcf-abed-fbc2-2290-3a577aff1c39.png "Pasted_Image_2019_08_14_15_40.png")

設定を追加する（写真は追加した状態）

![Pasted_Image_2019_08_14_15_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37873/af3a584d-8bc3-a5e3-5e9d-9b6df0296279.png "Pasted_Image_2019_08_14_15_42.png")


## 確認

### 1. firabaseのdebug viewにアクセス

![Pasted_Image_2019_08_14_15_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37873/7b6de876-124b-71e6-8248-2beae3a439a9.png "Pasted_Image_2019_08_14_15_36.png")

### 2. ビルドした端末を選択する

![Pasted_Image_2019_08_14_15_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37873/e1964435-5c1b-68a9-cf33-add529e4e25a.png "Pasted_Image_2019_08_14_15_39.png")


### 3. iOSでいろいろと操作する

適当に操作します

### 4. ログが飛ぶので中身をいろいろと見てみる
![Pasted_Image_2019_08_14_15_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37873/353e1788-1939-20d2-ec30-6d5ae93bbf9e.png "Pasted_Image_2019_08_14_15_37.png")

## 注意

- ときどき、パラメータは欠損することがある（Debug viewの仕様っぽい）
- そこまでリアルタイム反映ではない


## 参考

- [イベントのデバック](https://firebase.google.com/docs/analytics/debugview?hl=ja)
tf-pose-estimationを使って動画の姿勢推定と2D座標出力


　　　　　　　
　　　　![toy (1) (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480516/e3ff4962-a489-47ae-0901-110fd52c466e.gif)

#はじめに
openposeで姿勢推定が単眼カメラ&CPUでできる！との噂を聞きつけ、早速やってみたくなりました。
tf-pose-estimation(https://github.com/ildoonet/tf-pose-estimation)
を使って、様々な記事を参考にしながら色々いじっていました。

動画から検出した骨格の情報を使って分析できないか（スポーツだったらフォームが正しいかだとか）と3Dの推定結果を出力したりしていましたが、どうも精度が出なかったので、2Dの推定結果（画像の上に描かれている節そのものの座標）を取り出して、分析出来る環境を作ることにしました。

#目次
- 環境設定
- 動画の2D姿勢推定データ出力
- 姿勢推移のグラフ化
- 今後の方針
- ご参考サイト

#環境設定
tf-pose-estimationの公式インストール手順（README）が参考になるかと思います（割愛）。

#動画の2D姿勢推定データ出力
大元のコードをforkして以下に公開しています。

https://github.com/abarakatabira/tf-pose-estimation

「run_2dpose_get_data.py」が追加しているコードで、これを実行します。
事前にmovie > data というディレクトリを作成しておきます（ここに出力される）。

実行するときは以下のように行います。この場合では、toy.mp4という動画データを、1280x720にリサイズ、cmuモデルで実行、全体時間の80%まで処理、5frame間隔で処理、名前にcmuを付ける、となってます。

```
python run_2dpose_get_data.py --movie=./movie/toy.mp4 --resize 1280x720 --model cmu --frame 0.8 --frameterm 5 --dataname cmu
```
出力されるcsvのカラムは、「frame(nframe目の画像), human(どの人間か), point(節のID), x(画像のx座標), y(画像のy座標)」となっています。
（上記gifのようなnframe目の画像を出力するコードも中にあります。必要なければコメントアウトして下さい。）

| frame | human | point | x | y |
|:-----------:|:------------:|:------------:|:------------:|:------------:|
| 0 | 1 | 0 | 886 | 216 |
| 0 | 1 | 1 | 900 | 270 |

節のIDですが、以下のようになっているようです。
Nose = 0
Neck = 1
RShoulder = 2
RElbow = 3
RWrist = 4
LShoulder = 5
LElbow = 6
LWrist = 7
RHip = 8
RKnee = 9
RAnkle = 10
LHip = 11
LKnee = 12
LAnkle = 13
REye = 14
LEye = 15
REar = 16
LEar = 17
Background = 18

#姿勢推移のグラフ化
jupyter notebook環境で出力した2D推定結果をグラフ化をしました。

```python:graph.py
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from pylab import rcParams
rcParams['figure.figsize'] = 9, 5
%matplotlib notebook
#出力された2d推定結果を読み込み
df= pd.read_csv('_cmu_toy_2ddata.csv')

#2d推定座標をプロット
for i in range(19):
    df1 = df[(df['human'] ==1) & (df['point'] == i)]
    plt.plot(df1['x'], -df1['y'], label=i,marker = 'o')
plt.legend()
plt.show()

```
冒頭のイチロー君動画の各節の座標推移をグラフ化しました(縦軸、横軸は画像のピクセル座標)。確かに移動した方向に推移していることが確認できました。
注意点としては、複数人がいるような動画だとhumanのIDがframeによってはたまに入れ違いになったりとかします。

![toy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480516/ead61e10-9d75-716b-a4dd-736d50e45235.png)

さらに何frame目かを横軸にして、縦軸をx,yから算出した距離($\sqrt{x^2 + y^2 }$)としたグラフを書きました。
少し下に下がっていくような傾向で、これは画像の左上が原点座標ですがここに近づいていることを示しています。
この例では単純な横移動ですが、人間の動きをこういったグラフで分析していく所存です。

```python:graph_move.py
for i in range(19):
    df1 = df[(df['human'] ==1) & (df['point'] == i)]
    y = np.sqrt((df1['x'])**2 + (df1['y'])**2)
    plt.scatter(df1['flame']/30, y, label=i)
plt.show()
```
![toy2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480516/16c2a579-aa3d-74b2-e286-f5fb540f997f.png)

#学べたこと
- 実際に動かしてみると、動画によっては検出が難しいものもあったり（人が重なっているとか小さいとか）と色々学びがある
- コアな部分はディープラーニングで作られているものだが、そこから検出した座標なりをうまくエンジニアリングして、動作分析できるような使い方したい
- githubの使い方

#ご参考にさせていただいたサイト

- からあげさんのヒューマンシーケンサー(https://note.mu/karaage0703/n/n78ae26dca4b5)
- https://qiita.com/sugup/items/ebe1c0783f5c4db330d0
- https://qiita.com/shiooon/items/535f588bea7748e156f2
- https://qiita.com/keel/items/0d64167850566586d22a
Coral Edge TPUデモへのRaspberry Piサプリメント

最近、Coral USB Acceleratorを試しました。 ソフトウェアとドキュメントは一般的に優れています。 Pythonライブラリには、Piカメラを使用して連続的にキャプチャし、リアルタイムの分類のためにデータをEdge TPUに渡す方法を示すデモも含まれています。

ただし、Raspberry Piとの統合という点では、まだ埋めるべきギャップがあります。 まず、オブジェクトの位置を示すためにプレビューに長方形が描かれるオブジェクト検出の例を示します。 第二に、Pi Cameraのフレーム幅は32の倍数に制限され、高さは16の倍数に制限されているため、一部のモデルの必要な入力サイズと一致しません。 たとえば、Inception V3で必要な299x299にキャプチャのサイズを変更するようにPi Cameraに指示すると、実際には320x304に切り上げられます。 キャプチャした画像は、Edge TPUに渡す前にトリミングする必要があります。

ここでは、いくつかの追加デモを提供することにより、これらのギャップを埋めました:

1.`classify_capture.py`：これは元の公式デモであり、参照用に保持されています。 モデル入力サイズをPi Cameraの対応フレームサイズと比較しません。 入力224x224のモデルは正常に機能します（224は32と16の倍数であるため）が、他の入力サイズでは機能しない場合があります。

2.`classify_capture_crop.py`：これは、Pi Cameraの対応フレームサイズに対してモデル入力サイズを先制的にチェックします。 一致しない場合、フレームサイズは拡大されます。 キャプチャされた画像は、必要に応じてトリミングされてから、Edge TPUに渡されます。 すべてのモデル入力サイズで機能するはずです。

3.`detect_capture_crop.py`：これはオブジェクト検出を行います。 オーバーレイを使用して、プレビューに長方形を配置します。 また、フレームサイズを拡大し、必要に応じてキャプチャをトリミングします。 しつこいことが1つあります。オーバーレイが更新されるたびに、Pi Cameraはこのエラーを吐き出します:

```
picamera.exc.PiCameraMMALError: no buffers available: Resource temporarily unavailable; try again later
```
解決策が見つかりませんでした...

... AIY Vision Kitのソースコードに出会うまで、その一部を以下に組み込みました。

4.`detect_capture_crop_with_annotator.py`：上記のようにオブジェクト検出を行いますが、オーバーレイロジックは`Annotator`クラスに分離されているため、コードが少し簡潔になります。 `Annotator`クラスは、AIY Vision Kitプロジェクトから取得されます。 picameraパッケージにパッチを適用して、上記のエラーがこぼれないようにします。 `Annotator`クラスを使用するように`PYTHONPATH`を設定することを忘れないでください。

(github作者：@nickoala (https://github.com/nickoala/edgetpu-on-pi))

---------------------------
![微信图片_20190718135810.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/1a1d7b2f-56b9-587e-4c2e-3395fbd89553.jpeg)

Coral の開発ボードは、Edge TPU を搭載したリムーバブル System-On-Module（SOM）を含むシングルボード Linux コンピュータです。そのため、アプリケーションのプロトタイピングを行ってから、独自の端末に SOM を含めて生産用にスケールアップすることができます。

Coral USB アクセラレータは、Edge TPU を対応する Linux コンピュータに接続する USB アクセサリです。Raspberry Pi Zero にちょうど合うように設計されています。

こういった新しいアプリケーションは、すべて高パフォーマンス推論を利用します。これを実現できる唯一の方法が Edge TPU によるハードウェア アクセラレーションです。しかし、実際どのくらい速くなるのでしょうか。

いくつかのバージョンの MobileNet を使った内部ベンチマークによると、Edge TPU による推論は、CPU による推論よりも 70 倍から 100 倍高速です。MobileNet は、エッジ デバイスでイメージ分類を行う際によく使われる堅実なモデル アーキテクチャです。

顔検出用の MobileNet では、最大で毎秒 70 フレームから 100 フレームで推論を行えます。食べものの検知では、毎秒 200 フレームを実現できました。これなら、動画のリアルタイム推論にも十分対応できます。複数のモデルを同時に実行しても問題ありません。

![微信图片_20190724172906.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/8ade8889-b72a-9d92-1560-bb40691a8449.jpeg)


- Google Coral Edge TPU 官方海外代理店： https://store.gravitylink.com/global
【エラー】sublime Text 3 Warning PHP 7.0 or newer is required

未だにsublimeとかも使ってる。エラーが出たので一応メモ。
phpenvとか使わずに簡単にbrewで入れる場合。


php7入れる。

```
brew search php@7
```

パス通す。
$PATHには全部の環境変数が入ってるので、他のを上書きして消さないように注意。

```:~/.bashrc
export PATH="/usr/local/opt/php@7.1/bin:/usr/local/opt/php@7.1/sbin:$PATH"
```

適応

```
source ~/.bashrc
```

設定を変更

Preferences/Package Settings/phpfmt/Settings- User
Preferences/Package Settings/phpfmt/Settings- Default

見るバイナリを7.1の方に変更。


```
{
"version": 4,
"php_bin":"/usr/local/opt/php@7.1/bin/php",
// "format_on_save":true,
"option": "value"
}

```

以上


# 参考


https://qiita.com/noraworld/items/4556f91bc31f641d187d
https://es.stackoverflow.com/questions/255228/sublime-text-3-warning-php-7-0-or-newer-is-required
png 1x1 gen

demo https://codepen.io/gnjo/pen/pozgqeN
demo https://codepen.io/gnjo/pen/ZEzQmvG

```js
function p1x1(c,w,h){
 //ex) red or #f00 or #f005 or #ff0000 or #00000000 or transparent
 let canvas=document.createElement('canvas'),ctx=canvas.getContext('2d')
 ;
 canvas.width=w||1
 canvas.height=h||1
 ctx.fillStyle=c||"#000000"
 ctx.fillRect(0,0,canvas.width,canvas.height)
 ;
 return canvas.toDataURL("image/png") //output
}
```
[Ruby on Rails] sort順を任意で指定したい

# 概要
`users.order(:name)` のように、テーブルのカラムを使ってソートをするのは簡単です。
しかし、order順の指定が難しい場合、カスタムソートをしたくなることもあると思います。
その場合の対応方法をまとめます。

※実務では、関連する中間レコードに`sort`カラムがあり、中間レコードがあるレコードを先に`sort`カラム並び替え、そのあとに中間レコードがないレコードを`name`カラムで並び替える必要がありました。

# MySQLの場合
既にまとめてくださっているページがありました。
⇨ https://qiita.com/chezou/items/8c0481044c954c4bca3b

# PostgreSQLの場合
## 動作環境
`Rails 4.2.11.1`
`ruby 2.4.5p335 (2018-10-18 revision 65137) [x86_64-darwin16]`
`psql (PostgreSQL) 9.6.12`

## 方針
ソート用のテーブルを1つ作成、joinし、そのjoin先のテーブルのカラムを使ってsortを実現します。

## 実装
`User`モデルを任意の順番でソートしたという状況を考えます。
また、そのソート順を`id`の配列として用意できている前提です。

```sort_by_user_ids.rb
# sorted_user_ids [Array<UUID>] この配列順にソートをかける
sorted_user_ids = [user_id1, user_id3, user_id2]

sort_vals = sorted_user_ids.map.with_index { |user_id, i|
  "('#{user_id}', #{i})"
}.join(',')

users.joins(
  <<-SQL.strip_heredoc.squish,
    JOIN (VALUES #{sort_vals}) AS x(user_id, sort)
    ON x.user_id::uuid = users.id
  SQL
).order('x.sort')
```

## 解説
今回のケースは、そのような結合先のテーブルのカラムだけでは完結しないような複雑なソートへの対応になります。

`JOIN (VALUES #{sort_vals}) AS x(user_id, sort) ON x.user_id::uuid = users.id`
⇨ `user_id`、`sort`をカラムとして持つxというテーブルを作成し、元の `users` テーブルと結合しています。
　 `::uuid`がないと、`string` と `uuid` の比較になってしまい、うまく `join` することができません。

## おまけ
勿論、既に存在するテーブルを使っても同様のソートをかけることができます。
以下は生徒たちをクラスの名前ごとにソートするサンプルコードです。

```example_sort.rb
students.eager_load(:class).order("classes.name")
```

# 参考サイト
https://www.gab.lc/articles/order_by_custom_list/
PureScriptで簡単FizzBuzz

# はじめに

PureScriptのFizzBuzzを様々な方法で書いてみました。

## 例1

```haskell
module Main where

import Prelude

import Data.Array ((..))
import Effect (Effect, foreachE)
import Effect.Console (log)

main :: Effect Unit
main = foreachE (fbList 100) log

fbList :: Int -> Array String
fbList n = map judge $ 1 .. n

judge :: Int -> String
judge n
  | n `mod` 15 == 0 = "Fizz-Buzz"
  | n `mod` 5  == 0 = "Buzz"
  | n `mod` 3  == 0 = "Fizz"
  | otherwise       = show n
```

直感的に読めます。

## 例2

```haskell
module Main where

import Prelude

import Control.Alt ((<|>))
import Data.Array (mapMaybe, (..))
import Data.Maybe (Maybe(..))
import Effect (Effect, foreachE)
import Effect.Console (log)

main :: Effect Unit
main = foreachE (fbList 100) log

fbList :: Int -> Array String
fbList n = mapMaybe judge $ 1 .. n

judge :: Int -> Maybe String
judge n = fizzbuzz n <|> buzz n <|> fizz n <|> Just (show n)

fizzbuzz :: Int -> Maybe String
fizzbuzz n = if n `mod` 15 == 0 then Just "Fizz-Buzz" else Nothing

buzz     :: Int -> Maybe String
buzz     n = if n `mod`  5 == 0 then Just "Buzz"      else Nothing

fizz     :: Int -> Maybe String
fizz     n = if n `mod`  3 == 0 then Just "Fizz"      else Nothing
```
judge関数にある「A <|> B <|> C」は「Aが空ならB、Bが空ならC」のように読みます。fizzbuzzでもbuzzでもfizzでもないならそのまま数字を出します。

If式は関数型言語を使ったことがない人にも読みやすいと思います。

## 例3

```haskell
module Main where

import Prelude

import Control.Alt ((<|>))
import Data.Array ((..))
import Data.Foldable (for_)
import Data.Maybe (Maybe(..), fromMaybe)
import Effect (Effect)
import Effect.Console (log)

main :: Effect Unit
main = for_ (from .. to) $ log <<< judge
  where
    from = 1
    to   = 100

judge :: Int -> String
judge n = fromMaybe (show n) $ fizzbuzz n <|> buzz n <|> fizz n

fizzbuzz :: Int -> Maybe String
fizzbuzz n = if n `mod` 15 == 0 then Just "Fizz-Buzz" else Nothing

buzz     :: Int -> Maybe String
buzz     n = if n `mod`  5 == 0 then Just "Buzz"      else Nothing

fizz     :: Int -> Maybe String
fizz     n = if n `mod`  3 == 0 then Just "Fizz"      else Nothing
```

forループのようなものが使えます。

fromMaybeはデフォルト値を設定することができます。fizzbuzz、buzz、fizzのどれでもなかった場合はnを文字列にして返します。

## 例4

```haskell
module Main where

import Prelude hiding (min, max)

import Control.Alt ((<|>))
import Data.Maybe (Maybe(..), fromMaybe)
import Effect (Effect)
import Effect.Console (log)

main :: Effect Unit
main = loop 1

loop :: Int -> Effect Unit
loop n
  | n <= min  = log "It cannot be negative or 0."
  | n >  max  = log "It cannot be bigger than 100."
  | n == max  = log (judge n)
  | otherwise = log (judge n) *> loop (n + 1)

min :: Int
min = 0

max :: Int
max = 100

judge :: Int -> String
judge n = fromMaybe (show n) $ fizzbuzz n <|> buzz n <|> fizz n

fizzbuzz :: Int -> Maybe String
fizzbuzz n = if n `mod` 15 == 0 then Just "Fizz-Buzz" else Nothing

buzz     :: Int -> Maybe String
buzz     n = if n `mod`  5 == 0 then Just "Buzz"      else Nothing

fizz     :: Int -> Maybe String
fizz     n = if n `mod`  3 == 0 then Just "Fizz"      else Nothing
```

loop関数の再帰によってループを作っています。

# まとめ

いろんな書き方ができて、読みやすくて、とてもいい言語です🙂

他の書き方や指摘などがあれば、ぜひコメントやEdit Requestを送ってください😎
全メタデータ取得（package.xml Manifest Files）

Package.xml to get all the metadata using Visual Studio Code for Salesforce

package.xmlを右クリックして、
ファイルダウンロードしてください。

The Manifest (package.xml) File
your-app
├── README.md
├── sfdx-project.json
├── .sfdx
├── .vscode
│   ├── extensions.json
│   └── settings.json
├── force-app
│   └── main
│      └── default
│          ├── aura
│          ├── classes
│          └── objects
└── manifest
    └── package.xml

refer
http://www.infallibletechie.com/2018/12/packagexml-to-get-all-metadata-using.html
CentOS 7 に docker-ce、docker-compose をインストールして一般ユーザで動かす

# 概要

OpenStack上の仮想マシンで稼働している社内システムをDockerへ移行したので、その際の導入手順をメモ。
環境は以下の通り。

- CentOS 7
- Docker CE 18.08.8
- Docker Compose 1.24.0

# Docker CE インストール

既にDockerがインストール済みかどうか確認。インストール済みならyum removeでアンインストール。

```
# yum list installed | grep docker
```

必要パッケージのインストール。

```
# yum install yum-utils \
  device-mapper-persistent-data \
  lvm2
```

Docker CEのリポジトリを追加。

```
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
```

Docker CEのインストール。

```
# yum install docker-ce
```

Dockerサービスを起動。

```
# systemctl start docker
```

Dockerサービスを有効化。

```
# systemctl enable docker
```

# Docker Compose インストール
最新版は[GitHubのページ](https://github.com/docker/compose/releases/)で確認。

```
# curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
```

# Dockerを一般ユーザで動かせるよう設定
adminユーザを作成して、そこでDockerを使えるよう設定。
※ この設定は商用環境では非推奨。あくまで社内や開発環境向け。

```
# useradd admin
# passwd admin
# usermod -aG docker admin
```

# 動作確認
adminユーザで確認してみる。

```
# su - admin
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:6540fc08ee6e6b7b63468dc3317e3303aae178cb8a45ed3123180328bcc1d20f
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/


$ docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                          PORTS               NAMES
e118c3d45615        hello-world         "/hello"            About a minute ago   Exited (0) About a minute ago                       peaceful_swartz

$ docker images
REPOSITORY                                      TAG                 IMAGE ID            CREATED             SIZE
hello-world                                     latest              fce289e99eb9        7 months ago        1.84kB

```
jenkinsでビルドしたapkをslackにアップロードする

1. `https://追加したいワークスペース.slack.com/apps` を開いて `bots` で検索してbotを作る
2.  apiトークンをコピー
3.  ビルドスクリプトに次を追加する

```:bash
curl -F file=@app/build/outputs/hogehoge/your_app.apk \
       -F "initial_comment=your_message" -F channels=your_channel \
       -H "Authorization: Bearer xoxb-xxx-xxx-xxx" \
       https://slack.com/api/files.upload
```

で、実行するとこうなる

<img width="502" alt="画像です" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90216/80a4c5fa-a585-ac0f-0870-4903183f2128.png">

よかったね
Jenkins自動起動設定で失敗

#Jenkinsの自動起動設定で躓いたので記録しておく。
##1, systemctl enable jenkins
- コマンドで実行すると次のような表示がされる。

```shell
[root@h120 student]# systemctl enable jenkins
jenkins.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig jenkins on
[root@h120 student]# 
```

ここで私はエラーメッセージと判断してしまったが、いろいろ調べると、これで自動起動は行えるらしい。
実際に`reboot`で再起動して`systemctl status jenkins`コマンドで確認してみる。

```bash
● jenkins.service - LSB: Jenkins Automation Server
   Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled)
   Active: active (running) since 水 2019-08-14 14:17:17 JST; 27min ago
     Docs: man:systemd-sysv-generator(8)
   CGroup: /system.slice/jenkins.service
           └─2322 /etc/alternatives/java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins.war --logfi...
 8月 14 14:17:04 localhost.localdomain systemd[1]: Starting LSB: Jenkins Automation Server...
 8月 14 14:17:06 h120.s120.terasawa.net runuser[1895]: pam_unix(runuser:session): session opened for user jenkins by (uid=0)
 8月 14 14:17:17 h120.s120.terasawa.net runuser[1895]: pam_unix(runuser:session): session closed for user jenkins
 8月 14 14:17:17 h120.s120.terasawa.net jenkins[1873]: Starting Jenkins [  OK  ]
 8月 14 14:17:17 h120.s120.terasawa.net systemd[1]: Started LSB: Jenkins Automation Server.
[root@h120 student]# 
```
**！！！！！ちゃんと自動起動している！！！！！**

##2, 実際に何が起こっているのか？
**よく読むとエラーメッセージではない？**

```bash
jenkins.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig jenkins on
```

なんだか `/sbin/chkconfig`を参照して起動しますよ〜ということらしい。
実際に見てみても暗号化されていて読めない....笑

##3, 終わりに
- 自動起動をする際にいつもと表示が違うことがある！
- エラーメッセージ（今回は違ったけど）しっかり読む！！

**少しづつ成長していきましょう。**
ではでは。。。。。
ginをdockerで動かす 〜Go Modules管理版〜

[以前](https://qiita.com/ogurasousui/items/f672ac867fd7d6f3c2ea)、ginの依存関係をdepで管理していたが、GoModulesでの管理もやってみる
`main.go` の内容や操作などは[以前](https://qiita.com/ogurasousui/items/f672ac867fd7d6f3c2ea)の記事を参考にしてください


## docker-compose.yml

```docker-compose.yml
services:
  app:
    container_name: gin_app
    image: golang:1.12.0-alpine
    volumes:
      - .:/go/src/app
    command: >
      sh -c "cd /go/src/app &&
      apk update &&
      apk add --no-cache git &&
      GO111MODULE=off go get -u github.com/codegangsta/gin &&
      go mod init || : &&
      gin -i run"
    ports:
      - 3001:3001
    environment:
      GO111MODULE: "on"
```

### 変更点

- container_nameの変更（これは特に意味はない）
- environmentに `GO111MODULE: "on"` を追加
- commandを修正
  - depのインストールやinitを削除
  - ライブリロード用のginはGoModulesに対応していないため暫定でoffにしてget
  - 初期化処理を追加 `go mod init`

## 起動

```
$ docker-compose up
```

初回起動時は

- go.mod
- so.sum
- gin-bin

が作成される
自分用: 電気に関するメモ

## はじめに
ArduinoやRaspberry PiでIoTして遊んでるとブレッドボードでゴニョゴニョすると思いますが、その時に電気の理解を最低限持ってないとなんで動いてるのか結局よくわからなくてやばいなと思ったのでメモして行きます。 (筆者は暫く使わないとすぐ忘れるので

## 参考リンク
とりあえずこのサイト超わかりやすい。アザス！
https://www.hochan.jp/knows/voltage

## 電気とは
よくわからないけど、なんか略語なんじゃね

## 原子周りの解説
原子は原子核と陽子と電子で構成されている。
原子核に陽子が引っ付いてる感じ。
電子はその周りを惑星のように回ってる感じらしい。

## 電子の話し
その惑星軌道をなんらかの理由で外れると自由電子になる。自由な電子だからね！
陽子と電子はバランスする。陽子が多すぎると不安定だし、原子が多すぎると不安定である。エネルギーは安定しようとする力がある。
ここでは自分のわかりやすさのために、陽子をこれからはポジトロンと呼称し、電子はネガトロンと呼称する。
ポジトロンとネガトロンがバランスしていない場合に限ってネガトロンはポジトロンに引き寄せられる。この引き寄せる力、吸引力が電圧である。（実際吸引しているのか実は引き合ってるけど陽子は原子核の周りにくっついてる為動けないのかはそこまで調べてないのでわからないが。サンプルが埋め込まれた磁石だと思う。

## 電流
電流は電荷の流れを言う。
電流は本当はマイナスからプラスに流れているのだが、過去の人はプラスからマイナスに電荷が移動していると思っていたので、表記互換の都合上プラスからマイナスに流れていると書く。まぁ実際わかりにくいという以外の不便はない。
ちなみにネガトロンはマイナスの電荷の性質を持っているので実質ネガトロンの流れと捉えても間違ってはいないと思う。 正孔とかでマイナスの電荷を使い終わったネガトロンは移動しないしね。 (多分。今度調べる
1Aの電圧がかかった際に、1Aの力でネガトロンが吸引された際に、導線を流れる電荷の量の単位はクーロンです。
参考: http://www.wakariyasui.sakura.ne.jp/p/elec/seidenn/dennka.html

## オームの法則
電圧（Ｖ） = 電流（Ｉ） * 抵抗（Ｒ）
電流（Ｉ） = 電圧（Ｖ） / 抵抗（Ｒ）
抵抗（Ｒ） = 電圧（Ｖ） / 電流（Ｉ）



# 電池の仕組み
[このサイト](https://chuugakurika.com/2018/01/12/post-1359)が詳しい

## イオン化傾向
イオンは電子の数が多い、又は少ない状態にある原子の事。
例えば亜鉛は通常電子数30個だが、この電子が30個より多いと陰イオン、少ないと陽イオンになる。
陽イオンはpositive ion、又はcation等とも呼べる
陰イオンはnegative ion、又はanion等とも呼べる
各原子はイオンへの成りやすさがそれぞれ違う。
また、当然だがどの原子からどのイオンになったかも重要である。
各金属のイオン化傾向はこの[リンク](https://ja.wikipedia.org/wiki/イオン化傾向#金属のイオン化傾向)に書いてある


## [溶媒](https://ja.wikipedia.org/wiki/溶媒) (単語
> 溶媒（ようばい、英: solvent）は、他の物質を溶かす物質の呼称。工業分野では溶剤（ようざい）と呼ばれることも多い。最も一般的に使用される水のほか、アルコールやアセトン、ヘキサンのような有機物も多く用いられ、これらは特に有機溶媒（有機溶剤）と呼ばれる。

http://www.mext.go.jp/b_menu/shingi/gijyutu/gijyutu0/shiryo/attach/1331586.htm

## [電解質](https://ja.wikipedia.org/wiki/電解質)
> 電解質（でんかいしつ、英語：electrolyte）とは溶媒中に溶解した際に、陽イオンと陰イオンに電離する物質のことである。これに対し、溶媒中に溶解しても電離しない物質を非電解質という。

## イオン化傾向の有用性
仮に亜鉛ZnがZn2+になると、その際の電子2つが自由電子となる。
その自由電子に道と方向を用意する。道は導線で、方向はポジトロンだ。亜鉛なので、亜鉛よりも電子が少ない金属を用いれば電圧が生まれるのでその方向に自由電子は移動するだろう。その後に金属が自由電子を受け取ったらどうにかその自由電子を蓄積・活用・処分しなければならないのだが、それは一旦おいとく。
イオン化傾向はこういう風に電子を作りたい時に役立つ。

# 電位
このサイトがわかりやすい。
http://www.sist.ac.jp/club/mcf/Umeta_lecture/3.html

電位は水位似ている.
海抜nメートルとかって言葉があるが、あれは海上を基準水位としてnメートルって意味.
基準水位として定められた箇所の水位は水位0である.

同じように電位も〇〇に流れている電圧を基準電位として定める。
缶電池が1.5Vと言われているが、あれは地面を基準電位として定め、地面の電圧を0とした場合、缶電池の電圧は1.5Vということ。様は相対値。下手な絵だがこんな感じ。（木は3回書き直した
![S__14295061.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141711/ddc77ff9-fdbd-8664-121c-2a90e76adf5b.jpeg)

割と大切なのは、基準電位からは0Vの電流が流れている。

## GND
GNDは基準電位の事である。
基準電位は全ての回路で自由にどこを基準として定めるか決めれる.
回路の特定の箇所を基準電位として定め、そこを0Vとする.
なので、そこより電位が下(低い電圧)の奴はマイナスの電位になるのだが、基本一番低い電位をGNDとされる.その理由はまぁマイナスを扱わないほうがわかりやすいでしょって感じ。

## 補足
電圧が高い方が低い方から電子を吸い取るので、outputとGNDをつなぐと、outputにGNDの電子(0V)が流れる.これにより0Vの、低い電圧が欲しい場合に結構役立つ。
【コードなしで理解する】Web Components超入門

〜n番煎じを恐れない強い心を添えて〜

# Web Componentsとは
Webサイトを作っていくうちに、複数のページにまたがって見た目や機能面で何度も利用されるパーツが出てきたことはありませんか？そういったパーツのまとまりを部品化して再利用しようとする考えを**コンポーネント指向**といいます。
例えばSketchというデザインツールはデザイン面でのコンポーネント化を意識して作られていますし、ReactやVueなどコンポーネントの再利用が簡単に出来るようになっているJSのライブラリ/フレームワークも多いですよね。

対して**WebComponentsは、コンポーネント指向をweb標準技術で解決しようとする技術の総称**です。Web標準技術とは、babelなどを用いたトランスパイルの必要がない素のHTML・素のJavaScriptのことです。Web標準技術だけでコンポーネント指向が実現できるとは何と素敵なことなのでしょうか😆🎉

https://github.com/w3c/webcomponents

上記によると、WebComponentsを構成する技術はShadow DOM, Custom Elements, HTML Templates, CSS changes, JSON/HTML/CSS Modulesの5つがあります。(※2019/08現在)
今回は中でもWebComponentsにおけるメイン技術である`Shadow DOM` `Custom Elements` `HTML Templates`の3つについて、それぞれの内容を簡単にご紹介します。

## 1. Custom Elements(v1)
いわゆる独自タグに独自の振る舞いを与えたもののこと。JavaScriptで既存の要素(`<div>`など)を継承させた上でそのタグ独自の動作を定義することができ、一度定義すれば同じWebサイト内で何度でも使い回すことができます。また、APIにはライフサイクルメソッドも用意されており、それらをフックすることで要素の振る舞いを制御可能です。
[Using custom elements | MDN](https://developer.mozilla.org/ja/docs/Web/Web_Components/Using_custom_elements)

## 2. Shadow DOM(v1)
カプセル化されたDOMのこと。Shadow DOMはメインのドキュメントツリーには属さず、独自のドキュメントツリーを形成するDOMです。JSやCSSは基本的にグローバル(windowやdocumentsの下)に置かれるため、多用すると同じページの他の要素に影響することがあるが、Shadow DOMではJSやCSSをカプセル化するので他のDOMに影響を及ぼすことはありません。

例えばChromeでは`<video>`タグは内部的にShadow DOMが使われています。
![スクリーンショット 2019-08-11 19.03.40 (1) (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126718/075f2970-9e92-2eb6-7229-4e5119bca1f5.png)
HTML上はvideoタグしか書かなくても、実際に描画される時は再生・停止ボタンや時間表示、ボリューム操作などを行うUI・機能が付与されます。
![スクリーンショット 2019-08-11 19.03.40のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126718/39fc681a-f010-eeee-24fe-4f5a6f850b7a.png)
そしてこれらのパーツはHTML文書構造上は存在しません。

## 3. HTML Templates
`<template>`要素のこと。ページ読み込み時には中身の要素は描画されず、後から`<template>`の中の要素をJavaScriptで挿入します。このtemplate要素はVueでも使われていますし、lodashでも関数が用意されているので一番目にしたことが多いのではないでしょうか。内容としてはテンプレートエンジンにおける部分テンプレートのようなものです。
[コンテンツテンプレート要素 | MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/template)

# Web標準技術といったけど…
一部の技術はIEや他のブラウザではまだ対応されきっていない現状があります。ですが、下記のポリフィルを使うことでIE11以上やSafari9以上までは対応できるようです。VueやReactではオーバースペックになる小規模サービスであれば採用することもアリっちゃアリ…なのかな…。
https://github.com/webcomponents/polyfills/tree/master/packages/webcomponentsjs
ここにPromiseやObject.Assign()のポリフィルも含まれてることに驚きました😲

個人的には現状クローラーがどこまで理解してくれているのか気になるところです。

## 参考
- 実際にコードを書きたい方におすすめ: [よくわかるWebComponents](https://www.amazon.co.jp/dp/B07J5R83PY)
- 最近の状況が知りたい方におすすめ: [Web Components の最近の仕様と開発手法](https://qiita.com/ka-miyata/items/63e41e4105d7aeb44d6c)
Spresenseとsakura.ioホードの接続

Spresenseの拡張ボードに sakura.ioのArduinoシールドを装着したのですが、２点ほどハマったので、解決方法を書いておきます。
なお、I2Cを使った場合のみで、SPIやUARTの確認はしていません。

# sakura.ioのArduinoシールドの電源LEDが点かない
一部のArduinoボードではVINに5Vが出ていないとの情報をいただきました。
VINと5Vをジャンパーで繋ぐことで解決しました。
![IMG_3520.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136795/330d767d-6093-e413-8b47-0faeed24ae6c.jpeg)

# SakuraIOライブラリが動かない
サンプルを動作させましたが、コネクションができません。ボード上のLEDは１回点滅になっているので、ボードは正常に通信できているようですが、getConnectionStatus()が127を返します。
どうも、Wireライブラリの初期化が行われていない動きです、setup関数中にWire.begin()を入れることで、解決しました。

```C++
#include <SakuraIO.h>

//SakuraIO_SPI sakuraio(10);
SakuraIO_I2C sakuraio;

void setup() {
  Wire.begin();
  Serial.begin(9600);
  Serial.print("Waiting to come online");
  for(;;){
    if( (sakuraio.getConnectionStatus() & 0x80) == 0x80 ) break;
    Serial.print(".");
    delay(1000);
  }
  Serial.println("");
}
```
SakuraIO_I2Cのコンストラクタで、Wire.begin()は呼んでいるようなのですが、うなくいっていないようです。

以上です。
MySQLでcaching_sha2_passwordのエラーが出る

一年前に開発したプログラムを改修するため、新しい開発環境にMySQLを入れてソースを実行した。するとDB接続ができず、以下のエラーが出た。
`Authentication method 'caching_sha2_password' not supported by any of the available plugins.`
MySQLの最新版を導入したため、（MySQL　8.0以降）デフォルトの認証方式が変わっていた。ソースは古い方式で認証しようとしているため、エラーが起こったらしい。
結論としては、MySQLの認証設定を変更し、解決した。phpでも同様の問題が起こるが、MySQL側の設定を変えるという解決方法は同じ。
## 環境
- OS：Windows10 64bit
- IDE：Visual Studio Community 2019 v16.2.1<br>.NET Framework v4.7.03056
- DB：MySQL Community Server v8.0.17

## 問題の状況
以下が今回のソース。Connection.Openにおいてコケてしまうことが確認できる。

```dao.cs

using MySql.Data.MySqlClient;

namespace TEST
{
    class MySQLDao
    {
        MySqlCommand cmd;

        internal void Test()
        {
            using (var conn = new MySqlConnection("userid=user; password=hoge; database=test; Host=localhost"))
            {
                cmd = new MySqlCommand()
                {
                    Connection = conn
                };
                try
                {
                    cmd.Connection.Open();
                }
                catch(Exception ex)
                {

                }
            }
        }
    }
}
```
## ライブラリの更新では解決せず
対策としては、ソース側のMySQLへの接続方式を新しいものにするか、DB側の認証を旧方式にするかの二通りが考えられる。
まずは前者の対策を試みる。MySQLライブラリを更新してみた。Visual Studio のNuGetパッケージマネージャーから使用しているライブラリを調べると、バージョン8.0.17がリリースされているので、導入する。今回の問題が発生したMySQLのバージョンが8.0なので、ライブラリのバージョン名からすると対応されているように思えるが…。
![hoge.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241999/1d471ca5-c3f4-0ef5-c615-825ee4f2e98d.png)
新しいライブラリに必要な.NET Frameworkのバージョンは4.5.2以上。既存のプログラムは4.5を対象にしていたため、プロジェクトのプロパティから4.5.2に変更する。
![hoge2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241999/556b0fae-b209-cdb4-8c16-f2a687685640.png)
しかし、上記の結果、エラーは解消しなかった。
## MySQL認証設定の変更
そこで、DB側の認証を旧方式にすることにした。MySQL WorkbenchのAdministrationタブからOption Fileを選択すると、Securityタブのなかに『default_authentication_plugin』という項目があり、『cashing_sha2_password』が設定されていた。これを『mysql_native_password』に変更する。Applyをクリックすると確認ダイアログが出るのでYesを選択する。
![hoge3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241999/c40c0ceb-40c3-c926-3da6-84ac44bf16ab.png)
なお、MySQLの設定ファイルはWindowsの場合、以下のようなインストール先フォルダ内にある。
`C:\ProgramData\MySQL\MySQL Server 8.0\my.ini`
GUIを使わない場合は、default_authentication_pluginの値を書き換えればOK。

```my.ini
# The default authentication plugin to be used when connecting to the server
default_authentication_plugin=mysql_native_password
```
新しくユーザーを作り直し、Authentication Typeを『Standard』にする。
![hoge4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241999/ca1678ee-cf59-daa0-5547-34a57adb84a3.png)
これでエラーは出なくなる。
機械学習関連のPython知識まとめ

#Python
1つの変数にたくさんのデータを格納することができる


#機械学習用パッケージ

##scikit-learn(sklearn) 
機械学習用のライブラリ、古典的機械学習のデファクトスタンダートといえる。
numpy,scipy,matplotlibはこのライブラリを入れると自動的にインストールされる
####fit()
学習。学習用のデータは全て数値でなければならない。
####predict()
予測
####train_test_split()
NumPy配列やリストを2分割できる

##Pandas
Pythonでデータ分析を効率的に行うためのライブラリ
pandasのread_csv型を使えばdataframeにセットされる

```python
import pandas as pd

df = pd.read_csv('sample.csv') 
print(df)
```

##NumPy                            
ベクトルなどの数字計算を行う
Numpy配列→リストを数学的により取り扱いやすくしたもの
　　　例）X[0:150,0:4] 　[0:150]→要素の0番目から149番目
　　　　＊Numpy配列の要素を0番目から数えること
　　　　X[:,:]範囲指定を省略した以下の表記でもXと同じNumpy配列を得ることができる
　　　　X[:0]→1列目のみのデータからなる配列

##matplotlib
グラフ描画用のライブラリ
Google Slideのインセプションデッキテンプレート

Google Slideのインセプションデッキテンプレートを作成しました。
[Google Slideのインセプションデッキテンプレート](https://docs.google.com/presentation/d/1FCnJ6vW5eAbRqhCWN1i2ZgtXQ84AA-RuuIiYCFxMqvw/edit?usp=sharing)

![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40689/57e5ce96-8d5f-b835-b315-6f7c98405717.gif)

# 参考にした記事・書籍

- [スクラムで使う「インセプションデッキ」のmarkdown形式版テンプレート - Qiita](https://qiita.com/bremen/items/ed491246ed83630bc84d)
- [アジャイルサムライ――達人開発者への道](https://www.amazon.co.jp/dp/B00J1XKB6K/)