OmniAICreator/Qiita-1.07M huggingface dataset:
C++ STL tupleのコード集

# 概要
STL（Standard Template Library）の`tuple`関係のコード集です。対応確認環境はMicrosoft Visual Studio 2019 Communityのstd:c++latest (C++20 draft)です。最新のC++では制約が異なる可能性があります。

# 共通事項

- `using namespace std;`により`std::`は省略しています。

## 出力用の関数

出力用に次の関数を定義しています。共通部分なので以降のコードでは省略します。

### `vector`を一行に出力
```cpp
template <typename T>
void output_singleline(const vector<T>& v)
{
	constexpr wchar_t sep[] = L", ";
	wstringstream wss;
	for (const auto& i : v)
	{
		wss << i << data(sep);
	}
	if (const auto& s = wss.str(); !empty(s))
	{
		wcout << s.substr(0, s.length() - size(sep) + 1);
	}
	wcout << endl;
}

```

# 範囲forで`map`のキーに指定した`tuple`を構造化束縛する

構造化束縛はネストの分解に対応していないので範囲forの初期化式では直接タプルを構造化束縛することはできません。しかし、forブロック内で改めて構造化束縛することでキーに指定した`tuple`を分かりやすく参照できます。

```cpp
#include <iostream>
#include <string>
#include <tuple>
#include <map>

using namespace std;

int main()
{
	map<tuple<int, wstring>, int> m1{
		{{0, L"a"}, 100},
		{{1, L"b"}, 101},
		{{2, L"c"}, 102},
		{{3, L"d"}, 103},
		{{4, L"e"}, 104}};

	for (const auto& [key, value] : m1)
	{
		const auto& [i, s] = key;
		wcout << L"{{" << i << L", " << s << L"}, " << value << L"}" << endl;
	}

	return 0;
}
```

```plain:出力
{{0, a}, 100}
{{1, b}, 101}
{{2, c}, 102}
{{3, d}, 103}
{{4, e}, 104}
```

# `map`のキーに指定した`tuple`の要素からベクトルを作成する

`get<i>(tuple)`で`tuple`の`i`番目の要素を取得できます。

```cpp
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#include <tuple>
#include <map>
#include <vector>

using namespace std;

template <typename T>
void output_singleline(const vector<T>& v);

int main()
{
	map<tuple<int, wstring>, int> m1{
		{{0, L"a"}, 100},
		{{1, L"b"}, 101},
		{{2, L"c"}, 102},
		{{3, L"d"}, 103},
		{{4, L"e"}, 104}};

	vector<wstring> second_keys;
	second_keys.reserve(size(m1)); // optional
	transform(cbegin(m1), cend(m1), back_insert_iterator(second_keys),
		[](const auto& kv) {
			const auto& [key, value] = kv;
			return get<1>(key);
		});

	output_singleline(second_keys);

	return 0;
}
```

```plain:出力
a, b, c, d, e
```
LPICレベル１の学習メモ

101をとってからもう半年がたった今、ようやく102の学習を始めることにしたのでメモを残していくことにした。
まずは102に入る前にほとんど忘れたであろう、101の復習を軽く行った。

##基本のファイル操作コマンド
###ls 
基本的にディレクトリの中身やファイルの属性を見るコマンド
-l 詳細情報を表示
-i iノード番号を表示

###cp 
ファイルやディレクトリのコピー
-f 上書きの確認なし
-i 上書きの確認あり
-r 再帰的に行う
-f 所有者、所有グループ、アクセス権、タイムスタンプを含めたファイルのコピー

###tr [option] X Y
文字列の変換、削除
-d Xにマッチした文字列削除
クラスを使った変換も行える

###wc
行数、単語数、文字数を表示
-c 文字数（バイト）
-l 行数
-w 単語数

###grep
文字列の検索
-c マッチした行の行数を表示
-f　検索パターンをファイルから読み込む
-i 大文字小文字の区別なし
-n　検索結果と行番号を表示
-v マッチしない行
-E 拡張正規表現
GitHub Actionsでビルドの成功・失敗をSlackに通知する方法

# TL;DR

- SlackのIncoming Webhookインテグレーションを利用します。
- `if: success()`, `if: failure()` それぞれでステップを分け、通知結果を調整します。

# 前置き
知っている人は既に実践していると思いますが、意外と初心者にわかりやすい情報が少ない気がするので書いておきます。

## GitHub Actionsでビルド結果をSlackに通知するには

2020-06-10現在、GitHub Actionsには標準でジョブの実行結果をSlack等に通知する機能がありません。（※例外については後述）
そこで、マーケットプレイスにあるアクションか、またはSlackのIncoming Webhook URLを叩くコマンドを追加する形になると思います。

### 例外

上記の例外として、以下のケースについては、[GitHub公式のSlackインテグレーション](https://github.com/integrations/slack#configuration)で通知を受取ることができます:

- プルリクエストの通知を有効にしていれば、プルリクエストに紐付いたビルド結果はわかるようです。
- Deploymentsの通知を有効にしていれば、Deploymentsを作成するワークフローの実行結果はわかります。[^1]

[^1]: 参考: [GitHub ActionsでGCPにTerraformでインフラCI/CDする - Qiita](https://qiita.com/progrhyme/items/6bde1e1807a65c7e2cb2#pr%E3%83%9E%E3%83%BC%E3%82%B8%E6%99%82%E3%81%ABterraform-planapply%E3%81%99%E3%82%8B%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC)

# ワークフロー設定例

下は、git pushによって `go test` を実行するワークフローの設定例です。
Slack通知には、[rtCamp/action-slack-notify](https://github.com/rtCamp/action-slack-notify)というアクションを使いました。

```YAML:go-test.yml
name: go-test

on: push

env:
  SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - uses: actions/setup-go@v2
      with:
        go-version: '1.14.4'
    - run: go get -v ./...
    - run: go test -v ./...
      id: test

    # テスト成功時はこちらのステップが実行される
    - name: Slack Notification on Success
      if: success()
      uses: rtCamp/action-slack-notify@v2.0.2
      env:
        SLACK_CHANNEL: ci
        SLACK_TITLE: Test Success
        SLACK_COLOR: good

    # テスト失敗時はこちらのステップが実行される
    - name: Slack Notification on Failure
      uses: rtCamp/action-slack-notify@v2.0.2
      if: failure()
      env:
        SLACK_CHANNEL: ci
        SLACK_TITLE: Test Failure
        SLACK_COLOR: danger
```

補足:

- 事前にリポジトリのSecretsに `SLACK_WEBHOOK_URL` というキーで、SlackのIncoming Webhook URLを設定しています

## Slack通知結果の例

![Screenshot from 2020-06-10 23-34-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168843/f7d152ce-4f71-4480-bc2a-8ec497cce270.png)

# リファレンス

- [Context and expression syntax for GitHub Actions - GitHub Help#job-status-check-functions](https://help.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#job-status-check-functions)

# 脚注
サーバエンジニアにも、わかりやすく機械学習の教師あり学習（Supervised Learning）を理解してみた3

## ADALINE

ADALINEも前回のパーセプトロンに引き続き、アルゴリズムの一種に当たる。

***パーセプトロン***は、簡単に言うと
◯×でグルーピングし、
線で区分けすることができる
仕組みとしては、答えが期待値と違う場合のみ、
重みを変え、計算をし直すと言う
アルゴリズムでした。

それに対して、***ADALINE***は、◯の場合も正解に近かったかを図り、
答えがどのぐらい正解かを判定しながら、答えを出すことができます。
そして恒等関数を使って、そのままの値を出すことによって差がわかるといったものです


pythonで描いてみましょう。ライブラリーの説明を先にします

配列を高速に扱えるライブラリーです
こんな感じで使えます
またこの関数は***activate func***は恒等関数と呼ばれ、
生の値を出しています。

```
import numpy as np 

def activate(z):
  return z

w = np.array([1,2,3])
x = np.array([4,5,6])

#２次元ベクトル同士の内積を計算
net_input = np.dot(w,x)

print(activate(net_input))

//32
```

次に2値化します。その値が0.0より大きいかどうかです

```
def threshold(v):
  return np.where(v >= 0.0, 1, -1)

print(threshold(activate(net_input)))
```


```
import pandas as pd
from sklearn.datasets import load_iris
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

iris = load_iris()

iris_X = pd.DataFrame(iris.data, columns=iris.feature_names)
display(iris_X.iloc[0:100])

iris_y = iris.target #アイリスの種類

X = iris_X.iloc[0:100, [0, 2]].values #100行までのデータの配列0,2を取得する
y = iris_y.copy()[0:100] #アイリスの種類の100行目まで取得する
y = np.where(y == 0, -1, 1) #yが０だったら-1それ以外だったら、1を設定する

#散布図を作成する
#がくへん(sepal length)の長さが横軸、花弁の幅が縦軸
plt.scatter(X[:50, 0], X[:50, 1],
            color='red', marker='o', label='setosa')  
plt.scatter(X[50:100, 0], X[50:100, 1],
            color='blue', marker='x', label='versicolor')

#グラフの表記事項凡例

plt.xlabel('sepal width [cm]')
plt.ylabel('petal length [cm]')
plt.legend(loc='upper left')


#グラフの表示処理
plt.tight_layout()
plt.show()
```




## おまけ

### ニューラルネットワークとは
これもよく難しい図で出てきますが、要は、

『エンジニアのネタができた』
『エンジニアで記事をシェアしたいなぁ』
『忘却録にもしたい』　→　『Qiitaの記事作成ボタンをおす』

などと複数の入力に対して、出力を得ることを言います。


参考）
ADALINEとは的な記事
https://riverage.tokyo/neural-network/adaline/

応用の使い方など実例
https://miyabi-lab.space/blog/9#310
反復補題を使った正則言語の判定

[オートマトン 言語理論 計算論 I [第2版]](https://www.saiensu.co.jp/search/?isbn=978-4-7819-1026-0&y=2003)の4章にある正則言語の問題（[原著の解答ページ](http://infolab.stanford.edu/~ullman/ialcsols/sols.html)には載っていないもの）の解答です．過去に同じ問題を院試過去問で見たことがあり，最近ふと読み直して考えてみたら簡単にできたので書いておきます．
正則言語を正規言語と呼ぶこともあるようですが，ここでは正則言語で統一します．
（初投稿なので練習も兼ねています）

使うのは以下の有限オートマトンに対する反復補題のみです．

#反復補題
任意の正則言語 $L$ に対し定数 $N_L\geq 1$ が存在し，$|w|\geq N_L$ なる任意の $w\in L$ は，次を満たす $3$ つの部分文字列の連接 $w=xyz$ に分割できる．
$(1)$ $y\neq\varepsilon$
$(2)$ $|xy|\leq N_L$
$(3)$ 任意の $k\geq 0$ に対し $xy^kz\in L$

#2進数として見た時素数となる文字列の集合
$L_1:=\\{ w\in \\{0,1\\}^{\ast}; w$ は $2$ 進数として見た時素数である$\\}$ は正則言語でない． (P.144 問4.1.3 (a))
(証明) $L_1$ が正則言語であったとして，$N$ を補題の定数とする．素数は無限に存在するから， $p\in L_1$ であって $|p|\geq 2N$ となるものが存在する．
このとき補題による $p$ の分割を $p=xyz$ とすると $q:=xy^p z\in L_1$ であり， $p\geq 2$ より $q>p$ である．
$y\neq \varepsilon$ より $2^{|y|}-1>0.$ また， $|p|\geq 2N, |y|\leq |xy|\leq N$ より

```math
p-(2^{|y|}-1)\geq 2^{2N-1}-(2^N-1)=2^N (2^{N-1}-1)+1>0.
```

よって $0<2^{|y|}-1<p$ である．
以下 $\bmod p$ とする．$2^{|y|}-1\not\equiv 0$ であることに注意し，$q$ を文字列ではなく数値として見ると

```math
\begin{align}
q&=2^{p|y|+|z|}x+2^{(p-1)|y|+|z|}y+\cdots+2^{|z|}y+z\\
&=2^{p|y|+|z|}x+\frac{2^{p|y|}-1}{2^{|y|}-1}2^{|z|}y+z\\
&\equiv 2^{|y|+|z|}x+\frac{2^{|y|}-1}{2^{|y|}-1}2^{|z|}y+z \quad (\because \text{Fermat の小定理})\\
&=2^{|y|+|z|}x+2^{|z|}y+z\\
&=p\equiv 0.
\end{align}
```
よって $q$ は素数 $p$ の倍数だが，$q>p$ より $q$ は合成数．これは $q\in L_1$ に矛盾．



#0と1の個数が互いに素となる文字列の集合
$L_2=\\{ 0^i 1^j; \gcd(i,j)=1\\}$ は正則言語でない． (P.144 問4.1.3 (b))
(証明) $L_2$ が正則言語であったとし，$N$ を補題でいう定数とする．$p>N$ となる素数を取ると $\gcd(p, p+1)=1$ より $w:=0^{p+1}1^p \in L_2.$
補題による $w$ の分割を $w=xyz$ とすると， $p>N$ より $x,y$ は $0$ のみからなるので，

```math
x=0^m, y=0^n, z=0^{p+1-m-n}1^p \quad (m+n\leq N, n>0)
```
と書ける．
今 $n\leq m+n \leq N < p$ だから $\gcd(n, p)=1.$ よって $(a, b)\in \mathbb{Z}^2$ であって $an+bp=1$ となるものが取れる．$(a, b)$ がこれを満たすなら 任意の $k\in \mathbb{Z}$ に対し $(a+kp, b-kn)$ も満たすから，$a>0$として良い．
補題により $w_k := xy^{k}z=0^{p+1+(k-1)n}1^p \in L_2$ であるが，$k=1+(p-1)a$ の時

```math
\begin{align}
p+1+(k-1)n
=p+1+(p-1)an
\equiv 1-an
=bp
\equiv 0 \quad \bmod p
\end{align}
```
となって $\gcd(p+1+(k-1)n, p)=p>N\geq 1$ で $w_k\in L_2$ に矛盾．
シンプルなImageEffect　その11。陽炎(HeatHaze)

TwitterにアップしたシンプルなImageEffect　陽炎のコードをアップしておきます
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">リハビリのシンプルImageEffect。陽炎(HeatHaze)<br>よくあるsin,cosでズラすヤツです。<br>一応画面端が見きれないようにケアもしておいた。 <a href="https://t.co/8tni5VMKQV">pic.twitter.com/8tni5VMKQV</a></p>&mdash; MIYAKE (@ScreenPocket) <a href="https://twitter.com/ScreenPocket/status/1270726629426257923?ref_src=twsrc%5Etfw">June 10, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

```glsl:HeatHaze.shader
Shader "ScreenPocket/ImageEffect/HeatHaze"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _WaveCycle ( "Wave Cycle", Float ) = 8.0
        _Length ( "Length", Float ) = 0.005
        _Speed ("Speed", Float) = 1.0
    }
    SubShader
    {
        // No culling or depth
        Cull Off ZWrite Off ZTest Always

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            sampler2D _MainTex;
            float _WaveCycle;
            float _Length;
            float _Speed;

            fixed4 frag (v2f i) : SV_Target
            {
                float2 uv;
                
                uv.x = i.uv.x + cos(i.uv.y * _WaveCycle * UNITY_TWO_PI + _Time.w * _Speed) * _Length * sin(i.uv.x * UNITY_TWO_PI);
                uv.y = i.uv.y + sin(i.uv.x * _WaveCycle * UNITY_TWO_PI + _Time.w * _Speed) * _Length * sin(i.uv.y * UNITY_TWO_PI);
                
                fixed4 col = tex2D(_MainTex, uv);
                return col;
            }
            ENDCG
        }
    }
}

```
- _WaveCycle　…　波の周期量
- _Length　…　ずらし幅
- _Speed　…　時間(_Time.wに乗算されます)

丁度いい値に調整してご利用下さい

また、x,yにそれぞれ
sin(i.uv.x * UNITY_TWO_PI)
sin(i.uv.y * UNITY_TWO_PI)
をかけることで、画面端に近づくほどずらし幅を抑えて、画面外をサンプリングしないようにケアしています。

---

最近転職した事で、意識が完全に本業に向いてしまっていますが、
ちょっとずつリハビリも兼ねて、趣味コーディングを復帰させて行きたい所存です。
字句解析(Flex)

# プログラミングの勉強日記
2020年6月10日　Progate Lv.85
授業での課題でFlexを使った。

##Flexの使用方法
　①拡張子`.l`の flex 用入力ファイル ((f)lex ファイル) を作成（例：test.l）
　②flex で test.l ファイルから lex.yy.c ファイルを作成（例：flex test.l）
　③flex が作成するファイルの名前は lex.yy.cとなるので、他のファイルと一緒にコンパイルする。

##主な字句解析

　`%%`から`%%`で囲まれた字句規則は正規表現で記述する。


| 表現方法 |  意味 | 
|:-----------------:|:------------------:|
|  [A-Z]  |A~Zのとき  |   
|  [a~z]  |a~z |   
| [0-9]  | 0~9のとき  |
|  [\r\n\t ]   |  \r, \n, \t, ' '(空白文字)のとき  |

 []のあとに`+`をつけると1個以上を示し、`*`のときは0個以上、`?`のときは0個か1個以上とする。

```:A~Z,a~z,0~9が1個以上のとき1つずつ出力する
[A-Za-z][A-Za-z0-9]*   printf("%s\n", yytext);
```

```:全体構造
%{ 
int  yywrap(void) { return 1; } 
%}

%%
字句解析を行う
%%

void main() { yylex(); }
```
RxSwiftのdisposeについて３分で理解

RxSwiftのdisponeについて３分で理解出来るようにまとめました。
公式ドキュメントを翻訳しました。

## Disposing
observed sequenceが終了する条件がもう一つある。Sequenceを行い、計算に割り当てられた全てのリソースを解き放つ時、我々はsubscriptionに対してdisposeを呼ぶ事ができる。

要するに、disposeメソッドを呼ぶ事でRxSwiftのObservableを終了できる。
以下はinterval オペレーターにdisposeを使用した例だ。
毎0.3秒事に数字をプリントアウトするコードだが、開始から2秒後にdisposeが呼ばれているため、５回数字をプリントしている。

```swift

let scheduler = SerialDispatchQueueScheduler(qos: .default)
let subscription = Observable<Int>.interval(.milliseconds(300), scheduler: scheduler)
    .subscribe { event in
        print(event)
    }

Thread.sleep(forTimeInterval: 2.0)

subscription.dispose()
This will print:

0
1
2
3
4
5
```

いつも手動でdisposeを呼ばなくて良い事に注意してください。上の例は学習用のサンプルコードです。disposeを手動で呼ぶことは、バッドプラクティスです。subscriptionをdisposeするDisposeBagや、takeUtil オペレーターのようなもっと良いやり方があります。

このコードはdisposeが実行された後も何かprintするでしょうか？
この問いの答えば「状況による」です。
もし、schedulerが、serial scheduler（MainSchedulerなど）でdisposeが同じserial schedulerに呼ばれたら答えはNoです。
その他の状況ではYesです。

並列処理を行うには二つのシンプルな方法があります。
・elementを生成する。
・subscriptionをdisposeする。
disposeを実行した後に後に何かプリントしますか？という問いは、scedulerの種類によって違うため意味がありません。

例えば以下のようなコードなら

```swift

let subscription = Observable<Int>.interval(.milliseconds(300), scheduler: scheduler)
            .observeOn(MainScheduler.instance)
            .subscribe { event in
                print(event)
            }

// ....

subscription.dispose() // called from main thread
```

disposeが呼ばれた後、何もプリントされません。

以下のようなケースでも、

```swift

 let subscription = Observable<Int>.interval(.milliseconds(300), scheduler: scheduler)
            .observeOn(serialScheduler)
            .subscribe { event in
                print(event)
            }

// ...

subscription.dispose() // executing on same `serialScheduler`
```

disposeが呼ばれた後、何もプリントされません

## 参考
https://github.com/ReactiveX/RxSwift/blob/master/Documentation/GettingStarted.md#disposing
progate java L1基本まとめ　cosole.log,変数と定数の違い、if文

#console.log
console.log();と使う
コンソール上に（）内を表示させる
注意点として文字列を表示させたい場合はconsole.log("")のように文字列を""で囲む

○　console.log("あいうえお")　⇨　あいうえお　と表示される
×　console.log(あいうえお)　⇨　referenceエラーになる



#値の宣言 変数letと定数const

値を宣言する場合、letまたはconstで宣言する

let numberA = 1;
const numberB = 2;

この２つには違いがあり、letは更新できるがconstは更新できない

###値の更新
変数は値を更新することができる
let numberA = 1;
この時点ではnumberAは１だが、

numberA = 10;
これでnumberAはではなく１０になる

#if文
if(条件){処理}←セミコロンは付けない
（条件）を満たした場合に{処理}が実行される

条件の例
a>=b aは以上
a<b  aはbより下

さらに条件を追加するときはelse ifを使う
else if（条件）{処理}←セミコロンは付けない

条件を満たさない場合に処理を行う場合はelseを使う
ifやelseifの条件に全て当てはまらない場合、elseの処理が実行される
else{処理}
Kotlin/NativeでHello World

# 目的

まずはKotlin/Nativeでコードを書いて、raspberrypi上で"Hello World"をしてみる。

## 準備

mac 上で、kotlin/Nativeを使えるように以下をインストール
1. JetBrains IntelliJ IDEA CE
2. XCode 11.5
3. XCode command line tool

```bash
kotlinc-native -list-targets
```

を実行するも、`xcodebuild`が見つからないようなエラーが。。。正確なものをメモってなかったけど、`MissingXcodeException`だった気がします。

https://youtrack.jetbrains.com/issue/KT-34858
https://stackoverflow.com/questions/40743713/command-line-tool-error-xcrun-error-unable-to-find-utility-xcodebuild-n

を参考に、

```bash
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
```

を実行。再びlist-targetをしてみると、、、

```bash
kotlinc-native -list-targets

macos_x64:                    (default) macbook, macos, imac
ios_arm32:                              iphone32
ios_arm64:                              iphone, ipad, ios
ios_x64:                                iphone_sim
watchos_arm32:
watchos_arm64:
watchos_x86:
watchos_x64:
tvos_arm64:
tvos_x64:
linux_x64:                              linux
linux_arm32_hfp:                        raspberrypi
linux_arm64:
android_x86:
android_x64:
android_arm32:
android_arm64:
wasm32:
```
うまくいったっぽい。

で、Kotlin/Nativeのhello worldは、intelliJで自動生成してmac用のコードは完成。そこにraspberrypi用のコードも追加。
https://github.com/JetBrains/kotlin-native/blob/master/GRADLE_PLUGIN.md を参考

できたコードがこんな感じ
https://gitlab.com/hoso-study/raspberrypi/kotlinnative-helloworld

mac/raspberrypiで実行できる`kexe`がそれぞれ完成。

mac用はlocalで実行。
raspberrypi用は、scpして実行。
どちらも無事動きました。
JavaScriptにおける正しいURLエンコードの方法（encodeURIとencodeURIComponentの違い）

# はじめに
javascriptにおいてURLをパーセントエンコードする場合に使用する`encodeURI`と`encodeURIComponent`の違いを説明します。

# URLエンコードとは
URLに含まれる日本語とか半角スペースとかを「あ」→「%E3%81%82」、「 」→「%20」に変換すること

# URLデコードとは
エンコードされたURLを元に戻すこと

# javascriptでやってみる
```javascript
let url = "http://api/user/太郎?age=20";
console.log(encodeURI(url));
console.log(encodeURIComponent(url));
```
```:実行結果
http://api/user/%E5%A4%AA%E9%83%8E?age=20
http%3A%2F%2Fapi%2Fuser%2F%E5%A4%AA%E9%83%8E%3Fage%3D20
```

`encodeURIComponent`はURLの形式としておかしな文字列になってしまいました。

# 違い
URL内で特別な意味を持つ「; , / ? : @ & = + $ #」の扱いが違います。

- `encodeURI`  
エンコードされない
- `encodeURIComponent`  
エンコードされる

ですので、URL全体をエンコードする場合は`encodeURI`で、パラメータなどの部分的な文字列をエンコードする場合は`encodeURIComponent`を使用しましょう。

# ありそうな失敗
例えば`http://api/user?name=XXX`のXXX部分にユーザ名「山田=太郎」を指定する場合

1. ユーザ名を設定したURLを作成する  
`http://api/user?name=山田=太郎`
2. `encodeURI`する  
`http://api/user?name=%E5%B1%B1%E7%94%B0=%E5%A4%AA%E9%83%8E`
3. 受け取った側が`decodeURI`する  
`http://api/user?name=山田=太郎`
4. パラメータを分割して取得する  
"?"以降をパラメータとして認識し、それを"&"で分割し、"="で分割して、キーと値を取得する。  
その場合、「キー：name」、「値：山田」となる

# 正しいやり方
1. ユーザ名を`encodeURIComponent`する
`%E5%B1%B1%E7%94%B0%3D%E5%A4%AA%E9%83%8E`
2. エンコードしたユーザ名を設定したURLを作成する  
`http://api/user?name=%E5%B1%B1%E7%94%B0%3D%E5%A4%AA%E9%83%8E`
3. 受け取った側がパラメータを分割して取得する  
"?"以降をパラメータとして認識し、それを"&"で分割し、"="で分割して、キーと値を取得する。  
その場合、「キー：name」、「値：%E5%B1%B1%E7%94%B0%3D%E5%A4%AA%E9%83%8E」となる
4. `decodeURIComponent`する  
「キー：name」、「値：山田=太郎」が取得できる
RaspberryPiで遊ぶ

# この記事について

今日から少しずつ記事を書いていこうと思います。
お題は「RaspberryPiで遊ぼう」です。この記事自体は表紙ということで。

特にゴールはないのですが、[これ](https://www.amazon.co.jp/SunFounder-%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%BF%E3%83%BC%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C%E3%82%AD%E3%83%83%E3%83%88-%E3%83%A9%E3%82%BA%E3%83%99%E3%83%AA%E3%83%BC%E3%83%91%E3%82%A4%E5%88%9D%E5%BF%83%E8%80%85%E5%90%91%E3%81%91%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E8%A9%B3%E7%B4%B0%E3%81%AA%E6%95%99%E6%9C%AC%E3%81%A8%E8%B1%8A%E5%AF%8C%E3%81%AA%E5%AD%A6%E7%BF%92%E7%94%A8%E3%83%AC%E3%83%83%E3%82%B9%E3%83%B3%E4%BB%98%E3%81%8D-Python%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88/dp/B083SJQXCL)を買ったので遊ぼうかと。

# 制約

とはいえ、何かしらお題もないととっちらかるので、以下の条件で。

1. 使用するRaspberryPi  
   RaspberryPi 3B+ を利用します。後述するpigpioがpi4に正式対応していないようなので。
2. GPIO  
   GPIOへのアクセスは、Wiring Piではなく、pigpioを使用します。  
   Wirling Piは残念ながら[こういう感じ](http://wiringpi.com/news/)なので
3. プログラミング言語  
   基本Kotlinで。GPIO周りを遊ぶときはKotlin/Native、少しアプリっぽくするときは、Kotlin/jvmでアプリ層を、下回りで必要な部分をKotlin/Nativeで書けたらいいなと思います。勉強勉強。
4. 開発機
   Macbook Pro (Mid 2014)  macOS Catalina 10.15.5
   現段階で、xcode 11.5, xcodebuild, intlliJ IDEA CE とか入ってます。


# 記事一覧
   
[Kotlin/Nativeでhello world](https://qiita.com/hirohoso/items/283e104a8a76fa40b277)
[Kotlin/NativeでLチカ](https://qiita.com/hirohoso/items/596608d92ece6d6bac5d)
[Kotlin/NativeでLCD表示](https://qiita.com/hirohoso/items/c53a7dab2500b98cbdea)
AWS: プロビジョニングサービス

#プロビジョニングサービス
AWSでは環境構築作業を自動化することができる。

- Elastic Beanstalk
    - 定番構成の自動構築
- OpsWorks
    - Chef環境を提供し、OSより上のレイヤーの自動構築をサポート
- CloudFormation
    - JSONあるいは、YAMLのテンプレートを作成し、OSより下のレイヤーの自動構築をサポート

## Elastic Beanstalk
定番のインフラ構成を自動構築するサービス。

- Webサーバー構成(ELB + Auto Scaling + EC2)
- Batchワーカー構成(SQS + Auto Scaling + EC2)

## OpsWorks
Chefを利用した構成管理サービス。
ファイルにサーバーの構成を定義し、ミドルウェアのインストールや設定を自動化するツール。

- Chef Client ローカル方式
    - 各サーバーがレシピを持ち、自分自身にレシピを適用する方式
- Chef Server/Client方式
    - マスターサーバーを用意し、レシピそのものや各サーバーのレシピ適用状況を管理する方式

### OpsWorksスタック
Chef Clientローカル方式でChefを利用する場合は、OpsWorksスタックを利用する。

- スタック
    - OpsWorksのトップエンティティ。スタック単位の構成情報をJSON形式で保持する。
- レイヤー
    - インスタンスの特性ごとにレイヤーを用意する。レイヤーに対してChefレシピをマッピングする。レイヤーが指定してEC2インスタンスを起動することで、インスタンスに対してレシピが適用される。

### OpsWorks for Chef Automate
ChefをChef Server/Client方式で利用する場合、Chef Automateという、Chefを統合的に利用するための機能がある。

OpsWorks for Chef Automateを利用すると、Chef Automateサーバーが自動構築される。利用者側でChef Automateサーバーのプロビジョニングやインストール作業を行う必要がなく、Chef Automateサーバー自体のバックアップを行う機能なども標準提供されている。

## CloudFormation
AWSリソースを自動構築するためのサービス。

- CloudFormationテンプレートを作成
- テンプレートを適用
- CloudFormationスタックが作成され、それに紐づく形でAWSリソースが自動構築される。

### CouldFormationスタック
AWSリソースは、CloudFormationスタックという集合にまとめられる。

- IAMやCloudTrailといったアカウント設定用スタック
- VPCやサブネットといったネットワーク用スタック
- ELBやWebサーバーといったパブリックサブネット用スタック
- DBやインメモリキャッシュといったプライベートサブネット用スタック


### CloudFormationテンプレート
スタックの設計図であるCloudFormatioinテンプレートに以下の内容を記載していく。

- VPCの構築
- パブリックサブネットの構築
- EC2インスタンスの構築
【Rails + Docker】You must use Bundler 2 or greater with this lockfile.

Bundlerのバージョンによるerrorのためバージョンを指定する必要がある

Volumeを削除

``` bash
$ docker system prune
Are you sure you want to continue? [y/N] y

$ docker volume ls
DRIVER              VOLUME NAME
local               docker_bundle

$ docker volume rm docker_bundle
```

Dockerfileを変更

``` Dockerfile.backend
+ENV BUNDLER_VERSION 2.0.2
-RUN gem install bundler
+RUN gem install bundler -v '2.0.2'
```
buildする

``` bash
$ docker-compose build
$ docker-compose up
```

以上で解決した。ただこのやり方がベストか不明
書いてある通りだと思ったか？そいつは間違いだ。（追記

最近いろいろな都合でLinuxのAPIを調べる機会が多いのだが、

open()
read()

この２つに（というかread()に）致命的な間違いがある。

open()は確かに正しい。O_NONBLOCKさえ指定しなければブロックする。
だがread()はブロックしない。fdのオープンモードには関係ない。
一度read()が成功したらノンブロックで読み続ける（FIFOで実験しよう）。

read()がブロッキングしてくれると思ったら大間違いだ。
自分で確かめてみてくれ。
あえてコードは出さない。

2020/07/10追記
上記は半分間違いである。
read()でのブロッキングは可能だ。
些細な問題を除けばだが。
PyTorch参考書　Self-Attention GAN のサンプルコードの追加フラグメント

「つくりながら学ぶ! PyTorchによる発展ディープラーニング」の「第5章 GANによる画像生成（DCGAN、Self-Attention GAN）」の「Attention Map」の可視化について、追加フラグメントを作成しました。

##参照書籍
つくりながら学ぶ! PyTorchによる発展ディープラーニング
小川雄太郎

https://book.mynavi.jp/ec/products/detail/id=104855
https://github.com/YutaroOgawa/pytorch_advanced
https://qiita.com/sugulu/items/07253d12b1fc72e16aba

##Attention Map可視化フラグメント

「5-4_SAGAN.ipynb」の最後にセルを追加して、以下のコードを貼り付けてください。

```python

# Attentiom Mapを出力

print('1段目　生成した画像データ')
print('2段目　Attentin Map1　中央のピクセル→全ピクセル')
print('3段目　Attentin Map1　全ピクセル→中央のピクセル　⇒　2段目と同じ結果が得られる')
print('4段目　Attentin Map1　右下のピクセル→全ピクセル　⇒　7と8で差が出やすいピクセル')
print('5段目　Attentin Map1　左上端のピクセル→全ピクセル')
print('6段目　Attentin Map1　自ピクセル→自ピクセル')

row_num=6

# print('fake_images : ' + str(fake_images.size()))
# print('am1 : ' + str(am1.size()))

fig = plt.figure(figsize=(3*5, 3*row_num))
for i in range(0, 5):

  fake_image = fake_images[i][0]
  am = am1[i].view(16, 16, 16, 16)

  # print('fake_image : ' + str(fake_image.size()))
  # print('am : ' + str(am.size()))

  for j in range(0, row_num):
    plt.subplot(row_num, 5, 5*j+i+1)

    if j == 0:

      # 1段目　生成した画像データ
      plt.imshow(fake_image.cpu().detach().numpy(), 'gray')

    elif (j > 0) and (j < 5):

      if j == 1:
        # 2段目　Attentin Map1　中央のピクセル→全ピクセル
        am_tmp = am[7][7]
      elif j == 2:
        # 3段目　Attentin Map1　全ピクセル→中央のピクセル
        am_tmp = am[:][:][7][7]
      elif j == 3:
        # 4段目　Attentin Map1　右下のピクセル→全ピクセル
        am_tmp = am[11][11]
      elif j == 4:
        # 5段目　Attentin Map1　左上端のピクセル→全ピクセル
        am_tmp = am[0][0]

      am_tmp = am_tmp.cpu().detach().numpy()
      # print('i : ' + str(i) + ', j : ' + str(j) + ', max : ' + str(np.max(am_tmp)) + ', min : ' + str(np.min(am_tmp)))
      plt.imshow(am_tmp, 'Reds', vmin=0, vmax=0.05)

    elif j == 5:
      am_tmp = np.ones((16,16), dtype='float')

      # 6段目　Attentin Map1　自ピクセル→自ピクセル
      for k in range(16):
        for l in range(16):
          am_tmp[k][l] = am[k][l][k][l]

      # print('i : ' + str(i) + ', j : ' + str(j) + ', max : ' + str(np.max(am_tmp)) + ', min : ' + str(np.min(am_tmp)))
      plt.imshow(am_tmp, 'Reds', vmin=0, vmax=0.05)

    else:
      raise ValueError
```

##出力結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493607/6453d093-660b-2908-9e59-9cbbdbfdff3a.png)
1～3段目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493607/a80bd053-731c-6dc5-bd40-cc335c2323e2.png)
4～6段目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493607/f8250a91-7672-ed0e-fc16-7ba39802877a.png)
GASでZoom背景用QRコードを生成する

最近ZoomやTeamsといった遠隔会議が多いです。そして皆さん遠隔会議中の仮想背景が凝っています。中でもQRコードを表示して、名刺の変わりに交換する、という使い方は新しいと思い、自前でQRコードを作成出来るGoogle Apps Scriptを用意しました。

## 何故GASで？

会社で使うものである為、Webに公開されているツールはあまり使いたくありませんでした。コード内でjqueryは使いますが、それ以外は自前なので安心？と思っています。

## 実際の画面

※ 最初にLoginを求められます。

[QR Code Generator](https://script.google.com/macros/s/AKfycbyd4GHsLUyOKf17Rs3jHsJK1upNNhVQatyJ8f2U4F1WBmg64y0/exec)

## 環境構成

-   Google Apps script standalone + Web appとして公開
-   Typescript
-   Google Clasp

## ソースコード

GAS実行時にapp.tsからindex.htmlを呼び出しているだけです。

app.ts

```typescript
function doGet() {  
 return HtmlService  
 .createHtmlOutputFromFile("index")  
 .setTitle("QR Code Generator")  
 .addMetaTag("viewport", "width=device-width, initial-scale=1");  
}
```

index.html

```html
<!DOCTYPE html>  
<html>  
 <head>  
 <base target="_top">  
 <script>  
 function Generate(){  
 // Get target Elements.  
 let input = document.getElementById("input-area");  
 let output = document.getElementById("input-val");  
 let qrView = document.getElementById("qrcode");  
 // Delete Old Data  
 output.innerText = "";  
 qrView.innerHTML = "";  
 // Update View  
 output.innerText = input.value;  
 $('#qrcode').qrcode({width: 200, height: 200, text: input.value });  
 }  
 </script>  
 </head>  
 <body>  
 <!-- title -->  
 <h2 style="color:#808080;text-align:center">QR Code Generator</h2>  
 <p style="color:#808080;text-align:center">Enter address on form.</p>  
 <!-- form -->  
 <div style="text-align:center">  
 <input type="text" id="input-area" style="width:90%">  
 </div>  
 <br>  
 <div align="center">  
 <button onClick="Generate()">Generate</button>  
 </div>  
 <hr>  
 <div id="input-val" style="color:#808080;text-align:center"></div>  
 <div id="qrcode" align="center"></div>  
​  
 <!-- import from jquery, jquery.qrcode -->  
 <script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.qrcode/1.0/jquery.qrcode.min.js"></script>  
 </body>  
</html>  
```
​

以上です！
面倒くさがり屋のRails環境構築のザックリ流れ[Windows10]

初めまして、ちびのりです。

今回は初めてQiitaで、Ruby on Rails環境構築をした時の流れをザックリと書いてくよ。
（Qiitaどころか、こうやって記事を書くこと自体初めて..）


まず初めにRubyのインストールとして、https://rubyinstaller.org/downloads/ にアクセス。
下の画像の赤丸をダウンロード
![スクリーンショット (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636985/83ee1270-f364-6f3e-5c57-c6b8cf5b52ea.png)

インストーラーが立ち上がり、"1,2,3"でEnter。
![https___qiita-image-store.s3.amazonaws.com_0_101848_30df2393-99d9-131a-4004-442044a43b70.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636985/49c47277-fc25-e9b9-db3a-7a17360c0633.png)
もっかいEnter。

これでRubyインストール完了かな？
cmdでRuby -vしてバージョン確認。
2.4.10
おっけー

次にSQLite3のインストール
https://sqlite.org/download.html アクセス。
![スクリーンショット (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636985/c4a11dd9-ca3c-c44c-010f-1995b59a83b4.png)
赤丸２つをダウンロードして、解凍後にフォルダ内のsqlite3.dllとsqlite3.exeを
さっきインストールしたRubyの下のbinフォルダ内にコピペ。

次はRailsのインストールで、cmdにgem install rails -v "5.2.3"とEnter。
cmdでRuby -vしてバージョン確認。
5.2.3
おっけー

cmdでrails new sample -Gして、できたアプリ内のGemfileを編集。
gem 'sqlite3'　を　gem 'sqlite3', '~> 1.3.6'にした。
神からのお告げです。

仕上げにbundle installして、rails sで
![スクリーンショット (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636985/339a910d-e7f0-0447-e5cd-d71fdfd3a1ca.png)
と、まあ出来たわけですが。

この記事を書くきっかけとなったのが、プログラム超初心者の僕がWebアプリ作ってみたくて
Railsの環境構築をしようとしたら半日掛けてもできなかった事が悔しかったからなの。

途中の神からのお告げは会社の先輩による助言！
T様

苦戦した部分はRubyとSQLite3のバージョンがうまく噛み合ってなかったことと
環境構築する上での基本知識が乏しかったこと。

超適当な記事だけど、誰かの役に立てばいいな。
（記事制作時間30分）

（20/06/11）
追記1:プログラムコードの書き方が違う？どうやるんだ…

では、また。
[C#] タスクマネージャに近いCPU使用率の取得

teratailに回答したもので、比較的使えそうなやつシリーズ。
[teratail- C#でCPUの使用率を取得してWPFで表示したい。](https://teratail.com/questions/256954#reply-369969)

#コード
※ System.Management アセンブリ参照を追加すること。

```cs
var searcher = new System.Management.ManagementObjectSearcher("select LoadPercentage from CIM_Processor");
foreach (var obj in searcher.Get())
{
    var val = obj["LoadPercentage"];
    Console.WriteLine("LoadPercentage : " + val);
}
```
GitLab考察:グループプロジェクトについて

【[自分とこの環境下におけるGit & GitLabレクチャー](https://qiita.com/NeK/private/dee76f411cf2488b6873)】

# グループプロジェクトについての考察
グループプロジェクトについて使い始めたが思うところがあり記載する．

## 一般的なグループプロジェクト
通常はまず作りたいもの(プロジェクト目標)があり，完成のために全体像を考えモジュールなど細かく分け，多人数で役割分担を決めながら作成する，と思う．

つまりグループとしてのプロジェクト目標が一番最初に来る．

## 研究室での在り方
研究室では各個人が卒研に向けて自分用のプログラムを作成し，実験を行う．その際に，同じ研究グループにおいて共用できる有用なプログラムが出てくるし，異なる研究グループであっても同じ研究室であればやはり有用なプログラムは出てくる．
そこで有用プログラムの共有や，その一部分の共有としてグループプロジェクトを使う．

つまり個人のプロジェクト目標がまずあり，共有化された時点でグループプロジェクトとなる．しかも共有化された時点では，個人のプロジェクト目標の色が強く，使用者は作成者の目標を読み取らなくてはいけない．

## まとめ
テクニカルな話ではなく認識の問題であるが，意識していなかった時には「なにか気持ち悪い」と感じていたので文字にしてみた．
【ドットインストール】mongoDB講座の仕様変更点【  #02 MongoDBをインストールしよう】

##はじめに

ドットインストールのmongoDB講座は最終更新日が２０１5年のままアーカイブされていて、講座内容そのままやってもうまくいかない箇所がある。

「#02 MongoDBをインストールしよう」
の章では、mongoDBの仕様が変わっているため、講座のやり方に従ってもローカルにmongoDBをインストールできない。

mongoDBのインストールを行った時のやり方をメモしておく

##上手くいかなかった箇所

ドットインストールの講座では、MongoDBの公式ドキュメント（https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/#install-mongodb-community-edition ）の「Install MongoDB Community Edition on Red Hat or CentOS」のやり方に従ってインストールを行っている。

iTerm2を利用して、Macのローカル環境にインストールする場合、このやり方では上手くいかなかった。

動画のインストール手順では、
①/etc/yum.repos.d/mongodb-org-4.2.repo リポジトリを作成

②リポジトリに下記の内容を書き込む

```
[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc
```
【インストール完了】

となっていたが、mongodb-org-4.2.repo リポジトリをvimで開き、②の内容を書き込んだ後、保存することができなかった。

「E212: Can't open file for writing」
というエラーメッセージが出てしまった。


##Homebrewを使ったインストール方法

mongodbをインストールするには、「Homebrew」というパッケージ管理システムが便利であると知り、Homebrew経由でインストールすることにした。

Mac OS X: 	10.15.3
Homebrew 2.3.0
MongoDB shell: version v4.2.6

(※インストールされているバージョン確認のためのコマンドは
「sw_vers」
「brew --version」
「mongo」)

①Homwbrew公式（https://brew.sh/ ）から、Homebrewをインストール

<img width="1032" alt="スクリーンショット 2020-06-10 22.38.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595580/220329a9-59d8-bec6-be11-6142ee3d2591.png">

```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```

をターミナルにコピペしてインストール

②Homeberwが最新版になっているか確認

```
brew update
```

③Homebrewを利用してmongoDBをインストール

mongoDBは2018年にソフトウェアライセンスを改訂し、オープンソースではなくなっている。
そのため、mongoDBではなくmongo-communityをインストールする必要がある。

・mongo-communityインストールの為に、Homebrew Tapを利用する

```
$ brew tap mongodb/brew
```
・mongodb-communityをインストール

```
$ brew install mongodb-community
```
・mongodb-communityをセットアップ

```
$ brew services start mongodb-community
```

・mongodbを接続、起動する

```
mongo
```

これ以降の使い方は、mongoDBでもmongoDB communityでも同じになる。

##参考文献
・"Install MongoDB Community Edition on macOS"
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/

・『HomebrewでMacにMongoDBをインストールした時のメモ』
https://qiita.com/FrogWoman/items/f8a70286c7f1c4d5fc02

・『brewからmongodbがなくなったのでmongodb-communityをインストールする』
https://qiita.com/kazuki5555/items/b80f1f313137dffbb351

・『MongoDBがそのコードのオープンソースライセンスを改定、オープンソースの“食い逃げ”に むかつく』
https://jp.techcrunch.com/2018/10/17/2018-10-16-mongodb-switches-up-its-open-source-license/
【ExcelVBA】オブジェクト指向プログラミングをしよう

# はじめに

この記事ではExcel VBA で起きたあんなエラーや
こんな不具合、ポイントについて書いています。

今回はクラスに関する話
ちょっと間違えていたら修正します。

--------------------------------

# 動作環境
Windows10 Pro 64bit
Excel2016 32bit
Excel2019 64bit

O365なし

--------------------------------

# VBAのデータ型(数値)

数値を扱えるデータ型
・Byte
・Integer
・Long
・Single
・double

--------------------------------

# VBAのデータ型(文字列)

文字列を扱えるデータ型
・String

--------------------------------

# VBAのデータ型(論理型)

論理型を扱えるデータ型
・Boolean

--------------------------------


# VBAで扱える特殊なデータ型
・Currency
・Date
・Object
・Variant

--------------------------------

# クラスとは
クラスを語るのであれば外せない話題
そう、オブジェクト指向プログラミングである。

クラスを使うということは
これから定義することを**抽象化**するということである。

--------------------------------

# 抽象化とは

簡単に言えば
あいまいに表現すること

> 人であれば動物と表現したり
> パトカーであれば車と表現すること

--------------------------------

# 具体化とは

簡単に言えば
はっきり表現すること

> 動物を人と表現したり
> 車をパトカーと表現すること

私の思う車っていうのはパンダ（パトカーのスラング）のこと

--------------------------------


# メソッド（ふるまい）とは

簡単に言えば、モノの動き
パトカーであれば
・走る
・サイレンを鳴らす
・パトランプを光らせる

--------------------------------


# メンバ

簡単に言えば、モノの部品や性質、状態を表す。
パトカーであれば
・タイヤ
・パトランプ
・サイレン

他の言い回しだと「プロパティ」って言ったりする。

--------------------------------

# アクセス修飾子
アクセスコントロールは
public と privateが使えればOK

public は 公開
privateは非公開

ちなみにprivateのメソッドや変数を
クラスのそとから参照しようとすると
「データ、メンバーが見つかりません」でエラーを吐く

--------------------------------

# まとめ

手続き型プログラミングで書きがちだけど
VBAもクラス化を認めているので
積極的につかいましょう。
いじょ

--------------------------------

# おわり
ESP32でiOSにも繋がるBLE Mouse

# 現象
下記ライブラリを使おうとすると、なぜかiPadにつながらない。
[T-vK/ESP32-BLE-Mouse: Bluetooth LE Mouse library for the ESP32 (Arduino IDE compatible)](https://github.com/T-vK/ESP32-BLE-Mouse)

参考：
[ESP32をBluetoothキーボードやマウスにする - Okiraku Programming](https://neocat.hatenablog.com/entry/2019/09/28/151947)

# 対策
Issues見てたら、解決方法載ってた。
`~/Arduino/librariers/ESP32-BLE-Mouse`にあるファイルを修正して、exampleをコンパイルして書き込んだら動いた。

そのうち、修正されるかも。

```
delete line 28 in BleMouse.cpp.
// REPORT_ID(1), 0x01, // REPORT_ID (1)
```

[IoS 13 compatibility? · Issue #3 · T-vK/ESP32-BLE-Mouse](https://github.com/T-vK/ESP32-BLE-Mouse/issues/3)

# レポートID
HIDのなんか。深入りしちゃいけない気がしてきた。よくわからん。

[HID/レポートID - おなかすいたWiki！](https://wiki.onakasuita.org/pukiwiki/?HID%2F%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88ID)
[bluetooth lowenergy - iOS ignores input report of Consumer Page of HID over Gatt - Stack Overflow](https://stackoverflow.com/questions/25402502/ios-ignores-input-report-of-consumer-page-of-hid-over-gatt/25745805)
ゼロから始めるLeetCode Day52 「1351. Count Negative Numbers in a Sorted Matrix」

# 概要

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

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

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

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

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

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

Python3で解いています。

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

前回
[ゼロから始めるLeetCode Day51 「647. Palindromic Substrings」](https://qiita.com/KueharX/items/eadca192b6bdea7fedab)

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

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



# 問題
[1351. Count Negative Numbers in a Sorted Matrix](https://leetcode.com/problems/count-negative-numbers-in-a-sorted-matrix/)

難易度はEasy。

`m*n`の行列`grid`が与えられます。その行と列両方とも増加が起こらないような形式でソートされています。
（つまり、要素の値が現状維持、ないしは減少する順である、ということです。）

その`grid`のなかに存在する負の数を返すようなアルゴリズムを設計してください、という問題です。

>Example 1:

>Input: grid = [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]]
Output: 8
Explanation: There are 8 negatives number in the matrix.

>Example 2:

>Input: grid = [[3,2],[1,0]]
Output: 0
Example 3:

>Example 3:
>Input: grid = [[1,-1],[-1,-1]]
Output: 3

>Example 4:

>Input: grid = [[-1]]
Output: 1


# 解法

```Python
import itertools

class Solution:
    def countNegatives(self, grid: List[List[int]]) -> int:
        count = 0
        lists = []
        lists = list(itertools.chain.from_iterable(grid))
        for i in lists:
            if i < 0:
                count += 1
        return count
# Runtime: 128 ms, faster than 63.80% of Python3 online submissions for Count Negative Numbers in a Sorted Matrix.
# Memory Usage: 14.9 MB, less than 20.02% of Python3 online submissions for Count Negative Numbers in a Sorted Matrix.
```

こんな感じです。
まあ各要素をとりあえずfor文で回すのは想像が付くと思います。

ただ、[`itertools.chain.from_iterable`](https://docs.python.org/ja/3/library/itertools.html#itertools.chain.from_iterable)についてはそこまで馴染みがない人もいらっしゃるのではないでしょうか。

>chain() のためのもう一つのコンストラクタです。遅延評価される iterable 引数一つから連鎖した入力を受け取ります。この関数は、以下のコードとほぼ等価です:

> ```Python
def from_iterable(iterables):
    # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
```

公式ドキュメントにもある通り、以上のように動きます。
ちなみにchain()の方は以下のような説明がされています。

>
itertools.chain(*iterables)
先頭の iterable の全要素を返し、次に2番目の iterable の全要素を返し、と全 iterable の要素を返すイテレータを作成します。連続したシーケンスを一つのシーケンスとして扱う場合に使用します。およそ次と等価です:

> ```Python
def chain(*iterables):
    # chain('ABC', 'DEF') --> A B C D E F
    for it in iterables:
        for element in it:
            yield element
```

何が違うんだよ！となるかもしれませんが、
[chain, chain.from_iterableの紹介(pythonのitertoolsを使いこなすために)](https://qiita.com/shihono/items/1544f8128cb78442aaaa)
こちらの記事でよく解説されており、こちらを参照した方が速いため紹介させていただきます。

楽ができるのはPythonの良いところですね。


話変わりますけどPythonの勉強会（オンライン開催）に参加しました。久しぶりに勉強会に参加したのでそちらの方が楽しくて更新が遅れてしまいました。
そちらについての記事（おそらくSphinx）についての記事も書く予定なのでよければ見てください〜。

今回はここまで。お疲れ様でした。
100兆の階乗の25兆桁めの数字は？【python】

#概要
「100兆の階乗の25兆桁目の数字を求めよ(表記は10進法）」という問題をpythonで解いてみました。（元ネタは「[100兆の階乗の右から数えて25兆番目にある数字は偶数であるか奇数であるか](https://yudai214.hatenadiary.org/entry/20101215/1292382875)」という有名な問題です)
#方針
100兆の階乗を愚直に求めると計算資源が足りませんので、ある程度効率的に計算する工夫をします。

一般的に$n!$の$k$桁めの数字を求める問題を考えます。まず、$n！$の右側に0が何個連続するかを考えます。これは$n!$を$2$または$5$で割り切れる回数をそれぞれ$c2$,$c5$とすると、$\min(c2,c5)$です。今回は明らかに$c2>c5$なので、$0$が$c5$個連続するとわかります。
したがって$n!$の$k$桁目の数字を求めるには$n!/10^{c5}$の$k-c5$桁目の数を求めればよいです。これは$k-c5$がある程度小さければ、効率的に求めることができます。

やり方としてはまず、階乗を構成する数字のうち、$5$の倍数を除く奇数を全てかけ合わせた値を$M=10^{k-c5}$を法として求めます。$M$を法としたときは、$M$ごとに値がループするので、M以下の数の積についてだけ求めて、それを$n//M$倍し、さらに中途半端に余る$n$ mod $M$について計算した積を乗じればよいです($//$は余りを切り捨てたわり算の結果を求める演算とします)。計算量は$O(M)$です。
次に、飛ばしていた偶数部分($2\times 4\times 6\times ...)$の処理について考えますが、これは各要素を2で割ると、$(n//2)!$になるので、上記の$5$の倍数を除く奇数をすべて掛け合わせた積を求める操作を再度行うことができます。この処理を再帰的に繰り返すことで、求めたかった値が得られます。また5の倍数の部分についても似たような処理でMを法とした値を求めることができます。合わせてループの回数は$O((\log n)^2)$です。

上記の計算が終わったら、計算を後回しにしていた2の処理をします。と言っても$2^{c2-c5}$を乗じるだけです。下記コードで$O((\log n)^2 + M)$の計算量で解けます。

答えが7となったのですが、あっているでしょうか？どうやって検算したらよいかわかりません。
#コード

```Python
#n!のk桁めの数字を出力する
def calc(n,k):
  #n!は5で何回割り切れるか
  c5=0
  n_tmp=n
  while n_tmp>0:
    n_tmp//=5
    c5+=n_tmp
  #もしk<c5なら0を出力して終了
  if k<=c5:
    print(0)
    return
  #n!は2で何回割り切れるか
  c2=0
  n_tmp = n
  while n_tmp>0:
    n_tmp//=2
    c2+=n_tmp
  #n!//(5**c5)//(2**c2)をmod(10**(k-c5)）で求める
  #計算量がO(10**(k-c5))程度になるので、a-c5が大きすぎる（例えば>9)とこの方法は使えない。
  M=10**(k-c5)
  #1!~M!をmod M で求める
  d = [1]*M
  r=1
  for i in range(1,M):
    if i%5==0 or i%2==0:
      d[i]=d[i-1]
      continue
    r*=i
    r%=M
    d[i]=r
  d[0]=d[M-1]
  #nをループのたびに5で割りながら、5の倍数を除く奇数部分の積を求める操作を繰り返す
  r,n_tmp = 1,n
  while n_tmp>0:
    n_tmp2 = n_tmp
    while n_tmp2>0:
      if n_tmp2>=M:
        r*=pow(d[0],n_tmp2//M,M)
      if n_tmp2%M != 0:
        r*=d[n_tmp2%M]
      r%=M
      n_tmp2//=2
    n_tmp//=5
  #2を乗じる
  r*=pow(2,c2-c5,M)
  print(str(r%M+M)[1])

calc(10**14,25*(10**12))
```
Laravelの「暗黙の結合」について

# な、なんで勝手にレコード情報取得できるの？
以前、Laravelの参考書でCRUDアプリを勉強しているときでした。
参考書にこの様なコードが書かれていました。

```php5:routes/web.php
Route::post('booksedit/{books}' function(Book $books){
   return view('booksedit',['book'=> $books]);
});
```

とりあえずコードを打ち込んでみた後、思いました。
「…あれ？なんで、Bookモデルに目的のレコードを探すidを渡してないのに、
$booksのなかには既にidで絞り込まれた後のレコード情報が入っているの！？」

# それは「暗黙の結合」ってヤツだった！
この「URLに指定した{books}セグメントの値だけで、勝手に目的のレコード情報が取得できる」現象は、
調べてみると「暗黙の結合」というマジックらしいということが分かりました。
https://readouble.com/laravel/master/ja/routing#implicit-binding
（↑チュートリアルに詳細が書いてあります）

>Laravelは変数名とルートセグメント名が一致する場合、LaravelはルートかコントローラアクションでEloquentモデルが定義されていると、自動的に依存解決します。

上記コードのケースでは、ルート上で定義されたEloquentの$books変数と、ルートのURLの中の{books}セグメントの名前が一致しているために、リクエストされたURLに対応する値に一致するIDを持つ、モデルインスタンスを自動的に生成するみたいです。

簡単に言うと、URLにある{books}と、モデルの$books変数の名前が一緒だね！
それじゃ、こちらでURLの{books}のid情報をモデルインスタンスの$booksに渡してくるわ！
という感じになるみたいです。

# 暗黙の結合を使用してみた感想
正直、自分は最初このモデル結合ルートの機能が理解できませんでした。

「なぜリクエストされたURIのIDだけで、モデルのレコード検索ができちゃうの？」
「どうしてID情報いれないでモデルのレコード検索できちゃうの？」
って感じでした。

もちろん「暗黙の結合」は慣れてみるとコードが見やすくなったな！
って実感できます。
ヴォ―サイトへのプログラム書いてみた

# 正直いちいちめんどくさいことしたくない
ゲストでブラウザ開けてP*rnh*b開けて毎回ログインするのがめんどくさい。自動化したい。ということで書いてみた。

```script.pornhub
<begin = script>

object:
    browser set ["Microsoft Edge","Guest"]
    webvideo:["https:jp.pornhub.com"]
    acount:eroitencho
    password:***** @passwordは個人情報のため文字数及び内容を伏字にしてます。

<script = sh>
#!/bin/sh
BROWSER=open web-browser $object["browser"[0]] | mode $object["browser"[1]]
if [ $BROWSER -eq -QuitErr ] then
    close
    exit 1 
fi
SITE=open set-browser $BROWSER | open web-site $object."webvideo"[0]
if [ SITE -eq -QuitErr ] then
    close $BROWSER
    exit 1
fi
ACOUNT = open set-site $SITE | open log-in -acount object["acount"] -password object["password"]
if [ ACOUNT -eq -QuitErr ] then
    close $SITE | close $BROWSER
    exit 1
fi
</script>

```
クラスと構造体の違い

# 結論
ほぼ同じ機能である
しかし、行う処理によってパフォーマンスに大きな差がでる

# 大きな違い
両者の大きな違いはメモリ上の動きである
クラスは**参照型**で構造体は**値型**である。
参照型を配列等で宣言するとメモリ領域確保の大きなコストがかかる(具体的に例示したい・・・)
逆にデータ受け渡しの場合は参照型は参照先を渡すのでコストはそこまでかからないが、値型をデータをコピーしているため、
コストが多くかかる。(ここも例示したい)

疑問点
参照型の参照渡しってどうなるだろうか
Flutter入門してみた

# 概要
FlutterはDart言語で書かれた1つのコードからiOSとAndroid、両OSにアプリをビルドすることができる、アプリケーションフレームワークです。（※ Webアプリも作れるらしい）

ちょっと気になったので、練習用にGitHubリポジトリを検索できるアプリを作成してみました。

今回の記事は、そのアプリの紹介と、それを制作するまでに参照した情報の共有記事となります。

# 作ったアプリ
![デモ画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142886/e57e5ffe-2976-6dd1-0f9f-354a07ce0de5.gif)
## 機能
- githubレポジトリ検索
- リポジトリのweb表示
- お気に入り追加
- お気に入り一覧表示

## 開発環境
- flutter : 1.17.3
- Dart : 2.8.4
- OS : Windows 10 / MacOS Catalina
- IDE : Android Studio / Visual Studio Code
 
最初はiOSシミュレータを利用するためにMacで開発していましたが、Windows環境はマルチモニタを使えるようにしてたので、最終的にWindowsで開発を進めました。

また、IDEは最初AndroidStudioを使ってたんですが、GoogleI/OやGoogleDevelopersのFlutter講演等を見てると、皆さんVSCodeを使っていたので、感化されて最終的にVSCodeで進めていきました。

この辺、自身の状態に合わせて柔軟に環境を調整できるところはすごく良いですね。

## GitHubのリンク
**flutter_first_demo**
https://github.com/becky3/flutter_first_demo

## 参考にしたアプリ
Flutterを使った同じ題材のアプリを作られている方がいらっしゃったので、
以下記事を参考にさせていただきました。

**【Flutter】BLoCパターンでアプリを作成してみた。~カウンターアプリ、githubリポジトリ検索アプリ~**
https://qiita.com/tetsukick/items/2b23885e5b91afff9536

**【Flutter】GitHubリポジトリを検索するサンプルアプリ作った**
https://qiita.com/rkowase/items/56f6606b7e101d939e10


# Flutter入門として参考にした記事
## 【入門】はじめての Flutter
https://qiita.com/nskydiving/items/4fcf0dbad923d50601f9
タイトルの通り、入門記事です。　セットアップから、サンプルコードのビルドまで端的にまとめられていて非常に参考になりました。

## Flutter 全部俺 Advent Calendar 2019
https://adventar.org/calendars/4140

`itome` さんによる、全部一人で書かれたというFlutterのAdvent Calendarです。
記事内に、何日後の記事に詳しく書くみたいな書き方をされてるので、
かなり計画的に記事を書かれていたのだと思います。

まず、お一人で毎日この分量を書かれた事がすごいですが、Flutterについての記事からDart入門、レイアウト構造、アニメーション、テスト、Blocを用いた設計など、幅広い内容に言及されていて、この記事を一通り読むとかなり理解が進むのではないかと思います。

## 基礎から学ぶFlutter
https://amzn.to/3cPzJxR
[![基礎から学ぶFlutter](https://m.media-amazon.com/images/I/51-5xUYoo-L._SL160_.jpg)](https://amzn.to/3cPzJxR)

`石井幸次` さんの著書です。
こちらもFlutterのかなり幅広い内容を取り扱われています。
特に、widgetの種類が豊富に取り扱われている部分は、俯瞰に役立ちました。

## InheritedWidget を完全に理解する
https://medium.com/flutter-jp/inherited-widget-37495200d965

`mono` さんも多くの記事をアップしてくださっています。
Flutterはツリー状に構成されるwidgetが特徴的ですが、その参照方法の一つとして
InheritedWidgetについて、詳しく書かれた記事です。

最初このあたりの使い方がよくわからなかったのですが、実際コードを書いていくうちに少しずつ理解ができました。

## Google I/O 動画
Google I/Oでのライブコーディング動画です。
実際にコードを書いているところを見ると、具体的にイメージが湧くのですごく参考になりました。
例えば、widgetの部分については、ネストが深くなりがちなので、手作業で書いているとカッコが分けわからない状態になったりして、かなり苦しい思いをしました。
そのあたりについて、ライブコーディングでは、IDEの機能でwidgetの上位層に新たなwidgetを挿入をしたり、位置を入れ替えたりしてたので、こういうふうに書いていくのかと、すごく参考になりました。

**Build reactive mobile apps with Flutter (Google I/O '18)**
https://youtu.be/RS36gBEp8OI

**Pragmatic State Management in Flutter (Google I/O'19)**
https://youtu.be/d_m5csmrf7I

### 海外技術記事を見るときに役立つツール
と、英語動画を２つ参照しましたが、自分はほぼ英語ができません。
なので、 `Language Learning with Youtube` と言う、英語動画の字幕を翻訳して表示してくれるChrome拡張を使いながら視聴しました。
これを使えば今後、海外講演情報へかなりリーチできそうです。

以下、ツールの紹介記事です。
**YouTubeでの英語学習がはかどるGoogle Chrome拡張機能【今日のライフハックツール】**
https://www.lifehacker.jp/2020/06/lht_learning-language-with-youtube.html

# あとがき
Flutterを触ってみて、Widget周りの書き方については、きちんと学ばないとネストがすごい事になって、すぐにメンテナンスできないコードになりそうといった印象を持ちました。
ただし、BLoCアーキテクチャやProviderを使ってのパターンの情報も多く共有されているので、今後はその辺を重点的に見ていこうと思います。
Macでbrew installしたEmacsがdyldのエラーで起動しなかったので再インストールしたら動いた。


# エラー
いつの間にか動かなくなってた。なぜに！？

```
% emacs                                       
dyld: Library not loaded: /usr/local/opt/libffi/lib/libffi.6.dylib
  Referenced from: /usr/local/opt/p11-kit/lib/libp11-kit.0.dylib
  Reason: image not found
zsh: abort      emacs
```

# 対策
[macos - Emacs stop working in Mac OSX Catalina. How to fix? - Stack Overflow](https://stackoverflow.com/questions/59582101/emacs-stop-working-in-mac-osx-catalina-how-to-fix)
を見ると、
`brew reinstall emacs`
で直ったって書いてある。

試したら、動いた。なんやねん。

# 調べたこと
## dyld
ダイナミックリンカー
[macOS High SierraやiOS 11では「dyld 3.0」が導入され、システムアプリの起動が最大25%程度高速に。 | AAPL Ch.](https://applech2.com/archives/20170705-apple-shipping-dyld-3-macos.html)
Metabase x Bigqueryを連携で java.util.ArrayList cannot be cast to java.lang.String エラーを解消

## 背景
5月から働いている会社では、 `firebase` x `react`x `typescript` を利用してサービスの開発を行っています。

またマーケ等で使われるような BIツールとして `metabase` を使っていてデータの取り込みを `Bigquery` から行っています。

`Firestore` -> `cloud storage` -> `Bigquery` -> `Metabase`

リリース前に実際に使っていく中、、、気づく！

解決方法だけを見るときは下まで一気に進んでください :)

## 発覚
いくつかのデータテーブルが開くことが出来ない！

![Screen Shot 0002-06-10 at 21.35.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94541/4fc38966-0483-98b7-529e-f14db2f5d2f1.png)

なんかエラーが出ているけどわからん。

` java.util.ArrayList cannot be cast to java.lang.String`

ということで、

ココらへんをポチポチしてなんでかを見て回ったら

![Screen Shot 0002-06-10 at 21.37.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94541/530ca96c-0f06-05fc-f0b3-a5960d001069.png)

どうにも Bigquery側で `type: INTEGER` x `mode: REPEATED` になっているとエラーになることがわかる。

簡単に言うと ARRAY<INT> 型のデータを`Metabase`側に渡すとエラーが発生することがわかる

https://github.com/metabase/metabase/issues/10275

１年前にも同じ問題が、、そして解消はされていない。
ということでいくつかやり方は有りましたが、取り急ぎすぐできそうなやつで対応していきます！

### やり方候補
1. `firebase functions`を使って データをbigqueryまで`格納`しているのでその間に`functions`で `int -> string` に変更するようにする
2. `Bigquery`の`View`で対応する

今回はもちろん手軽な **2** でいきます

## 解消方法手順

### Bigquery側作業
1. Viewの作成 参考: [ビューを作成する](https://cloud.google.com/bigquery/docs/views?authuser=6)

#### 変換方法１
対象のデータに対して ARRAY<INT> -> ARRAY<STRING> に変換する

```sql
SELECT 
  ARRAY(
    SELECT 
      CAST(favoriteId AS string)
    FROM 
      UNNEST(favoriteIds) AS favoriteId
  ) AS favoriteIds,
FROM
  `project-name.project_database.table`
```

#### 変換方法２
`UDF(User Defined Functions)` とやらを使えば `View` の中からでもファンクションを呼ぶことができるらしいと知ったので、ちょっとだけ挑戦してみた。
`UDF`でなくて `TEMP` functionだと `View` の中ではエラーになるので気をつけてください

##### UDFの作り方

```sql
CREATE OR REPLACE FUNCTION 
  `project-name.project_database.functionName`(intArr ARRAY<INT64>) 
RETURNS 
  ARRAY<STRING> 
  AS (
    ARRAY(
      SELECT CAST(value AS string) 
      FROM UNNEST(intArr) AS value
    )
  );
```

##### UDFの呼び方

```sql
SELECT 
  `project-name.project_database.functionName`(favoriteIds) AS favoriteIds
FROM
  `project-name.project_database.table`
```


### Metabase側作業
Bigquery側でViewの作成が完了したら、あとはmetabaseだけなので簡単です!

1. Metabase Adminに入る
2. Database下のfirestoreを選択
3. `Sync database schema now` ＆`Re-scan field values now` をクリック

## 感想
まぁ今回は取り急ぎ感も出ましたが一応データを`Metabase`で確認することができるという目的が達成できてよかったですが、直してみたい気持ちがあり見てみた `Clojure`で作られていた。

触ったことねーーーーー

ということで今回の記事は根本の解決策まで行きませんでしたが、最低限目的を達成することには何かしらの手助けができるのではないかと思います。

なにか他のいいやり方あったら教えて下さいーー
AtCoder 生活　75日目

[前回](https://qiita.com/flandrescarlet237/items/fdb602d0b755afb14c29)

#75日目
今回は茶色diffの問題を3問解きました。

|問題|難易度|自力で解けた|かかった時間|
|:-:|:-:|:-:|---|---|
|ABC003|C|◯|53分33秒|
|CODE FESTIVAL 2015 予選B|C|◯|27分35秒|
|ABC051|B|◯|36分57秒|


##[ABC003_C](https://atcoder.jp/contests/abc003/tasks/abc003_3)

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    int n,k;
    cin >> n >> k;
    vector<double> r(n);
    rep(i,n) cin >> r[i];
    sort(r.begin(),r.end());
    double ans = 0;
    for(int i = n-k;i < n;i++){
        ans = (ans + r[i]) / 2;
    }
    cout << fixed << setprecision(10) << ans << endl;
}

```

解くのにかかった時間：53分33秒


##[CODE FESTIVAL 2015 予選B_C](https://atcoder.jp/contests/code-festival-2015-qualb/tasks/codefestival_2015_qualB_c)

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    int n,m;
    cin >> n >> m;
    vector<int> a(n),b(m);
    rep(i,n) cin >> a[i];
    rep(i,m) cin >> b[i];
    sort(a.rbegin(),a.rend());
    sort(b.rbegin(),b.rend());
    bool ok = true;
    if(n < m) ok = false;
    else{
        rep(i,m){
            if(a[i] < b[i]){
                ok = false;
                break;
            }
        }
    }
    if(ok) cout << "YES" << endl;
    else cout << "NO" << endl;
}

```

解くのにかかった時間：27分35秒


##[ABC051_B](https://atcoder.jp/contests/abc051/tasks/abc051_b)

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    int k,s;
    cin >> k >> s;
    ll ans = 0;
    rep(x,k+1){
        rep(y,k+1){
            int z = s - x - y;
            if(0 <= z && z <= k) ans++;
        }
    }
    cout << ans << endl;
}

```

解くのにかかった時間：36分57秒


###最後に
もっと早く解けるようにしたい

難易度|かかった平均時間|解けた問題数|
|:-:|---|---|
|B|36分57秒|1問中1問|
|C|40分34秒|2問中2問|