OmniAICreator/Qiita-1.07M huggingface dataset:
アクティブなストリップの範囲をプレビュー範囲に設定

Blenderには　アクションをストリップという単位で範囲指定して
複数のモーションを重ね合わせたり、ループさせたりする**ノンリニアアニメーション(NLA)**という機能があります
また、FBX等の書き出し時にストリップを１つのモーションとして書き出すこともできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/5612b311-d09e-288b-5fc0-174fd9e1a504.png)
ゲーム等の繰り返しモーションを作成する時に
ストリップの長さでリピートさせて動きをチェックすることが多いので作成した
指定したストリップの範囲をタイムラインのプレビューに設定するアドオンです

ノンリニアアニメーションエディッタの　選択メニューに「ストリップうをプレビュー範囲に」の項目を追加します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/bf3e78ab-def6-e6e8-6c19-bffe8e59e9cc.png)

2.7時代に仕事で使用していたものを2.8以降に対応するように修正しました

```py:y_StripTime_to_preview.py
bl_info = {
    "name": "set activeStripTime to preview",
    "description": "アクティブなストリップの範囲をプレビュー範囲に設定",
    "author": "Yukimi",
    "version": (0,3),
    "blender": (2,80, 0),
    "location": "NLA",
    "warning": "",
    "wiki_url": "",
    "tracker_url": "",
    "category": "Animation"}

import bpy

def Striptime_to_preview(context):
    active_track = context.active_object.animation_data.nla_tracks.active
    if not active_track :return()
    for strip in active_track.strips:
        if strip.active:
            active_strip = strip
    if active_strip == "":return()
    #ストリップの情報を取得
    frame_start = strip.frame_start
    frame_end = strip.frame_end
    repeat = strip.repeat
    #リピートの一回目のみをプレビュー
    context.scene.use_preview_range = True
    context.scene.frame_preview_end = frame_start + int(( frame_end - frame_start)/ repeat) -1
    context.scene.frame_preview_start = frame_start

class NLA_OT_StripTimeToPreview(bpy.types.Operator):
    '''    set activestrip to preview '''
    bl_idname = "action.striptime_to_preview"
    bl_label = "set activeStripTime to preview"
    def execute(self, context):
        Striptime_to_preview(context)
        return {'FINISHED'}


classes = (NLA_OT_StripTimeToPreview,)

###################################################
def menu_func(self, context):
    self.layout.operator("action.striptime_to_preview", 
        text="ストリップをプレビュー範囲に" )

def register():
    for cls in classes:
        bpy.utils.register_class(cls)
    bpy.types.NLA_MT_select.prepend(menu_func)

def unregister():
    bpy.types.NLA_MT_select.remove(menu_func)
    for cls in reversed(classes):
        bpy.utils.unregister_class(cls)

if __name__ == "__main__":
    register()
```
ConohaのVPSからAmazon LightSailにサーバを移動②

# ConohaのVPSからAmazon LightSailにサーバを移動②

[前回](https://qiita.com/syakesaba/items/34553a66e0d467797629)までのあらすじ

> ぼく「日本って土地高いし狭いし関連法規も老朽化してるしなぁ。」
> ぼく「NGNに直接繋がるVPSとか登場せんとこれからはキツイなぁ。」
> Aさん「ユーまだ国産VPSツカテルの?HAHAHA!」
> ぼく「うるさいメリケ○！どうせ従量課金で請求青天井やろ！」
> Aさん「Amazon LightSailなら上限付きサ HAHAHA!」
> ぼく「ええやん！（ほんまかいな）」
> Sさん,Gさん「米国資本に魂を売るのか大和男子！」
> ぼく「安けりゃええやん！」

_本記事はAWSとぃうか、Amazonのサービスをほとんど使ったことが無いガラパゴス人間によるものです。AWSを完璧に理解し使いこなせている諸兄にはちょっと物足りないと思います。_

# 目次

1. [移行準備](#移行準備)
1. [参考文献](#参考文献)

# 移行準備

1. LightSail インスタンスの作成
    - サイジング
        - BEFORE: Conoha 東京,2CPU,2GB,50GBで2000JPY
            - AFTER: AWS LightSail 東京,1CPU,2GB,60GBで10.0USD
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123740/e1a1c98e-8508-4d60-db7b-d01843b03aa4.png)

2. 作成したインスタンスに静的IPを作成してアタッチ
    - 必ずアタッチすること！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123740/cd123bd3-d83f-6f53-d676-f357912a4add.png)

3. DNSゾーンを作成
    - ドメインレジストラ側でネームサーバを指定する（画像はお名前.comの場合）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123740/ce98bda2-a24d-a6ad-1abf-690fc4387634.png)
    - 2で取得したグローバルIPで名前解決する形でDNSレコードを入力する。
        - ルートドメインの名前解決は@マークを書く。
![スクリーンショット 2021-01-11 17.48.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123740/459b8f7f-07f9-7014-4871-0eb846d64a6a.png)
        - SPFでIP指定している場合は忘れず。
        - レジストラ側はNSの浸透に時間掛かる場合があるので注意。

4. インスタンスの初期化
    - ホスト名の指定 /etc/hostname
    - hostsの編集 /etc/hosts
    - yum updateしてreboot
    - デフォルトのec2-userとは別にしっかりした鍵を作ったユーザを作成し、ec2-userを消す。[参考](https://itneko.com/ec2-user-delete/)
    - 言語や日時の設定：EC2と同じ。[参考](https://qiita.com/leomaro7/items/4e667b32a9ac9e7211ba)

5. ec2-userを削除した時点でもう二度とWebコンソールは使えない。あとは手元のSSHクライアントからコンソールで操作していく。

つづく
[ConohaのVPSからAmazon LightSailにサーバを移動③](https://qiita.com/syakesaba/items/fd87cb6184cbb92dfdee)

# 参考文献
- [https://aws.amazon.com/jp/lightsail-vps/](https://aws.amazon.com/jp/lightsail-vps/)
- [AmazonLinuxで新しいユーザを作成してec2-userを削除する](https://itneko.com/ec2-user-delete/)
- [Amazon Linux （OS の基本設定）-Amazon EC2](https://qiita.com/leomaro7/items/4e667b32a9ac9e7211ba)
[AtCoder]AtCoder Beginner Contest 188 A~E問題

# A問題
2数の差が２以下の場合はNo、そうでない場合Yes

```c++
#include <bits/a++.h>
using namespace std;

int main()
{
    int a,b;
    cin >> a >> b;

    if(abs(a-b) <= 2){
        cout << "Yes" << endl;
    }
    else{
        cout << "No" << endl;
    }

    return 0;
}
```

# B問題
問題文そのまま。

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

int main()
{
    int n;
    cin >> n;
    int a[100000] = {0};
    int b[100000] = {0};

    long long ans = 0;
    for(int i = 0; i < n; i++){
        cin >> a[i];
    }
    for(int i = 0; i < n; i++){
        cin >> b[i];
    }
    for(int i = 0; i < n; i++){
        ans += a[i] * b[i];
    }

    if(ans == 0){
        cout << "Yes" << endl;
    }
    else{
        cout << "No" << endl;
    }

    return 0;
}
```

# C問題
2のN乗は1を右にNビットシフトすればよい。
セグ木を使うまでもなくAの前半分と後ろ半分それぞれのmaxのうち小さい方のIndexを出力すればよい問題。

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

int main()
{
    int n;
    cin >> n;
    n = 1 << n;
    vector<int> a(n);

    for(int i = 0; i < n; i++){
        cin >> a[i];
    }

    auto left = max_element(a.begin(), a.begin() + (n/2));
    auto right = max_element(a.begin() + (n/2), a.end());

    if(min(*left,*right) == *left){
        cout << distance(a.begin(), left) + 1 << endl;
    }else{
        cout << distance(a.begin(), right) + 1 << endl;
    }

    return 0;
}
```

# D問題
a,bの制約上、各日ごとにかかる金額を計算していては間に合わない。
a<sub>i</sub>日目にc<sub>i</sub>円増額、b<sub>i+1</sub>日目にc<sub>i</sub>円減額ととらえ、それを日にちでソートしてシュミレーションを行う。

```c++
#include <bits/stdc++.h>
using namespace std;
#define ll long long

int main()
{
    ll N,C;
    cin >> N >> C;
    vector<pair<ll ,ll>> tl;

    for(ll i = 0; i < N; i++){
        ll a,b,c;
        cin >> a >> b >> c;
        tl.push_back(make_pair(a,c));
        tl.push_back(make_pair(b+1,-c));
    }

    sort(tl.begin(), tl.end());

    ll ans = 0;
    ll sub = 0;
    ll prev = 0;
    for(auto e : tl){
        ans += min(sub, C) * (e.first - prev);
        sub += e.second;
        prev = e.first;
    }

    cout << ans << endl;

    return 0;
}
```

# E問題
DP問題。
X<sub>i</sub> < Y<sub>i</sub>から道をsortしておき、道を辿って各町について以下二点を記録していく
1. その町までの経路上の町の最安値
2. その町で金を売った場合の最大利益

2の最大値が答えとなる。

```c++
#include <bits/stdc++.h>
using namespace std;
#define ll long long

int main()
{
    ll n,m;
    cin >> n >> m;
    vector<ll> a(n);
    vector<pair<ll,ll>> xy;
    vector<ll> mini(n,0);
    vector<ll> gain(n,LLONG_MIN);

    for(int i = 0; i < n; i++) {
        cin >> a[i];
        mini[i] = a[i];
    }
    for(int i = 0; i < m; i++){
        ll x,y;
        cin >> x >> y;
        x--;
        y--;
        xy.push_back(make_pair(x,y));
    } 

    sort(xy.begin(), xy.end());

    for(auto tmp : xy){
        if(a[tmp.second] - mini[tmp.first] > gain[tmp.second]){
            gain[tmp.second] = a[tmp.second] - mini[tmp.first];
            mini[tmp.second] = min(mini[tmp.first], a[tmp.second]);
        }
    }

    cout << *max_element(gain.begin(), gain.end()) << endl;

    return 0;
}
```
Androidアプリ開発における便利なライブラリたち

# はじめに
今回は僕がAndroidアプリ開発においてとても便利だと感じたライブラリを紹介していきます。

# 1. Timber
[Timber](https://github.com/JakeWharton/timber)とはAndroidの通常のLogクラスの上にユーティリティを提供する、小さくて拡張可能なAPIを持つロガーです。

Android界隈では超がつくほど有名なあのJakeWhartonが作ったライブラリです。

通常Androidにおけるログは

```kotlin
Log.d("debug", "hogehoge")
```

というふうにログを出力しますが、このTimberを使うと

```kotlin
Timber.d("debug: hogehoge"
```
というふうに引数を一つ減らしてログを出力できます。
このTimberはAndroid標準のLogクラスをラップしているらしいので非常に軽量です。

またrelease版ではログを出力したくない場合もあると思いますが、それはアプリケーションクラスで

```kotlin
class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()

        if(BuildConfig.Debug) {
            Timber.plant(Timber.DebugTree())
        }
    }
}
```

としてあげるとrelease版ではログを出力しないでくれます。とても便利ですね。

Treeをplantしてあげるという表現、とてもおしゃれ


# 2.CircleImageView
ImageViewを丸くしたいということがよくあると思いますが(僕はよくある)、そんな時にCircleImageViewがとても便利です。
https://github.com/hdodenhof/CircleImageView

普段はこれを使わないと、drawableを自分で自作してあーだこーだやらなくては行けませんが、このライブラリを使うと簡単に丸いImageViewが使用できます。

使い方は特にImageViewと変わらず、xmlでCircleImageViewを書いてあげるだけ。

オリジナルのプロパティもかなりあり、ボーダーの色、ボーダーの太さ、背景色など自由にカスタマイズできます。


# 3.Glide
[Glide](https://github.com/bumptech/glide)は、画像読み込みライブラリです。
APIなどで受け取ったURLをそのまま使用し、画像を表示できます。

一昔前はAsyncTaskを使ったりとかなりだるかったのですが、これを知ってから画像読み込みがかなり楽になりました。

こちらも使い方はとても簡単

```kotlin

val imageView: ImageView = findViewById(R.id.imageView)
Glide.with(context).load(url).into(imageView)
```

とするだけ。

ImageViewのBindingAdapterを作ればもっと便利ですね

```kotlin

@BindingAdapter("imageUrl")
fun ImageView.setImageUrl(imageUrl: String?) {
    imageUrl ?: return
    Glide.with(context).load(imageUrl).into(this)
}
```

こんなBindingAdapterを作って、xml側で

```xml
<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:imageUrl="@{url}"/>
```

こうするだけ。
あとはライブラリ側で勝手に画像を読み込んで、ImageViewに表示してくれます

# まとめ
世の中には便利なライブラリがたくさんありますね。
皆さんのおすすめのライブラリがあったらぜひ教えてください。
ど素人がQGISのプラグイン開発でGUIを作ってみる

#はじめに
０知識からQGISのプラグイン開発＆GUI作成にチャレンジしていきます。
著者のスペックはQGIS初心者、pythonを少しかじった程度です。

#QGISのダウンロード
まずはQGISはバージョン3.10をダウンロードします。

```
https://qgis.org/ja/site/forusers/download.html
```

#PluginBuilderをインストール
プラグイン開発に必要みたいなので、PluginbuilderをQGISに入れます。
インストール方法等はGitHubにチュートリアルがあったので、こちらを参考にさせていただきました。

```
https://gis-oer.github.io/gitbook/book/materials/python/10/10.html
```

#データのダウンロード
国土交通省のページからQGISで編集したいデータをダウンロードします。
ここでは「国土数値情報ダウンロード」⇒「農業地域（ポリゴン）」から長野県（平成27年）のデータをダウンロードしました。

```
https://nlftp.mlit.go.jp/index.html
```

一旦ここまで。随時更新していきます。
IoTを実践せよという宿題へのアプローチ

# 1. はじめに
IoTがバズワードとして全盛期の頃、「IoTを購入」とか「IoTを開発」という揶揄したフレーズがありました。IoTは、漠然とし過ぎて、説明できるズバリのキーワードが無いため、誤解が多いことが背景にあったのだろうと思います。
技術的な観点抜きに、製造業などの現場的な観点から見ると、「IoTはQC活動の一種」と伝えるのが最も良いと私は考えています。
そこで、「カイゼンできるならIoTを実践してみて欲しい」という上司からの要望があった場合、どうチャレンジするか？について記載してみたいと思います。

# 2.シーズ志向とニーズ志向
アマチュア向けIoT教材で一般的な構成は、センサー情報をネットを介して見える化する、というものだろうと思います。例えば温度センサの教材で学んだ人は、温度センサをどのように使うか？ということを考えて、設置してみるというアクションになるのではないでしょうか？ このようなアプローチを「シーズ志向」と呼びます。
シーズとは「種」ですが、上記の例では、温度センサと通信という技術が種に相当します。この種をどこに植えるか？を考えている訳です。
このようなアプローチは、とても難易度が高く、有用な使い道が見つけにくいと私は考えています。例えば、温度センサの使い道から考えるとします。パッと思い着くのは、部屋の温度、装置の温度、...みたいな発想になると思います。部屋の温度を測るにしても、空調が効いている部屋であれば、空調が管理している温度を測る意味が薄かったりします。装置の温度についても、既に装置に温度計が内蔵されていたりして、改めて温度センサを付ける意味は薄いこともあるでしょう。
つまり、シーズ志向は難易度が高く、貧素な発想に落ち着きやすい、というのが私の考えです。
では、どうするか？というと、ニーズ志向で考えた方が良いというのが私の考えです。
例えば、先の例では温度センサを取り付けてみたいという目標はあるものの、一旦、温度のことは忘れて、現場の課題を洗い出す作業を行います。最後にその課題から温度に関連するものを探し出すというアプローチになります。
課題はニーズ（要求）を持っています。ニーズがあるところに、シーズを当てはめれば、有用性が増します。つまり、価値あるIoTとなる訳です。

# 3. 課題の抽出
みなさんの現場では、3S、5S、7Sといった活動やQC(品質管理を考える)活動が行われているかと思います。ここで挙がった課題を使うのがIoT実践の一歩だと思います。
もし、その活動が行われてないならば、まずは現場の課題を探しましょう。洗い出しの例です。（ブレインライティング）
1. A4程度の適当な紙を用意します。
2. 箇条書きで、現場の課題を挙げていきます。制限時間は10分です。10個が目標です。
3. 複数人で行った場合
 - その紙を他人に見せます。3人以上の場合は時計回りで紙を渡します。
 - それを見て、自分でも新たに思い着いた課題を、空いている場所に記載します。制限時間は5～3分です。
 一人で行った場合
 - 1日程度（時間が無ければ1時間程度）間を置き、書いた紙を見直します。
 - それを見て、新たに思い着いた課題を記載します。制限時間は10分です。 
4. 挙がった課題の中から、重要度の高いものを投票します。一人ずつ、A(2点)とB(1点）の項目を決めます。最も点数の高い課題がトップです。一人の場合は、1位と2位を自分で決めることになります。これで、解決したい課題が決まります。


# 4. 課題に対するIoTでのアプローチ
解決したい課題が見つかったところで、IoTでどのように解決するかというフェーズになります。ただし、IoTでは対応できない課題もあります。例えば、給与が低い、という課題が挙がってしまうと、それはIoTではどうすることもできません。この場合、その課題を他の課題と組み合わせて、もっと根本的な課題に結びつけられないかを考えましょう。残業が多い という別の課題があったとします。残業が多く、給与が低い と組み合わせた条件から連想される課題を考えます。受注数と生産数のミスマッチという別の課題が連想されたとすると、そのミスマッチについて、更に深掘りし、最後はIoTで解決できないかを考えます。この場合は、生産効率が細かく測定できないか？というニーズにいきつくのではないでしょうか？もし、最後までIoTに関連しない課題であれば、それは一旦お蔵入りにするのが良いでしょう。
ここまで読んだ方は気付いたと思いますが、課題が多いほど、IoTを実践するネタが見つかりやすいです。うまく、IoTのネタが見つからない場合は、他に課題がないかをもう一度考えるのが良いでしょう。

# 5. おわりに
IoTの実践は、重要な課題に対して行うことで、ようやく価値が出ると思います。IoTというシーズだけを考えると、あまり価値のない実践になりがちです。ニーズとなる課題を多く見つけ出し、価値あるIoTの実践をしていただければと願っています。

# 参考図書
- 日本創造学会 監修、実例で学ぶ創造技法、日科技連、2020年1月、https://www.juse-p.co.jp/products/view/789
- 石井力重、使えるアイディアがあふれ出る すごいブレスト、フォレスト出版、2020年12月,
- https://www.forestpub.co.jp/author/ishii_rikie/book/B-1970
- 石井力重、アイディア・スイッチ、日本実業出版社、2009年7月
- 須藤順、原亮、アイディアソン！ アイディアを実現する最強の方法、株式会社徳間書店、2016年9月、https://www.tokuma.jp/book/b495600.html
pythonの*（アスタリスク）引数について（とitertools.starmap）

# これは何？
mapについてpythonの公式ドキュメント[^1]見ていたとき
> map() と starmap() の違いは function(a,b) と function(*c) の差に似ています。

という記述があり、何だコレってなったのがきっかけ。
> function(a,b) と function(*c) の差

を知るのが目的

# アスタリスク引数の効果
Qiita記事[^2]にすごくよくまとまっていた。
function(a,b) と function(*c) の差と言っているのが、以下のうちどちらかわからない。

```python
def sum1(a,b):
    return a+b

def sum2(*c):
    ret = 0
    for n in c:
        ret += n
    return ret

a = 1
b = 2
c = [a,b]


sum1(a,b)
# > 3

# pattern1
sum1(*c)
# > 3

# pattern2
sum2(*c)
# > 3
```

pattern1はアンパックであり、
`sum1(*c) = sum1(c[0], c[1])` で、`len(c) = 2` だから（sum1の引数の数と一致するから）うまく動く。

pattern2は可変長の引数に対する処理で、
`len(c)`がいくつであってもうまく動く。

関数の*引数についてはよくわかったが、せっかくなので、starmap()について見てみる。

# itertools.startmap()

公式ドキュメント[^1]にあるように

```python
list(starmap(pow, [[2,3],[3,4],[4,5]]))
# --> 32 9 1000
```
となる。
これは$2^{3}, 3^{4}, 4^{5}$のように
第2引数、$[a,b,c,\cdots]$に対して
$a[0]^{a[1]},b[0]^{b[1]},c[0]^{c[1]}, \cdots$を計算していることがわかる。
同じように

```python
list(starmap(sum, [[2,3],[3,4],[4,5]]))
```
とすれば、$2+3, 3+4, 4+5$を計算してくれるだろうと思っていたが

```python
TypeError: 'int' object is not iterable
```
と出てくる。
int object…？

```python
list(starmap(sum, [[2,3,4],[3,4,5],[4,5,6]]))
```

とすると

```python
TypeError: sum() takes at most 2 arguments (3 given)
```
だと…。
なるほど、3 givenということは、2, 3, 4の3つを引数だと思ったのか。
sum([2,3,4])ではなく、sum(2,3,4)として扱われたということか。

[2,3]のときも
sum(2,3)として扱われて、第1引数が2でintが入っていたため

```python
TypeError: 'int' object is not iterable
```
このErrorが出たのか。
公式ドキュメント[^3]によるとPython3.8以降では

```python
sum(iterable, /, start=0)
```
らしくて、第2引数で下駄を履かせられるようになったらしい。

話をもとに戻して、$2+3, 3+4, 4+5$とを計算するためには

```python
list(starmap(sum, [[[2,3]],[[3,4]],[[4,5]]]))
# [5, 7, 9]
```
とすれば良い。
つまりstarmapは

```python
starmap(func, [funcに入れる引数, funcに入れる引数,...])
```
と理解すれば良さそう


[^1]: https://docs.python.org/ja/3/library/itertools.html#itertools.starmap
[^2]: https://qiita.com/LouiS0616/items/1bbe0a9bb93054f6c380
[^3]: https://docs.python.org/ja/3/library/functions.html?highlight=sum#sum
laraval8 + vue.js2.6で、親子(parent-child)component間の通信について

###この本を書いたきっかけは？何についての記事？
「これから始める、Vue.js実践入門」（山田祥寛/著、SBクリエイティブ株式会社/発行）のリスト4-14あたりをlaravel8のプロジェクト内でやりたかったので、コードを少し改変してみた。

###参考にさせていただいたサイトなど
https://orkhan.dev/2020/04/14/accessing-parent-and-child-component-in-vuejs/
https://laracasts.com/discuss/channels/vue/vuejs-component-within-component-getting-data-from-child-component
https://vegibit.com/how-to-create-a-child-component-in-vuejs/
https://stackoverflow.com/questions/45387307/define-vue-component-in-laravel

###前置きはこれくらいにして

```javascript:app.js
import App3 from './components/MyComponent3.vue'
const app3 = new Vue({
    el: '#app3',
    components: {
         App3
    },
});
```

```javascript:MyComponent3.vue
<template>
  <div>
    <div>
      <p>現在値：{{ current }}</p>
    </div>
    <mycomponent4 step="1" v-on:plus="onplus"></mycomponent4>
    <mycomponent4 step="2" v-on:plus="onplus"></mycomponent4>
    <mycomponent4 step="-1" v-on:plus="onplus"></mycomponent4>
  </div>
</template>

<script>
import mycomponent4 from './MyComponent4.vue';
export default {
components: {mycomponent4},
 data: function () {
    return {
        current: 0,
    }
 },
  methods: {
    onplus: function (e) {
      this.current += e;
    },
  },
};
</script>
```

```javascript:MyComponent3.vue
<template>
<button type="button" v-on:click="onclick">
  {{ step }}
  </button>
</template>
<script>
export default {
 data: function () {
    return {
        current: 0,
    }
 },

    props: ['step'],
    methods: {
        onclick:function() {
            this.$emit('plus', Number(this.step));
        }
    }
};
</script>
```
```php:index.blade.php
<!doctype html>
<html lang="ja">
<head>
    <title>Index</title>
    <link href="{{ mix('css/app.css') }}"  rel="stylesheet" type="text/css">
    <meta name="csrf-token" content="{{ csrf_token() }}">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" />
</head>
<body>
    <div id="app3">
        <app3>
        </app3>
    </div>
    <script src="{{ mix('js/app.js')}}">
    </script>
    <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>
</body>
</html>
```
```php:HelloController.php
class HelloController extends Controller
{
    public function index()
    {
        return view('hello.index', $data);
    }
}
```

![qiita用.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280325/7d6f64ee-f773-a1b3-496c-6a97c0588b7a.png)

※ボタンを押すと、現在値の数字が、ボタンに書かれている数だけ変動します。

ここまで読んでいただき、ありがとうございました。何かの参考になれば幸いです。
ORACLE-SQLServer ヒント句対応表

テーブルフルスキャンなどテーブルの読み込み方式など制御できるものは見つけられなかった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82321/0e6f3d34-7572-ed73-eb8d-4a0951928ef6.png)

* 参考文献
    - https://docs.microsoft.com/ja-jp/sql/t-sql/queries/hints-transact-sql?view=sql-server-ver15
PHP PDOクラスでデータを取得する方法

#環境
・PHP7
・MAMP
・phpMyAdmin

#①データの取得

```php
function connect_db(){
    //ホスト名、データベース名、文字コードの３つを定義する
    $host = 'localhost';
    $db = 'lesson';
    $charset = 'utf8';
    $dsn = "mysql:host=$host; dbname=$db; charset=$charset";

    //ユーザー名、パスワード
    $user = 'root';
    $pass = 'root';

    //オプション
    $options = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false,
    ];

    try{

        //上のデータを引数に入れて、PDOインスタンスを作成
        $pdo = new PDO($dsn, $user, $pass, $options);
        
    }catch(PDOException $e){
        echo $e->getMessage();
    }

    //PDOインスタンスを返す
    return $pdo;
}

//データベースと接続して、PDOインスタンスを取得
$pdo = connect_db();

//実行したいSQLを準備する
$sql = 'select * from lesson_pdo';
$stmt = $pdo->prepare($sql);

//SQLを実行
$stmt->execute();

//データベースの値を取得
$result = $stmt->fetchall();
```

#②データの表示
データベースから取得されたデータは、連想配列になっている

```php
foreach($result as $r){
    foreach($r as $key => $value){
        echo $key . ' * '. $value;
```
git restoreでファイル変更を元に戻す

# はじめに
ファイルが複数削除されてしまい、`git restore`を知らずに一つ一つ作り直しコピペしてました。
ですが、このコマンドなら一瞬でした。
※`git switch`についても書いておこう。。。

#git restore

ファイルを間違えて削除した時や変更を元に戻したい時、`git resore`コマンドで戻せます。
`git status`でファイルパスを確認し、`git restore ファイルパス`にするとそのファイルだけ元に戻せます。

```
git status
# modified:   app/controllers/hoge_controller.rb

git restore app/controllers/hoge_controller.rb
```

ファイルを指定しない場合

```
git restore .
```


# git switch

`git switch -c`でブランチを作成して移動出来ます。

```
git switch -c hoge
```

ブランチ移動

```
git switch hoge
```

以上です。ありがとうございました！
Prism コードサンプル学習：05-ViewInjection

# Prism コードサンプル学習：05-ViewInjection

## はじめに

以下の記事の続きです。
<https://qiita.com/mngreen/items/d4164e0107fd5b69b1c9>

## 05-ViewInjection

本サンプルではRegionManagerクラスを用いて、対象regionにViewを追加します。

```xml
<Window x:Class="ViewInjection.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        Title="Shell" Height="350" Width="525">
    <DockPanel LastChildFill="True">
        <Button DockPanel.Dock="Top" Click="Button_Click">Add View</Button>
        <ContentControl prism:RegionManager.RegionName="ContentRegion" />
    </DockPanel>
</Window>
```

```csharp
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        IContainerExtension _container;
        IRegionManager _regionManager;

        public MainWindow(IContainerExtension container, IRegionManager regionManager)
        {
            InitializeComponent();
            _container = container;
            _regionManager = regionManager;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var view = _container.Resolve<ViewA>();
            IRegion region = _regionManager.Regions["ContentRegion"];
            region.Add(view);
        }
    }
```

- [Add View]ボタンを押下することで、ContentRegionにViewが追加されます。
- regionManager.Regionsプロパティにインデクサでアクセスすることで対象のregionを取得できます。
  - このように対象のregionを取得できるのは添付プロパティであるRegionManager.RegionNameプロパティに値がセットされたタイミングで[Regionを生成するメソッド](<https://github.com/PrismLibrary/Prism/blob/master/src/Wpf/Prism.Wpf/Regions/RegionManager.cs#L118>)が呼び出されるため。
    - 正確にはそこで生成された[DelayedRegionCreationBehavior](https://github.com/PrismLibrary/Prism/blob/master/src/Wpf/Prism.Wpf/Regions/Behaviors/DelayedRegionCreationBehavior.cs)がやってくれる
  - [region.Addメソッド](https://github.com/PrismLibrary/Prism/blob/master/src/Wpf/Prism.Wpf/Regions/Region.cs#L234)でviewが追加されると巡り巡って[InnerAddメソッド](https://github.com/PrismLibrary/Prism/blob/b0a14dd540b423931e39a3b05613f5ce5d9a2e40/src/Wpf/Prism.Wpf/Regions/Region.cs#L367)が呼び出される。
    - viewはItemMetadataクラスとしてラップされてItemMetadataCollectionに追加される。viewNameを合わせて付与される。
    - ItemMetadataCollectionが変更されると、ViewsCollectionがItemMetadataCollectionによって生成されているため、そちらのハンドラ（ViewsCollection.SourceCollectionChangedメソッド）で処理される。これにより、ただregion.Addしているだけのように見えるが、CollectionChangedイベントが発火されてUIが更新される。

## おわりに

今回はRegionManager, Regionクラスのソースコードを中心に読みました。
DependencyPropertyを利用してアタッチされたタイミングでRegionを生成するといった工夫をすることで、利用者側が便利になる工夫が見られました。
次回、06-ViewActivationDeactivationについて見ていこうと思います。
Google Colaboratoryで簡単な画像処理してみました。

# はじめに
　この記事は、pythonましてやPCにすらあまり触ったことのない逆に珍しい高専生（編入学生）が、書いている内容の薄い記事です。他の方の記事を参考にさせていただいている点がかなり多いです。温かな目で見ていただけたら嬉しいです。

#必要な環境
 - [google colaboratory](https://colab.research.google.com/notebooks/intro.ipynb#)
 - OpenCV

#画像をアップロードして表示
　今回は任意の画像が使いやすいようにアップロードして処理することにします。`files.upload()`を使うことでアップロードすることができます。
コマンドを実行するとアップロードフォームが表示されるのでアップロードしてください。
その後ファイル名を取得しておきます。

```python:Upload
from google.colab import files
uploaded_file = files.upload()
img = next(iter(uploaded_file))
```
#画像表示
##オリジナルの表示　
 OpenCVを使って画像を読み込みますが、OpenCVでの画像の色はRGBではなくBGRで扱われているため、一般的なRGBに変換します。その後、`matplotlib`を使って画像を表示します。

```python:画像表示
import cv2
from matplotlib import pyplot as plt

img2 = cv2.imread(img)
#RGB変換
src = cv2.cvtColor(img2,cv2.COLOR_BGR2RGB)
#画像の表示
plt.imshow(src)
#値の非表示
plt.axis('off')
```
これでオリジナルの画像が表示されます。
![スクリーンショット (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/926438/6236e00f-3c3d-67f6-b0e8-18ae7f448fa0.png)

##色の反転
　色の反転は簡単で`src = 255 - src`を入れるだけです。これは元の色の値を白(255)から引くことによって値が反転する事を利用しています。

```python:色の反転
import cv2
from matplotlib import pyplot as plt

img2 = cv2.imread(img)
src = cv2.cvtColor(img2,cv2.COLOR_BGR2RGB)
#反転
src = 255 - src
plt.imshow(src)
plt.axis('off')
```

実行結果
![スクリーンショット (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/926438/c8679ad3-394e-d334-ea86-00a218ac6daf.png)


##グレースケールへの変換と表示
　グレースケールへの変換は`cv2.cvtColor(pixels, cv2.COLOR_BGR2GR)`で変換できます。
オリジナルと違う点はそこだけです。

```python:グレースケール
import numpy as np
pixels = np.array(src)
import matplotlib.pyplot as plt
#グレースケールに変換
img_gray = cv2.cvtColor(pixels, cv2.COLOR_BGR2GRAY)

plt.imshow(img_gray)
plt.axis('off')
```
実行結果
![スクリーンショット (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/926438/a8f19d26-6021-b25c-64ba-ba6a7e313948.png)

##二値化
　最後に二値化です。二値化は先にグレースケールに変換してから、` cv2.threshold(img_gray,128, 255, cv2.THRESH_BINARY`で二値化します。128の部分は**しきい値**と言い、ここの値より明るい数値は白(255)に、暗い数値は黒(0)になります。しきい値の値が二値化するにあたって重要になってきます。

```python:二値化
import numpy as np
pixels = np.array(src)

import matplotlib.pyplot as plt]
#グレースケールへ変換
img_gray = cv2.cvtColor(pixels, cv2.COLOR_BGR2GRAY)
#二値化
retval, img_binary = cv2.threshold(img_gray,128, 255, cv2.THRESH_BINARY)

plt.imshow(img_binary)

```
実行結果

しきい値＝128
![スクリーンショット (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/926438/e3405865-e408-98a4-2478-a3faac28c75b.png)

しきい値＝8
![スクリーンショット (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/926438/26df8b14-d377-26cf-b691-6e8322fdd502.png)

#参考資料
 - https://takacity.blog.fc2.com/blog-entry-142.html
 - https://qiita.com/croquette0212/items/36cadce5bf0fb703ed19
 - https://dronebiz.net/tech/opencv/binarize
tableタグの中でflex-boxを使うとborderが重なるのを回避する

## 現象
flexクラスがついたtdの中身を上下中央の横並べにしようとすると、flexクラスがついたtdのみborderが太くなる

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="html,result" data-user="kena-nk" data-slug-hash="QWKVMMK" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="table">
  <span>See the Pen <a href="https://codepen.io/kena-nk/pen/QWKVMMK">
  table</a> by kena-nk (<a href="https://codepen.io/kena-nk">@kena-nk</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## 回避策
① tdの中にdivタグを入れて、そこにflexクラスを当てると回避できる

```html:index.html
<table>
    <tr>
        <td>aaa</td>
        <td>
          <div class="flex">
            <span class="badge">new</span>
            <div>
              <span>aaa</span>
            </div>
          </div>
        </td>
        <td>aaa</td>
    </tr>
    ...省略
</table>
```

② div要素をインライン要素にして回避する

```html:index.html
<table>
    <tr>
        <td>aaa</td>
        <td>
            <span class="badge">new</span>
            <div style="display: inline">
              <span>aaa</span>
            </div>
        </td>
        <td>aaa</td>
    </tr>
   ...省略
</table>
```

③ 要素を指定する系で解決する

```css:style.css
table > td > div:nth-of-type(2) {
   display: inline;
}
```
↑の`nth-of-type(2)`はdivの2つ目という指定ではなく、表の左から2列目を指している。

## なぜtdタグに`display:flex`を当てるとうまくいかなくなるのか(推測)
`td`タグは`display: table-cell`と同じ役割を担っている。

なので、`td`タグに`display: flex`を当ててしまうと、同じテーブル内に`display: table-cell`と`display: flex`が共存してしまう感じになるので、結果うまくいかなくなるのかな〜と推測した。

なぜ共存するとおかしくなってしまうのか厳密には分からないので誰か知ってる人いたら教えて欲しい・・・！


## 追記 (2021/01/12)
@nagtkk さんにコメントをいただきました！

tdに`display: flex`を当てると`display: table-cell`が自動生成されてしまい、その下に`display: flex`がくるため`border-collapse: collapse`が効かなくなり2重になって見えるようです！

参考：https://www.w3.org/TR/CSS2/tables.html#anonymous-boxes
JavaScriptで配列から特定の値を含む要素を削除する

## 完全一致の場合

```
const array = ["ねこ", "いぬ", "とり", "さる", "キジバト"];

const indexOfDog = array.indexOf("いぬ");

array.splice(indexOfDog, 1);
```

## 部分一致の場合

```
const array = ["ねこ", "いぬ", "とり", "さる", "キジバト"];

const indexOfPigeon = array.findIndex(animal => animal.includes("バト"))

array.splice(indexOfPigeon, 1);
```

どちらもインデックスを取得してから```splice()```で削除する。
```findIndex()```は条件式が```true```になった最初の要素のインデックスしか取得しないので注意。
```splice()```の第一引数は削除する要素の位置、第二引数はそこから削除する要素の数。


## 参考
* indexOf()
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf

* findIndex()
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex

* splice()
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
プログラミング初心者　Qiitaへ投稿の始め方。

# プログラミング初心者　Qiitaに初投稿をしてみた。投稿方法。
環境
　Windows10　＋　Chrome

# はじめに
プログラミングとやらをやってみようと思って、暗中模索。
Qiitaの皆様のお知恵を拝見させてもらいながら、勉強しています。
自分の勉強した事もいつか誰かの役に立てればと投稿してみました。
初投稿は勇気がいるものですね。
他の誰かも見て　やってみる気になればなとおもって　投稿までに
やってみたことを書いてみました。

## 準備したもの
メールアドレス　　：　グーグルのアカウントの方が便利そう？
GitHubアカウント　：　登録してみたけど、投稿にはあまり関係無かった。
　　　　　　　　　　　今後コードを投稿する時に便利かもしれない。

## 流れ
グーグルのメールアドレスを登録する。

GitHubのアカウントにグーグルのメアドで登録する。

QiitaにGitHubアカウントで登録する。

アクセス履歴を見られるようだ。グーグル　アナリティクスを登録してみる。
　参考：[Qiita]:https://qiita.com/Qiita/items/c7f704e3786df3aa7a11

Qiitaの右上の「投稿する」から投稿してみました。

# その後
すぐにグーグル　アナリティクスにアクセスしてうまく動くか確認してみました。
左メニューの「リアルタイム」をクリックすると　アクセスのカウンターが出てきます。
自分のアクセス数がカウントされていれば成功です。
　今回は偶然　どなたかも覗いていただいた？みたいで、「２」と表示されていました。
SNSとかもやっていないと　少しうれしいものですね。

「Qiitaを見ているだけの人」だった自分ですが、こんな内容でも「やってみる」と
何か変わった感じがします。
VSCodeでPythonの環境を「楽に」整える

#初めに
こんにちは。今回の投稿は覚え書き兼共有といった感じです。
見た感じ同じような投稿はQiitaでは長いこと投稿されていなかったようなので、投稿します。あと、初投稿なので試行錯誤になるうえ、たぶん間違いが何か所かあることが予想されるうえ、わかりにくいと思います。ごめんなさい。

#目次
1. VSCodeをインストール
2. 拡張機能をインストール <- **ここで終了**
3. 実行する

#1. VSCodeをインストール
1. ブラウザで**VSCode**と検索してもいいですし、[これ](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)をクリックしてもらってもいいです。とりあえずホームページに行きます。
2. 上のほうにある**今すぐダウンロード**をクリックして、お使いのOSに合わせてダウンロードボタンを押します。
3. インストーラーを起動し、案内されるがままに設定をあなた好みの物にしながら本体をインストールします。
4. インストールされたら、起動します。

１編は以上です。多分わかりにくいと思います。(笑)

#2. 拡張機能をインストール
順当にいけばVSCodeは起動されているはずなので、もし起動されていなかったら起動してください。

1. `Ctrl + Shift + x` (Windowsの場合) を押すか、左サイドバーにある**４つのブロックの１つが離れていった**みたいなデザインのボタンをクリックします。マウスホバーしたら**Extensions**と表示されます。
2. すると上のほうに**Search Extentions in ...(Marketplace)**と表示されると思うので、そこで**Python**と入力し、一番上のものをクリックします。たぶん[これ](https://marketplace.visualstudio.com/items?itemName=ms-python.python)と同じものが表示されると思います。それ以外はやめておいたほうがいいです。
3. **Install**ボタンを押します。
4. 次の拡張機能をインストールします。**2-2**のところで、今度は**Jupyter**([これ](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter))と検索します。**Install**してください。

#3. 実行する
拡張子が`.py`であるパイソンのファイルを書けば、おそらく右上に緑の矢印が表示されると思います。それをクリックすれば、ターミナルが起動して実行結果が表示されます。

以上になります！楽しいVSCodeLifeを！ｗ
Hyper-Vの仮想マシン(Windows10)にサインインできなくなった！！

# 事象
Hyper-VにWindows10の仮想マシンを構築して、接続したらサインイン画面が表示されない。そのためログインできない。困った:frowning2:
![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443524/35de5623-8fea-827a-337d-6ab2f402b953.png)

# 原因
* Windows10バージョン2004 で発生している<br>（「MicrosoftアカウントにWindows Helloサインインを要求する」の設定が原因）
 * 拡張セッションで接続されると発生する
 
詳しくは、参考文献の[Window10バージョン2004の仮想マシンに「拡張セッション」でサインインできない](https://4thsight.xyz/18561) を参照にしてください。

# 対処法 3点
1.2. の対処法は参考文献の[Window10バージョン2004の仮想マシンに「拡張セッション」でサインインできない](https://4thsight.xyz/18561) を参照にしてください。

1. 「セキュリティ向上のため、このデバイスではMicrosoftアカウント用にWindows Helloサインインのみを許可する（推奨）」の設定をオフにする
2. 仮想マシンのWindows10にローカルアカウントを追加して、拡張セッションで接続するときはローカルアカウントを利用する
3. 基本セッションで接続する方法(下 参照)

# 基本セッションで接続する方法
拡張セッションで接続するとサインイン画面が表示されないので、「基本セッション」で接続されるようにすることで問題を回避する方法 2点。

* Hyper-Vの設定変更
* 接続画面から変更

## Hyper-Vの設定変更
1. Hyper-Vマネージャーより、[Hyper-Vの設定]をクリック![無題1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443524/72b56032-4505-1448-3bef-9cbc33b4ef89.png)
2. 「拡張セッションモード」の無効化<br>
[ユーザー]-[拡張セッション モード]をクリックして、[拡張セッション モードを使用する]の**チェックを外す**。![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443524/4cab0a31-d7f4-3157-af6e-f52e4fd67435.png)

## 接続画面から変更
1. 仮想マシンを起動します(全画面ではなくウィンドウ表示)。
2. ツールバーから[基本セッション]ボタンをクリック![無題４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443524/18cec04d-235a-ccc2-58fb-773f1d9c1e8c.png)

# 参考文献
* [Window10バージョン2004の仮想マシンに「拡張セッション」でサインインできない](https://4thsight.xyz/18561)
gradleプロジェクトでリリースバージョンとリリースノートを自動作成

# 背景

Javaプロジェクトを開発している時にいくつか課題があり、それぞれ以下のように解決しました。

- リリースのたびに`build.gradle`の`version`を書き換える必要がある -> [gradleプロジェクトでバージョンを自動指定](https://qiita.com/kazntree/items/18277f2b763589c86d02)
- リリースノートの作成が手間 -> [GitHubのリリースノートの自動作成](https://qiita.com/kazntree/items/3fbb623b2512f5652bcb)

上記をもう少し自動化してみようというのがこの記事の目的となります。前提として、bashコマンドを用いたスクリプトを実行するため、bashが利用できる環境であることが条件となります（`macOS Big Sur`と`Amazon Linux 2`では動作確認済み）。

# 事前準備
## grenコマンドのインストール
[gren-release-notesパッケージのインストール](https://qiita.com/kazntree/items/3fbb623b2512f5652bcb#gren-release-notesパッケージのインストール)の手順に沿ってgrenコマンドが利用できるようにします。

## build.gradleの設定
[nebula](https://github.com/nebula-plugins/nebula-release-plugin)プラグインを利用するため、[gradleプロジェクトでバージョンを自動指定](https://qiita.com/kazntree/items/18277f2b763589c86d02)を参考に`build.gradle`を設定します。

## GitHub CLIのインストール
GitHub CLIは、GitHub上でリリースドラフトを作成するために利用します。以下の手順でインストールと設定をします。

1. 利用する環境に合わせて、[Installation](https://github.com/cli/cli#installation)を参考にインストールします。
2. 先ほどと同様に、個人アクセストークンを作成します。権限は`repo`と`read:org`にチェックを入れます。
3. 一度だけ[gh auth login](https://cli.github.com/manual/gh_auth_login)を実行して認証します。`echo {個人アクセストークンの文字列} | gh auth login --with-token`を実行します。

上記設定の後、GitHubリポジトリに移動して`gh repo view`を実行し、結果が表示されたらOKです。

# スクリプトの実行
https://github.com/kazntree/nebula-chain にある`release.sh`をリリースしたいリポジトリ内の任意の場所に置いて実行すると、新しいバージョンでリリースして、さらにプルリクエストを基にリリースノートを作成します。

```
$ ./script/release.sh
Do you want to release and publish? [y/n]
y
release start.
Inferred project: nebula-chain-test, version: 0.4.0

> Task :release
Tagging repository as 0.4.0
Pushing changes in [0.4.0] to origin

BUILD SUCCESSFUL in 7s
11 actionable tasks: 10 executed, 1 up-to-date
https://github.com/kazntree/nebula-chain-test/releases/tag/0.4.0
Getting gren config from local file /home/ec2-user/github/nebula-chain-test/.grenrc.yml

🤖  - Generate release notes:
===================================
✔ Releases found: 4
✔ Tags found: 0.4.0, 0.3.0
✔ Pull Requests found: 1
✔ 0.4.0 has been successfully updated!
See the results here: https://github.com/kazntree/nebula-chain-test/releases/tag/0.4.0
```

メジャーバージョンを上げたい場合は`release.sh -Prelease.scope=major`を、パッチバージョンを上げたい場合は`release.sh -Prelease.scope=patch`を指定します。

## release.shの説明
`release.sh`で行っていることは、以下のとおりです。

- 事前準備が終わっているか確認する（コマンドの存在など）
- コマンド実行の確認（`y`で実行）
- nebulaプラグインを利用して、新しいバージョンをリリース
- GitHub CLIを利用して、GitHub上で新しいリリースノートを作成
- grenコマンドを利用して、前回リリースから取り込まれたプルリクエスト一覧をリリースノートへ上書き
2021年に流行るかもしれない技術6選！！

# はじめに
今回は2021年に流行りそうな技術を6つほど 紹介していきます！

## 対象読者
- 今後学びたいことを見つけたい人
- 技術系の話題を探している人

# YouTube動画
動画で確認したい方はこちらでご確認ください！
[【YouTube動画】 現役エンジニア社長が予想する2021年に伸びそうな技術6選](https://youtu.be/L8ezjJmCbVk)
[![現役エンジニア社長が予想する2021年に伸びそうな技術6選](https://img.youtube.com/vi/L8ezjJmCbVk/0.jpg)](https://youtu.be/L8ezjJmCbVk)

# Tailwind CSS
Tailwind CSSは utility-first を主眼に置いた CSSフレームワークです！
utility-firstは、複雑な構成を単純なクラスの組み合わせで表現する手法です。

Tailwind CSSはBootstrapと同じ CSSフレームワークという部類ですが、buttonクラスやnavクラスといったものが存在しません。
1クラスに対して、1プロパティを割り当てたものを複数用意したフレームワークです。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/bcd6ce64-6e6b-e3aa-5393-c5d34fff1872.png' width='550'>

1クラス1プロパティであるため、クラスの量が多く、何も圧縮しない場合、3739.4KBほどのサイズになります。
しかし、Tailwind CSSは<b>使用していないクラスをビルド時に省く</b>ことができ、ビルドサイズを小さくできます (purgeCSSを内部にもつ)。

## 参考
[CSSフレームワークのトレンド](https://2020.stateofcss.com/en-US/technologies/css-frameworks/)
[Tailwind CSS](https://tailwindcss.com/)
[purgeCSS](https://purgecss.com)


# Headless CMS
Headlessとは、フロントがないという意味です。
Headless CMSは、WordPressのように記事の管理や配信、検索などの機能を残しつつ、フロントを自由にカスタマイズできるサービスです。
サービスとしては、contentfulやprismic, Netlify CMSといったものがあります。

# Serverless Architecture
Serverless Architectureは、サーバー管理不要なサービスを使って、バックエンドを構築する手法です。
AWSでいうと、Amazon API GatewayやAWS Lambdaなどがあります。

AWS Lambdaの方は最近、コンテナのデプロイができるようになり、利用の幅が広がりました。

またBBC News Onlineが自社サイトをサーバレス化したそうで、サーバー管理しなくて良くなるメリットを生かしたい企業はこれからも増えそうです。

## 参考
[New for AWS Lambda – Container Image Support](https://aws.amazon.com/jp/blogs/aws/new-for-aws-lambda-container-image-support/)
[Moving BBC Online to the cloud](https://www.bbc.co.uk/blogs/internet/entries/8673fe2a-e876-45fc-9a5f-203c049c9f9c)

Lambdaのコンテナデプロイについては、動画化しているので、興味のある方はこちらもどうぞ。
https://youtu.be/JNzOTwRsIoQ

# ISR
今のところ(2021/1/11)、NextjsとVercelでしか使えませんが、SSGの弱点を克服して、動的に静的ページを生成する仕組みです。
SSGは全てのページをビルドしておいて、静的ファイルを配信する仕組みです。
ただ、変更を加えたページだけをビルドするということが現状できないため、変更があると全てのページをビルドし直す必要があります。

ISRでは、ユーザーのリクエストや時間によってサーバー側で該当ページだけをSSGするという仕組みを提供します。


# Web Assembly
HTML, CSS, JavaScriptの次に、新しくブラウザでサポートされたのが WebAssemblyです。
ブラウザ上で動作するバイナリ形式のアセンブリ風言語とのことで、JavaScriptの補完を目的に作られました。

コンパイラはいくつかありますが、この間安定版が出たWasmerの場合、C/C++, Rust, Python, Ruby, PHP, JavaScriptをWebAssemblyに変換できるようです。

# Rust
パフォーマンスが良く、メモリの安全性を保った言語で、C/C++の代替として注目されています。
MicrosoftがRustを部分的に使っているようで、これからも伸びていきそうです。
クラウド上にコールセンターを作れるAmazon Connect入門 【用語解説】

# はじめに
Amazon Connectとは、クラウド上にコールセンターを安価に構築できるサービスです。

普通にコールセンターを作ろうとするとPBXという高額な機械が必要ですが、Amazon Connectであれば初期費用ゼロで構築できます。
運用費は従量課金で安く (3,000ー4,000円/月) 利用できます。
固定電話不要で、ブラウザとマイクがあれば、電話として使えるのも特徴です。

また電話だけでなく、音声データを解析し、声紋認証や感情分析などができたり、CRM連携も標準で付いています。

本記事では、そんなAmazon Connectを実際に使うときに、知っておいた方が良い予備知識 (用語) を解説します。

## 対象読者
- はじめてAmazon Connectを触る方
- 用語の整理をしたい方

# YouTube動画
文字だけでなく、動画での解説もしています。
興味のある方はこちらもみていただけると嬉しいです。
[【YouTube動画】クラウド上にコールセンターを開設できるAmazon Connect入門！！](https://youtu.be/0Lrn1KSiSX4)
[![クラウド上にコールセンターを開設できるAmazon Connect入門！！](https://img.youtube.com/vi/0Lrn1KSiSX4/0.jpg)](https://youtu.be/0Lrn1KSiSX4)


# Amazon Connectの用語解説
Amazon Connectは以下のような構成で、電話の発信および着信ができます。
まず、用語について解説した後に発信・着信時の処理の流れをみていきます。
![スクリーンショット 2021-01-01 14.51.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/f114cb07-be88-fa2e-4bfd-bbf2396a2eb6.png)

## 電話番号
Amazon Connectでは、インスタンスを作成すると、050番号、0120番号、080番号などを取得できます。
電話番号は枯渇しやすいので、取得できない場合はサポートに連絡する必要があります。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/7d5472a7-f6eb-ae39-abbd-8dee8ca7186d.png' width='550'>


## 問い合わせフロー
問合せフローは電話番号を受信した時にどういう処理をするか設定できます。
デフォルトでいくつか使えるフローもありますし、自分で新しく作ることもできます。

設定はGUIででき、Lambdaを起動したり、音声データを録音したり、解析したりできます。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/c36eb668-9f90-bf5e-b7da-ba5e5be2d311.png' width='650'>


## キュー
キューは発信や着信を一時的に保持するために使います。
ユーザーはどこかのキューに属し、キューに入った電話が割り振られて、ユーザーに着信します。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/6b4b5baf-fc79-7ae3-30db-3bbe1598203f.png' width='550'>


## ルーティングプロファイル
ルーティングプロファイルはキューの優先順位を決めるために使います。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/067f5d91-febd-341b-e10c-6c4c202e4d37.png' width='550'>


## ユーザー (エージェント, オペレーター)
電話対応する人のことです。
ユーザーは1つのルーティングプロファイルしか持てないため、ルーディングプロファイルとユーザーの関係は1対nです。エージェントとも呼ばれます。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/113d31e7-793a-f74a-6507-f94732be0c1f.png' width='550'>


## セキュリティプロファイル
セキュリティ上の権限のことで、ユーザーをadminやoperatorといったグループに分け、各グループに対して権限を設定できます。ユーザーとセキュリティプロファイルはn対1の関係になっています。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751408/387c2111-d733-3958-e8f4-a7031bad994c.png' width='550'>



## アウトバウンド
コールセンターは電話の受信だけでなく送信もでき、これをアウトバウンドといいます。
ルーティングプロファイルはデフォルトのアウトバウンドキューを１つ設定できます。
そのルーティングプロファイルに所属するユーザーが電話をかける場合は、その番号を使って発信します。
また、キューにもアウトバウンドの電話番号を１つ設定できます。

# Amazon Connectの処理の流れ
発信時・着信時で処理の流れが異なるので、2つに分けて解説します。

## 発信時 (お客様 -> ユーザー(エージェント、オペレーター))
お客様が、ある電話番号に着信すると、電話番号に紐づいた問合せフローの処理が実行されます。
問合せフロー内でユーザーに割り当てるか、キューに割り当てるか設定できます。
ユーザーに割り当てた場合は、そのユーザーに電話がかかります。
キューに割り当てられた場合は、ルーティングプロファイルを元に優先順位付けされた後、ユーザーに電話がかかります。

また、ユーザーにはAgentやAdminなどのRoleがあり、それに対応する権限がセキュリティプロファイルで設定されています。


## 着信時 (ユーザー(エージェント、オペレーター) -> お客様)
ユーザー (エージェント, オペレーター) があるお客様に着信すると、ユーザーの属するキューからお客様に向けて着信されます。
この場合にも、間にコンタクトフローを挟み、Lambdaを実行したり、録音したりができます。

# まとめ
今回は、Amazon Connectを設定する前に知らないと挫折する用語に関して説明しました。
少しでも用語が整理できればなと思います。
『OpenCVによる画像処理入門』練習問題6.2 途中まで

[『OpenCVによる画像処理入門』](https://www.kspub.co.jp/book/detail/1538290.html)の練習問題6.1 1と2のみ。
3の疑似カラー処理が分からない。。
#練習問題6.2
1. 適当なグレースケール画像を用意し、式6.2,6.3,6.4にしたがって、度数分布と累積度数を求めよ
2. 6.2節を参考に累積度数のグラフを描画せよ

グレースケール画像から、手計算で度数分布を求める方法がわからなかったので、全てプログラムを使用した。
度数分布を求める=度数分布表を描画せよ、と解釈。

プログラム（共通処理(p.51)は省略）

```cs

Mat img_hst = Mat::zeros(100, 256, CV_8UC1);
Mat img_sum = Mat::zeros(100, 256, CV_8UC1);

const int hdims[] = { 256 };
const float hranges[] = { 0, 256 };
const float* ranges[] = { hranges };
int channels[] = { 0 };
int sum = 0;

// 度数分布を求める
Mat hist;
calcHist(&img_src, 1,channels, Mat(), hist, 1, hdims, ranges);

// 度数の最大・最小値を取得
double hist_min, hist_max;
minMaxLoc(hist, &hist_min, &hist_max);



for (int i = 0; i <= 255;i++)
{
	// 累積度数の計算
	int v = saturate_cast<int>(hist.at<float>(i));
	sum = sum + v;

	//　度数分布の表示
	line(img_sum, Point(i, img_hst.rows), Point(i, img_hst.rows - img_hst.rows * (sum * 0.0000005)), Scalar(255, 255, 255));

	// 累積度数グラフの表示
	line(img_hst, Point(i, img_hst.rows), Point(i, img_hst.rows - img_hst.rows * (v / hist_max)), Scalar(255, 255, 255));
}

// 累積度数の表示
cout << sum << endl;
```

入力画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/d0e1938d-9f0d-e8e5-bec4-4fe540594244.png)
__度数分布__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/e89b6333-fdd5-5273-7a33-a7975feef4f3.png)
calcHist()を使用して度数分布を求める。

__累積度数__
1920000
各画素ごとの度数をsumに格納して累積。

__累積度数のグラフ__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/7b711a54-cea4-a1e1-5d2c-7f4fd67d0ec6.png)
度数分布の表示で使用した描画関数line()を使用。分解能として*0.0000005しているが、表示を繰り返してちょうど良いのにした。
[WordPress]プラグインで簡単にフォーム作成

こんにちは、ゲンキです。
今回は、ワードプレスのプラグイン__ContactForm7__を使って簡単にお問い合わせフォームを作る方法を紹介します。
この内容を記載している記事はいくつもありますが自分への備忘録として書き残したいと思います。

###### 完成形はこちら
![スクリーンショット 2021-01-11 15.29.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001040/44e89015-2656-95e2-8e9a-84e96a584163.png)

では、早速解説していきます。

### 1.WordPress管理画面新規追加からプラグインを追加
![スクリーンショット 2021-01-11 15.23.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001040/cfcb1818-85bd-d869-48c0-275bcb07bae9.png)



### 2.新規追加検索欄にcontactと入力
![スクリーンショット 2021-01-11 15.22.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001040/b2a95f69-3e0f-7c4e-09ce-7ec957aca218.png)
富士山のアイコンがついているプラグインが今回使用するContactForm７になります。
<font color=red>今すぐインストール</font>をクリック

### 3.ContactForm７を有効化
![スクリーンショット 2021-01-11 15.22.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001040/697d9420-af05-70a8-70ab-3b02bd4c10b3.png)
インストールが終わると今すぐインストールのボタンが有効化に変わります。
<font color=red>有効化</font>をクリック

### 4.管理画面のお問い合わせをクリック
![スクリーンショット 2021-01-11 15.23.16のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001040/b4f4eac9-6066-8edf-b8cc-d61b0bd0b27f.png)
ContactForm７の有効化ができると管理画面にお問い合わせの欄が追加されます。
<font color=red>お問い合わせ</font>をクリックすると下の画面に移動します。
![スクリーンショット 2021-01-11 15.23.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001040/c8d4efd0-a537-5737-0762-efa46f21020e.png)

### 5.デフォルトのコンタクトフォームを編集する
![スクリーンショット 2021-01-11 15.25.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001040/8ca64803-9a73-ec3c-2f52-d59924a98c79.png)
今回は、デフォルトで用意されているコンタクトフォーム１に郵便番号と住所の欄を作って使用します。
※編集しなくてもそのまま使用できます。

![スクリーンショット 2021-01-11 15.27.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001040/6a30e044-981e-9ff2-fd18-05d8b947757f.png)
郵便番号と住所の欄を追加しました。
< >で囲われている部分は__HTML__のタグを使用できます。
[ ]で囲われている部分はフォームのテンプレートから挿入することができます。
編集が終わったら保存

```
[contact-form-7 id="1075" title="コンタクトフォーム 1"]
```
ページ上部にある上記のショートコードをコピーしておきましょう。

### 6.フォームを表示させたいところにショートコードを埋め込む
このコードをファイルに記述することでフォームを表示させることができます。

```php
<?php echo do_shortcode( '[手順５でコピーしたショートコードを貼り付ける]' ); ?>
```
###7.完成！
コードを記述したところでサイトを見てみましょう、フォームが表示されていますね
これで完成になります！:joy:
![スクリーンショット 2021-01-11 15.29.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001040/ad4d5373-e07d-3354-3de7-8fcd8615bdfd.png)

# まとめ
今回の解説では、テキスト欄の色や入力欄の入力必須設定などは省いてあります。
かなり早足での解説＋初投稿でしたいかがだったでしょうか。文章での説明はとても難しいですね:sweat_smile:
またアウトプットの場として活用したいと思います、間違っているところなどありましたら指摘してくださると幸いです。
急にスケジュール管理を頼まれたとき

タスク管理方法は沢山あるが教えてもらうこともなく急にスケジュール管理をお願いされることも多い
そんなときの突貫アジャイル（大事なポイントだけ）

**1, ミーティングをして項目の洗い出しを行う。**  
依頼人より本スプリントで開発したいことをヒアリングする。
スプリント期間に収まるボリュームでヒアリングすることを心がける。
マインドマップなどを使用して整理するのがオススメ。
![task.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/7ad369b2-9b0d-403b-34db-7a1a98ba2120.png)

_※ 資料はサンプル_  

**2, 項目より開発ポイントを算出する。**  
A, 開発ポイントは、開発メンバー数名と話し合い、開発ポイントを１～１０内で決める。
B, 担当者の割り当て。共通の開発項目をまとめ、A担当、B担当、C担当などとして担当者を決める。
![devpoint.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/2037c3e5-73ae-69dc-e991-50616baae71a.png)
_※ 資料はサンプル_  

**3, 開発メンバーのベロシティ（開発速度）の算出する。**  
A, 前回のスプリントから開発メンバーのベロシティを算出する。（初回は想定ベロシティで良い。）
B, 前回のベロシティ×稼働日数を開発メンバーの開発メンバーが消化可能な合計開発ポイントを算出する。
C, 開発ポイントに合うように、スプリント項目を振っていく。
![velocity.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/4f97b35b-b26a-00ab-839d-8d2445cacad2.png)_※ 資料はサンプル_  

**4, スケジュールの作成する。**
A, 2で出した項目と3で出したベロシティからスケジュール化する。
B, 優先順位で並び替える。
C, そのあとに線を引いていく。
![schedule.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/5d528683-cd83-e4db-05b9-a44e0bfce7f7.png)
_※ 資料はサンプル_  

**5, 共有**  
A, ミーティングにて4を共有し説明を行う。1〜3は共有してもいいし、しなくてもよい。
B, RedMine、Backlogなどでタスク管理ツールにてタスクを発行する。
Python ctypes で CUDA Driver API を呼び出すメモ

## 背景

CUDA Driver API を python からぺろっと叩きたい.

pybind11 とか cfffi だとネイティブコードのビルドが必要になりめんどい. pure python(標準 python 機能)でやりたい(CI ビルドとかだと CUDA SDK インストールとかめんどい)

ctypes を使います.

https://docs.python.org/3/library/ctypes.html

CUDA Driver API(ドライバが入っていれば使える API)を想定します.
CUDA Runtime API(CUDA SDK or ランタイムのインストールが必要になる)は扱いません(API 面倒いし)

動かす Kernel は PTX 形式で生成されているものとします.
python で CUDA を叩くことで, たとえば PTX コードをテンプレートにしておいて, python 側で動的に書き換えてコンパイル(ターゲット GPU に合わせて最適なパラメータを設定)するとかができるようになります.


Clang で CUDA コードを NVPTX に変換するメモ
https://qiita.com/syoyo/items/4e60543aded0210fde49


## dll/so のありか

### Windows

`C:\Windows\System32\nvcuda.dll`

通常は `nvcuda.dll` だけで良い
(CUDA は NVIDIA driver インストールすれば自動で入っているので, ロードできなかったら NV GPU が挿さっていない PC(e.g. Intel 内臓/Xe or AMD GPU) であろう)

### Linux(Ubuntu)

Ubuntu ですと `/usr/lib/x86_64-linux-gnu/` あたりにあります. 

## さわりだけ


```py
from ctypes import *

cu = cdll.LoadLibrary("/usr/lib/x86_64-linux-gnu/libcuda.so")
print(cu)

ret = cu.cuInit(0)
assert ret == 0 # CUDA_SUCCESS

ver = c_int()
ret = cu.cuDriverGetVersion(byref(ver))
assert ret == 0 # CUDA_SUCCESS

print("CUDA version", ver)
```

```
CUDA version c_int(11020)
```

Voila!

ポインタのところは `byref` を使うといいようです.

あとはいろいろ API 呼び出していけば OK のはずです!

### その他

#### PTX Compiler API

PTX Compiler API のメモ
https://qiita.com/syoyo/items/cfaf0f7dd20b67cc734e

static lib しか提供されていないので, 一旦なんらかの dll を作る必要がありますが, これによりドライバにある PTX compile では満足できない場合, クライアントサイドでの PTX compile も pure Python でできるようになります!

## Runtime API

cuSparse など, runtime API の上に作られたライブラリを使いたいときもあります.

一応だいたいの dll/so は再配布可能なので, 

https://docs.nvidia.com/cuda/eula/index.html

必要であれば自身のアプリに同梱するなどして対応しましょう
(e.g. CI 環境で毎回 CUDA SDK インストールとかめんどい)
 
## TODO

* [ ] numpy との連携を考える(Python buffer protocol で連携になるかしらん)
正規表現を使って文字列判定をする。

変数を含んだpathでも特定のpathが含まれているかを確認する場合。

const noCheckPaths = /api/v1/user/${userId}などの場合

```
noCheckPaths.map(o => (`^${o}$`)).some(o => RegExp(o).test(ctx.path))) 

```
jestで関数ごとではなく、どこかしたらでthrow Errorの発生を予測した場合


```

const Function = require('../function');
const config = require('../config.js');

```

同期

```
describe('Timeout error', () => {
  const timeOutms = 60000;

  it('will be timeout', async () => {
    const function = new Function(config.function);
    let bThrow = false;

    try {
      await function.main();
    } catch (e) {
      if (e.message.indexOf('timeout') >= 0) bThrow = true;
    }
    expect(bThrow).toBe(true);
  }, timeOutms);
});
```


EventEmitterを利用している場合

```
describe('Timeout error', () => {
  const timeOutms = 60000;

  it('will be timeout', (done) => {
    function onError(data) {
      try {
        expect(data.error.message.indexOf('timeout')).toBeGreaterThanOrEqual(0);
        done();
      } catch (error) {
        done(error);
      }
    }
    const function = new Function(config.function);
    function.main(input);
    function.once('error', onError);
  }, timeOutms);
});
```
EDRと市場動向

【EDRとは？】
Endpoint Detection and Responseの略称。
直訳は「エンドポイント上の検知と対応」。
端末の動きを常に監視し、サイバー攻撃を発見次第対処するセキュリティツール。

☆従来のセキュリティ対策をすり抜けて侵入してくる脅威をいち早く発見・対処し、
感染の拡大を防ぐことが目的となる（侵入を前提としたセキュリティ対策）。
未知脅威への対策としてEDRの導入を検討する企業が増えている。

■ネットワークセキュリティビジネスの市場動向
ネットワークセキュリティビジネス市場は2019年度で5,319億円を突破、
2020年度は5,792億円程度になると見込まれている。
2025年度には7,864億円規模に市場が拡大すると予測されており、
CAGR（年平均成長率）は6.7％見込み。

ネットワークセキュリティの中でも様々なカテゴリーがある中で、
EDRが含まれる端末セキュリティ市場は大きく拡大する見込み。

■端末セキュリティ市場動向
端末セキュリティ市場は2019年に1,146憶円を突破、2025年には2,397憶円程度に拡大すると見込まれている。
上記の場合のCAGRは13％。

■EDR市場動向
①EDR製品
2019年に96億円を突破、2025年には740億円程度に市場が拡大すると見込まれている。
上記の場合のCAGRは40.5％。

②EDR運用支援サービス
2019年に15億円を突破、2025年には120億円程度に市場が拡大すると見込まれている。
上記の場合のCAGRは41.4％。
→他のセキュリティ製品と比べてEDRは運用が難しく自社で運用できる人材を確保できない場合が多いため、
EDR製品と一緒に運用支援サービスも併せて導入するケースが多い。

■EDRの市場が拡大している背景
①攻撃の拡大と高度化。
→今までのセキュリティ対策は侵入前に重点がおかれていたが、攻撃の高度化により完全に侵入を防ぐことが難しくなっている。
→侵入を前提としたセキュリティ対策が重要視されるようになっている。
②テレワークの普及や利用端末の多様化。
→社内のネットワークセキュリティよりも各端末におけるセキュリティ対策が必要となっている。