OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】演算子について

Pythonの演算子について簡単にまとめてみました。

1. 数値演算子について
2. 代入演算子について
3. 比較演算子について

# 1. 数値演算子について

数値演算子は、代数演算子や算術演算子とも言われるようです。
数値演算子には、[ + ] や [ - ]などの演算子があります。

|  数値演算子  |            意味             |
|---------|----------------------------|
| a + b   | 足し算                      |
| a - b   | 引き算                      |
| a * b   | 掛け算                      |
| a / b   | 割り算(小数点あり)            |
| a % b   | 余りの計算(aをbで割った時の余り)|
| a ** n  | べき乗(aをn回掛けた数)        |
| a // b  | 割り算(小数点なし)            |

```
print(1 + 1)
→　2

print(10 - 2)
→　8

print(2 * 5)
→　10

print(10 / 5)
→　2.0
print(10 / 4)
→　2.5

print(10 % 4)
→　2

print(2 ** 5) # 2 x 2 x 2 x 2 x 2 = 32
→　32

print(10 // 4)
→　2
```

# 2. 代入演算子について

代数演算子には下記の演算子があります。
数値演算子と組み合わせた代入演算子を「累算代入演算子」と言います。

|代入演算子  |意味           |
|-------|--------------|
|a = b  |a に b を代入する|

|累算代入演算子  |意味           |
|-------|--------------|
|a += b |a = a + b と同意|
|a -= b |a = a - b と同意|
|a *= b |a = a * b と同意|
|a /= b |a = a / b と同意|
|a %= b |a = a % b と同意|
|a **= n|a = a ** b と同意|
|a //= b|a = a // b と同意|

```
a = 10
print(a)
→　10

a = 10
a += 2
print(a)
→　12

a = 10
a -= 2
print(a)
→　8

a = 10
a *= 2
print(a)
→　20

a = 10
a /= 2
print(a)
→　5.0

a = 7
a %= 2
print(a)
→　1

a = 2
a **= 5
print(a)
→　32

a = 7
a //= 2
print(a)
→　3
```

# 3. 比較演算子について

比較演算子には下記の演算子があります。

|  比較演算子  |            意味             |
|---------|----------------------------|
| a == b      | a と b は等しい           |
| a != b      | a と b は異なる（等しくない）  |
| a < b       | a は b よりも小さい        |
| a > b       | a は b よりも大きい        |
| a <= b      | a は b 以下である　　　　　|
| a >= n      | a は b 以上である　　　　　|
| a is b      | a と b は等しい　　　　　　|
| a is not b  | a と b は異なる（等しくない） |

```
a = 2
b = 3

print(a == b)
→　False

print(a != b)
→　True

print(a < b)
→　True

print(a > b)
→　False

print(a <= b)
→　True

print(a >= b)
→　False

print(a is b)
→　False

print(a is not b)
→　True
```

今回は自身で学習した範囲でまとめてみましたが他にも、
ブール演算子や文字列演算子、ビット演算などもあるようですので、
ご興味のある方はぜひ調べてみてください。

少しでも参考になれば幸いです。
numpyを使ってみる

numpyを使ってみます。

```python
import numpy as np
```

# np.array
配列を作ります。  

```python
sample_array = np.array([1,2,3,4,5])
sample_array
```

## shapeに関して
```python
sample_array.shape # (5,)

sample_array.reshape(-1,1).shape # (5, 1)
```

reshapeのエラーメッセージにはだいたいこれで対応。

## 文字列と数字の格納
```python
np.array([1,2,"A"])
# array(['1', '2', 'A'], dtype='<U21')
```
数値型と文字列型を同時に入れると、全て文字列として扱われる。

# np.zeros()
0の連続する配列を作ります。初期化配列に使ったりする。

```python
np.zeros(10)
# array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

# 2行3列を0で埋めておく
np.zeros([2,3])

# 1もできる
np.ones(5)
# array([1., 1., 1., 1., 1.])
```

# 演算
リストで計算するのと比べると、便利な演算機能です。

```python
sample_array + 2
# array([3, 4, 5, 6, 7])
```

## リストと比較
```python
sample_list = [1,2,3,4,5]
sample_list + 2 # エラー
```

```python
sample_list = [1,2,3,4,5]
sample_list + [2,2,2,2,2] 
# [3, 4, 5, 6, 7, 2, 2, 2, 2, 2]
```

```python
sample_list = [1,2,3,4,5]
for i in range(len(sample_list)):
    sample_list[i] = sample_list[i] + 2
print(sample_list)
```

# 統計量
```python
# sum
sample_array.sum()
np.sum(sample_array)

# mean
sample_array.mean()
np.mean(sample_array)

# var
sample_array.var()
np.var(sample_array)

# std
sample_array.std()
np.std(sample_array)
```

# 二次元配列
```python
sample_array_2 = np.array(
        [[1,2,3,4,5],
        [6,7,8,9,10]])

sample_array_2
# array([[ 1,  2,  3,  4,  5],
#      [ 6,  7,  8,  9, 10]])

sample_array_2.shape # (2, 5)
```

# np.arange
数列の作成

```python
# 初項１、公差１の等差数列を６にあたるまで作る（６は含まず）
np.arange(start = 1, stop = 6, step = 1)
# array([1, 2, 3, 4, 5])

np.arange(start=0.1, stop=0.8, step=0.2)
# array([0.1, 0.3, 0.5, 0.7])
```

# np.linspace
数列の作成

```python
# -2から2までの等差数列を連続的に作る
np.linspace(-2,2)

# plotで直線・曲線を描く際にx軸でたどる範囲に指定するような使い方もされる
```

```python
# ０から１０の区間に数値を等間隔で１１個配置した数列
np.linspace(0, 10, 11)
# array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])
```

# np.tile
同じ値を複数格納

```python
np.tile("A",5) # array(['A', 'A', 'A', 'A', 'A'], dtype='<U1')
np.tile(0,4) # array([0, 0, 0, 0])
np.zeros(4) # 同じ
```

# np.random.choice
```python
sample_array = np.array([1,2,3,4,5])


# 3つの非復元抽出
np.random.choice(sample_array, size=3, replace = False)

# 3つの復元抽出
np.random.choice(sample_array, size=3, replace = True)
```

# np.random.seed()
```python
# randomの出力を固定する
np.random.seed(1)
np.random.choice(sample_array, size=3, replace = False)
```

行列の計算もとても便利なので、そのうち追記します。
AtCoder自分用まとめ002(ABC086A Product)

#概要
自分のために、AtCoderで身に付けた内容・コードをまとめておく。

#内容
https://atcoder.jp/contests/abs/tasks/abc086_a
>シカのAtCoDeerくんは二つの正整数 a,b を見つけました。 a と b の積が偶数か奇数か判定してください。

```:入力形式
a b
```
出力形式：`Odd` or `Even`

##C
```C
#include<stdio.h>
int main() {
  int a,b;
  scanf("%d %d", &a, &b);
  
  printf(a*b%2 ? "Odd\n" : "Even\n");
  return 0;
}
```
##C++
```cpp
#include<iostream>
using namespace std;
int main(){
  int a,b;
  cin>>a>>b;

  if (a*b%2==0){
    cout<<"Even"<<endl;
  }
  else {
    cout<<"Odd"<<endl;
  }
}
```
##C++\<bits/stdc++.h\>
```cpp
#include <bits/stdc++.h>
using namespace std;
int main(){
  int a,b;
  cin>>a>>b;

  if (a*b%2==0){
    cout<<"Even"<<endl;
  }
  else {
    cout<<"Odd"<<endl;
  }
}
```
##Python3
```python
a, b = map(int, input().split())

if a*b%2==0:
  print("Even")
else:
  print("Odd")
```
##Haskell
```haskell
main :: IO ()
main = do
  [a, b] <- map read . words <$> getLine

  putStrLn $ if odd (a * b) then "Odd" else "Even"
```

##Racket
```racket
#lang racket
(define a (read))
(define b (read))
(display (if (even? (* a b)) "Even" "Odd"))
(newline)
```

##Vim(人間向け)
```vim
:normal "adw"bdw
:put! = @a * @b % 2 == 0 ? 'Even' : 'Odd'
:wq
```
##Vim(ゴルファー向け)
```vim
f r*0C<C-R>=<C-R>"%2?"Odd":"Even"
<Esc>ZZ
```
※実際には、\<C-R\>\<Esc\>はそのまま入力しているので見えない。Enterも。

#参考にさせていただいたページ
- https://atcoder.jp/contests/abs/tasks/practice_1
- [AtCoder に登録したら解くべき精選過去問 10 問 を Vim で解いてみた](https://qiita.com/hakatashi/items/bda8547114c8aecc93cb)
- https://frfrfrfr.hatenablog.com/entry/2018/03/25/125457
- https://pizzacat83.hatenablog.com/entry/2020/02/10/000447

#感想
もう少し慣れたら書き直したい。。
巨人たちに感謝。
シャドーDOMの使い方

##シャドーDOMの使い方
shadow domとはカプセル化したdom treeを画面上のエレメントに動的にアタッチする手法のことです。このサブdom treeには外部cssの影響を受けず、独自で指定されたcssのみが適用されます。どういう場面で使うべきというと、外部のcss（例えばプロジェクト全体に影響を及ぼすstyle.css）の影響を受けたくない場合、html要素をshadow domにすれば実現可能です。

・基本的な使い方
`let shadow = elementRef.attachShadow({mode: 'open'});`
shadow domをつける要素に対してattachShadowメソッドを呼び出して、この要素にshadow rootをつけた同時に、それの参照をもらい、この要素自身もshadow hostとなります。
オプションmodeをopenにすると、elementRef.shadowRootで外部のJavascriptからshadow rootへのアクセスを可能になります。falseに設定すると、.shadowRoot呼び出してもnullしか返ってこなくなります。
attachShadow呼び出し前: element
attachShadow呼び出し後: element(shadow host) →　shadow root

`shadow.appendChild(document.createElement('b'));`
`shadow.appendChild(document.createElement('style'));`
shadow dom treeはすでに作成済みです、中に要素をどんどん追加しましょう。追加されたstyley要素はshadow dom tree内にあるものにしか適用されないです。
appendChild呼び出し前：element(shadow host) →　shadow root
appendChild呼び出し後：element(shadow host) →　shadow root　→　b

作成されたdom要素をdev toolsでスクショをとってみた：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107459/f48e277c-e4df-db45-4bfd-3b9bbf044976.png)

参考記事：
https://developer.mozilla.org/ja/docs/Web/Web_Components/Using_shadow_DOM
「あたりまえ探し」をやってみた【ふりかえり】

# はじめに

先輩に教えてもらい感動した**[ふりかえりカタログ](https://qiita.com/viva_tweet_x/items/cc3bad3bd298406b6cc7)**。
この中から気になった手法を実際にやってみて、その感想を書いていきます。

今回は「あたりまえ探し」です。
人数5人、時間10分で行いました。

# やってみた

### 手順
* COWCOWさんの「あたりまえ体操」を全員で見る
  * #1 を見ました。　→　https://www.youtube.com/watch?v=G0zRBRUQils
  * みんな程よくクスッとなりました。（重要）

* 「チームにとってあたりまえなこと」を付箋に書いてどんどん上げていく（どんな些細なことでも気にせずどんどん上げる）
  * 今回はオンライン会議だったので**[Microsoft Whiteboard](https://www.microsoft.com/ja-jp/microsoft-365/microsoft-whiteboard/digital-whiteboard-app)**を使いました。
  * 時間は3分間で行いました。（これ以上長くはしない方がいい？）

* 出た「あたりまえ」を全員で共有・確認する
  * 時間は5分ほど。

### 実際に出た「あたりまえ」の例
* デイリースクラムの時間が楽しい
* オンライン会議の時は皆カメラオン
* 皆カイゼン志向を持っている
* 誰かが忙しい時は他の人が助けてくれる　等・・・

### イメージ図
![イメージ図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558315/f2424f63-905b-050d-021b-c21f4894a1a8.png)


# 感想
* あたりまえ体操を最初に見ることで、良い意味で気楽にふりかえりに臨める。
* 付箋であたりまえを上げていく時間は、そんなに長く取らない方が良いと思う。
  * ぱっと思いついたものが本当のあたりまえな気がするから
* ポジティブな意見が出やすい印象。
* 根本的な課題解決などには向かなそう。

# まとめ
### こんなチームにおすすめ
**チームとして既にある程度の期間活動しているが、まだあまり「ふりかえり」を行ったことが無い**

* ふりかえりカタログで「ふりかえりの場を作る」と位置付けられている通り、ふりかえりのハードルを下げるという目的にピッタリな手法だと思います。
* 逆に、チームの課題を深堀したり改善したりすることにはあまり向いていないので、あくまでふりかえりに慣れるための導入として活用するのがおすすめです。

**最近ちょっと雰囲気が良くない**

* ポジティブな意見が出やすく場の空気が温まるので、チームの雰囲気を良くしたい場合などにも使えます。

ふりかえり大切。
論文まとめ：Depth from Videos in the Wild: Unsupervised Monocular Depth Learning from Unknown Cameras の（２）

# はじめに

CCV2019より以下の論文
[1] A. Gordon, et. al. "Depth from Videos in the Wild: Unsupervised Monocular Depth Learning from Unknown Cameras" ICCV2019.
のまとめ、その（２）

その（１）はこちら
https://qiita.com/masataka46/items/a509381657b98adc6036 

ここではオクルージョン対応、ネットワーク、ロス、実験結果について。

# 物体のオクルージョン対応
この論文の特徴の１つ。

以下の図のようにカメラ位置の変化によりオクルージョンが発生する。

![DfV_img02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/d74b973b-4c08-0e74-a228-68921c98c343.png)

図の上で２つの物体（線）をカメラから見てる。赤が左位置のカメラから見た場合、青は右位置のカメラから見た場合。下の図は各視点から物体を見た場合のdepth map。

例えば左カメラから物体を見ると、depth mapは左下の赤の実線（$z\_L$）のようになるだろう。

一方で右カメラから物体を見ると、depth mapは右下の青の実線（$z\_R$）のようになるだろう。ここで注意点は、左カメラから見た場合に隠れていた奥の物体の一部が右カメラでは見える点。

右カメラのdepth mapをtransformすると、左下図の青い点線（$z\_R'$）となるだろう。右カメラから余分に見えていた部分は緑の領域のように手前の部分と奥の部分で重なってしまう。つまり奥の物体の一部がオクルージョンしている。

この状況に対応するため、lossの際には $z\_R' < z\_R$ とする。そうすると緑の領域が弾かれる。

# ネットワークのアーキテクチャ
ネットワークは

1. 単眼RGB画像からdepthを推定するもの
2. 2枚の隣接するRGB画像からカメラの外部パラメータ、内部パラメータ、物体の動きを推定するもの

の２つ。

## 1) depthを推定するネットワーク
ResNetのblock18個からなるUNet構造。最後の活性化関数はsoftplus。

## 2) カメラ内部・外部パラメータや物体の動きを推定するネットワーク
FlowNet（[2]）のようなUNet構造。

# loss

1. depth に関しては occulusion aware な上記のオクルージョン対応したもの） L1
2. 移動物体に関しては occulusion aware な cycle consistency を用いる
3. SSIM も使うがオクルージョン対応で修正している

# 実験と結果

## 定量的評価

KITTI datasetを用いた場合のdepthの各メトリクス類の他モデルとの評価値は以下。

![DfV_img04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/32c8cfef-7e79-c87c-601e-b11d7d656aa2.png)

SOTAを達成。

## 定性的評価
以下はYouTube8M 

![DfV_img03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/e21f3e03-4cda-406e-51e4-87c2a96e140b.png)


このデータではカメラの内部座標は不明だが、ちゃんと推論できている。
リモートサーバーなんだけどbrowser-syncでCSSをstream更新したい

##動機

ローカルでWordPressなどの環境を作るのが面倒なので、サーバーはリモートのサーバーを使いたい。
CSS（SCSS）の編集はローカルでgulpを使用して行うが、変更内容はブラウザをリロードすることなくstreamで反映して欲しい。

##実装

大事な部分だけ。
CSSの更新をstream反映するコードのサンプルはよそにいっぱいあるので省略。
Basic認証とかかかっていてもこれで大丈夫。

```js
  browserSync({
    proxy: 'http://your.external.server',
    serveStatic: [{
      route: '/wp-content/themes/mytheme/assets/css',
      dir: 'assets/css'
    }],
  })
```
Pythonを使ってAppStore、GooglePlayのランキングを取得

# Pythonを使ってAppStore、GooglePlayのランキングを取得

ランキング取得には[apptweak](https://www.apptweak.io/)のAPIを使い取得
apptweakは独自の課金形態になっておりAPIごとに1〜のCreditsが発生する
無料で200/月Creditsがありテストであれば十分に使うことが可能だった

## 会員登録
apptweakサイトからSign Upから必要情報を入力し登録
![スクリーンショット 2021-03-20 23.26.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/1b5aa44a-2ca0-9913-a53c-005152a3483b.png)

## ダッシュボード
ダッシュボードから利用Creditsや利用リクエストを確認できる
![スクリーンショット 2021-03-20 23.34.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/9adeb0b9-7d01-3abc-bc89-823418ff0861.png)

各API利用にはAPI Tokenが必要Profile & Settings | API Token から取得する
![スクリーンショット 2021-03-20 23.41.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/7794e8c1-b86e-706d-f824-fb76643ac7de.png)

## 各種API

**ドキュメント一覧**

https://www.apptweak.io/documentation

## ランキング

サンプルとしてApp Store ドランゴンクエストタクトのランキングを取得しリスト表示する

apptweak用のPythonパッケージが存在するのでインストール

https://github.com/apptweak/apptweak-api-python-library

```
$ pip install apptweak
```

*サンプルコード*

```Python
import apptweak


apptweak.API_KEY = "XTz"


def main():
    app_id = "1516559313"
    params = {"country": "jp", "start_date": "2021-03-01", "end_date": "2021-03-10", "device": "iphone"}
    json_response = apptweak.Ios.rankings(app_id, params)
    print(json_response)


if __name__ == '__main__':
    main()

```

*レスポンス*

```
{'content': {'ranks': {'6014': [53, 80, 106, 134, 151, 180, 184, 166, 178, 176], '0': [323, 499, 662, 800, 868, 851, 816, 830, 937, 931], '7014': [13, 16, 19, 28, 31, 36, 37, 32, 37, 41], '7015': [7, 11, 16, 20, 23, 31, 31, 28, 25, 32]}, 'max_fetched': {'0': [1492, 1494, 1493, 1492, 1493, 1493, 1492, 1492, 1493, 1492], '6014': [1500, 1499, 1499, 1500, 1500, 1500, 1500, 1500, 1500, 1500], '7014': [1500, 1500, 1500, 1499, 1500, 1500, 1500, 1500, 1500, 1499], '7015': [1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500]}, 'country': 'jp', 'device': 'iphone', 'type': 'free', 'start_date': '2021-03-01', 'end_date': '2021-03-10'}, 'metadata': {'request': {'path': '/applications/1516559313/rankings.json', 'store': 'ios', 'params': {'country': 'jp', 'start_date': '2021-03-01T00:00:00+00:00', 'end_date': '2021-03-10T00:00:00+00:00', 'device': 'iphone', 'id': '1516559313', 'format': 'json'}, 'performed_at': '2021-03-20 15:32:14 UTC'}, 'content': {}}}
```

他にもアプリデータや無料ランキングなど多くのデータを取得することができる

---

いいね！と思ったら LGTM お願いします :clap::clap::clap:

【PR】プログラミング新聞リリースしました！ → https://pronichi.com
【PR】週末ハッカソンというイベントやってます！ → https://weekend-hackathon.toyscreation.jp/about/
リモートデスクトップライセンスサーバーがないためにリモートデスクトップ接続できない

先日、AWS EC2上に構築しているWindows Server 2016のサーバにリモートデスクトップ接続しようとすると、以下のエラーが発生して接続できませんでした。
この問題の解消のために少し調べたので、解決した方法をここに書き残しておきます。
（私が経験したのはEC2インスタンスででしたが、Windows Serverであれば共通の解決策だと思います）

```
ライセンスを提供するためのリモート デスクトップ ライセンス サーバーがないため、リモート セッションは切断されました。
```

## なぜこの問題が発生したか
この問題が発生するのは、リモートデスクトップセッションホストをインストールしてるにもかかわらず、リモートデスクトップライセンスサーバを構築していない場合です。そして、リモートデスクトップライセンスサーバがないということで、サーバのログイン時に```あと○日でリモートデスクトップ接続できなくなる```という旨の警告を無視し続けて180日間経過した場合です。

はい。警告出てたのに無視してました。。。
まあ、なんでかっていうのは、その時ネットで調べてもはっきり解決方法がわからなかったからですね。。。

## そもそもリモートデスクトップセッションホストって？
細かい説明は省きますが、誤解を恐れずに書くと、サーバーに対して3人以上が同時に接続したい場合に使用する機能で、```RDS CAL```というライセンスの契約が必要な機能です。
Widows Serverでは通常、管理作業のために2人までは同時にリモートデスクトップ接続が可能（デフォルトでは1人だが、設定で変更可能）ですが、管理の幅を超えて複数人で同時に（シンクライアントサーバーのように）使用する場合はライセンス買いなさいということです。

当初はこのリモートデスクトップセッションホストについてよく理解しておらず、3人以上で作業したくてインストールしたのですが、結局ライセンス購入が必要ということで使用せずにそのまま放置となってました。。。

## 解決策
### 対象サーバーへ接続
何よりもまずは対象サーバーに入れないと作業ができません。
実機がオンプレであれば直接入ることもできるかもしれませんが、今回はEC2インスタンス。。。
EC2インスタンスだと、セッションマネージャーの設定ができていればCUIで操作できますが、今回はその構築もしておらず。

結果としては、リモートデスクトップ接続を管理モードで実施することで解決しました。

「ファイル名を指定して実行」で以下を入力してリモートデスクトップ接続を起動します。

```
mstsc /admin
```

実行すると、見た目はいつものリモートデスクトップ接続のクライアントが立ち上がるので、管理者ユーザで接続すればサーバーに入れます。

### リモートデスクトップセッションホストのアンインストール
上記の方法でサーバーにリモートデスクトップ接続することはできました。しかし、いつもこの方法で開くのは面倒。。。
ということで、リモートデスクトップセッションホストのアンインストールしましょう。

1. 「スタート」メニューから「サーバーマネージャー」を開く
2. 画面右上の「管理(M)」から「役割と機能の削除」を押下
3. 「枠割と機能の削除ウィザード」で「サーバーの役割」まで「次へ」で進む
4. 「Remote Desktop Services」内の「Remote Desktop Session Host」のチェックを外す
5. ポップアップが表示されるため、内容を確認の上で「機能の削除」ボタンを押下
6. 「枠割と機能の削除ウィザード」で「確認」まで「次へ」で進む
7. 表示内容を確認の上、「削除」ボタンを押下
8. アンインストールが終わったら再起動

## あとがき
知識がないのに余計な機能をインストールしちゃだめですね・・・
あと、警告も無視しちゃだめです・・・

でも、今回の件でリモートデスクトップ接続について以前より深く理解することができました。
もし、誤りや補足がありましたらコメント等でご指摘ください！
このエラーの解決方法 Warning: validateDOMNesting(...): <div> cannot appear as a descendant of <p>

Reactを書いていたら以下のようなWarningエラーが
Consoleに出たので備忘録として残しておく

## 今回出現したエラー文

Consoleに、以下のようなエラー文が出力された

```
Warning: validateDOMNesting(...): <div> cannot appear as a descendant of <p>
```

## エラー文をDeepLで翻訳すると・・・

```
<div>は<p>の子孫として表示できません
```
ん？どういうこと？

## エラーの原因

先ほどのエラー文は
「HTMLの入れ子のルール」に関するエラー

今回は、pタグの中にdivタグを
入れ子にしているからWarningエラーが起きています

pタグの中にdivタグを
入れ子にすることはできないからです

## 解決方法

Reactの場合は関数コンポーネントの
returnでJSXを返している箇所のコードを見て

以下のような
HTMLの構成になっていないか確認する

```react
const Sample = () => {
  return (
   <p>
     <div>pタグにdivは入れられない</div>
   </p>
 )
}
```

もしこのような構成になっているコードを確認したら
以下のようにHTMLの構成を変更してあげればOKです！

```react
const Sample = () => {
  return (
   <div>
     <p>divタグにpタグは入れられる</p>
   </div>
 )
}
```

これで解決できるはずです！

## ところで、なぜpタグにdivタグは入れられないのか？

この質問に対する回答としては

HTML5から「ブロック要素」と「インライン要素」
という概念が廃止されて

入れ子のルールが「コンテンツモデル」
という概念で決まるようになったからです

コンテンツモデルとは**「その要素にはどのカテゴリーのコンテンツを入れていいか」**を決めているルールのことで、タグの入れ子のルールは全てこの**「コンテンツモデル」**で決まっています

だからpタグの中にdivタグを入れると**「あなたの書いたコードはコンテンツモデル的におかしいよ。なので警告出しとくから直してね」**というWarningエラーが出たんですね。Reactは優しい！

この話題に関する詳しい説明は
[この記事](https://webliker.info/46840/#toc_1)が非常にわかりやすいです。

暇な時に軽く目を通しておくと
HTMLをより深く理解できるのでおすすめです！
【iPad】UIActivityViewControllerで共有時にクラッシュする

#現象
iPad端末でのみUIActivityViewControllerで共有画面を表示させようとするとクラッシュする。
iPhoneでは発生せず、OSバージョン関係なくiPadのみで発生。

#原因
**元のコード**
以下がiPhoneでのみUIActivityViewControllerが表示できていたコードです。

```swift
// インスタンス化
let activityVc = UIActivityViewController(activityItems: items, applicationActivities: nil)
    
// 表示
 self.present(activityVc, animated: true, completion: nil)
```

**修正コード**
以下のように表示対象を指定してあげる必要があるみたいでした。
iPhoneはデフォルトの設定で下からニュッとUIActivityViewControllerが出てきますが、iPadではデフォルトの設定がなく、指定をしないとどのViewに対してUIActivityViewControllerを出せば良いのか分からなくなるのが原因みたいでした。

```swift

// インスタンス化
let activityVc = UIActivityViewController(activityItems: items, applicationActivities: nil)

// 表示対象を指定
activityVc.popoverPresentationController?.sourceView = self.view

// 表示
 self.present(activityVc, animated: true, completion: nil)
```

#参考
https://mushikago.com/i/?p=7242
map()メソッドについて【備忘録】

こんにちは！
今回も、開発で、map()メソッドを使う機会があったので、備忘録としてまとめて行きます！

# map()メソッドって...?
<dt>map()</dt>
<dd>map() メソッドは、与えられた関数を配列のすべての要素に対して呼び出し、その結果からなる新しい配列を生成します。
出典)<a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map">MDN Array.prototype.map()</a>
</dd>
<br><dd>配列の各要素をコールバック関数で処理して、関数の戻り値から新しい配列を作って返す。
出典)柳井政和著 『JavaScript[完全]入門』(2021)p.227
</dd>
<br>コールバック関数とは、関数の引数として渡される関数のことです。関数の引数には、文字列や数値などのように、「値」を取りますが、関数を引数に取ることも可能なのです。

今回のmap()メソッドは、引数として渡された関数で行われた処理の結果から、<strong>新しい配列を作る</strong>メソッドなのです！

# map()メソッドの使用例
map()メソッドの使用例は、以下です。

```js
const array = [2, 4, 6, 8];

const arr = array.map(ary => ary*2);

console.log(arr);
/* 実行結果
[4, 8, 12, 16]
*/
```
上記のコードを元に、ちょこっと解説してみます！

最初に配列を用意します。上の例では、配列arrayを用意し、4つの要素を格納しています。

ここで、例えば、配列の要素を全て2倍にしたいと思ったとします。map()メソッドの登場です。
map()の引数として、関数が渡されていますね？(コールバック関数)
その関数の中で、``ary*2``と言う処理が行われています。
この処理は、最初に作った配列arrayの要素全てに対して行われます。

このコールバック関数での処理の結果を戻り値として、これらを使って、新しい配列が作られます。

# まとめ
map()メソッドとは、引数に渡した関数で元の配列の要素それぞれに対して処理を行い、その処理結果から新たな配列を作り出すメソッドでした！

お読み頂きありがとうございました！
もし、間違いや補足などございましたら、コメント頂けますと助かります！

# 参考資料
<a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map">MDN Array.prototype.map()</a>

柳井政和著 『JavaScript[完全]入門』(2021)
AtCoder自分用まとめ001(Welcome to AtCoder)

#概要
自分のために、AtCoderで身に付けた内容・コードをまとめておく。

#内容
https://atcoder.jp/contests/abs/tasks/practice_1
>  高橋君はデータの加工が行いたいです。
> 整数 a,b,cと、文字列 s が与えられます。 a+b+c の計算結果と、文字列 s を並べて表示しなさい。 


```:入力形式
a
b c
s
```

##C
```C
#include<stdio.h>
int main() {
  int a,b,c;
  char s[101];
  scanf("%d", &a);
  scanf("%d %d", &b, &c);
  scanf("%s", s);

  printf("%d %s\n", a+b+c, s);
  return 0;
}
```
##C++
```cpp
#include<iostream>
using namespace std;
int main() {
  int a, b, c;
  string s;
  cin>>a>>b>>c>>s;

  cout<<a+b+c<<" "<<s<<endl;
  return 0;
}
```
##C++\<bits/stdc++.h\>
```cpp
#include<bits/stdc++.h>
using namespace std;
int main() {
  int a, b, c;
  string s;
  cin>>a>>b>>c>>s;

  cout<<a+b+c<<" "<<s<<endl;
}
```
##Python3
```python
a = int(input())
b, c = map(int, input().split())
s = input()

print(a+b+c, s)
```
##Haskell
```haskell
import Control.Applicative

main :: IO ()
main = do
  a <- readLn
  [b, c] <- map read . words <$> getLine
  s <- getLine

  putStrLn $ show (a+b+c)++" "++s
```

##Racket
```racket
#lang racket
(define a (read))
(define b (read))
(define c (read))
(define s (read))
(display (+ a b c))
(display " ")
(display s)
(newline)
```

##Vim(人間向け)
```vim
:delete a
:delete f
:delete s
:let a = @a
:let b = split(@f)[0]
:let c = split(@f)[1]
:let s = @s
:put! = (a + b + c) . ' ' . s
:join!
:write
:quit
```
##Vim(ゴルファー向け)
```vim
DJ@"<C-A>wD0@"<C-A>JZZ
```
※実際には、\<C-A\>はそのまま入力しているので見えない。

#参考にさせていただいたページ
- https://atcoder.jp/contests/abs/tasks/practice_1
- [AtCoder に登録したら解くべき精選過去問 10 問 を Vim で解いてみた](https://qiita.com/hakatashi/items/bda8547114c8aecc93cb)
- https://frfrfrfr.hatenablog.com/entry/2018/03/25/125457

#感想
もう少し慣れたら書き直したい。。
リクエストパラメータについて

現在Swaggerを使っており、そこでリクエストするパラメータの記載が必要になりました。
先輩たちが丁寧に教えてくれたのでメモです。
ご指摘等あればコメントお願い致します！


## 種類

どこにパラメータをおくかは基本的に以下の3つです。
基本的にです、あくまで。

- クエリストリング
- リクエストボディ
- パス

どのように考えればいいかというとHTTPメソッドで切り分けるのが分かりやすいんじゃないかと先輩がおっしゃってました。
ふむ。
では見ていきます。

## クエリストリング

一覧表示などのGETを使う場合はクエリストリングにパラメータを置きます。
例えばgoogleで何らかの検索をしたとするとその後のURLは以下のようになります。

```
#ポケモンと検索した場合
https://www.google.com/search?q=%E3%83%9D%E3%82%B1%E3%83%A2%E3%83%B3&rlz=1C5CHFA_enJP919JP919&oq=%E3%83%9D%E3%82%B1%E3%83%A2%E3%83%B3&aqs=chrome..69i57j0i131i433j0i433l2j0j0i433l5.1443j0j15&sourceid=chrome&ie=UTF-8
```

上記の`?`以降がクエリストリングもしくはクエリとかクエリパラメータと呼ばれます。
基本的にGET以外では使わないとのこと。


## リクエストボディ

POST、PUT、PATCHで使います。
データを作成したり更新したりするときはリクエストボディが多いようです。

受け渡すデータの内容が入ります。
例えば、会員登録で考えると

- ユーザー名
- メールアドレス
- パスワード

などの入力したデータを送ると考えると分かりやすかったです。


## パス

特定のリソースを識別できるものを含める際はパスパラメータを使います。
例えば
URL= /user/1
見たいにuser_idが1の特定のデータを取得したい時とかに使います。

DELETEはパスパラメータにするべきですね。
PUTやPATCHはこちらのパスパラメータを使うことも結構あるみたいです。


こういうのを理解していないのってフレームワークでの実装しかしたことないからダメなのかなー。
毎日学ぶことが多くて自分の知識の無さにガッカリしてますが、コツコツ頑張ります！
PHPWordの使い方とテンプレートを利用した帳票作成

## 背景

Wordファイル形式の帳票を生成したい。しかし、PHPWordを調査していると、期待する情報が見当たらず戸惑う。今回やりたいことは、ログインしているユーザの名前や住所などの情報があらかじめ記載されたWordファイルを提供すること。 `addText()`でゼロから文書を組み立てるのは実装に手間がかかり過ぎ、現実的ではありません。

すでにWordファイルはあるので、アプローチを変えて解決しました。その方法を共有します。

---

## 解決方法：既存のWordファイルをテンプレートとして利用する

ゼロからWordファイルを生成するのではなく、**テンプレート機能**を活用します。テンプレートを、普通のWordファイルとして作成し、動的に変更したい箇所を`${名前}`や`${住所}`のようなプレースホルダ文字列に置き換えます。

### 手順

1. **テンプレートの準備**
   - Wordで帳票の雛形を作成します。
   - 動的に変更したい箇所を`${プレースホルダ名}`形式で記述します。

2. **PHPコードでテンプレート処理**
   ```php
   require_once 'vendor/autoload.php';

   $processor = new \PhpOffice\PhpWord\TemplateProcessor('template.docx');

   // プレースホルダに値を設定
   $processor->setValue(
       ['名前', '住所'], // プレースホルダ名
       [$name, $address] // 対応する値
   );

   // 保存
   $processor->saveAs('path/to/file.docx');
   ```

これで、テンプレートを利用して動的に帳票を生成できます。

---

## 注意点

テンプレートをMicrosoft Wordで編集すると、期待通りに動作しない場合があります。これは、Word内部で`${}`の構文を分解してしまうためです。

### 解決策
GitHubの[PHPWord Issue #590](https://github.com/PHPOffice/PHPWord/issues/590)で提案されている方法を参考にしてください。ただし、根本的な解決には以下の方法が有効です。

1. **LibreOfficeやOpenOffice系を使用**  
   Microsoft Wordではなく、LibreOfficeなどでテンプレートを作成すると問題なく動作します。

2. **表示確認はMicrosoft Wordで行う**  
   生成したファイルを最終的に確認する際はMicrosoft Wordを使うべきです。

---

## Microsoft Wordがない場合

Microsoft Wordをお持ちでない場合は、[Word Mobile](https://www.microsoft.com/ja-jp/p/word-mobile/9wzdncrfjb9s)などを利用してください。

---

## まとめ

- PHPWordで帳票生成機能を手軽に実装するにはテンプレートとしての利用がおすすめ。
- プレースホルダを活用して動的に値を差し込む。
- Microsoft Wordでの編集には注意が必要。LibreOfficeを代替として使用可能。

効率的な帳票作成を目指して、ぜひ試してみてください！
ROS1 noeticのセットアップでcatkinがインストールできない


```
sudo apt install catkin
```

した結果

```
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 catkin : 依存: python-catkin-pkg しかし、インストールされようとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
```

あ？

#解決策

各バージョンのcatkinを入れましょう

```
sudo apt-get install ros-noetic-desktop-full
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
```

でcatkin_make使えるようになりました。
詰まってる方多そうだけどあまり解決策なかったので
sudo apt installで保存したパッケージをバックアップ、リストアする方法

#1 apt-cloneをインストールする

```
$ sudo apt install apt-clone
```
apt-cloneは、aptでインストールしたパッケージをバックアップするために必要なパッケージです。
まず最初にapt-cloneをインストールしましょう。

#2 インストールしたパッケージを、空のディレクトリにコピーする。

```
$ mkdir ~/mypackages
$ sudo apt-clone clone ~/mypackages
```

まず、```mkdir ~/mypackages```で"mypackages"という名の空のディレクトリを作成しましょう。
その後、```sudo apt-clone clone ~/mypackages```とターミナル内で実行すると、```mypackages```ディレクトリの中に、```apt-clone-state-ubuntuname.tar.gz ```という名前のファイルが作成されます。
ファイルの名前はお使いのOSによって変わるかもしれません。

作成したファイルはgoogle driveにでも保存しておいてください。

#3 バックアップしたパッケージを、リストアする。

```
$ sudo apt-clone restore apt-clone-state-ubuntuname.tar.gz
```

バックアップしたパッケージを再インストールしたいPCに、先ほど作成した```apt-clone-state-ubuntuname.tar.gz```を移しておいて、```sudo apt-clone restore ```でそのgzファイルからバックアップした内容を復元（リストア）しましょう。

以上の方法を使えば、同じ環境を複数のLinux PCで共有することが可能になります。
WindowsやMacのPCを使用している方は、VirtualboxなどのエミュレータでLinuxのOSを作成したり消去したりは日常茶飯事だと思います。
そのさい、一つ一つ```sudo apt install```で必要なパッケージを逐次インストールするのは手間がかかるので、この記事を活用してくれれば幸いです。
独学でHTML/CSS/Javascriptを学んだ素人がもう一度1から学びなおす Part1

<h2>動機</h2>
これまで独学（テキストとweb情報ベース）でHTML/CSS/Javascriptを学習しながら、HTAを個人利用の範疇で作ってきた。
しかし、ツールとして使えはするものの、如何せんコードが煩雑だったり、ページの見栄えも一昔前のデザインにしか見えず、自分のスキルとして出すにはあまりに恥ずかしい出来栄えだ。

一念発起し、有償のオンライン講座を受講することにした。
学習を進める中でポートフォリオの案が浮かべば理想。なければ今あるものをブラッシュアップ出来るスキル習得を目指す。

<h2>環境</h2>
<h3>OS/ブラウザ</h3>
<h5>Windows10/Google Chrome</h5>
<h3>使用ツール</h3>
<h5>Visual Studio Code</h5>
インストールした拡張機能は↓


+ <p><b>Japanese Language Pack for Visual Studio Code</b>　→　日本語化、普通に読める日本語なので有用</p>

+ <p><b>Live Sass Compiler</b>　→　講座で入れろと言われた。Sassで書いたことないから期待</p>
+ <p><b>Live Server</b>　→　お馴染みのWebserver環境。少し前は存在を知らずiframeに悩まされた。</p>
+ <p><b>Prettier - Code formatter
</b>　→　これも講座で言われた。コードをいい感じに整形してくれるらしい</p>

<h2>インライン要素とブロック要素について</h2>
インライン要素
`<span>,<textarea>,<select>,etc…`

ブロック要素
`<div>,<h*>,<table>,etc…`

```html
<body>

    <div>hello1-1</div>
    <div>hello1-2</div>
    <span>hello2-2</span>
    <span>hello2-1</span>

    <style>
        div{
            width:100px;
            height: 100px;
            background-color: red;
        }

        span{
            width:100px;
            height: 100px;
            background-color: blue;
        }
    </style>

</body>
```
1.ブロック要素は改行される
2.インライン要素はwidthやheightなどの一部属性が効かない

displayプロパティでblock要素とinline要素を変えられるのも初めて知った。(noneとblockくらいしか使ったことなかったし、中間のinline-blockなんてのもあるのね。)

あまりこれまで意識してこなかったが、結構重要かもしれない。
.envからKubernetesのsecret, config mapのマニュフェストファイルを生成する。

2021-07-05 追記

当記事ではdry-runを利用してマニュフェストファイルを生成していますが、kustomizationを利用した方法のほうが簡単にsecretを生成できます。

https://kubernetes.io/ja/docs/tasks/configmap-secret/managing-secret-using-kustomize/

追記ここまで

---

KubernetesのSecretを定義するマニュフェストを作成するの面倒じゃありませんか？

```
$ echo -n foo | base64
```

と一つ一つエンコードするのも大変ですし、機密情報がコマンドログに残るのも気持ち悪い。

色々調べていると、`kubectl create configmap`や`kubectl create secret`のオプション`--from-env-file`と`dry-run=clinet`を組み合わせたら`.env`からマニュフェストが生成できそうだなと気がついたので紹介します。

## `kubectl`のオプション解説

`--from-env-file`: envファイルから設定を読み込む
`--dry-run=client`: kubenetesのクラスターに適応せずに、クライアント側で動作するかテストする
`--output=yaml`: マニュフェストをyaml形式で標準出力する

以上を踏まえてやっていきましょう。

## `.env`からSecretリソースを定義するマニュフェストを生成

`.env`という以下のファイルがあるとします。

```
HELLO=WORLD
FOO=BAR
HOGE=FUGA
```

`my-secret`というSecretリソースを定義するマニュフェストファイルを生成する場合

```
$ kubectl create secret generic my-secret --dry-run=client --from-env-file=.env --output=yaml
```

出力結果

```
apiVersion: v1
data:
  FOO: QkFS
  HELLO: V09STEQ=
  HOGE: RlVHQQ==
kind: Secret
metadata:
  creationTimestamp: null
  name: my-secret
```

ということで、既に環境変数が`base64`にエンコードされたマニュフェストが生成されました。

もしファイルに出力したい場合、リダイレクトを利用します。

```
$ kubectl create secret generic my-secret --dry-run=client --from-env-file=.env --output=yaml > secret.yml
```

## `.env`からConfig Mapマニュフェスト生成

同様に`.env`からConfig Mapを定義するマニュフェストも生成できます。

`my-config-map`というリソースを作成する場合

```
$ kubectl create configmap my-config-map --dry-run=client --from-env-file=.env --output=yaml 
```

出力結果

```
apiVersion: v1
data:
  FOO: BAR
  HELLO: WORLD
  HOGE: FUGA
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: my-config-map
```

ファイルに出力する場合、リダイレクトを利用する。

```
$ kubectl create configmap my-config-map --dry-run=client --from-env-file=.env --output=yaml > configmap.yml
```

## メリット

- secretリソースを作成する時に手動で`base64`エンコードする必要がない。コマンドログにも機密情報が残らない&楽
- 開発でもよく利用するであろう`.env`から生成できる。
- secretリソースを変更するときも`.env`から再生成 & `kubectl apply -f secret.yml`で適用できる。

## 終わり

`.env`からkubernetesのマニュフェストファイルを生成できました。

`kubectl create secret generic --from-env-file`だけでも直接Secretリソースは作成できるのですが、マニュフェストファイルを生成しておくと、リソース名も定義できるのでより **"infrastructure as code"** が実現できると思います。

もしgit管理をする場合生データは危険なので、[sops](https://github.com/mozilla/sops#yaml-and-json-type-extensions)や[sealed secret](https://github.com/bitnami-labs/sealed-secrets)、[git crypt](https://github.com/AGWA/git-crypt)を利用して暗号化した上でコミットすることを忘れずに。

この記事が皆さんの助けになればなと思います。

## 備考

Secretを作成する方法として`kustomize`の`secretGenerator`を利用する方法もあります。

[Managing Secret using Kustomize](https://kubernetes.io/docs/tasks/configmap-secret/managing-secret-using-kustomize/)
Webライティングを学んでみた

最近、**「沈黙のWebライティング」**という本読みました。
この本で学んだことをアウトプットしていきたいと思います。

**なぜこの本を読んだのか？**
・Webライティングとは何なのかと知りたかった。
・ネットでこの本はめっちゃオススメと書いてあったから。

**読んでみた感想として**
・マンガのように読みやすい。
・記事の書き方、考え方など全てつまっている。
・SEOについてしっかり学ぶことができる。

今回は学んだ中でも
**わかりやすく文章を書くためのポイント３つ**を紹介したいと思います。

#1、感情表現を入れ、共感してもらう

※共感とは相手の感情を自分事として感じること

共感した文章は読み手にとっての自分になるため、
「この文章は自分にとって関係があるな。読んでみようかな！」
となり、文章を進めてもらうようになります。

共感した文章を作るポイントは感情を**「」（カギ括弧）**で表現すること。
そうすることで「話し言葉」に見えるため、感情が伝わりやすくなります。

#２、”見やすさ”や”わかりやすさ”を意識する

人間は文章を読むと脳に負荷がかかります。
・文章が多いほど脳が疲れてしまい、文章を読むのが進まなくなります。
・文章が少ないほど脳が疲れないため、文章を読むのが進みます。

見やすくてわかりやすい文章とは脳に負担の少ない文章です。

脳に負担が少ない文章を書くには、
人間がどんな時に負担を感じるかを知る必要があります。

「人間の脳はラクをするためにできているので・・・・」

なぜ脳はラクをするのか！？
それは**２つの思考**があります。

####■システム１
**物事を直観的に理解しようとする思考**

この文章は”見やすい”から読んでみたいとなるところ!
どれだけ良い内容の文章でも、見た目がダメなら読む気にもなりませんよね？

このシステム１では**”見た目”**って大事ということを知っていただければと思います。

文章の見た目をよくするテクニック３つを紹介します。
①改行・行間を意識する
→改行・行間が取り入れることで、文章に「間」が生まれ、読みやすくなる。

②箇条書きで重要点をまとめる
→情報を整理することができ、読み手の負荷が減ります。

③文章が不必要に長くならないこと
→長いページは読み手に負荷がかかります。
何回も使っている言葉、不要な表現など思い切ってカットすることも大事です。

まだまだたくさんのテクニックはありますが今回は厳選した３つを紹介しました。

####■システム２
**物事を論理的に理解しようとする思考**

この文章は論理的でわかりやすい（理解しやすい）から読んでみたいとなるところ!
どれだけ見た目が良い文章でも、内容が理解できなかったら読む気にもなりませんよね？

このシステム２では**”論理的でわかりやすい文章”**って大事ということを知っていただければと思います。

※論理的な文章とは
相手の心との間に”理解の架け橋”が築かれている文章のこと。

どんな主張も相手の心の間に橋がかからないと伝わらない。
論理はその橋を言葉で作ってくれます。

文章を論理的に書くテクニック３つを紹介します。
①相手にわからない言葉は使わない
→わからない言葉があれば、その言葉も理解してもらわないといけなくなるから。

②相手が何に対して疑問を持っているか察する
→人によって疑問を持つことはバラバラです。
　相手が何に疑問を持って、何が知りたいの察することも大事です。

③理由に対して根拠が持つこと
→なぜ、その理由が言えるのか根拠がないと信用できなくなるから。

まだまだたくさんのテクニックはありますが今回は厳選した３つを紹介しました。

#３、冒頭文でと伝えたいことを書く
**結論→理由→根拠**の順を徹底しましょう。

**結論を先に書く理由**
「なぜそういった結論になるのだろう？」と理由を知りたくなる。
　　　↓
理由は○○○○です。
と答えることで「なぜそういった理由になるのだろう？」と根拠を知りたくなる。

根拠をしっかり述べることで結論も理由も納得がいく文章が作れるのです。



まだまだたくさんのことがこの本には詰まっています。
今回はわかりやすい文章を書くための方法についてスポットを当てました。
なんでMinValueを代入しているの？実はアプリ固有の古い書き方でした。。

# はじめに

プロジェクトのソースコードで以下のような値を初期化するときに
MinValueを代入している書き方を見て、
なんでMinValueを代入しているのかわからなかったため、少し調べてみました。



```C#
float i = float.MinValue;

if ( 条件1 )
{
  i = 1.0;
}

if ( 条件2 )
{
  i = 2.0;
}

```

# 実は・・・

実はこれはローカルルールになりがちな古い書き方でした。値型としてなんらかの有効な値と値として無効な場合を表現したいときに、
参照型だとnullを使ってオブジェクトが何も参照していないことを表しますが、値型だと以下のようにnullを代入できません。
そこで、値として無効な場合を表現するためにMinValueを代入していたのです。。（わかりずらい。。）

```C#
float i = null;  
```

# C#2以降だとこう書くのが良い
C#2以降だと以下のように変数をnull許容型として扱うことでnull代入して書く方がわかりやすいので良いみたいです。

```C#
float? i = null;
```
# null許容型について
null許容型はnull代入できない値型の変数にnullを代入したいときに使うものです。

# null許容型を使うときに注意すべき点
値型からnull許容型への変換はできますが、逆はできないので注意する。
null許容型は元々の値型にnullを加えたもので、値型の拡大変換となるので、
元々の値型からの変換は暗黙的にできますが、逆は以下のようにnullであるがを確認して値を取りだしてやる必要があります。

```C#
int i = 108;
int? num = i; #こちらは問題ない

int? num = 108
int i = (int)108; # 逆は明示的にキャストしてやる必要がある。ただし、nullの場合はエラー(InvalidOperationException例外)になる


# 以下のようにnullチェック
if (num != null)
{
  int i = (int)num;
}

# 以下のようにも書いても同じ
if (num.HasValue)
{
  int i = (int)num;
}

```


# 参考
- 独習C#　山田祥寛
AzurePowershell で AccessToken を取得する方法 

AzurePowershell を最新化したら Azure REST API を叩くスクリプトが動かなくなった。
調べてみたら、Az.Accounts の動作変更により、従来の `Get-AzContext` からアクセストークンを取得する方法が使えなくなった模様。。。 
新しく `Get-AzAccessToken` が追加されたので、今後、アクセストークンを取得する際はそれを使ってくれとのことらしい。

## 従来の方法
```Powershell:
Connect-AzAccount
$context = Get-AzContext
$currentToken = $context.TokenCache.ReadItems() | Where-Object {$_.TenantId -eq $context.Tenant.Id}
$currentToken[0].AccessToken
```

## Get-AzAccessToken を使用した方法（AzurePowershell v5.1.0 以降）
```Powershell:
Connect-AzAccount
$context = Get-AzContext
$currentToken = Get-AzAccessToken | Where-Object {$_.TenantId -eq $context.Tenant.Id}
$currentToken[0].Token
```


## 参考
https://github.com/Azure/azure-powershell/issues/13337

https://blog.engineer-memo.com/2020/03/12/powershell-で-azure-rest-api-にアクセスする際の覚書/amp/
brewを用いてflutter2.0.4にするとIntelliJでエラーになる。

すでにbrewでインストール済みのflutter 2.0.3を「flutter upgrade flutter」でアップデートしバージョン2.0.4にしたところ、IntelliJがエラーを表示するようになりました。結構長い時間手こずったので共有します。

####・intelijのエラーメッセージ：
"dart"は壊れているため開けません。ゴミ箱に入れる必要があります。

####・解決方法
「flutter downgrade 2.0.3」で、flutterのバージョンを一度 2.0.4 -> 2.0.3に戻す。
その後「flutter upgrade」で、flutterのバージョンを2.0.3 -> 2.0.4にする。
SQL: 特定レコードの前後n件レコードを取得

動作確認DB: Postgresql11
サンプルテーブルの定義は以下で示す。

```create.sql
CREATE TABLE tmp_events (
  id serial,
  date date not null,
  name varchar not null,
  PRIMARY KEY(id)
);
```
サンプルデータ
``` insert.sql

insert into tmp_events (date, name) 
values
('2018-01-01','New Years Day'),
('2018-04-02','Easter Monday'),
('2018-05-10','Ascension Day'),
('2018-03-30','Good Friday'),
('2018-05-21','Whit Monday'),
('2018-05-27','Mothers Day'),
('2018-06-17','Fathers Day'),
('2018-07-14','Bastille Day'),
('2018-05-01','Labour Day'),
('2018-08-15','Assumption Day'),
('2018-11-01','All Saints Day'),
('2018-11-11','Armistice Day'),
('2018-12-26','St Stephens Day'),
('2018-05-08','V-E Day'),
('2018-12-25','Christmas Day');
```

検索結果

```select.result
SELECT * FROM events ORDER BY date;
 id |    date    |      name
----+------------+-----------------
 1  | 2018-01-01 | New Years Day
 4  | 2018-03-30 | Good Friday
 2  | 2018-04-02 | Easter Monday
 9  | 2018-05-01 | Labour Day
14 | 2018-05-08 | V-E Day
 3  | 2018-05-10 | Ascension Day
 5  | 2018-05-21 | Whit Monday
 6  | 2018-05-27 | Mothers Day
 7  | 2018-06-17 | Fathers Day
 8  | 2018-07-14 | Bastille Day
 10 | 2018-08-15 | Assumption Day
 11 | 2018-11-01 | All Saints Day
 12 | 2018-11-11 | Armistice Day
 15 | 2018-12-25 | Christmas Day
 13 | 2018-12-26 | St Stephens Day
(15 rows)
```
上記の検索結果からIDが10のレコードの前後2件レコードを取得するには、以下のSQLが使えます。

```select.sql
WITH cte AS (
  SELECT id, date, name, row_number() OVER (ORDER BY date)
    FROM events
), current AS (
  SELECT row_number
    FROM cte
  WHERE id = 25
)
SELECT cte.*
  FROM cte, current
    WHERE ABS(cte.row_number - current.row_number) <= 2
  ORDER BY cte.row_number;
```

```取得結果.result
id |    date    |      name
----+------------+-----------------
 7  | 2018-06-17 | Fathers Day
 8  | 2018-07-14 | Bastille Day
 10 | 2018-08-15 | Assumption Day
 11 | 2018-11-01 | All Saints Day
 12 | 2018-11-11 | Armistice Day
(5 rows)
```
SwiftUIでタブ遷移を実装する

# 参考
[【iOS】遷移方法まとめとエンジニア1年生の独り言](https://qiita.com/iTakahiro/items/b33306c773a05845358f)
[SwiftUIでTabBarを作る方法](https://qiita.com/From_F/items/416abef0d9399f40f3ff)
[SwiftUI Image(systemName:)で使用するアイコン名の一覧](https://qiita.com/kazy_dev/items/4983faa45630afa75b06)
[Human Interface Guidelines - SF Symbols](https://developer.apple.com/design/human-interface-guidelines/sf-symbols/overview/)
[SF Symbols 2](https://developer.apple.com/sf-symbols/)

# 画面遷移について
1. モーダル ... 下から画面が出現
2. プッシュ ... 右から画面が出現
3. タブ ... 瞬時の切り替わり(タブアイテムのタップ)
4. ページ ... 左右から画面が出現(左右スワイプ)

# モーダル遷移の実装
## 動画
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">タブ遷移 <a href="https://t.co/ym9Hv33bg3">pic.twitter.com/ym9Hv33bg3</a></p>&mdash; APPLE (@applecoder6) <a href="https://twitter.com/applecoder6/status/1380517099525730306?ref_src=twsrc%5Etfw">April 9, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## コード

```swift:ContentView.swift
import SwiftUI

struct ContentView: View {
    @State private var showingModal = false
   
    var body: some View {
        VStack {
            Button("Show ModalView.") {
                self.showingModal.toggle()
            }.sheet(isPresented: $showingModal) {
                ModalView()
            }
            
            Divider()
            
            NavigationView {
                NavigationLink(destination: PushView()) {
                    Text("Show PushView.")
                }.navigationBarTitle("ContentView", displayMode: .automatic)
            }
            
            Divider()
            
            TabView {
                TabAView()
                    .tabItem {
                        Image(systemName: "moon")
                        Text("Tab A")
                    }
                
                TabBView()
                    .tabItem {
                        Image(systemName: "moon.fill")
                        Text("Tab B")
                    }
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
```

```swift:TabAView
import SwiftUI

struct TabAView: View {
    var body: some View {
        Text("This is Tab A.")
    }
}

struct TabAView_Previews: PreviewProvider {
    static var previews: some View {
        TabAView()
    }
}
```

# 学習結果
## TabView
複数の子Viewを管理し、それぞれのViewをタブ操作で切り替えるView。

## tabItem修飾子
TabViewの子Viewに対してtabItem修飾子を付加することでタブを作成できる。
tabItemのクロージャにタブアイコンに指定するViewを指定する。
※ タブに指定できるViewは`Image`と`Text`のみ。

## SF Symbols
`Image(systemName:)`で使用できるアイコン。
[SF Symbols 2](https://developer.apple.com/sf-symbols/)をインストールすることでアイコン名を調べることができる。
javascriptで動的に変数を生成する

参考サイトまとめメモがてら、、、

# 【JavaScriptで動的に変数名を決める】

## 変数名に変数を使いたい！
GASを使ってる際複数のフォームを自動作成したが、そのフォームを格納する変数それぞれに違う名前を付けたくなったため調べた。結論から言うと、

**〈 連想配列を利用する 〉**

```javascript
//空の連想配列を宣言
var a = {};

//変数iをキーにして、変数を生成する
for(var i=0; i<10; i++){
  a[i] = "value" + i;
}
```

連想配列を利用すれば、キー値で変数が使えるため動的に変数を生成できる。
ただし、連想配列の名前自体には変数は使えない。
<br>

**〈eval関数を利用する〉**

```javascript
var a = aaa;
eval("var " + a + "= aiueo");
```
この関数は渡された文字列を、JavaScriptコードとして評価して実行する関数。
<font color=red>これは使用には要注意。</font>悪意のある、第三者に影響を受ける可能性のある文字列でevalを実行した場合、そのコードを実行してしまうため、セキュリティ的に問題があるためである。使用には要注意。

## 参考サイト
・[MDN Web Docs / eval()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/eval#never_use_eval!)
・[teratail / JSの変数名に変数を使用する方法](https://teratail.com/questions/68851)
Vue3 での　textareaの高さを自動で設定する方法

# 結論

``` :Vue
 props: {
        text: String,
        id: String,
    },
    data() {
        return {
            txt: this.text,
            i: this.id,
        }
    },
computed:{
        rows() {
            if(this.txt === null) {
                return 4
            }
            else{
                let num = (this.txt.match(/\n/g) || []).length + 1
                return (num > 4) ? num : 4
            }
        }
    }
```

```:HTML
<textarea class="editable-contents-textarea" v-on:blur="saveText" v-model="txt" :id="'textarea'+ i" :rows="rows"></textarea>
```

```:css
.editable-contents-textarea{
  height:auto;
}
```

##補足
rows関数の４って言う数字は適当です．強いて言うなら最低の行数ですね

あと，``if(this.txt === null)``の分岐なんですけど，これはtexareaに文字がない場合のものです．

以上です
Exponential Backoff ってなんじゃらホイ？を拡張してみた

### 0. はじめに

今回の記事は Ruby 2.5.7 で動作確認しています 😗

### 1. 前回のモジュールを `rescue 〜 retry` で使ってみよう

前回の記事 [Exponential Backoff ってなんじゃらホイ？を Enumerator クラスで書いてみた](https://qiita.com/m-kubo/items/733c541b00003e668f3c) のコメント欄で、「リトライ処理は `rescue 〜 retry` を使うことが多い」というご意見をいただきましたので、前回作った `ExponentialBackoff` モジュールを、`rescue 〜 retry` のパターンに組み込むことを考えてみたいと思います。

とりあえず組込例は以下のような感じになります

```ruby
def request_with_retry
  request                                         # リクエスト失敗時は例外エラーが発生
rescue => exception
  eb ||= ExponentialBackoff.call(max_attempt: 5)  # 5回分の値を返す Enumerator オブジェクトを生成 
  backoff = eb.next rescue nil                    # 次の値が取得できずに例外が発生した場合は、rescue して nil を代入
  sleep backoff and retry if backoff              # 次の値が取得できていれば、その値秒だけ sleep して retry
end
```

5 行目の `eb.next` で次の値を取り出すときに、`max_attempt` に達していたら `StopIteration` エラーが発生しますが、それを後置の `rescue` で捕捉して nil を返しています。例外エラーの発生ありきでリトライのフローが制御されており、なんとも微妙です :thinking: 

そこで、リトライ上限に達したかどうかを判定できるメソッドを追加することにしました。

### 2. `#peek?` メソッドを追加しよう

追加するメソッドは、返却される Enumerator オブジェクトを拡張する形で実装することにします。

以下のように、リトライ上限に達したかどうかを boolean で返す、`#peek?` メソッドを備えた `PeekQues` モジュールを用意しました。

```ruby
module PeekQues
  def peek?
    peek
    true
  rescue StopIteration
    false
  end
end
```

そして、`ExponentialBackoff.call` が Enumerator オブジェクトを返す際に、上記の `PeekQues` モジュールを extend します。

```ruby
module ExponentialBackoff
  def self.call(max_attempt: Float::INFINITY, capacity: Float::INFINITY, base: 1)
    Enumerator
      .new(max_attempt) { |yielder|
        (1..max_attempt) { |attempt|
          yielder << [capacity, base * 2 ** attempt].min
        }
      }
      .extend(PeekQues) # 返却するオブジェクトに #peek? メソッドを追加
  end
end
```

### 3. 追加した `#peek?` メソッドを使ってみよう

それでは、追加した `#peek?` メソッドを利用して、冒頭のリトライ処理を改善してみます。

こんな感じになります。

```ruby
def request_with_retry
  request                                         # リクエスト失敗時は例外エラーが発生
rescue => exception
  eb ||= ExponentialBackoff.call(max_attempt: 5)  # 5回分の値を返す Enumerator オブジェクトを生成
  sleep eb.next and retry if eb.peek?             # 次の値が取得できるなら、その値秒だけ sleep して retry
end
```

後置の `rescue` が消えていい感じになりました :smile: 

### 4. おわりに

これで、リトライの制御フローに rescue を利用する必要がなくなり、`ExponentialBackoff` モジュールがより使いやすくなりました :clap: 

みなさんもぜひ使ってみてくださいね :kissing_heart:
Ruby で 1 行繰り返し二乗法

# はじめに
短いコードを書くと可読性が著しく低下する．**自分が楽しむ目的でのみ**コードを縮めて遊ぶこと．他人に迷惑をかけないように．

# 繰り返し二乗法とは

累乗計算を愚直に行うとコストがかかる．その問題を解決する方法に，**繰り返し二乗法**と呼ばれるアルゴリズムがある．

例えば $2^{100}$ は $2^{100} = (2^{50})^2 = ((2^{25})^2)^2...$ としていくことで，計算コストを落とすことができる．奇数乗の場合は $1$ 乗と残りに分ける．この処理を再帰的に行うことで，規模の大きな累乗を非常に少ない時間で計算することができる．

これを一般化すると，$a^{b}$ を求める関数は次のようになる．

```
Function(x, y)
  If b == 0
    Return 1
  Else if b == 1
    Return a
  Else if b % 2 == 1
    Return a * Function(a, b - 1)
  Else
    c = Function(a, b / 2)
    Return c * c
```

# Ruby で書いてみた

そこそこ記述量が少なくて済む Ruby (インタプリタ言語の中ではそれほどでもないが) で試したら 1 行で書くことができた．

```Ruby
def f(a,b) return eval([%w|1 a|,%w|f(a,b/2)**2 a*f(a,b-1)|][[b/2,1].min][b%2]) end
```

先のアルゴリズムを次にように言い換える．

```
Function(x, y)
  If b < 2
    If b % 2 == 0   // b == 0
      Return 1
    Else   // b % 2 == 1
      Return a   // b == 1
  Else   // b >= 2
    If b % 2 == 0
      c = Function(a, b / 2)
      Return c * c
    Else    // b % 2 == 1
      Return a * Function(a, b - 1)
```

`b` が 2 以下であるか否かと，`b` が偶数か奇数かで処理を 4 通りに場合分けする．

Ruby は `%w|a b c|` と書くと，スペースで区切られた文字列を要素とする配列 `["a", "b", "c"]` を生成する．よって `eval` の中身は `[["1", "a"], ["f(a,b/2)**2", "a*f(a,b-1)"]]` と等価である．この 2 次元配列を `A` とする．

`A` の 1 個目の添字 `[b/2,1].min` は `b` を 2 で割った商と 1 のうちより小さい数を返すので，`b` が 1 以下であれば 0，そうでなければ 1 を得る．`A` の 2 個目の添字 `b%2` は b が偶数なら 0，奇数なら 1 を返す．

これらの添字により選択される A の要素は先述のアルゴリズムで `return` する式を書いた文字列に等しい．`eval` は引数として渡された文字列をプログラムとして実行した結果を返すので，関数 `f(a,b)` は計算結果である数値を返す．`eval` 様々．

ちなみに累乗の計算は結果が非常に大きくなるので，素数で割った余りを計算することもある．その場合は次のようにする．ただし，`r` は大きな素数 ($10^9+7$ など) とする．

```
Function(x, y, r)
  If b == 0
    Return 1
  Else if b == 1
    Return a % r
  Else if b % 2 == 1
    Return (a * Function(a, b - 1)) % r
  Else
    c = Function(a, b / 2)
    Return (c * c) % r
```

```Ruby
def f(a,b,r) return eval([%w|1 a%r|,%w|f(a,b/2,r)**2%r a*f(a,b-1,r)%r|][[b/2,1].min][b%2]) end
```

# おわりに
ちなみに Ruby にはデフォルトで累乗計算が備わっているので，わざわざこの関数を定義する意味はない．

```ruby
irb(main):001:0> 2 ** 31
=> 2147483648
```
【Typescript】baseUrlからインポートしたときのESLintエラーUnable to resolve path to module~ を解決する方法

# エラー

```
. 
├── dist/
├── node_modules/
├── src
│    ├── 
│    ├── 
│    ├── routes/
│    │    ├── 
│    │    └── foo/
│    │         └── hoge.ts
│    └── types/
│         └── index.d.ts
│   
├── .eslintrc.js
├── tsconfig.json
└── 他
```

`src/routes/hoge.ts` で `src/typs/index.d.ts` をインポートするとき

```ts:hoge.ts
import { fugafuga } from '../../types';
```

上のような相対パスで書いてもよいが、下のように`src/`を起点としたパスで書きたかったので

```ts:hoge.ts
import { fugafuga } from 'types';
```

`tsconfig.json`にて`baseUrl`を設定した

```json:tsconfig.json(抜粋)
"compilerOptions": {
  "baseUrl": "./src"
}
```

これで問題なく読み込めたが、ESLintのエラーが出てしまった

```ts:hoge.ts
import { ExRequest } from 'types';
// Unable to resolve path to module 'types'.eslint(import/no-unresolved)
```

# 解決方法

[eslint-import-resolver-typescript](https://www.npmjs.com/package/eslint-import-resolver-typescript) をインストールして

```console
$ yarn add -D eslint-import-resolver-typescript
```

eslintrc.jsに設定を追加する

```js:.eslintrc.js(抜粋)
settings: {
  'import/resolver': {
     typescript: { project: './' }
     // たぶんeslintrc.jsからtsconfig.jsonがあるディレクトリへの相対パス
},
```

これでESLintエラーは解決した。vscodeの拡張機能による赤い波線はVscodeを再起動すると消える。
【AWS】AWSマネジメントコンソールとは

#プログラミング勉強日記
2021年4月9日

#AWSマネジメントコンソールとは
　AWSマネジメントコンソールはEC2、CloudTrail、S3などのAWSサービスをブラウザ上で確認・操作できるWebアプリ。ブラウザ上でできるので、簡単に直感的に操作することができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/0aca58d3-b289-4993-7fd7-1196da3ef680.png)


#主な機能

##AWSアカウントの作成
　AWSにサインアップするときに作成されるAWSアカウントの作成を行える。

##多要素認証(MFA)の設定
　[昨日の記事](https://qiita.com/mzmz__02/items/c231fa6c1987bcac7131)にもあるように多要素認証を設定することもできる。

##IAMユーザ・グループ・ポリシーの作成
　AWSを利用するユーザのIDを取得してグループとポリシーを設定することでアクセス権限を付与できる。

##請求の管理
　料金の確認もAWSマネジメントコンソールを使って行う。サービスやリージョンごとの項目に分かれて表示されるが、詳細な分析を行うこともできる。

#特徴

- ブラウザで操作するので直感的に操作できる
- AWSサービスの操作や料金の確認、セキュリティなどをAWSマネジメントコンソールで一元管理することができる
- カスタマイズで自分流に使いやすくできる

#おまけ
　AWSマネジメントコンソール以外の操作方法としては、CLI(コマンドラインインターフェース)やSDKを利用することである。

#参考文献
[AWS マネジメントコンソール(AWS Management Console)とは？](https://www.cloudsolution.tokai-com.co.jp/white-paper/2021/0202-209.html)
SQL　複数のカラムからデータを取得する方法

一度に複数のカラムからデータを取得するには、
カラム名をコンマ（ , ）で区切りましょう！	

（例）　　　　
　　　SELECT カラム名,カラム名
　　　
全カラムのデータを取得する場合は「＊」の記号を使いましょう

（例）
　　　SELECT *
　　　FROM teams;
Javascript 備忘録2 <スコープ>

■スコープとは
→変数が見える範囲のことをさす

■グローバルスコープ

```js
let a = 0;
let b = 0;

window.c = 0;
````

上のように指定した場合、グローバルスコープとなる。
→グローバルで宣言した変数は、同じスクリプト内ならどこからでも呼び出すことが可能。


■関数スコープ

```js
function a() {
    let b = 0;
    // このconsole.logは出力される
    console.log(b);
}
// 変数bが宣言されているのは関数a野中なので、関数a野中でのみ使用することができる
console.log(b);
```

■レキシカルスコープ(外部スコープ)

```js
let a = 2;

function fn1() {
    let b = 3;
    function fn2() {
        let c = 4;
    }
}

```
→今回のソースコードでは、aはグローバル変数となるのでfn1、fn2からでも呼び出せる
→fn2からみると外部の変数であるa、b
→これはfn2内で呼び出すことが可能である
→このことをレキシカルスコープ（外部スコープ）という

■クロージャー

数字をインクリメントする関数を作りたい

```js

increment();
increment();
increment();

function increment() {
   num = 0;
   num += 1;
   console.log(num);
};
```

→上のソースコードだと関数increment()が呼ばれるたびに、numは初期化されてしまうので、
コンソールに出力されるのは0のみ

```js
function incrementFactory() {
    num = 0;
    function() increment() {
        num += 1;
    }
    return increment;
}

const increment = incrementFactory();

increment();
increment();
increment();
```

→まず、incrementFactory()が呼び出されることにより、numが初期化される
→その後、incrementFactory内にある関数incrementが返り値で戻ってくる
→そのため,constで宣言したincrementを呼び出しても、numは初期化されることはなく、インクリメントのみが行われるこになる
AtCoder Regular Contest 116 D - I Wanna Win The Game 解説

解法の理解に時間がかかったので分かりづらかったところを中心に解説を書きます。公式解説の補足のようなものです。公式解説がすぐ理解できた人にとって読む必要のある部分はありません。ゆるふわ解説です。
# 問題と公式解説
https://atcoder.jp/contests/arc116/tasks/arc116_d

https://atcoder.jp/contests/arc116/editorial/893

# 自分の解答(Python3)
https://atcoder.jp/contests/arc116/submissions/21579707

1~16行目: 二項係数の前計算
18~22行目: 入力やdpテーブルの準備
24~27行目: dpテーブルの更新←ここの解説をします
29行目: 出力

# 解説
公式解説と同じ解法で解きます。
## なぜ答えが奇数のときは0通りなのか
ビット毎に考えます。
総 $xor$ が $0$ になるには、任意の $1$ 以上の整数 $i$ について、「下から $i$ 番目のビットが立っている要素」の数が数列全体で偶数個になっていなければなりません。
答えが奇数だと下から $1$ 番目のビットが奇数個立っていることになるので、総 $xor$ が0になりません。

## dpテーブルの更新
実装するとこうなりました。

```
for i in range(2, M+1, 2):
    for j in range(0, min(N, i)+1, 2):
        dp[i] += dp[(i-j)//2] * cmb(N, j)
    dp[i] %= MOD
```

```
cmb(N, j)
```
この関数は $_N C_j$ を $998244353$ で割った余りを返します。

解説の漸化式中の $j$ は「最下位ビットの立っている要素の数」を2で割ったものですが、分かりづらいと思ったので、解答中の $j$ は「最下位ビットの立っている要素の数」そのままとしています。

$dp_i$ は「総和が $i$ 、総 $xor$ が $0$ になる非負整数列の数」です。
※以下、数列というときは総 $xor$ が $0$ かつ要素は全て非負整数とします。
これは言い換えると「最下位ビットが $0$ 個立っている時の総和が $i$ になる数列の数 $+$ 最下位ビットが $1$ 個立っているときの数列の数… $+$ 最下位ビットが $N$ 個立っている時の数列の数」になります。
この「最下位ビットがいくつ立っているか」が $j$ です。$j$ 毎に組み合わせの数を計算し足し合わせます。

「最下位ビットが $j$ 個立っているときの総和が $i$ になる数列の数」というのは、「最下位ビットが一つも立ってない総和が $i-j$ になる数列の数 $\times$ 最下位ビットが立つ $j$ 個の要素の選び方」と同じです。
この「最下位ビットが一つも立ってない総和が $i-j$ になる数列の数」を求めるのがなんとなくめんどくさそうですが、これは全体を $1$ ビット右にずらして考えると「総和が $(i-j) \div 2$ になる数列の数」と同じになります。

### 例
例えば、$N=5, i=6$ の場合を考えます。
$i=5$ まで計算した時点でdpテーブルは以下のようになります。

|$i$   |0 |1 |2 |3 |4 |5 |
|------|--|--|--|--|--|--|
|$dp_i$|1 |0 |10|0 |15|0 |

$j=0$ のとき、「最下位ビットを使わない総和が $6$ になる数列の数」を求めます。これは「総和が $3$ になる数列の数」と同じなので $0$ 通りです。
$j=2$ のとき、「最下位ビットを使わない総和が $4$ になる数列の数」を求めます。これは「総和が $2$ になる数列の数」と同じになので $dp_2$ の値を使います。$N$ 個の要素から最下位ビットが立つ要素を $2$ つ選ぶときの選び方が $10$ 通りなので、$10 \times 10 = 100$ 通りになります。
$j=4$ のときは「総和が $1$ になる数列の数」が $0$ なので $0$ 通りです。
$N$ 個より多く要素を選ぶことは出来ないので $i=6$ のときこれ以上の更新はありません。
作った自作ライブラリを紹介する(try-partialord)

せっかく作ったので使ってもらって、批評してほしいから紹介する。
# try-partialord 
[![Crate](https://img.shields.io/crates/v/try-partialord.svg)](https://crates.io/crates/try-partialord)
f32, f64をソートするのが面倒であるという問題を安全に解決するために作った。
いままでは、

```rust
vec_f32.sort_by(|x,y|x.partial_cmp(y).unwrap());
```
のようにNANがないことを前提にするか、

```rust
vec_f32.sort_by_key(|x|ordered_float::OrderedFloat(x));
```
のようにラップする必要があった。

これを

```rust
let result = vec_f32.try_sort();
```
とすることで、NANのような比較できないものがなく正しくソートできたかを把握することができるようにするものである。

## 思ったこと
stdにおいて`f32`,`f64`を`PartialOrd`のみにして比較できない場合のエラーハンドリングを強制しながら、ソートや最大最小のような比較が必要なところでそのエラーを直接ハンドリングできないのは整合性がとれてないのではと思った。