OmniAICreator/Qiita-1.07M huggingface dataset:
複数のオンラインカレンダーを、ミスなく事故らず使いたい

## はじめに

これまで、2つのドメインのGoogleカレンダー（以下`gcal`）を、連携して使用していました。あくまでも目的は「予定の見落としによる事故（＝ダブルブッキング）を起こさず、平和なカレンダー生活を送る」です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/426adffc-45ee-e68f-788d-f37d3173abb6.png" width=100%>

設定の詳細は、[GoogleWorkspaceのカレンダーについて、ドメインをまたいだ共有を、なるべく便利に（じぶんのイメージと合うように）した](https://qiita.com/hann-solo/items/3edb03ecdf05ce35aaa1)　に書きました。

ざくっとまとめると

- macOSではブラウザでカレンダーを扱う
- `gcal-A`がメインで、`gcal-Z`は補助的な役割とする
- iOSは、`gcal-A`を見に行く

となっていました。こうして平和なカレンダー生活を送っていましたが、ある日Outlookのカレンダー`outlook-Y`がやってきたのです。もちろん`outlook-Y`くんは悪い奴じゃないんですが、google村とは異なる風習を持っているので、天下泰平で安穏としていた村の平和は打ち破られたのです。

## 風習の違いによる問題点

- outlookからgcalへの共有（一方通行）は簡単にできる（ics利用）

のですけれども、

- outlookとgcalの同期は、不可能ではないがトラブルが多い（らしい）
- gcalは、同期のタイミングをgcalが決めていて、いつ同期されるかわからない（強制同期はできない）
- gcalは、outlookに対してかんたんに共有はできない（らしい）

といった問題がありました。そのため、ブラウザで見られるカレンダー（`gcal`または`outlook`）にカレンダーを集約し、1箇所で集中的にハンドリングすることがむずかしいことがわかってきました。

そこで、macOS標準のカレンダーアプリをハブにしようとおもいました。その場合、気をつけなければならないことが見つかってきました。

- `outlook-Y`の予定をブラウザで変更し、`gcal-A`経由で見ようとすると、即時に反映されない

細かいことや経緯はさておき、要はシンプルな方針で再構築しなければならないことがわかりました。


## 新しい方法（概要）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/7636afd8-2543-72ce-e875-1c350ad31558.png" width=100%>

構成をシンプルにしました。つまり

- macOS/iOSともにアプリ使用を基本とし、ブラウザは補助的に用いる
- 各カレンダー（`gcal-A/Z`,`outlook-Y`）は、自分のドメインの予定のみ変更可能、他のドメインの予定は表示するだけ
- `gcal-A/Z`をmacOS/iOSと連携するに当たっては、同期設定を用いて必要最低限に絞る

## 新しい方法（詳細）

目的（再掲）は、あくまでも「予定の見落としによる事故（＝ダブルブッキング）を起こさず、平和なカレンダー生活を送る」です。


### 共通事項

- Googleカレンダー同期設定:
  - https://calendar.google.com/calendar/u/0/syncselect
  - ここで設定すると、macOS/iOSいずれに対しても反映されます
- iOSで用いるWeekCalは、iOSのカレンダー設定を流用します

### `gcal-A`の設定

| gcal-A            | gcal-Z | outlook-Y | macOS | iOS  |
| ----------------- | ------ | --------- | ----- | ---- |
| A11               | 表示   | ✕         | 変更  | 変更 |
| A12               | 表示   | ✕         | 変更  | 変更 |
| A13               | 表示   | ✕         | 変更  | 変更 |
| A14               | 表示   | ✕         | 変更  | 変更 |
| A21（日本の祝日） | ✕      | ✕         | ✕     | ✕    | 
| A22               | ✕      | ✕         | 表示  | 表示 |
| A23               | ✕      | ✕         | 表示  | 表示 |
| A24               | ✕      | ✕         | 表示  | 表示 |



### `gcal-Z`の設定

| gcal-Z            | gcal-A | outlook-Y | macOS | iOS  |
| ----------------- | ------ | --------- | ----- | ---- |
| Z11               | 表示   | ✕         | 変更  | 変更 |
| Z21（日本の祝日） | ✕      | ✕         | ✕     | ✕    | 


### `outlook-Y`の設定

| outlook-Y         | gcal-A | gcal-Z | macOS | iOS  |
| ----------------- | ------ | ------ | ----- | ---- |
| Y11               | 表示   | 表示   | 表示  | 表示 |
| Y21（日本の休日） | ✕      | ✕      | 表示  | 表示 |
| Y31               | ✕      | ✕      | ✕     | ✕    |


## おわりに

カレンダーにおける心の平穏を取り戻したようにおもいます。まあ、しばらく使ってみないとわかりませんが。

オンラインカレンダーは便利ですけれども、それぞれの村の風習がちょっとずつ違うので、ベストの方法を探るのはむずかしい（たのしい）ですね。

楽しいんですけれども、ノンテックユーザにとっては無理ゲーですよね。みなさん、どうやってマネジメントしているのでしょうか。

### 環境

ここで書いていることは、下記のバージョンで実施しました。

- WeekCal 13.3.7 (2)
- iOS 15.4.1
- FireFox 99.0.1
- Vivaldi 5.2.2623.26
- Google Chrome 100.0.4896.88
- macOS Monterey 12.3.1
- MacBook Pro (14-inch, 2021)
fishでPowerlevel10k風のターミナルを作成

# ZshとPowerlevel10k 

3年ほどZshを愛用していました。
つい先日社会人になり新たに環境を構築する必要がありました。
そこで良い機会だと思いFishに移行してみました。

Zshは様々なプラグインが存在していてテーマやツールなどカスタマイズができる点が魅力的でした。

中でも[Powerlevel10k](https://github.com/romkatv/powerlevel10k)というテーマがお気に入りでした。(見た目が好き）

Powerlevel10kには複数のスタイルが存在しており、
初回起動時に質問に答えていくだけで好みのスタイルを設定することができます。

[参考] Powerlevel10kによるスタイル例
![Powerlevel10kスタイル](https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/prompt-styles-high-contrast.png)

ただこのPowerlevel10k、**Zsh用なのでFishでは使うことができません**。

# FishのPowerlevel10k風テーマ[Tide](https://github.com/IlanCosman/tide)
FishでもPowerlevel10kのようなテーマを使用したと思い、探したところ[Tide](https://github.com/IlanCosman/tide)(というテーマを見つけました。

こちらPowerlevel10kをFishでも使えるようにしよう！というプロジェクトなので見た目はほぼほぼPowerlevel10kでした。

![Tideスタイル](https://github.com/IlanCosman/tide/raw/assets/images/header.png)

Powerlevel10kと同様、初回起動時に質問に答えていくだけで自分好みのターミナルを作ることができます。

プロンプトの色などの細かい設定もできるようです。(https://github.com/IlanCosman/tide/wiki)

FishでPowerlevel10ようなおしゃれなテーマをインストールしたくなったらぜひTideを使ってみてください。

## インストール (by fisher)
```bash
fisher install IlanCosman/tide@v5
```


# 参考
https://www.reddit.com/r/fishshell/comments/koyfn3/powerlevel10k_for_fish_shell/
Androidアプリを開発する #0（環境構築編）

2022/06/13 タイトルにかっこ書きを追加しました

# はじめに
業務で触る機会があった...とかではないのですが、触ったことが全く無いのもなんか嫌。。。
ということで今回からAndroidアプリ開発を始めていきたいと思います。
毎週進捗を努力目標として記事を出していきたいですが、気長に読んでいただけるとありがたいです。
初心者なので、こんなツールあるよ、こうしたほうがいいよはどんどん教えていただけると
脳のキャパシティーを超えない程度に参考にさせていただきます。

今回はタイトルにもある通り「#0」ということで下準備回なのでさらっと読み進めていただけると幸いです。

# 下準備
### 開発環境に関して
iOSは今回考慮しないのでAndroid Studioで開発していきます。
2022/04/18時点での最新版が「Android Studio Bumblebee | 2021.1.1 Patch 3 for Windows 64-bit」だったのでこちらを使っていきます。
ダウンロードはこちらから

https://developer.android.com/studio?hl=ja&gclid=Cj0KCQjwmPSSBhCNARIsAH3cYgaFYTrmC-8lrW3gMLdXWfOqvmHc8WfJVDChIkzSVSrGE6FMKCCqBmUaAnmeEALw_wcB&gclsrc=aw.ds

### プロジェクトの作成
プロジェクトを作成していきます。
公式資料はBasic Activityで開始していましたが、いろいろ見ているとEmpty Activityスタートのほうが多く、後々調べたときに情報が多そうなのでEmpty Activityで作成していきます。
選択して「Next」。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1700794/2f707d22-9cdc-a584-1663-5e642353207e.png)

アプリの名前はかなりふわっとした動機で始めたのでそのまま「Fuwatto」。
Minimum SDKはざっくり8割が使えればいいかなという考えと、なるべくサポート範囲がすくなるなるようにという思いでAPIレベル8.1(Oreo)を選択。
この状態で「Finish」。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1700794/7d03d1bf-58ff-8817-25b6-31cb6a965d9b.png)

しばらくビルドが走り終わるのを待ってから、下の画像の状態になったら開発環境はいったん完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1700794/c6d42b89-93eb-0efb-4b4e-d60dd6770cd1.png)




### スマホなどでの動作に関して
今回は実機のスマホを使用して動作確認などを行っていくので作成中のアプリが認識されるようにします。
まず前提としてスマホを開発者モードにする必要があります。

設定／デバイス情報の一番下にビルド番号という項目があります。
このビルド番号を何回かタップすることによって開発者モードを有効化できます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1700794/f2848abd-a1e6-3da5-0c65-7e9dcd8f2d90.png" width="393">


次に開発者向けオプションを開き、USBデバッグを有効にします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1700794/d30501aa-ec38-fe1b-7c7d-6ceb5d67556a.png" width="393">

この状態でPCにスマホをつなぐと、Android Studioが認識してくれて下の画像のところに名前が表示されます。
![2022-04-18_19h24_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1700794/fd98ca3c-e6f4-85b9-22d4-79dfcdfaeecf.png)

この状態でスマホ名の右横の再生アイコンを押すとスマホ側で勝手にアプリが起動します。
なにも触らずに起動するとこんな感じです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1700794/da5d92be-f0cb-8b1e-6aa2-c3abd194385d.png" width="393">


ホーム画面にもアイコンができていることを確認したところで今回はここまで！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1700794/3e254d1e-39b5-cd92-46f6-1c3dd553210c.png" width="393">




# おわりに（制作予定のアプリに関して）
今更ですが、作成するアプリは「汎用性の高そうなスケジュール・タスク管理アプリ」にしようかと考えています。
すでにいいアプリがいっぱいありそうですが、それでもなさそうな機能を考えるとワクワクしますね！
細かい仕様はできてからのお楽しみということで！
それではまた次回で！




# 参考文献
https://techacademy.jp/magazine/3257

https://developer.android.com/studio/projects/create-project?hl=ja

https://techacademy.jp/magazine/2433
PHP7技術者認定初級試験に出る$_SERVER配列

__PHPの$\_SERVER配列をPHP7初級に出る値だけでまとめました__
※$_SERVER内のkey=>value多い！全部覚えてられない！

$_SERVER配列とは連想配列で、``サーバー変数``と呼ばれています
$_SERVER['key']でvalueが出ます

では早速はじめてのPHP(オライリー本)で出現するサーバー変数を見て行きます
これに載ってないのは出ないハズ


# 1.$_SERVER['PHP_SELF']
オライリー様曰く、
__「現在のリクエストURLのパス名を保持します」__
らしい
つまり
http://うんたら.com/あーでも/こーでも.php
というURLにアクセスする場合、
$_SERVER['PHP_SELF']は
/あーでも/こーでも.phpになる
サイトによっては現在実行しているURLのパス名部分と書いてあったりする
パス名が欲しいなら$_SERVER['SCRIPT_NAME']が推薦されているらしい※テストに出るかは不明


# 2.$_SERVER['REQUEST_METHOD']
オライリー様が仰るには
__「Webブラウザが現在のページのリクエストに使ったHTTPメソッド」__
らしい``GETとかPOSTとかPUTとか``
値はかならず大文字で返って来る

# 3.$_SERVER['QUERY_STRING']
そのままクエリを返す
__クエリとはURLで言うと?以降の事__
ここで表示するモノを変更できるとかの部分
youtubeのURLとか見るとわかりやすいかも
https://www.youtube.com/watch?v=-7Emqf81ros
だったらv=-7Emqf81rosの分が入ってる※ビデオID

# 4.$_SERVER['PATH_INFO']
__最下層のパス情報__
↑みたいに``クエリを使わずに最下層のパスを知りたい時``に使う
http://うんたら.com/あーでも/こーでも.php　なら
/こーでも.phpが入ってる

# 5.$_SERVER['SERVER_NAME']
スクリプトが実行されているサーバーのホスト名

``基本うんたら.jpとかなんたら.comが入ってるっぽい``

仮想なら仮想ドメインが入ってる※上の.comとかもドメインです

# 6.$_SERVER['DOCUMENT_ROOT']
webサーバ上のディレクトリが入る
aaa.comならusr/local/htdocsとかがドキュメントルートになってたりする
この/の方が値として入ってる
僕等が編集してる側のディレクトリが入ってるイメージでいいのかな？

# 7.$_SERVER['REMOTE_ADDR']
__webサーバーにリクエストを行ったユーザのIP__
例:172.22.33.12 みたいな
これなんかテストに出るイメージ

# 8.$_SERVER['REMOTE_HOST']
webサーバー上でユーザーのIPをホスト名に変換することができるらしく、
変更した場合はREMOTE_HOSTにユーザのホスト名が入る
処理に時間がかかるらしく、殆どのwebサーバーでは変換しないでipのまんまらしい
つまりREMOTE_ADDRがメインで使われる

# 9.$_SERVER['HTTP_REFERER']
ページに来る前にユーザが閲覧していたサイトのURLが入っている
がしかし。。。簡単に偽装できるらしく信頼性は低い

# 10.$_SERVER['HTTP_USER_AGENT']
webブラウザの名前が入ってる
クロームとかIE()とか
これも偽装できるらしいけど普通のユーザは偽装しないし統計には役立つやんってオライリー様が言ってました


#
とりあえずこんな感じです
試験勉強ついでにPHP7技術者認定初級試験に特化した$_SERVERについてまとめてみました
明後日試験なので手遅れかもしれませんね！
※模擬試験では1問足らず落ちました(ケアレスミス多々あり)

明日余裕があればクッキーとセッションについてもまとめてみます
ではでは
vue.js２　基礎構文

１、二重中括弧を使用してデータを抽出する。

```<html>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>

<div id=""app>
 <a>{{ message }}</a>
 <a>{{ number }}</a>
 <a>{{ ok ? 'Yes' : 'No' }}</a>
 <a>{{ test() }}</a>
<div>
```

```<vue>
new Vue({
el: '#app',
data:{
message:'Helloworld',
number: 3 ,
ok: false
},
methods: {
  test : function(){
  return 'test';
  }
}
})
```

出力結果
Helloworld  
8
No 
test

Hellowork、numberはVueファイルの記入した
内容が出力される。
NoはOKのfalse＝反対なので、NOが出力される。
testはmethodsの関数の出力値が出力される。

２、thisを使用する。

```<html>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>

<div id=""app>
 <a>{{ test() }}</a>
<div>
```

```<vue>
new Vue({
el: '#app',
data:{
message:'Helloworld',
number: 3 ,
},
methods: {
  test : function(){
  return this.message;
  }
}
})
```

出力結果
Helloworld  

thisを使用する事で、
new Vue{}内のmessageやnumberを指定し、
文字や値を出力することができる。

return this.number;
の場合は、
3が出力される。
アリバイ工作のために写真のExif情報の日付を変更する

# 概要
撮影画像のExifの日時を変更する。例として現在時刻に変更する。
処理対象の画像⇒FullSizeRendser-1024x678.JPG
# コード
```python:
import pyexiv2
import datetime
# 現在時刻取得
dt_now = datetime.datetime.now()

# ファイルオープン
img = pyexiv2.Image( "FullSizeRendser-1024x678.JPG" )

# メタデータ読み込み
metadata = img.read_exif()

# 更新時刻、デジタルデータ化時刻、撮影時刻 を 現在時刻 に書き換え
metadata["Exif.Image.DateTime"] = dt_now
metadata["Exif.Photo.DateTimeOriginal"] = dt_now
metadata['Exif.Photo.DateTimeDigitized'] = dt_now

# メタデータ を img に書き戻し
img.modify_exif( metadata )

# ファイルクローズ
img.close()
```
ブラックジャックのなんちゃって設計(js) part4 プロパティとかメソッドをもう少し詳しく

# この記事について
各クラスのプロパティ､メソッドの役割を説明したり
メソッドとかの動きをフローチャートとかにしてみた
ただほぼ1行でかけてしまうものは省略
以下`c()`はコンストラクタから値を受け取ることを指す
コードはこちらにあります

https://github.com/s19013/webBlackJack-jsOnly-

# Main
**役割**
ゲームを進める管理者?
### プロパティ
| 変数/定数 | 名前 |型| 説明 | 初期値 |
|:-:|:-:|:-:|:-:|:-:|
|定数|$moreCardButton|HTMLelement|htmlの要素を保管|document.getElementById("moreCard")|
|定数|$fightButton|HTMLelement|htmlの要素を保管|document.getElementById("fight")|
|定数|$resetButton|HTMLelement|htmlの要素を保管|document.getElementById("reset")|

### オブジェクト
| 名前 |型| 説明 | 
|:-:|:-:|:-:|
|deck|Deck|デッキ|
|computer|Computer|コンピューター|
|human|Player|プレイヤー|
|print|Print|htmlの要素を書き換える時に使うオブジェクト|

### メソッド
#### ini()
**役割**
ゲームが始まって一番最初にやる作業

**大まかな流れ**
![ini(日本語訳).drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421721/542f0e57-7b95-8de8-0d28-3fa293b7d12a.png)

#### addCard(who)
**役割**
引数`who`に応じてカードを渡す

**大まかな流れ**
![addCard(日本語訳).drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421721/005f1966-d0e9-a1a2-7df9-3aef1667915c.png)

#### humanTurn()
**役割**
人間のターンの時のやること

**大まかな流れ**
![humanProcess(日本語訳).drawio (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421721/72af0c86-3af8-6780-7682-f0e976075329.png)



#### computerProcess()
**役割**
コンピューターのターンの時のやること

**補足**
print.changeComputerInfo(text)
受け取った引数`text`をhtmlファイルのidが`computerInfo`のpタグの中に書き込む


**大まかな流れ**
![computerProcess(日本語訳).drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421721/5285189d-646a-9634-9c9f-9f5bd1367f46.png)


#### judge()
**役割**
勝敗をつける

**大まかな流れ**
![judge(日本語訳).drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421721/17d0992f-4dbf-72ff-56b1-16960594ea66.png)

#### changeComputerDisp()
**役割**
コンピューターの表示類を変える

#### changeHumanDisp()
**役割**
人間の表示類を変える

#### $moreCardButton.addEventListener('click',(e) =>{})
**役割**
ボタンを押したら人間にカードを渡す

#### $fightButton.addEventListener('click',(e) =>{})
**役割**
ボタンを押したらコンピューターのターンに移る

#### $resetButton.addEventListener('click',(e) =>{})
**役割**
ボタンを押したらページを読み込みなおす
都道府県別に年収の平均をLINEbotで出してみた。


初めまして、すぎじゅんと申します。今回は初心者の私がmakeを用いてノーコードでLINEbotを作成しました。もしかしたら参考になる部分もあるかもしれないので是非是非見て行ってください。
# 目次

[1.作成物](#1-作成物)
[2.使用サイト](#2-使用サイト)
[3.なぜ年収にしたのか](#3-なぜ年収にしたのか)
[4.APIキーの使用方法](#4-APIキーの使用方法)
[5.都道府県コードで年収を出す](#5-都道府県コードで年収を出す)
[6.20代の平均年収に変える](#6-20代の平均年収に変える)
[7.おわりに](#7-おわりに)


# 1. 作成物
最終的に都道府県ナンバーを送ると2010-2020までの20代の年収を返してくれるbotになりました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/afe6855e-7818-b1eb-b513-f7c7abc8aec5.gif" width="100%><br>

JSONを消そうとすると2010年の一番古い情報しか手に入らなくなってしまったりしたのであえてそのままにしてあります。<br>
![スクリーンショット 2022-04-22 22.39.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/67838383-ddb1-de02-7306-0231a32dfcf3.png)
![IMG_1243.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/ef056389-5487-b837-cd4a-48b190e67bcd.jpeg)

上の画像のようになってしまったため、諦めて以下の画像にしました。
![スクリーンショット 2022-04-22 22.45.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/c88421bd-9e8c-6850-312e-2431a0febbe6.png)

# 2. 使用サイト
使用サイトは**make** というノーコードでAPIやスプレッドシートのデータを引っ張ってこれるサイトを使用しています。少しちょっと前にニンテンドースイッチで発売されたプログラミングのゲームに似ているかもしれませんね。
(リンクはこちら→https://www.make.com/en ）
使用したAPIは**RESAS-API**です。今回作った年収だけでなく、人口や産業などのAPIも取り扱っています。利用するには登録が必要ですが、無料で利用できるのはありがたいですね。
(リンクはこちら→https://opendata.resas-portal.go.jp/ ）
# 3. なぜ年収にしたのか
私は**道民歴2年目で行政書士の勉強をしている**のですが、北海道のことをあまりに知らないため、勉強しているのもあり興味本位で行政APIと検索をかけたところこのRESAS-APIにたどり着きました。北海道の平均年収を見ることでそれと比べて私はどうなのか、もっと頑張らなくてはいけないのか、という指標にすることができます。また私みたいに他の都道府県の移住を考えている場合転職サイトなど見ると思いますが、その場合その求人は平均と比べてどうなのかとすぐに調べることができます。

# 4. APIキーの使用方法
ここではLinebotとmakeの基本的な作り方に関しては割愛させていただきます。そこから知りたい方は他の方が説明しているyoutubeのリンクを貼っておきます。
(リンクはこちら→https://www.youtube.com/watch?v=NMdgJ3MuDTM&t=993s ）

しかし先程の動画などでyoutubeなどで色々makeのことを調べましたが、APIキーの使用法が載っていなく、途中で詰まってしまいました。<br>
![スクリーンショット 2022-04-18 21.10.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/68d6541f-9d38-97e5-5017-31cafe450535.png)

<br>
色々調べたところ上記のところにAPIキーを入力すると解決しました。

# 5. 都道府県コードで年収を出す
ただ普通のサンプルコードで打つと埼玉県の年収しか出ません。埼玉県民ならいいかもしれませんが、私は埼玉県には一度も住んだことがないのでほぼ興味がありません。なので、少しコードを弄りました。<br>

![スクリーンショット 2022-04-18 21.29.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/c82e8480-003c-b2dd-d5fa-d9c4eaa739a5.png)
<br>
そうすることで北海道なら1沖縄なら47と打ち込むことでその都道府県の年収を出すことが可能になりました。

# 6. 20代の平均年収に変える
![スクリーンショット 2022-04-18 20.39.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/2efcc5e3-f661-3fc1-59ae-f1cc55555e43.png)<br>
ここまでやってあれ？なんか平均年収高くないか？と思ったところ、wagesAgeが10となっていました。これは上記の画像によると50代後半の年収だということで、これを20代に直そうと思います。
![スクリーンショット 2022-04-18 21.38.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/25a4da13-f45c-1213-52e2-1dcf318cf854.png)<br>
上のようにwagesAge=10となっているところをwagesAge=4に直します。もし総数の平均が知りたければwageAge=1という風にしましょう。

# 7. おわりに
ここまで見てくださった方ありがとうございました。JSONを抜くと2010年しかデータが出てこなかったのはyearとvalueを全て抜いてしまったので一番上のデータしか出てこなかったのかもしれません。もし修正ができたならまた報告させていただきます。それではまた。
久しぶりにラズパイを起動したけどすべてを忘れていた時のメモ

久々にRaspberry Pi Model 3Bで遊ぼうと思ったけど、どんな状態だったか全部忘れてました。まず、パスワードが分からない。リモートデスクトップやSamba、SSHが繋がっていたはずだけど、繋がらないといった状況です。

状況確認から開発環境の再構築までのメモです。具体的には、OSの確認、日本語入力、パスワードの確認、SSH、リモートデスクトップ接続、Samba接続を行いました。

# OSの確認方法
```bash
$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
NAME="Raspbian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
VERSION_CODENAME=stretch
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
```

# パスワードの再設定
パスワードを忘れていたので再設定した。
下記でパスワードを再設定
```
$sudo passwd <USERNAME>
$sudo passwd root
```

# 日本語入力
下記ページを参考にしました。
https://www.indoorcorgielec.com/resources/raspberry-pi/raspberry-pi-input-japanese/

# Wifiルータ上のWindows PCからPingが通らない
結論、WindowsPC側はWindows10のping応答の設定と、Wifiの再起動で相互にpingが通るようになりました。以下、その時の確認手順です。

1. PC->ラズパイ：NG
1. PC->Wifiルータ：OK
1. ラズパイ->Wifiルータ：OK
どうやら、Wifiにはどちらも繋がっているらしい。ここで、第三者のiPhoneから調べてみる。
[Ping - network utility](https://apps.apple.com/jp/app/ping-network-utility/id576773404)アプリを使いました。

1. iPhone->Wifi：OK
1. iPhone->ラズパイ：OK
1. iPhone->PC：NG
ここで初めてNG。WindowsPC側の受信に問題がありそう。WindowsPC側はWindows10のping応答の設定を見ると"無効"となっていたので"有効"に設定変更した。
https://www.wannko.net/windows10/network/ping.html
1. iPhone->PC：OK
これでスマホからのpingが通るようになった。

ここまで試したが、概ね問題なさそう。ただ、ネットワーク上のGoogle Homeも見えないなど、ほかにもよくわからないことがあったので、とあるページを参考に、騙されたと思ってWifiルータを再起動。これですべて解決しました。

うちのWifiルータsony nsd-g1000tですが、定期的に再起動しているのか、そのタイミングでWifiロストすることがよくありました。ルータの問題かも。今度調べます。

# SSH接続
teratermから接続できるようになります。

# リモートデスクトップ
VNCは下記を参考にして、[RealVNC](https://vncrealvnc.com/en/connect/download/viewer/)をインストールしました。

参考：https://www.indoorcorgielec.com/resources/raspberry-pi/raspberry-pi-vnc/

リモートデスクトップもラズベリーパイのIPアドレスを指定したら接続できました。

ここまでで、VNC、リモートデスクトップ、SSHで接続完了できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599506/0dffbccb-0023-362e-1d13-ef66b29a15b5.png)

# Samba
Linuxの扱いに慣れてないので、WindowsPCからSambe+SSHで操作するために、Sambaをインストール。
※ 今回はすでにインストール済みでした。

```
$ sudo apt-get install samba
$ samba -V
Version 4.5.16-Debian
```

```
$ sudo vi /etc/samba/smb.conf
```
末尾に追加。意味は下記ページを参照ください。
[Raspberry Pi にSambaを設定して共有フォルダ接続](https://toki-blog.com/pi-samba/)
ここでは、home/piにpiユーザー権限でアクセスできるようにしています。guest ok = yesとして、パスワードなしでアクセスできるようにしています。

```
[raspberrypi]
 comment = Raspberry Pi
 path = /home/pi/
 guest ok = yes
 read only = no
 browsable = no
 force user = pi
```
パスワード再設定。
```
$ sudo smbpasswd -a pi
```
Samba再起動。
```
$ sudo systemctl restart smbd
```
Windows側で、エクスプローラ上のアドレスに"\\+IPアドレス"を入力すると、無事piディレクトリにアクセスすることができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599506/5b0bbd31-8559-afc3-d9cf-8eebeddfa0d3.png)

開発環境が整ったので、いったんここまでのメモとしておきます。
YouTube  英語や他言語を同時に見る方法-拡張Tool　language reactor が便利-

# YouTube  英語や他言語を同時に見る方法
英語と日本語を同時に字幕としてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/65461f20-0ef0-3d50-7909-18547ea16325.png)


# 設定方法
ブラウザの拡張Toolを設定します。

https://www.languagereactor.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/998b1559-f6e4-02ae-9c5b-e6f50eeadd00.png)

Microsoft Edge に拡張Toolいれて使っていますが、問題なく動作しました。

# 感想
YouTube で英語や他言語学ぶときに便利。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/a411544c-69b2-69f0-f5fd-29e2dcc61c1c.png)


# 参考
https://togetter.com/li/1867702
RxSwift のSingleが好きになってきた


## DispatchGroup()から解放される

今までだと、
```swift
func hogeA(huga: String, success: () -> Void, failure: () -> Void) {
    if Bool {
      success()
    } else {
      failure()
    }
}

func hogeB(huga: String, success: () -> Void, failure: () -> Void) {
    if Bool {
      success()
    } else {
      failure()
    }
}
```
↑に`DispatchGroup()`を使って

```swift
func hogehoge(huga: Stirng, success: () -> Void, failure: () -> Void) {
    let dispatchGroup = DispatchGroup()
    let dispatchQueue = DispatchQueue(label: "", attributes: .concurrent)

    // mapとか色々な理由でhogeAが終わってからhogeBしたい時
    dispatchGroup.enter()
    dispatchQueue.async(group: dispatchGroup) {
        self.hogeA(huga: "", 
            success: {
                dispatchGroup.leave()
            }, 
            failure: {
                dispatchGroup.leave()
            }
        )
     }

     dispatchGroup.notify(queue: .main) {
         // 例えば0.1秒遅らせたい場合
         DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
             self.hogeB(huga: "",
                 success: {
                     success()
                 },
                 failure: {
                     failure()
                 }
             )
         }
      }
}
```

な感じで使っていたと思う。
もしくは無限ネストとか、、
原始的かつバグを生みやすい。

それをSingle&flatMapで解決

```swift
import RxSwift

func hogeA(huga: String) -> Single<String?>{
    Single.create { single in
        if Bool {
           single(.just(""))
        } else {
           single(.just(nil))
        }
        return Disposables.create()
    }
}

// `return huga.asSingle()`な感じで`Single.create`書かないパターンも出来るのでよしなに
func hogeB(huga: String) -> Single<Void> {
    Single.create { single in
        if Bool {
           single(.just())
        } else {
           single(.error(Error))// Error型は作るなり、好きに
        }
        return Disposables.create()
    }
}
```

```swift
func hogehoge(huga: Stirng) -> Single<Void?> {
   hogeA(huga: String)
       .flatMap { str -> Single<Void> in
           // hogeAの結果strがnilだったらhogeBは叩かない（.never()で抜ける）
           guard let str = str else { return .never()}
           return hogeB(str)
           //型を変えたいなら return hogeB(str).map { "" }でSingle<String>を返せる
       }
       .subscribe(
           onSuccess: { _ in
           // '_'にはflatMapの`Void`が来る
             return .just(())
           },
           onFailure: { _ in
             return .just(nil)
           }
       )
}
```

な感じで無限に.flatMapで繋げられる。最高。
暇だったら続き書く
android studioのデバッガが遅いとき

<h1>android studioのデバッガが遅いとき</h1>

結論：使わないbreakpointを全部削除。必要なbreakpointを消してはダメです。

実機でもエミュレータでも、デバッガが遅くなる時ありますよね。

図1のような画面を見たことあると思います。
![スクリーンショット 2022-04-18 21.17.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373549/841662f3-c50f-5390-5fdc-bd0366d2eb74.png)
図１

これを図2のように削除していれば、速くなります。削除したいブレークポイントを選んで、deleteキーで削除です。<strong>チェックを外すだけではダメです。</strong>
![スクリーンショット 2022-04-18 21.18.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373549/48032fda-4a83-35ff-8745-0fd40e8767b0.png)
図2

図3のようにチェックを外すだけでは、遅さは改善されないです。
![スクリーンショット 2022-04-18 21.18.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373549/0f60d87d-48d1-3473-f9b7-09bd025b8829.png)
図3

遅くなる理由ですが、詳細は分かりません。ここからは、推測になりますが、デバッガはブレークポイントに遭遇したかどうかのチェックを、コードを実行するたびに内部でおこなっているのかもしれません。ほとんどのコードはブレークポイントに無関係ですから、これは無駄な処理と言えます。(推測ですから、間違っているかもしれません。)
【Terraform】When a network interface is provided, the security groups must be a part of it. のエラーが解消できない場合の対処法

# はじめに
TerraformでAWSのEC2を構築していた際に、``aws_autoscaling_group``ブロックで「`When a network interface is provided, the security groups must be a part of it.」のエラーが出ました。
基本的には[こちら](https://github.com/hashicorp/terraform-provider-aws/issues/4570)で議論されている内容で解消すると思いますが、私の場合は例外で別の箇所が原因でエラーが起きていたので対処法を残しておきます。

# 対処法

結論としては``launch_template``の``version``を``Latest``に指定することです。
私の場合は最初に``apply``した``aws_launch_template``ブロックのコードに誤りがあり、正しくない起動テンプレートが``Default``になっていました。

2回目以降``terraform apply``を実行すると、起動テンプレートが新しいバージョンに書き換えられており、
``launch_template``の``version``は指定しなくとも最新(``Latest``)を参照すると思い込んでいましたが、``Default``を参照するようで、それが原因でした...。

[公式ドキュメント](https://registry.terraform.io/providers/aaronfeng/aws/latest/docs/resources/autoscaling_group)にも記載がありました。

下記のように``version``を指定することでエラーが解消しました！

```tf
resource "aws_autoscaling_group" "example" {
  availability_zones = ["us-east-1a"]
  desired_capacity   = 1
  max_size           = 2
  min_size           = 1

  launch_template {
    id      = aws_launch_template.example.id
    version = aws_launch_template.example.latest_version #ここを追加
  }
```
文字コードとUnicode について

## 勉強前イメージ

文字コードの中のユニコード？雰囲気？

## 調査

### 文字コード とは

文字コードとはコンピュータ上で文字や記号をデータとして扱うために
一文字に固有の識別番号を割り振って区別できるようにしたものを言います。

コンピュータは0と1の組み合わせで、文字をデータ化したものはデータ量が多い。
そのため識別番号を割り振って0と1で文字列を表現、この対応関係を文字コードという。

### Unicode とは

文字コードの国際的な業界標準の一つで
すべての文字を網羅するも符号化集合(文字コード表)である。
Unicodeができる前は、各国別々に標準化された文字コードが使われてたが
テキストの処理を地域毎に変更しないといけなく、それを解消するためにUnicodeが開発された。
[ISO(国際標準化機構)](https://qiita.com/miyuki_samitani/items/fce52b27a1cf8dfc5166) と IEC(国際電気標準会議) で標準化された。
元々は1文字2バイトで表す予定でしたが、収録できない文字もあったため拡張規格が作られた。

Unicodeができるまでは英語ともう一つの言語は使えたが、もっと多くの言語は同時に使えなかった。
そこでUnicodeが作られ、世界中の文字コードを統一して使えるようにした。
言語の種類でプログラムの変更も不要になり、国際化ができるようになった。

### おまけでUTF-8 とは

Unicodeで標準化された符号化方式の一つで、
Unicodeの符号を8bitで単位表す。
最初の128文字はASCIIと一緒で、128～255番では従来1バイトで表現されていたものが2バイトになり、
日本語など2バイトで表現されていたものは3バイトになった。

## 勉強後イメージ

よくUTF-8を文字コードだって言ってたけど
あれば符号化方式であって文字コードではないのね。

## 参考

- [Unicodeとは](https://www.nic.ad.jp/ja/basics/terms/unicode.html)
- [文字コード 【character code】 キャラクターコード](https://e-words.jp/w/%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89.html)
AtCoder Beginner Contest 248

# この記事の目的
最近少し競技プログラミングから離れており、エンジニアとしてこれからどのようになっていけば良いかとちょっと悩んでいる時期でもありましたが、心機一転取り合えず技術力向上/何か行動を起こさなければということで`Atcoder`の問題を解くことを再開しようと思います。

とりあえず、練習をたくさん積んでC・D問題を解けるようになりたいと思います。

# [A問題](https://atcoder.jp/contests/abc248/tasks/abc248_a)
この問題は[0-9]の10種類あるうち、1種類だけ出てこない数字があるのでそれを見つけてくださいという内容です。
案としては、
1. 入力を昇順にソートして0から確認していく(ソートで時間かかるけど全探索は済む)
1. [0-9]のリストを作成して入力の先頭から確認していく(ソート処理は必要ないけど全探索しなければいけない)
1. 入力の数字全部足して45-入力の合計をする

考えつくのはこれくらいでした。
3つ目の考え方をコードにすると以下の感じです。他の案より簡潔で良いかもしれません

```python
num_list = [int(a) for a in input()] 
print(45-sum(num_list))
```

# [B問題](https://atcoder.jp/contests/abc248/tasks/abc248_b)
3つの入力値から必要な条件を満たす演算をする問題です。

とりあえず、AがB以上になるまでwhileループしてみましょう。以下のような感じです。

```python
a,b,k = map(int, input().split())
answer = 0

while True:
  if a >= b:
    break
  else:
    a *= k
    answer += 1
print(answer)
```

正直、whileで無限ループにするのはBが果てしなく大きい時とか、最終的に答え出せなかった時に困りそうですが今回のに制約的にKは1ではないので無限に計算していればいずれは解答にたどり着くことができるので、whileで正答できました。

```
1. 1≤A≤B≤10^9
2. 2≤K≤10^9
3. 入力は全て整数
```

# [C問題](https://atcoder.jp/contests/abc248/tasks/abc248_c)

はい、来ましたね問題文読んでもイメージ湧かなくて詰む系のやつ。
こういうものって大体動的計画法とか計算量を減らすアルゴリズムを使わないといけません。

とりあえず動的計画法(Dynamic Programming)のアルゴリズムの解説などみながら解いてみましょう。
まずは、以下のように計算したものを入れる箱を作りましょう。

```python
n,m,k = map(int, input().split())
dp = [0] * n * m
```

動的計画法は漸化式のように、`dp[i+1] = dp[i] + ？`という感じになるのは知っているのですが、どうやら今回は数列の総和が条件に入っているため一工夫が必要なようです。

詳しくは、[公式解説](https://blog.hamayanhamayan.com/entry/2022/04/16/224328)の方の説明が非常にわかりやすかったです。

dp[数列から選択する要素の数][総和]という2重配列にするようです。解説の部分だと、以下のところです。
> 総和が4である「1 3」と「2 2」は数列の3番目以降を選ぶという観点では、条件が全く同じになる。

ということで、2重配列になることをふまえると以下のように変化します。

```python
n,m,k = map(int, input().split())
dp = [[0] * (k+1) for _ in range(n+1)]
dp[0][0] = 1
```

そして計算の部分ですね。
長さがnということで、一番外のforはn回繰り返す。
そして2個目のforでkを繰り返し使います。
なぜkかというと、kはこれまでの総和の計算結果ということなのでこれに数列の次の数字を足すことで求めたい総和の要素番号はわかるといった感じですかね(解釈が怪しいですが、、)
最後のforで数列の総和を計算するといった構成に。
計算部分では、制約条件2つ目をifとして、動的計画法の計算と最終的な計算結果は余りを出さなければいけないので各計算ごとに余りを算出しておきましょう

```python
for i in range(n):
    for j in range(k):
        for kk in range(1,m+1):
            if j + kk <= k:
                dp[i+1][j+kk] += dp[i][j]
                dp[i+1][j+kk] %= MOD
```

そして、全て計算し終わったところで、以下のように選択しなければならない要素(=n)と総和がkよりも小さい計算結果を足してmodで余りを算出するという工程を踏めば無事に答えまで辿り着けるはずです。

```python
ans = 0
for l in range(1,k+1):
    ans += dp[n][l]
    ans %= MOD
    l += 1
 
print(ans)
```

# 最後に

やはりC問題が解けないですね、、(永遠の課題)
動的計画法など、アルゴリズムがどういったところで活かされるかを理解しながらやらなければ、学んでもうまく活用できずに終わってしまいそうなので実践的な使用例などを参考にしつつ、理解を深めていきたいです。
CSS適応の優先順位（詳細度）について

# はじめに
デベロッパーモードを確認しつつCSSをいじっていた時に自分があてたいと思っていたCSSが打ち消されてあたらないことがよくありました。元々優先順位があることはなんとなく知っていましたが、今回を機に優先順位（詳細度）を自分用にまとめることとしました。

↓今回はCSSの確認用に下記サイトを使用。
https://jsbin.com

## 詳細度とは

>詳細度 (Specificity) は、どの CSS プロパティが要素に最も関係があるか、すなわち適用されるかをブラウザーが決定する手段です。  
>>https://developer.mozilla.org/ja/docs/Web/CSS/Specificity

これは実際にスコアというか尺度を計算して優先度（詳細度）を決定しているみたいですね。

### セレクターの種類と詳細度
>セレクターが持つ詳細度の量は、4 つ の異なる値（またはコンポーネント）を使用して測定されます。これは、1,000、100、10、1 のそれぞれの位として考えることができます。
>「1,000」 宣言が style 属性（別名、インラインスタイル）内にある場合、これがスコアされます。このような宣言にはセレクターがないため、その詳細度は常にシンプルに 1,000 です。
「100」 全体のセレクターの内部にある ID セレクターは、これがスコアされます。
「10」 全体のセレクターの内部にあるクラスセレクター・属性セレクター・擬似クラスは、これがスコアされます。
「1」 全体のセレクターの内部にある要素セレクターまたは疑似要素には、これがスコアされます。

まとめ
1 → 要素型セレクター（h1 など）と擬似要素（::before など）
10 → クラスセレクター（.example など）、属性セレクター（[type="radio"] など)、擬似クラス（:hover など）
100 → ID セレクター（#example など）
1000　→ タグに直書き（例：`<h1 style="color:red;">hoge</h1>`）
セレクター一つに付き左の数字を足していく感じですね。
例
　`div #hoge .hoge li .test{color:red;}`みたいな感じで指定したとすると
　要素型セレクター　→　div と li で 0002
　クラスセレクター　→　.hoge と .test で 0020
　IDセレクター　　　→　#hoge で0100
全てを足すとスコア0122となります。
### 実際の例
##### 1
![無題1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632871/9c9c1cb4-70de-0ae9-6525-7ef02d536a0e.png)
コメントアウトされている部分がスコアになります。どちらも要素型セレクターのh1を指定していて、スコアはどちらも「0001」となります。（MDNにならって0埋めします。）
スコアが同じ場合後に書いた方が優先されますので（）、青色が適応された状態となっています。

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

##### 2
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632871/00314fc3-475c-8f56-72c0-a9738be6c5fe.png)
スコアはIDセレクターで指定したものが「0100」で一番スコアが高いので、紫色が適応された状態となっています。

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

##### 3
![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632871/ebd3f9bb-340b-ee78-d8a9-fe45a73a15b6.png)
非常に適当にIDとクラスを付けたもので、継承などの知識も必要かもしれませんが、スコアだけで何故この色が適応されているのかはわかるかと思います。
また`!important`は簡単にいえばスコアを無視して最優先にするものですが、これはまたの機会にします。


## まとめ
まだまだ必要なことはあるかと思いますが、これを知っているだけでも少しCSSを書きやすくなったかと思います。
さくらオブジェクトストレージで定期的にオブジェクトの自動削除

# バックアップ取ってます

さくらVPSサーバーにあるアプリケーションのバックアップを毎日、さくらのオブジェクトストレージに転送してます。

# やりたい事

バケット内に溜まった古いオブジェクト(バックアップファイル)を定期的に削除したい！

# ライフサイクルの様な機能がなかった

さくらのオブジェクトストレージはAWSのS3と互換を持ってて、`aws cli`　で操作出来て割と使い勝手がいいのですが、AWS S3のライフサイクルのような機能を使って定期的に削除するという機能がありませんでした。
そのうち実装されるのかな。。

# 定期的に削除するShellを作ってみた

日付で特定しやすいようにバックアップファイル名には日付入りで保管してます。

こんな感じ　→ `bkup_20220418.tar.gz`


```shell
#!/bin/bash

〜〜

# バケットに保管する期限
readonly EXPIRE=`date -d '10 day ago' +"%Y%m%d"`

# バケットにあるオブジェクトのリストを取得します
items=`aws --endpoint-url=https://s3.isk01.sakurastorage.jp/ s3 ls [バケット名] | awk '{print $4}'`

for item in ${items}
do
  # ファイル名に含まれた日付の部分を抽出します
  item_date=`echo ${item} | sed -e 's/^bkup_\([0-9]\+\).tar.gz/\1/'`

  # 日付形式になっているか確認します
  `date '+%Y%m%d' -d ${item_date} > /dev/null 2>&1`

  # 取得した値が日付形式である事、保管する期間が過ぎたファイルはバケットから削除します
  if [ $? -eq 0 ] && [ ${item_date} -lt ${EXPIRE} ]; then
    `aws --endpoint-url=https://s3.isk01.sakurastorage.jp/ s3 rm [バケット名]/${item}`
  fi
done
```

これでいけるか？

と、思ったら動きがおかしい。

消したい対象のファイルが１つの場合は正常に削除出来ますが、複数あった場合、`for` でちゃんと動かない。

10日より前のファイルがあったら全部消して欲しいので、これはちゃんと動くようにしたい。

## どのような動きをするのか？

1. 10日より前のファイルが複数ある場合、もっとも古いファイルは削除出来た。
2. しかし次のファイルを消そうとすると `delete:: コマンドが見つかりません` と出た。

ちょっと理由は分かりませんでした。
連続して命令が出せない様になっているのか、`rm` コマンドはループしない方がいいのか、理由を知ってる方がいらっしゃいましたら教えて欲しいです。

# 試しに s3api を使ってみた

[さくらオブジェクトストレージでS3APIが使えました](https://manual.sakura.ad.jp/cloud/objectstorage/api.html)

- S3のAPI経由で削除してみる。


```shell
#!/bin/bash

# バケットに保管する期限
readonly EXPIRE=`date -d '10 day ago' +"%Y%m%d"`

# バケットにあるオブジェクトのリストを取得します
items=`aws --endpoint-url=https://s3.isk01.sakurastorage.jp/ s3 ls [バケット名] | awk '{print $4}'`

for item in ${items}
do
  # ファイル名に含まれた日付の部分を抽出します
  item_date=`echo ${item} | sed -e 's/^bkup_\([0-9]\+\).tar.gz/\1/'`

  # 日付形式になっているか確認します
  `date '+%Y%m%d' -d ${item_date} > /dev/null 2>&1`

  # 取得した値が日付形式である事、保管する期間が過ぎたファイルはバケットから削除します
  if [ $? -eq 0 ] && [ ${item_date} -lt ${EXPIRE} ]; then
    - `aws --endpoint-url=https://s3.isk01.sakurastorage.jp/ s3 rm [バケット名]/${item}`
    
    + // 値が空だったら終了 ※
    + if [ -z ${item} ]; then
    +   exit 0
    + fi
    + `aws s3api delete-object --endpoint-url=https://s3.isk01.sakurastorage.jp/ --bucket  [バケット名] --key ${item}`
  fi
done
```

`s3api` だとちゃんとループして複数のファイルを削除出来ました。

ただ注意しないといけないのが、`--key` に渡す値が空だと、バケットの中身を全部消しちゃいます。

う〜〜ん。怖い・・・・

なので、事前に値が空だったら終了というようにしています。
　　　　↓   　　　　↓
```shell
    // 値が空だったら終了 ※
    if [ -z ${item} ]; then
      exit 0
    fi
```

あとは、このスクリプトファイルを Cron で実行させれば、自動削除の完成です。

# まとめ

うまく複数のファイルをループして消せましたが、やり方を間違えるとバケットの中身が一瞬で全消しされるので、参考程度で(・ω・;)

使う場合は自己責任でお願いします。

あと、もっと効率よく、さくらオブジェクトストレージで定期的にオブジェクト削除出来るやり方がありましたら教えて下さい！
windowsでLaravel-mixが使えなくて詰まったのでメモ

今までMacでLaravelを学習しており、実務でWindowsを触るようになったので、違いに苦労しています。

そこでLaravel-mixを使う時に詰まったのでメモです。

# 詰まった内容

Laravelプロジェクトをwinsdowsのvagrant上で起動した時に、Laravel-mixを使おうとした時に、npm　installができない。
エラー内容はシンボリックリンクのエラーが出た。

# 原因
vagrant up するときに管理者権限で立ち上げなければいけなかった。

# 自分が解決した内容


**powershellを右クリックして、管理者権限で開くで開く**

(もうvagrantでLaravelプロジェクトを開いていれば、vagrant halt　でログアウト)

**自分のhomesteadのパスをエクスプローラー等で確認して、コピペで貼ってディレクトリー移動**


``` 
 $vagrant up
 ```

```
$vagrant ssh
```

**自分の開発しているディレクトリに移動**



```
npm install
```

自分はキャッシュのエラーが出たので、
```
$npm cache verify --force
```

```
$npm run dev 
```
を実行したら動いてくれた。


Laravelでシンボリックリンクを張りたければ
```
$php artisan storage:link
```
を実行してください。

# まとめ
windowsでvagrantを使って開発している時にLaravel-mixを使いたいときは、最初に管理者権限で実行することがわかりました。
日々学習の毎日ですが、少しずつ精進したいものです。

**参考リンク**

https://zenn.dev/gz/articles/72c8f93f9c440b

https://qiita.com/Masahiro111/items/82d1105aa5d82ee23282
PowerAutomate: Teams へのメッセージ投稿(HTML)でタグが表示される場合は、改行置換してやると上手くいくかも

# 背景
Teams の Trigger を使って自動化をする際、元の投稿内容が壊れて表示されることがあったのでその対処法

# 対象アクション
現状は、以下で再現。
[チャットまたはチャネルでメッセージを投稿する](https://docs.microsoft.com/ja-jp/connectors/teams/#%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%81%BE%E3%81%9F%E3%81%AF%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E3%81%A7%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B)
[チャネル内のメッセージで応答します](https://docs.microsoft.com/ja-jp/connectors/teams/#%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E5%86%85%E3%81%AE%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%A7%E5%BF%9C%E7%AD%94%E3%81%97%E3%81%BE%E3%81%99)

# 現象
HTML の解析に失敗しているのか？　タグが表示されてしまう。

本来は、リンク
[マイページ](https://qiita.com/baku2san)  << こんな感じ

## チャットでの異常時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/5b05204d-8f60-0354-8e2e-b50631f1bac1.png)

## チャネルでの異常時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/fc607bbc-e327-7fef-8a4c-627447f95498.png)

## VS-Code での正常な表示
出力内容自体が壊れているのか？と思い、Outlook に送信してみたり、VS-Code で表示してみたが特に問題無さそう。
ってことで、Teams の Action に問題があるとの認識で、原因と対処を検討してみたのが今回
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/8a8d9018-0643-1bb4-698b-f0af984a1ef0.png)

# 原因・・と思われるもの
とりあえず、以下のように改行コードが入っていて、こいつを置換して削ってやると上手くいったので原因の一つとして考えて良さそう

ただ・・
- bulletins の時だけ発生
- Outlook の Send a email の HTML では特に問題なし
- \t はあっても問題無し

という条件があるので、\n が、というよりは、エスケープコードとしての "**\\**" が悪さをしてそうな気がする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/eacf603a-291f-6f9a-cd0c-de5626660fd5.png)

## 詳細
Teams の Trigger コネクターを利用し、取得した内容を元に処理をしようとすると、ContentType:HTML で Content に HTML ベースの投稿内容が取得出来る。

例えば、[新しいチャネル メッセージが追加されたとき](https://docs.microsoft.com/ja-jp/connectors/teams/#%E6%96%B0%E3%81%97%E3%81%84%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB-%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%8C%E8%BF%BD%E5%8A%A0%E3%81%95%E3%82%8C%E3%81%9F%E3%81%A8%E3%81%8D) を使った場合の例が以下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/2adf2c07-2656-4cd4-e19d-a2db6535f5bf.png)



# 対処法
上であげた、原因を排除してしまえばいいので、改行を Replace() してやる

```json:改行の置換方法
@{replace(outputs('Compose'),decodeUriComponent('%0A'),'')}
```

:::note warn
以下のような改行置換では反応しないので、decodeUriComponent を使って指定してやること
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/8058d833-75a0-153d-68e0-6c65a0388f96.png)

:::


## 置換後の比較
### チャットでの改善
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/e2804150-66e0-212a-f20c-e341eee93eee.png)

### チャネルでの改善
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/ed5aa16e-2fbb-8df8-a725-5a4c28a90d2c.png)

# あとがき
HTML の Advanced Mode 編集ではよく HTML が壊れてしまうんですが、同じような原因なのかも？
ただ、Outlook では再現しなかった・・

HTML が壊れてしまう件については、以下に対処法が公開されてます。

https://qiita.com/h-nagao/items/d1b1c066e26b0f2ac7a9

# keyword
how to fix when html message is broken in post or reply message
Docusaurus 設定方法 Site Metadata

### Site metadata
https://docusaurus.io/docs/docusaurus.config.js

上記に詳しい説明がありますが、以下の設定が必須のようです。

### title
文字列で設定、WEBサイトとして設定した場合のタイトル、HTMLのヘッダー`<head>`: 文書メタデータ (ヘッダー) 要素の` <title>`に設定される。  
さらに、useDocusaurusContext()でReact内部にも持ち込める。

###### 設定例

```javascript
module.exports = {
  title: 'おれおれサイト',
};
```

###### サイトヘッダー

```html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="generator" content="Docusaurus">
    <title>おれおれサイト</title>
    <link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="おれおれサイト Blog RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="おれおれサイト Blog Atom Feed">
    <script defer src="/runtime~main.js"></script><script defer src="/main.js"></script><link href="/styles.css" rel="stylesheet">
  </head>};
```

###### JSX

```javascript
function HomepageHeader() {
  const {siteConfig} = useDocusaurusContext();
  return (
    <header className={clsx('hero hero--primary', styles.heroBanner)}>
      <div className="container">
        <h1 className="hero__title">{siteConfig.title}</h1>
      </div>
    </header>
  );
}
```

###  url
文字列で設定、WEBサイトとして設定した場合のトップレベルとなるホスト名、  
たとえは<span style="color: #1464b3"><b>https://facebook.github.io</b></span> とか<span style="color: #1464b3"><b>https://facebook.github.io</b></span>/metro/　とかの場合、青色の部分を設定

###### 設定例

```javascript
module.exports = {
  url: 'https://docusaurus.io',
};
```

###  baseUrl
文字列で設定、WEBサイトとして設定した場合のホスト名+パスとなる部分
たとえはhttps://facebook.github.ioの場合は `/` を設定  
https://facebook.github.io/<span style="color: #1464b3"><b>metro/</b></span>　とかの場合、濃い青色の部分を設定  `metro/`  
決まりとして最後はスラッシュ`/`で終えなければいけないようです。

###### 設定例

```javascript
module.exports = {
  baseUrl: '/',
};
```
```javascript
module.exports = {
  baseUrl: 'metro/',
};
```
import した aws_db_instance で想定しない差分が出るとき

# 概要

`terraform import` で RDS の MySQL をインポートした。
差分が出ないように記述したものの、以下のような差分が出てしまう。

```hcl
  # module.rds.aws_db_instance.primary will be updated in-place
  ~ resource "aws_db_instance" "primary" {
      + character_set_name                    = ""
      + domain                                = ""
      + domain_iam_role_name                  = ""
        id                                    = "hoge"
      + identifier_prefix                     = ""
      + kms_key_id                            = ""
      + monitoring_role_arn                   = ""
        name                                  = "fuga"
      + nchar_character_set_name              = ""
      + password                              = (sensitive value)
      + performance_insights_kms_key_id       = ""
      + replica_mode                          = ""
      + replicate_source_db                   = ""
      + timezone                              = ""
        # (45 unchanged attributes hidden)

        # (1 unchanged block hidden)
    }
```

character_set_name, domain, ... といった要素が、いずれも空文字で差分が出ていた。

# ドキュメント

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/db_instance

例えば `character_set_name` は

>  (Optional) The character set name to use for DB encoding in Oracle and Microsoft SQL instances (collation). This can't be changed.

と書かれており、明らかに MySQL 向けの設定ではない。ほかの空文字の要素も Optional で設定不要なものばかりだった。

# import 直後の tfstate

```json:terraform.tfstate
    {
      "module": "module.rds",
      "mode": "managed",
      "type": "aws_db_instance",
      "name": "primary",
      "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
      "instances": [
        {
          "schema_version": 1,
          "attributes": {
                :
            "character_set_name": "",
   :
```

tfstate には character_set_name がすでに空文字で定義されていた。
つまり、差分として本来出る必要のないものが、 plan 時に差分として出ているようだった。

# 対応

そのまま apply しても特に支障はなかった。
ただ、apply 中に本来必要でない `Resetting-master-credentials` というステータスが出たのが気になった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49525/e6511c04-49ec-8e05-846f-a42e1f40b6b9.png)

文字通り認証情報の更新が行われたと思われる。

ここで冒頭の差分を見てみると、 `password` でも差分が出ていることがわかる。
これといってパスワードは変えたつもりはないが、同じ値であっても import 直後だと上記「Resetting-master-credentials」がわざわざ生じるのかもしれない。

そこで、別環境で同様の事象が発生した際に `password` を ignore_changes に入れてみた。すると、冒頭の差分は一切出なくなった。

```hcl
resource "aws_db_instance" "primary" {
   :
  lifecycle {
    ignore_changes = [
      password,
    ]
  }
}
```

なぜ password を ignore するとほかの差分も消えるのかはわからないが、そういうものなのかもしれない。
Docusaurusの紹介

WEB系システム開発においてフロントエンドとバックエンドがあるが、現在主流となりえるやり方として
フロントエンドは静的サイトジェネレーター(SSG)、バックエンドはいわゆるRestAPIかGraphQLの採用が多くなってきた。  （バックエンドは言語、エンジン等は特に問わないが、環境によって影響される要素が強い）  
じゃあ、いまのフロントエンドってなにがあるのって思ってググってみると以下のサイトが見つかった。  

GatsbyJS 現代のWordpress
https://tech.bitbank.cc/20210201/

このなかで利用したことがあるのはNUXT,Gatsbyであるが、どちらかとVueよりはReactを使いたいのでNEXT、Gatsbyが候補。  
NEXTは先ほどのサイトを見ると使ったことはないが、SSR(Server Side Rendering) らしく却下、Gatsbyを試してみたけど
GraphQLなどちょっと先取りしすぎな点が難点であり、なにかないかな～と思っていたところ  
# Docusaurus  
https://docusaurus.io  

を見つけた。
Gatsbyと似ているが、ドキュメント用のWEBサイトに特化しているようである、以下のような特徴があるように書いてある。

##### Powered by Markdown
Markdownでページを作成できて、その中にJSXも記述できる。

##### Built Using React
Reactエンジンなので、拡張、カスタマイズが簡単そう。

##### Ready for Translations
WEBサイトの多言語化も可能。

##### Document Versioning
ドキュメントのバージョニングが可能。

##### Content Search
Algoliaによる全文検索が可能。

これならもしかして、WEBサイトやブログはもとより、バックエンドと絡めてWEBシステムも構築可能なのでは？
早速スターターを動かしてみたら、解らないことだらけ、しかもググってみても日本語のページは少なく
まだそんなに注目されていない感じ、なら学習を兼ねてここで使い方なんかを記事にしてもいいかなと思い立った。
Atcoder初心者学習①　ビット全探索　【競プロ典型90問　002】

# 問題
https://atcoder.jp/contests/typical90/tasks/typical90_b

# bit全探索
本問題の場合、N文字の中で使用可能な文字は"("と")"のみなので、0と1のみの1bitで表現できる。

例.
((()))→000111
()()()→010101

このときN文字の全組み合わせは$2^N$通り存在する。これを素直に実装しようとすると

```java
for(int i_0=1; i_1<=1; i++){
      for(int i_2 =0; i_2<=1; i++){
         /*・・・*/
               for(int i_N = 0; i_N<=1; i++){
                   a = i_0*10000000... + i_1*1000000... +/* ・・・*/ + i_N-1*10 + i_N;
                }
       }
}
```
とn重ループで、**実装が煩雑で大変**。

そこでビット全探索を用いた実装を行う。
```java
for(int i=0;1>>N;i++){ //※1
      a = i;
}

```
上の場合例えば、$00000111$(N=8とする)に対応する7がaに代入される。

# 2進数にしたときの値が1の桁の数
例. 155を2進法で表したとき1を何個含むか?
ただし2進数の桁数はNとする。


```java
int i = 155;
int cnt = 0; //カウント数
for(int j = 0; j<=N-1; j++){
       if(i&(1<<j)==1) cnt++; //※1,2
}


```

※1 1<<nとは1をnビット左シフトした結果。例えば1<<3は 1000(2)。
※2 i&nとはi(10)とn(10)の論理和をとる。例えば5&(1<<2) = 5&4 (10) = 101&100 (2) = 100(2) = 4

# bit全探索における計算量の見積もり　”2のべき乗と10のべき乗”

Nビットについてbit全探索を行うと計算量は$2^{N}$かかるが、その値がどのくらいになるかの目安を知りたい。

$10^{3}  \fallingdotseq 1024 = 2^{10} $
という関係があります。また10進数のオーダーに対しては
**$O(10^6)～O(10^8)$あたりでおよそ1秒の計算時間がかかります**
ただしこの時間は使用する言語やプロセッサなどにより変わります。

つまり概算として
$[2^{20},2^{26} ]= [1048576, 134217728] \fallingdotseq [10^6 ,10^8] (step) = 1(s)$
となります。
円周率を計算する　その３

前回の続き  
  
円周率をPCで計算する。
実際、円周率計算ソフトなどをつかって円周率を求めることができるが  
スクラッチ状態から円周率プログラムを組んだことがなかったので実際にやってみた。  
  
前回はdouble型の精度の問題で15桁までしか計算できなかった。 
今回は多倍長ライブラリ(GMP)を使って任意の精度まで計算するように変更。  
以下がそのソース。  
digits　変数で任意に精度を設定　今回は 200 でやってみる。

<!-- more -->

```cpp
//★精度 ここを調整する
int digits = 200;
```

```cpp
#include <math.h>
#include <iostream>
#include <iomanip>
#include <gmpxx.h>
#include <string>

mpf_class power(mpf_class x, int n)
{
    mpf_class powval(1);
    for (int num = n; num != 0; --num)
    {
        powval *= x;
    }
    return powval;
}

class Parameter
{
  public:
    mpf_class a;
    mpf_class b;
    mpf_class t;
    mpf_class p;

    Parameter() : a(1.0), b(1.0 / sqrt(mpf_class(2))), t(1.0 / 4.0), p(1.0)
    {
    }
};

mpf_class gauss_Legendre_algorithm(Parameter &param)
{
    mpf_class r;
    mpf_class a = (param.a + param.b) / 2;
    mpf_class b = sqrt(param.a * param.b);
    mpf_class t = param.t - param.p * power((param.a - a), 2);
    mpf_class p = 2 * param.p;

    r = power((a + b), 2) / (4 * t);

    param.a = a;
    param.b = b;
    param.t = t;
    param.p = p;

    return r;
}

int main(int argc, char *argv[])
{
    std::cout << "Start.." << std::endl;

    //★精度 ここを調整する
    int digits = 200;
    //
    //精度
    mpf_set_default_prec(digits * log2(10));
    //何回計算する？
    int recursion_count = log2(digits);

    Parameter param;
    mpf_class pi;

    for (int i = 1; i <= recursion_count; i++)
    {
        pi = gauss_Legendre_algorithm(param);
    }

    std::cout << "有効桁 = " << digits << std::endl;
    std::cout << "計算回数 = " << recursion_count << std::endl;

    mp_exp_t exp;
    std::string significand = pi.get_str(exp);
    std::cout << "pi = " << significand.insert(1, ".") << std::endl;

    std::cout << "End.." << std::endl;
    std::cin.ignore();
    return 0;
};
```

結果
```
Start..
有効桁 = 200
計算回数 = 7
pi = 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097565
End..
```
計算結果  
3.  
1415926535 8979323846 2643383279 5028841971 6939937510  
5820974944 5923078164 0628620899 8628034825 3421170679    
8214808651 3282306647 0938446095 505822  

実際は  
3.  
1415926535 8979323846 2643383279 5028841971 6939937510   
5820974944 5923078164 0628620899 8628034825 3421170679    
8214808651 3282306647 0938446095 5058223172 5359408128  

おお、当たり前かもしれないけど合っている！！。  
  
ちなみに　int digits = 100万(1000000)で計算してみる。  
計算回数はたったの19回、計算時間は数秒！！

結果
```
Start..
有効桁 =1000000
計算回数 = 19
pi = 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865
...長いので省略！！
403332127284919441843715069655208754245059895678796130331164628399634646042209010610577945815130927562832084527
End..
```
dockerで立ち上げたlaravelとmysqlのDB接続できなかった話

## 前提
https://www.engilaboo.com/laravel-docker/
上記記事のデータベース接続でエラーが出てつまづいた。

## 試したこと
まず、`php artisan migrate`をしているところがアプリケーションのコンテナ内じゃなかったのがダメだった。
(コンテナ内からの呼び出しはdbとかdocker-compose.yamlに記載のもので接続する。逆にコンテナ外からの呼び出しは、大体 127.0.0.1 で呼び出せる)

なので、execでアプリケーションコンテナに入って実行。

コンテナに入ってコマンドをうっても、以下エラーがでた。

```
SQLSTATE[HY000] [1045] Access denied for user 'user'@'172.20.0.3' (using password: YES) (SQL: select * from information_schema.tables where table_schema = database and table_name = migrations and table_type = 'BASE TABLE')
```

dockerのMYSQLではlocalhost(172.20.0.3)で接続できないエラーのよう。
(172.20.0.3はdockerが勝手に振ったホスト、いずれにせよlocalhostを意味する。)
参考記事
https://codeaid.jp/blog/docker-mysql-php/

# 解決方法
mysqlのログインユーザーに権限をもたせると解消されるらしく、.envのDB_USERNAMEをrootにしたらエラーが解消された。
docker-compose.yamlのDB_USERNAMEをrootにするとエラーでmysqlコンテナが立ち上がらなくなるので注意。
rootユーザーは`%`権限をもっているからだとおもう。

# おまけ
userのままでもmysqlから権限を付与すれば対応可能か？と試行錯誤

`docker-compose exec db bash`
でmysqlコンテナに入って
`mysql -u root -p`
で、パスワードを入力してmysqlに接続したら、
`GRANT ALL ON `データベース名`.* TO 'ユーザー名'@'%' ;`
こんな感じで権限を付与すればいけるはず。
最初の設定であれば、
`GRANT ALL ON `database`.* TO 'user'@'%' ;`

とすれば解決のはずが、なぜかログインしているroot権限で他のユーザーにGRANTできずｗ
エラー内容。
`ERROR 1410 (42000): You are not allowed to create a user with GRANT`
当該ユーザーの作成のときにlocalhost をつけないと表示されるようだ。
 https://note.com/haraaa/n/n8ea4986ec3b5

ユーザーを一度削除してから作り直した
`DROP USER 'user'@'localhost';`
`CREATE USER 'user'@'172.20.0.3' IDENTIFIED BY 'pass';`
`GRANT ALL ON `database`.* TO 'user'@'%' ;`
https://www.digitalocean.com/community/tutorials/how-to-create-a-new-user-and-grant-permissions-in-mysql-ja

dockerからlaravelをインストールしてmysql接続がこんな手数あるはずないので、もっとスマートなやり方があるはず。最初からMYSQL_USERをrootにしておくのがいいのかな。
円周率を計算する　その２

前回の続き  
  
円周率をPCで計算する。
実際、円周率計算ソフトなどをつかって円周率を求めることができるが  
スクラッチ状態から円周率プログラムを組んだことがなかったので実際にやってみた。  
  
前回は一回しか計算できないプログラムなので 
今回は　n回　計算できるようにソースを改変
以下がそのソース。

<!-- more -->

```cpp
#include <math.h>
#include <iostream>
#include <iomanip>

class Parameter
{
  public:
    double a;
    double b;
    double t;
    double p;

    Parameter() : a(1.0), b(1.0 / sqrt(2.0)), t(1.0 / 4.0), p(1.0)
    {
    }
};

double gauss_Legendre_algorithm(Parameter &param)
{
    double a = (param.a + param.b) / 2.0;
    double b = sqrt(param.a * param.b);
    double t = param.t - param.p * pow((param.a - a), 2.0);
    double p = 2.0 * param.p;

    param.a = a;
    param.b = b;
    param.t = t;
    param.p = p;

    //pi計算
    return pow((a + b), 2.0) / (4.0 * t);
}

int main(int argc, char *argv[])
{
    std::cout << "Start.." << std::endl;
    Parameter param;
    double pi;

    for (int i = 1; i < 6; i++)
    {
        pi = gauss_Legendre_algorithm(param);
        std::cout << "pi = "
                  << std::fixed
                  << std::setprecision(15)
                  << pi
                  << std::endl;
    }

    std::cout << "End.." << std::endl;
    std::cin.ignore();
    return 0;
}
```

結果
```
Start..
pi = 3.140579250522169
pi = 3.141592646213543
pi = 3.141592653589794
pi = 3.141592653589794
pi = 3.141592653589794
End..
```
実際は  
3.141592653589793238462643... なので  
3.14159265358979 まではあっている。

しかし！！　５回計算してみたのだが３回目からはすべて同じ答えになっていて  
これ以上続けても無意味！！

doubleの仮数部は52bitなので  
double 型の精度（有効桁数）は２進数にして 53 (=52+1) 桁であり，１０進数では約 15 桁となって  
これ以上の精度は出せない。

う〜ん、意外に長大な円周率は簡単には表現できないらしい。  
ではどうする？

そもそも double 型の精度 がよろしくないのであって、無制限の精度で計算できればいいのだ。  
多倍長doubleを自分で組むのは最初から諦めて（世のすごい人たちの成果を利用させてもらう）  
  
多倍長ライブラリ GNU Multi-Precision Library（GMP)  
https://gmplib.org/
を利用、次回は精度を上げてみる。