OmniAICreator/Qiita-1.07M huggingface dataset:
形態素解析と単語のベクトル化してみた

#Word2vecを使ってみる

* word2vecを使うためにgensimのインストールをする。
* 文字処理をするためにjanomeをインストールする。

```
pip install gensim
pip install janome
```


* word2vecで青空文庫を読み込むためのコード

```py
# 必要なライブラリのインポート

from janome.tokenizer import Tokenizer
from gensim.models import word2vec
import re

# txtファイルをopenした後読む
binarydata = open("kazeno_matasaburo.txt").read()
```

---

```py
# ちなみにprintして一つ一つ確かめたやつ
binarydata = open("kazeno_matasaburo.txt")
print(type(binarydata))
```

実行結果　　`<class '_io.BufferedReader'>`

```py
binarydata = open("kazeno_matasaburo.txt").read()
print(type(binarydata))
```

実行結果　`<class 'bytes'>`

---

```py
# データ型を文字列型に変換（pythonの書き方）
text = binarydata.decode('shift_jis')
# いらないデータを削ぎ落とす
text = re.split(r'\-{5,}',text)[2]
text = re.split(r'底本：',text)[0]
text = text.strip()

# 形態素解析を行う
t = Tokenizer()
results = []
lines = text.split("\r\n")  # 行ごとに分けられている

for line in lines:
    s = line
    s = s.replace('|','')
    s = re.sub(r'《.+?》','',s)
    s = re.sub(r'［＃.+?］','',s)
    tokens = t.tokenize(s)  # 解析したやつが入っている
    r = []
　　# 一つずつ取り出して、.base_formとか.surfaceとかでアクセスできる
    for token in tokens:
        if token.base_form == "*":
            w = token.surface
        else:
            w = token.base_form
        ps = token.part_of_speech
        hinshi = ps.split(',')[0]
        if hinshi in ['名詞','形容詞','動詞','記号']:
            r.append(w)
    rl = ("　".join(r)).strip()
    results.append(rl)
    print(rl)

# 解析したやつを書き込むファイルの生成と同時に書き込む
wakachigaki_file = "matasaburo.wakati"
with open(wakachigaki_file,'w', encoding='utf-8') as fp:
    fp.write('\n'.join(results))

# 解析スタート
data = word2vec.LineSentence(wakachigaki_file)
model = word2.Word2Vec(data,size=200,window=10,hs=1,min_count=2,sg=1)
model.save('matasaburo.model')

# model使ってみる
model.most_similar(positive=['学校'])
```

#まとめ
①解析したい文章を取ってくる。
②文章だけになるように加工する。最後の参考文献みたいなやつとか取り除く
③for文で１行ずつ取り出して、いらない部分を取り除く。
④tokenizerで形態素解析をする。リストに入れる。
⑤作ったリストをファイルに書き込む
⑥形態素解析したファイルを使ってmodelを作る
【改訂】Gatsbyでページごとに個別にCSSを読み込む方法

##はじめに
HTML, JavaScript, CSSで構築された既存のサイトを、Gatsbyで再構築しています。

以前、[Gatsbyでページごとに個別にCSSを読み込む方法](https://qiita.com/y_nkmr/items/646fcf4cb9dfe78065f0)という記事を書きました。
しかし、その後作業を進めていくうちに、こちらの方法では問題を解決できないことがわかりました。
今回は改めて対策方法を検討したので、共有します。

##前回の内容
前回はこのような方法でページごとに個別にCSSを読み込むことができると言いました。

```javascript

    import React from "react"

    export default () => (
           require("style.css")
    )
```
しかし、この内容でNetlifyにアップロードしたところ、うまくいきませんでした。
個別ページで読み込んだハズのCSSが、全てのページで読み込まれてしまい、上書きされてしまうという現象が再発してしまいました。

##Gatsby Develop と Gatsby Serve の違い
原因を調べると、上記の方法は `gatsby develop` ではうまく動作するものの、
`gatsby serve` したものではうまく動作していませんでした。
Netlifyにアップロードされるのは `gatsby serve` の方です。

##新・ページごとに個別にCSSを読み込む方法
とういうことで、`gatsby serve` でもうまくいく方法を紹介します。

1. 既存のCSSの拡張子`.css`を`.scss`に変更する
2. ファイルを開き、先頭と末尾を`html.hoge{}`で囲む

```css:hoge.css
        #header{
          background-color:red;
        }
```
```css:hoge.scss
        html.hoge{
            #header{
               background-color:red;
            }        
        }
```

3.読み込みたいページ（例：hoge.js）で`import`する

```javascript:hoge.js
        import React from "react"
        import "../css/home.scss"

        export default () => {
             return(

               //ページの処理
               <header id="header">ヘッダー</header>

             )
        }
```

4.「Helmet」を使ってhtmlタグに`hoge`というクラス名を付ける

```javascript:hoge.js
        import React from "react"
        import { Helmet } from "react-helmet"
        import "../css/home.scss"

        export default () => {
             return(
                <div>
                    <Helmet>
                       <html className="hoge"  lang="jp" />
                    </Helmet>

                    //ページの処理
                    <header id="header">ヘッダー</header>
    
               </div>
             )
        }
```

以上です。
Helmetの使い方は「Gatsby Helmet」などで調べてみてください。

##おわりに
今回のやり方はかなり邪道な方法です。
お気づきかもしれませんが、このやり方はページ毎に個別に読み込んではおらず、
結局全てのCSSを読み込んでしまっています。
単純に、SCSSのネストでセレクタを指定することで、ページごとに適応するものを変えているだけです。
Gatsbyが提唱するサイトの高速化の手法をあえて無視するようなやり方です。

今回はとりあえず、一般的な HTML, CSS, JavaScript で組まれたWEBサイトを
あまり手を加えずにGatsbyにコンバートすることを試してみました。
ですが、その作業がこんなにも大変だとは思いませんでした。

WordPressみたいに、最初は静的ファイルでテストページを作成して、その後CMS化する
という手法はあまり馴染まないのかもしれないですね。

ある程度初期の段階から、Gatsbyで組み上げていったほうが早いかもしれません。
次回は、GatsbyでjQueryを使う方法（邪道）を書きたいと思います。
【Unity】Texture2Dを毎フレーム更新する処理を書いたらメモリリークした

# 概要

ある GameObject の Texture を毎フレーム更新して動画のように描画するコードを書いていたところ、ネイティブ環境で異常にクラッシュする事象が発生した。その時に調査した手法と原因をまとめておく。

# 調査手法

下記のようなエラーを事前に吐いていたので、メモリ関連であるということは分かっていた。 (WebGL)

```
Uncaught RangeError : Maximum Call Stack Size Exceeded
```

次に Profiler からメモリ使用量を確認すると、Unity メモリが 3GB を超えていることを確認。(上昇ペースも1秒に数十MBだった)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44388/31ce4b53-2641-1dfe-0e72-05d92575102c.png)

更に、メモリビューの Detailed から何がメモリを食っているのか確認すると、画像のように Texture2D が毎フレームごとに 2.3MB メモリ確保していることが判明した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44388/6654b7db-67c3-1225-9bf5-d99ebb3b9096.png)

Texture2D をこんなに生成している箇所は 1 箇所しか心当たりが無かったので、該当コードを確認することにした。

# 原因

該当コードは下記の通り。

```c#
// frameはtexture情報をバイナリで保持している独自クラス
var texture2D = new Texture2D(frame.Width, frame.Height, TextureFormat.RGBA32, false);
texture2D.wrapMode = TextureWrapMode.Clamp;
texture2D.LoadRawTextureData(frame.Buffer);
texture2D.Apply();
material.mainTexture = texture2D; 
```

ここで問題になっているのは `new Texture2D()` の部分で、今回確保されたメモリは今フレームでは `material.mainTexture` が参照するが、`material.mainTexture` は次フレームでは別の参照を保持している。そのため、前フレームに確保した `Texture2D` のメモリ領域はどこからも参照されなくなり、Unity メモリなので GC も行われずそのままリークするといった事が原因であった。
# 解決策

前フレームで使用していた `Texture2D` のメモリを手動で解放する事で解決。
Unity で利用するアセットのメモリ解放は `MonoBehaviour.Destroy()` で出来る。
実際の修正済みコードは下記の通り。

```c#
var texture2D = new Texture2D(frame.Width, frame.Height, TextureFormat.RGBA32, false);
texture2D.wrapMode = TextureWrapMode.Clamp;
texture2D.LoadRawTextureData(frame.Buffer);
texture2D.Apply();

// これを追加した
Destroy(material.mainTexture);

material.mainTexture = texture2D;
```

これで無事にメモリリークは解消され、ネイティブ環境でアプリがクラッシュすることも無くなった。

# まとめ

「アプリが重い、メモリ関係でクラッシュする」といった場合はまず「Profiler」を確認すること。
闇雲にあたりを付けて修正してもコストが掛かるだけで改善するとは限らない。

Profiler を使った最適化は [「【Unite 2017 Tokyo】最適化をする前に覚えておきたい技術」の動画を見たメモ](https://qiita.com/yakimeron/items/6e7c38e8a589a9a5e351) にまとめてあるので、全く縁が無かった方は読んでおくと良いと思われる。

※ 調査方法や解決方法で更に効率的な方法などがあればコメントを頂けますと幸いです。
コマンドラインで使えるラーメンタイマー(Noodle Timer for macOS command line.)

# コマンドラインで使えるラーメンタイマー(Noodle Timer for macOS command line.)

今日ふとPCのそばにあったラーメンを食べようと準備をしている時に,コマンドラインを使って,

```
for i in `seq 180`
do
sleep 1
echo $i
done
```

で時間を測ったのですが,,,
コマンド一つで時間を測れたらいいのにな~と思いまして,

ノリでNoodle-Timerなるものを作ってみました。
（そんな本格的なものではありません...）

https://github.com/Iovesophy/Noodle-Timer

![noodle.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110060/de972be7-ce23-8f86-f253-57f1a65f9814.gif)



## 動作環境

+ macOS Catalina 10.15.6  
+ You can use bash or zsh
+ shellscript


##ソースコード

```shell

#!/bin/zsh
clear
trap 'date' 2
sh -c "/bin/echo -n \"How many minutes? 🍜 : \""
read Sec
echo =================================
echo "Set ${Sec} minutes."
view=$((Sec*60))

echo =================================
afplay /System/Library/Sounds/Hero.aiff
sh -c "/bin/echo -n \"start time -> \""
date "+%Y-%m-%d %H:%M:%S"
echo =================================

icon=("ー" "＼" "｜" "／" "ー" "＼" "｜" "／")
count=0
for i in `seq $view`
do 
    sleep 1
    ESC=$(printf '\033')
    echo "${ESC}[m ${ESC}[35m${icon[$count]}${ESC}[m ${ESC}[36m$((view-i)) seconds left...${ESC}[m ${ESC}[35m${icon[$count]}${ESC}[m" |
    while read line; do
        printf '\r%*s\r' ${lenLine:-${#line}}
        printf "%s" "$line"
        lenLine=${#line}
    done
    if [ $count = 7 ]; then
	count=0
    else
	count=$((count + 1))
    fi
done
echo ""
echo =================================
sh -c "/bin/echo -n \"complete time -> \""
date "+%Y-%m-%d %H:%M:%S"
echo =================================
osascript -e "display notification \"$Sec min.\" with title \"🍜 complete.\""
for i in `seq 6`
do
afplay /System/Library/Sounds/Purr.aiff
done

```

ちょっとだけ解説

まずclearコマンドで画面をクリア.

それから、readコマンドで入力受付
時間を入力し,
変数に格納する.

秒に変換後,

```
afplay /System/Library/Sounds/Hero.aiff
```

でサウンドを鳴らす.

開始時の日付時刻を出力する.

カウント中はtopコマンド風に表示させたいので,コマンド実行の際パイプで入力を受付,

その後前回の行を消して再配置します.

終了時の日付時刻を出力する.

最後に通知のポップアップを出し,サウンドを6回ほど鳴らし,完了です.

trapを仕掛け,Control + Cで時刻を表示できるので,お湯を入れたタイミングとずれた場合開始時刻から逆算できると思います.

```
trap 'date' 2
```

また時間がある際もうちょっと作り込んでいきたいと思います.
（いい息抜きになりました...笑）

MITです.自由に触って大丈夫です.
https://github.com/Iovesophy/Noodle-Timer


こんな機能があればいいのにとか,私だったらこうするなどありましたら,コメントくださいませ.
Git で submodule 含んで最新コミットだけ checkout したい

## 背景

* llvm-project とか repo サイズが大きいのを submodule で git repo に追加している.
 * 普通に引くと 1GB とか 2GB とかになるような repo で, でかくてつらい
* しかしビルドに使うだけなので, 最新コミットだけ引ければよい
  * CI でビルドしたいとか. 

## 方法

`--depth 1` で最新コミットだけ引けますが, submodule には適用されません.

Using git to get just the latest revision
https://stackoverflow.com/questions/1209999/using-git-to-get-just-the-latest-revision

`--recurse-submodules --shallow-submodules` つければいけそうであるが, オプションは古いようで最新 git では利用できない.

## 結論

未解決
.htaccessを導入してみた

今回は仕事でwebサイトに htaccess を導入する作業があったので、
メモ程度に残しておこうかと思います。

とは言っても、 htaccessファイルの書き方を全部説明していくわけではなく、
今回私が仕事で使用した、 URLの正規化と html や php などの拡張子を URL表示させない、の２つです。

超絶簡単でした。

##URL正規化って？

まず、URLの正規化と一口に言っても様々です。
https を http に統一したり、www の有無を統一したりできるのですが、
今回私が行なった実装は、indexの統一です。

テンプレを使うだけなので簡単でした。

SSL化している場合

```
RewriteEngine on
RewriteCond %{THE_REQUEST} ^.*/index\.(html|php|cgi)
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)index\.(html|php|cgi)$ http://あなたのドメイン/$1 [R=301,L]
```

SSL化していない場合

```
RewriteEngine on
RewriteCond %{THE_REQUEST} ^.*/index\.(html|php|cgi)
RewriteCond %{SERVER_PORT} 443
RewriteRule ^(.*)index\.(html|php|cgi)$ https://あなたのドメイン/$1 [R=301,L]
```

index.htmlにアクセスしても、 ドメイン名/ とURLが表示されるようになりました。

##html、phpなどの拡張子をURL表示させない

```
# .php拡張子無しでアクセス
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php

# .html拡張子無しでアクセス
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ $1.html
```
<b>注意点</b>
http://yout-domain/sample.html を http://yout-domain/sample としたいときは、
aタグのリンクの指定先も、sampleのみにしておきましょう！

##参考にしたサイト
https://htaccess.cman.jp/explain/redirect_url.html

https://emily-web.hatenablog.com/entry/2019/04/30/.php%E3%82%84.html%E3%81%AA%E3%81%A9%E3%81%AE%E6%8B%A1%E5%BC%B5%E5%AD%90%E3%82%92URL%E8%A1%A8%E7%A4%BA%E3%81%95%E3%81%9B%E3%81%AA%E3%81%84%E6%96%B9%E6%B3%95

http://togland.net/blog/2013/12/31/%E6%8B%A1%E5%BC%B5%E5%AD%90%E7%84%A1%E3%81%97%E3%81%A7%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF/

↓↓↓ 今回私は使用しませんでしたが、これはめちゃくちゃ使えると思います
http://www.htaccesseditor.com/
jQuery Validationで分岐処理

# Webページの状態によって入力チェックの内容を変更する
`validation`ってif分岐出来ないんですか？と聞かれて調べたのでメモ

[ここ](https://stackoverflow.com/questions/25734986/jquery-validation-rules-with-if-else-statement)
に書かれていました。

```javascript
$("#sample").validate({
        rules : {
            name :  {
                required : $("#flag").val() == "0"
            }
        },
```

の様に書けば良いらしいです。
　　
例えば、
`required`であれば上記の様に`boolean`で返るようにする。
`maxlength`であれば以下の様に`number`になるようにすれば良いのかな？

```javascript
maxlength: function () {
  if ($("#name").val == "jugemu") {
    return 200
  } else {
    return 100
  }
}
```
試していないです。。

if分岐ではないですが、処理を分けることはできそうです。
Oracle DBAはOracle以外もやらないといけなくなった模様です

DBAの皆さん、こんにちわ。さて、「DBA」という言葉はどこから生まれたのでしょか？正直私もよくわかりませんが、20年ぐらい前にOracle Databaseが爆発的に普及したことをきっかけに「DBA」なるエンジニアのカテゴリーがIT界隈で生まれた気がします。そんな私も「Oracle DBA」として様々な案件で活動してきましたが今回はそんな話を少しだけ。

#「Oracle 技術で一生食っていけるぞ」という甘い言葉
実際に私が新卒で入社した時に、かなり年上の先輩から言われた言葉です。入社したばかりの私は「Oracleって何？おいしいの？」ぐらい無知でしたが、私に先輩が教えてくれたこの言葉を今でも覚えています。
私自身、なぁなぁでIT業界に入ったような感じなので、何か得意分野を身につけなければと思っていました。そんな時にこの先輩の言葉は非常に魅力的で「妄信」するに値するものでした。当時はただひたすらにOracleの検証に明け暮れたことを覚えています。インストールから始まり、パフォーマンスチューニング、バックアップ、リストア/リカバリ、高可用性実現などなど。そもそも無知だったので、多くの事を学ぶことができましたし、全国各地でセミナーの依頼もいただいて、よく登壇なんかもさせていただきました。このころは寝ても覚めても、夢の中でもOracle Database（当時は10g）を触っていたと思います。だって、それが「一生食える技術」と信じていたので。

#Oracleのインストールが飛ぶように売れた時代
Oracleの技術力がついてくると、Oracleのニーズの高さにも気付き始めました。用意されたサーバにOracleをインストールする仕事は「Oracle Database 導入案件」と言う名で仕事の依頼が殺到しました。もちろん、Oracle Real Application Cluster（Oracle RAC）、Oracle Data Guardなども同様です。また、ハードウェアの老朽化に伴う、「古いOracle Database」から「新しいOracle Database」へのデータ移行はまさに花形の作業となり、いくつのDatabaseからデータをExportしてImportしたか覚えてないぐらい大小さまざまなデータベースの移行を行いました。

#DBAだってすごく重宝された時代
大きなプロジェクトではDBAチームなども編成された時代でした。IT業界ではデータベースエンジニアはそもそも人数が多くないので、「人月単価（一か月間でクライアントからもらえる金額）」も他のエンジニアより高額です。当時のDBAの仕事はこんな感じでした。

* データベースの性能分析や定期健康診断
* テーブルやインデックスなどのオブジェクト管理
* 開発者の為のSQLレビュー
* 障害発生時のトラブルシューティング
* バックアップデータの管理や運用の確認と見直し
* データベースユーザや権限の管理
* データベース監査の管理
* データベースの起動停止

システムの根幹とも言えるデータベースの管理を一手に引き受けるDBAはプロジェクトでも__一目置かれる存在__であったように思います。

#クラウドの到来とOracle DBA黄金期の終焉
そんなある時、2009年頃から噂されていた技術が2013年頃爆発的に広がりました。そうです、AWSやAzureのような__クラウドテクノロジー__です。この頃は猫も杓子も「クラウド」と言っていたように思います。このクラウドテクノロジーが私のOracle DBAとしての黄金時代を瞬く間に終焉へと追いやりました。
今まで、「Oracle導入作業」の名のもとに、あらゆるサーバへインストールを行っていた作業は、クラウド上では数クリックで終わってしまいました。追加オプションとして請求出来ていた「バックアップの設計、導入」はクラウドではデフォルトで勝手に行われます。DataGuardのような高可用性機能の導入もチェックボタンにチェックを入れるのみの作業となりました。パフォーマンスの解析も誰でも見やすいツールが導入されて、StatsPackやAWRレポートを分析する職人的なスキルは必要としなくなったのです。
この頃から徐々に仕事の依頼の件数は減っていったように思います。年々落ちていく売上が自分の市場価値を表しているようで毎日辛く感じました。どうすればいいのかと不安な状態が続きました。

#Oracle DBAがこれからを生き抜くために
ただ、「捨てる神あれば拾う神あり」です。こんな不安な状況から脱出させてくれた技術があります。そう、クラウドです。「クラウド」＋「Oracle Database」というキーワードはクラウド黎明期では非常に重宝されました。私が今までやってきたOracle技術が全て無駄になったわけではなく、多くのOracle Databaseユーザはデータベースのクラウド化が行えず、実績も少ない状態だったので、悩んでいるクライアントも多くあり、こういうデータベースのクラウド化が新たな主戦場となりました。

また、Oracle DBAは信じられないかもしれませんが、世の中にはOracle Database以外のデータベースも多く稼働しています（少なくとも私はOracle DBA時代、ある程度大きな環境ではOracleしか使われてないだろうと思っていました。）。Oracleで学んだ技術は他のデータベースにも転用可能な部分が多くあります。他のデータベースに触れることは大事だと思いますし、他のデータベースを触れると初めて、Oracle Databaseのすばらしさに気づくと思います（ライセンス料以外は）。また、以外に「脱Oracle」のニーズは多くあります。こういった案件でこれまでのOracle DBAの技術とその他のデータベースの技術の２つの技術がとても役に立ち、重宝されます。

最後は「業務」や「データ」の意味も理解しようという事です。私はOracle DBA時代先輩から以下のように教わりました。
__「業務やデータの中身に思いをはせてはいけない。君の仕事は目の前のSQLをいかに早くするかだ。」__
これは多分間違いでしょうね。「業務」や「データの中身」を理解し、データの分析なども行えるようにならなければ、今後はDBAではダメだと思います。

まとめると、Oracle DBAがこれから生き抜くために

* これまでのOracleの技術を生かして、Oracleのクラウド化を手助けする。
* Oracle以外のデータベースにも精通し、異機種間でのデータのやり取りも難なくこなす。
* 「業務」や「データ」をしっかり理解し、DBの知識を生かしてデータに付加価値を与える仕事を生みだす。

と言ったところでしょうか。これがこれまで「Oracle DBA」であった私が痛烈に今感じている事です。
Oracle DBAはOracle以外もやらなくてはいけなくなった、そういう時代が来たように思います。

#最後に
これまでの内容はあくまで、私の経験に基づいて記載している内容で、皆さんの経験と合致しないかもしれませんが、共にデータベースエンジニアとして成長させてもらえれば何よりでございます。だって、データベースってミドルウェアは面白いミドルウェアなのですから。
（ちなみにその先輩はいまだにOracle DBAとしてのスタンスを変えずに頑張っています。がんばれ！）
SpringでJsonデータを送受信するAPI作成

- Java 8
- Eclipse Version: 2020-09
- Windows 10

久しぶりにSpringでのお仕事でした。
Springにて、APIをひとつ作成するというもの。

備忘のために、ひな形作成までをまとめます。
ちなみに、Spring Boot は初めてでした。

## 仕様
Jsonでポストされたデータを受け取り、いろいろやってJsonデータを返します。

## 開発環境

- Pleiades All in One Eclipse を選択
https://mergedoc.osdn.jp/#pleiades.html からダウンロード
Eclipse 2020 > Windows 64bit > Java Full Edition を選択

- 7-Zipが必要らしいので、それもダウンロード・インストール
https://sevenzip.osdn.jp/

## プロジェクト作成

- 「ファイル > 新規 > プロジェクト」で新規プロジェクトウィザーとを開く
Spring Boot > Spring スターター・プロジェクトを選択

![create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638071/bc7b24f7-189c-d1dd-9359-692a2d530673.png)

- Javaバージョンは8に
- 依存関係では、
Web->Spring Webを選択
- 完了

## 実装：データ定義

- 入力データ、出力データを定義したクラス(InputData, OutputData)を作成

```java:InputData
package jp.co.sankosc.sample;

public class InputData {
	public int id;
	public String value;
}
```

```java:OutputData
package jp.co.sankosc.sample;

import java.util.Date;

public class OutputData {
	public int id;
	public String value;
	public Date date;
}
```

## 実装：処理

- ApiControllerクラスを作成
- クラスに@RestControllerアノテーションを定義
- メソッド定義（今回はpostというメソッド）
- メソッドに@RequestMappingアノテーションでuriを定義
- 入力パラメータを@RequestBodyアノテーションで定義

```java:ApiController 
package jp.co.sankosc.sample;

import java.util.Date;

import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ApiController {
	
	@RequestMapping(value="/post", method=RequestMethod.POST)
	public OutputData post(@RequestBody InputData input) {
		OutputData output = new OutputData();
		output.id = input.id;
		output.value = input.value;
		output.date = new Date();
		return output;
	}

}
```

## 実行

- プロジェクトを選択して
- 実行 > 実行 > Spring Bootアプリケーション

## 確認

```powershell:確認コマンド
$postData = @{id=123;value="InputData.Value"} | ConvertTo-Json -Compress
Invoke-WebRequest -Method Post -Uri http://localhost:8080/post -Body $postData -ContentType application/json
```

```powershell:実行結果
StatusCode        : 200
StatusDescription :
Content           : {"id":123,"value":"InputData.Value","date":"2020-09-28T06:45:30.925+00:00"}
```

## Jarファイル生成

- プロジェクトを選択して
- 実行 > 実行 > Maven Install
- targetの下にjarファイルが作成される

## サーバーでの実行

```bash
java -jar [.jarファイル]
```

- これをスクリプトにして、サービス登録する
thymeleafで共通部分のcssが適用されない

##はじめに
thymeleaf layout dialect機能を使用したサイトにおいて、共通部分のcssが適用されない事案が発生したので、その対処法について紹介します。

##環境
OS: macOS Catalina 10.15.6
JDK:14.0.1
Spring Boot 2.3.3
jquery 3.3.1-1
bootstrap 4.2.1

##エラー概要
共通部分にcssが正常に適用されると下図のように画面上部に深緑のヘッダー、ロゴ、検索窓が表示されます。
![スクリーンショット 2020-09-28 15.01.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639462/5c54a7c6-c450-8137-0673-8c18fabb87e5.png)

今回、他のページより深い階層にhtmlファイルを作成、格納し実行したところ下記のようになりました。

共通部分に含まれているナビゲーションバー、ロゴ、検索窓は表示されているので、thymeleaf layout dialect機能自体は適用されているようですが、共通部分のcssが適用されておりません。

![スクリーンショット 2020-09-28 15.09.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639462/4157091d-ad34-9629-126a-ab79bc142493.png)

##利用ファイルの階層
今回cssが適用されなかったページは、赤枠のhtmlで作成。
cssが適用されたページとは異なった階層なので、cssへのパスが適切ではない事による事象ではないか?と筆者は仮定いたしました。

![スクリーンショット 2020-09-28 15.18.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639462/6ccdbe47-07c1-c4a2-53f6-b21beb406d16.png)



##デベロッパーツールで適用されているcssのパスを確認
デベロッパーツールでこのページがどういったパスでcssへアクセスしているかを確認します。

htmlファイル上では「css/template.css」とありますが、実際は「http://localhost:8080/mypage/css/template.css」
とcssファイルが格納されていないディレクトリへアクセスを試みています。


![スクリーンショット 2020-09-28 15.55.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639462/423f17b3-741e-fe8f-2405-6c1772028a11.png)

##共通部分「template.html」の内容を修正

共通部分のhtmlである「template.html」のhead要素の中にある、
`<link th:href="@{css/template.css}" rel="stylesheet"></link>`の下に下記を追記します。
`<link th:href="@{../css/template.css}" rel="stylesheet"></link>`

「利用ファイルの階層」でも説明したように、「deleteUser.html」はcssが適用されたhtmlよりも1段階下の階層に位置するので、「th:href」に`../ (1階層上の)`を加え、「deleteUser.html」からcssへアクセスできるようにしました。

```html:template.html
<head>
	<meta charset="UTF-8"></meta>

	<link th:href="@{/webjars/bootstrap/4.2.1/css/bootstrap.min.css}" rel="stylesheet"></link>
	<script th:src="@{/webjars/jquery/3.3.1-1/jquery.min.js}"></script>
	<script th:src="@{/webjars/bootstrap/4.2.1/js/bootstrap.min.js}"></script>

	<link th:href="@{css/template.css}" rel="stylesheet"></link>
	<link th:href="@{../css/template.css}" rel="stylesheet"></link>

	<script src="https://kit.fontawesome.com/665f18a48e.js" crossorigin="anonymous"></script>


	<title>template</title>
</head>
```

##保存して実行

cssが適用されました。

![スクリーンショット 2020-09-28 15.01.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639462/167ffe76-d468-9f1c-4864-852096256326.png)
vistaでmse その5

#概要

vistaに、Microsoft Security Essentials入れてみた。
batで、eicarが作れないか、やってみた。

#サンプルコード

```
echo X5O!P%%@AP[4\PZX54(P^^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* > eicar.com

```

#結果

速攻で隔離された。

以上。
ABC129　A,B,C解説

##A問題
https://atcoder.jp/contests/abc129/tasks/abc129_a

``` python
p,q,r = map(int,input().split())
print(min(p+q,q+r,p+r))
```
p,q,r の内の2つを選び（３通り）合計の最小のものを選ぶ。

##B問題
https://atcoder.jp/contests/abc129/tasks/abc129_b

``` python
n = int(input())
w = list(map(int,input().split()))
ans = []
for i in range(1,n):
    ans.append(abs(sum(w[:i])-sum(w[i:])))
print(min(ans))
```
全探索します。リストの間ごとのiまでの合計、iからの合計の差を記録していき
最小値を出力する。

##C問題
https://atcoder.jp/contests/abc129/tasks/abc129_c

``` python
n,m = map(int,input().split())
a = set([int(input())for _ in range(m)])
dp = [0]*(n+1)
dp[0] = 1
if 1 in a :
    dp[1] = 0
else:
    dp[1] = 1
 
for i in range(2,n+1):
    if i in a:
        continue
    dp[i] = (dp[i-1]+dp[i-2])%1000000007
print(dp[n])
```
0段目は　　　　　　　　　　　　１通り
１段目は０段目から1つ登りと言う　　１通り
２段目は０段目から１通り
　　　　１段目から１通り　　　合計２通り
３段目は１段目から　　１通り
　　　　２段目から　２通り　　合計３通り

つまり　n[i] = n[i-1]+n[i-2]
これを実装。
aに該当する場合は計算をスルー。
certutil使用PowerShell快速落地文件

碰到一些极限环境，比如站库分离只出dns的时候，想上线cs的马，但是文件迟迟不能落地，相信很多人都会想到certutil等工具。

而在使用certutil base64通过echo写文件时，echo会在每行的末尾追加一个空格，加上http传输的URL编码问题，有一些傻逼环境总是decode时候出错，而且一些几十几百k的文件，一行一行echo实在是拉跨。所以用powershell配合bp的爆破模块来写文件，然后 `certutil -decode` 就完事了，轻松省心。

```powershell
powershell -c "'a' | Out-File C:\1.txt -Append"
```

写文件的时候通过bp的爆破模块去单线程写入文件，举一个请求包的例子。

```
/login HTTP/1.1
Host: baidu.com

cmd=powershell -c "'§§' | Out-File C:\1.txt -Append"
```

设置参数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/5d66858d-71e2-8e9f-b33f-e3ebe01fb898.png)



设置certutil encode的txt字典
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/82de9564-90ca-7d04-f18c-8d0fd039aa72.png)

勾上URL编码
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/ce9107d6-3eb2-70e6-b481-6ed51ec8e202.png)


设置单线程，你也可以设置每次请求之后sleep 1秒。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/5d8d97e6-313f-581a-d9f2-f0cca058f651.png)

冲完之后落地到目标的txt文件和本地的txt文件hash一致，decode之后的文件hash仍然一致。

本地还原文件的hash
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/b7984ea0-f550-3bbc-c5fc-2b0dcff4818d.png)

落地到目标还原之后的文件hash
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593424/c06c048f-2e2a-1b7c-4a7a-c46a5dc55d92.png)
GoogleNewsでニュースを取得する。

GoogleNewsという便利なライブラリを発見したので簡単にまとめておきます。

# 準備
```
pip install GoogleNews
```

#使い方
```.py
from GoogleNews import GoogleNews
googlenews = GoogleNews(lang='ja')#日本語指定の場合は'ja'、英語指定の場合は'en'
keyword="~~~"
googlenews.search(keyword)
results=googlenews.result()
googlenews.clear()
for result in results:
    print(result)
    print("--------------")
```



参考
-
[GoogleNews 1.4.1](https://pypi.org/project/GoogleNews/)
【AndroidStudio】SQLiteDatabaseで連続入力できる記述【Java】

##はじめに
Android初心者です。
テキストやWebページを見ながら EditText の値をデータベースに登録できるようになったのですが、連続入力しようとすると落ちてしまう。
**アプリを1回開く度1回しかデータを登録できない！**
これはアプリとして致命的だと思いどうしたら良いのか調べました。
要因は2つあると思います。
➀try-catch-finally 文が書けていない
➁データベースを開く場所が誤っている
もし、同じ状況で悩んでいる方の参考になればと思い記事にすることにしました。
##➀try-catch-finally 文が書けていない　について
この後のコードを見るとわかるかと思いますが、私のコードは必要な try-catch が書けていません、、そもそも catch文を書いていないコードだったのでとても不安定なコードです。try-catch の重要性はわかるのですが、難しい。。まだまだ勉強が必要だと思いました。
複雑な try-catch を考えるより後述の「**try-with-resources**」を使ったほうがいいと思います。

##➁データベースを開く場所が誤っている　について
###落ちるコード
[コードの全文はこちら(私の書いた別記事に飛びます)](https://qiita.com/yukino555/items/7f71e2a039b8ddfcb4f5)
1回登録するだけなら落ちません。
2回登録しようとすると「java.lang.illegalStateException attempt to re-open an already-closed object」という例外が出ます。
なぜなら、落ちるコードはデータベースを onCreate メソッドで開いているからです。
onCreate メソッドはアプリを起動したら初めに実行されるメソッドです。私はここでデータベースを開き、いろいろ処理をしたのちデータベースを解放しています。それを再び操作しようとしても、 onCreate で閉じてしまったのでアプリが落ちてしまうというわけです。


```java:MainActivity.java
public void insertData(SQLiteDatabase db, String maxBP, String minBP, String pulse){
        ContentValues values = new ContentValues();
        try {
            values.put("_maxBP", maxBP);
            values.put("_minBP", minBP);
            values.put("_pulse", pulse);
            db.insert("_BPtable", null, values);
        } finally {
            db.close();
    }
}
```

##try-with-resources
try-with-resources の利点は複雑な try-catch 文を書かなくて良いというところだと思います。~~try-catch がわからない私には大助かり~~ とはいえ try-catch-finally だけ実装されているプログラムのほうが多いと思うので勉強頑張ります。。
try-with-resources の構文はこちら

```java:
try (closeによる後片付けが必要な変数の宣言) {
    本来の処理
} catch (例外クラス 変数名) {
    例外が発生した場合の処理
}
```
先のコードを try-with-resources を用いて書き直したものがこちら
さらに、データベースをメソッドで開けるようにコードを見直しました。➁解決です。

```java:MainActivity.java
    public void insertData(String maxBP, String minBP, String pulse){
        ContentValues values = new ContentValues();
        DatabaseHelper helper = new DatabaseHelper(MainActivity.this);
        try (SQLiteDatabase data = helper.getWritableDatabase()){
            values.put("_maxBP", maxBP);
            values.put("_minBP", minBP);
            values.put("_pulse", pulse);
            data.insert("_BPtable", null, values);
        } catch (Exception e){
            e.printStackTrace();
        }
    }
```
これで try が終わったあと自動的にデータベース解放処理が行われます.
連続登録落ちしないプログラムができました！
##参考
WINGSプロジェクト　齊藤新三　著/山田祥寛　監修『Androidアプリ開発の教科書』
中山清喬　著/国本大悟　著/株式会社フレアリンク　監修『スッキリわかるJava入門 第3版』
Chrome開発者ツールでrequireを使いたい

## 動機
ローカルで動かす分には`npx [package]` だったり、よく使うなら `npm install` すればいい。
しかし、デバッグのために一時的にパッケージを開発者ツールで使えるようにしたい場合はどうすればいいのかの備忘録。

## 解決策
●`require`を有効化するための`script`（出典はcfにいくつか見つけた）を呼び、requireする。
●クライアントに読み込ませるためのファイルはbrowserifyのcdnを使っている（取得先は`localhost`に持っているなら書き換えて使っても良いと思う）。

cf
**requiring npm modules in the browser console**
https://gist.github.com/mathisonian/c325dbe02ea4d6880c4e
┗ **See this thread for details:**
　https://github.com/mathisonian/requirify/issues/5
先人達がどうやって実現するかの意見交換が読める。

**mathisonian/requirify-browser.js**
https://gist.github.com/mathisonian/2d2faed1e16790ec816d
取得先はminifyされたコードの中に書いてあるのでversionには注意したい。

**Requirify(Chrome拡張)**
https://chrome.google.com/webstore/detail/requirify/gajpkncnknlljkhblhllcnnfjpbcmebm
難しいこと考えずに使うならこういう拡張もありかもしれない。
やっぱり取得するパッケージのversionには注意。



おまけ
**browserify-cdn**
https://wzrd.in/
ここでパッケージ名を指定し、スタンドアロンの（≒クライアントで動く）ファイルをURLを得ることができる。
ここから返ってくるファイルを画面に読み込ませることができれば正直cfに並べたsnippetを使う必要はないと思う(cfの内容もこのcdnからとっているものがほとんどに見えた)。バージョン指定して使いたいなら尚更これだけで良さそう。
数値をフォーマット（書式設定）した場合の小数点以下表記について

# 概要

- Excel、VBA（VB6）、.NETで小数点以下の表記について以下にまとめます。
- .NETで整数を処理した場合の表記が、より自然になっています。
    - システムによって望ましい表記は異なると思いますが、.NETで書式を`0.00`または`0.##`を指定することが、ほとんどのシステムではよい選択となるのではないでしょうか。
        - .NETで小数点位置をそろえたい場合：`0.00`
        - .NETで小数点位置をそろる必要がない場合：`0.##`
    - ただし空白埋めで揃えたい場合は独自処理が必要となります。

# 環境

- Excel 16.0.13127.20266 32ビット(Office 365)
- Visual Studio 2019 16.7.4
- .NET Framework 4.7.2 

# テストデータ

|テストデータ|書式|
|--:|---|
|0|0.00|
|0.00|0.00|
|0.1|0.00|
|1|0.00|
|1.00|0.00|
|1.1|0.00|
|0|#.##|
|0.00|#.##|
|0.1|#.##|
|1|#.##|
|1.00|#.##|
|1.1|#.##|
|0|0.##|
|0.00|0.##|
|0.1|0.##|
|1|0.##|
|1.00|0.##|
|1.1|0.##|


# VBA（VB6）

```vb
Format(1,"0.00")
```

システムによっては、`.`、`.1`、`1.`、`0.`などの表記に違和感があり問題となる場合もあると思います。

|テストデータ|書式|結果|
|--:|---|--:|
|0|0.00|0.00|
|0.00|0.00|0.00|
|0.1|0.00|0.10|
|1|0.00|1.00|
|1.00|0.00|1.00|
|1.1|0.00|1.10|
|0|#.##|.|
|0.00|#.##|.|
|0.1|#.##|.1|
|1|#.##|1.|
|1.00|#.##|1.|
|1.1|#.##|1.1|
|0|0.##|0.|
|0.00|0.##|0.|
|0.1|0.##|0.1|
|1|0.##|1.|
|1.00|0.##|1.|
|1.1|0.##|1.1|

# Excel

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/7c304996-4021-ff7c-8496-301146228a2b.png)

VBAと同一の結果となりました。

# .NET

```vb
String.Format("{0:0.00}", CDec("1"))
```

書式として`0.##`または`#.##`を指定時に小数部が存在しなかった、または0の場合の結果が異なっています。

システムによって理想の表記は異なると思いますが、.NETで整数を処理した場合の表記がより自然になっています。

|テストデータ|書式|結果(VBA)|結果(.NET)|VBAとの相違|
|--:|---|--:|--:|---|
|0|0.00|0.00|0.00|✅同一|
|0.00|0.00|0.00|0.00|✅同一|
|0.1|0.00|0.10|0.10|✅同一|
|1|0.00|1.00|1.00|✅同一|
|1.00|0.00|1.00|1.00|✅同一|
|1.1|0.00|1.10|1.10|✅同一|
|0|#.##|.|※長さ0の文字列|⚡相違あり|
|0.00|#.##|.|※長さ0の文字列|⚡相違あり|
|0.1|#.##|.1|.1|✅同一|
|1|#.##|1.|1|⚡相違あり|
|1.00|#.##|1.|1|⚡相違あり|
|1.1|#.##|1.1|1.1|✅同一|
|0|0.##|0.|0|⚡相違あり|
|0.00|0.##|0.|0|⚡相違あり|
|0.1|0.##|0.1|0.1|✅同一|
|1|0.##|1.|1|⚡相違あり|
|1.00|0.##|1.|1|⚡相違あり|
|1.1|0.##|1.1|1.1|✅同一|
Amazon Linux2 に kafkacat を install する方法

```
sudo yum update -y
sudo yum install git -y

sudo yum -y groupinstall base "Development tools" --setopt=group_package_types=mandatory,default,optional
yum install openssl-devel
yum install libcurl-devel

git clone https://github.com/edenhill/kafkacat.git
cd kafkacat/
./bootstrap.sh
./kafkacat -h
```
[python] データ読み込み

pythonで使えるファイル読み込み方法をいくつかあげました。
どんな関数があったっけ、となった時用なので、各関数の詳しい説明は省いてます。

## open()

ファイルとモードを指定。
モードのデフォルトは```'r'```(読み込み専用)


```main.py
#一行ずつ読み込んで表示する場合
data = open('/path/to/data', 'r')

for line in data:
  print line

#下も同じ操作
#line = f.readline()

data.close()



#すべての内容を読み込んで表示する場合
data = open('/path/to/data', 'r')

#文字列にして返す場合
all_data = data.read()
print all_data

#リストにして返す場合
#all_data_list = f.readlines()
#print all_data_list

data.close()
```
このファイル操作は開く操作と閉じる操作が必要になる。閉じるのを忘れてしまいがちだが、以下の場合は閉じるコマンドが必要ないので安心

```main.py
with open(file_path) as f:
    for line in f:
        ###command
```


## read_csv(), read_table()
pandas
カンマ区切りならread_csv(), タブ区切りならread_table()
読み込んだものはデータフレームとして返される

```main.py
import pandas as pd

data_csv = pd.read_csv('/path/to/data.csv')
data_tsv = pd.read_table('/path/to/data.tsv')
```

デフォルトはheaderありなので、ファイルにheaderがない場合は```header=None```もしくは```names=()```で指定する

## loadtxt()
numpy
区切り文字と型も指定する(デフォルトはスペース区切りと```float```)
読み込んだものは配列(array)として返される

```main.py
import numpy as np

data = np.loadtxt('/path/to/data', delimiter=' ', dtype = 'float')
```
webカメラを複数台挿した時、どれが/dev/video?? なのかを確認する方法

# 問題

webカメラを1台だけ挿すのなら、通常は`/dev/video0`に繋げばいいと思う

```shell

$ fswebcam -d /dev/video0 a.jpg
# またはデフォルトで/dev/video0なので
$ fswebcam a.jpg
```

しかし、2台以上だとどのカメラが/dev/video0なのか2なのか何なのかわからなくなる。

# 解決方法

v4l2-ctlを使うとこういうリストが出力できる。

```shell:raspberryPiでの例
$ v4l2-ctl --list-devices
bcm2835-codec-decode (platform:bcm2835-codec):
	/dev/video10
	/dev/video11
	/dev/video12

bcm2835-isp (platform:bcm2835-isp):
	/dev/video13
	/dev/video14
	/dev/video15
	/dev/video16

BUFFALO BSW32KM03 USB PC Camera (usb-20980000.usb-1.3):
	/dev/video0
	/dev/video1

UVC Camera (046d:0825) (usb-20980000.usb-1.5):
	/dev/video2
	/dev/video3
```

ここで注目するのは、カメラには`(usb-20980000.usb-1.5)`的なのがついているということ。
そしてこの`usb-1.5`の部分は物理的なUSBポートに紐付けられている（[参考][1]）。

なので、webカメラを常時挿したままであれば、そのカメラのここで言うUSB番号が固定されるので、その下に書いてある最初のパス（`/dev/video*`）を使うとカメラの画像が取れる（[もう一方はメタデータ？らしい][2]）。

# これらを踏まえての簡単なrubyスクリプト

```rb
require "./video_paths"
VideoPaths.paths # => {"1.3"=>"/dev/video0", "1.5"=>"/dev/video2"}
```

```rb:video_paths.rb
require "memoist"
require "active_support/core_ext/object/blank"

class VideoPaths
  USB_NUMBER_REG = /\.usb\-([\d\.]+)/

  class << self
    extend Memoist
    def paths
      new.to_h
    end
    memoize :paths
  end

  def initialize
    @output = clean_output(`v4l2-ctl --list-devices`)
  end

  def to_h
    camera_names.to_h do |camera_name|
      key, valid_path, *other_paths = group_by_device[camera_name]
      [extract_usb_number(camera_name), valid_path]
    end
  end

  private

  attr_reader :output

  def group_by_device
    key = :not_yet
    output.group_by do |line|
      key = line if line.end_with?(":")
      key
    end
  end

  # BUFFALO BSW32KM03 USB PC Camera (usb-20980000.usb-1.3):
  #                         ^^^^^^^^
  def camera_names
    group_by_device.keys.select { |key| key.match?(/camera/i) }
  end

  # BUFFALO BSW32KM03 USB PC Camera (usb-20980000.usb-1.3):
  #                                               ^^^^^^^^
  def extract_usb_number(camera_name)
    camera_name.match(USB_NUMBER_REG)[1]
  end

  def clean_output(text)
    text.lines.collect(&:strip).delete_if(&:blank?)
  end
end
```

[1]: https://superuser.com/questions/902012/how-to-identify-usb-webcam-by-serial-number-from-the-linux-command-line
[2]: https://unix.stackexchange.com/a/539573
【Python3】画像の拡張子を一気に変更したいときに使えるコード

備忘録やOUTPUT的な意味での蓄積

#作成目的
作業用の拡張子をすべて変換したいときが定期的に起こったので、作業簡略化のために作成

#作成環境
・windows10
・Anaconda3
・python3.7
・Jupyter Notebook

#ドキュメント
①拡張子を変更したいフォルダ名を入力
②folderがなければcurrent_folder内に、[拡張子]_folderを作成する
③すでに同じフォルダ名がある場合、誤操作を防ぐためにErrorになる

※今回はpngに変換するコードを記載する

#ライブラリの読み込み

```python:All&nbsp;Necessary&nbsp;Libraries.py
import pathlib
import os
import shutil
import pprint
import numpy as np
from glob import glob
from PIL import Image
from tqdm import tqdm
from pathlib import Path
```

#PG

```python:change_pngextension_code
# フォルダ名を入力
folder_name = input('Enter the folder name :')
p, new_folder_name = Path('C:/Users/H3051411/OUT/' + folder_name), '_png_folder'
# 現在のpathから新しいpng_folderを作成
new_folder_path = os.path.join(p, new_folder_name)
#print(new_folder_path)(必要があれば確認)

# フォルダがなければコピーして作成
if not os.path.exists(new_folder_path):
    # ディレクトリ内のファイルを取得
    shutil.copytree(p, new_folder_path)
    
    # 新たなpathの拡張子をpngファイルに変換
    new_p = Path(new_folder_path)
    files = list(new_p.glob('*.*'))

    for i,f in tqdm(enumerate(files)):
        print('画像変換数：{0}/{1}'.format(i+1,len(files))
        shutil.move(f, f.with_name(f.stem + ".png"))

else:
    print('すでにfolderが存在します.')
```

# 課題
・関数化していない
・画像数が増えると時間かかりそう(未テスト)

# まとめ
作業時間が1時間から1分になりました。
あと、もっといい書き方がある気がする。
rgba 指定した背景を inherit するのはやめとけ (または Figma/XD では透過度で色を決めない)

タイトルのままです。

# どういうケースか

一番わかりやすいスニペットをおいておくとこんな感じです。
意図してこういうスタイル指定になることは稀だと思いますが、フロントエンドフレームワークを利用していると意図せずこのようなスタイルがあたっている可能性があります。

```html
<html>
<body>
  <div id="main" style="background-color: #fff;">
    <div id="color" style="background-color: rgba(0, 0, 0, 0.2)">
      <span style="background-color: inherit;">aaa</span>
    </div>
  </div>
</body>
</html>

```

# 何が起こるか

こうなります。

![スクリーンショット 2020-09-28 15.03.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236279/e06de7f3-d5c4-79c9-7576-e1518624ad78.png)

更に、 `main` の色を変えると更に事件が起きます。例えば色を `#a00` にしてみます。

![スクリーンショット 2020-09-28 15.05.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236279/c12389e4-6831-b03b-bbfc-6e1ce8277d38.png)

くすんだ赤になりました。
意図したものであれば問題ないですが、意図せずグレーの要素が消えることになります。

# 何故か

`color` の半透明なグレーを `span` が継承した結果、色が乗算され、結果的に `span` の色が濃くなってしまいます。
更に `main` を赤くしたことで、赤の上に半透明のグレーがかかるため、色がくすみます。考えてみれば当然で、背景を透かして見るためにアルファチャンネルは存在しています。

# こうならないようにするために

## アルファチャンネルの色を継承しない

イテレータで生成したような連続する要素に対して個別のスタイルが当てられるようなシステムで、意図せず透過色を利用しており、その上にボタンの真ん中に文字をセンタリングする目的で更に別なタグがあるような場合で、背景色を継承しないとスタイルがおかしくなるようなCSS設計を行っているページで起こるかもしれません。

何度も言いますが、意図したものであれば気にする必要はありません。問題は意図しないケースです。

## XD / Figma で opacity が指定されている色はそのまま使う前に確認する

最近はXDやFigmaが登場したため、デザイナーとフロントエンドエンジニアの分業が進んでいます。結果、デザイナーは「デザイナーに色を伝えなくても勝手にコピーして使ってくれるだろう」と思い、エンジニアは「デザイナーが指定した色に意味があるんだろう」と思ってもよいと考えてしまうフシがでてきます。

デザイナーは見た目上の色が出ていればよいと考え、エンジニアはただ指定された色をそのまま使うというような実装を行っていると、本当にこの画面のデザインでやりたかったことが置いてけぼりになり、結果的におかしなスタイルがあたってしまうということが起きます。

デザイナーとエンジニアが分業しているようなプロジェクトでは、見た目のチェックをデザイナーにも依頼するのがよいでしょう。

# まとめ

デザイナー一同に置かれましては、エンジニアと共同でXD / Figmaを見る環境で仕事をしているのであれば、極力アルファチャンネルで色を合わせるのはお控えいただけますと、エンジニアが非常に楽になるので、協力していただけると幸いです🙇‍♂️また、ページの新設や修正の際は、レビューにも付き合ってもらえると嬉しいです。
超解像アルゴリズム「PULSE」をWindows環境で試してみた

今年のCVPRで発表された、高性能の超解像アルゴリズム「[PULSE:Self-Supervised Photo Upsampling via Latent Space Exploration of Generative Models](https://arxiv.org/abs/2003.03808)」を試してみました。
流行りの「自己教師あり学習」です。

※論文の内容に関しては省略（いつか解説記事を書くかも？！）
　→[書きました](https://qiita.com/mine820/items/aef71caf187c8f60c1bf)

# 「PULSE」のポイント
- 今までとは評価ポイントが違う
    - 超解像した後の画像じゃなくて、超解像した後にダウンスケールした画像で比較
- 今までの手法よりも超解像可能
- 超解像自体はStyleGANを使用（CelebA-HQで学習済み）

このGIFがイメージをつかみやすいです。
![transformation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/c569ce66-05f8-dab7-8989-c35f87ac59fb.gif)

# ソースコード
ソースコードは[Github](https://github.com/krantirk/Self-Supervised-photo)にて公開されています。
今回はこれをそのまま使います。

# インストール
Python 3.7上で、以下のモジュールをインストールしました。

- Anaconda NavigatorのGUIからインストール
    - matplotlib
    - numpy
    - pandas
    - pillow
    - scipy
    - requests
- コマンドラインからインストール
    - pytorch
    - torchvision
    - cudatoolkit（今回は10.2を使用）

# 環境構築
超解像したい画像を入れておくフォルダを用意します。
ここではとりあえず「input」とします。

そこに超解像したい画像を入れます。（複数入れてもOK）
画像にはいくつか制限があります。

- 縦横のサイズは同じ
- サイズは1,024の約数
- フォーマットはPNG（RGB）

# 実行
```text
> python run.py
```
で実行します。

# エラー対応
ほとんどの画像で、以下のようなエラーになります。

```text
Loading Synthesis Network
Optimizing
BEST (100) | L2: 0.0058 | GEOCROSS: 4.3057 | TOTAL: 0.7981 | time: 10.0 | it/s: 9.98 | batchsize: 1
Could not find a face that downscales correctly within epsilon
```

上記の例の場合、L2の最小値が「0.0058」なのですが、デフォルトの閾値が「0.002」になっており、それより近づかないとエラーになります。

対応方法としては、引数「eps」で閾値の値を変更します。

```text
> python run.py -eps 0.005
```

# 実行結果
実行結果は「runs」フォルダに保存されます。
出力される超解像画像は1,024x1,024のpngになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/bb51d5aa-48c5-f3a6-e20a-2940e40bf8d8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/868a3d67-afe7-b7df-1421-47f960073736.png)

外国人バイアスがむごい．．．
あと、正面顔じゃないとダメそう。

# 感想
実行は簡単ですが、実際に使おうと思うと、いろいろとやらなくてはいけないことがいっぱいありそうです。
【Python】if文入りの関数をlambda関数にする

#前提
引数に0が来たら「hoge」を返し
それ以外が来たら、入力値を返すだけの関数。
下に細かい手順も書きました。

よく迷うため、備忘録的に。

#結論

```
def x(value):
    if value == 0:
        return "hoge"
    else:
        return value
```
これが

```
y = lambda value : "hoge" if value == 0 else value
```
こうなる。


文字で表すとこう。

```
(関数名) = lambda (引数) : (条件がTrueなら返す値) if (条件) else (条件がFalseなら返す値)
```
なんだ...これは...

#手順

lambda関数は
変更したい関数が1行の関数である必要があるため、
まず下記のif文を1行にする。


```
# 再記
def x(value):
    if value == 0:
        return "hoge"
    else:
        return value
```

###①まずTrueになる条件を記述。(if value == 0)

```
def x(value):
    if value == 0
```

###②Trueになったら返したい値を【先頭】に書く。("hoge")

```
def x(value):
    "hoge" if value == 0
```

###③Falseのときに返す値を入れる(else value)

```
def x(value):
    "hoge" if value == 0 else value
```
これでif文を1文にすることが成功しました。
次に、関数を一行にします。

###④いらない部分を消す。
↓いらない3つのもの
1, def
2, 関数名→ x
3, 引数を囲っているカッコ→()

```
value :
    "hoge" if value == 0 else value
```
行を揃えると

```
value :　"hoge" if value == 0 else value
```
こう出来ます。だんだん近づいて来ました。

###⑤先頭に「lambda」と書き
lambda関数にしていきます。
先頭にlambdaを書き

```
lambda value : "hoge" if value == 0 else value
```

###⑥値に代入する。(x)
xに代入する。(xは関数名になります)

```
x = lambda value : "hoge" if value == 0 else value
```
これで完成です。

###実行

```
x(0)
>>> 'hoge'

x(100)
>>> 100
```
完成。
PowerDNS Cache削除


# 現在のDNS Cacheのdump

```bash
rec_control dump-cache /tmp/the-cache
```

# 削除コマンド
```bash
rec_control wipe-cache 【削除ドメイン名】
```

- レコードタイプを指定して削除する　wipe-cache-typed コマンドもあるようだ。


## 参考
- https://doc.powerdns.com/recursor/manpages/rec_control.1.html#
【ウィンドウ関数】各グループごとの最大値行だけを取得する【Athena】

## グループ毎に最大値を取ってくるのが難しい
特定カラムの最大値を取ってくるだけであればMAX関数を利用するだけで解決するので特に悩むところはないと思われます。[mysql例](https://dev.mysql.com/doc/refman/5.6/ja/example-maximum-row.html)
しかし、以下のようなテーブルからuser_id毎の最大値を取ってくる場合、一工夫いります。

| user_id | score |
|:-----------|:------------|
|1|200|
|3|120|
|2|140|
|2|220|
|3|100|
|4|50|
|5|270|
|4|500|
|5|10|

今回はAthenaで実行したのでcreate文が以下となっています。

```sql:create.sql
CREATE EXTERNAL TABLE IF NOT EXISTS tmp.max_test (
  `user_id` int,
  `score` int 
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = ',',
  'field.delim' = ','
) LOCATION 's3://example_bucket/'
TBLPROPERTIES ('has_encrypted_data'='false');
```


## ウィンドウ関数の利用
この場合、ウィンドウ関数の`row_number関数`を利用して各グループ、今回であればuser_id毎にスコアに降順の順位ををつけてその上位１位を取得することで最大値行の一覧を引っ張ってこれます。

```sql:select.sql
select
    user_id,
    score
from
    (
        SELECT
            user_id,
            score,
            ROW_NUMBER() over(partition by user_id ORDER BY score desc) AS score_rank
        FROM
            tmp.max_test
    )
where
    score_rank = 1
```


## 簡単に解説

サブクエリ内の[ROW_NUMBER](https://prestodb.io/docs/current/functions/window.html)関数のoverの括弧内partitionでグループを分けます。今回はuser_id毎に最大値を取得したいのでuser_idですが、複数のカラムを使ってpartitionを分けることも可能です。その場合はカンマでつなげます。
orderby句でそのpartition内の順番を決めます。今回はscoreを降順で並べたいので`score_rank desc`とします。

サブクエリの結果はこのようになります。

| user_id | score | score_rank |
|:-----------|:------------|:------------|
|1|200|1|
|1|150|2|
|2|220|1|
|2|140|2|
|3|120|1|
|3|100|2|
|4|500|1|
|4|50|2|
|5|270|1|
|5|10|2|

これをみると後は`where score_rank = 1`で持ってくればいいというのがはっきりわかります。

MySqlでも同様の関数がありました。[Window Function Descriptions](https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_row-number)。
PHPickerViewControllerから直にData型の画像データを取得するには？

![PHPickerViewController](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339601/945396e6-fd44-c8b0-01b3-0247a1772373.png)

[AppleのPHPickerViewControllerのサンプルコード](https://developer.apple.com/documentation/photokit/selecting_photos_and_videos_in_ios) を見ると、UIImageを取得する例は書かれているのですが、Dataを取得する例はありません。

当然ながらUIImageをDataに変換するのは微妙です。

なぜならGIFを選択した場合、アニメーションが止まってしまうためです（UIImageをDataに変換するメソッドは「[pngData()](https://developer.apple.com/documentation/uikit/uiimage/1624096-pngdata)」と「[jpegData(compressionQuality:)](https://developer.apple.com/documentation/uikit/uiimage/1624115-jpegdata)」の2つしかなくGIF用のものは存在しません）。

というわけで、やはり直でData型を取得したい。

そんな人に向けて、 **PHPickerViewControllerからDataを取得する方法** を書いておきます。

## NSItemProviderのloadDataRepresentation(forTypeIdentifier:completionHandler:)を使えば画像のDataを取得できる

NSItemProviderの `loadDataRepresentation(forTypeIdentifier:completionHandler:)` を使えば取得できます。

```swift
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
    results.forEach { result in
        result.itemProvider.loadDataRepresentation(forTypeIdentifier: "public.image", completionHandler: { [weak self] data, _ in
            guard let data = data else { return }
            print(data)
        })
    }
}
```

ミソとしては、forTypeIdentifier（Uniform Type Identifier）に `public.image` を指定することですね。
こうすることで、HEICやPNG、JPG、GIFなどのDataを取得できます。

もっと、取得するDataを細かく指定したい場合は、Appleの [Uniform Type Identifier Concepts](https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/understanding_utis/understand_utis_conc/understand_utis_conc.html)を参考にして指定してください。
Looker学習環境（検証?・評価版？）の利用方法について

## 概要
Lookerの学習環境の利用方法が、少しわかりずらかったので、共有します。

学習環境として提供されているようです。
技術検証としての利用や評価版としての利用を実施してよいかは、自己責任で、規約をご確認ください。

## 手順
１. [Learn.looker.com sign-up](https://training.looker.com/looker-development-foundations/334815)という記事にログインし、メールアドレスの情報を登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0746e49c-863c-abed-cae0-63c6784b0d37.png)
引用元：[Learn.looker.com sign-up](https://training.looker.com/looker-development-foundations/334815)

２. 数分後に届くメール記載のリンクに接続後、Lookerの学習環境が利用できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/bffcc028-6052-5d44-1cb2-d62328839ebf.png)
post_max_sizeとupload_max_filesizeの違い

php.iniにおけるupload_max_filesize と post_max_sizeの違いについて。
ちなみにphpinfo()で確認できる。

#upload_max_filesize
一つのファイルの最大ファイルサイズ。
この値を超えてしまうと、$_FILES[‘hoge’][‘error’]にUPLOAD_ERR_INI_SIZEがセットされる。

#post_max_size
POST送信全体のデータサイズ。
このpost_max_sizeを超えるサイズのPOST送信があった場合、$_FILES[‘hoge’][‘error’]はnullとなり、エラーコードはセットされない。

#気をつけること
PHPでは、設定したpost_max_sizen値より、ポストしたファイルサイズが大きかった場合、リクエスト内容そのものが破棄されるため、
リクエストに対してファイルサイズの大きさを制限するバリデーション(size)を使用してもバリデーション できない。
例えば、

```php:php.ini
upload_max_filesize = 20MB
post_max_size = 10MB
```
だったとして、POSTメソッドで、送信するファイルサイズが15MBだった場合、リクエスト内容そのものが破棄される。


→URLルーティングされたコントローラクラスより先にリクエストを受け取ることができる、Middlewareを利用して、バリデーションを行う。

#参考
>https://pointsandlines.jp/server-side/php/laravel-post_max_size
>https://ageo-soft.info/programming_languages/php/81/
active recordで特定カラムを空で保存できるように修正


### 解決策

下記のようにallow_blankを追加したら解決できました

```
validates :something, allow_blank: true
```


### 参考記事
[Validate attribute only if it present (only if user fill in it)](https://stackoverflow.com/questions/7868067/validate-attribute-only-if-it-present-only-if-user-fill-in-it)
【VMware】ホストとゲストの時刻同期無効化

ホストOSとゲストOSの時刻同期設定の話。確認バージョンはESXi6.7。
仮想マシン右クリック→「設定の編集」のハードウェアオプションから無効にできます。
![WS20200331_164248000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/4b895de4-1cee-8552-7ed5-4da57cb9a58b.jpeg)
が、以下注意点があります。

`・仮想マシンをサスペンドする場合、その仮想マシンを次回レジュームするときに、ホストに合わせて時刻が同期される。`
`・チェックボックスがオフの場合でも、時刻が不正確になりがちないくつかの特定のイベントの後で、VMware Tools はデフォルトで仮想マシンの時刻を同期する。`
`・時刻は、vMotion を使用した仮想マシンの移行、スナップショットの作成、スナップショットの復旧、仮想ディスクの圧縮、または仮想マシンでVMware Tools サービスの再起動（仮想マシンの再起動を含む）を行うときに再同期される。`

要はチェックボックスでは、
<font color="Red">「仮想マシンの実行中に時刻を定期的に再同期するかどうかのみを設定できる」</font>
ということです。 
<br>
完全に同期を無効化する場合は、仮想マシンを停止し、構成パラメータに以下エントリを追加します。

```
tools.syncTime = "0"
time.synchronize.continue = "0"
time.synchronize.restore = "0"
time.synchronize.resume.disk = "0"
time.synchronize.shrink = "0"
time.synchronize.tools.startup = "0"
time.synchronize.tools.enable = "0"
time.synchronize.resume.host = "0"
```
※[構成パラメータ] を介して `tools.syncTime` を追加する場合、エントリを承認して閉じた後はこのパラメータが表示されなくなりますので注意。
<br>
以上。
備忘録（「ユーザー定義」された時刻の取得・換算、クロス集計）

#はじめに
構想設計の第1ステップである『生データに対し、「社員名と作業時間以外が同じ値ならば作業時間を統合する」処理をかける』が実装できたので取りまとめる。
https://qiita.com/wellwell3176/items/7dba981b479c5933bf5f
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/721074/e9fba6bc-e8af-afd3-95e1-fcec31659099.png)
　　　　　　　　　　　　図：生データの抜粋
社員名はデータとして不要なので、社員名を削除し、なおかつ社員名以外の情報が全部同じなら作業時間を合算したい
#完成したプログラム
```python:program
import pandas as pd
df=pd.read_excel('/content/drive/My Drive/Colab Notebooks/data2.xlsx')

df["区分"]=df["区分"]+df["業務"] #後工程で必要なので区分と業務は一括表示にする
df=df.rename(columns = {'区分':'業務区分'} #行の見出しも変更しておく

df["作業時間"] = pd.to_datetime(df["作業時間"],format="%H:%M:%S") 
 #作業時間が生データだとエクセルのユーザー定義で入力されていたので、フォーマット指定で文字列からdatetimeに変換
df["作業時間"] = df["作業時間"].dt.minute
 #数値は[～～分][～～時間]で表示するとの要求があるので、datetimeを[分]に換算したint型にする

df2=df.groupby(["テーマ","月日","国名","業務区分"],as_index=False).sum()
 #社員名以外で集約する。df.groupbyの結果は代入しないと保存されないので注意する
df2.to_excel('/content/drive/My Drive/Colab Notebooks/data5.xlsx')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/721074/955e9d33-dd15-3905-b642-9577d2c48980.png)
　図：プログラムの出力結果
業務区分の文字列結合、社員名の削除、時間の集計が実現しているのでOKとする
#プログラム中に発生したエラーや失敗」とその概要
**1. to_datetimeで文字列から時刻に換算できない**

```python:
df["作業時間"] = pd.to_datetime(df["作業時間"]) 

-->TypeError: <class 'datetime.time> is not convertible to datetime
#エクセルの「表示形式」に問題が在った。ユーザー定義の「hh:mm」を使っており、デフォルトのto_datetimeではこれが読めなかった
#formatオプションを使い、該当列の記述方式を指定することで解決
df["作業時間"] = pd.to_datetime(df["作業時間"],format="%H:%M:%S") #これでOK 
```
**2. 作業時間がgroupbyで集計されない**

```python:失敗バージョン
df["作業時間"] = pd.to_datetime(df["作業時間"],format="%H:%M:%S") 
 
df.groupby("国名").mean()
ValueError: No axis named テーマ for object type <class 'pandas.core.frame.DataFrame'>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/721074/25b3e2d1-cb0a-c358-7fd4-72f23923d11d.png)
上図のように出力されてしまい、「作業時間」での集計が発生しなかった。
原因はdatetime形式がgroupby関数の集計値として認識されなかった為と思われる。
完成品のようにdatetimeをint型に変更して解決。

```python:成功バージョン
df["作業時間"] = pd.to_datetime(df["作業時間"],format="%H:%M:%S") 
df["作業時間"] = df["作業時間"].dt.minute 

df.groupby("国名").mean()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/721074/982eabe5-36a0-9572-9f9f-2141206e74d9.png)
これで作業時間が集計側に～～[分]の形で取り込めた。

**3. AttributeError: 'Series' object has no attribute 'minute'**

```python:
df["作業時間"] = df["作業時間"].minute #これを使ってエラーが発生

--> AttributeError: 'Series' object has no attribute 'minute'
#.dtが抜けていたので、df["作業時間"]という一連の配列を対象とした処理が行えなかった

df["作業時間"] = df["作業時間"].dt.minute #これが正解
```

**4. ValueError: No axis named HOGE for object type class'pandas.core.frame.DataFrame'**

```python:
df.groupby("国名","テーマ").sum() #これを使ってエラーが発生

-->ValueError: No axis named テーマ for object type <class 'pandas.core.frame.DataFrame>
#groupby関数で複数のインデックスを使用するときの記述ミス。[]が足りなかった。

df.groupby(["テーマ","国名"]).sum() #これでOK
```


#参考にしたページ/サイト
rename()でcolumn名の変更ができない　https://teratail.com/questions/291634
Pandas の groupby の使い方　https://qiita.com/propella/items/a9a32b878c77222630ae
PandasでSeries.dt()を使って日付を変換する方法　https://qiita.com/Takemura-T/items/79b16313e45576bb6492
Jiraで期限切れのタスクを担当者にだけ通知する

Jiraには保存したフィルターで抽出された課題をユーザーに通知する配信機能があります。
この配信機能は便利なのですがそのまま使うとプロジェクト全員分の課題が配信されてしまいます。
今回は配信登録されているフィルターの中でもユーザーに対して自分が担当者の課題のみを配信する方法を解説します。

### フィルターの配信方法
1. フィルターの作成  
メニューバーの「課題」→「課題を検索」
2. 今回は「テスト」プロジェクトの期限切れのタスクを抽出します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/801a6b94-f59f-f269-d71a-d06807423963.png)
JQLはこんな感じ  
`project = PJ001 AND due <= "0" AND assignee = currentUser()`  
ポイントは担当者が「現在のユーザー（CurrentUser()）」になっていることで、通知が飛ぶのは該当する課題の担当者のみにすることができます。
3. 「別名保存」でフィルターを保存します  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/2259d03e-4086-5fdb-3d49-1480dd9fa353.png)
※この際、作成されたフィルターはプライベートなフィルターとなっているのでチームメンバーにも配信したい場合は[権限設定](https://ja.confluence.atlassian.com/jirasoftwareserver/saving-your-search-as-a-filter-939938748.html#Savingyoursearchasafilter-sharing_filtersSharingafilter)を適切に行ってください。
4. フィルターの配信設定  
メニューバーの「課題」→「フィルターの管理」から配信したいフィルターを選択  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/ed4b4b4c-7034-7f20-da2c-87a2cc51e080.png)
5. 配信登録をクリックして配信条件を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/3e04319e-bd40-c277-7304-8d6de1bcfcd0.png)