OmniAICreator/Qiita-1.07M huggingface dataset:
沈めこみメモ（局所座標に関する基本的な定理のメモ）

[数学ノート　目次](https://qiita.com/kktn0215/items/3fb6683337e2ef963521)

多様体論の基本的な定理ですが、証明なしで使っている本が多いので、証明を書くことにしました。

$M$を$m$次元可微分多様体、$N$を$n$次元可微分多様体とする。$f:M \to N$を$C^{\infty}$写像とする。
$f:M \to N$が**沈めこみ(submersion)**であるとは、任意の$x \in M$に対して$f$の微分写像$df_x:T_xM \to T_{f(x)}N$が全射であるときを言う。

***
####定理

$M$を$m$次元可微分多様体、$N$を$n$次元可微分多様体とする。また$m \ge n$とする。
$f:M \to N$を$C^{\infty}$写像とする。$x_0 \in M$をとり、$df_{x_0}$は全射と仮定する。
このとき、ある$x_0$の局所座標近傍$(U,\varphi)$と$f(x_0)$の局所座標近傍$(V,\psi)$で、任意の$(z_1,\cdots,z_m) \in \varphi(U)$に対して
$$
\psi \circ f \circ \varphi^{-1}(z_1,\cdots,z_m)=(z_1,\cdots,z_n)
$$
が成立するようなものが取れる。
***

証明）
$(W,\xi)$を$x_0$の局所座標近傍、$(V,\psi)$を$f(x_0)$の局所座標近傍とする。また
$\xi=(x_1,\cdots,x_m),\psi=(y_1,\cdots,y_n)$と書くことにし、$\xi(x_0)=0,\psi(f(x_0))=0$と仮定してよい。さらに
$$
\psi \circ f \circ \xi^{-1}(x_1,\cdots,x_m)=(f_1(x_1,\cdots,x_m),\cdots,f_n(x_1,\cdots,x_m))
$$
と書くことにする。ここで新しい写像$F:\xi(W) \to \mathbb{R}^m$を
$$
F(x_1,\cdots,x_m)=(f_1(x_1,\cdots,x_m),\cdots,f_n(x_1,\cdots,x_m),x_{n+1},\cdots,x_m)
$$
で定義する。$df_{x_0}$は全射であるから、$F$の原点におけるヤコビ行列は正則になる。したがって逆写像定理より、ある$x_0$の開近傍$W_0 \subset \xi(W)$が存在して

```math
F|_{W_0}:W_0 \to F(W_0)
```
は微分同相写像になる。そこで$U \equiv \xi^{-1}(W_0) \subset W$と置き、$\varphi:U \to \mathbb{R}^m$を

```math
\varphi=F \circ \xi |_{U} :U \to \mathbb{R}^m
```
と定義すると$(U,\varphi)$は$x$の局所座標近傍になる。$(U,\varphi)$と$(V,\psi)$が所望の座標近傍になる。

実際、$(z_1,\cdots,z_m) \in \varphi(U\cap f^{-1}(V))=F(\xi(U\cap f^{-1}(V)))$をとると、

```math
\begin{gather}
(z_1,\cdots,z_m)=(f_1(x_1,\cdots,x_m),\cdots,f_n(x_1,\cdots,x_m),x_{n+1},\cdots,x_m), \\(F|_{\xi(U)})^{-1}(z_1,\cdots,z_m)=(x_1,\cdots,x_m)
\end{gather}
```

を満たす$(x_1,\cdots,x_m) \in \xi(U\cap f^{-1}(V)) \subset W_0$が一意的に取れる。したがって
 
```math
\begin{eqnarray}
\psi \circ f \circ \varphi^{-1}(z_1,\cdots,z_m)&=&\psi \circ f \circ \xi^{-1} \circ (F|_{\xi(U)})^{-1}(z_1,\cdots,z_m) \\
&=&\psi \circ f \circ \xi^{-1}(x_1,\cdots,x_m) \\
&=&(f_1(x_1,\cdots,x_m),\cdots,f_n(x_1,\cdots,x_m)) \\
&=&(z_1,\cdots,z_n)
\end{eqnarray}
```
となる。（証明終わり）

要するに、$M$の局所座標をうまく取り換えているだけですね。この証明から$f:M \to N$が沈めこみならば、$M$の各点で上の定理のような局所座標がとれます。

はめこみについても似たようなことが言えます。そのうち書くかもしれません。

[数学ノート　目次](https://qiita.com/kktn0215/items/3fb6683337e2ef963521)
【無料】iPhone等から取得した大量のHEICファイルをWindowsからWebサイトで使えるようにする【一括変換】

# 【無料】iPhone等から取得した大量のHEICファイルをWindowsのローカル環境からWebサイトで使えるようにする【一括変換】
タイトルで一番言いたいのは「無料」と「大量」と「一括変換」、たかだかこれだけのために課金しろと言われたのでカッとなって作った。

# 謝辞
WSL+Shellを使っているので純粋にWindowsか？と言われるとツラい…。
PowerShellでもできるとは思うが、ここでは紹介しない（私が分からない）。

## 前提：少数で個人ならWebサービスがおすすめ
探せば結構便利なのがいっぱいあるが、いくつか見たところ、日本語サイトより海外サイトの方が利便性が高い気がする。

## 公開中のサービスのいろいろと惜しいポイント
- 一括変換できるがダウンロードは一つずつ
- 変換後のファイルのど真ん中に独自のロゴ（無料プラン）を入れてくる
- 無料プランだと変換できるファイル数が100件以下

部分的には問題ないのに、致命的な欠点が一つあるせいで使えない、となってしまう。
（尤も、それがウリなんだろう）

## 解決案
[imagemagick](https://imagemagick.org/)を使えばheicファイルを変換できる。
実行するだけなら`magick *.heic -set filename:x "%t" "%[filename:x].jpg"`が手っ取り早い。
実はこれだけでも複数ファイルを変換することは可能だが、20GB/3000ファイルで検証したところ、うんともすんとも言わなくなったので、この方法は採用しなかった。

なので、特定のディレクトリ以下にfindを掛けてxargsなりで一つずつ処理をさせる方法が良さそうだ。

### 実行例
``` heic2jpg.bsh
#!/bin/bash
# 変更をユーザー側の設定に合わせて適宜変更する
processor=1
dir_path="./"
export expansion_input='HEIC'
export expansion_output='jpg'
export magick_path='magick'  # magickのパスを再設定できる。WSLならmagick.exeか

# 以下は高度な変更不可
function execute {
  input=$1
  output="${input%.$expansion_input}.${expansion_output}"
  echo "Run [${input}]"

  if [ -e "${output}" ] ;then
    echo "Skip"

  else
    ${magick_path} ${input} ${output} && echo "Complete!" # && rm ${input}  # 変換後削除する場合は、&&の前の#のコメントアウトを外す
  fi
}
export -f execute

find $dir_path -type f -name "*.${expansion_input}" | xargs -P ${processor} -I@ bash -c 'execute "@"'
```
[Github](https://github.com/shimajima-eiji/Chocolatey/blob/master/tool/heic2jpg.bsh)

# 参考
- [Windows10で画像を一括処理したいときに便利なコマンドラインツール（ImageMagick）](https://4thsight.xyz/8342)
- 備考：[「さようなら ImageMagick」の考察](https://qiita.com/yoya/items/2076c1f5137d4041e3aa)

重要なのは備考部分で、色々と不安定な状態のものをメンテすると大変だからサービスとして公開する以上は無料ではなく有償としているのだろう、という事が窺えるのでお金取るな！という話をするつもりはない。
ただし、一般利用者（特に非プログラマー）としてはそこまで神経質にならず、とりあえず使えるものがあればそれで良いので、そういったニーズに応えても良いのでは？と思う。
削除した記事（ゴミ箱）

公開するにふさわしくなさそうな記事を削除したが、その内容自体を限定共有の形で退避してるのでそのリンク

* [YAMLにコメントを書くときの注意（真偽不明） - Qiita](https://qiita.com/snaka/private/efdfc1e7eabf84d5b402)
CircleCIと連携済みのGithubの組織名変更

公式情報
https://support.circleci.com/hc/en-us/articles/360043407732-Renaming-your-Organization-or-Repository-on-your-VCS

要は組織変更したら一回、CircleCIのほうにログインして移行が完了してから、古い組織作り直してねとのこと。
先に古い組織を作り直すと引き継がれずに終わる。

失敗することもあるかもねみたいなこと書いてあって意外とリスク高い。
golang UUID 

goで生成します。
メモです。


```main.go
package main

import (
        "fmt"
        "github.com/google/uuid"
)

func main() {
        u, err := uuid.NewRandom()
        if err != nil {
                fmt.Println(err)
                return
        }
        uu := u.String()
        fmt.Println(uu)
}
```

https://hawksnowlog.blogspot.com/2019/04/generate-uuid-with-golang.html
Azure Machine Learning でAutoMLしてみた



# はじめに

　以前、機械学習のお勉強として、Kaggleのチュートリアルである「Titanic: Machine Learning from Disaster」にチャレンジしました。その時の記事はこちらです。→[【Kaggleチュートリアル】タイタニック号で生き残るのは？](https://qiita.com/k2me14/items/ab9d71960d2b9d422c16)

　今回は、これを同じデータを使って、Azure Machine LearningでAutoML機能を試してみたいと思います。


# 大まかな流れ

　大まかな流れは以下の通りです。

　1から4までは、こちらの記事「[AutoML (自動機械学習) による時系列データ予測」](https://qiita.com/yahanda/items/abccab35920b638b4ab4)を参考にさせていただき実行しました。

　1. Azure Machine Learning の作成
　2. Azure Machine Learning Studio の起動
　3. コンピューティング インスタンスの作成
　4. トレーニング クラスターの作成
　5. Automated ML の作成と実行
　6. 結果確認

# 5. Automated ML の作成と実行

　Automated ML(preview)を開き、新しい自動ML実行の作成に入って行きます。
　まず、データセットの作成から。私は、ローカルファイルから作成しています。
　このようなダイアログが開くので、適当な名前をつけて次へ進めます。

![スクリーンショット 2020-07-04 12.09.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152321/e59613f6-00b9-8d3c-b27c-69f7f1f34a0c.png)


　次に、ファイルをアップロードしますが、ここで、「列見出し」の項目で、「最初のファイルのヘッダーを使用する」を選択するのを忘れないようにしてください。画面下のプレビューも問題ないことを確認したら、次へ。

![スクリーンショット 2020-07-04 12.17.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152321/2445c49e-6182-3ea3-842d-de4f1dbc33ca.png)

　データセットが作成できたら、実行の構成をしていきます。
　実験名、ターゲット列（ここでは、「Survived」）、コンピューティングクラスターの選択をして、次へ。

![スクリーンショット 2020-07-04 12.20.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152321/eb9a4df0-bdce-5d96-35bf-202536035dc0.png)

　最後にタスクを「分類」を選択します。今回は、ディープラーニングを使用せずで。

![スクリーンショット 2020-07-04 12.22.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152321/481cc5b2-568e-9b39-6779-00c7bb6cc926.png)

　終了を押せば、AutoMLが実行されます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152321/a7687082-78c2-7332-bdc1-dd5cece6e9c4.png)


# 6. 結果確認

　私の場合、１時間５２分で実行が終了しました。

　色々なアルゴリズムが試行されていますが、もっとも良かったのは、VotingEnsembleでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152321/a4767e0b-dc21-c185-990e-d4265e272168.png)

　「説明の表示」を押下すれば、どの特徴量が効いていたのかわかります。
　今回は、Fare（運賃）、Age（年齢）が重要だった感じでしょうか。
　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152321/4b9420c4-0189-b484-199d-6657d57db068.png)


　精度も、このようにグラフィカルに表示されています。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152321/06fbbe98-31fc-e7ae-6eb3-30cafc59230d.png)



# おわりに

　今回は、まずAutoMLというものがどういうものか、素人でも使えるのか、などを試す意味で、タイタニックのデータで動かしてみました。

　とりあえず、２時間くらいで動かすことはできましたけど、使いこなすには覚えることが、まだまだたくさんあるなという印象です。AIの民主化、みたいなキーワードがありますが、そう甘くはなく、IT、クラウド、データサイエンスなどの基礎知識がそれなりに必要で、誰でも簡単に、というレベルかは微妙な印象でした。

　今後は、他のデータやタスクでの試行錯誤、出来上がったモデルのより深い分析や、このモデルをどこかにデプロイして推論させてみたり、稼働を監視する機能の検証をしたりしてみようと思います。
VSCodeメモ

VSCodeの設定メモ

# 1. ソース管理で変更ファイルの一覧をツリー表示する
Git Graphを入れると、変更ファイルのツリー表示ができるようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38957/4499f366-1653-505c-39bd-5220794f8fc0.png)

## 表示の変更方法
ソース管理のアクションに「表示と並べ替え」が追加されるので、そこから「ツリーとして表示」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38957/e295297c-3a62-8dd2-c455-4d8605f7b82c.png)

> remote機能でコンテナ内開発をしている場合は、コンテナ側のVSCodeでGit Graphの入れ忘れに注意、、、


# 2. エディタの表示領域への切り替え

ターミナルからエディタへの切り替えをキーボードだけでやる場合、今まではターミナルをctrl+`で閉じたりしていたが、キーボード ショートカットの「表示: アクティブなエディターグループにフォーカス」に対して、ショートカットを設定すると、ターミナルを閉じなくても切り替えができた。

- HHKBなので、ターミナルショートカットの隣のキーのctrl+\を設定した

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38957/a7103306-9de2-0227-23b6-ae39435de8eb.png)


# 3. ショートカット

- https://qiita.com/12345/items/64f4372fbca041e949d0

## 3.1 Windowsで英字配列キーボードでのCtrl+`対応
Windowsで英字配列のキーボードで日本語IMEを使うと、```Ctrl+` ```のキー入力が`半角/全角`として認識される。
```Ctrl+` ```はターミナル表示のショートカットなので、なんとか活用したいが、VSCodeのショートカットキー設定でも日本語IMEの状態ではunknownとして認識されてしまう。

そこで、keyhacを利用してなんとかする。
手順としては、

1. 半角/全角の入力を`に変える
1. 使ってないショートカットキー（ここではCtrl+'）を、```Ctrl+` ```の入力に置き換える
1. VSCodeのキーボードショートカット設定で、置き換えたショートカットキー（Ctrl+'）を「表示: ターミナルの切り替え」に設定する


以下はkeyhacの設定ファイルで、

- https://gist.github.com/seriwb/f059dc49aafdb46cdf8ff4202f82b20c

本処理のための箇所を抜粋は以下。

```py
    ## 半角/全角 => `
    keymap.replaceKey(243, 192)
    keymap.replaceKey(244, 192)

    if 1:
        keymap_edit = keymap.defineWindowKeymap( class_name="Chrome_WidgetWin_1" )

        keymap_edit[ "C-BackQuote" ] = "C-Quote"   # Ctrl+`の代わり
```


## 3.2 WindowsでターミナルでのCtrl+K対応

Windowsのコマンドプロンプトなどのターミナル系アプリケーションではkeyhacを入れなくてもCtrl+Kが動作するので、keyhacでShift+End, Ctrl+Dにすると逆に動作しなくなる。
その対応として、ターミナル系アプリケーションのkeyhac設定からCtrl+Kを無効にしても、VSCodeのターミナルはVSCodeのkeyhac設定を利用してしまうため、VSCodeのターミナルでCtrl+Kを使うためにはVSCode側でもCtrl+Kを無効にしなければいけない。

そうするとVSCodeのエディタでCtrl+Kの行末まで削除が使えなくなるため、VSCodeのショートカット設定から「右側をすべて削除」のキーバインドにCtrl+Kを設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38957/60eef3db-3d9a-835e-adb2-1e642eb27515.png)



# 4. Markdownで末尾の空白除去を止める

markdownの設定に`"files.trimTrailingWhitespace": false`を追加する。

```json:settings.json（前後省略）
  "[markdown]": {
    "files.trimTrailingWhitespace": false,
    "editor.defaultFormatter": "yzhang.markdown-all-in-one"
  }
```

# 5. Remote Containerからgit接続する

```eval `ssh-agent` ```してから`ssh-add`だけでできていた気がしていたが、
ssh-addにKオプションつけて鍵登録してから、リモートコンテナに入ってないと駄目だった。

```
$ eval "$(ssh-agent -s)"
$ ssh-add -K ~/.ssh/id_ed25519
```

https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent#adding-your-ssh-key-to-the-ssh-agent
AWS無料枠のつもりが請求が来てしまった話

# ある日
Gmailに気になるメールが。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266454/94318fdd-709d-25c8-8ae3-d1605e2ea3c6.png)

請求メール？


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266454/6892e1bf-772b-c026-5ca3-86953fb57bb2.png)

5000円くらい請求されてる！？
AWSアカウントはいくつか持っているが、EC2のみ利用しており、アカウント作成から1年経っていない、かつ無料枠内におさめているはず…（t2.micro×1台のみ）
なんでだ！？

# 原因
__AWS Organizations__ を設定していることが原因でした。
下記みたいな組織構成です。

```
マスターAWSアカウント・・・2017年あたりに作成
  ├ メンバーAWSアカウント1・・・2020年初に作成
  ├ メンバーAWSアカウント2・・・2020年初に作成
  └ メンバーAWSアカウント3・・・2020年初に作成
```

[AWSのドキュメント](https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/free-tier-eligibility.html)によると下記の記載が…

> お客様の AWS アカウントが、貴社によって AWS Organizations で作成されている場合、すべてのメンバーアカウントの無料利用枠の開始日は、その組織のマスターアカウントが作成された日となります。詳細については、[AWS Organizations ユーザーガイド](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html)を参照してください。

とっくに枯れきったアカウントをマスターアカウントにしたのが原因でした……:sob:
Solidityのfunction visibility(external, public, internal, private)について

SolidityのfunctionにはJavaやPHPなどの言語と同様にvisibility(≒アクセス修飾子)を設定できますが、修飾子の種類としては、

- public
- private
- internal
- external

の4種類があります。
（なお公式ではVisibilityという記述になっており、日本語としてはアクセス修飾子というより単に可視性と訳すのが良さそうです。）

JavaにあるprotedtedはSolidityにはなく、internalとexternalに関してはSolidity独自言えるでしょう。

この記事ではそれらのvisibilityについてまとめてみます。

## external
externalな関数は外部の別のコントラクトから呼び出すことが可能です。
内部から呼び出す時には注意が必要で、 `function hoge()` という関数がある場合に、単に `hoge()` で呼び出すことはできず、 `this.hoge()` と書く必要があります。

## public 
publicな関数は外部からも内部からも制限なく呼び出すことができる関数です。
またpublicな状態変数に関しては自動的にgetter関数が定義されます。

## internal
internalな関数と状態変数は、thisを使うことなくコントラクトの内部からのみ呼び出すことができます。

## private 
privateな関数と状態変数は定義されたコントラクトの中だけで使うことができ、継承したコントラクトで利用することはできません。

それぞれのvisibilityをテーブルにまとめると、下記のようになります。

||外部からの呼び出し|内部からの呼び出し|継承可能|ゲッターの自動生成|
|:-:|:-:|:-:|:-:|:-:|
|external|true|false|true|false|
|public|true|true|true|true|
|internal|false|true|true|false|
|private|false|true|false|false|
ゼロから始めるLeetCode Day76「3. Longest Substring Without Repeating Characters」

# 概要

海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

どうやら多くのエンジニアはその対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイトであり、海外のテックカンパニーでのキャリアを積みたい方にとっては避けては通れない道である。

と、仰々しく書いてみましたが、私は今のところそういった面接を受ける予定はありません。

ただ、ITエンジニアとして人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

Python3で解いています。

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day75 「15. 3Sum」](https://qiita.com/KueharX/items/0eb53bc1a9a17005abb2)

今はTop 100 Liked QuestionsのMediumを優先的に解いています。
Easyは全て解いたので気になる方は目次の方へどうぞ。

[Twitter](https://twitter.com/kueharx)やってます。

**[技術ブログ](https://kueharx.blogspot.com/)始めました！！**
技術はLeetCode、Django、Nuxt、あたりについて書くと思います。**こちらの方が更新は早いので**、よければブクマよろしくお願いいたします！

# 問題
[3. Longest Substring Without Repeating Characters](https://leetcode.com/problems/longest-substring-without-repeating-characters/)
難易度はMedium。

問題としては、文字列が与えられたとき、文字を繰り返さずに最長の部分文字列の長さを求めなさいというものです。

>Example 1:
Input: "abcabcbb"
Output: 3 
Explanation: The answer is "abc", with the length of 3. 

>Example 2:
Input: "bbbbb"
Output: 1
Explanation: The answer is "b", with the length of 1.

>Example 3:
Input: "pwwkew"
Output: 3

>Explanation: The answer is "wke", with the length of 3. 
             Note that the answer must be a substring, "pwke" is a subsequence and not a substring.


# 解法

```python
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        dic,length,start = {},0,0
        for i,j in enumerate(s):
            if j in dic:
                sums = dic[j] + 1
                if sums > start:
                    start = sums
            num = i - start + 1
            if num > length:
                length = num
            dic[j] = i
        return length
# Runtime: 60 ms, faster than 76.33% of Python3 online submissions for Longest Substring Without Repeating Characters.
# Memory Usage: 13.9 MB, less than 55.58% of Python3 online submissions for Longest Substring Without Repeating Characters.
```

`length`で最大の長さを保持し、`start`で部分文字列の開始位置を保持しています。

そこまで書くことはないですね・・・

そういえば組み込み関数が便利っていうのはPython特有なのでしょうか？
言語によっては組み込み関数によって実装が楽だったりするとかありそうですが・・・・

他の言語で解いてみるのも面白いのでJavaで書いたりもたまにしていますがなかなか慣れないものですね。

では今回はここまで。
お疲れ様でした。
分数式から係数を取り出す方法

多項式の係数を取り出すときはcoeff()メソッドを使えば良いが、分数式になると単純に使うだけではダメで、expand()メソッドで展開する必要がある。

```python:how_to_get_coeff_from_fractional_expression.py
# coding:utf-8


import sympy as sp


# f(x)/g(y) のx**aの次数の取り方
# sympy の変数を作る
x, y = sp.symbols('x y')
# sympy.Symbol の関数（分数式）を作る
symbolFunc = (x**2 + 2*x + 3) / (4*y + 5)
# x**1 の係数として、 2/(4y + 5) を期待するが 0 になる
print(symbolFunc.coeff(x, 1))
# ==> 0
# expand() メソッドを噛ませるとうまくいく
print(symbolFunc.expand().coeff(x, 1))
# ==> 2/(4y + 5)
```
円マークとバックスラッシュの話

新しく買ったPCにJDKをインストールし、環境変数を設定しました。そしてjavacコマンドを実行、、、

![コマンド プロンプト 2020_07_04 10_41_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581663/95a612a2-662b-d318-87b2-5cd6a4ae54f9.png)

うーん、環境変数の設定を再確認してみても間違いは見当たらない。
そこで文字コードの問題かもしれないと思い、入力したパスの文字コードを確認してみると
![2020-07-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581663/5ff11cb1-2ca4-912a-050a-933ae4271cf4.png)

どうやら円マークが**U+005C**ではなく、**U+00A5**になっていたようです。
そもそも私たちがWindowsの日本語キーボードで入力している円マークは実は円マークではなく**バックスラッシュの仮の姿**です。(正確にはあれこれすると円マークも入力できますが)
なぜこんなことが起きるのかというと、もともとのASCIIでバックスラッシュの文字が割り振られていた5Cという文字コードに日本では円マークを割り振り、JIS X 0201として規格化してしまったからです。
その後、全世界の文字コードを統一しようということで、Unicodeの規格が生まれ、バックスラッシュと円マークをきちんと区別して定義しようとなりました。その際、**U+005C**にバックスラッシュが、**U+00A5**に円マークが割り当てられます。
しかし、WindowsがUnicode化するにあたって「U+005Cの文字コードはバックスラッシュだが、日本語の表示では円マークとする」としました。
そのため、日本語キーボードでバックスラッシュを入力すると、フォントによって画面上には円マークだったりバックスラッシュだったりが表示されたりします。(実際はバックスラッシュ)
つまり、私たちが普段日本語キーボードで入力するときは入力した文字が円マークで表示されていても、**本当はバックスラッシュ**(文字コードがU+005C)なのです。
しかし、どっかからコピペなどをしてきたときに本物の円マーク(文字コードがU+00A5)を持ってきてしまうことがあるのです。

さて、説明が長くなりましたが、今回の私の場合はパスをコピペして設定していたため、(なぜか)本物の円マークを使ってしまっていました。なので、きちんとキーボードから入力して環境変数を設定してあげると、
![選択コマンド プロンプト 2020_07_04 10_45_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581663/22b67596-c76a-fc34-6df5-b45b8e5f9e2a.png)

このように無事、javacコマンドが実行できました。
Target WSGI script '/var/www/xxx/xxx.wsgi' cannot be loaded as python module というエラーが発生した場合の対処方法

Pythonを使った簡単なアプリケーションを作成＆公開する場合、Webサーバは[Apache](https://httpd.apache.org/)、Webアプリケーションフレームワークは[flask](https://flask.palletsprojects.com/en/1.1.x/)という組み合わせはよくあると思います。
そして、Apacheとflaskを繋ぐWSGI(Web Server Gateway Interface)は[mod_wsgi](https://modwsgi.readthedocs.io/en/latest/)を使うことになります。

AWSでEC2のインスタンスを立て、Apacheをインストールし、flaskで書いたアプリを動かすぞ！mod_wsgiもインストールしたから問題なく動くはず！と思っていたのに、次のようなエラーが発生することがあります。

```
mod_wsgi (pid=8711): Target WSGI script '/var/www/xxx/xxx.wsgi' cannot be loaded as Python module.
mod_wsgi (pid=8711): Exception occurred processing WSGI script '/var/www/xxx/xxx.wsgi'.
```

あれ、mod_wsgiをインストールしたのに何で？となりますが、結論から言うと`yum install mod_wsgi`でインストールしたmod_wsgiはバージョンが古くPython2系にしか対応していないためです（Cent OS系のOSの場合）。

ですので、`yum install mod_wsgi`でmod_wsgiをインストールした場合は、`yum remove mod_wsgi`でアンインストールする必要があります。その上で、`pip install mod_wsgi`のようにpip経由でインストールすればPython3系に対応したmod_wsgiをインストールできます。

例えば、`venv`を使ってPython3.7の仮想環境を作成している場合、上記のpipコマンドを実行すると

```
$VENVHOME/lib/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so
```

という場所にmod_wsgiの共有ライブラリファイルを作成されます。そして、Apacheのconfファイルに次のように記述すると、Python3に対応したmod_wsgiが実行されます。

```
LoadModule wsgi_module $VENVHOME/lib/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so
```

めでたし、めでたし。それにしても、Pythonのバージョンに関しては色々な所に落とし穴がありますね…。
[Swift] カスタムstructを簡単にUserDefaultsに保存する <NSCodingは捨てよう>

## NSCoding意味わかんない

意味分かんない

### UserDefaultsに保存できるデータ型

UserDefaultsに保存できるデータ型は
数値型
文字列型
真偽型
データ型（Data、NSData）
とこれらを値とする
配列型
辞書型（キーは文字列型に限る）
のみとなっています。

### 非対応のデータ型を保存する方法　その１

保存できるデータ型（Data,NSDataを除く）に変換する。

例えば CGRect を数値の配列に変換して保存するなどです。

```swift
extension UserDefaults {
  func set(_ value: CGRect, forKey key: String) {
    let rectDataArray = [value.origin.x, value.origin.y, value.width, value.height]
    set(rectDataArray, forKey: key)
  }

  func cgRect(forKey key: String) -> CGRect? {
     guard let rectDataArray = array(forKey: key) as? [CGFloat] else { return nil }
     guard rectDataArray.count == 4 else { return nil }
     return CGRect(x: rectDataArray[0], y: rectDataArray[1], width: rectDataArray[2], height: rectDataArray[3])
  }
}
```

### 非対応のデータ型を保存する方法　その２

その１で数値や文字列にするのが難しいデータ型の場合はデータ（NSData/Data）に変換して保存します。
その助けをするのがNSCodingプロトコルとNSKeyedArchiver/NSKeyedUnarchiverです。

これをやりたくない趣旨のエントリですので詳細は省きます。


### 非対応のデータ型を保存する方法　その３

実はSwiftにはNSCodingを使わなくてもデータ型をデータ（NSData/Data）に簡単に変換してもらえる便利なものがあります。
Codable = Encodable & Decodable
です。

Codableへの準拠は変わったデータ型ではない限り、コンパイラが自動で行ってくれるのがすごくうれしい！

これを使わない手はありません。
ここではCoderとしてJSON(En/De)coderを使用しました。

```swift
extension UserDefaults {
  func setEncoded<T: Encodable>(_ value: T, forKey key: String) {
    guard let data = try? JSONEncoder().encode(value) else {
       print("Can not Encode to JSON.")
       return
    }

    set(data, forKey: key)
  }

  func decodedObject<T: Decodable>(_ type: T.Type, forKey key: String) -> T? {
    guard let data = data(forKey: key) else {
      return nil
    }

    return try? JSONDecoder().decode(type, from: data)
  }
}
```

CGRectを保存してみましょう。
CGRectはCodableに準拠してますので特に何か付け加える必要はありません。

```swift
let cgRect = CGRect(x: 0, y: 0, width: 100, height: 100)

UserDefaults.standard.setEncoded(cgRect, forKey: "KEY")

// storedCGRect's type is CGRect.
let storedCGRect = UserDefaults.standard.decodedObject(CGRect.self, forKey: "KEY")
```

***はい、簡単、型安全。***

### とくにまとめることはない

簡単さと標準準拠を肝としたのでUserDefaultsのKeyがStringで危険なままですが、そのあたりは別にいろいろあるのでググったりなんだりすればいいと思う。
サブモジュールを含むリポジトリのGit cloneは--recursiveオプションが必要

## TL;DR

サブモジュールを含むリポジトリは単純に`git clone`するだけではサブモジュールはcloneされません。
その時は `--recursive` オプションを追加することでまとめてcloneできます。

```bash
git clone --recursive https://github.com/hoge/fuga.git
```

---
## サブモジュールを含むリポジトリ QMK Firmwareを１発でCloneしたい

自作キーボード [Helix](https://yushakobo.jp/shop/helix-keyboard-kit/) のFWとしてQMK Firmwareを使っています。
[ビルドガイド](https://docs.qmk.fm/#/ja/newbs_getting_started?id=set-up-qmk)に**従わず**手癖でgit cloneをしました。
(ビルドガイドをさらっとしか読んでいなかったので見逃していました)

```
# ビルドガイドの手順
git clone --recursive https://github.com/qmk/qmk_firmware.git

# 手癖の手順
git clone https://github.com/qmk/qmk_firmware.git
```

で、ビルドをすると次のようにLUFA/makefileがないとエラーになります。

```log
tmk_core/protocol/lufa.mk:14: lib/lufa/LUFA/makefile: No such file or directory
/bin/sh: avr-gcc: command not found
make[1]: *** No rule to make target `lib/lufa/LUFA/makefile'. Stop.
make: *** [helix:led_test] Error 1
```

LUFAはサブモジュールなので`--recursive`オプションなしだとcloneはされない仕様です。だからビルド時にLUFAがないと怒られたというわけです。

 
その時は直接LUFAをcloneして該当のディレクトリに配置して無理やりビルドを通しましたが、改めて調べてみるとサブモジュールをまとめてcloneする`--recursive`オプションがあることを知りました。


どんなリポジトリでも初回cloneの時は`--recursive`必須というやり方をしたらダメなんでですかね。もしくは`--initialclone`みたいな初回専用のオプションとかあればわかりやすくていいのかな。
EC-CUBE4.0系のデザインカスタムについて

この記事は仕事でEC-CUBE4.0系をフルカスタムすることになったので、備忘録代わりに投稿します。
途中までしか書いていないので、気が向けば続きを書くかも？

# EC-CUBE4.0系のSmartyについて
EC-CUBE4.0系とはSymfonyというフレームワークを元に、Smarty（PHPのテンプレートエンジン）で構築されたオープンソースのECサイト構築のパッケージである。
EC-CUBEではページ、レイアウト、ブロックの考え方になっており、以下の役割を担っている。

**ページ**
>WPでいう固定ページに相当し、ホーム、概要、お問い合わせなど必要なページとなる受け皿を生成する。
また、ページ内で記述されたコードは、レイアウトのブロックを配置できないグレーの「main」エリアで実行される。

**レイアウト**
>WPでいうpage.php、または{slag}-page.phpに相当する。
WPと異なる点として、下記のブロックを配置する配置可能分布エリアが決まっており、それぞれのエリアに「相当するブロック」を配置する。
しかし、これはあくまでも配置箇所の目安であり、ブロックとCSSの記述次第でデザインの再現はどうとでもなる。
噛み砕けば、WPのheader.phpの中に、ナビゲーションやパンくずなどのパーツをインクルードする感覚に近い。
インクルードもとのheader.phpが配置可能分布エリアの１エリアであり、そこにインクルードされるナビなどのパーツがブロックに相当する。

**ブロック**
>レイアウトに配置する個別のパーツを指す。例えば<header></header>や<article id="slideshow"></article>、<div id="breadcrump"></div>など。

# 導入方法
1. MAMPまたはレンタルサーバーを用意する。
2. [EC-CUBEパッケージ](https://www.ec-cube.net/)をダウンロードする。
3. ドメイン直下、または指定のフォルダ内にEC-CUBEの中身を全てコピーする。
4. ブラウザでEC-CUBEのコピーされたディレクトリにアクセスし、サーバー情報などを入力する
5. 入力情報に誤りがなければインストールは完了。

※簡単インストール機能があればそれを使うが、基本的に手動インストールを想定していた方が良いかもしれない

#EC-CUBEを使わずに、まずは純粋にコーディング
デザインは既にあるという前提で、EC-CUBEではWPほど柔軟にコーディングするのが難しいため、前もって従来の手法（HTMLとCSS）で素のページを作っておく。
その後、必要に応じてブロック単位でパーツを分解していく。
※これについては独断と偏見なので、自分なりのやり方を見つけるか、チームのルールに従ってください。もしかしたら半年後にはWPと同じ様にコーディングしてるかもしれません。

# 管理画面からカスタムの準備を行う
###1.パーツであるブロックを作成する
「コンテンツ管理＞ブロック管理」でパーツごとに分割したコードをコピーし、ブロックのラベル名とTwigのファイル名を決める。
このとき、``/app/template/default/Block``に新しくtwigファイルが生成されるので、このtwigファイルをエディタで開いて直接ペーストするなり編集できる。

###2.レイアウトを作成する
「コンテンツ管理＞レイアウト管理」でページごとの共通レイアウト（テンプレート）を作成する。
レイアウト管理内では作成したレイアウトに、共通となるヘッダーやパンくず、フッターなどのブロックを配置する。
ここで用意されたレイアウトは、次の[3.ページを作成する](###3.ページを作成する)で使うことができる。

###3.ページを作成する
「コンテンツ管理＞ページ管理」で各ページを作成し、ページごとに必要なブロックの配置と、共通するレイアウトを設定する。
共通するレイアウトはレイアウト管理で作られたレイアウトから選べる。

###4.URLから /user_data を消す
ページを作成した際にURLの入力欄に``user_data``があったが、ページへアクセスするには``example.com/user_data/ページURL``と入力しないとアクセスできない。
user_dataが気にならないのであれば問題ないが、自分は``example.com/ページURL``としたかったので、方法は別記事で用意します。
Elixirのインストール on Windows 10

Elixirをメモを取りながらインストールしたので、Qiitaにメモします。

#インストーラ
https://elixir-lang.org/install.html#windows
からインストーラを取得して起動する。

#Erlangのインストール
インストーラが自動的に処理系のErlangも入れてくれるので
インストーラの動作に従う。

##Erlangインストールの確認
Erlangが実行できるか確認します。PATHの設定はインストーラがやってくれました。
スタートメニューにErlangのプロンプトを開く項目が入っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18822/a2b483e6-ce86-3725-523c-9ddb9e7e97ac.png)
もしくはコマンドプロンプトでerlとタイプするとEshellが動きます。（止めたいときにはCtrl-Gを押して、Eshell自体はCtrl-Cで止まります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18822/c28becca-aae9-cf43-b565-4e259566f94c.png)

#Elixirのインストールの確認
コマンドプロンプトに`elixir --version`と打つと、バージョン確認ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18822/65f32d19-2177-166b-00a6-3d2cbed965f1.png)

#動作確認
文字化けしたのでコマンドプロンプトで`chcp 65001`として文字コードを変更しています。
![elixir確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18822/2963cac4-cc54-a7f1-9728-4c9cc89e7df4.png)

以上です。
新人3ヶ月エンジニアが学んだPHP関数

#新人3ヶ月エンジニアが学んだPHP関数
スクールでRailsを学び、晴れWebエンジニアになった私ですが
使用するフレームワークはLarabel 言語はPHPでした。
プロゲートでPHPを一周やって、あとはLaravelを触り続ける毎日で実務に突入したのですが
PHP関数は「ナンモワカラン」状態で、コードを読むのが大変だったので備忘録的に実務で使用していたPHP関数をまとめて置きたいと思います。



##array_column() 

```
array_column(配列, ‘カラム名’, ‘カラム名’)
```
配列から単一のカラムの値を返す
##array_values ()
```
array_values (　配列　) 
```
配列から全ての値を取り出し、数値添字をつけた配列を返します。

##array_unique()
```
array_unique ( array $array [, int $sort_flags = SORT_STRING ] ) : array
```
配列から重複した値を削除する


##array_merge()
```
 array_merge([配列],$配列)
```
ひとつまたは複数の配列を結合する

##array_search
```
array_search(検索ワード、検索配列)
```
指定した値を配列で検索し、見つかった場合に対応する最初のキーを返す


##strpos()
```
strpos(検索文字列、検索ワード、検索開始位置) 
```
文字列内の部分文字列が最初に現れる場所を見つける




##curl_init()
```
 $curl = curl_init();
```
新しい cURL リソースを作成します

##curl_setopt_array()
```
 curl_setopt_array($curl, $options);
```
CURL 転送用の複数のオプションを設定する
##curl_exec($curl)
```
 $result = curl_exec($curl);
```
指定した cURL セッションを実行します。

##curl_close($curl)
```
curl_close($curl);
```
cURL セッションを閉じる


##implode()
```
implode ( 文字列 , 配列 )
```
配列要素を文字列により連結する


##mb_substr()
```
mb_substr（部分文字列を取り出したい文字列,数値, 最大文字数、エンコーディング）
```
文字列の一部を得る

##explode
```
explode(‘区切る文字, 区切られる配列);
```
explode — 文字列を文字列により分割する


##implode()
```
implode ( ‘ ’ , 連結したい配列 )
```
implode — 配列要素を文字列により連結する

##str_replace()
```
str_replace(検索したい文字列 ,  置き換える文字列文字 ,  置換したい文字列 ) 
```
str_replace — 検索文字列に一致したすべての文字列を置換する

##strip_tags
```
strip_tags(HTML要素などを含んだ文字列);
```
strip_tags — 文字列から HTML および PHP タグを取り除く
この関数は、指定した文字列 (str) から全ての NULL バイトと HTML および PHP タグを取り除きます。 

##preg_split()
```
preg_split("//u", $string, -1, PREG_SPLIT_NO_EMPTY); 
```
preg_split — 正規表現で文字列を分割する



###あとがき
PHP関数は多すぎて覚えれませんよね。
サービスで使用されているPHP関数のみまとめてくれていたら事前に予習でき楽だなと思い、記事作成に至りました。
これだけでは無いのでゆっくり追記していこうと思ってます！！


ほぼ、下記参考を参考にしています。
https://www.php.net/manual/ja/function.str-replace.php
LinuxルーターでTTL確認

# Linuxをルーターに仕立て、IPパケットのTTLが機能していることを確認
IPパケットのTTL（Time to Live）は無限転送を防ぐためのもの。サブネット（ルーター）を通過するとデクリメント（値が１減）される。ここでは、Linuxにルーター設定を行い、TTLの動作を確認する。

## ネットワーク構成
![構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/1844db85-471e-7c6f-56d3-1cfbcb18e88e.png)

例によってVirtualBoxを使ってこのような構成を作る。VirtualBoxの設定例は、[こちら](https://qiita.com/infinite1oop/items/163d851f951f43db41fe)を参照。

## Linuxルーターの設定
上記構成だとStatic Routeの設定は不要。単にForwarding(net.ipv4.ip_forward)を有効化するのみ。

```
~# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
~# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
```

## 実験
### その１
端末２（192.168.102.2）から端末１（192.168.101.2）へpingする。このときTTLを10（-tオプション）に設定。

```
~# ping -t 10 192.168.101.2
PING 192.168.101.2 (192.168.101.2) 56(84) bytes of data.
64 bytes from 192.168.101.2: icmp_seq=1 ttl=63 time=0.691 ms
```
通常ttlのデフォルトは64になっている様子。リプライパケットの”ttl=63”でも、TTLのデクリメントが確認できるが、ここでは、送信時の”TTL=10”の様子をパケットキャプチャデータで確認する。送信側（端末２）のキャプチャデータはこちら。
![TTL=10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/1cb53f53-2c5b-fb87-6c1a-5102ec83dd48.png)
受信側（端末１）のキャプチャデータはこちら。
![TTL=９.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/6486bfac-5081-2b3e-86ae-6cb48e2fd71b.png)
期待どおり、”TTL=9”とデクリメントされている。

### その２
”TTL=1”に設定する。

```
~# ping -t 1 192.168.101.2
PING 192.168.101.2 (192.168.101.2) 56(84) bytes of data.
From 192.168.102.1 icmp_seq=1 Time to live exceeded
```

ルーターでTTLがデクリメントされて、’0’となりパケット到達不能となった。

## 終わりに
Linuxでもルーターになることを確認した。当たりまえか。
Power AutomateにてCDSソリューションの環境変数を取得する

## CDSソリューションの環境変数とは
CDSの環境にて、共有できる変数を設定する機能。
ソリューションに追加することができるので、ソリューションでのデプロイができる。
デプロイした先にて、環境変数を上書きして使用する。
また、ツールでのデプロイにも使える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287381/6e8c045a-7708-c73d-26a4-d9eb176efc0a.png)

**ただし、2020年7月4日時点では、プレビュー機能です。**
https://docs.microsoft.com/ja-jp/powerapps/maker/common-data-service/environmentvariables

## 目的 
- Power Automateで環境変数で変数を使い回す
- Power Automateで環境変数を取得する

## ちょっと困ったこと
環境変数の正しい値を取るのが現時点ではめんどい。(GAになったらそれ用のアクションとかつくってくれそうだけど)

環境変数は登録すると、CDSのEnvironment Variable DefinitionとEnvironment Variable Valueというエンティティにデータが格納される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287381/350e72dc-7b01-60f9-ba30-2d073b1ab120.png)

Default Value あり
Current Value なし
↓
Environment Variable Definition あり
Environment Variable Value なし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287381/fa94245b-034d-6719-8785-c7dce4a148f4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287381/9010a1fe-aaf5-1952-e57e-9582cd82c1c0.png)

Default Value あり
Current Value あり
↓
Environment Variable Definition あり
Environment Variable Value あり
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287381/15db323e-a86f-5a94-3639-ae925b4f67d9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287381/b5abc865-b174-dbb7-3016-63fa739ce1ed.png)

環境変数を正しく取得するには、まずEnvironment Variable Valueの値を検索して、
存在しなければ、Environment Variable Definitionを検索する必要がある。

ちなみに、DefinitionとValueは1:Nのリレーションシップなので、複数のValueが持てそうだが、
設定しようとすると、Pluginでエラーになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287381/21db0808-fe64-8992-4f78-232d79711790.png)

## やったこと
環境変数を取得するロジックを子フローにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287381/97e9381f-657a-e95e-124d-b5c88b93ea84.png)

GitHubにソリューションファイルを上げました。
https://github.com/simpliciter11/Power-Platform/tree/master/Power-Automate/GetAnEnvironmentVariable_1_0_0_1

## 注意事項
- サンプルのフローの戻り値のデータ型はTextになります。
  - 環境変数のデータ型は、Decimal Number、JSON, Text, Two optionsすべてで動作確認しました
  - ただし、繰り返しになりますが、戻り値はTextです。呼び出し側のフローで変換してください。
- サンプルのフローは、軽く試してみたけど、ソリューションをインポートしただけだと動かないです
    - 以下の設定が必要です(追加でなにか必要かもしれないですが)
       - CDSにアクセスしているところの接続の認証を通す
       - 親と子のフローをオンにする
       - 子のフローにて、「実行専用アクセス許可を管理」の設定を変更する
    - ナレッジがたまったら、ソリューションでのデプロイについてまとめたい気がする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287381/ababc908-e77b-8bc6-8d3e-545b12c8ba65.png)
なんで自鯖のフォントファイルをサイトビルダーで使えないんじゃ＾～

# 経緯

某Webサイトビルダーでサイトタイトルにフォントを使いたい
　　↓
カスタムコード機能でCSSを記述する

```css
@font-face {
   font-family: "custom-font";
   src: url("https://my-rental-server.sample/font/tsukaitai.ttf");
}
h1#kakkoii-title {
   font-family: custom-font, sans-selif;
}
```
　　↓
chrome先生「```Access to font at 'https://my-rental-server.sample/font/tsukaitai.ttf' from origin 'https://suitbuilder.sample' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.```」
　　↓
僕「ぴえん」

# HeaderでCORSの許可(よくわかってない)

ファイルのヘッダーでCORSの許可(?)を与えるといいらしい。
.htaccessがよくわかってない脆弱エンジニアな僕「ヘッダーを記述するならPHPだな？（名案」

# 解決

フォントファイルのあるフォルダにこんなPHPを用意した。

```php:readfont.php
<?php 
header('Access-Control-Allow-Origin: *');
echo file_get_contents($_GET['a']);
?>
```

そしてサイトビルダーのカスタムコードの`@font-face`はこんな感じ

```css
@font-face {
   font-family: "custom-font";
   src: url("https://my-rental-server.sample/font/readfont?a=tsukaitai.ttf") format("truetype");
}
/* 以下略 */
```

# 結果
絶対に正解じゃないけど、解決したのでヨシ！
if分　数の条件分岐

#概要
勉強用に自分でif文問題を作成して解いてみました。

#前提条件
- ruby 2.6.5

#問題
- 5以下なら'5以下の数字です'を出力
- ５より大きい数値なら'５より大きい数字です'を出力
- 5以下でかつ0以下なら'0以下の数字です'を出力
上記３点を満たすコードの作成

#回答
```
input = gets.to_i


if input <= 0
  puts "0以下の数字です"
elsif input <= 10
  puts "10以下の数字です"
else
  puts "10より大きい数字です"
end
```

#NG回答例
ifの条件がelsifの条件も含んでいるため、elsifの条件が検証されずスルーされてしまう。。。

```
if input <= 10
   puts "10以下の数字です"
elsif input <= 0
  puts "0以下の数字です"
else
  puts "10より大きい数字です"
end
```
以上です！
FrendlyElec社のZeroPiにAipo8(グループウエア）をインストールする方法

####  はじめに####
Aipo公式サイトではインストーラ版の配布が終了していますが、ネットで探すとインストーラ版が見つかります。同時アクセスが少ない環境であればAipo8をFrendlyElec社の ZeroPi (ラズパイZeroではありません）で動作させることができますので、インストール方法を紹介します。 

#### 前提ソフトのインストール####

```
#apt update   
#apt upgrade
#apt-get install nmap lsof unzip libreadline-dev zlib1g-dev
#apt-get install openjdk-8-jre
```

#### Aipo8インストーラのダウンロード ####
aipo-8.1.1-linux-x86.tar.gzのファイル名で検索をかけてダウンロードしてください。
NanopiのCPUはIntelやAMDじゃないって。心配無用です。

#### Aipoの展開 ####
aipo-8.1.1-linux-x86.tar.gzの場所はどこでもいいのですが、rootユーザのホームディレクトリーにあるという想定で進めます。

```
cd 
tar -zxvf aipo-8.1.1-linux-x86.tar.gz
```

#### validate.shの修正 ####
```
cd 
cd aipo-8.1.1-linux-x86/bin
vi validate.sh
```
validate.shをエディタで開き、68行目あたりのlsofの行のsbinの部分をbinに書き換えて保存。
変更前）/usr/sbin/lsof 
変更後）/usr/bin/lsof 

```
cd 
cd aipo-8.1.1-linux-x86
vi installer.sh
```
installer.sh をエディタで開き、/shの部分をすべて/bashに書き換えて保存。（5ヶ所くらい）

#### Aipoのインストール ####
```
cd ~/aipo-8.1.1-linux-x86
chmod 755 installer.sh
bash ./installer.sh
```
インストールが終了するまで30分くらい待ちます。

#### catalina.sh の修正 ####
```
cd /usr/local/aipo/tomcat/bin
vi catalina.sh
```
catalina.shをエディタで開き、次のように書き換えて保存
215行目あたりの次の行を削除）
JAVA_ENDORSED_DIRS='cygpath --path --windows "$JAVA_ENDORSED_DIRS"'
シェルの中の次の文字列をすべて削除(10ヶ所くらい））
-Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS"

#### jre.confの編集 ####
```
cd /usr/local/aipo/conf
vi jre.con
```
Intel用のJREは動作しませんので、Armbin用のJREにするために、jre.confを次のように修正します。
(修正前）JAVA_HOME=/usr/local/aipo/jre
(修正後）JAVA_HOME=JAVA_HOME=/usr/lib/jvm/java-8-openjdk-armhf/jre

#### Aipoの起動 ####

```
#cd /usr/local/aipo/bin
#./startup.sh
```
#### Aipoへのログイン ####
ブラウザを起動して
http://(Zero PiのIDアドレス）
ユーザID:admin
パスワード:admin

以上
【Rails】jquery を使わずに javascript で flashメッセージをフェードアウトさせる

# はじめに
Railsアプリを開発していてflashメッセージをフェードアウトさせたく、javascriptを用いて実装したので書く。

こういったやつ↓↓（Bootstrapのalertを適用させています）
<img width="1152" alt="スクリーンショット 2020-07-04 8.59.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621162/97293f34-6bae-2732-1eb2-b647fd2d8d6a.png">

これをフェードアウトさせる

# 環境
Ruby: 2.5.1
Rails: 5.2.4.2

# 実装

実装イメージとしては徐々に透明度を高くしていき、最終的に非表示にします。

要素のstyle属性
①opacityの値を減少させていく
②opacityが0になったらdisplay: none; にする

## viewファイル
erbはこのようになっている

```_flash_messages.html.erb
<% flash.each do |message_type, message| %>
  <div class="alert alert-<%= message_type %>"><%= message %></div>
<% end %>
```

## jsファイル

```flash_message.js
// turbolinks:loadでページ読み込み時に実行
document.addEventListener('turbolinks:load', () => {

  // flashメッセージ要素を取得
  const flashMessage = document.querySelector('.alert');

  // フェードアウトさせる（徐々に透過し,非表示にする）関数を定義
  const fadeOutFlashMessage = () => {
    // setIntervalを特定するために返り値を変数timer_idに格納
    const timer_id = setInterval(() => {
      // flashメッセージのstyle属性 opacityを取得
      const opacity = flashMessage.style.opacity;

      if (opacity > 0) {
      // opacityの値が0より大きければ0.02ずつ値を減少させる
        flashMessage.style.opacity = opacity - 0.02;
      } else {
        // opacityの値が0になったら非表示に
        flashMessage.style.display = 'none';
        // setIntervalをストップさせる
        clearInterval(timer_id);
      };
    }, 50); // 今回は0.05秒ごとにsetIntervalを実行
  }

  // flashメッセージがある場合のみ実行
  if (flashMessage !== null) {
    // style属性opacityをセット
    flashMessage.style.opacity = 1;
    // 今回は表示から3秒後に上記で定義したフェードアウトさせる関数を実行
    setTimeout(fadeOutFlashMessage, 3000);
  };
});
```

# 参考文献
下記記事を参考にさせていただきました。
ありがとうございました。


・[turbolinksチートシート](https://qiita.com/morrr/items/54f4be21032a45fd4fe9)
・[【JavaScript】Railsのflashをフェードアウトして消す方法](https://knowledge-blog.net/articles/29)

# 最後に
読んでいただきありがとうございます。
間違いや、より効率的な記述方法等あればご指摘いただけると非常に嬉しいです。
jQueryでさくっとモーダルウィンドウを作る

さくっとモーダルウィンドウを作ります。プラグイン不要です。

#HTML

まずは骨組みのHTML。作るのは

* モーダルウィンドウを開くためのリンク
* モーダルウィンドウそのもの
* 背景

の3つです。

```html:HTML
<!-- modal open -->
<a class="js-modal-open" href="" data-target="modal01">モーダルウィンドウを開く</a>
<!-- ./modal open -->

<!-- modal -->
<div id="modal01" class="c-modal js-modal">
    <div class="c-modal_bg js-modal-close"></div>
    <div class="c-modal_content _lg">
        <div class="c-modal_content_inner">
            ここにモーダルウィンドウの内容が入ります
            <a class="js-modal-close c-modal_close" href=""><span>閉じる</span></a>
        </div>
    </div>
</div>
<!-- ./modal -->
```

ポイントはIDと`data-target`属性の値を同じものにすること。
1ページで複数のモーダルウィンドウを開きたいときは、IDとdata-targetの値を`modal02`のように別にして用意する。

#Sass

CSSを使ってスタイリングします。sassで書いています。

```sass:Sass
// モーダルウィンドウ全体のレイアウト（画面いっぱいに表示）
.c-modal {
	display: none;
	height: 100vh;
	position: fixed;
	top: 0;
	width: 100%;
	top: 0;
	left: 0;
	z-index: 1;
}

// 黒背景の設定
.c-modal_bg {
	background: rgba(0, 0, 0, 0.6);
	height: 100vh;
	width: 100%;
}

// ウィンドウの設定
.c-modal_content {
	background: #fff;
	left: 50%;
	position: absolute;
	top: 50%;
	transform: translate(-50%, -50%);
	border-radius: 5px;

	&._sm {
		width: 30%;
	}

	&._md {
		width: 50%;
	}

	&._lg {
		width: 70%;
	}
}

.c-modal_content_inner {
	position: relative;
	padding: 24px;
}

// 閉じるボタン
.c-modal_close {
	position: absolute;
	top: 13px;
	right: 10px;
}
```

`&._sm`とか`&._md`とか`&._lg`というのはウィンドウのサイズ設定で使っています。
サイズ変更が不要であれば`.c-modal_content`内にwidthを設定してもいいと思います。

#jQuery

最後に動きをつけます。

```javascript:jQuery
// ウィンドウを開く
$( '.js-modal-open' ).each( function() {
     $( this ).on( 'click', function() {
          var target = $( this ).data( 'target' );
          var modal = document.getElementById( target );
          $( modal ).fadeIn( 300 );
          return false;
     });
});

// ウィンドウを閉じる
$( '.js-modal-close' ).on( 'click', function() {
    $( '.js-modal' ).fadeOut( 300 );
    return false;
});
```
`.c-modal_bg`コンテンツにも`.js-modal-close`を付与することで、背景をクリックしてもウィンドウが閉じる（フェードアウトする）ようになります。


#完成形

こちらが完成形です。

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

以上です。
Splunk timechartの引数を作る

[Timechart using Subsearch to set Span](https://community.splunk.com/t5/Splunk-Search/Timechart-using-Subsearch-to-set-Span/m-p/507263)
で答えたことのまとめ

:sweat:小ネタすぎる

#結果
```sql:subsearch_text.spl
| tstats count where index=_internal earliest=1 by _time [| makeresults | eval query="span=2h" | return $query]
```

[🐨コアラでもわかるSplunkシリーズ　サブサーチとは何かを調べる](https://qiita.com/toshikawa/items/82d52c8232797452b7e8)でいろいろ調べたとおり、サブサーチの結果はテキストでメインサーチに戻せる。

今回は`return`を使用して文字列をそのまま渡してあげている。

[Splunk Answers](https://community.splunk.com/t5/Splunk-Search/Timechart-using-Subsearch-to-set-Span/m-p/507263)質問の答えは

```sql:timechat_span.spl
| tstats sum(PREFIX("kb=")) as total_kv where index=_internal source="*metrics.log" by _time 
    [| makeresults 
    | addinfo 
    | eval span=case(info_max_time - info_min_time <=3600,"1m"
    ,info_max_time - info_min_time<=14400,"15m"
    ,info_max_time - info_min_time<=86400,"30m"
    ,info_max_time - info_min_time<=2592000,"1d"
    ,info_max_time - info_min_time>2592000,"1mon") 
    | eval query="span=".span 
    | return $query]
```
検索期間を変えると、それにより`span=`の値が変化してくれる。

なんか、いろいろと使えそうな気がする。
Calmar Ratio(カルマーレシオ)とは

#1 目的
Calmar Ratio(カルマーレシオ)の意味と計算方法を説明します。

#2 内容

### 2-1 Returnの計算方法
ある銘柄の開始日から当日までのReturnは[こちらの定義に従います](https://qiita.com/NT1123/items/096dc41c24751934747e#2-1-return%E3%81%AE%E5%AE%9A%E7%BE%A9)。


### 2-2 Maxdrowdownの計算方法
<b>Returnが最大になった以降で、どの程度の割合でReturnが下落し底を打つのかを評価する式のことです。</b>

具体的に開始日からn営業日の期間において、Returnの最大値を$R_{max}^{(n)}$とする。

```math
R_{max}^{(n)}=max\left\{R_{i} | 0<i≦n \right\}
```

ここで、Maxdrowdown $MDD_{max}^{(n)}$は下記式で定義する。

```math
MDD_{max}^{(n)}=max\left\{\frac{R_{max}^{(n)}}{R_{i}} | 0<i≦n \right\}
```



<img width="927" alt="90.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/41f7b859-41bb-befc-19dc-e212a1e78077.jpeg">


### 2-3 Calmar Ratioの計算方法

Calmar Ratio(カルマーレシオ)の定義式


```math
Calmar Ratio=\frac{CAGR(n)}{MDD_{max}^{(n)}}
```
[CAGRの定義式はこちらに記載しています。](https://qiita.com/NT1123/items/096dc41c24751934747e)
<b>数値は大きいほど好ましいです。</b>

<b>補足 : Shapen Ratioに比べて、Calmar Ratioは最悪の下落率を考慮した指標になっている。</b>


### 2-4 Calmar Ratioの計算式コード例

```python:test.py
def CAGR(DF):
    df = DF.copy()
    df["daily_ret"] = DF["Close"].pct_change() #株価終値の前日との変化率を計算する。
    df["cum_return"] = (1 + df["daily_ret"]).cumprod() #cumprod(全要素の累積積を スカラーyに返します.
    n = len(df)/252 #1年の取引日を252日に設定している。
    print( "df[cum_return]" )    
    print( df["cum_return"] )
    print( "df[cum_return][-1] ")           
    print( df["cum_return"][-1] )    
    CAGR = (df["cum_return"][-1])**(1/n) - 1
    return CAGR

def max_dd(DF):
    "function to calculate max drawdown"
    df = DF.copy()
    df["daily_ret"] = DF["Close"].pct_change()
    df["cum_return"] = (1 + df["daily_ret"]).cumprod()  #cumprod()全要素の掛け算を行う。
    print(df["cum_return"])

    #ax.legend() #凡例を描写する
    df["cum_roll_max"] = df["cum_return"].cummax()
    df["drawdown"] = df["cum_roll_max"] - df["cum_return"]
    df["drawdown_pct"] = df["drawdown"]/df["cum_roll_max"]
    max_dd = df["drawdown_pct"].max()
    ax=df["cum_return"].plot(marker="*",figsize=(10, 5))    
    ax=df["cum_roll_max"].plot(marker="*",figsize=(10, 5))    
    ax=df["drawdown"].plot(marker="*",figsize=(10, 5))   
    ax=df["drawdown_pct"].plot(marker="*",figsize=(10, 5))       
    ax.legend() #凡例を描写する
    return max_dd
    
def calmar(DF):
    "function to calculate calmar ratio"
    df = DF.copy()
    clmr = CAGR(df)/max_dd(df)
    return clmr
```
.gitignoreを後から設定し、git管理から除外する方法

git管理したくないファイルをコミットしてしまった時に、後から.gitignoreファイルを作成し、リポジトリから削除する方法を説明します。
## 1..gitignoreファイルを作成する
.gitignore を作成したいプロジェクトのディレクトリに移動し、下記コマンドを実行します。
すると、 .gitignore ファイルが作成できます

```
$ touch .gitignore
```

.gitignore が作成できているか確認するために、プロジェクトのディレクトリに行ってみると、.gitignoreファイルは隠しファイルなので、発見することはできません。そこで、「⌘ + shift + .（ドット）」を押すと、こんな感じで隠しファイルを表示することができます。
<img width="585" alt="スクリーンショット 2020-07-04 9.00.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590610/06203e5d-e28b-e083-e1ca-b9b035cb08d9.png">

## 2. git管理から除外したいフォルダ・ファイルを記入する
.gitignoreファイルを開き、git管理から除外したいフォルダやファイルを記入します。
今回はPodsフォルダ毎除外したいので、下記のように記入します。
.gitignoreの書き方については下記記事が詳しいです。

【参考】
[.gitignore の書き方](https://qiita.com/inabe49/items/16ee3d9d1ce68daa9fff)
[[Git] .gitignoreの仕様詳解](https://qiita.com/anqooqie/items/110957797b3d5280c44f)

```:.gitignore
Pods/*
```

ここでひとまず.gitignoreファイルをコミットしましょう。

```
$ git add .
$ git commit -m ".gitignore作成"
```

##3. 削除したいフォルダ・ファイルをリポジトリから削除する
.gitignoreを設定しても、既にリポジトリに登録されているものはリポジトリに残ったままです。
そこで、下記コマンドを実行し、管理対象から除外します。

```
$ git rm --cached -r 削除したいディレクトリ
```

※ファイルを削除したい場合は下記コマンド

```
$ git rm --cached ファイル名
```

これで指定したファイル・フォルダをgit管理対象から除外することができるので、あとはコミットまでして完了です。

```
$ git add .
$ git commit -m "Podsフォルダをgit管理対象から除外"
```
Postgresql コマンドCOMMENT

#Postgres COMMENTとは
テーブルや、カラムに説明文をつけることができる。
最近になって、はじめて使用しました。
用途は、エンドユーザーがツールでテーブルにＳＱＬを流してデータを抽出するというものです。
COMMENTを設定しておくと、ツールの画面で論理名と物理名が表示されるのでわかりやすいのです。

| 物理名| 　　論理名　　| 
|:------|----------:|
| m_user| 顧客テーブル|：

#参考
https://www.postgresql.jp/document/9.2/html/sql-comment.html

以上です。
Z80のモニタープログラム

当初はFlashにflashromで何度も焼いて試そうと思ったのですが、PLCCパッケージは接触が悪いのか結構な頻度でエラーになるので、モニタープログラムを使うことにしました。

LCDを試してタイミングの調整がトライ＆エラーになるので、何回も焼いて試すのは現実的ではないと思いました。

私のボードはZ80 4MHzでROM(Flash) 32K,RAM 32Kで8251,8255を実装して割り込み未使用と同じようなターゲットを利用したオープンソースのモニタープログラムを探してみました。

日本語や英語で検索して、それほどたくさんはありませんでしたが、全体的に昔のような7セグを使ったものよりシリアルのものの方が多いようです。

海外だとシリアルに8250系を使ってるケースもあります。また複雑に作り込んであるものはちょっと遠慮しました。

いろいろ検索してみたところトルコのM.PEKERさんが作られた[EfexMon](https://www.instructables.com/id/Z80-Monitor-Type-Operating-System-and-SBC/)というプログラムが見つかり、圧縮ファイルの中にアセンブラのコードがありました。ソースコードはGPLではなく、商用での利用は許可が必要と書かれています。

ターゲットのボードはIOのアドレスやボーレートがちょっと違っていますが、ほとんど同じ構成です。

M.PEKERさんの回路の8251のボーレートは19200です。CPUクロックの4MHzから74LS163を使って307.2KHz(x16)に近いクロックを作っているようです。私の回路は30年前に手にいれたエプソンの8640CNを使い9600にしてあります。正確にCPUのクロックから分周する方法は、半端な数字のクロックが必要で分周の回路も必要になるので、面倒なので8640CNを使うことにしたような気がします。

EfexMonはアセンブラや逆アセンブラが入っていて8Kとモニタープログラムにしては大きいですが、ROM領域は32Kあるので問題ありません。

8251のアドレスだけ変えてzmacでアセンブルしてzoutディレクトリにできるcimファイルをflashromで焼いて試してみました。

FTDIのモジュールのTx,Rx,GNDを8251のRx,Tx,GNDに接続して、[シリアル通信プログラム](https://qiita.com/yamori813/items/29e6bcd2f090983abb9a)を起動して電源を入れたところ動きました。

```
EfexMon By M.PEKER v1.0b
Press H for help

Ready.

C:\>
A-Assembler
D-Disassembler
L-Load
S-Save
E-Edit
W-Warmst
M-Move
X-Hexdump
G-Go
F-Fill
U-Routines

loaded adress:$8000

C:\>

C:\>G-$8000
```

コマンドは大文字のみで、コマンド実行からプロンプトに戻るのは[ESC]になります。

Lコマンドを実行して、 Macなどでasm8080やzmacでアセンブルして作成したIntel HEX(hex)ファイルをコピペしてGすれば実行できます。Macの場合pbcopyコマンドでhexファイルをクリップボードにコピーできます。

cuを使っている場合は"~ + cat filename"でできます。

screenコマンドで接続しているのであれば、hexファイルを/tmp/screen-exchangeにコピーしておいて"^a <"でペーストバッファに読み込んで、"^a ]"でペーストして読み込ませることができます。

jermの場合は"~ > filename"でできます。

EfexMonはhexのチェックサムを確認していないようです。

RAMは以下のようなマップになるようです。

RAM START: 8000H
RAM END : FFFFH

STACK: F800H

SYSTEM VARIABLES:
	F900H-F910H
	FF00H-FFFFH


割り込みを使いたい場合はINTADRS(INT:0F908H,NMI:090AH)にハンドラのアドレスをセットすると良いようです。
【初心者】Pythonの配列

###Pythonで配列を使ってみる

split()に何も指定しないと、空白で区切ってリストを作ってくれる。

```

>>> s1 = "The quick brown fox jumps over the lazy dog."
>>> s_list = s1.split()
>>> print(s_list)
['The', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog.']
>>> print(s_list[1])
quick
>>> len(s_list)
9
>>> while i < len(s_list):
	print(s_list[i])
	i += 1

	
The
quick
brown
fox
jumps
over
the
lazy
dog

>>> for w in s_list:
	print(w)


The
quick
brown
fox
jumps
over
the
lazy
dog.
```
競技プログラミング練習記 No.33【ABC127練習】

初回 -> [はじめに](https://qiita.com/easychoco/items/a9ae28aca97cfe47091f)

[ABC127](https://atcoder.jp/contests/abc127)を解きました。
4完です！

|問題|時間|アルゴリズム|実行時間
|:-:|:-:|:-:|:-:|
| A |  1min |-| 8ms|
| B |  3min |漸化式| 9ms|
| C |  7min |imos法|24ms|
| D | 48min |ヒストグラム| 89ms|



## A - Ferris Wheel
```c++
	int a, b;
  cin >> a >> b;
  if (a <= 5) cout << 0;
  else if (a <= 12) cout << b / 2;
  else cout << b;
```
`if`文が3つありますね。
条件を書く順番に気を付けて書きましょう。

## B - 	Algae
``` c++
  int r, d, x;
  cin >> r >> d >> x;
  for(int i = 0; i < 10; ++i)
  {
    cout << (x = r * x - d) << endl;
  }
```
漸化式が与えられるので、その数列の要素を順に列挙する問題です。
今回は大丈夫ですがオーバーフローに注意しましょう。

## C - 	Prison
``` c++
  int n, m, l, r;
  cin >> n >> m;
  int imos[100005];
  fill(imos, imos + 100005, 0);
  for(int i = 0; i < m; ++i)
  {
    cin >> l >> r;
    imos[l]++;
    imos[r + 1]--;    
  }

  int ans = 0;
  for(int i = 0; i < 100004; ++i)
  {
    imos[i + 1] += imos[i];
    if(imos[i + 1] == m) ans++;
  }
  cout << ans;
```
[いもす法](https://www.google.com/search?q=%E3%81%84%E3%82%82%E3%81%99%E6%B3%95)を使って解きました。
ただこの問題はそこまでする必要はなくて、`[Lの最大値, Rの最小値]` の範囲の長さが答えになります。
解説を見てわかりました。
ABC169-Eで似たものが出てましたね。気付きたかった。


## D - Integer Cards


``` c++
  ll n, m, b, c;
  cin >> n >> m;
  map<ll, ll> a;
  ll input;
  for(int i = 0; i < n; ++i)
  {
    cin >> input;
    a[input]++;
  }
  
  for(int i = 0; i < m; ++i)
  {
    cin >> b >> c;
    int loop_cnt = 0;
    for(auto& val : a)
    {
      if (val.first >= c) break;

      if (val.second > b)
      {
        a[c] += b;
        val.second -= b;
        break;
      }

      loop_cnt++;
      b -= val.second;
      a[c] += val.second;
      val.second = 0;
    }
    a.erase(begin(a), next(begin(a), loop_cnt));
  }

  ll ans = 0;
  for(auto& val : a)
  {
    ans += (val.first * val.second);
  }
  cout << ans;
```
`std::map`を使いました。`key`がカードの値、`value`が枚数です。
`b`枚の`c`が与えられたとき、`c`より値が小さいカードを捨てて`c`を取り入れています。

上のプログラムでは捨てたカードは削除しているのですが、削除は不要でした。
入力のカードをすべてひとつの`priority_queue< pair<int, int> >`に入れて、最後に`M`枚取り出して和を計算すれば答えになります。
最大値だけが欲しいので`priority_queue`を使っています。

気付きたかった。
削除すると最後の和を求める部分で楽なのですが、途中の処理が複雑になります。
計算量も多くなりますね。


以上です。ありがとうございました。
C++のWindowsアプリ開発などで使用できる簡易メッセージボックス

##i.e.
自分用。
Windows APIを利用している場合のみ対応できます。
クライアントウインドウに対して表示するメッセージボックスを\<stdio.h>のprintfみたいな形で使いたい時に。
（なんかフォーマット指定子使って変数とか出力したいデバッグetc...）

##コード
適当に加工して使ってください。
説明へたくそなので、解説はありません:tired_face::sweat_drops:

```C++:versatility_msgbox.cpp
char i_Buffer[512];
```

```C++:versaility_msgbox.hpp
#include <Windows.h>

// スコープ変数の宣言
extern char i_Buffer[512];

// マクロ定義
/// printf系列のフォーマット指定子が指定可能なメッセージボックス関数
#ifndef DEBUG_MSG_BOX
#define DEBUG_MSG_BOX(msg, ...) snprintf(i_Buffer, 512, msg, __VA_ARGS__); MessageBoxA(/* ここは親ウインドウ(hWndとか)、NULLでも多分動く */, i_Buffer, "Debug Only", MB_OK)
#endif // !DEBUG_MSG_BOX
```

```C++:main.cpp
#include "versatility_msgbox.hpp"

int __stdcall WinMain(
    _In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPSTR lpCmdLine,
    _In_ int nCmdShow
) {
    bool ret = true;
    int value = 0x01;
    DEBUG_MSG_BOX("メッセージボックスに表示する文言。\nINTEGER型(HEX)：%x\nBOOL型：%s", value, ret ? "true" : "false");
    return 0;
}
```