OmniAICreator/Qiita-1.07M huggingface dataset:
windowsのサブユーザーでGitのクローンができない時

##環境
Windows10

## エラー内容
gitから普通にクローンしようとしたら、

```
Unlink of file '{リポジトリ名}/.git/objects/pack/{ファイル名}.idx' failed. Should I try again? (y/n)
```

って感じで表示されて、はい？？ってなった。

何回yes押しても終わらないし、no押したらフォルダの中は空っぽ。

## 解決方法
よく見たら、Unlink。あ、これもしかして。。。

windowsでサブユーザーでログインすると、何かをインストールするたびにパスワードが聞かれるの思い出した。

だから、何かソフトをインストールするだけでもすぐにインストールできる権限がないってことは、gitのクローンもファイルを生成することになるので、権限がないのでこのようなことになるのだろうと、名推理が働いた。


メインのユーザーに切り替えて、クローンしたら、成功した。

てか、windowsで他のユーザー作る時の設定でどうにでもなるっぽい。

## 感想
普通に作業してたらこんなこと起きたことなかったけど、
そういえばセキュリティが超絶厳しい環境での開発ではこんなことがあったなぁ。。。そりゃ勝手に変なものインストールされては困りますね
GitHub CLI をインストールして使ってみよう

先日ベータ版がリリースされた[GitHub CLI](https://cli.github.com/) をインストールして使ってみました！

# インストール

```
% brew install github/gh/gh
```

一応、インストールされているか確認します。

```
% gh --version
gh version 0.5.5 (2020-02-13)
https://github.com/cli/cli/releases/tag/v0.5.5
```

# 使ってみよう

さあ！使ってみましょう!!
使い方は[マニュアル](https://cli.github.com/manual/)を見てみます。

そうですね..試しにIssueのリストを取得してみましょう♪

```
% gh issue list
Notice: authentication required
Press Enter to open github.com in your browser... 
```

ぬ！認証しないとですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271390/d9f85d30-d21c-714f-7b60-015292cd5507.png)

認証！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271390/954feeb6-0f17-f7fc-a482-20c2e08842b7.png)

認証するとIssueの一覧が表示されますね:thumbsup:

```
#29  パスワードリセット機能を追加したい                                                                  
#27  日本語化したい                                                                            
#25  会員登録・ログイン機能における異常系の処理を追加したい                                                        
#17  検索のサジェスト機能を追加したい 
```

次はIssueをブラウザで表示するコマンドを実行してみましょう。
Issue番号を指定してやってみます。

```
% gh issue view 29
```

ブラウザが開いてIssueを表示してくれました:clap:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271390/a901b63d-456a-214e-bc5e-6ec17b03e949.png)

ちょっとした作業スピードアップに役に立ちそうですね:wave:
【Nuxt.js】Vue.filter()で文字列整形

####Fiter()で文字列の整形

グローバルな Vue.filter() を使用してカスタマイズしたフィルタを登録します。
コードは'/plugins'ディレクトリの中に作成。
今回は日付をフィルターにかけて文字列を整形してみます。

```js:plugins/filter.js
import Vue from 'vue'

//定数monthsに月名を文字列で用意
const months = [
  "1月",
  "2月",
  "3月",
  "4月",
  "5月",
  "6月",
  "7月",
  "8月",
  "9月",
  "10月",
  "11月",
  "12月"
];

const dateFilter = value => {
  return formatDate(value);
};

function formatDate(inputDate) {
  const date = new Date(inputDate);
  const year = date.getFullYear();
  const month = date.getMonth();
  const day = date.getDate();
  const formattedDate = year + "年" + " " + months[month] + " " + day + "日";
  return formattedDate;
}

Vue.filter('date', dateFilter)
```
'date'という名前で、定数'dateFilter'の値をコンポーネント側に渡します。
これでどのコンポーネントからでも使用できるようになりました。

####config.jsに登録


```js:nuxt.config.js
plugins: [
  '~/plugins/filter.js',
]
```

####filterを適用
コンポーネント側で利用してみましょう。
'date'という名前で使用できます。
他にも書き方はありますが今回はmustache型で記述してみました。
'updateDate'はStoreで別途用意しています。

```js:index.vue
<template>
  // {{ フィルタに渡すデータ | フィルタ }}
  <div>更新日：{{ updateDate | date }}</div>
</template>
```

ありがとうございました。
PhpDocが書かれているかどうかをチェックする方法

# はじめに
PhpDoc皆さん書いてますか？
補完を最大限効かせるためにできれば全部書いていきたいですが、抜けているかどうかのチェックを目視で確認するのって面倒ですよね。
面倒なことは自動化しちゃいましょう！

# 仕組み
PHPにはクラス情報を取得するReflectionClassという関数があります。
そして、この関数を使うとなんと！PhpDocの情報も取得できたりします。
つまり、書いてなければnullが返ってきます。
※補足すると各メソッドの行番号やプロパティの内容、publicかどうかなども取得できます。

# サンプルコード
```php
/**
 * Class PhpDocCheckCommand
 */
class PhpDocCheckCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'php_doc_check {target_directory_path}';
    
    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'phpdocの存在をチェックする';
    
    /**
     * phpdocの存在をチェックする
     */
    public function handle()
    {
        $target_directory_path = app_path($this->argument('target_directory_path'));
        $check_php_doc = new CheckPhpDoc();
        $check_php_doc->run($target_directory_path);
    }
}

/**
 * Class CheckPhpDoc
 */
class CheckPhpDoc
{
    /**
     * 指定ファイル内のPhpDocが正しく書かれているかどうかを検証する
     *
     * @param string $target_directory_path 対象のディレクトリのパス
     */
    public function run(string $target_directory_path)
    {
        foreach (ClassMapGenerator::createMap($target_directory_path) as $model => $class_file_path) {
            $this->verifyPhpDoc($model);
        }
    }
    
    /**
     * クラスのPhpDocの検証
     *
     * @param $model
     */
    private function verifyPhpDoc($model)
    {
        $reflection = new ReflectionClass($model);
        
        // クラスのPhpDocの検証
        if (empty($reflection->getDocComment())) {
            throw new LogicException(sprintf('%sクラスのPhoDocが未定義です。必ず入力して下さい', $reflection->getName()));
        }
        
        // クラス内のプロパティのPhpDocの検証
        foreach ($reflection->getProperties() as $property) {
            if (empty($property->getDocComment())) {
                throw new LogicException(sprintf('%sのプロパティである%sのPhoDocが未定義です。必ず入力して下さい', $reflection->getName(), $property->getName()));
            }
        }
        
        // クラス内のメソッドのPhpDocの検証
        foreach ($reflection->getMethods() as $method) {
            if (empty($method->getDocComment())) {
                throw new LogicException(sprintf('%sのメソッドである%sのPhoDocが未定義です。必ず入力して下さい', $reflection->getName(), $method->getName()));
            }
        }
    }
```
絵で見てわかる量子コンピュータの仕組み　を読んで分からなかった単語をまとめてみた

#前提条件
高校数学の知識や物理学の知識が消滅していること
量子コンピュータについて全くの知識がないこと
プログラミングについて基礎の基礎を学習していること 

読んでいて意味が分からなかった・忘れていた単語をまとめていきます。
絵で見てわかる量子コンピュータの仕組みは[こちら](https://amzn.to/3bVBxpE)
##第１章　量子コンピュータ入門
###トランジスタ
電子回路において、信号を増幅またはスイッチングすることができる半導体素子
要は電気の流れをコントロールする部品
###フラッシュメモリ
冷蔵庫や電子レンジ、腕時計などにも使われている不揮発性のメモリ
不揮発性とは電源を切ってもデータを保持してくれること
###論理ゲート
論理演算を行う電子回路
論理式や真理値表で表すことができる
論理式とはif分やwhile文などの条件式にあたる
###量子回路
量子コンピューター上のアルゴリズムを表現する代表的な方法の一つ
論理回路の量子コンピュータ版
論理回路とは論理演算を行う電子回路のこと
###量子ゲート
量子演算の演算子に対応する演算を行うもの
###量子アニーリング
「膨大な選択肢からベストな選択肢を探索する」と言う処理を実現する計算モデル
計算モデルとは計算・推論・証明といった行為を理論的・抽象的に考察するための数理モデル
数理モデルとは現実の世界で起きるさまざまな問題を数学的な形で表現すること

###イジングモデル
膨大な個数のミクロ要素が相互作用しあい、それぞれのミクロ要素に強制力が与えられているとき、全体（マクロ）としてどのような振る舞いを示すかを表現するモデル
例えば、日常生活では多くの人が相互作用しあって社会が成り立っているが、新たに法律という強制力が与えられると全体としてどのような振る舞いを示すかを表現するモデル

###マッピング
関連づけること

###量子スプレマシー（量子超越性）
現在のスーパーコンピュータではとても長い時間かかる何らかの計算を、量子コンピューターが高速に実行できること
古典コンピュータに対する優位性を示すこと

###スケーラビリティ
機器やソフトウェア、システムなどの拡張性、拡張可能性のこと
将来想定されるシステム規模の増大に対して対応可能であるように設計されたシステムは「スケーラビリティが高い」と表現する

###エントロピー
熱力学における不可逆性の度合いを数値化したもの
例えば、冷たい水に熱いお湯を入れた瞬間が最もエントロピーが高い、といったイメージ


##第２章 量子コンピュータへの期待

###多項式
掛け算と足し算で成立している文字式のこと
例: 2*a+b

###多項式時間
多項式の計算にかかる時間

###組合せ最適化問題
多くの選択肢の中から、ある指標（価値）を最も良くする変数の値（組合せ）を求めること
言い換えると、たくさんの組合せから、最も良い組み合わせを見つける問題

###コヒーレンス時間
「量子性」を保つ時間のこと
量子ビットの寿命のこと
例えばコイントスをした時、コインが空中で回転し結果が確定していない状態の時間

##第３章　量子ビット

###複素数
実数の単位1と，i*i(iの2乗)＝－1 であるような虚数単位 i との2つの単位によって構成される数
実数と虚数（2乗すると０未満になる数）によって構成される数のこと

##第４章　量子ゲート入門

###量子もつれ状態(エンタングル状態)
HゲートとCNOTゲートによって作ることができる
２量子ビットを制御ビットと標的ビットに分けた時の、
片方の量子ビットを測定するともう片方を測定しなくても結果が確定している状態
通常、量子ビットは測定しないと結果が確定しない

###時間発展
時間が進むことで物理系が変化すること

##第５章　量子回路入門

###波の干渉効果
１つの山、１つの谷がある２つの波のぶつかりによる振幅の変化のこと
振幅とは波の中心から山あるいは谷との差のこと

##第６章　量子アルゴリズム入門

###位数発見
古典コンピュータでは膨大な計算量となるが、
量子コンピュータでは素因数分解したい数のビット数の３乗で計算できる部分のこと
素因数分解とは自然数を素数の掛け算で表すこと

###量子フーリエ変換(QFT)
ある状態を入力すると、その入力に応じた周期性を有する量子状態を出力する量子回路のこと

###量子フーリエ逆変換(IQFT)
量子フーリエ変換の働きを逆に利用したもの

###VQE(変分量子固有計算)
試行波動関数を生成
→試行波動関数を量子ゲートで表して量子コンピュータに送信
→量子コンピュータで計算
→計算結果を古典コンピュータに戻す
以上のサイクルのこと
試行とは試すこと
波動関数とは原子の中のどこに電子が位置しているかを教えてくれる関数
関数とはプログラミング言語で言うメソッドのようなもの

##第７章　量子アニーリング

###スピン
２つの磁石を近くに置いたときに、片方もしくは両方が向きを変えたがる性質のこと

###数理最適化
世の中の様々な問題を数式を用いて記述し解決する方法のこと


##第８章　量子ビットの作り方

###イオン化
電気的に中性の原子や分子が、電子を失うか得るかしてイオンになること
イオンとは、電子の過剰あるいは欠損により電荷を帯びた原子または原子団のこと
原子団とは、ある化合物の分子内に含まれる特定の原子の一団


##感想
文系出身者の私としては絵を見ても難しく、一度読んだだけでは頭に入ってきませんでした。
繰り返し何度も読み返すことで理解できるようになっていきましたが、それでも３章以降は断片的にしか理解できていません。
懇切丁寧に解説されており、確かに入門書としては適している内容なのかなと感じました。
途中、挫折しそうになりましたが、それよりも興味が優っていたので最後まで読むことができました。
~~もっと優しい超入門に当たるような書籍があれば是非読みたいところではあります。~~
見つけました！
数学や物理、量子コンピュータなどに関する知識ゼロからでも読める書籍です。

[量子コンピュータが本当にわかる！ ― 第一線開発者がやさしく明かすしくみと可能性](https://amzn.to/3c025pY)

実際に読んでみて良かった書籍について情報を発信していますので、
よろしければ[Twitter](https://twitter.com/KaoruTojo_Novel)のフォローもお願いします。
python初心者、競馬歴1年未満でも３連単を当てることができました。

# **はじめに**

申し訳ありませんが競馬用語の解説は省きます。競馬に興味がある人が読んでいると思うので。

netkeiba.comで公開されている情報(スクレイピングでとってくる情報)
には血統、走破タイム、走行距離等色々あります。前提として、スクレイピングしたデータをそのままモデルに
fitさせたところで何も予想してくれません。情報を選別、整理、分析していく必要があります。

データの分析の方針を決める前に、まずは仮説として、

**レースが始まってから最後の直線まで色々あったが、上り3ハロンで馬は残る力全てをもって走り切り
ゴールを通過した順に着順が決まる**

とします。当たり前だと思われるかもしれませんがこれにより考慮すべき情報が絞れます。
私が分析を進める上で使用しているデータは以下

・ラップタイム
→レース全体のペース、レースのグレードを評価
・レースの種類芝orダート/距離
→数あるレースの種類を細分化

馬毎のデータ
・馬毎のコーナー通過順、上り3fタイム
→脚質の分類、同じ脚質の馬の中での最後の直線の評価

補足1:騎手、馬名、血統、枠順、走破タイム等は考慮していない
補足2:血統、騎手を考慮していないため、メイクデビューレースは分析対象としない

以上、長いですが前置きでした。

#**実際の予想するにあたっての作業について**

さてAIにレースの予想をしてもらうための訓練データを作成していく。
下位の馬のデータを作成しても馬券に絡まないため無駄。過去のレースにおいて1〜6着の馬でデータを作成する。

例:
scr.csv
![scr.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534312/189359a6-97a2-894c-1013-13e445243cb5.jpeg)
train.csv
![train.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534312/3a45f475-4a67-a3d9-e02e-a7c4ce5af5c3.jpeg)


数行だけチラッと。

scrがスクレイピングしてきたrowデータ。trainが整理整頓や標準偏差など計算したもの(訓練データ)
面倒でも新たにcsvファイルをしっかりと書き出しておく。

訓練データをしっかりと作成しておけばモデルのパラメータとかいじらなくても良い結果が出そうだけど、
一応弄ってます。

このモデルを用いて導き出したデータで4頭BOX買いをし一応馬単、三連単を的中させることができた。
某中央競馬予想サイトにて公開した予想
![tekichu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534312/58550696-bbf9-f7e7-20d5-e81d365e5c66.jpeg)


外したレースにおいても3着以内に2頭が入るなどそこそこ良いものが作れたと思います。
![hazushi.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534312/f3dcb912-9e2c-53fd-d398-f933d46c9683.jpeg)


#**あとがき**

改善策としてまだまだやれること
・血統
・騎手
・枠順
・季節
・負の特徴量

血統や騎手を基に予想を組み立てるのは競馬の醍醐味なのでいつかはやりたい。しかしやり方が想像すらつかない。
レースの3着以内になった騎手や父馬母馬をひたすらカウントするとかだろうか？模索中。
枠順も芝は内枠有利とは言うが関係ないときもある。ダートでは外枠のほうが馬場が荒れてないため有利とか言うし。
季節によって発情期とかで牡馬牝馬で力の差がでてくるとか？競馬歴1年未満なので正直全然わかりません。
この辺に関してはデータサイエンティストな人たちより、競馬好きのおっちゃんとかと意見交換になると思う。

負の特徴量とは確実に4着以下になってくれる馬を炙り出そうと言う魂胆。
危険な人気馬や目移りする穴馬に無駄なお金を使わなくて済むようにするのが狙い。
また他視点からも予想することによって、BOX買いする4馬にさらに確信を持つことができるようにする。

開発言語はpython、フレームワークはAWS/Cloud9/jupyternotebook。
詳しいコードは余裕があるときに記事を書きたいと思っています。
実際の予想はレジまぐというサイトで公開中、そちらも是非遊びに来てください。
HTMLとCSSのみでドロップダウンメニューを作成する


WEBサイト制作において『ドロップダウンメニュー』って結構必要になってくる知識だと思います。なので、、まとめます。

具体的な流れは、まずhtmlでリストを作成してから、cssでドロップダウンメニューにしていくという感じです。



##ulでリストを作成する

まず最初にドロップダウンリストにしたいリストを作成します。CSSではなく、htmlのみでの作成のため、下記のようにめちゃくちゃ簡易的なリストになります。


<img width="194" alt="スクリーンショット 2020-02-16 16.19.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161691/701c82e0-59f7-8e89-d7e9-ecad9e750979.png">


```html:


    <div class="menu">
      <div class="menu-title">Main Menu</div>
      <div class="sub-menu">
        <ul>
          <li><a href="#">Sub Menu1</a></li>
          <li><a href="#">Sub Menu2</a></li>
          <li><a href="#">Sub Menu3</a></li>
        </ul>
      </div>
    </div>


```


##CSSでドロップダウンにしていく

###枠をデザインする

まず大枠を作ります。

main menuおよび、sub menuをちゃんとしたboxにしましょう。

<img width="303" alt="スクリーンショット 2020-02-16 17.57.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161691/ad9a223a-a752-f592-f912-d5ba1719c4f3.png">

```CSS:

 /* まずはメニューの大枠を作る */

.menu {
  width: 300px;
  text-align: center;
  background: navy;
  color: white;
}

.sub-menu {
  background: white;
}


 /* わかりやすいようにボーダーも */
li{
    border: 1px solid navy;
}

```

ただこれだとまだ、インデントやリンクを示唆する青色、下線が残っています。そこを直していきましょう。


### 位置、リンクの色を調整


<img width="299" alt="スクリーンショット 2020-02-16 17.59.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161691/f65fc4de-884b-2c6c-2009-763d7afd57d1.png">

```CSS:

 /* 上記CSSに加えます */

 /* list-styleでlistの"・"をなくします */
 /* paddingでインデントもなくします */

ul {
  width: 300px;
  list-style: none;
  margin: 0; 
  padding: 0;
}

 /* リンクっぽい青色、下線部をなくす */

a {
  text-decoration: none;
  color: navy;
}



```


##いよいよドロップダウン化します

枠組みはできました！ いよいよ、普通はサブメニューを非表示にさせて、マウスホバー時に表示させるCSSを書いていきます。

具体的には、非表示にするsub-menuクラスに「display: none;」を書いておいて、hover時に「display: block;」 に切り替えて表示させるという手順です。

```CSS:

 /* sub menuを非表示にする */

.sub-menu {
  display: none; /* ← ここ追加 */
  background: white;
}

 /* マウスホバー時に表示させる */

.menu:hover .sub-menu {
  display: block;
}


```

これで完成！

これが
<img width="302" alt="スクリーンショット 2020-02-16 18.37.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161691/939f9dcf-dbcc-6098-f6dc-2073fb2d5e34.png">

マウスホバーすると、、、

<img width="300" alt="スクリーンショット 2020-02-16 18.38.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161691/059764c6-5734-3e72-788b-855bf9c60a5e.png">

こうなります！

最終的なコードは

```html:HTML


    <div class="menu">
      <div class="menu-title">Main Menu</div>
      <div class="sub-menu">
        <ul>
          <li><a href="#">Sub Menu1</a></li>
          <li><a href="#">Sub Menu2</a></li>
          <li><a href="#">Sub Menu3</a></li>
        </ul>
      </div>
    </div>


```

```CSS:CSS

.menu {
  width: 300px;
  text-align: center;
  background: navy;
  color: white;
}

.sub-menu {
  background: white;
  display: none;
}

li{
  border: 1px solid navy;
}

ul {
  width: 300px;
  list-style: none;
  margin: 0;
  padding: 0;
}

a {
  text-decoration: none;
  color: navy;
}

.menu:hover .sub-menu {
  display: block;
}


```




参考:https://public-constructor.com/html-css-dropdown-menu/

なんかうまくできなかった時はこちら
http://webfeelfree.com/mouseover-css-hover/
Django REST Frameworkで新しいユーザー認証方法を増やす

通常は`AbstractBaseUser`を継承したクラスの`USERNAME_FIELD`で定義されたカラムと`password`でユーザー認証されますが
新たに`login_id`というカラムを追加し、`login_id`と`password`でもユーザー認証できるようにしてみます

# 1. `AUTHENTICATION_BACKENDS`の追加
ユーザー認証をカスタマイズしたいため、`AUTHENTICATION_BACKENDS`を追加します
`AUTHENTICATION_BACKENDS`についてはリファレンスを参照
https://docs.djangoproject.com/en/dev/ref/settings/#authentication-backends

```python:backends.py
from django.contrib.auth.backends import ModelBackend
from project.models.user import User


class LoginIdModelBackend(ModelBackend):
    """
    login_idとpasswordのログイン
    """
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            login_id = kwargs.get('login_id')
            if not login_id:
                raise User.DoesNotExist
            user = User.objects.get(login_id=login_id)
        except User.DoesNotExist:
            # Run the default password hasher once to reduce the timing
            # difference between an existing and a nonexistent user (#20760).
            User().set_password(password)
        else:
            if user.check_password(password) and self.user_can_authenticate(user):
                return user
```
```python:settings.py
AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'backends.LoginIdModelBackend',
]
```
Userテーブルにlogin_idカラムがあることが前提です
`AUTHENTICATION_BACKENDS`は定義した認証に失敗したら次の認証というように順番に呼び出せれます
なので、まず今までの認証を実行し、それに失敗したらログインIDでの認証が実行されます

# 2. `login_id`と`password`用のユーザー認証APIを追加

```python:views/auth.py
from rest_framework_simplejwt.views import TokenViewBase
from project import serializers


class LoginIdAuthTokenViewSet(TokenViewBase):
    serializer_class = serializers.LoginIdAuthTokenSerializer
```
```python:serializer/auth.py
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer


class LoginIdAuthTokenSerializer(TokenObtainPairSerializer):
    username_field = 'login_id'

    def create(self, validated_data):
        pass

    def update(self, instance, validated_data):
        pass
```

urls.pyにも追加してください

今回は別のAPIにしましたが、ロジック次第で一つのAPIで、例えばメールアドレスでもログインIDでもログインできるようにすることも可能だと思います
「日程調整」問題　解答

初出は不明ですが、
https://blog.goo.ne.jp/r-de-r/e/225c5aa0ed5e58ec334224cea036ded8
で、「オフラインリアルタイムどう書く」の第二十回問題「会議の時間」の類題を見つけましたので、
同様な方法でPrologで解いてみました。
人名を除いた条件のリストを作り、日付ごとにtest0/3で開始時6時～19時の1分ごとに
条件に合う時間があるか調べます。
つまりtest/3でその日のすべての予定に関して、
拘束時間の開始>=3時間の終わりまたは3時間のはじめ>=拘束時間の終了
が成立するか調べ、成立しないものがあればtest0(時間)->solve（日付）に戻って繰り返します。
表示はさぼって、日付と開始時だけです。

```Prolog
%swi-Prolog  version 7.6.4
%start.
%:-initialization(start). 

test0(D,N,L):-between(360,1140,N),test(D,N,L).
test(_,_,[]):-!.
test(D,N,[[D,TB,TE]|T]):-!,(TB>=N+180;N>=TE),test(D,N,T).
test(D,N,[[_,_,_]|T]):-test(D,N,T).

solve(L,[D|T],R):-test0(D,N,L)->R=[D,N];solve(L,T,R).
solve(_,[],_).

start:-
     str(S),split_string(S,"\n","",L),maplist(split,L,L1),
     sort(L1,L2),pre(L2,L3,DL),solve(L3,DL,R),disp(R).

split(S,T):-split_string(S,"\s","\s",[_,_|T]).

pre([],[],[]).
pre([[D,B,C]|T],R1,DL):-
     pre(T,R11,DL1),sp(B,X),sp(C,Y),R1=[[D,X,Y]|R11],list_to_set([D|DL1],DL).

disp([D,T]):-
     H is T div 60,M is T mod 60,write(D),write(" "),write(H:M).

sp(S,R):-concat_atom([X,Y],":",S),atom_number(X,N1),atom_number(Y,N2),R is N1*60+N2.

str("1  新井 2015/04/27 08:30 17:00
2  新井 2015/04/28 09:00 16:30
3  新井 2015/04/29 08:00 17:00
4  新井 2015/04/30 09:00 16:30
5  新井 2015/04/30 17:00 21:00
6  新井 2015/05/01 08:00 16:30
7  新井 2015/05/01 18:00 21:00
8  新井 2015/05/02 08:30 16:30
9  新井 2015/05/04 08:00 17:30
10 新井 2015/05/05 11:00 15:30
11 古田 2015/04/27 09:30 16:00
12 古田 2015/04/27 19:30 22:00
13 古田 2015/04/28 08:30 17:00
14 古田 2015/04/28 17:30 19:30
15 古田 2015/04/29 18:00 22:00
16 古田 2015/04/30 10:00 17:00
17 古田 2015/05/01 17:00 20:00
18 古田 2015/05/02 18:00 19:30
19 古田 2015/05/03 08:00 17:30
20 古田 2015/05/04 14:00 19:30
21 古田 2015/05/05 08:30 18:00" ).


```
カスタム投稿タイプの作り方



カスタム投稿を作成するとき、何かと忘れてしまうのでメモ。✍️

```php:functions.php
add_action( 'init', 'create_post_type' );
function create_post_type() {
    register_post_type( 'news', [ // 投稿タイプ名の定義
        'labels' => [
            'name'          => 'プロダクト', // 管理画面上で表示する投稿タイプの名前
            'singular_name' => 'Product',    // 管理画面上で表示する投稿タイプの名前(単数)
        ],
        'menu_icon'     => 'dashicons-admin-page', // 管理画面上で名前の左に表示するアイコン
        'public'        => true,  // 投稿タイプをpublicにするか
        'show_in_rest'  => true,  // 新エディタ「Gutenberg」を有効にする
    ]);
}

```

functions.phpに上記を書いた際、以下のように表示される。

<img width="200px" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499590/b7e96d2b-4b46-beb1-2113-6404c4beccc2.png">

***
register_post_typeの引数の詳細はcodexに書いてあります。
[関数リファレンス/register_post_type](URL "https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/register_post_type")

管理画面上で名前の左に表示するアイコンの名前はORGから調べることができます。
[Developer Resources](URL "https://developer.wordpress.org/resource")
macのsedでenvなどの=の後を置換する方法

# はじめに
macで.envファイルやconfig系のファイルなどで、「=」の後を置換するコマンドのメモです。

# 環境
macOS High Sierra 10.13.6

# コマンド
今回は[laradock](https://github.com/laradock/laradock)のenv-exampleに記載されているPHP_VERSION=7.3をPHP_VERSION=7.4にしたかったのでその例です。

```shell
sed -i '' 's/PHP_VERSION=.*/PHP_VERSION=7.4/g' ./laradock/env-example
```

# 説明

`-i ''`
sedを実行しても`invalid command code .`とエラーになり、[こちらの記事](https://qiita.com/ponsuke0531/items/be8b4a3c5e19676f9691)を参考に`-i ''`を追記して動くようになりました。

`.*`
例では`PHP_VERSION=`の後にどんな文字列が入ってもその行を`PHP_VERSION=7.4`置換するようにしました。

# 注意点
「=」の後を置換というより行全体の置換になってしまいました。ちょっと記述間違えると悲惨な事になりそうなので`-i 'hoge'`など、バックアップファイルを残す方が安全だなぁと。

# 最後に
もっとスマートなやり方をご存知の方はご教示くださいm(__)m
最近、開発はLinuxもありかなぁと思い初めております。
Vue.jsでFontAwesomeを使う

普通にFontawesomeを読み込んで使っても大丈夫と思うんですが、
あえてvue.js専用にラップしてある物の使い方（備忘録）です。

#インストール

```sh
$ npm install --save @fortawesome/fontawesome-svg-core
$ npm install --save @fortawesome/free-solid-svg-icons
$ npm install --save @fortawesome/free-brands-svg-icons
$ npm install --save vue-fontawsome
```

#main.js

```javascript
import Vue from 'vue'
import App from './App.vue'
//（省略）
import { library } from '@fortawesome/fontawesome-svg-core'
//基本セットを読み込んで、使いたいアイコンを読み込みます。
import { faHome , faSearch} from '@fortawesome/free-solid-svg-icons'
import { faFacebook , faLine } from '@fortawesome/free-brands-svg-icons'
//使うものはあらかじめ読み込んで「library」に追加しておきます。
library.add(faHome)
library.add(faSearch)
library.add(faFacebook)
library.add(faLine)
//さらに「vue-fontawesome」を読み込みます。
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
//カスタムタグ「font-awesome-icon」として使えるようにします。
Vue.component('font-awesome-icon', FontAwesomeIcon)
```

#Component.vue

```vue

<template lang="pug">
.btn
  a
    font-awesome-icon(
    :icon="['fas','home']"
    )
    | Home
  a
    font-awesome-icon(
    :icon="['fas', 'search']"
    )
    | Search
  a
    font-awesome-icon(
    :icon="['fab','facebook']"
    )
    | Facebook
  a
    font-awesome-icon(
    :icon="['fab', 'line']"
    )
    | Line
</template>
```

これでアイコンが使えるようになります。
慣れた人ならCSSで定義したほうが速いような気がしますが、
このやり方もスッキリしていて、割と良い気がします。

##参考にした記事
https://github.com/FortAwesome/vue-fontawesome
AWS CloudWatch メモリ使用率を出す際でのエラー　Can't locate Sys/Syslog.pm in


CloudWatchはデフォルトではメモリ、ディスク使用率が監視できない。


その方法は、AWSの公式ページがよくまとまっている。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/mon-scripts.html#mon-scripts-perl_prereq


## 注意が必要な点

- モニタリングスクリプトのインストール後、 `cp awscreds.template awscreds.conf`してから `vi awscreds.conf`で、キーを入力する。


## エラー

CloudWatchのテストの際（`./mon-put-instance-data.pl --mem-util --verify --verbose`）、以下のエラーが発生。


>Can't locate Sys/Syslog.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at ./mon-put-instance-data.pl line 77.
BEGIN failed--compilation aborted at ./mon-put-instance-data.pl line 77.

## 解決策

`aws-scripts-mon`をディレクトリ毎削除して、もう一度最初の手順を行う。



#### 細かい原因等ご存知の方居たら教えてください！
pythonでヒープソートを実装してみた

https://qiita.com/redmeteor777/items/e85e378d3385c6844ab1

の続き？です。

前段でヒープを作りました。

ヒープソートはヒープの頂点から値を取り出す→ヒープを再構築する→ヒープの頂点から値を…

と繰り返すことでソートを行う…

という処理をヒープソートと呼ぶらしいです。


```heap_sort.py
import random
import copy

# 準備する値の数を入力
numbers = 10000

sorted_list = []

# 乱数の作成
num_list = list(range(numbers))
random.shuffle(num_list)

def heap(num_list):
    
    while True:
        # whileループ開始時の配列を保持
        check_list = copy.deepcopy(num_list)
        # 頂点から順にチェックしていく
        for i in range(len(num_list)):
            # ノードの下に値が1つしか残っていない場合(終端パターンその1)
            if len(num_list) == (i+1)*2:
                node = num_list[i]
                left = num_list[(i+1)*2-1]
                # ノードより子供が大きい場合は値を入れ替える
                if node > left:
                    num_list[i] = left
                    num_list[(i+1)*2-1] = node
                    # 値の入れ替えが発生したので上から再確認
                    break
                # 終端なのでbreak
                break
            
            elif len(num_list) > (i+1)*2:
            # ノードの下に値が2つ以上残っていない場合(終端ではないパターン)
                node = num_list[i]
                left = num_list[(i+1)*2-1]
                right = num_list[(i+1)*2]
                # ノードより子供のいずれかが大きい場合、より値の小さい子供と値を入れ替える
                if node > left or node > right:
                    if left < right:
                        num_list[i] = left
                        num_list[(i+1)*2-1] = node
                    else:
                        num_list[i] = right
                        num_list[(i+1)*2] = node
                    # 値の入れ替えが発生したので上から再確認
                    break
            else:
            # ノードの下に値が残っていない場合(終端パターンその2)
                break
        # whileループの冒頭と比較して、配列が同一だった場合whileループをbreak
        if check_list == num_list:
            break
    return num_list



def main(num_list):
    # メイン処理
    print("START : ",num_list)

    while len(num_list) != 0:
        num_list = heap(num_list)
        sorted_list.append(num_list.pop(0))
    print("GOAL  : ",sorted_list)

if __name__ == '__main__':
    main(num_list)
```
ECDH鍵交換

暗号系のライブラリを見ていると、良く`ecdh`というフォルダが出てくる。
何だろうと常日頃思っていたが、ECDSAを調べていたら説明が出てきた。

#### どういうもの？
`ECDH`は、`Elliptic-Curve Diffie–Hellman`の頭字語で、
共有鍵暗号で、２者間で鍵を共有するために使う。

#### 交換方法
以下の形で、$A$ と $B$ が鍵を交換する。以下、出てくる数字は全て整数。

#### 下準備
$A$ と $B$ が以下を共有する：

- 有限体 $\mathbb{F}_p$ の位数 $p$
- 楕円曲線の係数。以下の $a, b$
  $$
  y^2 = x^3 + ax + b\ (a, b \in \mathbb{F}_p, \triangle = 4a^3 + 27b^2 \ne 0)
  $$
- ジェネレーターとなる元 $g \in \mathbb{F}_p$

#### 手順
1. $A$ が乱数 $r$ を作って、$P_1 = r \times G$ を計算して $B$ に送る。
2. $B$ が乱数 $s$ を作って、$P_2 = s \times G$ を計算して $A$ に送る。
3. $A$ が $P_2 \times r$を計算して鍵にする。
4. $B$ が $P_1 \times s$を計算して鍵にする。

$A$ と $B$ のどちらの鍵も、$r \times s \times G$なので、同じ鍵を共有することになる。

#### 参考文献
[楕円曲線暗号入門「計算機緒論２」配布資料／伊豆哲也](https://written.4403.biz/source/ecc_rev30r.pdf)
あの人は本当に震えているのか人工知能に判断させてみた

# はじめに
～～さんといえば、よく震えている人なんて言われていますが、
人工知能に例の歌詞を要約させて本当に震えているかを検証したいと思います。
きっと震えてる部分が要約されるはず！

# 環境
* python3.7.3
* COTOHA API (https://api.ce-cotoha.com/)

# 実際にやってみる
今回はCOTOHA APIの要約(β)を利用して歌詞を要約させてみたいと思います。

## 機能概要
参照元：https://api.ce-cotoha.com/contents/reference/apireference.html
> 要約APIは、入力として日本語で記述された複数文で構成された文章を受け取り、これを文単位で重要度を算出し、スコアを付与します。そして、入力時に指定された要約文数に応じ、重要文を返します。
本APIはベータ版として提供させていただきます。

なるほど。。？
サンプルを確認すると

>前線が太平洋上に停滞しています。一方、高気圧が千島近海にあって、北日本から東日本をゆるやかに覆っています。関東地方は、晴れ時々曇り、ところにより雨となっています。東京は、湿った空気や前線の影響により、晴れ後曇りで、夜は雨となるでしょう。

これが
>東京は、湿った空気や前線の影響により、晴れ後曇りで、夜は雨となるでしょう。

こうなるらしい。
なんかすごそう、

## プログラム

<details><summary>初心者なので大目に見てください。。。</summary><div>

```python
# coding: UTF-8

import requests
import json


class Common:
    def __init__(self):
        self.base_url = <<APIのbaseURLを入れる！！>>
        self.token_url = <<APIのToken取得用URLを入れる！！>>
        self.token = <<繰り返し実行するときはTokenを入れる！！>>


class Tokens(Common):
    def main(self):
        cid = <<Client IDをいれる！！>>
        secret = <<Client secretを入れる！！>>

        headers = {"Content-Type": "application/json; charset=UTF-8"}
        payload = {"grantType": "client_credentials", "clientId": cid, "clientSecret": secret}
        r = requests.post(self.token_url, headers=headers, data=json.dumps(payload))

        self.token = r.json().get("access_token")
        print(self.token)


class Summary(Common):
    def main(self):
        url = '/nlp/beta/summary'

        document = '''<<要約したい文章を入れる！！！>>'''
        sent_len = '1'
        headers = {"Authorization": "Bearer " + self.token, "Content-Type": "application/json; charset=UTF-8"}
        payload = {"document": document, "sent_len": sent_len}

        r = requests.post(self.base_url + url, headers=headers, data=json.dumps(payload))
        print(r.text)


if __name__ == '__main__':
   T = Tokens()
   T.main()
   #S = Summary()
   #S.main()

```
</div></details>

## input情報
> 西野カナ "会いたくて 会いたくて" の歌詞

## 結果...
> 西野カナ "会いたくて 会いたくて" の歌詞がそのまま返ってきた

。。。あれ？
どうやら単語とかフレーズを集めた歌詞は文章として扱われず、1文として処理されたみたい。。。ぴえん👼

## もう1回
"会いたくて 会いたくて" に(私の解釈でそれっぽいところに)句点を入れてもう1回リクエストを飛ばす。
結果は。。。

> 君想うほど遠く感じて

震えてなかった

## おまけ
> 西野カナ "トリセツ"

いろいろ説明してるけど、結局どう扱えばいいのだろうか

結果は。。。
> こんな私だけど笑って許してね

# 最後に
APIリクエストするだけで簡単に使用できて面白いですね。

この後いろいろ試して気づいた点等を別な記事で紹介したいと思います。
それでは。
Word2Vec の実装で考慮すべきこと

筆者が, IMDBデータセットを用いて, Word2Vec の学習を特に難しいことは考えずに行い, その後で単語表現の学習の際に考慮した方が良さそうなことについて勉強し, それについてまとめたのがこの記事である. メモ的側面強め.

#分散表現を扱う際に
##埋め込み層の単語の分散表現を, タスクに応じて学習するか否か

Embedding 層に (word2vec などで)事前学習した単語ベクトルを埋め込むが, これをタスクに用いるネットワークの学習と共に一つのパラメータとして学習するか, 固定するかの選択肢がある.また, 学習する場合には, また色々な選択肢がある.それは, 例えば,$\mathbf{E}' = \mathbf{ET}$として$\mathbf{T}$を分散表現の行列$\mathbf{E}$の代わりに学習するとかがある.
学習したほうが良さそうな場合として, 'good'と'bad'などの反義語の単語の分散表現が類似している時に学習によってそれらを引き離してやるとか, 学習によってよりタスクに適した分散表現にするだとかが考えられる.

##正規化するか否か
分散表現の大きさを1に正規化するか否かの選択肢がある.だいたいの単語埋め込みでは, 大きさは, 
 単語の出現頻度を表す情報である場合があるみたいなので, 正規化するかどうかも検討するべき.
Word2Vec では, 多分大きさは頻度を表してないと思う.知らんけど.これを調べるには, 'the', 'a'みたいな IDF の値が小さそうな単語の分散表現の大きさを他の単語と比較してみると良いと思った.

#Word2Vec で分散表現を得る際に
##CBOW モデルと Skip-gram

CBOW モデルは, 文脈を各々の文脈ベクトルの和として解釈してしまうので, 文脈の前後関係の情報が失われている.
Skip-gram モデルは, 各々の文脈ベクトルを独立に扱う.
Skip-gram の方が実用ではよい成績を残している. Skip-gram はターゲットを入力として, 複数のコンテキストを推測するというタフな問題を扱っている為だと考えられる.

##窓
窓の幅は, 得られるベクトルの類似度に大きな影響を与える.幅が大きいとその文書のトピックの類似度に近いもの, 幅が小さいと文法的な類似度が得られる傾向がある.
なので, タスクに応じて窓の幅を選択する必要がある.文書分類なら, 窓の幅は広い方が良いだろう.実際, 筆者がIMDBデータセットでウインドウサイズを5(ターゲットの両端の5単語)とした場合には, 'good'と'bad'の分散表現の類似度が高く, pos/neg 識別をする際には識別率を下げる原因の1つとなってしまった.

##その他の手法
窓に位置情報(ターゲットの1つ前に現れた, とか)をつけることもできる. 位置情報付き窓.
他にも, 文字単位でベクトルを表現したりと色々ある.

#分布論的限界
そもそも word2vec は, 分布仮説に基づいた手法なので, 分布論の限界がある. fだいたいは以下のようなもの.

- 類似性の定義. どの類似性の側面が引き出されるかは, 結果から判断するしかなく, 制御できない(操作主義的).
- 黒い羊. テキストデータから学習されたモデルには, 自明な情報が反映されない(羊をわざわざ白い羊と呼称することは不自然だが, 黒い羊と言う時にはそうではない. 羊が黒いことは, 自明ではないからである).
- 反義語. good と bad などの反義語が類似した単語と判断される
- コーパスのバイアス.学習に基づいた文書に依存した言語使用のバイアスを反映する.女性の名前は, 職業に関する単語よりも家庭に関する単語と近いとか.
- 文脈の欠如. 単語には, 複数の意味があるので, 1つの単語に対して1つのベクトルを割り当てることに問題がある.大量の文脈から学習しているのに, 結果的に得られるベクトルには, 文脈から独立したベクトルである. 例えば, 予約するという意味で用いられるbookと本として扱われるbookに対して同じベクトルを用いる. つまり, 文脈は考慮しないで, その単語が出てきたらその単語用のベクトルを使う, というように, 文脈と単語ベクトルは独立しているのである. 単語の完全な意味は, 文脈依存である.

#参考文献
- 勉強した本
[自然言語処理のための深層学習](https://www.kyoritsu-pub.co.jp/bookdetail/9784320124462)

- Word2Vec の実験をする際に参考にした本
[ゼロから作るDeep Learning 2](https://www.oreilly.co.jp/books/9784873118369/)
Tensorflowでpytorchのreflectionpaddingを実現する

詰まったので備忘録です。
まだ動かしていないため、もし間違いなどがあれば教えてくださると嬉しいです。

pytorchにおいて、ReflectionPadding2Dは以下のような挙動をします。
詳しいことについては<a href="https://pytorch.org/docs/stable/nn.html">公式ドキュメント</a>を見るとわかると思います。

```python
>>> m = nn.ReflectionPad2d(2)
>>> input = torch.arange(9, dtype=torch.float).reshape(1, 1, 3, 3)
>>> input
tensor([[[[0., 1., 2.],
          [3., 4., 5.],
          [6., 7., 8.]]]])
>>> m(input)
tensor([[[[8., 7., 6., 7., 8., 7., 6.],
          [5., 4., 3., 4., 5., 4., 3.],
          [2., 1., 0., 1., 2., 1., 0.],
          [5., 4., 3., 4., 5., 4., 3.],
          [8., 7., 6., 7., 8., 7., 6.],
          [5., 4., 3., 4., 5., 4., 3.],
          [2., 1., 0., 1., 2., 1., 0.]]]])
>>> # using different paddings for different sides
>>> m = nn.ReflectionPad2d((1, 1, 2, 0))
>>> m(input)
tensor([[[[7., 6., 7., 8., 7.],
          [4., 3., 4., 5., 4.],
          [1., 0., 1., 2., 1.],
          [4., 3., 4., 5., 4.],
          [7., 6., 7., 8., 7.]]]])
```

>pytorch 公式ドキュメント https://pytorch.org/docs/stable/nn.html

これをtensorflowで実現しようとすると、tensorflowのpadを使うこととなります。
（<a href="https://www.tensorflow.org/api_docs/python/tf/pad">公式ドキュメント</a>に書いてあるんですけどね・・・）
自分のググりかたじゃなかなか出なかったので記事にしました。

```python
tf.pad(
    tensor,
    paddings,
    mode='REFLECT',
    constant_values=0,
    name=None
)
```


例としては以下のようになります。

```python
t = tf.constant([[1, 2, 3], [4, 5, 6]])
paddings = tf.constant([[1, 1,], [2, 2]])
tf.pad(t, paddings, "REFLECT")  
# [[6, 5, 4, 5, 6, 5, 4],
#  [3, 2, 1, 2, 3, 2, 1],
#  [6, 5, 4, 5, 6, 5, 4],
#  [3, 2, 1, 2, 3, 2, 1]]
```
>以上２例公式ドキュメントより　https://www.tensorflow.org/api_docs/python/tf/pad
機械学習でVの歌配信から歌だけ切りだす

こんにちは，オタクです．

vの歌配信って，いいですよね......

![スクリーンショット 2020-02-16 2.46.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286025/0fb47854-04a9-0a64-9a36-6476fa8e62bd.png)

（これは病気）

<br><br>


今回は歌配信から自動で歌部分だけ抽出するやつを作りました．

これ使って何かしたいんだけど大抵著作権に引っかかりそうで悔しくなっています．



## 概要

- 配信を10秒で切り刻んでメル周波数スペクトログラムを計算して
- 歌とその他に分けてCNNに入れて
- えいやしました





## 準備

機械学習の知見は全くないので検索します．

https://qiita.com/kshina76/items/5686923dee2889beba7c

https://blog.brainpad.co.jp/entry/2018/04/17/143000

特に [こちら](https://qiita.com/cvusk/items/61cdbce80785eaf28349) を参考に(諸説)モデルをお借りしました．大変ありがとうございます．



## 前処理

メル周波数スペクトログラムが良さそうなので，配信を10秒に切って求めます．

```python
# メル周波数スペクトラムを返す
def calculate_melsp(x, n_fft=1024, hop_length=128):
    stft = np.abs(librosa.stft(x, n_fft=n_fft, hop_length=hop_length))**2
    log_stft = librosa.power_to_db(stft)
    melsp = librosa.feature.melspectrogram(S=log_stft,n_mels=128)
    return melsp

_x, fs = librosa.load("wavファイル", sr=48000, duration=9.9)
_x = calculate_melsp(_x)
librosa.display.specshow(_x, sr=48000)
plt.colorbar()
plt.show()
```



こんな感じの画像が出ます．（これはわらべだの6兆年のサビです）

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286025/a771affa-f6d9-1f79-3e72-4859a51d6765.png)


よくわからないですね．これをCNNで学習させます．



## CNNで学習する

テストデータを4つの配信から作成しました．歌・それ以外合わせて1200データです．

- 白上フブキ [朝歌枠]
- 戊亥とこ [スナック戊亥]
- 兎田ぺこら [ライブ直前]
- 神楽めあ [アーカイブ削除ずみ]



[こちら](https://qiita.com/cvusk/items/61cdbce80785eaf28349) まんま使いました．データセットの与え方はこんな感じでした．

x_train ... データ数 * 128 * 3713 * 1

y_train ... データ数 * (1 or 0) ← 歌かそれ以外か

```python
model.fit(x_train, y_train, epochs=20, verbose=1, validation_split=0.1, batch_size=5)
model.save("model.h5")
```

バッチサイズはデフォルト(25) でやったらメモリが死んだので5にしました．



結果はこんな感じです．

![スクリーンショット 2020-02-15 14.48.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286025/37b8c152-9f7e-f2d5-5bb7-ad46c54063f3.png)


Accuracy 0.9333 val_accuracy 0.9750はなかなか良いのではないでしょうか（全くわからないけど）



## 推論して切り出してみる

```python
model = load_model("model.h5")
ret = model.predict(  1*128*3713*1のデータ  )

# ret[0] -> 歌 の確率
# ret[1] -> それ以外 の確率
```

100%ではないので確率をうまく使って歌だけ切り出せるように組みました．

1. 歌と判定された区間が3つ以上続く，かつ確率の平均が80%を超えている場合に歌と判定する
1. 1で判定した歌区間と歌区間の間が2区間以下かつ，歌区間を結合したときに6分を超えない場合に，2つの区間を結合する
1. 2の歌区間の前後1区間を見て，確率が40%を超えていたら歌区間に結合する
1. 3で得られた歌区間で切り出す



簡単に説明します．

1で大まかな歌区間を出します．エコーのついた雑談や歌っぽく判定された雑談が混じらないように，確率の平均で消し去ります．  

これだけだとバラード系楽曲が分割されてしまう問題があるので，1で残った歌区間の間が2区間(=20秒）以下なら結合します．ただ，この方法は「連チャンで歌われると2曲が合体してしまう」問題があります．なので，結合後に6分を超えないようにしました．（歌は大抵6分以内だと思っているためです）  

ここまでで大まかに歌が取れます．ただイントロやアウトロが切れてしまう・ぴったりすぎる問題があるので，前後が歌っぽい（確率が40%以上ある）時は結合しました．



## 結果

データセットにない，「湊あくあ」さんの歌枠を切り取ってみました．

### 湊あくあ「【Vtuber】１日限定！アイドルメイドの全力Live！【歌枠】」

https://www.youtube.com/watch?v=AwSBvP5LQuw


自動で切り取ったものがこちらです

https://www.youtube.com/watch?v=k-QI6IvkA1w

とてもいい感じに切り出すことができました．

ただ，曲の後を長めに切り出してしまうことがあるので，そこを改善しながらこの技術の使い方を検討していきたいと思います．



これ以上精度上げたい時はどうするのが正解なんだろうか......
ApacheでのLet's EncryptのセットアップがCertbotのApacheプラグインで簡単にできたのでメモ。

## はじめに
CertbotのApacheプラグインを使うとLet's Encryptが簡単にセットアップできたのでメモしておく。

## 環境
- Ubuntu 18.04
- Apache/2.4.38 (Debian)
- certbot 0.31.0

## 準備
以下のコマンドでCertbotとApacheプラグインがインストールされる。

```
sudo apt install python-certbot-apache
```

## セットアップ
以下のコマンドをターミナルで実行して指示に従うと、HTTPSアクセスができるようになる。
注意：443番ポートにアクセスできるようにしておくこと。

```
sudo certbot --apache
```

証明書の自動更新についてはcronなどで各自設定してください。

## 参考
- [How To Secure Apache with Let's Encrypt on Ubuntu 18.04](https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-18-04)
【備忘録】Expoでreact-native-paperの導入手順

#注意点
React Native >= 0.50.3だと導入できないみたいです。
あまり当てはまるケースは少ないと思いますが・・・
#導入
ReactNativeで実装する際、UIコンポーネントって選ぶのにどれがいいかなーって迷いますよね
そこでReact-native-paperをおすすめします
特徴以下です。
・ReactNativeのUIコンポーネントの一つ
・マテリアルデザインのライブラリ
・テーマの一括変換が可能（流行りのダークモード等の設定が楽）
・多くのコンポーネントが用意されている

詳しくは他の方の記事を参考にしてください（めんどくさい）
公式DOCもあるので参考にしてください。
[公式DOC](https://callstack.github.io/react-native-paper/getting-started.html)

#Expoのプロジェクト作成
```terminal
expo init paperSample
```
#React-Native-Paperの導入
以下、コマンドを入力してください

```terminal
yarn add react-native-paper
```
npmでインストールする場合は以下

```terminal
npm install react-native-paper
```

##軽く動作確認
```terminal
expo start
```
親画面となる画面を呼び出す際は、\<PaperProvider>で囲む必要があるので囲みます。

```../App.js
import React from 'react';
import HomeScreen from './screens/HomeScreens';
import { Provider as PaperProvider } from 'react-native-paper';

export default function App() {
  return (
    <PaperProvider>
      <HomeScreen />
    </PaperProvider>
  );
```


```../screens/HomeScreen.js
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';

export default function HomeScreen() {
    return (
        <View style={styles.container}>
            <Text>WelCome HomeScreen</Text>
        </View>
    );
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: '#fff',
        alignItems: 'center',
        justifyContent: 'center',
    },
});
```
![スクリーンショット 2020-02-16 17.29.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541882/63996d42-ce86-28a9-9d71-00924ed8312e.png)



react-native-paperが提供しているボタンでも配置してみます。

```../screens/HomeScreen.js
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
import { Button } from 'react-native-paper';

export default function HomeScreen() {
    return (
        <View style={styles.container}>
            <Text>WelCome HomeScreen</Text>
            <Button icon="camera" mode="contained" onPress={() => console.log('Pressed')}>
                Press me
            </Button>
        </View>

    );
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: '#fff',
        alignItems: 'center',
        justifyContent: 'center',
    },
});
```

![スクリーンショット 2020-02-16 17.32.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541882/da95def0-a830-3759-b9c1-2e7e8171febe.png)

できました。これで導入終わりです。

#まとめ
他にもいろんなコンポーネントがあるので使ってみてください！
どんなUIがあるか調べたい方はexpoのスマホアプリで確認できるので参考までに。
またいろんなreact-native-paperについては記載します！
では！
[expoサンプル](https://expo.io/@satya164/react-native-paper-example)
[公式DOC](https://callstack.github.io/react-native-paper/getting-started.html)
取得したサーバ証明書のFQDNは公開されている

# TL; DR
- Certificate Transparencyという仕様にしたがって、発行したサーバ証明書のドメインは基本的に公開されます
- 存在を隠したいドメインにサーバ証明書を発行するときは、ワイルドカード証明書を使うか、そもそもドメインごと既存のものとは分けましょう

# Certificate Transparencyとは
Certificate Transparencyは[RFC 6962](https://tools.ietf.org/html/rfc6962)で定められています。
これはサーバ証明書を発行したら、証明書データベースに登録するというもの。データベースは修正不可で、いつ、どのドメインに、どの認証局から発行されたのかなどが登録されます。
不正にサーバ証明書が発行されたときに、すぐに気がつくようにするためデータベースは一般公開されています。

# 「秘密の」ドメインが公開されている
誰でも検索可能なデータベースなので、「秘密の」ドメインであっても容赦なく第三者から検索可能です。検索も以下のサイトから容易に実施できます。

- [crt.sh](https://crt.sh)
- [Censys](https://censys.io/)
- [Google Transparency Report](https://transparencyreport.google.com/https/certificates)

# 検索されるとどのような問題があるのか
## セキュリティ上の懸念
たとえば、第三者からは知られていない（ことになっている）ことだけでセキュリティを担保しているウェブサイト（社内向けサイトに時々ありますね）は、前提が崩れています。
SSL-VPNなど、外部には隠しておきたいドメインであっても公開されてしまいます。ここに脆弱性があれば、すぐに攻撃されてしまいます。
## リリース前の情報が漏れる懸念
プレスリリースが出る前の製品が、取得した証明書から判明することがあります。サブドメインで新サービスを公開する場合、証明書はサイト公開前に発行されるため、意図せず情報が流出します。
実際、[ドラクエウォークはプレスリリースの数日前からCT情報から名前だけ発覚していました。](https://crt.sh/?id=1489870362)

# 対策
対策例として2種類の方法を挙げます。他にもよいアイデアがあれば教えてください。

## ワイルドカード証明書を利用する（EV証明書以外）
ワイルドカード証明書を利用すれば、具体的なドメイン名を隠蔽できます。たとえば、`newservice.example.com`というドメインで新サービスを提供するとき、`*.example.com`というワイルドカード証明書を取得すれば、サービス名部分を隠蔽できます。
しかしEV証明書はワイルドカード証明書で発行できないため、この方法が使えません。また、ワイルドカード証明書はシングルドメインの証明書と比べて高額なので、コストの問題もあります。
## 新規ドメインを使う
そもそもドメインごと分けるという方法もあります。`example.com`ドメインがすでに知られているのであれば、`newservice.example.net`など新しいドメイン名を発行します。
この方法ならEV証明書でも発行可能です。社内向けドメインであれば問題がありませんが、ティザーサイトなどではSEOが難しい、よいドメインが取得できないかもしれないという問題もあります。
## パス振り分けを使う
ティザーサイトならパス振り分けでもサイトを公開できます。この場合`example.com/newservice/`というURLになります。この方法は既存FQDN内で提供されるためコストはかかりませんが、SSL-VPNなどでは利用できませんし、振り分けに使うLBへの負荷やルール数の問題があります。
[python入門] tuple型


## 想定読者

+ Python勉強したて。型について知りたい
+ Pythonのtuple型について知りたい
+ 理解の助けになる実装例を知りたい
+ int, float, str, list型について知っている

## 目的

+ tuple型についてわかる
+ 利用用途が分かる

## tupleとは

+ [公式リファレンス](https://docs.python.org/ja/3/tutorial/datastructures.html#tuples-and-sequences)
+ 必ずしも知っている必要はないが、知ってると便利なデータ型(個人的な認識ですが)
+ 値の組みを入れておく箱。listとの違いは、listと異なり要素の追加・変更・削除ができないことと、hash関数でハッシュ化できる

## tupleを使うメリット

+ ハッシュ化できる。特に、dictのキーに複数の値を使ってキーにすることができる
+ listよりちょっとメモリ使用量が少ない

    ```python
    >>> from sys import getsizeof
    >>> getsizeof( (1, 2, 3) )
    72
    >>> getsizeof( [1, 2, 3] )
    88
    ```

## tupleの文法

```python
a = (1, 2, 3) # 要素3つのtuple
b = (1,) # 要素1つのtuple
c = () # 要素0つのtuple

d = (1)  # これは、dはintの1として扱われる（計算式のカッコとして扱われる）ためtupleにならない
e = 1, 2 # カッコは、実はなくても良い
f = 1,   # たまに、間違えてカンマが入ってしまって、整数値などがtupleになってしまうことがあるので、注意
```

+ tupleオブジェクトは`()`で囲む
+ 要素は`,`で区切って書く
+ 要素が一つだけのtupleを作る場合は、要素の後にカンマを入れる`(1,)`

## tupleへのバリューの出し入れ

```python
a = (1, 2, 3)
print(a[0]) # -> 1
print(a[:2]) # -> (1, 2)
```

+ listと同じように、取り出したい番号を`[]`で囲ってアクセスする
+ listと同じようにスライスを使って、一部分を取り出すことができる

```python
>>> a = (1,2,3)
>>> a[0] = 10
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
```

+ tupleオブジェクトに対して値の上書きはできない

## 応用例1

組み合わせの数を数える

下の例では、名前と性別の組み合わせの頻度を計算する

```python
user_list = [
    {'名前': '田中', '性別': '男'},
    {'名前': '鈴木', '性別': '男'},
    {'名前': '鈴木', '性別': '男'},
    {'名前': '田中', '性別': '女'},
    {'名前': '鈴木', '性別': '女'},
    {'名前': '田中', '性別': '女'},
]

# 数えるための辞書を0で初期化。tupleはdictのキーにすることができる（要素が全てhash化できない場合を除く)
count_dict = {
    ('田中', '男'): 0,
    ('田中', '女'): 0,
    ('鈴木', '男'): 0,
    ('鈴木', '女'): 0,
}

# user_listから要素を取り出し、user変数に入れてループ
for user in user_list:
    # user変数から、名前・性別キーにアクセスし、tupleを生成
    key = (user['名前'], user['性別'])
    # count_dictに上記のキーを使って値を取り出し、1追加して再度格納
    count_dict[key] = count_dict[key] + 1

print( count_dict[ ('鈴木', '男') ] ) # -> 2
print( count_dict[ ('鈴木', '女') ] ) # -> 1
```

## 応用例2

簡単な値オブジェクトの作成

ある概念を表すオブジェクトを簡易的に作りたい時に使えます。`namedtuple`を使うと、dictのように要素が何を表しているのかをわかりやすくすることができます。
tupleは要素数が固定なので、予め要素数が決まった概念を表すのに適しています

例えば、下の例では、**量と単位**を持ったお金の概念をnamedtupleで作ります。
（お金の概念に計算は定義していないので、お金オブジェクト同士の四則演算などはできません）

```python
from collections import namedtuple

# namedtupleを使ってお金のtupleを作るためのクラスを作る
# namedtupleは第一引数はクラス名, 第二引数は要素名(カンマ区切り)を表す
Money = namedtuple('MoneyClass', 'amount,unit')

money1 = Money(100, '円')
money2 = Money(200, '円')
money3 = Money(100, '円')
print(money1) # -> MoneyClass(amount=100,unit='円')
print(money1 != money2) # -> False （異なる値をもつお金は異なる物と扱われる)
print(money1 == money3) # -> True （同じ値をもつお金は同じ物と扱われる)

# namedtupleはtupleとして扱うことができます
print(money1[0]) # -> 100
print(money1[1]) # -> '円'

# namedtupleの要素にはdot演算子と要素名を使ってアクセスすることもできます
print(money1.amount) # -> 100
print(money1.unit) # -> '円'
```
[OpenCV]imreadで返される配列について

# 1.背景
ディープラーニングを用いて顔を認識するプログラムを作成していた際に，顔だけが映った画像を用意しなければならなかった．手法としては，人物が映った画像から，顔を検知し，その部分を切り取った．その際，OpenCVのimreadメソッドで返される配列を利用して，切り取った．この記事では，imreadで返される配列について解説する．
# 2.imreadとは
image = imread('sample.jpg')のように，引数に読み込む画像を指定することで，ファイルから画像を読み込むことができる関数である．この際，imageには，imreadによってsample.jpgの各画素の画素値(RGB値)が格納されている．
実際に，以下のようなプログラムを実行して，確認してみる．

```python:imread_test.py
import cv2

#画像を読み込む
image = cv2.imread('sample.jpg')

#imreadで返された配列を出力
print(image)
	
#読み込んだ画像を表示する
cv2.imshow('img',image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```

出力は以下のようになる．
<img width="742" alt="2020-02-16 (2).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581527/1dfde8a4-8801-30ef-c35b-c738cfd4dd64.png">
このように，3次元配列が出力されていることがわかる．この配列をA×B×3次元配列とする．Aは画素の行数であり，Bは画素の列数である(読み込む画像のサイズによって，行列のサイズは変わるため変数A，Bとした)．3は，RGBの輝度である．
上の画像において，輝度が縦に大量に並んでいるが，これは
[[[0行0列目の輝度]~[0行B列目の輝度]]~[[A行0列目の輝度]~[A行B列目の輝度]]]の順に並んでいる．(画像において0行0列目は，左上)
よって，imreadで返される配列とは，画素の輝度を行列の順に格納したものである．
#3. 余談(画像をどう切り取るか)
1章の背景でも，説明したように，imreadで返される配列を利用して顔画像を切り取った．まず，検出した顔画像の左上の位置と，右下の位置を取得する．そして，imreadで返された配列の，顔画像の部分(顔画像の左上の行列から，右下の行列までの区分行列の輝度)だけを取り出すことで，切り取ることができた．詳細は，別の記事で説明しようと思う．
Vuexをie11で

エラーの短い備忘録。

```
[vuex] vuex requires a Promise polyfill in this browser.
```
#`Vuex`は`Promise`を使っている
　使っているが、しかし
#`IE11`では`Promise`が使えない
　そもそもブラウザが対応してない。なので
#`IE11`で`Promise`が使えるようにする
　何らかのポリフィルを持ってくる。

```sh
$ npm install --save es6-promise
```

##main.js
```
import 'es6-promise/auto'

import Vue from 'vue'
import App from './App.vue'
import store from './store'
```

これで使えるようになると思います。

##参考にした記事
https://github.com/vuejs-templates/webpack/issues/474
ASP 例題０ 組み合わせ

# 問題
p(1)からp(5)までの5つの中から、2つ選ぶ組み合わせはいくつか？

# 回答
```Prolog:example0.lp
{p(1..5)}=2.
```
## 解説
[Potassco guide](https://github.com/potassco/guide/releases/)を読んでも、まったくわからなかった。
`{}`で囲まれな中は
`{p(1);p(2);p(3);p(4);p(5)}`に展開され、
`#count {p(1):p(1);p(2):p(2);p(3):p(3);p(4):p(4);p(5):p(5)}=2.`と変換されるらしい。

組み合わせをすべて求めるためには、実行時に`0`をつける

```terminal
> clingo example0.lp 0
```


# 他の問題
[ASP個人的ポータル](https://qiita.com/Ganesha/items/b443046a26826fc97dae)
Raspberry Pi と Mac で MQTT

# 概要
MQTTについて　理解する必要がでてきたので，ラズパイとMacで通信してイメージを掴みたい

# Raspberry Pi

- ラズパイにmosquiito と mosquiito_clientsをインストールした
- Man に mosquittoをインストールした
- ラズパイで　Brokerを起動
- Macでmosquitto_sub -h 192.168.11.13 -t tp1/test を起動（受信の準備）
- ラズパイで mosquitto_pub -h localhost -t tp1/test -m Hello を実行（データの送信）
- Macのターミナルで受信を Hellow 確認

# 基にしたサイト

- [MQTT の仕様:トピックのワイルドカード](http://devcenter.magellanic-clouds.com/learning/mqtt-spec.html)
- [pythonでMQTT送受信](https://qiita.com/hsgucci/items/6461d8555ea1245ef6c2)
- [Raspberry Pi で mosquitto を使う](https://qiita.com/ekzemplaro/items/ab90dd630c3ad8e819ab)
- [MacとRaspberryPiにMosquitto入れてみた](https://qiita.com/segur/items/0536ced1fe741b55713d)
- [MQTT の基本知識](https://www.ibm.com/developerworks/jp/iot/library/iot-mqtt-why-good-for-iot/index.html)

# 私のYouTubeチャンネル

- [YouTube:簡単マイコン教室](https://www.youtube.com/channel/UC41qeaw-dXNdl0puKkXiuKA/)
[mac US配列] phpstormで \ (バックスラッシュ) が入力できない時の対処法 

## 環境
- MacBook Pro
- macOS Catalina version 10.15.2
- US配列キーボード
- phpstorm 2019.3.3

## 問題
phpstorm にて`\`を入力（ option + \ ）しようとすると、`«` が入力される
なお、atom や chrome　など他のアプリケーションではこの方法で`\`が入力できる
同様の問題は pycharm といった他の Jetbrains 系の IDE でも見られる模様

## 対処法
(macの)システム環境設定->キーボード->入力ソース へ移動する
`日本語`タブを選択し、`"¥"キーで入力する文字:`を`\(バックスラッシュ)`へと変更する
これでキーボードの \ で`\`が入力できるようになる
なお、`¥` は　( option + Y ) で入力できる
Lumen(6.x系)、いろいろハマるところ

書きなぐりメモ。

## バージョン

```shell
$ php artisan --version
Laravel Framework Lumen (6.3.3) (Laravel Components ^6.0)
```

## composer create-projectしたあと、動かない/エラーが表示される。

```shell
$ composer create-project --prefer-dist laravel/lumen blog
$ cd blog
$ composer dump-autoload
```

## 設定(config)ファイルは？

- `.env`
- `boostrap/app.php`


## ユーザー認証したい

1. `composer require laravel/ui --dev`
1. Laravel6系のapp/Http/Controllers/Authから使用するファイルをコピーする。

- LoginController.php
- RegisterController.php

1. resources\views\authからbladeファイルをコピー

- login.blade.php
- register.blade.php

bladeファイルを環境に合うように修正。Laravel6.x系と同じbladeだけど、そのままでは使うことができず使えない記法(@error,@oldや翻訳の`__()`など)があるので、素のHTMLに近い状態まで編集する必要がありそう。


- [Authentication - Lumen - PHP Micro-Framework By Laravel ](https://lumen.laravel.com/docs/6.x/authentication)



## php artisan key:generate？

`str_random()`のやり方ができなくなってます。php7だと`random_bytes()`が使えるのでそのまま実行しました。

```shell
php -r "echo base64_encode(random_bytes(24)).PHP_EOL;"
```

本来ならphpのrandom_bytes関数で32文字を作って表現できる文字に変換するbase64_encode関数を実行するのですが、base64_encode(random_bytes(32))だと44文字生成されてしまうため、random_bytesを24文字で実行してます。

おそらく44文字でも大丈夫だと思いますが、マニュアルに"this string should be 32 characters long."とあるため、32文字にしています。


- [Installation - Lumen - PHP Micro-Framework By Laravel](https://lumen.laravel.com/docs/6.x/installation)
- [[Laravel5.5] APP_KEY の行方を追う - Qiita](https://qiita.com/yk2220s/items/dcbf54c6d1f33a0cb06f)
- [PHP: random_bytes - Manual](https://www.php.net/manual/ja/function.random-bytes.php)

## 個人的な感想
Laravelのこと(すくなくとも5.x系の知識)がわからないとLumenを使うのはとても難しいです。でも、Laravelができることを知っていると「なんでLumenでできないの！？」と思ってしまうことが多々あるのでLumenでなければいけない条件が難しいです。

もし、作ろうとしているサービスでなんらかの認証(ユーザー認証やAPI用の認証)が必要になる場合、Lumenで作り始めて各種コンポーネントを足していくよりLaravel 6.xで作り始めて使用しないコンポーネントを解除/消していくほうがシンプルかもしれません。
PHP の Rest で Cloud Firestore のデータを削除 (Delete)

```php:firestore_delete_rest.php
#! /usr/bin/php
<?php
//
//	firestore_delete_rest.php
//
//					Feb/16/2020
//
// ------------------------------------------------------------------
include('Requests/library/Requests.php');
include("get_token.php");
//
// ------------------------------------------------------------------

// ------------------------------------------------------------------
fputs (STDERR,"*** 開始 ***\n");
Requests::register_autoloader();
//
$key_in = $argv[1];
print($key_in . "\n");

$token = get_token_proc();
//
$project = 'project-jan25-2020';
$headers = array('Authorization' => 'Bearer ' . $token);
$options = array();
$url_base = "https://firestore.googleapis.com/v1/projects/" . $project . "/databases/(default)/documents/cities";
$url = $url_base . "/" . $key_in;

$request = Requests::delete($url, $headers);
var_dump($request->status_code);

$rvalue = $request->body;

print($rvalue);

fputs (STDERR,"*** 終了 ***\n");
// ------------------------------------------------------------------
?>
```

get_token.py はこちら
[PHP の Rest で Cloud Firestore のデータを作成 (Create)](https://qiita.com/ekzemplaro/items/ec8de444aadc8ca5d68d)

実行コマンド

```bash
export GOOGLE_APPLICATION_CREDENTIALS="***.json"
./firestore_delete_rest.php t0922
```