OmniAICreator/Qiita-1.07M huggingface dataset:
AGC032_A Limited Insertionをコンテスト中に解いた話

AGC032はA問題から400点という事で、初心者の方には難しく結果として０完や、未提出となった方も多いと思います。公式の解説pdfではA問題にとてもわかりやすい解法が書いてありますが、今回は解説の解法が思いつくような*天才*にはなれなかった私がコンテスト中にACした方法を書いていこうと思います。ちょっと面倒な解法ですが、解説のような手法が思いつかない場合に強引になんとか解く方法は有用です。私は前回のAGC031でもO(1)数学解法が思いつかずに再帰を用いた、速度が愚直にやる場合よりはやや改善されたbit全探索で実行時間ギリギリでACをしました。毎回最もスマートな解法を思いつけるとは限りませんので、様々な解法を知っておくとよいことがあるかもしれません。
というわけで、AGC032のA問題である、[Limited Insertion](https://atcoder.jp/contests/agc032/tasks/agc032_a)のコンテストの解き方です。

まずこの問題で考えたいのは、無理な条件がどのような場合かという点です。この問題では、自明に無理なケースとしてサンプル２があります。
`Sample2
2
2 2`
これは問題中にある通り、数列の先頭に２を追加する事が出来ません。このように、任意の数字Ｎに対してその数字が数列bでのＮ番目より前にある場合は不可能であることがわかります。では、これ以外でダメなケースはあるのでしょうか？
実はありません。これが何故なのかは解法を説明してからの方がわかりやすいため、解法から先に説明します。
というわけで解法です。
空文字列から１文字ずつ追加する各クエリでaに追加するのは、最終形であるｂの数列の中にある任意のまだ取っていない数字で、(それより前に位置する要素の中で既に追加されている要素の数+1)以上のものの中で最も後ろにあるものです。相変わらず日本語は難しいので、具体例で説明します。

`Sample3
9
1 1 1 2 2 1 2 3 2`
これは、まず最初に追加するのはどの１でしょうか？
正解は5番目(0-index)です。最初はどの要素もとっていないため、それより前で既に追加した数は次のようになっています。
`0 0 0 0 0 0 0 0 0`
実際には+1なので、配列の全要素を+1しておきましょう。
`1 1 1 1 1 1 1 1 1`
というわけで、最初に追加するのはｂの中で最も後ろにある1で５番目です。次にこの５番目の1を追加したことでこのそれより前で既に追加した数配列(以降配列ｃとします)は、
`1 1 1 1 1 2 2 2 2`となります。
すると、次に追加するのはbでの8番目の2となり、これを追加すると
`1 1 1 1 1 2 2 2 3`
というふうになります。これを繰り返すと、
6番目の2を追加する
`1 1 1 1 1 2 3 3 4`
7番目の3を追加する
`1 1 1 1 1 2 3 4 5`
2番目の1を追加する
`1 1 2 2 2 3 4 5 6`
4番目の2を追加する
`1 1 2 2 3 4 5 6 7`
3番目の2を追加する
`1 1 2 3 4 5 6 7 8`
1番目の1を追加する
`1 2 3 4 5 6 7 8 9`
0番目の1を追加する
`2 3 4 5 6 7 8 9 10`
となりうまくいきました！ここで重要なのは、複数候補が存在する場合は最も後ろから追加していくことです。これの理由は、前の要素を追加する場合は当然それより後ろの要素を追加する場合にも影響を及ぼしますが、一番後ろの要素を追加することで少なくともそれより前の要素に影響を及ぼすことはないからです。また、要素を前から追加する場合、これは実験をすると簡単にわかるのですが明らかに答えがおかしくなります。また、なぜこの解法が上手く行くのかの説明や証明は難しいです。恐らく私のレベルだと公式のpdf解説を用いてこう解けるからこの解法も正しいみたいな事になると思います……
この解法はある程度実験でそれっぽい事をしないと導くのは難しいかもしれません。やはり実験は偉大ですのでみなさんもしましょう。
最後に、これだと何故sample２のようなケース以外で上手く行くかの説明です。これはもう簡単で、上の解法のようにやると少なくとも一番前の１が追加でき、するとその次の２も追加でき…と順順に前から条件を満たすからです。
ちなみにO(N^3)で想定解より遅いので制約が甘くて良かったです。
最後になりましたが、コードを張り付けて終わりにしたいと思います。

```c++:taskA.gcc
int b[101010];
int c[101010];
int N;
int main() {
    cin>>N;
    for(int i=0;i<N,++i){
        cin>>b[i];
        if(b[i]>i+1){
            cout<<-1<<endl;
            return 0;
        }
    }
    for(int i=0;i<N,++i){//i回目の文字の追加
        for(int j=N-1;j>=0;--j){//後ろから追加できる条件を満たすものを探す
            if(b[j]<=a[j]+1){
                cout<<b[j]<<endl;
                b[j]=1000;//一回使った値を二回使わないように大きい値で上書きする
                for(int k=j,k<N;++k){
                    c[k]++;
                }
                break;
            }
        }
    }
	return 0;
}
```


また、何か疑問点等ありましたらTwitterまでお聞きください。
始めてQiitaを書いたのですが、とても難しかったです。文章力も精進しますね。
no basic auth credentials  !    Error: docker push exited with 1

# 概要

試しに heroku のデプロイを Dockerのイメージごとやったらどうなるのかを試して見たかったので、やってみたら詰まったお話。

# エラーの内容

```shell
$ heroku container:push web
=== Building web (/Users/oki.suguru/workspace/docker/go/Dockerfile)
Sending build context to Docker daemon  38.91kB
Step 1/10 : FROM golang:latest as builder
 ---> 36e5881731e4
Step 2/10 : ENV CGO_ENABLED=0
 ---> Using cache
 ---> 038493d74c24
Step 3/10 : ENV GOOS=linux
 ---> Using cache
 ---> a18000304e4c
Step 4/10 : ENV GOARCH=amd64
 ---> Using cache
 ---> dd7c60bdd218
Step 5/10 : WORKDIR /go/src/github.com/yokoe/go-server-example
 ---> Using cache
 ---> b0ed8cbc042c
Step 6/10 : COPY . .
 ---> Using cache
 ---> 77b5bfebb449
Step 7/10 : RUN go build main.go
 ---> Using cache
 ---> ff8e57971358
Step 8/10 : FROM alpine
 ---> 5cb3aa00f899
Step 9/10 : COPY --from=builder /go/src/github.com/yokoe/go-server-example /app
 ---> Using cache
 ---> e6233c2177f8
Step 10/10 : CMD /app/main $PORT
 ---> Using cache
 ---> 6364bb214f79
Successfully built 6364bb214f79
Successfully tagged registry.heroku.com/afternoon-inlet-94103/web:latest
=== Pushing web (/Users/oki.suguru/workspace/docker/go/Dockerfile)
The push refers to repository [registry.heroku.com/afternoon-inlet-94103/web]
f6d129803085: Preparing
bcf2f368fe23: Preparing
no basic auth credentials
 ▸    Error: docker push exited with Error: 1
```

# やったこと

1. heroku cli において heroku login を実行して、成功している
2. heroku の Docker でないデプロイはできる
3. Dockerfileにおけるbuild自体に失敗はない
4. ローカルにおけるDockerのrunについては問題なく稼働している
5. heroku container:push を実行した → ここでタイトルのエラーが発生する。

# 今回の問題の解決方法

実行コマンドは以下の通り。

```shell
$ heroku container:login
$ heroku container:push
```

このようにしたところ成功した。
どうやら heroku container を実行して heroku コンテナのレジストリにもログインが必要らしい。

# 参考

[Goで書いたサーバーをHerokuにDocker Deployする](https://qiita.com/croquette0212/items/2b85aa2c6b2933244f07)
[fiorix/freegeoip - Issues #171 [Docker Deploy to Heroku]](https://github.com/fiorix/freegeoip/issues/171)
Webスクレイピング　Python

Webスクレイピングの練習。
これでid b_resultsの子要素liのb_algoクラスの値が取れる 


```
from bs4 import BeautifulSoup
import requests

search = input("Search for:")
params = {"q":search}
r = requests.get("https://www.bing.com/search", params=params)

soup = BeautifulSoup(r.text, "html.parser")
results = soup.find("ol", {"id":"b_results"})
links = results.findAll("li",{"class":"b_algo"})

for item in links:
    item_text = item.find("a").text
    item_href = item.find("a").attrs["href"]

    if item_text and item_href:
        print(item_text)
        print(item_href)
```
違うチームでのアジャイル体験談


関係者はこの記事を見られるかもしれないので、まず言っておく：誰かに悪い評価を与えるつもりは一切ない

#現場に配属されたばかり頃、アジャイル開発でやったこと
2017年の６月に現場に配属され、現場はアジャイルの開発をやっているので、自分も流れに乗って、アジャイル開発が始まった。
当時、アジャイル開発には下記のことをやった
・朝会がやること
・朝会の時間は15程度
・朝会で、詳細までの質問対応をしないこと。
・タスクを見積もること
・タスクの担当名前、見積もり、実績時間を書くこと
・タスクの内容は付箋に書くこと
・週１の程度で振り返ること
・席を集中すること
・スクラムマスタは参加すること※スクラムマスタの資格を持っている人
・開発メンバー全員テストコード書く経験がないため、テストコードなし
・開発メンバー全員コーティング経験が浅いため、コードレビューを行わず、お互いに画面のチェックを行う
・WBSを常に更新し、ユーザに共有する
・WBSは毎日確認する
・設計者が不定期にテストを実施する

■ 結果
・最初のプロジェクトなので、勉強になった
・ほかのメンバーとの交流が多かった
・納期に間に合わなかった
・納品後、不具合は何件出た
・工数の余裕が無かった

#アジャイル開発の1年後のアジャイル開発でやったこと
現場に配属して半年後、最初のプロジェクトの作業は完了したので、そこでチームを変えることになった。
チーム変えのため、新しいチームでアジャイルの開発を始まった。アジャイルの対して、新しい認識があった。
新チームで、開発、設計経験が豊富なベテランの方が多い。
新チームに入ったばかり頃、システムの保守を担当していた。
新チームもアジャイルをやっているが、前のチームとちょっと変えた。
・朝会がやること
→なし
・朝会の時間は15程度
→なし
・朝会で、詳細までの質問対応をしないこと。
→なし
・タスクを見積もること
→ある
・タスクの担当名前、見積もり、実績時間を書くこと
→ある
・タスクの内容は付箋に書くこと
→あるが、付箋じゃない、redmineのチケットを使う
・週１の程度で振り返ること
→なし
・席を集中すること
→ある
・スクラムマスタ参加すること　※スクラムマスタの資格を持っている人
→なし？？　　ほかのメンバーはスクラムの資格を持っているか確認できていなかったですが、ないぽいです。
・開発メンバー全員テストコード書く経験がないため、テストコードなし
→テストコードが必須
・開発メンバー全員コーティング経験が浅いため、コードレビューを行わず、お互いに画面のチェックを行う
→コードレビューが必須　経験がある人は経験が浅い人のコードをチェツクする。当レベルの人は相互チェックを行う
・WBSを常に更新し、ユーザに共有する
→１が月ごとにユーザにプロダクトを見せて、フィードバックをもらって、システムを改修する
・WBSは毎日確認する
→１が月ごとに進捗を見直し
・設計者が不定期にテストを実施する
→1が月ごとに設計者テストを実施

■ 増えたこと
・ 席が近いので、質問があれば、すぐ質問きくルールがある
・コーディング前にコーディングのルールを決める

■ 結果
・納品物の不具合があんまに出ていなかった
・納期に間に合った
・コードが綺麗に書けるようになった
・ほかのメンバーとの交流が少なかった

#感想
・最初のチームでのアジャイル開発と比べて、一年後のアジャイル開発はすごく変わったように見える。
・最初のチームはアジャイル開発(スクラム)をやっているように見えていますが、実際の効果はあんまに出ていなかったです。
・一年半後のアジャイルはアジャイルのルール違反する箇所は何件がありますが、ベテランの開発者が何名いるので、なんとかカーバーできたように感じた。
・アジャイル開発はそもそも開発の一つの手段なので、アジャイルをやる時に、絶対、スクラム、XPに従う必要がなくて、チームに合う手法でいいと思う。
・チーム全員が初心者（開発者のこと）で、アジャイルするのはちょっと無理と感じられた。少なくでも、ベテランの人が入ってほしい。特に、技術が持っている人
・スクラムをやるため、話しやすい環境が大事と感じた。
GitLab CIとmdbookで本を書いて公開する

mdbookはRust製のGitbookクローンです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30426/5b1eee17-c1e8-7668-9ab1-dbf9c7a6564c.png)

このように左に章立て、右に本文の形式のHTMLが出来ます。Rustのドキュメントの多くはmdbookで生成されているのでRustを書いていると良く見ますね。

[以前の記事](https://qiita.com/termoshtt/items/13965b57c2a4afa85399)で紹介したように、図や数式(MathJax)を追加することができます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/30426/d94d79a2-8dbd-46ff-0f9e-3933bc779e51.png)

今回はこのmdbookで生成したHTMLをGitLabの機能であるGitLab CIを用いて自動的にデプロイするための設定を簡単に行うためのリポジトリを作ったので紹介します。

使い方
------

1. https://gitlab.com/termoshtt/my-first-mdbook をGitLabでフォークする
2. src/以下にあるMarkdownファイルに追記する
3. GitLabにpushする

でHTTPSで生成されたbook形式のHTMLがホストされます。

- Markdownでの数式の書き方は以前の記事を参考にしてください
  - [eom/bookの日本語版を作り始めた](https://qiita.com/termoshtt/items/13965b57c2a4afa85399)
- URLは`https://{username}.gitlab.com/{repository_name}`になるはずです。
  - 実際には左側のSettings > Pagesのタブを見れば正しいリンクがあるはずです
- 初回のデプロイではSSLの証明書の有効化に30分程度(?)かかるはずなので気をつけてください。


手元で生成結果を確認する
-----------------------

書いてる途中で確認するにはmdbookをインストールする必要があります。後述の方法でインストールしたのち、

```
mdbook build
```

で`book/`ディレクトリ以下にHTMLが生成されます。

### バイナリをダウンロードする

GitHubのmdbookのリポジトリのリリースのページでバイナリが配布されているのでそれを使います

https://github.com/rust-lang-nursery/mdBook/releases

tar/zipを解凍すると実行ファイルの`mdbook`が素ではいっているはずです

### cargoでインストールする

Rustの開発環境を整える場合は

```
cargo install mdbook
```

で入ります。ただコンパイルはちょっと重めです。
Safari で開いたページに任意のスタイルシートを適用する

以下は、Safari App Extension を作成して、Safari で開いたウェブページに指定したスタイルシートを自動で適用する方法です。

Safari の機能拡張からもカスタムスタイルシートを設定することができますが、ページごとに異なるスタイルシートを指定することができません。
代わりに Safari App Extension を使用して、ページごとにカスタムスタイルシートを設定することができます。

実行環境は macOS です。

## テスト用に未署名の機能拡張を許可する設定を行う

Safari App Extension を作成・使用するためには開発者の署名が必要となります。
XCode で開発者の設定をしていない場合は、未署名の機能拡張を使用することを Safari の設定で許可する必要があります。
許可は Safari を起動するたびに実行する必要があります。

### Safari の開発者メニューを表示する

1. Safari を起動する
2. メニューから Safari >> 環境設定... を選択
3. 「詳細」タブを選択
4. 「メニューバーに"開発"メニューを表示」にチェックを入れる

### 未署名の機能拡張を許可する

1. メニューから 開発 >> 未署名の機能拡張を許可する を選択
2. パスワードの入力を求められるので入力する

## XCode を起動する

XCode をインストールしていなければインストールし、起動します。

## プロジェクトを作成する

### 事前に決めておくこと

1. プロダクト名 (Product Name)
2. 組織識別名 (Organization Identifier)
3. プロジェクトを保存する場所

### 手順

1. メニューから File >> New >> Project... を選択
2. macOS >> Other >> Safari Extension App をクリック
3. [ Next ] をクリック
4. Product Name: user defined css for www.example.com
5. Organization Identifier: SafariAppExt
6. [ Next ] をクリック
7. ファイルダイアログが表示されるので、プロジェクトを保存する場所を設定
8. [ Create ] をクリック

## CSS ファイルを追加する

1. 左側のペインにて、<プロダクト名> Extension フォルダを右クリック
2. New File... を選択
3. macOS >> User Interface >> Empty を選択
4. [ Next ] をクリック
5. Save As: style.css
6. [ Create ] をクリック
7. [ Use .css ] をクリック
8. style.css がエディタで選択されるので下記の style.css を入力
9. Menu >> File >> Save を選択


````css:style.css
p {
  color: green;
}
````

## 設定ファイルに style.css の設定を追加

1. 左側のペインにて、<プロダクト名> Extension フォルダの `Info.plist` ファイルをクリック
2. `NSExtension` の左にある三角形 ▶︎ をクリックして開く
3. `NSExtension` の右にあるプラス (+) をクリックする
4. テキスト入力モードになるので、`SFSafariStyleSheet` と入力
5. `SFSafariStyleSheet` の `Type` 欄を `Array` に変更する
6. `SFSafariStyleSheet` の右にあるプラス (+) をクリック
7. 追加されたエントリー (`Item 0`) の `Type` 欄を `Dictionary` に変更する
8. 追加されたエントリー (`Item 0`) の左にある三角形 ▶︎ をクリックして開く
9. 追加されたエントリー (`Item 0`) の右にあるプラス (+) をクリックする
10. テキスト入力モードになるので、`Style Sheet` と入力
11. 右側の `Value` 欄に `style.css` と入力

## Safari App Extension を使用するドメインの設定

1. 先ほど `style.css` の設定を追加した `Info.plist` を選択
2. `SFSafariWebsiteAccess` の左にある三角形 ▶︎ をクリックして開く
3. `Allowed Domains` の左にある三角形 ▶︎ をクリックして開く
4. `Item 0` の `Value` 欄にある `*.webkit.org` を削除
5. 代わりに `*.example.com` を入力
6. Menu >> File >> Save を選択

## ビルドと実行

1. 左上の ▶︎ ボタン (Build and then run the current scheme) をクリック
2. アプリケーションが起動するので、[ Open in Safari Extensions Preferences... ] をクリック
3. Safari の機能拡張設定画面が開くので、作成した機能拡張にチェックを入れる

### 再ビルドの際の注意点

再度ビルドを実行する際は、事前に "Clean Build Folder" を実行します。
実行しないと、Safari の拡張機能のページに表示されないようです。

- Menu >> Product >> Clean Build Folder を選択

## 動作確認

1. [http://www.example.com](http://www.example.com) を開く
2. パラグラフの文字色が緑になっていることを確認

## 片付け

"Clean Build Folder" を実行すると、拡張機能は登録解除されます。

- Menu >> Product >> Clean Build Folder を選択

## 参考情報

- [Building a Safari App Extension](https://developer.apple.com/documentation/safariservices/safari_app_extensions/building_a_safari_app_extension)
- [Injecting CSS Style Sheets into a Webpage](https://developer.apple.com/documentation/safariservices/safari_app_extensions/injecting_css_style_sheets_into_a_webpage)

## 補足

### XCode でファイル名の右に M や A が表示される

ファイルを Commit すると消えます。
"You must use Bundler 2 or greater with this lockfile" に対応する


2019年1月4日に bundler の 2.X 系が[リリースされた](https://bundler.io/blog/2019/01/04/an-update-on-the-bundler-2-release.html)．2.X 系の bundler がインストールされている状態で `bundle update` などすると Gemfile.lock の `BUNDLED WITH` が書き換わる．

```bash
$ bundle update
•••

$ git diff
•••
 BUNDLED WITH
-   1.17.3
+   2.0.1
```

bundler 2.X 系で作成された Gemfile.lock ファイルが CircleCI 上で bundle install できないなどが発生する件に対応する．

> You must use Bundler 2 or greater with this lockfile.
![image.png](https://qiita-image-store.s3.amazonaws.com/0/31862/4f70933f-4c6c-8293-fd77-a5d1f8e95dce.png)

# 1. ダウングレードするパターン

## 現在のバージョンをチェック

```bash
$ cat Gemfile.lock | grep "BUNDLED WITH" -A 1
BUNDLED WITH
2.0.1
```

## 旧バージョンで Gemfile.lock を生成しなおす

```bash
$ gem install bundler -v 1.17.3
$ rm Gemfile.lock
$ bundle _1.17.3_ install
```

## 更新チェック
```bash
$ cat Gemfile.lock | grep "BUNDLED WITH" -A 1
BUNDLED WITH
1.17.3
```


# 2. CircleCI 上などで 2.X 系を使えるようにするパターン

- ① `BUNDLER_VERSION` で任意のバージョンを指定
- ② bundler を入れ直す


```yml:.circleci/config.yml
version: 2
jobs:
  build:
    docker:
      # specify the version you desire here
      - image: circleci/ruby:2.6.0-node-browsers
        environment:
          # ①
          BUNDLER_VERSION: 2.0.1

      # Specify service dependencies here if necessary
      # CircleCI maintains a library of pre-built images
      # documented at https://circleci.com/docs/2.0/circleci-images/
      # - image: circleci/postgres:9.4

    working_directory: ~/repo

    steps:
      - checkout

      # ②
      - run:
          name: setup bundler
          command: |
            sudo gem update --system
            sudo gem uninstall bundler
            sudo rm /usr/local/bin/bundle
            sudo rm /usr/local/bin/bundler
            sudo gem install bundler

      # •••

      - run:
          name: install dependencies
          command: |
            bundle install --jobs=4 --retry=3 --path vendor/bundle
```


## 参考

- https://bundler.io/blog/2019/01/04/an-update-on-the-bundler-2-release.html
- https://discuss.circleci.com/t/using-bundler-2-0-during-ci-fails/27411
データベースとPHP

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

#データベースって、まず何？
PHPを勉強し始めてから、データベースと言うものを知りました。
調べたところ、簡単に言うと、電話帳のような多くの情報を整理してくれているところであると理解しました。
確かにデータベースとつなぐことができれば、多くの情報を管理し、簡単に検索でき、編集できます。
便利です。

#PHPとつなぐメリットは？
一番は処理速度です。
PHPdeテキストファイルの中に多数のデータを取り込むよりも、データベースに繋げる方が圧倒的に早いです。
あと、僕的にコードが見やすいと感じました。
データベースをつなぐためには、下のみで可能です。

```PHP
$mysqli::__construct(string $ホスト名, string $ユーザ名, string $パスワード, string $データベース名 [, string $ポート [, string $ソケット]]);
```

テキストファイルの中にデータを入れるとわからなくなりました。

#まとめ
データベースは、必要だなと深く感じた。
M5Stackで名刺モドキを作った

M5Stackを買ったので色々遊んでいるうちに会社の名刺モドキを作った。

## 開発環境
この記事を参考にして環境を作った。
[【心折れずに】MacでM5stackをはじめる - Qiita ](https://qiita.com/hmmrjn/items/2b2da09eecffcbdbad85#step-2-usb%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
ケーブルの上下によって認識しない現象にハマらずに済んだ、ありがたい。

## 作ったもの
デジタル名刺
![m5stack_meishi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/a789b87c-cede-a944-011c-6b709e3043a2.png)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">M5STACKで会社のロゴ、代表、HPのQRコードを表示してみた。<a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> <a href="https://t.co/241HwFyBws">pic.twitter.com/241HwFyBws</a></p>&mdash; ikemura23 (@ikemura_jp) <a href="https://twitter.com/ikemura_jp/status/1109819696373587968?ref_src=twsrc%5Etfw">2019年3月24日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### 使いどころ
他社に自分を紹介する名刺として使うシーンを想定。

M5StackのAボタンを押して会社のロゴをかざしながら
俺「わたくし、ゆめみの○○です」
相手「おお、それが御社のロゴなんですね」

Bボタンを押して代表の顔を表示しながら
俺「これがうちの代表です」
相手「ほう、これまたイケメンですな」

Cボタンを押してQRコード画像を表示しながら
俺「HPをご覧になりたければスキャンしてみてください」
相手「これはありがたい、ググる手間が省けましたわ」

書いてて気付いたけど、名刺なのに自分の名前が載せ忘れてた。。。

## コード

```c

#include <M5Stack.h>

void setup(){
  M5.begin();

  // LCD display
  M5.Lcd.clear();
  // 会社名 画像
  M5.Lcd.drawJpgFile(SD, "/logo.jpg");
}

void loop() {
  M5.update();
  
  // Aボタンは左、Bボタンは真ん中、Cボタンは右
  
  if (M5.BtnA.wasReleased()) {  // Aボタン押下
    // 代表画像
    M5.Lcd.clear();
    M5.Lcd.drawJpgFile(SD, "/daihyo.jpg");
  } else if (M5.BtnB.wasReleased()) {  // Bボタン押下
    // 代表画像
    M5.Lcd.clear();
    M5.Lcd.drawJpgFile(SD, "/mascot.jpg");
  } else if (M5.BtnC.wasReleased()) {  // Cボタン押下
    // QRCode
    M5.Lcd.clear();
    M5.Lcd.qrcode("https://www.yumemi.co.jp");
  } else if (M5.BtnC.wasReleasefor(300)) {   // Cボタン長押し
    M5.Lcd.clear();
    M5.Lcd.drawJpgFile(SD, "/yumemi.jpg");
  }
}
```

## 感想
M5Stackおもしろい！
とりあえずディスプレイに何かを表示しておけば楽しめる。

初めから用意されてるスケッチ例というサンプル？をコピペしてたら簡単に色々試せる。
実装しながら分からないのもアレだが、この言語はなんだろう、C？ Arduino言語？

次は何を作ろうかなー、センサーとか使ってみたい。
夢が膨らみますな。

## 備考
M5Stackで表示させる画像はdraw.ioで320x240サイズのjpgでエクスポートするとよい。
普通のjpgでは表示されなかった。
delete_flg =0 をWHERE文で2回指定してはいけない

<h1>論理削除テーブルを結合するときにハマった</h1>
未熟なものでSQLの組み方でハマりました。
これも備忘録として残しておきます。


例えば、AテーブルとBテーブルを結合させる場面。
条件はユーザーIDが10で、削除されていない(delete_flg=0)カラムが欲しい。

```

$sql = 'SELECT * FROM Aテーブル as a LEFT JOIN Bテーブル as b ON 
　　　　a.id = a.user_id WHERE a.id =10 AND a.delete_flg = 0 AND b.delete_flg = 0';
```
とすると期待する結果が得られない。


```

$sql = 'SELECT * FROM Aテーブル as a LEFT JOIN Bテーブル as b ON 
　　　　a.id = a.user_id　 AND b.delete_flg = 0 WHERE a.id =10 AND a.delete_flg = 0;
```

<b>テーブルを結合させる時点で、delete_flg =0 の条件をつけるべき。</b>
python HackerRankを解くための筋道と知識１

#はじめに
HackerRankでPythonに取り組んでいる中で、不足していた知識や考え方を忘備録として記録します。
なお、この記事はHackerRankの答えを掲載しているものではありません。
初学者のため、間違いがある場合はご指摘いただけるとすぐに修正します。
宜しくお願いします。

#Find the Runner-Up Score!
こちらは、リストの中から二番目に大きいものを抽出するという問題でした。
問題文の詳細は[コチラ](https://www.hackerrank.com/challenges/find-second-maximum-number-in-a-list/problem)

###手順
1．降順に並び替える
2．二番目に大きい値を抽出する際、最大値の被りがあることに注意する。

###必要な知識

#####sort
並び替えをする際には`sort`する。
しかし、基本的に`sort`を使用すると昇順に並び替えられるので、降順にしたい場合は以下のように書く。

```python
リスト名.sort(reverse=True)
```

#####whileとpop
while文とpopを用いることで最大値の被りがあっても二番目に大きい値を抽出できる。
以下で使用するリストは、降順に並んだリストであるとする。

```python
first = リスト名.pop(0)
second = リスト名.pop(0)
while　first == second:
    first = second:
　　second＝リスト名.pop(0)　
```

この文により、最大値が複数ある場合でも二番目に大きい値を抽出できる。

#Nested Lists
二重配列の問題。先ほどと同様に、二番目に低い点数の人をアルファベット順に抽出する。
詳しい問題は、[こちら](https://www.hackerrank.com/challenges/nested-list)

###筋道
1．点数と名前の入ったデータをインプットする
2．重複している点数がないようにする
3．重複のない配列を作成する
4．昇順に並べ替える
5．配列番号が1のものを抽出する
6．抽出したデータが複数ある場合は、複数抽出する。

###知識

#####set,list,sorted
set・・・集合。重複がなくなる
list・・・データを配列として格納する
sorted・・・sortと同じように昇順で並べる。なお、sortと異なる点は新たなリストとして作られるという点である。
これらを用いることで、先ほどの手順の2~5を内包表記で以下に示す。

```python
二番目に低い点数 = sorted(list(set([marks for name,marks in nlist])))[1]
```

内包表記に関して詳しい解説は[こちら](https://note.nkmk.me/python-list-comprehension/)


#####二番目に低い点数のデータをすべて表示する
以下のようにfor文を用いると、指定した点数のデータをすべて抽出できる。

```python
for 名前,点数 in リスト:
   if b == 該当する数字:
   print 名前
```

##### 改行
表示するデータを改行して表示したい場合は以下のように書く。

```python
print ('\n'.join(表示させるデータ))
```

#Lists
問題は[こちら](https://www.hackerrank.com/challenges/python-lists/problem)

###手順
1.要件を満たす関数を作る
2.代入する

###知識
#####挿入
リストに新しいデータを挿入したい場合はinsertを使用する。

```python
リスト.insert(インデックス,オブジェクト)
```
これで、指定したインデックスにオブジェクトを挿入できる。

#Find a string
文字列の中に、指定した文字がいくつあるかを表す問題。
詳しい問題は[コチラ](https://www.hackerrank.com/challenges/find-a-string/problem)

#知識
一致しているものの数を数えるとき、for文とif文を組み合わせると便利

```python
n = 0
for 調べる範囲:
   if 一致条件:
       n += 1
```


#まとめ
たくさん問題を解いていると、徐々に自力で解ける問題も増えてきた。
よりたくさんの知識を吸収してさらなる向上を目指したい。
再度ではありますが、初学者のため間違いがあればご指摘いただけると幸いです。
GCPでWEBサーバー構築を試した（GCE-GCS-SQL）

まずは手を動かして苦手意識をなくそう。ということで
GCE-GCS-SQLの構成でPHPの公開環境を作ってみた。

# はじめに
利用に応じて少なからず課金されます。
お試し後は、作成したリソースの削除をしましょう。
（ほとんどの人は、無料枠に収まるけれども。）

# 決めごと
リージョンとゾーンを決めておこう。これはサーバーを立てる場所のこと。
お試しなら、下記で大丈夫。

[リージョン]us-central1
[ゾーン]us-central1-a


# GCEの作成（コンピューティング・WEBサーバ）

■インスタンス作成
Compute Engineサービスで「VM インスタンス」を作成する。
ここでは、下記を設定。

[名前] bloghost
[ブートディスク]
Debian GNU/Linux 9（stretch）
[ファイアウォール] 
HTTP トラフィックを許可する ON

※記載していない項目については、デフォルトのままで大丈夫。


■起動時のスクリプトを設定
「管理」タブの[起動スクリプト] に下記を設定。
これで各サービスが立ち上がるぞ。

```
apt-get update
apt-get install apache2 php php-mysql -y
service apache2 restart
```

■動作確認
VMインスタンスのIPアドレスを確認。
内部IPアドレスはGCP内の各インスタンス同士でアクセスし合う時に使う。
外部IPアドレスはオンライン公開。

WEBブラウザのURL欄に、外部IPアドレスを入れてみるとアクセスできるはずだ。


# GCSの作成（ストレージ）

■バケット作成
画面右上から
「Google Cloud Shell」を起動。これは、コマンドプロント的なモノだ。

リージョンに応じて変数を作成。
```
export LOCATION=US
```

mbコマンドでMakeBucketsしてみる。
Cloud Shellでは、デフォルトでDEVSHELL_PROJECT_ID環境変数にプロジェクトIDが含まれているのでこれを利用できる。
```gsutil mb -l $LOCATION gs://$DEVSHELL_PROJECT_ID```

■ファイル配置
一般公開されている画像をCloud Storageへコピーしてみる。
```
 gsutil cp gs://cloud-training/gcpfci/my-excellent-blog.png \
my-excellent-blog.png
 gsutil cp my-excellent-blog.png \
gs://$DEVSHELL_PROJECT_ID/my-excellent-blog.png
```

Cloud Storageサービスを開くと、先ほど作成したバケットとファイルが確認できる。

my-excellent-blog.png というオブジェクトがあるので、[一般公開で共有する]をONにするとURLが出力される。
画像であれば、こんな感じでHTMLファイルから読み込むことができるようになるはずだ。
```<img src='https://storage.googleapis.com/gcp-012345689/my-excellent-blog.png'>
```


# Cloud SQL（DBサーバ）

■インスタンス作成
[データベース エンジンの選択] MySQL
[インスタンス ID]任意
[root パスワード]任意
で作成。

[SQLインスタンス] ページで、からIP アドレスをコピーしてメモしておこう。

■ユーザ作成
詳細ページの[ユーザー]タブから「ユーザーアカウントを作成」。
[ユーザー名] 任意
[パスワード] 任意

■通信許可
詳細ページの[承認] タブから「ネットワークを追加」。

[名前]web front end
[ネットワーク] GCEインスタンスの外部IP アドレス/32（例 35.192.xxx.xxx/32）


# 結合
GCEインスタンスからGCSとSQLを呼んでみる。

VMインスタンスの[SSH] をクリックすると、コマンドプロンプトが開く。
nanoエディタで、index.phpファイルを編集。

```
cd /var/www/html
sudo nano index.php
```

```
<html>
<head><title>Welcome to My Blog</title></head>
<body>
<h1>Welcome to My Blog</h1>
<?php
  $dbserver = "※CloudSQLのIPアドレス";
  $dbuser = "※CloudSQLのユーザ名";
  $dbpassword = "※CloudSQLので作成したユーザパスワード";
  
  $conn = new mysqli($dbserver, $dbuser, $dbpassword);
  if (mysqli_connect_error()) {
          echo ("Connection failed: " . mysqli_connect_error());
  } else {
          echo ("Connection succee.");
  }
?>
<img src='※GCSで発行したURL'>
</body>
</html>
```

■動作確認
ウェブサーバーを再起動。
```sudo service apache2 restart```

ブラウザから外部IP アドレスにアクセスすると、
反映されていることが確認できる。
【書評】ゼロ秒思考

#1.書籍の紹介
元マッキンゼーの著者がゼロ秒で思考を整理し、決断を下すためのトレーニング方法を
紹介したハウツー本。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/239109/12b4d9fe-08ce-fd0a-d786-e532dd36edc8.png)

#2.読もうと思った理由
主に以下2点の理由。

　①新サービスの企画書やプロジェクトの計画書等、資料の作成に時間がかかっており、
　　それを改善したかったため。
　②2019年01月から社内の組織変更で業務が別グループとの兼務になったため、
　　効率よく仕事を進めるための気づきやヒントを得たかったため。

#3.書籍の要約(感想)
ゼロ秒思考は筋トレと同じでトレーニングすれば誰でも身につけられる、との言葉が印象的であった。
特に日本社会では上司の顔色や組織の意向を忖度してしまうあまり、思ったことを口に出せずにいることで思考が硬直してしまう。それを解消するために思ったとことメモ書きとしてアウトプットすることですぐに口にだし、思考を整理することができる。
ゼロ秒思考に必要なメモ書きのトレーニング方法は以下の通り。

　①A4用紙横書きで左上にタイトルを書く
　②右上に記載した日付を書く
　③タイトルに対して思いつくことを4～6行の本文として書く
　④本文は1行あたり20～30文字程度
　⑤1ページを1分以内に書く
　⑥1日10ページ書く

本を読んだだけでは意味が無いので効果が得られるか早速実践に移し、結果を改めて報告したいと思います。
messageboxとsimpledialogのまとめ

tkinterで用意しているmesseagebox、simpledialogのまとめです。

#import

まず、tkinter、messeagebox、simpledialogをインポートします。

```messagebox.py
import tkinter as tk
from tkinter import messagebox
import tkinter.simpledialog as simpledialog
```


続いて、小さなウィンドウを表示させない設定をします。

```messagebox.py
root = tk.Tk()
root.withdraw() #小さなウィンドウを表示させない
```

#messagebox

tkinterのmessageboxでは、7つのmessageboxが用意されています。

1. showinfo
2. showwarning
3. showerror
4. askquestion
5. askokcancel
6. askyesno
7. askretrycansel

##showinfo

```messagebox.py
# showinfo
res = messagebox.showinfo("title", "message")
print("showinfo", res)
```
![showinfo.PNG](https://qiita-image-store.s3.amazonaws.com/0/353289/a68b7d11-4a14-030e-b456-279bdb506793.png)

[OK]を押した時の戻り値は`ok`

```
showinfo ok
```

##showwarning

```messagebox.py
# showwarning
res = messagebox.showwarning("title", "message")
print("showwarning", res)
```
![showwarning.PNG](https://qiita-image-store.s3.amazonaws.com/0/353289/2e157946-5c93-0f09-34c7-17d8a1e7f232.png)

[OK]を押した時の戻り値は`ok`

```
showwarning ok
```

##showerror

```messagebox.py
# showerror
res = messagebox.showerror("title", "message")
print("showerror", res)
```
![showerror.PNG](https://qiita-image-store.s3.amazonaws.com/0/353289/7be4ca4b-83f9-f72a-c2cd-a07835cc9e9a.png)

[OK]を押した時の戻り値は`ok`

```
showerror ok
```

##askquestion

```messagebox.py
# askquestion
res = messagebox.askquestion("title", "message")
print("askquestion", res)
```
![askquestion.PNG](https://qiita-image-store.s3.amazonaws.com/0/353289/a5896e8a-f76d-5f03-d777-de5c6d3596a8.png)

[はい]を押した時の戻り値は`yes`
[いいえ]を押した時の戻り値は`no`

```
askquestion yes
askquestion no
```

##askcancel

```messagebox.py
# askokcancel
res = messagebox.askokcancel("title", "message")
print("askokcancel", res)
```
![askcancel.PNG](https://qiita-image-store.s3.amazonaws.com/0/353289/f67d3907-48df-3ba2-b4c2-433a8ce941c2.png)

[OK]を押した時の戻り値は`True`
[キャンセル]を押した時の戻り値は`False`

```
askokcancel True
askokcancel False
```

##askyesno

```messagebox.py
#askyesno
res = messagebox.askyesno("title", "message")
print("askyesno", res)
```
![askyesno.PNG](https://qiita-image-store.s3.amazonaws.com/0/353289/c2cd455a-fcbf-aefd-a2e6-438f197f1fbf.png)

[はい]を押した時の戻り値は`True`
[いいえ]を押した時の戻り値は`False`

```
askyesno True
askyesno False
```

##askretrycancel

```messagebox.py
#askretrycancel
res = messagebox.askretrycancel("title", "message")
print("askretrycancel", res)
```
![askretrycancel.PNG](https://qiita-image-store.s3.amazonaws.com/0/353289/34626d9a-092f-7fbf-6b35-38a08deb6d9a.png)


[再試行]を押した時の戻り値は`True`
[キャンセル]を押した時の戻り値は`False`

```
askretrycancel True
askretrycancel False
```


#simpledialog
ユーザに値を入力させるためのダイアログボックスです。

```messagebox.py
#simpledialog
inputdata = simpledialog.askstring("Input Box", "値を入力してください",)
print("simpledialog",inputdata)
```
![dialog.PNG](https://qiita-image-store.s3.amazonaws.com/0/353289/6b343a6d-061b-6095-cc79-31a7cf77227b.png)

戻り値は`入力した値`
[キャンセル]を押した時の戻り値は`None`

```
simpledialog ABC
simpledialog 123
simpledialog None
```
Nginxにおける各言語ごとのWebアプリケーション導入方法

# はじめに
Nginxにおいて、各言語のWebアプリケーションをどのように導入するか簡単に整理する。
主にNginxにおいてreverse_proxyを設定する、もしくはNginxにmoduleを導入するのいずれかである。

# 言語ごとの導入方法一覧
## Ruby
- reverse_proxy
    - WEBrick(Rails Server) ... 一番簡易だが一般的ではない。
    - unicorn ... 現在の主流はこれ。
    - puma ... Rails5での標準。低速クライアント・マルチスレッド処理に対応しており、今後はおそらくこっちがメイン。
- module
    - Phusion Passenger


## Java
 - reverse_proxy ... tomcatにしても、Springにしてもこの形式で可能

## PHP
 - module
   - fastcgi + php-fpm

## Python
 - module
   - uWSGI

## Perl
- module
  - fcgiwrap
VSCodeが立ち上がらない(Ubuntu18.04.02)

備忘録がてら投稿

#概要
VSCodeをAnacondaのインストーラでダウンロードしたら

*Unable to write program user data.*

とか表示されて起動しなかった

#バージョンなど
- OS:Ubuntu 18.04.02
- Anaconda 4.5.12
- VSCode 1.32.3

#解決策
issueにそのまま解決策があった

>“Unable to write program user data” when invoking VS Code as git editor
https://github.com/Microsoft/vscode/issues/68744

configファイルが破損してるから消してやり直せばいいらしい。以下issueにあったコマンドそのまま。

```
sudo rm -r ~/.code
```
</br>

```
sudo rm -r ~/.vscode*
```
</br>

```
sudo rm -r ~/.config/Code*
```
</br>

issue読めばだいたい解決するいい世の中。
mysqlで連番を1からにリセットする方法

seedデータでデータを入れたいときなどに、試しにDBに入れてみて削除→もう一度入れても前に入れた番号から続いてしまう・・。

例えばid1~3にデータを入れて削除→もう一度入れるとid4~6にデータが入る。

## やりたいこと
DBに再度データを一度入れるときにidが1から入るようにしたい！

## 結論
```
ALTER TABLE `tablename` auto_increment = 1;
```
で簡単にリセットできた。

## 手順
※今回はuserテーブルのnameカラムの連番をリセットしたいとき。

① まずはmysqlに入る。

```
mysql -u root -p
```

②DB名を確認

```
mysql> show databases;
```

③use文でDBを選択
②で出た今回連番をリセットしたいDBを選択。
今回は例としてuser_developmentを使います。

```
mysql> use (DB名)
↓
mysql> use user_development;
```

④連番をリセット！！
カラム名であるnameを入力します。

```
mysql> ALTER TABLE `tablename` auto_increment = 1;
↓
mysql> ALTER TABLE `users` auto_increment = 1;
```

こんな感じになれば成功です。

```
mysql> ALTER TABLE `users` auto_increment = 1;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0
```
WP REST API v2でカスタムフィールドを含む投稿を行う

[Reference](https://developer.wordpress.org/rest-api/reference/)

環境は[WPの公式イメージから作成](https://qiita.com/horikeso/items/cb754f7767ebb4f65078)

WP REST API v2のベーシック認証がうまくいかなかった（[こちら](https://github.com/WP-API/Basic-Auth/issues/35)も試した）のでとりあえずJWTのプラグインを使った。

# [JWT Authentication for WP REST API](https://firxworx.com/blog/wordpress/using-the-wordpress-rest-api-with-jwt-authentication/)の設定


```:.htaccess
# BEGIN WordPress
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
# END WordPress
```

`wp-config.php`に以下を先頭に追加

※末尾だと`JWT is not configurated properly, please contact the admin`

```:wp-config.php
/** JWT Authentication for WP REST API */
define('JWT_AUTH_SECRET_KEY', 'your-top-secret-key');
define('JWT_AUTH_CORS_ENABLE', true);
```

※`your-top-secret-key`は設定する


# トークン取得

```
/wp-json/jwt-auth/v1/token
```

```:リクエストボディ
{
  "username" : "admin",
  "password" : "admin"
}
```

# [投稿](https://developer.wordpress.org/rest-api/reference/posts/#create-a-post)

```
/wp-json/wp/v2/posts
```

```:リクエストヘッダ
Authorization: Bearer <トークン>
```

```:リクエストボディ
{
  "title" : "WP REST API v2",
  "status" : "publish",
  "content" : "content",
  "categories" : "1,2",
  "tags" : "3,4"
  "meta" : {
    "custom_field_name" : "value"
  }
}
```

`meta`は今のところ設定しないと投稿時に登録できない様子
[hookでpostsにmetaを追加する方法](https://stackoverflow.com/questions/46940238/add-post-meta-fields-via-wp-api-v2)で対応する

カテゴリーとタグはドキュメントでは`array`になっているけど`string`でした・・・
カテゴリIDの確認は`/wp-json/wp/v2/categories`
タグIDの確認は`/wp-json/wp/v2/tags`


[Post Types](https://codex.wordpress.org/Post_Types)

今回は投稿なので`rest_insert_post`にした以下の設定を追記

```php:wp-content\themes\XXXXXX\functions.php
add_action('rest_insert_post', function (\WP_Post $post, $request, $creating)
{
    $metas = $request->get_param('meta');

    if (is_array($metas))
    {
        foreach ($metas as $name => $value)
        {
            update_post_meta($post->ID, $name, $value);
        }
    }
}, 10, 3);
```
目隠しパターンを生成するスクリプトを書いてみた

#他人に読まれたくない紙を捨てたい
他人に読まれたくない情報が書かれた紙を廃棄するのに目隠しパターンが出るコロコロスタンプを使用しているのですが、大量に紙を処分したいときに、スタンプのインクが切れたら嫌だと思い、インクジェットプリンターで紙一面目隠しパターンで塗りつぶすスクリプトを考えてみた。

#仕組み
稚拙なスクリプトですが、ランダムな英数字をランダムな方向、位置で書きつぶすJavascriptを書いてみました。
このhtmlをブラウザで開いて目隠ししたい紙をプリンタにセットして１枚に収まるように印刷すればいいはず…

```html
<html>
<body>
  <svg id="picture"></svg>
  
  <script>
    const draw = () => {
      const dens=3.5;
      const h=297*dens;
      const w=210*dens;
      const n=700*dens*dens;
      const color="black";
      const c = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789";
      const box=document.getElementById("picture");
      box.setAttribute("width", w);
      box.setAttribute("height", h);
      box.setAttribute("stroke", color);
      for(let i=0; i<n; i++){
        const letter=document.createElementNS("http://www.w3.org/2000/svg", "text");
        letter.setAttribute("x", Math.random()*w);
        letter.setAttribute("y", Math.random()*h);
        letter.setAttribute("rotate", Math.random()*360);
        letter.textContent=c[Math.floor(Math.random()*c.length)];
        box.appendChild(letter);
      }
    };
    draw();
  </script>
</body>
</html>
```

#課題
* FireFoxで印刷しようとすると、余白とか用紙サイズとかがぴったりいかない。
* 色を変えたいときにスクリプトを触る必要がある。

気が向いたら更新してゆきます。
npm initの-fオプションについて解説。どう変わる？

`npm init`の-fオプションについて解説します。
## npm initの-fオプションについて解説
たまに、技術記事などで
`$ npm init -f`を実行して下さい
と書かれているのを見たことがあると思います。(僕も時々使います。)
これは、通常`$ npm init`した時に出てくる質問に対して、全てエンターを押した場合と同じ様な動作をするコマンドになります。
`npm init`した後の質問に全てエンターを押すつもりの場合は、`$ npm init -f`を実行してね、と伝えた方が楽なのでよく使われます。
以上です。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Ruby 配列展開  *Array

[@koshi_life](https://twitter.com/koshi_life) です。

`*Array` の記法が読めなかったので備忘です。

### 前提
- ruby 2.6

### 読めなかったコード

```.rb
hoge = {name: 'hoge', address: 'hoge@example.jp'}
a = [{name: 'a1', address: 'a1@example.jp'}]
b = [{name: 'b1', address: 'b1@example.jp'}, {name: 'b2', address: 'b2@example.jp'}]
c = [{name: 'c1', address: 'c1@example.jp'}, {name: 'c2', address: 'c2@example.jp'}, {name: 'c3', address: 'c3@example.jp'}]

addresses = [
  hoge[:address],
  *a.pluck(:address),
  *b.pluck(:address),
  *c.pluck(:address)
]
```

ちなみに pluckは
>引数に指定したカラムの配列を返すメソッドです。このメソッドはRailsで使用できるメソッドなので、Rubyのみでは使用することができません。
>[mapとpluck](https://doruby.jp/users/kodama/entries/map%E3%81%A8pluck) より

```
> b.pluck(:address)
=> ["b1@example.jp", "b2@example.jp"]
```

pluck部分は上記リンク,consoleで試して読めたのでコードを簡略化します。

### 読めなかったのは `*Array`

```.rb
hoge = {name:'hoge', address:'hoge@jp'}
a = ['a1@jp']
b = ['b1@jp', 'b2@jp']
c = ['c1@jp', 'c2@jp', 'c3@jp']

addresses = [
  hoge[:address],
  *a,
  *b,
  *c
]
=> ["hoge@jp", "a1@jp", "b1@jp", "b2@jp", "c1@jp", "c2@jp", "c3@jp"]
```

`*`をつけないと

```.rb
addresses = [
  hoge[:address],
  a,
  b,
  c
]
=> ["hoge@jp", ["a1@jp"], ["b1@jp", "b2@jp"], ["c1@jp", "c2@jp", "c3@jp"]]
```

## 結論

`*Array` は配列の要素を展開してくれる便利な記法。

```.rb
# ちなみに以下と同意
> [hoge[:address]] + a + b + c
=> ["hoge@jp", "a1@jp", "b1@jp", "b2@jp", "c1@jp", "c2@jp", "c3@jp"]
```

## 参考

- [Rubyの配列展開 *[a, b, c]](http://yamakichi.hatenablog.com/entry/2016/10/18/232253)
WordPress Docker メモ

[WordPress Docker Official Images](https://hub.docker.com/_/wordpress/)

[network コマンド](http://docs.docker.jp/engine/userguide/networking/work-with-networks.html)

```
docker network create wp_network
docker run --net wp_network -d --name wp-mysql -e MYSQL_ROOT_PASSWORD=password mysql:5.7.25
docker run --net wp_network -d --name wp -p 8080:80  -v /home/docker/guest/app/wp:/var/www/html wordpress
```

DB側にスキーマは作成しておくこと

```
CREATE SCHEMA IF NOT EXISTS `wordpress` DEFAULT CHARACTER SET utf8mb4;
```

8080にアクセスしてインストールを進める
この場合設定は

```
データベース名 wordpress （スキーマ名）
ユーザー名 root
パスワード password
データベースのホスト名 wp-mysql
テーブル接頭辞 wp_ (自由)
```
NavigationViewの区切り線の高さを変える

# :hamburger: はじめに

Design Support Libraryの `NavigationView` を使ってナビゲーションドロワーを実装しており、各グループ毎に表示される区切り線(separator)の高さを調整したいという要望がありました。StyleやAttributeで簡単に実現できるだろうと思っていたのですが、ちょっとハマったのでメモします。

# :hamburger: 実装

`NavigationView` の基本的な実装は [公式のドキュメント](https://developer.android.com/training/implementing-navigation/nav-drawer) を参考に進めます。独自のレイアウトを使いたい場合は

```xml:activity_main.xml
<DrawerLayout>

    <FrameLayout />

    <NavigationView>

        <include layout="@layout/navigation_view">

    </NavigationView>

</DrawerLayout>
```

みたいな感じでよしなにやってくれればいいかと。XMLで設定できる内容を [公式ドキュメント](https://developer.android.com/reference/android/support/design/widget/NavigationView#xml-attributes_1) で確認します。

XML attributes | 内容
--- | ---
itemBackground | メニュー項目の背景を指定したリソースに設定する。
itemIconTint | メニュー項目のアイコンに適用される色を設定する。
itemTextAppearance | メニュー項目のテキストの外見を指定したリソースに設定する。
itemTextColor | メニュー項目のテキストの色を設定する。

と、区切り線に関する設定は表記されていませんでした。次にDesign Support Libraryで `NavigationView` がどのように実装されているのかAndroid Studioを使ってソースコードを追ってみました。

ヘッダー、メニュー項目、サブタイトル、などのレイアウト(ViewHolder)の読み込みは `NavigationMenuPresenter` で行われていました。区切り線(separator)の部分は

```java:NavigationMenuPresenter.java
private static class SeparatorViewHolder extends NavigationMenuPresenter.ViewHolder {
    public SeparatorViewHolder(LayoutInflater inflater, ViewGroup parent) {
        super(inflater.inflate(layout.design_navigation_item_separator, parent, false));
    }
}
```

という実装でした。この読み込んでいる `design_navigation_item_separator.xml` を上書きしてしまえば、ワンチャンいけるのでは :thinking:

before | after
--- | ---
![before](https://user-images.githubusercontent.com/44116633/54879850-5f696080-4e81-11e9-8914-2fb5bf0c17fa.png) | ![after](https://user-images.githubusercontent.com/44116633/54879851-63957e00-4e81-11e9-8b58-40070bc74811.png)

いけました。具体的にはDesign Support Libraryと同名のレイアウトを作成するだけです。

```xml:design_navigation_item_separator.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <View
        android:layout_width="match_parent"
        android:layout_height="8dp"
        android:background="?android:attr/listDivider" />

</FrameLayout>
```

# :hamburger: まとめ

本来であれば `RecyclerView` を配置してゴニョゴニョするのがセオリーだと思うのですが(Stack Overflowでもそのように回答されてました)、 ~~手を抜きたい~~ なるべシンプルな実装を目指した結果こうなりました。なお、あくまでも個人の解決方法であり、これが正しい実装とは限りませんのでご了承ください。また、Design Support Libraryのバージョンを更新した場合、リソースの名称が変更される可能性があるので、都度確認する必要がありそうです。サンプルを [GitHub](https://github.com/toranoko0518/demo-navigation) にアップしておきます。

# :hamburger: どうでもいい話

ナビゲーションドロワーは『ハンバーガーメニュー』とも呼ばれます。由来としては、メニューの横3本線で構成されたアイコンがハンバーガーに見えるかららしいです。

# :hamburger: 参考文献

* Android Developers: https://developer.android.com/reference/android/support/design/widget/NavigationView
簡易的な遅延実行には、Property Get を使おう

## ここでいう遅延実行とは
モジュール内のあちこちで使う変数で、最初に使う前の一回だけ初期化したいというとき、ありますね。
もちろんメインルーチンの先頭ででも初期化を呼べはいいのですが、イベントドリブンな処理ではそれすらあちこちに点在してしまいます。
そんなとき、使う側ではなく使われる側で、いざ使うときにそれが初めての使用だったら初期化する、必要がなければ初期化処理すらしない、といった書き方をすることがあります。

そんな状況で「実際に必要になった時点で行う」処理を、ここでは遅延実行と呼ぶことにします。

## 一時ブックでの例
ここでは、作業用の一時ブックを例にとってみます。
こんな感じの処理を想定しています。

```vb:TempraryBook_v1
Private mBook As New Workbook

Sub Main()
    Dim i As Long
    For i = 1 To 3
        Select Case Rnd()
        Case Is < 0.3
            Call F
        Case Is < 0.6
            Call G
        Case Else
            'NOP
        End Select
    Next i
End Sub 'Main

''' F() や G() は、一時ブックを使用する例で中身に意味はない。
Sub F()
    Debug.Print mBook.Worksheets(1).Range("F1").Address(External:=True)
End Sub

Sub G()
    Debug.Print mBook.Worksheets(1).Range("G1").Address(External:=True)
End Sub
```
なお、これをこのまま実行するとエラーになります。
New Workbook と書いてでも、新しいブックは用意されないので mBook を用意する初期化処理がいるわけです。

そこで、モジュール変数 mBook はプロパティにして、Get の中で初期化がまだだったときだけ初期化処理を行う、とします。

```vb:TempraryBook_v2
Private mpBook As Workbook  '原則として、プロパティ mBook 経由でアクセスする。

Private Property Get mBook() As Workbook
    If mpBook Is Nothing Then
        Set mpBook = Workbooks.Add()
    End If
    Set mBook = mpBook
End Property
Private Property Set mBook(ByVal NewVal As Workbook)
    If mpBook Is NewVal Then
        'NOP
    ElseIf Not mpBook Is Nothing Then
        Call mpBook.Close(SaveChanges:=False)
    End If
    Set mpBook = NewVal
End Property

Sub Main()
    Dim i As Long
    For i = 1 To 3
        Select Case Rnd()
        Case Is < 0.3
            Call F
        Case Is < 0.6
            Call G
        Case Else
            'NOP
        End Select
    Next i
    
    Set mBook = Nothing
    
End Sub 'Main

```


まあこの辺りは、クラスで書けよという声も聞こえてきそうですけれども。

## 応用範囲
他の応用例としては、動作の状況をテキストファイルに書き出すロガーなんかも似た感じで、簡易的に済ませたい場合はファイルの作成・オープンやヘッダ行の書き出しだけ Propery Get でやったりします。
ただ、今回の一時ブックと同様でクローズ処理が要るものはクラス管理した方が扱いが楽です。
とはいえ、初期化処理だけでも必要になった時だけ行いたいという場面はそこそこあります。

(追記) 後処理が不要で初期化処理が必要なものとしては、内容が固定の正規表現 RegExp のインスタンスなんてのもありますね。

そういう対象ごとにクラスに書き起こせばいいのですが、VBA は VB6 の伝統でクラスの管理をするのに階層化もできず作成したクラスがすべて同列に並んでしまうため、あまり数を増やしたくないのが実情です。

なので、初期化処理だけなら今回のようにプロパティにしてしまうのがいい落としどころかなと思います。

## まとめ？
プロパティというとクラスが Public で持ってクラスの内外のインタフェースに使うもの、という印象がありますが、Private でも持てますし標準モジュールでも使うことができます。
変数のように使いたいけれどもアクセスするときにちょっとした判断処理を行いたい、というとき、 Property はなかなか役に立つのではないでしょうか。
jarファイルの概要

プログラミング初学者です。
今回はjarファイルについて概要を知れたのでアウトプットさせていただきます。
#Q1: jarファイルは何で構成されているの？
それを知るためには下記の３単語を知っておく必要がある様に感じました。

①　**クラスライブラリ**: System.out.printlnやRandomなど開発で使える便利な機能のこと
（機能は他にも沢山ある）
②　**クラス**：クラスライブラリをまとめる箱
③　**パッケージ**：クラスをまとめる箱

`Q:なぜクラスまでパッケージでまとめないといけないのか？`
`A:コード内で同じ名前で表現されるクラスを区別するため。`
*例えば、「**java.sql**.Date」と「**java.util**.Date」はソース内では「Date」として表現される。
どちらもクラス名が「Date」だが、パッケージ名によって区別ができる。（太字部分がパッケージ名）*

まとめると、、、、、、

| クラスの中身|パッケージの中身 |jarファイルの中身|
|:-------|---:|:------:|
| クラスライブラリ|クラス|パッケージ|

という様な感じになっています。
jarファイルはパッケージをjar形式で圧縮したものということです。

**jar形式について詳細を知りたい場合は下記のURLを参考にしてください**
https://wa3.i-3-i.info/word14171.html




※間違ってる場所がありましたら恐れ入りますがコメントからご教授いただけると幸いです。※
Jupyter Notebook ファイルのままdiffをとったり、マージしたり出来るツール nbdime

## Jupyter Notebook の問題点
Jupyter Notebook は、ソースコードとアウトプットが一つの ノートブックファイル`.ipynb` で管理・実行することができるので、非常に便利です。しかし、その代償として、`.ipynb` ファイルにはソースコード以外のメタデータやアウトプットデータが含まれる為に、ソースコード部分の差分が非常に分かりにくくなってしまいます。
[jupytext](https://github.com/mwouts/jupytext)等で、`.py`ファイルにエクスポートして diffを取ることも考えられますが、`.py`ファイルが増えてしまい、本来の `.py`ファイルと混じって、これはこれで管理しづらい。
結構困った問題です。

## ノートブックdiffツール **nbdime**

ノートブックのままdiffをとったりマージしたり出来ないかと思っていたところ、**nbdime** というツールでばっちりそれができるらしい。

* Github リポジトリ https://github.com/jupyter/nbdime
* 公式ドキュメント https://nbdime.readthedocs.io/en/latest/index.html

さっそく試してみました。

## **nbdime** で出来ること
1. ブラウザで、2つのノートブックのdiff を左右に並べて表示。
1. コマンドラインでも、ソースコードの部分だけのdiffを表示。つまり、サーバ上でそのままdiffを確認することが出来ます。
1. git と融合して使用。
1. Jupyter Notebook の extention で、ボタン一つで簡単に git diff を実行。
    [Extention のインストール方法](https://nbdime.readthedocs.io/en/latest/extensions.html#installation)
   ![image.png](https://qiita-image-store.s3.amazonaws.com/0/111460/ff989cd7-f730-7450-4d4f-a26c452a03d4.png)

1. マージ機能
  3ペインのマージも可能。 
  [git mergetool として](https://nbdime.readthedocs.io/en/latest/vcs.html#merge-driver)も使えます。
  ![image.png](https://qiita-image-store.s3.amazonaws.com/0/111460/c437a9ad-7d79-f074-7390-d2741040437a.png)
（[公式ドキュメント](https://nbdime.readthedocs.io/en/latest/cli.html#merging)より）
  
## 使用例

### ２つのノートブックのdiff
#### CUI

```shell
nbdiff -s notebook1.ipynb notebook2.ipynb
```
`-s`オプションで、ソースコード(Codeセル）の部分だけdiff を取ることが出来ます。Markdownセルなども含まれます。


```:結果
 (master *+%) $ nbdiff -s notebook1.ipynb notebook2.ipynb 
nbdiff notebook1.ipynb notebook2.ipynb
--- notebook1.ipynb  2019-03-24 20:57:03.681159
+++ notebook2.ipynb  2019-03-24 20:55:42.867497
## modified /cells/2/source:
@@ -1,2 +1,2 @@
-df = pd.Series(np.random.normal(10, 5, 10000))
-df.hist(bins=80)

+df = pd.Series(np.random.randn(10000))
+df.hist(bins=50)
```
ソースコード以外にも、[オプション](https://nbdime.readthedocs.io/en/latest/cli.html#common-diff-options)で メタ情報、アウトプットを含む・含めないを指定することが出来ます。


#### GUI
ブラウザでノートブックを左右に並べて比較します。
今度は `-s`を外して、アウトプットの差分も表示してみます。

```
nbdiff-web notebook1.ipynb notebook2.ipynb
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111460/fd4b5420-6024-d16e-3e2c-66cdec82371d.png)
`-s`オプションをはずしたので、アウトプットの画像が異なっていることもわかります。

### git diff
`nbdime config-git --enable --global` を実行しておくことで、ipynb ファイルに対する `git diff` は、nbdiff で実行することが出来ます。

```:設定適用前のgit_diff例
@@ -20,7 +20,8 @@
    "source": [
     "import numpy as np\n",
     "import matplotlib.pyplot as plt\n",
-    "import hoge\n",
+    "import seaborn as sns\n",
+    "\n",
     "from lightgbm import LGBMRegressor\n"
    ]
   },
```

```:設定適用後のgit_diff例
@@ -1,4 +1,5 @@
 import numpy as np
 import matplotlib.pyplot as plt
-import hoge
+import seaborn as sns
+
 from lightgbm import LGBMRegressor
```
bashで標準出力、エラーを捨てるとか、ファイルディスクリプタ

## 1. bashで標準出力、エラーを捨てるとか、ファイルディスクリプタ
[引用元](http://x68000.q-e-d.net/~68user/unix/pickup?%A5%EA%A5%C0%A5%A4%A5%EC%A5%AF%A5%C8)

### ファイルディスクリプタ
~~~
0:stdin
1:stdout
2:stderr
~~~

### 標準出力と標準エラー出力をまとめて file に書き出す場合
~~~
% command >file 2>&1
 --- 標準出力  ( 1> )はfileに出力し
 --- 標準エラー( 2> )も標準出力と同じものにする
~~~

### 標準エラー出力のみをページャなどで見たい場合は、
~~~
% command 2>&1 1>/dev/null | less
~~~

 `2>&1`の本当の意味は
 2 の出力先を、1 の出力先と同じものに設定する

## 2. 標準エラー出力を捨てる
### 両方を捨てる
~~~
$ ./foo &> /dev/null　　あるいは　　$ ./foo > /dev/null 2>&1
~~~
### stdoutを捨てる,stderrのみ出力
~~~
$ ./foo 1> /dev/null
~~~

### stderrを捨てる,stdoutのみ出力
~~~
$ ./foo 2> /dev/null
~~~

### それぞれを別のファイルに出力
~~~
$ ./foo 1> stdout 2> stderr
$ cat stderr
stderr
$ cat stdout
stdout
~~~

### 両方を同じファイルに
~~~
$ ./foo > both  2>&1　あるいは　　$ ./foo &> both
$ cat both
stderr
stdout
~~~

## 3. 標準エラーをパイプでつなぐ
### 前提
~~~
$ ./stderrput
printf  to stdout
fprintf to stderr
fprintf to stdout
~~~

### 標準出力、標準エラーの両方を、パイプでつなぐ
~~~
$ ./stderrput 2>&1 | less
~~~

### これはNG
~~~
$ ./stderrput &> | less
-bash: syntax error near unexpected token `|'
~~~

### 標準エラーのみ、パイプで
~~~
$ ./stderrput 2>&1 1> /dev/null | less
~~~

### 標準出力のみ、パイプで
~~~
$ ./stderrput | less
~~~

### 考え方
~~~
　2>&1  ---  標準エラー（＃2）を、標準出力（＃1）と同じ出力先へ
　1> /dev/null --- さらに、標準出力（＃1）をヌルへ
~~~
nuxtエラー対処

# Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.

componentの中には一つしかelementが許されないのに複数あるよというエラー文。<div>で全体を囲ってあげよう。

# Syntax Error: Unexpected token, expected {

capturecanvas: {←この{はブロックではなくて、オブジェクト初期化子と読まれます。

ブロックだと読ませたいのであれば、capturecanvas:の後に入るのは式ですから、capturecanvas: function(){のように関数式を書くとよいでしょう。
Vim8でプラグイン管理


重い腰を上げてVim8にしました。ついでにvimrcとプラグインの整理も。

できるだけミニマムにしたかったので、使うプラグインをゴリゴリ削りました。
プラグインの管理も、Vim8自体のプラグイン機能を使ってできるぽいとのことだったので、
今まで使っていたdeinをやめました。

# pluginを登録する
vimの起動時に**自動的に**読み込みたいものは
`.vim/plugin/hoge/start/`
~~遅延ロード~~任意のタイミングで読み込みたいものは
`.vim/plugin/hoge/opt/`
に置きます。
/opt/に置いたものは、`:packadd`で読み込めます。
gitでvimの設定を管理している場合は、submoduleとして登録しておくと便利。

# 遅延読み込み？
ここで少しハマったのですが、
「optに置くものは遅延読み込み」という表現をよく見かけますが、それはちょっと違いまして、、、
（:h plugin にも"lazy"という表現は見当たらない）

vimの起動→vimrcの読み込み→/start/のプラグインの読み込み
となります。
この場合、プラグインに対しての設定をvimrcに書くと、「未知の関数です」と言われて死んでしまうんですね。。。

例えば、deniteのキーマッピングをカスタマイズしたくて

```vim:.vimrc
nnoremap [denite] <Nop>
nmap <C-c> [denite]
if executable('rg')
  call denite#custom#var('file_rec', 'command', ['rg', '--files', '--glob', '!.git'])
  " 〜いろいろ〜 （詳しくはGitHubへ)
endif
```
とか書いていたのですが、「`denite#custom#var`なんて知らねーぞ」と言われました。せやな。

deniteは/opt/に置いて、

```vim:.vimrc
packadd denite.nvim
nnoremap [denite] <Nop>
nmap <C-c> [denite]
if executable('rg')
  call denite#custom#var('file_rec', 'command', ['rg', '--files', '--glob', '!.git'])
  " 〜いろいろ〜
endif
```
としてあげたらいけました。やったね。

# 余談
整理のついでにいろいろやってみた。
- NERDTree→denite
- ターミナルや`:!`でrg(grep)→deniteでrg
- tigでGit操作→vim-fugitive
など。

現場からは以上です！

#リンク集
[.vimrc](https://github.com/hattys2/dotfiles/blob/master/.vimrc)
[dotfiles](https://github.com/hattys2/dotfiles)
[Twitter](https://twitter.com/satomi_col)
FPGAボード　Ultra96について調査中

FPGA を使えるARMのSoCボード Ultra96について調査中


https://japan.xilinx.com/products/boards-and-kits/1-vad4rl.html

- [はじめてのUltra96　　FPGAのはじめかた(2018～2021年版)](https://qiita.com/basaro_k/items/357670af9c7d1b2e4eaf)
- [Ultra96開発ボードでXilinx Zynq UltraScale+ MPSoCを手軽に評価](https://www.avnet.com/wps/portal/japan/products/product-highlights/ultra96/)
- [Ultra96 PYNQで自前DNNを動かしたい](https://qiita.com/yka2ki/items/6b01f56006f089f072ad)
- [Ultra96-PYNQを自分でビルドする](https://qiita.com/okuhata/items/44b279d266191273885d)

- [AvnetのUltra96を買ってみた](https://www.tech-diningyo.info/entry/2018/12/24/154145)
- [Ultra96 Linux で MIPI カメラから画像を取得する (セットアップ編)](http://proc-cpuinfo.fixstars.com/2019/01/ultra96-linux-mipi-camera-setup/)
- [Ultra96](https://www.sweetcafe.jp/?*20180704-214319)
- [「Ultra96持参ワイワイガヤガヤ会」](https://blogs.yahoo.co.jp/verification_engineer/71632865.html)
- [Interface 2019年1月号　小型リアルタイム組み込み人工知能【PDF版】](https://cc.cqpub.co.jp/lib/system/doclib_item/1198)
    に以下の記事があります。
【第3部　最強FPGAボードで人工知能カリカリ画像認識】
64ビットCortex-A/GPU/FPGAチップ搭載で3万円
第1章　組み込み人工知能にピッタリ!最強Arm FPGAボード「Ultra96」
開発環境の準備からLinux&My回路生成まで
第2章　最強ArmコアFPGAボードUltra96の基本的な使い方


Youtube [【最強FPGAボード】Ultra96ボードでYOLOを高速化](https://www.youtube.com/watch?v=cLWSvqKNTFY)

Youtube [【最強FPGAボード】Ultra96ボードを使ったインベーダーゲーム](https://www.youtube.com/watch?v=ZSFjwlUlTeM)

Youtube [【Ultra96ボードの新AI】DeePhiの紹介](https://www.youtube.com/watch?v=IUHsJ5ec9SA)


SlideShare [Good Arm FPGA Board Ultra96 and Google AI YOLO](https://www.slideshare.net/If_CQ/good-arm-fpga-board-ultra96-and-google-ai-yolo)

SlideShare [Ultra96ボードでYOLOを高速化](https://www.slideshare.net/HiroyukiOkuhata/ultra96yolo) 
>Ultra96で実行
YOLO v3	19.4秒
YOLO v3 tiny 1.03秒

やはり、ネットワークの構造の規模が、処理時間のなり続けている。

このスライドで示しているモデルでは、「浮動小数点の行列演算をPLでオフロード」するものである。



github [Ultra96-yolo](https://github.com/minghuang81/Ultra96-yolo)


SlideShare [NEONによるYOLO高速化](https://www.slideshare.net/HiroyukiOkuhata/ultra96yolo) p.21


[tinier-YOLO](https://github.com/Xilinx/QNN-MO-PYNQ/tree/master/tests/Test_image/tinier-yolo)

---
## 追記

Xilinxのgithubページで各種　深層学習をUltra96 のデバイスで実装した時にどれだけのレイテンシーとスループットが出るのかを記している。



https://github.com/Xilinx/AI-Model-Zoo
「Click here to view details」とある部分をクリックすると、各種のモデルでのレイテンシ、end to end のスループットをみることができる。

yolov3の各種モデルもあるし、
 face_landmark
　Openpose_pruned_0_3
もある。

### XILINXのFPGAを使って画像処理を加速させたいのなら

https://github.com/Xilinx/Vitis_Libraries


YoloV3 の例
https://github.com/Xilinx/Vitis-AI/blob/master/Vitis-AI-Library/yolov3/test/test_yolov3.cpp

---
追記

[第2回AIエッジコンテストからFPGA実装を考えてみる](https://lsifrontend.hatenablog.com/entry/2019/12/19/010722)

![](https://cdn-ak.f.st-hatena.com/images/fotolife/k/kocha2012/20191219/20191219005957.png)
>また、こちらの図は横軸が演算コスト、縦軸が ImageNetのTop-1の認識率になります。
円グラフはパラメータ数になります。
理想は 認識率が高く 演算コストが低く パラメータ数が小さいものになるかと思います。

上記のリンク先から　引用
--
追記
NNgen
SlideShare [DNNのモデル特化ハードウェアを生成するオープンソースコンパイラNNgenのデモ](https://www.slideshare.net/shtaxxx/2019-1112-fpgax-nngen)

https://github.com/NNgen/nngen