OmniAICreator/Qiita-1.07M huggingface dataset:
Go構造体の`json:hoge`の正体を探る


# TL;DR

```go:
type Person struct {
    Name string `json:"name"` 
}
```

- `` `json:"name"` `` は構造体のタグ
- `reflect.TypeOf(Person).Field(0).Get("json")`で取り出せる！

# はじめに
Go言語でjsonを扱うとき、構造体定義にjsonのフィールド名を書くと思います。

```go:
type Person struct {
	Name    string `json:"name"`
	Age     int    `json:"age"`
	Address string `json:"address"`
}
```

おまじないと思って深く考えず使っていましたが、

- そもそも`` `json:"name"` ``って何？
- ただのコメント？
- jsonのためだけの特別構文？

という疑問がわいたので調べてみました。

# json:hoge は構造体のタグ
公式ドキュメントに早速答えがありました。~~ちゃんとふだんから読みなさい~~

[The Go Programming Language Specification - The Go Programming Language](https://golang.org/ref/spec#Tag)

> A field declaration may be followed by an optional string literal tag, which becomes an attribute for all the fields in the corresponding field declaration. An empty tag string is equivalent to an absent tag. The tags are made visible through a reflection interface and take part in type identity for structs but are otherwise ignored.
> 
> フィールド宣言の後にはオプションで文字列リテラルのタグを付けることが可能で、これはフィールド宣言に対応する全てのフィールドの属性となります。空文字列のタグはタグ無しの場合と同等です。タグはリフレクションインターフェースにより可視化され、構造体の型の一意性[^1]に関与しますが、それ以外の場合は無視されます。
> （日本語は拙訳）

`` `json:"hoge"` ``は構造体のタグであり、もともとGo言語にある構文を使っている(json用の特別なものではない)ことが分かります。


# タグの取り出し方
ドキュメントの通り、タグは`reflect`を使って取り出すことができます。

```go:
import (
	"fmt"
	"reflect"
)

type Person struct {
	Name string `my name`
	Age  int    `Don't look at this!`
}

func main() {
	person := Person{Name: "Taro", Age: 23}

  // リフレクションで型情報取得
  personType := reflect.TypeOf(person)
	for i := 0; i < personType.NumField(); i++ {
    // タグを取得
    tag := personType.Field(i).Tag
    fmt.Println(tag)
	}
}
```

```:result
my name
Don't look at this!
```

## タグ内のキー
これだけでも便利ですが、タグを`key:"value"`の形式で書くことで複数の属性を持たせることができます。キーに対応する値は`Tag.Get(key)`で取り出せます。
`encoding/json`はタグ中の`json`キーを参照していたのですね。

```go:
import (
	"fmt"
	"reflect"
)

type Person struct {
	Name    string `json:"name" `
	Age     int    `json:"age"`
  // 他のキーも定義
	Address string `json:"address" description:"where he lives" country:"Japan"`
}

func main() {
	person := Person{Name: "Taro", Age: 23, Address: "Tokyo"}

	personType := reflect.TypeOf(person)
	fmt.Println(personType.Field(0).Tag.Get("json")) // name
	fmt.Println(personType.Field(1).Tag.Get("json")) // age
	fmt.Println(personType.Field(2).Tag.Get("json")) // address
	// 他のキーも参照可能！
	fmt.Println(personType.Field(2).Tag.Get("description")) // where he lives
	fmt.Println(personType.Field(2).Tag.Get("country"))     // Japan
}
```

実際に`json.Marshal`を読んでみると、（呼び出しを追うのが大変ですが）`Tag.Get("json")`でフィールド名を取り出す処理が確認できます。

[Marshal定義箇所](https://golang.org/src/encoding/json/encode.go#L158)

[フィールド名取り出し処理](https://golang.org/src/encoding/json/encode.go#L1229)


# タグを利用するライブラリ
json以外にもxml, yaml等色々なパッケージで利用されているみたいです。上手く活用していきたいですね！

[Well known struct tags · golang/go Wiki · GitHub](https://github.com/golang/go/wiki/Well-known-struct-tags)


[^1]: `type identity`は2つの型を同一視する条件のようです([参考](https://golang.org/ref/spec#Type_identity))。訳語が既にあったらコメント等で教えていただけるとありがたいです。
C言語の#define文マクロをC++のTemplateか何かにする方法

MISRA C まとめ #include <misra_c.h>
https://qiita.com/kaizen_nagoya/items/f1a79a7cbd281607c7c9

C puzzle bookで出力マクロ

```c:misra_c.h
#define PR(a,b) (void)printf(" "#a  " = %" #b "=%x\n", a,a)
```

をC++のTemplateで書く方法がないかこの２年ほど考えている。

考えているだけで、手が動いていないのが敗因。

まだ名案が浮かんでいない。

C++のコーディング標準で、Cのマクロは使わずに、できるだけTemplateを使うように誘導しようとしてきた。

MISRA-C 2008 では、
「Rule 16-0-4 Required Function-like macros shall not be defined.」
と定義している。

しかし、＃、＃＃は必ずしもうまくいかないのかもしれない。

「Rule 16-0-6 Required In the definition of a function-like macro, each instance of a parameter shall be enclosed in parentheses, unless it is used as the operand of # or ##.」

# Cパズルブック
改訂版,  Alan R. Feuer/アラン・R. フューアー   2000-12
<img width="200" alt="51QQZNVK6JL._SX374_BO1,204,203,200_-3.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/af2b3374-0e92-7fcf-b893-7f86d25e79d5.jpeg">
https://www.amazon.co.jp/dp/4877830294/
https://bookmeter.com/books/1357557
https://booklog.jp/item/1/4877830294


>C言語教育の際に、このパズルブックを必ず解いてもらっている。
サンプルを見て、結果が何になるかを予測しれもらい、
実際にコンパイルして結果を見て、なぜ、予測と違うかを確かめてもらっている。
全問正解したのは、いまだに誰もいない
＃include <me>
つまり、Ｃ言語の間違えやすいところを、パズル形式で解説しているため、
Ｃ言語の初心者から、上級者と自分では思っている人まで、
幅広く利用するとよい本である。
ポインタ、構造体の間違えやすい点を示すよい教材であると考え、
１０年以上、紹介してきて評判もよい。
仕事でＣ言語を利用することがあるなら、１度は解いてみてください。

C言語/C++に対する誤解、曲解、無理解、爽快。
https://qiita.com/kaizen_nagoya/items/3f3992c9722c1cee2e3a

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
db2 for i のテーブルを JSON 形式で引っ張る

# db2 for i のテーブルを JSON 形式で引っ張る
いつ実装されたかもう忘れましたが、周りの環境もそれなりにバージョンが上がってきたので、そろそろ使えそうな`db2 for i`で直接JSONを引っ張るSQLが、何だったか調べてみました。
アプリ側でやってしまっているので、今後用途があるかは判りませんが、パフォーマンス面で有利だったりすれば使うかもしれません。

[Generating JSON data](https://www.ibm.com/support/knowledgecenter/ja/ssw_ibm_i_72/sqlp/rbafyjsonpublishing.htm)

```sql

-- レコードのJSON化
select json_object (
    'ID' value code, 
    'NAME' value trim(name)
)
from PHPDEMO.EMPL
LIMIT 5
;

```
![2020-08-11_204057.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100029/f21a620b-d11a-5068-77f3-2dedd4cec429.png)


```sql
-- レコードのJSON化→配列化
select json_array (
    json_object (
        'ID' value code, 
        'NAME' value trim(name)
    ) 
) as JSON
from PHPDEMO.EMPL
LIMIT 5
;

```
![2020-08-11_204242.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100029/cec345c7-fa7d-bb12-b527-e9ce6c8f4772.png)


```sql
-- テーブルのJSON・配列化
select json_arrayagg (
    json_object (
        'ID' value code, 
        'NAME' value trim(name),
        'DESC' value trim(DESC) absent on null
    ) 
) as JSON
from PHPDEMO.ITEM
LIMIT 5
;

```

![2020-08-11_204308.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100029/9d88f508-3277-b175-a07a-cb3c546145af.png)
Rails datetime_fieldでの取得で「有効な値を入力してください」とエラーが出た時の対処法

# エラー発生

Railsで投稿フォームを実装していた時にPCでは問題なく動作していたのですが、

なぜかスマホで使おうとするとエラーが出る部分があったので書いておきます。


```ruby:new.html.erb
<%= form_for @ride, method: :post do |f| %>
    <h1>新しいライドを投稿しよう！</h1>
    <label>タイトル</label>
    <p><%= f.text_field :title %></p>
    <label>予定日</label>
    <br />
    <%= f.datetime_field :sch_datetime %><br />
    <br />
    <input class="btn btn-primary" type="submit" value="投稿">
  <% end %>

```

```ruby:config/initializers/time_formats.rb
Time::DATE_FORMATS[:datetime] = '%Y年%m月%d日 %H時%M分'
```

```ruby:config/locales/application.rb
class Application < Rails::Application
    config.load_defaults 5.2
    config.i18n.default_locale = :ja
    config.assets.paths << config.root.join("vendor/assets/javascripts")
    config.assets.paths << config.root.join("vendor/assets/stylesheets/")
    config.action_view.embed_authenticity_token_in_remote_forms = true
    config.time_zone = 'Tokyo'
end
```

最初に記述していたのはこんな感じでdatetime_fieldを使うことで日時をまとめて取得できるようにしていました。

この方法でPCでは全く問題なく動作しているのを確認していたのでこの状態でデプロイしたのですが、

ふとスマホで動作確認しようと思い触ってみると投稿しようとすると日時の部分で<br><br>

**「有効な値を入力してください」とエラーがでて投稿できませんでした。。。** <br><br>


原因はなんだろう？

と考えてみましたがPCで正常に動作しているのでコードのミスではないと推測しました。

スマホとPCで入力する時のフォームも変化しているのでdatetime_field自体に問題がありそうだな〜と

思ったのでdate_fieldとtime_fieldに分けて書いてみることにしました。

```ruby:new.html.erb
<%= form_for @ride, method: :post do |f| %>
    <h1>新しいライドを投稿しよう！</h1>
    <label>タイトル</label>
    <p><%= f.text_field :title %></p>
    <label>予定日</label>
    <br />
    #ここから
    <%= f.date_field :sch_datetime %><br />
    <br />
    <%= f.time_field :sch_datetime %><br />
　　#ここまで変更
    <br />
    <input class="btn btn-primary" type="submit" value="投稿">
  <% end %>
```

この状態で動作確認してみると無事問題なく動作しました！
Raspberry Pi / LXDE / raspi-config で GUI autologin 設定を行ってもうまくいかない場合

ほぼ自分のための備忘です。

##概要
Raspberry Pi / LXDE / raspi-config で GUI autologin 設定を行ってもうまくいかない場合、以下を実行してみる。
```$ sudo dpkg-reconfigure lightdm```
そして再起動する。

##参考
https://www.raspberrypi.org/forums/viewtopic.php?t=180859
「Bonfire Frontend #6」参加まとめ 

# はじめに

[Bonfire Frontend #6](https://yj-meetup.connpass.com/event/181363)の内容を私的にまとめます。

# Reactを使ったYahoo!地図の技術刷新への挑戦 by 一円 真治さん

[Yahoo!地図のPC版](https://map.yahoo.co.jp/blog/archives/20200330_map_pcverup.html)を[React](https://ja.reactjs.org/)に刷新する話でした。歴史が長いことからレガシー技術が蓄積され、追加の実装が困難になってきたことなどの背景があるようです。地図に関しては新たに[Mapbox](https://www.mapbox.com/)を用いたものに移行したとのこと。
ちなみに、サーバーサイドは[Express](https://expressjs.com/ja/)を用いており全体的に[Node.js](https://nodejs.org/ja/)を用いた実装になっているようです。

課題として残っていることとして、SEOの観点からSSRを今後は検討したり、[cypress](https://www.cypress.io/)を使ったE2Eテストなどがを行っていくとのこと。

# Yahoo! BEAUTY パフォーマンス改善とCore Web Vitals対応について by 松本 華歩さん

Yahoo!ビューティーのパフォーマンス改善のために[Lighthouse CLI](https://www.npmjs.com/package/lighthouse)を用いた計測を定期的に行っているといった話や、[Core Web Vitals](https://ferret-plus.com/15951)というUX向上のための新たな指標への取り組みについての話について行われました。
Core Web Vitalsの計測については[Next.js](https://nextjs.org/)のメソッドを用いた計測を行っているとのこと。

例として、CLSへの対応として画像読み込み中のUIを作成したり、LCP対応としてCSSのセレクタ削減などを行ったようです。

パフォーマンス改善のために*Lighthouse**などを使った数値的な計測を行うと定量的な評価ができて良さそうです。

# 広告管理ツールのプロダクト刷新・改善 by 小川 健史さん

広告管理ツールのUIの刷新についての話でした。ここではPJに**スクラム開発**を取り入れて行ったとのこと。
スプリント（ここでは２週間）ごとに期間を区切っての開発を行うことで、そのときわかっている範囲で最小のものを作っていくという進め方を行った。結果的には大きな手戻りが発生することがなかったとのことです。
また、PRのレビューコスト削減のためにレビュアーを２人体制としたり、lintの導入を行うなどの工夫をしたようです。

細かくリリースを続けることによって、都度改善を行えるのがスクラム開発の利点かと思いました。

# PayPayモール 速度改善に挑んだ日々 by 清土 伸康さん

ここでは主に速度改善の話がされました。開発には**ドメイン駆動設計**を取り入れていて、機能の拡張などに対応しやすくなっているとのこと。

速度改善のためには以下のような取り組みを行ったとのこと。

* 表示画像をプリロードさせる
* 初期表示（FV）をSSRする
* AMP Optimizerの使用
* IaaSからCaaSへの移行

最終的には１秒以上の削減に成功したようです。
Spring bootでBeanを挿入する方法（@RequiredArgsConstructor ）

# Spring bootでBeanを挿入する方法
- ＠Autowired
- setter
- コンストラクタ


# コンストラクタを使おう
コンストラクタを使う場合は「@RequiredArgsConstructor」をクラスに付けて挿入してもらいたい**フィールドをfinal**で宣言するだけです。

```java

@RequiredArgsConstructor // finalフィールドのコンストラクタを生成する
@Service
public class PostsService {
    // finalフィールドで宣言する
    private final PostsRepository postsRepository;

    @Transactional
    public Long save(PostsSaveRequestDto requestDto) {
        return postsRepository.save(requestDto.toEntity()).getId();
    }
}
```
**@RequiredArgsConstructorアノテーションはfinalフィールドに対してインスタンスを挿入してくれます。**

# @RequiredArgsConstructor使う理由


コンストラクタを使わずにアノテーションを使う理由は以下となります。


- 該当クラスの依存性の関係が変更されるたびにコンストラクタのコードを続けて修正するめんどくさいことを解決するためです。
- Lombokアノテーションがあれば該当コントローラに新しいサービスを追加したり、既存コンポーネントを削除したりなどの状況が発生してもコンストラクタのコードは触らなくても済ませます。
AtCoder Beginner Contest 165 A問題「We Love Golf 」解説(Python3,C++,Java)

Ruteです。
>AtCoder Beginner Contest 165 A問題「We Love Golf」の解説を行います。

>問題URL:
https://atcoder.jp/contests/abc165/tasks/abc165_a

#問題概要
(問題文を簡潔に表すと以下の通りです)
$A$以上$B$以下の整数の中に$K$の倍数が存在するかを判定せよ。
存在する場合は`'OK'`
存在しない場合は`'NG'`と出力せよ。

##制約
・入力は全て整数
・$1 \leq A \leq B \leq 1000$
・$1 \leq K \leq 1000$

#解法1(ループ)
この問題においてまず1つ目に思いつく解法は$(A,B)$の範囲の中に$K$の倍数が含まれているかを<b>for文のループ</b>で全通り調べるというものです。計算量は、$O(B)$になります。

#解法2(B以下の最大のKの倍数を求める)
問題文は、<b>$B$以下の最大の$K$の倍数が、$A$以上であるか</b>　というように言い換えることも出来ます。よってこれを満たしているかを条件分岐で判定することでACすることも可能です。計算量は判定だけなので$O(1)$ですが制約が小さいのでこのようなことをする必要はありません。

解き方が分かりやすいのは解法1の方なので、解法1の方での解答例をこの後示します。

以下、Python3,C++,Java　それぞれの解答例です。

#各言語解答例
<details><summary>Python3での解答例</summary><div>

```{ABC165A.py}
K = int(input())
A,B = map(int,input().split())
flag = 0
#flagはフラグ関数(Kの倍数が存在したかどうか)
for i in range(A,B+1):
#(A,B)だとA以上B-1以下までを調べてしまうので注意！！
  if i%K == 0:
    flag += 1
    print("OK")
    break
if flag == 0:
  print("NG")
```


</div></details>

<details><summary>C++での解答例</summary><div>

```{ABC165A.cpp}
#include<bits/stdc++.h>
using namespace std;
int main(){
  int k,a,b;
  cin >> k;
  cin >> a >> b;
  int flag = 0;
  for (int i = a; i <= b; i++){
    if (i%k==0){
      flag++;
      cout << "OK" << endl;
      break;
    }
  }
  if (flag == 0){
    cout << "NG" << endl;
  }
}
```


</div></details>

<details><summary>Javaでの解答例</summary><div>

```{ABC165A.java}
import java.util.Scanner;
public class Main{
  public static void main(String[] args){
    Scanner scan = new Scanner(System.in);
    int k = scan.nextInt();
    int a = scan.nextInt();
    int b = scan.nextInt();
    int flag = 0;
    for (int i = a; i <=b; i++){
      if (i%k==0){
        flag++;
        System.out.println("OK");
        break;
      }
    }
    if (flag == 0){
      System.out.println("NG");
    }
  }
}
```


</div></details>
削除機能の追加方法

削除機能の追加の備忘録です。



# 設定手順
①　ルーティングの設定　
  ・httpメソッド 「delete」

②削除ボタンの作成　→ビューファイルの変更
　・条件の指定に注意。（例：ログインユーザかつ投稿したユーザ❓）
　

③コントローラのアクション作成
　・「destroy」メソッドの定義。
　・削除権限を考える。例は②と同様。

④削除後のビューファイルの作成。
　・コントローラのアクションが「destroy」なので、ファイル名は「destroy」をつける。
　・トップページのURL作成。
Color checker のメモ


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

# Grayscale chart

最下段.

xyY の Y(linear(のはず)) は

90.0 -> 59.1 -> 36.2 -> 19.8 -> 9.0 -> 3.1

となっている. 比率としては 0.65x -> 0.61x -> 0.54x -> 0.45x -> 0.344x

となっている.

* 19 White と 24 Black とは 30 倍の開きがある.
  * black 30, white 900 とすると, RAW で最低 10 bit あるとちょうどよさそう. カメラで撮影するときは (RAW 値の) histogram がうまく全体をカバーするのを確認する.
Teachable Machineで学習したデータをNode.jsでシンプルに利用する

# いい感じのサンプルがなかった
[node-red](https://www.npmjs.com/package/node-red-contrib-teachable-machine)や[enebular](https://enebular.com/)とはTeachable Machineの連携が結構あったり、フロントエンド側ばかりたったので、Node.jsで画像ファイルを読み込んで判定するシンプルな実装をメモ

https://www.npmjs.com/package/@teachablemachine/image
ここもやはりフロントエンドのサンプルしかなくて…

https://www.tensorflow.org/js
tensorflowをそのまま利用しようとも考えたけど、もっとTeachableMachineに特化して使いやすくできるのでは…

## 2020年11/30追記
https://www.npmjs.com/package/@sashido/teachablemachine-node

いい感じのライブラリありました。

# インストールしたもの

- @teachablemachine/image: 0.8.4
- @tensorflow/tfjs: 2.1.0
- canvas: 2.6.1
- jsdom: 16.4.0

```sh
npm i @teachablemachine/image @tensorflow/tfjs canvas jsdom
```

# ソースコード

```js
const { JSDOM } = require('jsdom');
var dom = new JSDOM('');
global.document = dom.window.document;
global.HTMLVideoElement = dom.window.HTMLVideoElement;
const canvas = require('canvas');
global.fetch = require('node-fetch');

const tmImage = require('@teachablemachine/image');
const fs = require('fs');

// https://teachablemachine.withgoogle.com/
// ここでエクスポート、クラウドにモデルをアップロードした後に取得できる
const URL = '{{URL}}';

async function init() {
  const modelURL = URL + 'model.json';
  const metadataURL = URL + 'metadata.json';
  // モデルデータのロード
  const model = await tmImage.load(modelURL, metadataURL);

  // クラスのリストを取得
  const classes = model.getClassLabels();
  console.log(classes);

  // 同じフォルダ内の画像を読み込む 今回は自分の顔画像
  const image = await canvas.loadImage('ono.png');

  // 読み込んだ画像で判定してみる
  const predictions = await model.predict(image);
  console.log(predictions);
}

init();
```

実際実装してみたらフロントエンド前提のものでちょっとスマートじゃない。
もしかしたらアップデート待ちでいいのかも

## 出力結果

[![Image from Gyazo](https://i.gyazo.com/76caf18c2e13d0a3a16c9009fe14d295.png)](https://gyazo.com/76caf18c2e13d0a3a16c9009fe14d295)

「おの」は自分の顔

一応成功しました！
TypeORM with PostgreSQLでTruncate Cascadeしたい

# 背景
TypeORMを使った開発でテストを作成しようとした時、外部キーありのテーブルのtruncateをしたかった。
なお、環境は下記です。

```
Postgresql: v12.3
TypeOrm: v0.2.25
```

# Truncate Cascadeの実行
PostgreSQLでは、Relationがあるテーブルをtruncateしようとすると、

```
 cannot truncate a table referenced in a foreign key constraint
```
と、外部キー制約あるからtruncateできねえよって怒られます。
まあ、truncateはテーブルのデータ情報を取得しにいかずに消すので、そりゃそうだよねと。
だから、deleteよりも高速で消せるわけですし。

まあ、でもテストだしいらないデータは消したいよねってことで、強制的に消そうとした時に下記のように、CASCADEをつけると参照しているテーブルのデータを含め全部消せます。

```sql
# TRUNCATE [スキーマ.テーブル名] CASCADE;
```

で、TypeORMでも簡単にできればいいな〜と思って調べてみたところ、tuncateはclearメソッドでできることが分かったのですが、clearメソッドにはCASCADEオプションはなかったorz

仕方ないので、下記のようなコードを書いて一旦対応できるようにしてみました。

```javascript
export const truncateTestData = async (tableNameList: string[]) => {
  const connection = await getConnection();

  for (const table of tableList) {
    // Entity Objectは、keyがテーブルの名前、valueがそのテーブルのEntityを指してる。
    const tableMeta = connection.getMetadata(Entity[table]);

    await connection
      .getRepository(Entity[table])
     // tableMeta.tablePathに、schema.tableNameの情報が入ってる
     // ex) public.users
      .query(`TRUNCATE ${tableMeta.tablePath} CASCADE;`);
  }
};
```

一旦、上記でしのいだけど、[そのうち](https://github.com/typeorm/typeorm/pull/5063)なんとかするつもりはありそう。

# 結論
TypeORMでは、TRUNCATE CASCADEはできなそうだったんで、どうしてもやりたかったらメタデータとか取得しながらやるしかないかも。でもそのうちなんとかなりそう。
CircleCIでswagger-uiをartifactに入れたい

# 概要
できるだけ余計なものを入れずに、Artifact上でスキーマ定義が見えるようにしたい。

# やり方

まず`schema/swagger.yml`にスキーマ定義がされてるとします。
そしたら`schema/index.html`を作成します。

```schema/index.html
<html>
    <head>
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swagger-ui-dist@3.31.1/swagger-ui.css">
        <script src="https://unpkg.com/swagger-ui-dist@3.31.1/swagger-ui-bundle.js"></script>
        <script>
          function render() {
            var ui = SwaggerUIBundle({
              url:  `swagger.yml`,
              dom_id: '#swagger-ui',
              presets: [
                SwaggerUIBundle.presets.apis,
                SwaggerUIBundle.SwaggerUIStandalonePreset
              ]
            });
          }
        </script>
    </head>
    <body onload="render()">
        <div id="swagger-ui"></div>
    </body>
</html>
```

CircleCIで`schema/index.html`と`schema/swagger.yml`をArtifactに入れれば完了です。
（ディレクトリのなかにそれしかなければディレクトリごとあげちゃえばOK）

```.circleci/config.yml
  ...
  store_schema:
    steps:
      - checkout
      - store_artifacts:
          path: schema
  ...
```

これで余計な依存を作らずにHTMLファイル1つ足すだけで動作させることができます。
LaravelのUnitテストでRefreshDatabaseを使ったらSAVEPOINT trans2 does not exist が出た話


## 現象
Laravelを利用した環境で通常のケースではTransactionも機能しており問題なかったが、RefreshDatabaseを用いたPHPUnitでの実行ではエラーが発生していた。

```
Doctrine\DBAL\Driver\PDOException : SQLSTATE[42000]: Syntax error or access violation: 1305 SAVEPOINT trans2 does not exist
 /src/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:43
 /src/vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php:260
 /src/vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php:238
 /src/vendor/laravel/framework/src/Illuminate/Foundation/Testing/RefreshDatabase.php:90
 /src/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php:233
 /src/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php:149
 
 Caused by
 PDOException: SQLSTATE[42000]: Syntax error or access violation: 1305 SAVEPOINT trans2 does not exist
 
 /src/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:41
 /src/vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php:260
 /src/vendor/laravel/framework/src/Illuminate/Database/Concerns/ManagesTransactions.php:238
 /src/vendor/laravel/framework/src/Illuminate/Foundation/Testing/RefreshDatabase.php:90
 /src/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php:233
 /src/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php:149
```

## 環境
全てdockerコンテナ内

- mysql: 5.7
- Laravel: 6.18.34
- PHPUnit: 9.3.0

## 先に結論

- 今回の場合はテストの中（正確にはseeder）でテーブルに対してtruncateを発行していたのが問題になっていた。
- これはMySQLの仕様によるもので暗黙的なコミットが発生してしまうため。
  - [13.3.3 暗黙的なコミットを発生させるステートメント](https://dev.mysql.com/doc/refman/5.6/ja/implicit-commit.html)


## 調査方法

- MySQLのクエリログを有効にする

```ini
[mysqld]
general_log=ON 
general_log_file=general_query.log
```

- テストを実行する
- `/var/lib/mysql/general_query.log` を確認
- QueryとExecuteだけ抜き出し

今回はこの時点でSTART TRANSACTION後にテーブルのtruncateを行っていた事に気づけたが一応MySQLコンソールにクエリ流し込んでエラーになることを確認したりもした。

## あとがき

LaravelのRefreshDatabaseでRollback出来ない、Transactionがおかしいみたいな内容はググると結構出てくるが、結局きちんと解決しているものが少ないように思えたので残してみることにした。

はじめはLaravel側でクエリログを出力していたが、SAVEPOINT周りなんかは`TransactionRolledBack`、 `TransactionCommitted`、`TransactionBeginning`で追いきれなかったのでMySQL側でログ出力したほうが確実だったなと後から反省。
今まで変更があったファイルのみ git add  する

関係ないファイルまで全部整形かけちゃって、
全部 git add するとプルリクが訳わかんなくなっちゃう・・というときに

#今まで変更があったファイルのみ git add  する 

```
git add $(git diff --name-only [コミットID1] [コミットID2])
```

例えば
fc1a73b から 14719ae までに変わったファイル　を git add するには、下記のようになる

```
git add $(git diff --name-only fc1a73b 14719ae)
```

参考
https://qiita.com/koara-local/items/01b51f97cf2c4a3bfedf
React + TypeScriptで location.state を使う

React(TS)における、コンポーネント間のデータの受け渡しにlocation.stateを使うときの方法。

## やりたいこと
 bookというstateを表示する `Book.tsx` と、 そのbook情報を編集する `EditBook.tsx` があったとします。
 このとき `Book.tsx` 内で編集ボタンをクリックするとbookの情報を `EditBook.tsx` に渡したい。

## 方法
```TypeScript:Book.tsx

interface BookState {
    book: {
        id: number
        title: string
        author: string
    }
}

class Books extends Component<{}, BookState> {
    state: State {
        book: {
            id: props.id,
            title: props.title,
            author: props.author,
        }
    }

    // bookの内容をEditBookにわたす
    handleEditBook = () => {
        history.push({
            pathname: '/edit_book',
            state: { Book: this.state.book}
        });
    }
}
```

```TypeScript:EditBook.tsx

interface EditBookProps {
    location: any
}

interface EditBookState {
    book: {
        id: number
        title: string
        author: string
    }
}

class EditBook extends Component<EditBookProps, EditBookState> {
    constructor(props: any) {
        super(props);
        this.state = {
            // this.props.location.stateで受け取り
            book: {
                id: this.props.location.state.Book.id,
                title: this.props.location.state.Book.title,
                author: this.props.location.state.Book.author,
            }
        };
    }
}
```
jetbotのCameraインスタンス取得時にエラー（RuntimeError: Could not read image from camera）

jetbotのCameraインスタンス取得時にエラー（RuntimeError: Could not read image from camera）

```
from jetbot import Camera

camera = Camera.instance(width=300, height=300)
```

以下のエラーが発生

```
RuntimeError: Could not read image from camera
```

何らかの原因によりカメラからの画像データを取得できていない状況になっている。
基本はカメラの接続を見直しが必要と思うが、一度試してカメラ画像を取得できているので原因不明。
、、で悩んでいたが、jetson nanoを再起動したら解決した。なぜ？

# 参考
[RuntimeError: Could not initialize camera #12](https://github.com/NVIDIA-AI-IOT/jetcam/issues/12)
[Camera (streaming) does not work #47](https://github.com/NVIDIA-AI-IOT/jetbot/issues/47)
iPadで機械学習ができるiOS/iPadOSアプリ「Juno」




## Junoについて



https://apps.apple.com/jp/app/juno/id1462586500



appstoreで1840円でDLできます。



このアプリ自体は昔からあるんですが、最近のアプデでついにscikit-learnが使えるようになったということなので購入して実際に試してみます。



このアプリ、基本的にはiOS/iPadOSでJupyterNotebookを編集できるというアプリになっていて、



同様にJupyterが使える[carnets](https://apps.apple.com/jp/app/carnets-jupyter/id1450994949)と言うアプリがあり、無料ということもあってそちらを使っていましたが、scikit-learnは使用できませんでした。




## 動作チェック



動作チェックは[こちらの記事](https://qiita.com/ao_log/items/fe9bd42fd249c2a7ee7a)のコードをそのままやっていきます。



結論から言うと、全て動作します。




<img src="https://drive.google.com/uc?export=view&id=18qDVdtB2c94OSrQazoXbABvS-deDkZHd" width="" alt="img1">





メイン画面はこんな感じ。PCのJupyterの画面よりもiPad用アプリとして洗練されたイメージ。

ちなみに前述のcarnetsはPCのJupyterと同じような画面構成になっています。


テーマは白背景と黒背景選べます。

当然sklearnがインポートできていますね。





<img src="https://drive.google.com/uc?export=view&id=1UTbtjPztzV9SpauVPl-_JfvAPBGflMjt" width="" alt="img2">




補完も効きます。



<img src="https://drive.google.com/uc?export=view&id=11mAeToHjSz5cn-B9Rte6ggqe0NtWdNC4" width="" alt="img3">



pandasの表も綺麗に表示されます。





<img src="https://drive.google.com/uc?export=view&id=1uh8pEEzUsTPDPyVB_CESRmJVmJeEPlZT" width="" alt="img4">

<img src="https://drive.google.com/uc?export=view&id=1fEqSgBENKJqe7YLSeUe_wCA7gzZTqWMj" width="" alt="img5">

<img src="https://drive.google.com/uc?export=view&id=1RsGlzMwW9btSEelWHwbW2TcvlbuuolmH" width="" alt="img6">





iPad専用のapple公式キーボードだとescキーがないですが、escキーを'@'などに割り当てたりすることもでき、ホットキーも充実しています。







<img src="https://drive.google.com/uc?export=view&id=1uw_glCspv6u1LPXjcvRY47cF5foXnq-d" width="" alt="img7">





当然グラフも描けて、分類もできています。





<img src="https://drive.google.com/uc?export=view&id=11Q_a25P9PFM3fhElZLBE0ZcLwNLY6HtF" width="" alt="img9">





iOS/iPadOS 13からある機能のファイルで見られる好きなところのNotebookを開くことができます。



<img src="https://drive.google.com/uc?export=view&id=1amdoPdsu1V4jeMKk7evHA4u_ESg23T8s" width="" alt="img8">





shellコマンドは実行できなくなった（？）ようです。





<img src="https://drive.google.com/uc?export=view&id=1x2ffWMcm35HaM0d80SleARN4e43zv1pQ" width="" alt="img10">

<img src="https://drive.google.com/uc?export=view&id=1iA4rt8StsiA7BII1IOHFn-lf_3r2ZAUq" width="" alt="img11">

<img src="https://drive.google.com/uc?export=view&id=1LxkCd2jcMhkuaJGrE_-4pw-vXPn-tSdK" width="" alt="img12">



shellコマンドが使えない代わりに、ファイル名のところを押すとメニューが出てきて、Install Python Packageから不足しているパッケージのインストールが可能になっています。標準でもscikit-learnは入っていますが、seabornは標準にはありませんでした。

インストール成功し、pairplotが動作しました。


<img src="https://drive.google.com/uc?export=view&id=1vq1sKjUk3dCyoWAh6aY1wGvx9ZOYq1la" width="" alt="img13">





保存形式としては画像の通り、主要な物はありそう？

形式を選択すると、いつもの保存画面が表示され、AirDrop等でmac等にももちろん送ることができます。



以上が軽くJunoを触った感触です。

iPadなら持ち運びも楽なので、外で機械学習の勉強、みたいなケースで重宝するかもしれません。
flutterでローカル画像を読み込み表示する方法

# その１、アプリ内に画像を入れる

プロジェクト直下に画像フォルダ(名前はなんでもいい)を作り、

その中に表示させたい画像を入れる。

今回は例として『images』にする。

# その２、pubspec.yamlを編集する。

```
flutter:

  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true

  # To add assets to your application, add an assets section, like this:
  ############### 下記を追加する ##################
  assets:
    - images/sample.jpg
    (先ほど作った『images』の中にある『sample.jpg』という意味) 
```

ファイル一つを表示させたいならこれでいいが、

実際は複数のファイルを表示させたいことが殆どだと思う。

しかし一つ一つ記述するのは**あまりにもめんどくさい。**

## imagesに入っている画像を全て表示させる書き方

```
flutter:

  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true

  # To add assets to your application, add an assets section, like this:
  ############### 下記を追加する ##################
  assets:
    - images/
    (その１で作ったフォルダの名前)
```

これでimages内にある画像ファイルを全て表示させることが出来るようになったが、

更に実用的に書くならば、

images内に更に、何用の画像かでフォルダ分けがしたいはずだ。

## images内に、用途別フォルダ分けした画像を表示させたい場合

```
flutter:

  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true

  # To add assets to your application, add an assets section, like this:
  ############### 下記を追加する ##################
  assets:
    - images/my_page/
    - images/category/
    (images内にmy_pageフォルダとcategoryフォルダを作って区分してる想定)
```

# その３、image widgetを使って表示させる。

```
class _MyHomePageState extends State<MyHomePage> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        // ############### 下記を追加する ##################
        child: Image.asset('images/sample.jpg'),
        // ############### 区分した場合 ##################
        child: Image.asset('images/my_page/sample.jpg'),
      ),
    );
  }
}

```

これで完了。

解説すると、

image.asset

これでローカル内の画像を参照し、

('images/my_page/sample.jpg')

ローカル内にある画像のパスを指定すれば表示出来るという流れ。

その１で作ったフォルダ/その２で作ったフォルダ/その２に入ってる画像データの名前

ということである。
【Udemy Python3入門+応用】　62. 集合内包表記

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**

##■集合内包表記
#####◆普通に記述した場合
```python
s = set()
for i in range(10):
    s.add(i)
print(s)
```
```:result
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
```

#####◆集合内包表記で記述した場合
```python
s = {i for i in range(10)}
print(s)
```
```:result
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
```

if文を付け足すこともできる。

```python
s = {i for i in range(10) if i % 2 == 0}
print(s)
```
```:result
{0, 2, 4, 6, 8}
```
aws-robomaker-sample-application-deepracerのフィールドをシミュレータ上に表示させる

aws-robomaker-sample-application-deepracerのフィールドをシミュレータ上に表示させるのみです

参照
> [https://github.com/amazon-archives/aws-robomaker-sample-application-deepracer](https://github.com/amazon-archives/aws-robomaker-sample-application-deepracer)

※ 以降は、ROS melodicをインストールしていることを前提としている

step1. aws-robomaker-sample-application-deepracerのリポジトリをcloneする

```
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ git clone https://github.com/amazon-archives/aws-robomaker-sample-application-deepracer
```

step2. GAZEBO_MODEL_PATHを通す

```
$ export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:~/.gazebo/models:~/catkin_ws/src/aws-robomaker-sample-application-deepracer/simulation_ws/src/deepracer_simulation/models:~/catkin_ws/src/aws-robomaker-sample-application-deepracer/simulation_ws/src
```

step3. gazebo起動してメニュー欄からinsertで該当モデルを選択すればOK

```
gazebo
```

easy Track
![easy_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/6bd9511b-8afa-9fc6-d10f-f2b7cb1ab4ee.png)

hard Track
![hard1_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/41e4c8bf-c10a-4dfb-50d3-347349aedf42.png)

hard Track
![hard2_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/6ca99b8e-3a0b-d423-1658-088ee060ebec.png)

# 補足
上記のライセンスはMIT-0 
>[https://github.com/amazon-archives/aws-robomaker-sample-application-deepracer](https://github.com/amazon-archives/aws-robomaker-sample-application-deepracer)
License
Most of this code is licensed under the MIT-0 no-attribution license. However, the sagemaker_rl_agent package is licensed under Apache 2. See LICENSE.txt for further information.

MIT-0 は以下を参照
>[https://github.com/aws/mit-0](https://github.com/aws/mit-0)
>[https://romanrm.net/mit-zero](https://romanrm.net/mit-zero)

# 参考
[https://github.com/amazon-archives/aws-robomaker-sample-application-deepracer](https://github.com/amazon-archives/aws-robomaker-sample-application-deepracer)
[https://github.com/aws/mit-0](https://github.com/aws/mit-0)
[https://romanrm.net/mit-zero](https://romanrm.net/mit-zero)
SQLAlchemyを利用して既存テーブルのメタデータを取得する

# 目的

SQLAlchemyを介して既存テーブルのカラム名やカラム型などのメタデータを取得する。

# 環境

### 動作環境

- Windows 10 Home
- Python 3.8.5 (Anaconda)
- Oracle Database 18c XE

### 必要なライブラリ

`()`内は検証で使用したバージョン。

- sqlalchemy (1.3.18)
- cx_oracle (7.2.3)

### 使用するテーブル

```sql
create table demo_tbl (
    i_col integer,
    f_col float,
    c_col char(1),
    d_col date,
    PRIMARY KEY (i_col)
)
```

# 実装

## 準備

### エンジンインスタンス作成

RDBに接続するための`sqlalchemy.engine.Engine`インスタンスを作成する。`host`, `port`, `pdb-name`, `user`, `pass`にはそれぞれ使用する接続情報に置き換えること。

```python
import sqlalchemy
import cx_Oracle

dsnStr = cx_Oracle.makedsn('host','port','pdb-name')
connect_str = 'oracle://user:pass@' + dsnStr.replace('SID', 'SERVICE_NAME')
engine = sqlalchemy.create_engine(connect_str, max_identifier_length=128)
```

### 検査インスタンス作成

メタデータを取得するための`sqlalchemy.engine.reflection.Inspector`インスタンスを作成する。

```python
inspector = sqlalchemy.inspect(engine)
```

検査インスタンスを用いてテーブルのメタデータにアクセスすることができる。

以下ではカラム一覧と主キーの取得方法を紹介する。それ以外の情報を取得する方法は[APIドキュメントを参照のこと](https://docs.sqlalchemy.org/en/13/core/reflection.html#sqlalchemy.engine.reflection.Inspector)。

## カラム一覧

以下のように`get_columns`メソッドにテーブル名を渡すとカラム情報のリストが返却される。

```python
columns = inspector.get_columns("demo_tbl")
```

> ```python
> [{'name': 'i_col',
>   'type': INTEGER(),
>   'nullable': False,
>   'default': None,
>   'autoincrement': 'auto',
>   'comment': None},
>  {'name': 'f_col',
>   'type': FLOAT(),
>   'nullable': True,
>   'default': None,
>   'autoincrement': 'auto',
>   'comment': None},
>  {'name': 'c_col',
>   'type': CHAR(length=1),
>   'nullable': True,
>   'default': None,
>   'autoincrement': 'auto',
>   'comment': None},
>  {'name': 'd_col',
>   'type': DATE(),
>   'nullable': True,
>   'default': None,
>   'autoincrement': 'auto',
>   'comment': None}]
> ```

`type`キーで格納されている値は`sqlalchemy.types.TypeEngine`をベースとしたSQLAlchemyで定義された一般型のインスタンス、またはDB個別に実装されたサブクラスのインスタンスになっている。詳細は[APIドキュメントを参照のこと](https://docs.sqlalchemy.org/en/13/core/type_basics.html)。

```python
# i_col(integer)の場合
type_of_col0 = columns[0]["type"]
type(type_of_col0) # -> <class 'sqlalchemy.sql.sqltypes.INTEGER'>
isinstance(type_of_col0, sqlalchemy.types.TypeEngine) # -> True
isinstance(type_of_col0, sqlalchemy.types.Integer) # -> True
isinstance(type_of_col0, sqlalchemy.types.Float) # -> False

# d_col(date)の場合
type_of_col3 = columns[3]["type"]
type(type_of_col3) # -> <class 'sqlalchemy.dialects.oracle.base.DATE'>
isinstance(type_of_col3, sqlalchemy.types.TypeEngine) # -> True
isinstance(type_of_col3, sqlalchemy.types.DateTime) # -> True
isinstance(type_of_col3, sqlalchemy.types.Date) # -> False
```

※Oracleの`date`型は時刻まで格納可能なのでSQLAlchemyのクラスとしては`DateTime`となる。

## 主キー

以下のように`get_pk_constraint`メソッドにテーブル名を渡すと主キー関連の情報がが返却される。

> ```python
> {'constrained_columns': ['i_col'], 'name': 'sys_c007315'}
> ```

※`get_primary_keys`というメソッドもあるがこれは廃止予定としてdeprecatedになっている。

# 参考

[SQLAlchemy 1.3 Documentation](https://docs.sqlalchemy.org/en/13/index.html)
Google Apps ScriptでLINEユーザ情報を取得する

## LINEユーザ情報取得
LINEmessagingAPI
https://developers.line.biz/ja/reference/messaging-api/#get-profile

```js:user.gs
const ACCESS_TOKEN = <LINEのアクセストークン>;
/*
* LINEユーザ情報取得
*/
function getUserInfo(userId) {
  // アクセス先
  var get_url = "https://api.line.me/v2/bot/profile/"+userId;
  // GETリクエスト
  var response = UrlFetchApp.fetch(get_url, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + ACCESS_TOKEN,
    }
  });
  
  return response;
}

```
MySQL Workbench が急につながらなくなった

備忘録です

開発環境のDBにつなぐのに MySQL Workbench を使っているのですが、どういうわけか急につながらなくなってしまいました。
とくにいじった覚えはないのですがなぜかつながりません。

そして、開発環境とのソースのやりとりに使っている sublime text 3 の SFTP もつながらないではないですか。

となると考えられるのは、両者に使っているSSHキーがどうかしたのでしょうか。

よくよく思い出すと、 sourcetree の設定をごちゃごちゃいじってる間に id_rsa を上書きした気がします。

ということで改めて id_rsa を設定したら無事つながりました。

新米で使い慣れていないうちはこういった基本的な部分でつまることが非常に多く感じていますが、仕組みの全体の流れを落ち着いて見直せば意外と原因は見つかりますね。
GoでバイナリからJPEG生成

Goでバイナリでファイルを受け取った際にそのまま加工したい時

結論
bytes パッケージを使おう
[Go言語　パッケージ bytes](https://xn--go-hh0g6u.com/pkg/bytes/)

## ソースコード

```golang:main.go

package main

import (
	"bytes"
	"fmt"
	"image"
	"image/jpeg"
	"io/ioutil"
	"os"
)

func main() {

    // ファイルの読み込み
	buf, _ := ioutil.ReadFile("input.jpg")

    // バイナリファイルをReaderに読み込み
	reader := bytes.NewReader(buf)

    // 画像変換
	img, _, err := image.Decode(reader)
	if err != nil {
		fmt.Errorf("err %v", err)
	}

    // ファイル作成
	f, err := os.Create("output.jpg")
	if err != nil {
		fmt.Errorf("err %v", err)
	}
	defer f.Close()

	opt := jpeg.Options{
		Quality: 90,
	}

    // 今回はJPEGだがPNGとかでもできそう
	if err = jpeg.Encode(f, img, &opt); err != nil {
		fmt.Errorf("err %v", err)
	}
}


```

## 参考
[Go言語　パッケージ bytes Reader](https://xn--go-hh0g6u.com/pkg/bytes/#Reader)
GithubのプロフィールにTwitterのツイートを表示する

:::note alert
Twitterの仕様変更で使えなくなりました！
:::

# はじめに
今年になってからGithubのプロフィールに好きな文面を追加できる機能が追加されました。
既に色々なサービスが開発されていています。

# プロフィールに最新のつぶやきを載せたい！
唐突ですが、プロフィールページにつぶやきを載せることはできないかなと思い、調べてみました。

# どうやって載せる？
結論としては、以下のように実装しました。

1. Twitter APIを叩いて、ツイートを取得する
2. 取得したツイートをSVG形式に変換
3. これらのコードをVercelでホスティング
4. README.mdにSVGへの画像リンクを追加

# サンプル
## 出力画像（SVGからPNGに変換済み）
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687226/1933c231-74f2-1013-0cae-6512cc050ae8.png)

## 動作しているページ
[github.com/gazf](https://github.com/gazf)

# 使い方
画像リンクの`?id=`の部分は表示したいアカウントのスクリーンネームに書き換えてください。

``` md
[![github-readme-twitter](https://github-readme-twitter.gazf.vercel.app/api?id=gazff)](https://github.com/gazf/github-readme-twitter)
```

# コード
[Github gazf/github-readme-twitter](https://github.com/gazf/github-readme-twitter)

# 問題点
## Vercelって無料？
公式サイトを読んでも特にクォータ等の記述がない気がします。

## Twitter APIのクォータに引っ掛かりそう
そんなに大量にリクエスト来ないと思うし、大丈夫だよね・・・？
【Nuxt.js】Nuxt実践編：ユーザーアイコン表示の切り替えをしよう

🎈 この記事はWP専用です
https://wp.me/pc9NHC-ye

# 前置き
今回は簡単な実践編です😉💕
作るものはこちら！

<img width="684" alt="スクリーンショット 2020-08-09 9.28.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469755/2b38509f-26aa-ceb2-162e-45342f602149.png">


マイページのあるサイトで
⬆️ユーザーアイコンの初期状態と
⬇️画像を設定した時の
表示の切り替えをやってみましょう💃🎶

コンポーネント間のやりとりや
演算子の復習になるのでぜひチャレンジしてください🔥💪

今回のような簡単な実践編も
今後増やしていこうと思ってます💕

Let's try!



# ディレクトリ 

```bash:file
components/
--| atom/
----| icons/
------| IconUser.vue
--| molecule/
----| items/
------| ItemUserIconName.vue

pages/
--| user.vue
```

アトミックデザインに基づき作成します🌟
atomはアイコン部分。
他のmoleculeにも使い回す前提です。
moleculeはアイコンとユーザーの名前を追加したものです。

## アドミックデザイン

要素の大きさごとにファイルを分けます🙋‍♀️
コンポーネントがどこにあるのか
分かりやすくなります💕
大きさの分類はここが参考になります！
Atomic Designとは



# atom
## 構成

IconUser.vueを作成しましょう🙋‍♀️
初期アイコンと、
アイコンが設定された場合の
表示を切り替えます。
アイコン画像は親で設定します。

背景は縦横64px
アイコンは縦横24px

アイコンはiconmonstrのsvgを使用しています🌟
https://iconmonstr.com/user-5-svg/

それではやってみましょう！！！

ticktack…

まずは切り替えをするので
v-ifとv-elseが使えますね…
親で画像を設定するのでpropsをstringで渡します。
stringを真偽値にしてv-ifとv-elseにしたい…

それではコードを見てみましょう✨👀

## 解説

🎈 続きはWPでご覧ください👀
https://wp.me/pc9NHC-ye
【Ruby on Rails】アプリケーション作成〜サーバー起動まで&ポート番号って何？

Ruby on Railsの初歩中の初歩ですが、まとめです。

## 1.アプリケーションを作成する。

ターミナルを起動します。

```
$ rails new アプリケーション名
```

上記コマンド実行により、入力したアプリケーション名と同名のフォルダが作成され、その中に開発に必要なフォルダやファイルが用意されます。

```
アプリケーション名/
  ├ app/ アプリケーションのメインフォルダ
  ├ config/ 設定情報に関するフォルダ
  ├ db/ データベースに関するフォルダ
  └: その他
```

## 2.サーバーを起動する。

ターミナルに入力

```
$ rails server
```

Google ChromeやSafariなどのブラウザでlocalhostを3000番ポートで開きます。

```
localhost:3000
```

![スクリーンショット 2020-08-09 9.27.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/cfe5c402-8727-3e79-b82b-cea6d0a4dee3.png)
無事、Ruby on Railsが起動しました。

参考: [Ruby on Rails5 学習コース I | プログラミングの入門なら基礎から学べるProgate[プロゲート]](https://prog-8.com/lessons/rails5/study/1)

## ポート番号とはなんでしょうか？
今回、３０００番ポートと出てきましたが、ポート番号という言葉は、インフラ関係の知識としては必須です。

[インターネット用語1分解説～ポート番号とは～ - JPNIC](https://www.nic.ad.jp/ja/basics/terms/port-number.html)には、以下のように説明されています。
> ポート番号とは、TCP/IP通信において、 コンピュータが通信に使用するプログラムを識別するための番号です。 ポート番号は16ビットの整数であり、 0番～65535番まであります。

更に深いところで、ポート番号には大きく分けて３種類あり
* ウェルノウンポート番号(0番～1023番) - 使用目的が定められたポート番号
* 登録ポート番号(1024番～49151番) - IANAが登録を受け付け、 公開
* ダイナミック/プライベートポート番号(49152番～65535番) - 誰でも自由に使用できるポートとして開放

上記のように分類されます。

ちなみに、今回は、Ruby on Railsだと3000番ポート、Djangoだと8000番ポートがデフォルトで使われていますが、この3000番と8000番は登録ポート番号(1024番～49151番)に該当する為、IANAが登録を受け付け、 公開できるようになっています。

## IANAとは？
> Internet Assigned Numbers Authorityの略称。
ドメイン名、IPアドレス及びAS番号、各プロトコルで使われるプロトコル名及び番号といったインターネット資源を管理する機能です。
IANAは、南カリフォルニア大学情報科学研究所（ISI）の故ジョン・ポステル（Jonathan Bruce Postel）氏が中心となり、1988年に設立されました。IANAはインターネットに関する最も古い機関の一つであり、その活動は1970年代にまで遡ることができます。
その後、1998年10月にICANNが設立され、IANAが行っていた各種資源のグローバルな管理・調整の役割は ICANNの一部局として引き継がれました。そのような経緯から、歴史的なことも含めインターネット資源を管理する機能を表す意味で使用されています。 引用：[JPRS用語辞典｜IANA（アイアナ）](https://jprs.jp/glossary/index.php?ID=0027)

TCP/IP通信やHTTPなどは、更に深掘りできるので機会があったら記事にする予定です。
【Rails】RSpecでテストしたい。そんなあなたの一歩を応援します【導入手順】

#参考対象者
- Rails6.0で、ＲＳpecでテストしたいなと考えている方

#環境

```
$ rails -v
Rails 6.0.3.1
```
```
$ ruby -v
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-darwin19]
```

#RSpecを導入する

```ruby:Gemfile
group :development, :test do
  gem 'rspec-rails'
end
```

```shell
$ bundle install

$ rails g rspec:install
```
gemをインストールし、設定ファイルをジェネレータで作成する。

```ruby:.rspec
--require spec_helper
--format documentation
```
テストをドキュメント形式に設定する。



#System Specを導入する　ブラウザテスト

```ruby:Gemfile
group :test do
  gem 'capybara', '>= 2.15'
  gem 'webdrivers'
end
```

```shell
$ bundle install
```

まずは、gemをインストールする。

```spec/rails_helper.rb
RSpec.configure do |config|
# 一番下の直前に追加
  config.before(:each) do |example|
    if example.metadata[:type] == :system
      driven_by :selenium, using: :headless_chrome, screen_size: [1400, 1400]
    end
  end
end
```

ブラウザテストが機能するように、RSpecの設定を変更する。
[最新]Raspberry Pi4に OpenCV4 を入れる方法 (Raspberry Pi 4 + OpenCV4 + Python3.8) 

初めまして!!京都エンタテイメントワークスでアルバイトしている、大学院生わっぴです :smiley: 
今回ラズパイ +OpenCVを使って、製品開発をするようになったのですが、どのサイトのインストール方法を見ても、どれもうまくいかなかったので、自分がやった方法を記述しておきました!!
初投稿なので見辛かったら、スミマセン・・・
なおOSのインストール方法は載せていませんのでご了承を><

# 環境情報
Raspberry Pi 4
OpenCV-python:4.3.0.38
Python:3.8.0
OS :RaspberryPi OS

# 1:Python3.8.0をインストールする
pythonのデフォルトは2.7 or 3.7の状態である。
とりあえず一応3.8.0をインストールし、python3.8.0の環境下にopencv-pythonを導入

1.  パッケージリストの更新を行う
```
$ sudo apt update
$ sudo apt upgrade
```

2. python3.8.0のソースをダウンロード(ディレクトリ/home/piの直下でやった方がよい)
```
$ wget https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tgz
```
3. python3.8.0のコンパイル&インストール(時間15分くらいかかった)
```
$ tar zxvf Python-3.8.0.tgz
$ cd Python-3.8.0
$ ./configure
$ make
$ sudo make install
```

4. python3.8が導入できているのを確認次第、ラズパイ の再起動
```
$ python3.8 -V
  python 3.8.0
$ sudo reboot
```

# 2:pipのアップデート
念のためpipのアップデートをする事

```
$ sudo python3.8 -m pip install --upgrade pip
$ python3.8 -m pip --version
pip 20.2.1 from usr/ ・・・~略~・・・/pip( python 3.8)
```

# 3:OpenCVの依存ライブラリのインストール

```
# ビルドツール関係(もしかしたらいらないかも)
sudo apt-get install build-essential cmake pkg-config
# 画像関係
sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng-dev
# 動画関係
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libxvidcore-dev libx264-dev
# 最適化関係
sudo apt-get install libatlas-base-dev gfortran
# HDF5関係
sudo apt-get install libhdf5-dev libhdf5-serial-dev libhdf5-103
# Qtライブラリ
sudo apt-get install libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5

sudo apt-get install python3-dev
```

# 4:pipでOpenCVを入れる
今回は正攻法(Cmakeとか使って、コンパイル、ビルドすると時間がかかりすぎる・・・)ので
opencv-pythonを使って、OpenCVのインストールを行う

```
$ python3.8 -m pip install opencv-python==4.3.0.38
```

:bulb: $ pip3 install の方を使うと以下の警告文が出てきた。現在(2020.8.11)はpython (version) -m pip install で書いた方が良さそう
(参考になったリンク:[pipを直で使うのは非推奨っぽい？](https://qiita.com/taro-hida/items/16006f3622551e231a2e)
:bulb: Opencvのインストールには1時間程度かかったので、他の作業をしながらやるのがいいと思われるorz

# 5: ターミナル上でpython3.8を起動し、opencvが起動できるかを確認

さて最後にOpenCVが起動できるかを確認
import cv2の後にエラーコメントがなかったら、無事成功!!!

```
$ python3.8
>>> import cv2
>>>
```



# お世話になったサイト
Raspberry pi 4にOpenCVを入れる
- https://qiita.com/naoppy/items/8a2178383859178e6d7e

pipを直で使うのは非推奨っぽい？
- https://qiita.com/taro-hida/items/16006f3622551e231a2e
C# の Linq でリストの重複チェックと重複排除を実装する

## 経緯

リストの重複チェックや重複排除の実装をすることが個人的によくありますが、毎回毎回実装方法を忘れてしまい、そのたびに調べたり考えたりに多少の時間を使ってしまっていました。

この辺りは既に様々な方がまとめてくださっていますが、主に自分用のメモとして重複チェックの方法や重複排除の方法をまとめました。

## 実装

実装は Linq の GroupBy で書いてみました。

```cs
public static class EnumerableExtension
{
    public static bool HasDuplicate<T, Tkey>(this IEnumerable<T> source, Func<T, Tkey> keySelector)
        => source.GroupBy(keySelector).Any(s => s.Skip(1).Any());

    public static IEnumerable<T> DistinctByKey<T, Tkey>(this IEnumerable<T> source, Func<T, Tkey> keySelector)
        => source.GroupBy(keySelector).Select(s => s.First());
}
```

## 使い方例

```cs
var collection = new List<string> { "佐藤", "佐々木", "佐藤", "澤田" };

// 重複をチェックする
var result1 = collection.HasDuplicate(c => c);
// 重複を除去する
var result2 = collection.DistinctByKey(c => c);
```
IGVでreadのmappingを表示する

#目的
NGS(ONT MinION, long-read sequencer)の生データから興味ある遺伝子領域のみをアセンブリし、リファレンスの種や他の近縁種と配列比較することでSNPなどの検出を行いたい。さらに、short-readによるpolishが行えない(=short readのデータがない)ため、最大限readをかき集めてcoverageを稼ぎたい。

#方法
QCフィルター済みのreadをdatabase、興味のある遺伝子領域の配列をqueryとしてlocal BLASTを行い、得られたreadをminimap2を用いてqueryの配列にmappingすることで、興味のある遺伝子領域のみをアセンブリできると考えた。なお、NGSデータの対象となる生物とqueryに用いた配列を持つ生物における配列は大きく変化していないことを前提とする。

#問題
queryとの比較で解析対象の配列にSNPが観測された。しかし、配列を見ただけでそのSNPが**真のSNP**なのか、**long-read sequencerのエラー**によるものなのか判断することはできない。例えば、queryでは**TTA**、解析した配列では**TGA**だった場合、解析した配列で見られたSNPの箇所の全readを見てA:T:G:C = 1:1:97:1であれば真のSNPであり、A:T:G:C = 1:48:50:1であれば、エラー(あるいはpaternal・maternalの違い)である可能性が高い。
そこで、これらを判断するために重ね合わせに用いたreadがどのようにmappingされているのか視覚的に知りたい。しかし、ネットには1ページにその全てがまとまっているサイトがなかったり、ソフトのバージョンが古いためエラーが発生したりしたため、でやり方にかなり戸惑った。このページでは2020年月現在でのやり方をまとめる。

#環境
macOS Catalina 10.15.5

##0.現在手元にあるデータ
アセンブリまで終えると以下のファイルが揃っているはず。
・local BLASTでqueryに使用した興味のある遺伝子領域のfastaファイル
・local BLASTで回収した興味のある遺伝子領域の配列を含むreadのfastaファイル
・minimap2で作成したreadのsamファイル

##1.IGVのダウンロード

Integrative Genomics Viewer (IGV)と呼ばれる有名なソフト。ChIP-seqの結果の可視化もできる。まずこのソフトをダウンロードする。
https://software.broadinstitute.org/software/igv/download

##2.samtoolsのインストール
samファイルをIGVに読み込んでもらうために変換を行う。変換にはsamtoolを使用。
自分はminiconda環境があるのでそこからインストールを行う。

```txt:samtoolsのインストール
conda install -c bioconda samtools
```

上記の方法もしくは以下のリンク先を参考にインストールを行う。
http://kazumaxneo.hatenablog.com/entry/2019/01/04/220013

##3.ファイルの準備
samtoolsを使ってsamファイルの変換を行う。
以下ターミナルから操作。

```txt:ファイルの変換
#bamファイルの作成
samtools view -bS gene.sam > gene.bam

#sorted.bamファイルの作成
samtools sort gene.bam > gene.sorted.bam

#sorted.bam.baiファイルの作成
samtools index gene.sorted.bam > gene.sorted.bam.bai
```

##4.IGVで開く
IGVで実際のreadのmappingの様子を見る。
IGVを開き、Genomes > Load Genome from Fileでqueryに用いた配列、Files > Load from Fileでsorted.bamファイルを開く。queryの配列は一度開くとソフトに登録される。

##5.IGVの見方、操作

〜編集中〜


#参考サイト
https://bi.biopapyrus.jp/rnaseq/mapping/igv/loadfile.html
【PHP/Laravel】Class 'Collective\Html\HtmlServiceProvider' not found への対処法

#はじめに
Laravelでアプリ開発をしております。
環境構築が完了し、Formを実装した際にエラーが発生。
備忘のために記録しております。
同じような方の助けになれば幸いです。

#開発環境
・MacOS:10.15.6 （Catalina）
・PHP7.3.20
・Laravel6.18.35

#対処法
###①プロジェクト直下の「composer.json」に「"laravelcollective/html": "^6.0"」を追記
※これでもエラーが起きる場合はLaravelのバージョンとlaravelcollective/htmlのバージョンを合わせる（ex. Laravel5.8なら、laravelcollective/htmlの5.8）。

```composer.json
 "require": {
        "php": "^7.2",
        "fideloper/proxy": "^4.0",
        "laravel/framework": "^6.2",
        "laravel/tinker": "^2.0" ,
        "laravelcollective/html": "^6.0"
    },
```

###②ターミナルで「composer update」を実行

```
$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 2 installs, 3 updates, 0 removals
  - Updating egulias/email-validator (2.1.18 => 2.1.19): Downloading (100%)       - Installing league/mime-type-detection (1.4.0): Downloading (100%)         
  - Updating league/flysystem (1.0.70 => 1.1.0): Downloading (100%)         
  - Updating nikic/php-parser (v4.7.0 => v4.8.0): Downloading (100%)         
  - Installing laravelcollective/html (v6.1.2): Downloading (100%)         
Package jakub-onderka/php-console-color is abandoned, you should avoid using it. Use php-parallel-lint/php-console-color instead.
Package jakub-onderka/php-console-highlighter is abandoned, you should avoid using it. Use php-parallel-lint/php-console-highlighter instead.
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: laravelcollective/html
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
40 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
```

###③「config/app.php」への下記の追記
※Laravel5.5以上は[Package Auto Discovery](https://laravel-news.com/package-auto-discovery)が入っているため不要。

```config/app.php
   'providers' => [
        Collective\Html\HtmlServiceProvider::class,
    ],

    'aliases' => [
        'Form' => Collective\Html\FormFacade::class,
        'Html' => Collective\Html\HtmlFacade::class,
    ],
```

以上となります。

以下、参考にさせていただいたサイトも掲載させていただきます。
ご参考にしていただければ。

#参考文献
・[Laravelで「Formクラスが無い」とエラーが出た時の対処法](https://qiita.com/HarukaNishiyama/items/d757fa770927621d6727)
・[【Laravel】Formファサード（laravelcollective/html）をインストールする](http://program-memo.com/archives/653)
スムーススクロール(ページ内移動)

//ページ内リンクのURLが "#"から始まる時(ex. "#service"や"#about")

```script.js
  $('a[href^="#"]').click(function () {
    // スクロールの速度
    var speed = 400; // ミリ秒で記述
    var href = $(this).attr('href');
    var target = $(href === '#' || href === "" ? 'html' : href);
    var position = target.offset().top;
    $('body,html').animate({ scrollTop: position }, speed, 'swing');
    return false;
  });
```


//ページ内リンクのURLが "/#"から始まる時(ex. "/#service"や"/#about")

```script.js
$(document).on('click', 'a[href*="#"]', function() {
  let time = 400;
  let target = $(this.hash);
  if (!target.length) return;
  let targetY = target.offset().top;
  $('html,body').animate({scrollTop: targetY}, time, 'swing');
  return false;
});
```
blender, python,  2020年夏

さてBlenderで使うコードを書いてみます。久しぶりの3Dアプリ blenderです。2.7から2.8になって操作も変わったり python APIも変わったので過去の蓄積の分も書き直して再挑戦です。今日やったのは立方体の描画、立方体の変形、回転、照明配置とカメラ配置まで。直方体を8つの頂点座標指定で作るのは、方法だけ調べましたが手間が増えるので今日は使わないまま。


```python3
import bpy
# 既存要素削除（この2行は借り物）
for item in bpy.data.meshes:
    bpy.data.meshes.remove(item)
#立方体、少し回転させて繰り返し描画
for x in range(15):
    for y in range(6):
        for z in range(5):
            bpy.ops.mesh.primitive_cube_add(
            location=(x, y, z-1),
            rotation=(0.1*(x+y+z), 0, 0),
            )
#5回繰り返す
for x in range(5):
    for y in range(4):
        #立方体の描画
        bpy.ops.mesh.primitive_cube_add(location=( -4*x-2, 2*y, 0), size=1.5, rotation=(0, 0, 0))
        #図形を変形(X方向1.5倍、Y方向1倍、Z方向は だんだん増加)
        bpy.ops.transform.resize(value=(1.5, 1.0, x*2+2))
# new lamps 
bpy.ops.object.add(radius=1.0, type='LIGHT', enter_editmode=False, align='WORLD', location=(5.0, 0.0, 8.0), rotation=(0.0, 0.0, 0.0))
# new camera
bpy.ops.object.add(radius=1.0, type='CAMERA', enter_editmode=False, align='WORLD', location=(25.0, -8.0, 4.0), rotation=(1.4, 0.0, 1.4))
# "Blender 2.83.0 Python API Documentation" blender 283.0 , Pythonの公式のガイド。  
# https://docs.blender.org/api/current/index.html



```