OmniAICreator/Qiita-1.07M huggingface dataset:
【CDS】UIアノテーションが更新されないときは

## 事象
以下の事象でかなり苦しんだので、解決方法について残しておきます。

①UIアノテーションをMetadata Extensionに記述している場合に、Metadata Extensionを変更して有効化しても、画面に反映されない

②ヘッダ、明細のようなアソシエーションがあるときに、明細のMetadata Extentionを変更して有効化しても、画面に反映されない

環境：S/4HANA 1909 FPS1
※RAPではなく`@odata.publish: true`アノテーションによりODataサービスを公開している
※ODataバージョンはV2

## ①の対処方法
Metadata Extentionだけ有効化してもAnnotation Modelは更新されてくれないので、Metadata Extensionの元のCDSビュー（@OData.publish: trueが設定されているビュー）を同時に有効化します。
Annotationモデルが更新されているかどうかは、以下で確認できます。

Tr-cd: /IWFND/MAINT_SERVICE
対象のODataサービスを表示して、Service Implementationをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/2c9d6854-e62e-4175-9f94-cc0c34115578.png)

Annotation Modelをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/76eea572-f7eb-6cb2-0f60-5fca92e0b081.png)

更新日時を見る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/06c3d6d4-55b9-1bbe-057a-a7ddab9888f7.png)

## ②の対処方法
①の対応の結果、見た目上Annotation Modelが最新になっていても、明細のAnnotation変更が反映されない場合があります。私は以下の方法で変更を反映させることができました。

1. ヘッダCDSビューから、明細のAssociationを一旦コメントアウトし、有効化する
2. コメントアウトを解除し、再度有効化する

ODataのベースになっているCDSビューを有効化したとき、自身のMetadata Extensionは見に行くが、アソシエーション先までは見てくれない動きに思えました。
そこで、2. で「新しいアソシエーションが追加された」と錯覚させる（？）ことにより、明細のMetadata Extensionを読み込ませようと考えて、上記の方法をとりました。
sudoで「setrlimit(RLIMIT_CORE): Operation not permitted」エラーが出る場合

## 参考

* [Sudo: setrlimit(RLIMIT_CORE): Operation not permitted - Discussions in English / on using Fedora - Ask Fedora](https://ask.fedoraproject.org/t/sudo-setrlimit-rlimit-core-operation-not-permitted/4223)

## 対応

ubuntu 20.04 コンテナで確認。

sudo すると以下メッセージ

> setrlimit(RLIMIT_CORE): Operation not permitted

```sh
echo "Set disable_coredump false" >> /etc/sudo.conf
```


これで解決。
AozoraEpub3の改造

 AozoraEpub3とは青空文庫形式のテキストをEPUBに変換することができるソフトウェアである。ただ、このソフトウェアはEPUBの規格にきちんと対応していない部分が残っている。その部分の修正をどのようにしているかを書いています。JAVAで書かれたオープンソースのプログラムなので、JAVAがわかれば改造できる。そのためにEPUB規格に沿うように改造しています。EPUBの種類が色々ありますが、電書協EPUBをもとにEPUBの規格を書いていきます。


 改造版AozoraEpub3では電書協EPUBに対応したEPUBを作成します。
 
 https://github.com/kyukyunyorituryo/AozoraEpub3


EPUBバリデーションの問題
AozoraEpub3ではナビゲーション文章の部分にEPUBチェックエラーが出やすい。そのために修正を行ったが全ての場合についてのチェックが難しい。

## ソースコード
AozoraEpub3の元のソースコードはここで、
https://github.com/hmdev/AozoraEpub3

私が修正したコードは
https://github.com/kyukyunyorituryo/AozoraEpub3

プルリクエストではOpenJDKの問題も出てきている。
https://github.com/hmdev/AozoraEpub3/pull/12
オラクルのJAVAが有償サポートになったのでOpenJDKに切り替える人が増えた。オラクルからOpenJDKに切り替えて実行したときにエラーが出ることが有る。

　EPUBビュワーでの表示の問題。
EPUB3のビュワーはReadiumを使っていたが、最近は超縦書で見るようにしている。AozoraEpub3を超縦書で表示したときに画像が２ページにまたがって表示されることが有る。原因は画像にスタイルシートが指定されていなかったから。
　EPUBリーダーでは、ソニーリーダー、kobo、キンドルが多かったが。今は紀伊国屋、ブックウォーカーなどの国内での表示に対応する必要が出てきている。

## 開発環境の構築
https://github.com/hmdev/AozoraEpub3
をクローンしてからIDEなどでビルドしました、最近はライセンスの問題からOpenJDKを利用することにしています。 Pleiades All in Oneを使っている関係で、AdoptOpenJDKを利用しています。
　元のソースにビルドファイルがなかったので、ビルドファイルを作成した。クラスパスにAozoraEpub3/lib/ のフォルダーの中身を指定すると実行が可能になるだろう。

　アプリケーションの実行はAozoraEpub3/src/フォルダーの
AozoraEpub3Applet.java。コマンドラインはAozoraEpub3.javaで実行する。

## リリースビルド
　JAVAでビルド作られるものは実行ファイルをjar等にしたファイルか、フォルダーまるごとにしたjarができる。jarをさらにexeなどに変換する場合もあるが、ここではやらない。
　AozoraEpub3では実行ファイル本体だけではなくテンプレートファイルなどを読み込んで実行するので、その他のファイルも必要となる。Antなどのビルドツールに、どのファイルをリリースに含めるかを書いておく。
　そのときに注意が必要なのは、初回実行時に生成される設定ファイルや、web小説のキャッシュなどを含まないようにすること。

## よくあるバグの修正例
EPUBファイルのOPFのテンプレートは次のフォルダーの中のpackage.vmに入っている。
template/OPS/package.vm 

https://github.com/kyukyunyorituryo/AozoraEpub3/commit/001a2e9fd4af725cc11def6b5f3262de2f2fa5f7#diff-f0c9ff040e0383f6550d64fd70b2fe61
```
prefix="ebpaj: http://www.ebpaj.jp/"
を追加して

prefix="rendition: http://www.idpf.org/vocab/rendition/#"
を削除した。
```
最近はprefixにebpajを指定する電書協になっていたので変更した。

最新のビルド環境はGithub ActionsのJava21でgradleになっている。

https://github.com/kyukyunyorituryo/AozoraEpub3/pull/10

GitHub ActionsでJavaプロジェクトをビルドしています。

https://github.com/kyukyunyorituryo/AozoraEpub3/blob/master/.github/workflows/nightly.yml

参考

https://zenn.dev/kengo_toda/books/a0bd40668b2824cb6772/viewer/7
RSpecでApplicationHelperのメソッドを使う

テストファイルでも、ヘルパーメソッドを使いたいときってありますよね。

`ApplicationHelper`を使いたい場合を想定します。

## 複数のファイルで利用したいとき
`spec/rails_helper.rb`で`ApplicationHelper`を`include`すればよいです。

```spec/rails_helper.rb
include ApplicationHelper
```

`spec`ファイルは基本的にどれもトップレベルで`require rails_helper`しているはずなので、`spec/rails_helper.rb`で`include`してあげっちゃえばよいわけです。

## 1つのファイルでのみ利用したいとき
対象のテストファイルで`ApplicationHelper`を`include`すればよいです。
例にSystemSpecを挙げます。

```spec/systems/sample_spec.rb
include ApplicationHelper
```

## もし`include`を忘れたら
もし`include`を忘れたら、下記のエラー文で怒られます。

```
NoMethodError:
undefined method `method_name' for #<RSpec::ExampleGroups::SiteLayout:0x00007f85f17a5a70>
```
#Mac + iTerm2 の Option + Command + 左右キーで タブを移動できるようにする

GoogleChrome と同じショートカットでタブ移動できるようにしたい


# 方法

Preferences > Keys 
( もしくは Preferences > Profiles > Keys )

でそれぞれ

Next Tab
Previous Tab 

をショートカットに選ぶ

![image](https://user-images.githubusercontent.com/13635059/81458464-7bd77200-91d5-11ea-9300-a0d5f6ff16e2.png)
![image](https://user-images.githubusercontent.com/13635059/81458463-7b3edb80-91d5-11ea-9deb-fb1b53fc7326.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3151











<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
HTML input要素のみでbutton要素+a要素の記載を行う(リンク先を指定したボタンの実装)

# 目的

- クリックして他ページに遷移するボタンを実装する際の方法でinput要素のみでの実装方法を簡単にまとめる

# 記載例

- 下記に簡単な書き方の例を記載する。

    ```html
    <input type="button" onclick="location.href='遷移先のURL'" value="ボタンの表示名">
    ```
Mac 英語（US)キーボードをホームポジションが崩れないようにカスタマイズ

環境 : macOS Catalina バージョン 10.15.4

- 「ctrlキー」を使ったテキスト入力に切り替えて「矢印キー」多用を避ける。
- 「caps lock キー」に 「ctrl キー」 を割り当てて、ホームポジションが崩れないようにする。

## 「ctrlキー」を使ったテキスト入力に切り替えて「矢印キー」多用を避ける。
`ctrl + f` : カーソルを右に１つ移動
`ctrl + b` : カーソルを左に１つ移動
`ctrl + p` : カーソルを上に１つ移動
`ctrl + n` : カーソルを下に１つ移動
など。他にもたくさんの便利なショートカットがあります。
参考 : [テキスト入力が死ぬほどはかどるMacショートカットキー15個](https://www.find-job.net/startup/mac-shortcut)

## 「caps lock キー」に 「ctrl キー」 を割り当てて、ホームポジションが崩れないようにする。

方法 : システム環境設定 > キーボード > キーボードタブの右下のボタン「修飾キー」で「caps lock キー」に 「ctrl キー」 を割り当てる。

小指でのアクセスが楽になります。

ちなみに HHKB（英語）キーボードの「ctrl」キーも「A」キーの隣にあります。
GCPなどのBitnami WordPressで無料SSL（Let's Encrypt）を設定する

# Bitnami公式ツールを使う
https://docs.bitnami.com/aws/how-to/generate-install-lets-encrypt-ssl/

bitnamiのWordPressでSSL設定を行いたいと思い調べたら、letsencryptをカスタムインストールして証明書発行を行う解説記事が多かったのですが、Bitnamiが公式でbncert-toolというものを出しているので、こちらを使えば再起動まで自動でやってくれます。

# 手順

```bash
$ sudo /opt/bitnami/bncert-tool
----------------------------------------------------------------------------
Welcome to the Bitnami HTTPS Configuration tool.

----------------------------------------------------------------------------
Domains

Please provide a valid space-separated list of domains for which you wish to 
configure your web server.

Domain list []: sub.domain.com
1. ドメインリストの入力を求められるのでカンマ区切りで入力 `example.com, example2.com`

The following domains were not included: www.sub.domain.com. Do you want to add them? [Y/n]: n
2. wwwを加えるかどうかを聞かれるので答える `Y/n`

Please select the redirections you wish to enable or disable on your Bitnami 
installation.

Enable HTTP to HTTPS redirection [Y/n]: y
3. 強制リダイレクトを有効にするかを聞かれるので答える `Y/n`

The following changes will be performed to your Bitnami installation:

1. Stop web server
2. Configure web server to use a free Let's Encrypt certificate for the domains: 
sub.domain.com
3. Configure a cron job to automatically renew the certificate each month
4. Configure web server name to: sub.domain.com
5. Enable HTTP to HTTPS redirection (example: redirect http://sub.domain.com 
to https://sub.domain.com)
6. Start web server once all changes have been performed

Do you agree to these changes? [Y/n]: y
4. 変更内容を確認してEnter

Create a free HTTPS certificate with Let's Encrypt
...

5. メールアドレスの入力を求められるので、管理者のメールアドレスを入力 `email@address.com`

The Bitnami HTTPS Configuration Tool succeeded in modifying your installation.

The configuration report is shown below.

Backup files:
* /opt/bitnami/apache2/conf/httpd.conf.back.202005103222
* /opt/bitnami/apache2/conf/bitnami/bitnami-apps-prefix.conf.back.202005103222
* /opt/bitnami/apache2/conf/bitnami/bitnami.conf.back.202005103222

Find more details in the log file:

/tmp/bncert-202001140617.log

If you find any issues, please check Bitnami Support forums at:

https://community.bitnami.com
```





# 証明書の更新について
上記ツールで設定すれば、cron jobも自動的に設定してくれます。
もし設定されているcron jobについて確認・編集したい場合は、以下のコマンドから可能です。

```bash
sudo crontab -u bitnami -l.
```

# まとめ
ガッツリ解説記事を書こうと思ったら、ツールが用意されて拍子抜けしてしまった。。。
やっぱりbitnamiは楽。
SwiftUIでForEachを使う時につまづいた話

##該当するエラーコード
`Cannot convert value of type 'ClosedRange<Int>' to expected argument type 'Range<Int>'`

##エラーの原因
ForEachの範囲の指定が1...6のようにClosedRangeであったこと。
1..<6のようにしたところエラーは消えた。
##作ろうとしたもの
SwiftUIで鉛直方向に並べたテキストの背景がグラデーションとなるようなものを作ろうとしました。
問題となったエラーは背景色の設定が原因ではなく、ForEachの指定する範囲が原因でした。
<img width="200" alt="スクリーンショット 2020-05-10 9.58.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549093/ff21de84-6cd3-cd2a-988b-f547c866cc8a.png">


##ソースコード

```swift
import SwiftUI

struct test3: View {
    var i = 0
    var body: some View {
        VStack {
            ForEach(0..<6) { i in
                Text("Hello, World!")
                    .background(Color(red: Double(i * 50) / 255, green: 1, blue: 1))
            }
        }
        
        
    }
}

struct test3_Previews: PreviewProvider {
    static var previews: some View {
        test3()
    }
}
```

https://teratail.com/questions/260082
上のサイトで質問をし、回答をいただくことで解決しました。
空白文字を含むファイルパスを指定する方法

# ""でくくるだけ

ターミナル等でパスを指定する際、パス名に空白が含まれる場合

（例
○　/Users/username/"Box Sync"/
✕　/Users/username/Box Sync/

# 補足

pwdでパスを取得すると、普通に
/Users/username/Box Sync/
と表示されるが、これをこのままコピペしても使えない。上記のように修正する必要がある。
紛らわしい。。

# 補足2
ターミナルだけでなく、MacのAutomatorでパスを指定する場合も当然同様になるので注意

# 参考（感謝）
https://qiita.com/fantm21/items/aab0b2e55b2ffb4681c4
Rで二項分布のグラフを作る

###### tags: `rBasicLearning`
# 二項分布のグラフを作る
表の出る確率が0.8のコインを3回投げた時の二項分布のグラフ
##  グラフ化
```r
x <- 0:3
n <- 3
p <- 0.8
plot(x, dbinom(x,n,p))
plot(x, dbinom(x,n,p), type="h")
```
![](https://i.imgur.com/y9fwg2i.png)


# 二項分布の式
二項分布の定義式は、

$$f(x) = {}_n \mathrm{C} _r \cdot p^x \cdot (1 - p)^{n - x}$$

$n = 3$, $p = 0.8$より
$$f(x) = {}_3 \mathrm{C} _r \cdot (0.8)^x \cdot (1 - 0.8)^{3 - x}$$
これより、

$f(0) = 1\cdot1\cdot(0.2)^3 = 0.008$
  $f(1) = 3\cdot0.8\cdot(0.2)^2 = 0.096$
  $f(2) = 3\cdot(0.8)^2\cdot0.2 = 0.384$
  $f(3) = 1\cdot(0.8)^3\cdot1 = 0.512$
子連れで在宅育児（と在宅勤務）を開始して１か月が経ちました

[2020年、（3歳1歳と）私のリモートワーク](https://qiita.com/e99h2121/items/c8878d027603745a6426)
[在宅育児（と勤務）を支える技術](https://qiita.com/e99h2121/items/475045cabd005a7add57)

の続編、1か月子連れで在宅育児（と在宅勤務）をしてみての振り返りです。

## 振り返るにあたって

開発チームでは1か月毎に振り返りを行い、

- 失敗
- 問題、改善点
- そして成功、良かった点

を皆で前向きに発表して次に生かすということを行っています。

[2020.04.13 の保育園休園](https://qiita.com/e99h2121/items/c8878d027603745a6426) 以来のハードモードな生活も1か月に入ったので、
良かったこと、失敗、反省点などを書いてみたいとおもいます。

## 失敗

イライラとの闘いは難しいです。犬も食わない家庭内のケンカの話は、ここでは書きません。



## 問題、改善点

一人の時間を確保したい、集中時間を確保したい割に、１歳児、３歳児からは数秒ごとにアラートが飛びます。
悩ましい事ばかりでしたが[ポモドーロ・テクニック](https://www.newsweekjapan.jp/stories/carrier/2019/03/post-11867.php)と合わせて更に細かい[ダッシュ法](https://mgn.co.jp/dash-concentration/#i-3) なるものを知りました。次の一か月はこれを意識してみたいです。


## 良かったこと

でもなんだかんだ言って、インフラ・家庭環境を物理的に工夫することは大事だったと思います。
物理問題を解決するに、良かったものは何でしょう

### 既存のもので良かったもの

#### [Chromecast](https://qiita.com/e99h2121/items/475045cabd005a7add57)

これでリビングのTVに[保育園の先生の顔をゆったり投影したり](https://qiita.com/e99h2121/items/475045cabd005a7add57)、
昼間は渋谷スクランブル交差点の様子を流してバスが通るたびに１歳児が喜んだり、息抜きすることが出来ました。


### 買った物で良かったもの

#### [テント](https://headlines.yahoo.co.jp/hl?a=20200409-00000007-withnews-sci&p=2)

家の中で子どもがちょっとした秘密基地感を味わうことができ、気分転換になったようです。非日常の演出とメリハリが大事な気がします。

#### けん玉

[けん玉](https://www.s-arcana.co.jp/tech/2014/11/kendama-first.html)、良かったです！集中力が付いた気がします。
> 観察して、仮説を立てて、実践して、修正して、また実践して、観察して、仮説を立てて...
> この繰り返しです。
> 考えて、取り組めばそれなりに上達できます。

これもまさにその通り

## まとめ
会社内のアンケートでそういえば今月こんなことを書いたので、これに集約。

```
3歳9か月と1歳6か月
フルタイム
プロダクト開発で、プログラム開発。

お子様は普段どこかに通っていますか？
保育園(認可・認証・認可外など)
 
仕事を続ける理由は何ですか？ 
自分を１個人として考えたときに、誰か（子どもや旦那さん）に全人生を懸ける！というのは選択肢になかったからこそ仕事をしてきたわけで、自分の人生はやはり自分のものなので、その１つの楽しみである仕事は続けたい。そういう生き方が、子どもに長い目で見たときに良いお手本だと思ってもらえたら最高。

これまでに、仕事を続けてきたことで悩んだ時期はありますか？ 
ある
 
「ある」と答えた方：その悩みはどのように解消しましたか？
とはいえどうしても仕事と子どもとどちらを「今」優先すべきなのだろうという瞬間が日々訪れるため、その時その時の瞬時の判断にあとでへこんだりする。なるべくそういう時はそういうこともあると思ってゆっくり寝て早く復活する。

現在、仕事と子育てを両立する上で『仕事面で悩んでいること』はありますか？ 
2019年までは割と悩んでいましたが2020年は「不惑」なのであまり悩まないことにしました。笑

現在、仕事と子育てを両立する上で『家事面で悩んでいること』はありますか？ 
いかに省力化するか。ですが、弊社の男性陣は結構いくめん、家事もするメンバーも多い気がしているので、男性を巻き込みつつなにかいいアイディアを共有していくのが仕事と同様うまくいく気がしています。

仕事と子育てを両立する上で『仕事面で意識していること』はありますか？ 
抱え込まないこと。人にどんどん任せて、うまくやってもらうこと。

仕事と子育てを両立する上で『子育て面で意識していること』はありますか？ 
こちらも、抱え込まないこと。できるだけやりたいけど、精神的につらくなったら会社のほうで誰かに話して発散したり、やっぱりよく寝ること。

仕事と子育てを両立する上で『家事面で意識していること』はありますか？ 
これも抱え込まないこと。

家事は家族で分担していますか？ 
はい
 
「はい」と答えた方：どのように分担していますか？
朝ごはん、掃除: 私
休日のごはん、掃除: 旦那
洗濯物、一緒に干す
おむつ、トイレ、気づいたほうがやる
等々

子育て、仕事、家事と3つを取り組む中で、相談できる相手がいますか？ 
はい

「はい」と答えた方：それはどなたですか
チームの人、社内の人たち笑
皆言わなくても仕事に貪欲なのであまり自分でやり切ろうとせずにすっと場から引くと勝手に仕事現場は回る
うーん、個人的にもうちょっとやりたかった！悔しい！はありますが、最終目的は仕事上のゴールを達成することなので、出来ることよりむしろ、自分が出来ないときに出来ないことを共有していくことが大事だと思っています。

仕事を続けてきたことで、よかったと感じている部分は何ですか？
社会とかかわっていることはやはり普通に楽しい。世界が広がる。

人によりますが、私は、さっさと職場復帰して、大人と話ができる時間が増えて、楽しくなったので、「プレママ」は、あまり人の意見を気にしないで突き進むが良しだとおもいます
```
Gitを使いこなせ！〜Gitを使いこなすために必要な materials & methods〜

主にGitのメリットや、Gitに関連した用語の意味・それぞれの関係性など、私なりに調べ整理し、忘れないようにいつでも思い出せるようにアウトプットした記事です。

# ＜Gitを理解しよう＞

## Git とは？
Gitとは分散型バージョン管理システムの一つ。ソースコードを効果的に管理できる。


## Gitはチーム開発のときに役に立つ
独学など実際に１人でやるときは、Gitのメリットをあまり感じられないかもしれない（現に私がそうです...）。ですが複数人などで行うチーム開発の時に役に立つ。
### いつ誰が、どのファイルを作成・編集・修正したのかがわかやすい
Gitでファイルを管理すると、更新履歴が自動で保存される。
### 他人の編集したファイルの上書きを防ぐことができる
「同一のファイルを編集・上書きをしてしまって、先に編集した人の変更内容が消えてしまった！」を防ぐことができる。Gitではこうなった場合に、警告が出る。

## Gitに存在するリポジトリ
Gitには、ファイルやディレクトリ（Gitの管理下）の変更履歴を記録・保管しておく入れ物”リポジトリ”というものがある。リポジトリには「ローカルリポジトリ」と「リモートリポジトリ」の２つがある。
### ローカルリポジトリ
自分のPC上に置くリポジトリ。自分のPC上にあるファイルやディレクトリのバージョン管理を行いたいときに使う。
### リモートリポジトリ
外部サーバーなどのネットワーク上に置くリポジトリ。後に説明するGithubがこれにあたる。

リモートリポジトリ上（ネットワーク）にあるデータやファイルをローカルリポジトリ上（自分のPC）へ取得し、データの編集を行う。編集したデータをリモートリポジトリへ同期・反映するというのが、ざっくりとした流れ。

## インデックス
バージョンを記録するためにファイルを一時的に登録する場所。インデックスに登録されているファイル群の変更が記録されます。

# ＜Githubは、「Git」の仕組みを使ったサービス＞
Githubはバージョン管理システム「Git」の仕組みを使って、世界中のプログラマーが自分の作品を保存し、公開することができるようにしたサービス。もう少し専門的に言えば、"オープンソースソフトウェアのホスティングサービス"。

”チーム開発”という観点で説明すると、「自分が作ったプログラムを公開し、チーム全員で管理する”リモート環境（リモートリポジトリ）”」が必要であると言えば良いか。
”オープンソース”ということで、世界中の超天才プログラマーたちが作った「大変便利な機能」を無料で閲覧・利用することができる（良い時代になったものですね...）。

## Github Desktopは、「Github」を利用した開発を簡単にするためのプログラム

Githubとのやりとりは、ターミナル上で操作する必要がある。
だがしかし！、Github Desktopがあれば、わざわざ記述せずとも、ワンポチでできる！さらに目視で状況がわかる！（言葉だと響かないと思うので、実際にGithub Desktopがない時とある時で比較してみてください。）

## Github Desktopの流れ
実際に１つ１つの操作名ややっていることの羅列だけではどうしても忘れてしまう。（人間だもの、忘れてナンボ）
なのでプロトコルという形で実際に「どういう手順で、かつここではどんなことをしているのか」を説明します。

### ①クローン
リモートリポジトリを複製してローカルリポジトリを作成すること。
クローンを行うとリモートリポジトリの内容をそのままダウンロードすることが出来る。

### ②ブランチ作成
クローンができたら、トピックブランチを作成する。ブランチ名は、「どんなことをしたのか」がわかるようにすること。

### （インデックス　※実際の手順には含まれないが、大事な用語）
コミットするファイルを登録するための場所。ファイルをコミットすると、インデックスに登録されているファイル群の変更が記録される。
インデックスに登録したファイル単位が一つのコミットとなるために、どのファイルをインデックスに登録するかを決める必要がある。一度に多くのファイルを変更した際に、どのファイル単位でコミットするかを選択するためにインデックスを使用する。

### ④コミット
ファイルやディレクトリの追加・変更を、リポジトリに記録するための操作。コミットメッセージ作成し、コミットをするという流れ。
【重要！】１機能１コミットメッセージしてコミットすること。
　（理由）ファイルを元に戻すときはコミットごとでしか戻せないため。
　　　　　コミットをする前に、前述のインデックスのことを考えよう。

### ⑤プッシュ
ローカルリポジトリ上の内容を、リモートリポジトリ上（Github）に反映・同期する。

### ⑥プルリクエスト
masterブランチにマージをする前に、チームの仲間に確認をもらう。
「何を作成・変更したのか (# Whtat)と、なぜそうしたのか(# Why)」を明確にしょう。

### ⑦LGTMをもらう
「Looks Good To Me」の略。プルリクエストした内容が問題なければ「LGTM」とコメントをもらう。IT界の合言葉。
### ⑧マージ
作成したトピックブランチとその変更内容を、masterブランチへ統合（マージ）する。マージしたらトピックブランチは削除しよう。
### ⑨プル
リモートリポジトリにおいて変更が更新された内容を、ローカルリポジトリ上に取得する。


# ＜終わりと参考URL＞
　とまあ、こんな感じに書いてはみました。始めたばかりでまだ荒い部分はあります。実際使うと様々なトラブルもあれば、もっと奥深く使えるみたいですね。下記の参考URLを大分受け売りしている記事ですが...第一歩として更なる飛躍を目指します。
　経験豊富な方、「これは違うんじゃないの？」「これも知っておくといいよ」といった知見があれば、ぜひコメントをお願いします。

＜参考URL＞
https://backlog.com/ja/git-tutorial/intro/01/

https://ferret-plus.com/8498
CentOS7サーバのUSB外付けDVDドライブのWindowsServer2019をKVMゲストOSにする

# CentOS7系サーバにKVMを導入して、WindowsServer2019を入れたい
2020.5.10
## KVM導入とゲストOSのためのブリッジネットワークの設定
下記の通り実行して再起動すれば問題なかった
https://qiita.com/yoshiyasu1111/items/8d07a4fd55116fba07f7

## WindowsServer2019のDVDからのインストール
サーバのUSBにDVDdriveを接続。
サーバのGUIモードを導入　sudo yum -y groupinstall "Server with GUI"　を実行してみたら私の環境ではすでにインストール済みであった。

サーバのGUIモードを起動　xstart
Virtual Machine Manager を起動（GUI）
外付けDVDからの直接インストールができない（ISOimageのディスクではないから？）

次のコマンド実施でまずDVDからローカルディスク上にiso imageファイルを作成
　dd if =/dev/sr1  of=/var/image/wins2k19.iso
 (/dev/sr1 はdfコマンドで見つけたDVDドライブのデバイス）

Virtual Machine Manager で新規guest PCの作成で、　/var/image/ を読み込みisoイメージ所在場所として追加して実行。
無事、インストール完了
「はじめてのGo言語」でhttpパッケージが動かなかったので、ググってみた

「はじめてのGo言語を読んで、httpパッケージサンプルが動かなかったので、調べてみました。

動かなかった原因はHandelFuncが、ConnではなくResponseWriterを使うようになったからなのかなぁ。


```http.go
package main                                                                    

import (
    "io"
    "net/http"
)

// ResponseWriter is interface as
//  Header()  Header
//  Write([]byte)(int,error)
//  iWriteHeder(statuscoe int)

// WriteString is function as
// func WriteString(w Writer, s string) (n int, err error)

// Writer is interface as
// Write(p []byte) (n int, err error)

// 原著で動かない部分
// func ServeHoge(conn *http.Conn, req *http.Request){
//     io.WriteString(conn, "hello")
//

func ServeHoge(w http.ResponseWriter, _ *http.Request) {
    io.WriteString(w, "hello! this is hoge server\n")
}

func main() {
    http.HandleFunc("/hoge", ServeHoge)

    http.ListenAndServe(":12345", nil)
}
```
Gitでコミットの多いファイルを調べてプロジェクトのホットスポットを知る ruby スクリプト

新しいプロジェクトにアサインされたとき、プロジェクトのどこがホットスポットか知ることができるとプロジェクトを早く理解できます。最も Git コミットが多いファイルをホットスポットと仮定して、ファイルごとのコミット数のランキングを調査するスクリプトを ruby で作ってみました。

環境は mac os + ruby 2.6.3 です。

```
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin18]
```

プログレスバーを表示するため、 ruby-progressbar gem を使います。事前にインストールしておいてください。

```
gem install ruby-progressbar
```

# ソースコード

```ruby:git-logs-ranking.rb
require 'ostruct'
require 'ruby-progressbar'

Dir.chdir(ARGV[0])

RANKING_LENGTH = 20
result = []
paths = `git ls-files`.lines
pb = ProgressBar.create(total: paths.count)

paths.each do |path|
  path.chop!
  logs_count = `git log --oneline #{path} | wc -l`.to_i
  result << OpenStruct.new(path: path, logs_count: logs_count)
  pb.increment
end

result
  .sort_by { |row| row.logs_count }.reverse.take(RANKING_LENGTH)
  .each { |row| puts "#{"% 4d" % row.logs_count} #{row.path}"}
```

全ファイルについて `git log --oneline` を実行するので、大きなプロジェクトでは数分程度の時間がかかります。

# 使い方

下のように実行すると

```
ruby git-logs-ranking.rb リポジトリルートへのパス
```

```
Progress: |====================================                               |
```

全ファイル調査する間プログレスバーが進んでいき、上位20位までのファイルが表示されます。

```
Progress: |===================================================================|
  13 Gemfile
  13 Gemfile.lock
  12 config/routes.rb
  10 app/controllers/repositories_controller.rb
   8 app/views/repositories/show.html.haml
   7 app/views/layouts/application.html.haml
   6 db/schema.rb
   5 app/models/user.rb
   5 app/views/repositories/index.html.haml
   5 app/javascript/packs/application.js
   4 app/models/learn.rb
   4 app/controllers/application_controller.rb
   3 package.json
   3 app/views/learns/_form.html.haml
   3 yarn.lock
   3 app/javascript/stylesheets/application.sass
   3 app/controllers/learns_controller.rb
   2 spec/models/user_spec.rb
   2 app/views/signins/new.html.haml
   2 app/views/layouts/_navbar.html.haml
```

ここから Gemfile とか routes.rb とかを除いたファイルがホットスポットに当たりそう、と考えられますね。
SQLから当日分のデーターを入手したい時

ポートフォリオ作成時に当日投稿された数を表記する機能を実施しようとして苦戦したので、忘備録として残しておく

やりたい事はその日に投稿された投稿数をカウントしてその数を表示するという物

DBに保存されている投稿日時はDATETIME型で保存されている。
ならば当日の日付と投稿日時の日付が同じという条件付けでいけるだろうと安易に以下のコードを作成

カラム：creat_time  DATETIME型

$counts = $db->query('SELECT COUNT(*) AS cnt FROM posts WHERE create_time = CURDATE()');
$todayCount = $counts->fetch();

反映されない・・・・・・


何故だ・・・と２時間ほどネットの海を彷徨っていると、
DATETIME型は「2020-05-08 21:33:54」のように日付と時刻までを取得する
それに対してCURDATEは「2020-05-08」と時刻は取得されない。という情報を発見

もうちょい調べるとCURDATEではなく日付を直接入力した場合、
　2020-05-08 21:33:54 ＝ 2020-05-08と入力しても実際は

　2020-05-08 21:33:54 ＝ 2020-05-08 00:00:00と認識されるとのこと。

これはCURDATEにも当てはまるのか試したところ、

$counts = $db->query('SELECT COUNT(*) AS cnt FROM posts WHERE create_time >= CURDATE()');
$todayCount = $counts->fetch();


反映された！！！


SQLで条件付けする時にはどのような形で保存されているのかよく確認する必要があると思い知らされました・・・
Rubyの配列・ブロックの基礎についてまとめてみた。

#配列の特徴
●インデックス指定で要素を取り出す

```sample.rb
n = [1, 2, 3]
n[1] #=>2
```

●どんなオブジェクトも混在して入れる事ができる。

```
s = ['osaka', 1, :hello]
```

●存在しない要素を指定するとnilが返ってくる

```sample.rb
n = [10, 20 ,30]
n[3] #=>nil
```

●<<で配列の最後に要素を追加できる

```sample.rb
food = ["apple", "peech"]
food << "natto"
food #=>["apple", "peech", "natto"]
```

#ブロックについて
>メソッド呼び出しの際に引数と一緒に渡すことのできる処理のかたまり | たのしいRuby


例えばこんなものです。

```sample.rb
words = ['a','p','p','l','e']
food = "" #カラの文字列

words.each do |w|
  food += w
end

puts food

#=>apple
```
・do~endまでの中のもの（```|n| food += n```）は全て引数

・do~endまでのことを**ブロック**と言います。

・```|n|```の部分のことをブロック引数と言い、配列の中の要素をそれぞれ取り出してる

**・ちなみに、ブロックの中で定義した変数は、ブロックの中でしか使えない。
しかし、ブロック外で定義した変数はブロック内で使える。**

主に使うメソッドとして、eachメソッドやtimesメソッドは共にブロックでよく使用しますが、その時に

**頭の中「ブロックを引数として渡しているんやでこれは！」**

ってことを意識しながらコーディングしていくことで、ブロックが何か分かってくるのではないでしょうか？

##**ハッシュもブロック引数として使える**

```sample.rb
words = ['a','p','p','l','e']
food = "" #カラの文字列

words.each {|w|
  food += w
}

puts food

#=>apple

```

『do..end』の部分は**ハッシュ```{}```に置き換えることもできます**

また、1行でまとめて書いてもプログラムとして動きます。

```sample.rb
words = ['a','p','p','l','e']
food = "" #カラの文字列

words.each {|w| food += w }

puts food

#=>apple
```


##繰り返しを行う配列メソッドたち
###●eachメソッド
配列などのオブジェクトの要素を順番に取り出すもの。

特徴は、
**・範囲オブジェクト```1..10```も取り出せる**

```sample.rb
numbers = 1..10
numbers.each do |n|
  puts n
end
```

```
1
2
3
4
5
6
7
8
9
10
```

###●mapメソッド
**カラの配列に、別の配列を埋め込んでいく処理を行う時に使う**
新しく配列を作ります。

```sample.rb
words = ['b','n','n']
new_words = [] #カラの配列

words.map do |w|
  new_words << w + 'a'
end

puts new_words

#=>["ba", "na", "na"]
```

###●selectメソッド
各要素の戻り値が真の時、新しい配列を返すメソッド。
つまり、書いた条件を満たしてる要素を所得するメソッド。

```sample.rb
words = ['ba','na','na']

new_words = words.select { |w| w.include?('n') }

new_words #=>["na", "na"]
```

###●findメソッド
配列内で条件が最初に真になった要素を取り出す。
AWS 基礎

#前提
AWSについて学んだことを書いていきます

#本題

##CloudFrontとは
高速にコンテンツを配信するサービス（CDNのサービス）

###概要
・オリジンサーバー（元なる画像を配信するサーバー）上にあるコンテンツを世界中１００箇所以上にあるエッジロケーションにコピーし、そこから配信を行う

###特徴
・高速
ユーザーからもっとも近いエッジサーバにから画像を配信する
・効率的
エッジサーバーでコンテンツのキャッシングを行うので、オリジンサーバーに負荷をかけずに配信できる

##CloudFrontがあると何がいい？
高速化され、S3の負荷が軽減される

##稼働率をあげるための基本的な考え方
障害発生間隔を長くするか、平均復旧時間を短くするために冗長化を行う

###考え方
・障害発生間隔を長くする
・平均復旧時間を短くする

###手法
・冗長化
システムの構成要素を多重化すること
ある構成要素で障害が発生しても処理を引き継げるようにすることで稼働率を高める
↓↓
単一障害点（SPOF）を無くそう

##稼働率を上げる具体的な手法
１、要素単体の稼働率を高くする
２、要素を組み合わせて、全体の稼働率を高くする
３、負荷を適切なプロビジョニングで回避する

###２、要素を組み合わせて、全体の稼働率を高くする
・冗長化構成
Active-Active：冗長化した両方が利用可能

Active-Standby：冗長化した片方は利用不可能
　Hot Standby：スタンバイ側は普段起動しすぐに利用可能
　Warm Standby：スタンバイ側は普段起動しているが、利用するのに準備が必要
　Cold Standby：スタンバイ側は普段停止している


###３、負荷を適切なプロビジョニングで回避する
・スケールアップ
個々の要素の性能を向上させる
ある程度の規模まではスケールアップがコストパフォーマンスがよいが、一定範囲を越えると悪くなる

・スケールアウト
個々の要素の数を増やす
ある程度の規模を超えそうであれば、スケールアウトで対応する
最低限用意しておくべきかN＋１構成、安心なのはN＋２構成


##ロードバランサーとは
各サーバーにアクセスを振り分け、負荷を分散する装置

##ELBとは
AWSクラウド上のロードバランサー

###概要
・複数のEC2インスタンスに負荷分散する
・複数のアベイラビリティゾーンにある複数のEC2インスタンスの中から正常なターゲットにのみ振り分ける（ヘルスチェック）

###特徴
・スケーラブル：ELB自体も負荷に応じて自動でスケールアウト・スケールインする
・アベイラビリティゾーンをまたがる構成：ELBを利用する場合、一つのリージョンを選び、そのリージョン内のアベイラビリティゾーンはまたがるように構成できる
・名前解決：ELBにはDNS名が割り当てられる、ELBへの接続ポイントへのアクセスにはDNSを使用する
・安価な従量課金：従量課金で利用可能
・マネージドサービス：運用が楽

##RDSマスタースレーブ構成
マルチAZの機能を使えばマスタースレーブ構成を構築できる
RDSでDBをマスタースレーブ構成にして、DBレイヤの冗長化ができる

##システム監視とは
システムを正常な状態に保てるよう、稼働状況やリソースを監視すること

###目的
・すぐに障害発生を確認できるようにする
・復旧にすぐに取りかかれるようにする

###中身
・正常な状態を監視項目＋正常な結果の形で定義する
・正常な状態でなくなった際に対応方法を監視項目ごとに定義する
・正常な状態であることを継続的に確認する
・正常な状態でなくなった場合には通知が来るようにし、すぐ正常な状態に復旧させる

##監視の種類
死活監視とメトリクス監視の2種類ある

###死活監視
・正常にシステムが動作しているか確認

###メトリクス監視
・パフォーマンスを定量的に確認
・指標を決め、指標が闘値以上・以下となっているかを把握

##監視する際のポイント
###１、システムや利用状況は変わるため、足りない監視を都度足していく
・項目が多すぎると、監視疲れする
・システムも利用状況も変わるため、都度監視項目を調整すればOK

###２、最初は基本的な要素でOK
・CPU、Memory、Disk、Networkの使用率・枯渇
・これらの情報を確認できれば、障害発生時に何時が起点なのかを把握できる

##CloudWatchとは
AWSサービスの監視やモニタリングができる監視サービス

###概要
・AWSサービスのメトリクス（リソースの状況）を監視する
・メトリクスに対して閾値を登録し、その条件を満たしたら通知する（アラーム発生）

##Amazon SNSとは
通知サービス


##IAMとは
AWSのサービスを利用するユーザー権限を管理するサービス

###概要
・AWSリソースをセキュアに操作するため、認証・認可の仕組みを提供できる
・各AWSリソースに対して別々のアクセス権限をユーザ毎に付与できる
・AWSIAM自体の利用は無料

###用語
・ポリシー
アクセス許可の定義、どのAWSサービスの・どのリソースに対して・どんな操作を・許可する（許可しない）を定義
・ユーザー
個々のアカウントのユーザー
・グループ
IAMユーザーの集合、複数のユーザーにアクセス許可を付与する作業を簡素化
・ロール
一時的にアクセスを許可したアカウントを発行できる、EC2やLamdbaなどのAWSリソースに権限を付与するために使用

##IAMのベストプラクティス
・個々人にIAMユーザーを作成する
・ユーザーをグループに所属させ、グループに権限を割り当てる
・権限は最小限にする
・EC2インスタンスから実行するアプリケーションには、ロールを使用する
・定期的に不要な認証情報を削除する
GitLab CI で bash のスクリプトが実行できない

## 現象

以下のような JOB を GitLab CI で実行した

```job.yml
build:
  image: python:alpine
  stage: build
  when: manual
  script:
    - ./script.sh
```

すると、以下のようなエラーが発生

```
/bin/sh: eval: line 113: ./script.sh: not found
```

## 原因／対処

使用している image に bash が含まれていないため発生していた。
script の中で bash をインストールしたら解決した。

```job.yml
build:
  image: python:alpine
  stage: build
  when: manual
  script:
   - apk add bash
   - ./script.sh
```

## 参考

* [how to execute bash script to test CI (#2672) · Issues · GitLab.org / gitlab-runner · GitLab](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/2672#note_243005083)
プログラムの手法比較

#はじめに
[「関数型プログラミング」と「オブジェクト指向」ってなんやねんPython編](https://qiita.com/nokonoko_1203/items/1cbce5566a6ea0a4029b) を読んでなんとなく思いついたこと。

#プログラムとは
会議などで何をやるか書いてある、あれです。
運動会などにもありますね。

#手続き型プログラム
やることを具体的に書きます。司会が進行します。

```
部会プログラム

1. 部長から本日のアジェンダ説明
2. 部長から前月売り上げ状況説明
3. 今月の状況
  (1)A業務担当課長からA業務の状況報告
  (2)B業務担当課長からB業務の状況報告
4. 部長から連絡事項説明
5. 部長から次回の予定説明
```

#オブジェクト指向プログラム
各担当にお願いすることを書きます。司会が進行します。

```
部会プログラム

1. 部長：　本日のアジェンダ説明
2. 部長：　前月売り上げ状況説明
3. 今月の状況
  (1)A業務担当課長：　A業務の状況報告
  (2)B業務担当課長：　B業務の状況報告
4. 部長：　連絡事項説明
5. 部長：　次回の予定説明
```

#関数型プログラム
やることそれぞれのひな形を用意しておきます。それを誰にやってもらうかを書きます。司会が進行します。

```
部会プログラム

1. 本日のアジェンダ説明(部長)
2. 前月売り上げ状況説明(部長)
3. 今月の状況
  (1)業務の状況報告(A業務, A業務担当課長)
  (2)業務の状況報告(B業務, B業務担当課長)
4. 連絡事項説明(部長)
5. 次回の予定説明(部長)
```

#最後に
処理の呼び出し方の観点で比較してみました。
観点は他にもあるわけですが、この例では難しそうです。
Ubuntu 14.04 で Vim による Apt システムのエラー


古い Ubuntu で一度に Apt upgrade すると以下のようなエラーが出た。


```

Preparing to unpack .../vim-runtime_2%3a7.4.052-1ubuntu3.1_all.deb ...
Adding 'diversion of /usr/share/vim/vim74/doc/help.txt to /usr/share/vim/vim74/doc/help.txt.vim-tiny by vim-runtime'
dpkg-divert: error: rename involves overwriting `/usr/share/vim/vim74/doc/help.txt.vim-tiny' with
  different file `/usr/share/vim/vim74/doc/help.txt', not allowed
dpkg: error processing archive /var/cache/apt/archives/vim-runtime_2%3a7.4.052-1ubuntu3.1_all.deb (--unpack):
 subprocess new pre-installation script returned error exit status 2
Processing /usr/share/vim/addons/doc
Errors were encountered while processing:
 /var/cache/apt/archives/vim-runtime_2%3a7.4.052-1ubuntu3.1_all.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
```

```

 sudo apt remove vim
```
して

```

 sudo apt install vim
```

しても同じエラーが出る。

- sudo apt-get -f install
- sudo dpkg --configure -a
- apt purge vim vim-runtime
- apt install vim vim-runtime

したりしたが効果なし。

結局、効果があったのは以下


```

 sudo rm -fR /usr/share/vim/vim74/doc
 sudo apt install vim vim-runtime
```
node.js用のforeverで表示されるWarningメッセージを表示させなくする方法

#node.js用のforeverで表示されるWarningメッセージを表示させなくする方法

foreverでnode.jsのプロジェクトファイルを読み込むと、warningメッセージが表示される。

下記のようにforeverコマンド実行時に末尾についてくる。
`forever start app.js`
`forever stop app.js`

```
(node:30624) Warning: Accessing non-existent property 'padLevels' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
(node:30624) Warning: Accessing non-existent property 'padLevels' of module exports inside circular dependency
```
warningなので特に悪さはしていないと思うが、コードが見ずらいので表示しないようにしたい。




<br>
<br>
**この記事は[こちらに移転しました。](https://prograshi.com/language/nodejs/node-js-forever-warning-message/)**
初心者によるプログラミング学習ログ 311日目

#100日チャレンジの311日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
311日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>311日目 2.5h<br>・架空LP模写5日目3.5h（<a href="https://twitter.com/ririru_123?ref_src=twsrc%5Etfw">@ririru_123</a>）<br>・架空LP模写：制作一覧部分を作成<br><br>ボタンの配置とか画像の位置とかびみょーにデザインカンプと違ってて格闘してた<br>時間かけたわりにすすみが遅い気がする<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1259246929503907840?ref_src=twsrc%5Etfw">May 9, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
MAMP環境でphp artisan migrateがエラーになる時

MAMP環境でデータベースへの接続がエラーになる場合の対処法です。

```
Illuminate\Database\QueryException  : SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = laravel_task and table_name = migrations and table_type = 'BASE TABLE')
```

.envファイルに`DB_SOCKET`の情報を追記します。

```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=データベース名
DB_USERNAME=ユーザー名
DB_PASSWORD=パスワード
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock
```

できました。

```
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.54 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.33 seconds)
```
Laravelで.envファイルが反映されない時

Illuminate\Database\QueryException  : SQLSTATE[HY000] [2002] Connection refused..

などのエラーが出た際、.envファイルがうまく反映されていないことが原因の可能性があります。

## .envファイルが反映されない時の対処法

キャッシュをクリアすることで.envファイルが正しく反映されるようになります。

```
php artisan cache:clear
```

コンフィグの設定もコマンドでキャッシュをクリアできます。

```
php artisan config:cache
```

MAMP環境などで開発している場合は、`Stop Servers`で再起動してからもう一度確認してみましょう。
ユーザーサポート内容を統計・分析

弊社ユーザーサポートの検索・CSV出力および、フリーのテキストマイニングツールを利用し、弊社ユーザーサポート内容を統計・分析、レスポンス効率化を試みられないか。

## 使用するツール
http://khcoder.net/

## 手順・要領
### 検索条件
#### 「サブシステム」ベース
対象としたいサブシステム
サブシステム名がバージョン毎でブレがある場合は適宜カテゴライズする
結局、事前作業が結局大事

#### 対象期間
差し当たり、1ヶ月単位など
トピック番号の第一書込
やり取りのスレッドの長さによる誤差防止

結果をCSVで作成
開発時の調査をスムーズに行うために (Firebase x Nuxt x Vuexでアプリを作った際に思ったこと)

Firebaseで何かアプリを作ろうと思ってひとまず動くものができあがるとこまで行きました。

その時に思ったことをメモしておきたいと思います。ポエム度高し。

開発着手時点では、以下のようなスペックでした

- js: ES6かける
- Vue: 単一コンポーネントで作れる、ディレクティブわかる
- Nuxt: SPAつくったことがある
- Firebase: 経験なし、なんとなく概要は知ってる
- バックエンド: いくつかの言語で経験あり

## 組み合わせは難易度が上がる

今回はFirebaseとNuxtで作ってみようと思ったんですが、そのように技術の組み合わせをすると調査コストも上がります。別に失敗だった、と言いたいわけではなく単純にそう思ったってとこです。

## 何を使っているかを意識する

FirebaseとNuxtというだけでも詳細にはさらにいくつかの技術が組み合わさっています。開発者に見えるレベルだけで言えばFirebase x Nuxt(Vue.js, Vuex(vuexfire))となります。開発時には `今、どこを触っているのか？` を意識する必要があると思いました。でないと何か問題があった際に何を調べればいいかが分からなくなります。

## 切り分ける

上記の通り、何か問題があった祭には調査をします。調査の第一歩として何が（使っている技術のどこが）問題なのかをアタリをつけておくことが重要です。どこに問題があるか、そもそも何を触っているかがわからないと調査することも難しいです。

また切り分け作業を行うことで、正しく動いている箇所が分かります。どこまで進んでいるかを意識することも重要です。正しく動いている箇所を調査しても問題は解決しないからです。

## シンプルに動かしてみる

調査してもダメだった場合、一旦組み合わせをやめて個別に動かしてみるというのもアリです。

例えばFirebaseとNuxtで正常にデプロイできない場合、
一度Firebase単体で静的なサイトとしてデプロイしてみることでFirebase側に問題があるのか調べることができます。もしデプロイできるのであればNuxt側の設定に問題がありそう、というアタリがつけられます。

## 基本的な仕組みを理解しておく

書きながら覚えれば良いことと、事前に知っておいたほうが効率が良いことがあるということを実感しました。
今回の場合、vuexfireがどういう挙動をするかを事前に把握してないとVuexと連携すること自体難しかったです。
どの辺まで調べておくか（ソースレベルで確認する等）は時間をコストの問題だと思います。

## 記事の参照

セオリーとしては公式を読むことが重要です。
が、初見だと分かりにくい・頭に入ってこないことがあるのでそれらを解説しているサイトを見つけることも重要です。

公式読む→解説サイト→ある程度理解→書く→更に理解→再度公式読む

みたいにするのが良いかなと思います。


---

以上のことを思い、忘れないうちに書いておこうと思いました。
XephyrサーバーにコンテナのGUIアプリを表示

## シンプルな方法

* 手元のUbuntu20.04でまずはxtermを表示してみる

```sh
sudo apt install -y \
 xserver-xephyr
```

```sh:Xephyr起動
Xephyr -resizeable :1 &
```

```sh:表示
DISPLAY=:1 xterm
```

## Docker を使う

```dockerfile:Dockerfile
FROM alpine
RUN apk update

RUN apk --no-cache add \
  xvfb \
  firefox-esr

ENV DISPLAY=:1
CMD firefox
```

```sh:run.sh
# Xサーバーを起動
Xephyr -resizeable :1 &

# コンテナをビルド
docker build . -t local/firefox

# Xを表示するため .X11-unix をマウント
# 日本語フォントのために font をマウント
docker run -it --rm \
 -v /tmp/.X11-unix/:/tmp/.X11-unix/ \
 -v /usr/share/fonts:/usr/share/fonts \
 local/firefox:latest
```

![スクリーンショット_2020-05-10_05-44-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/75fc5a7d-0be3-bd84-c4c6-2ab1d25e5886.png)
curl コマンド linux

使うたびに毎回調べてるので時短のために個別にまとめたい

---
# curl

URLやAPI等を利用してWeb（サーバ）上の情報に対してデータ転送（CRUD操作）ができる。

```zsh:curlオプション
-s : 進捗メッセージ出力（通常＋エラー）の非表示
-S : 進捗メッセージ出力の非表示（エラーは表示）
-# : 進捗メッセージ出力をプログレスバー表示に変更

-I : Headerのみ取得して表示
-i : Respnse Header, Body の両方を出力
-v : 上記に加え、リクエスト時のHeaderも含めて出力
-H : Request Header を指定する（Content-Typeを指定する時などに）

-o : ファイルに出力
-O : ファイルに出力（リクエスト先の名前でファイルを保存）

-L : リダイレクトがあればリダイレクト先から情報取得（時短）

-d : POST送信時のデータパラメータを付与＆指定
-F : ファイルUpload時（POST）のファイル指定

# -F と -d は併用不可

--version : バージョン表示
--trace : パケットデータをログに出力
```
```zsh:HTTPメソッド指定（-X）
-X POST : POSTリクエストを送る
-X GET : GETリクエストを送る
```
## 実行例

```zsh:URL先の情報取得
curl -sSLX GET "URL"
```


```zsh:jqコマンドと併用
#jsonのデータを整形して見やすく表示
curl -sS "URL" | jq
```

```zsh:返り値を加工して表示
RESPONSE=$(curl -sSX POST --data-urlencode "URL")

echo $RESPONSE | sed 's/onesyasu/onegaisimasu/g'
```

## ステータスコードのみを取得

```zsh:
## https://qiita.com/ をステータスコードを取得したいURLに適宜置き換える
curl -o /dev/null -w '%{http_code}\n' -s "https://qiita.com/"
```


# 過去記事

https://qiita.com/ntkgcj/private/aa254d1ab2f994c97a94

# 参考
https://qiita.com/yasuhiroki/items/a569d3371a66e365316f

https://qiita.com/bunty/items/758425773b2239feb9a7

https://qiita.com/shtnkgm/items/45b4cd274fa813d29539

https://nvnote.com/curl-disable-progress/

https://qiita.com/ryuichi1208/items/e4e1b27ff7d54a66dcd9

https://takuya-1st.hatenablog.jp/entry/2015/12/11

https://teratail.com/questions/67052

https://qiita.com/unsoluble_sugar/items/9b78fd7e4e77c6e00f02
ド忘れ　linux

#削除したくない
chattrコマンドに「+i」オプションをつけることで、削除・変更ができないファイルとなります。

```:rootでも削除できないファイル
$ chattr +i ファイル名
例）
$ chattr +i  test.txt
$ rm test.txt
$ test.txtを削除できません: 許可されていない操作です。
```

```:消せるようにもどす。
$ chattr -i test.txt
$ rm test.txt
```

#コピー
```:ファイルコピー
cp コピー元 コピー先
例)テキストファイルのバックアップ(test.txt⇒test.txt_bk)
$ cp /home/app/test.txt /home/app/test.txt_bk
```
```:フォルダごとコピー
cp -r コピー元 コピー先
例)テキストファイルのバックアップ(test.txt⇒test.txt_bk)
$ cp -r /home/app /home/app_bk
```

#調査
```:現在のフォルダ
pwd
結果:/c/Users/kyo07/github
```
```:ファイル調査
find ./ -name 「調べたいディレクトリ」 -type d　で検索出来た
```


♯参考
https://ameblo.jp/itboy/entry-10166464944.html
本から学ぶプログラミング May 9



```
```
#C++によるプログラミングの原則と実践
https://amzn.to/2ytBG55
###第19章　vector,テンプレート,例外

- vectorの実装では、[]の範囲チェックは義務付けられてないが、禁じられていない
- 原則として、リソースを確保する場合は、システムにおいてそのリソースを管理する部分に、直接または、間接的に、それを戻さなければならない。
- リソースの例としては、　メモリー　ロック　ファイルハンドル　スレッドハンドル　ソケット　ウィンドウ　がある
- new演算子を使って確保され、delete演算子を使って、フリーストア に戻されるフリーストア メモリー
- vectorのようにリソースの解放に責任を持つオブジェクトは、そのリソースの使用者ownerまたは、handleと呼ばれる
- スコープ内で必要となる記憶領域の利生がまちまちである場合は、new演算子や、delete演算子を明示的に使用するのではなく、vectorを使用する


###第19章 drill
- 1  template<typename T> struct S{ T val; }; を定義する
- 2  コンストラクターを追加し、Tを使って初期化できるようにする
- 3  S<int>  S<char>  S<double>  S<string>  S<vector<int>> 型の変数を定義し、それらを選択した値で初期化する
- 4  それらの値を読み取り出力する
- 5  valへの参照を返す関数テンプレート　get()を追加する
- 6  get()の定義をクラスの外に出す
- 7  valをprivateにする
- 8  get()を使ってドリル４を再び実行する
- 9  関数テンプレート set()を追加し、valを変更できるようにする。
- 10  set()を　S<T>::operator=(const T&)と置き換える。　ヒント　19.2.5 よりもずっと簡単
- 11  get()のconstバージョンと、非constバージョンを提供する
- 12  cinからvに読み込む　template<typename T> read_val(T& v)関数を定義する
- 13  read_val()を使ってドリル３の変数にそれぞれ値を読み込む　ただし、S<vector<int>>型の変数を除く
- 14  おまけ、　vector<T>の　>>演算子と、 <<演算子を定義する   どちらの演算でも { val, val, val} 形式を使用する。 これにより、 read_val()でも　S<vector<int>>型の変数を扱えるようになる

###第19章　練習問題
- 練習問題ごとに、定義済みのクラスのオブジェクトを２つ作成し、（出力を使って）テストし、設計と実装が実際に想定どおりに動作する事を検証する。例外が関与する場所では、エラーがどこで発生するのかについてよく考える必要がある。

- 1  テンプレート関数f()を記述する。この関数はvector<T>型の要素を別のvector<T>型の要素に追加する。例えば、f(v1,v2)は、v1の要素ごとにv1[i]+=v2[i]を実行する

- 2  引数としてvector<T> vtとvector<U>vuを受け取るテンプレート関数を記述する。この関数は全てのvt[i]*vu[i]の合計を返す

- 3  テンプレートクラス Pairを記述する。このクラスは任意の型の値のペアを格納できる。このクラスを使って電卓プログラム(7.8)で使用したような単純なシンボルテーブルを実装する。

- 4  Linkクラス(17.9.3)を書き換え、テンプレート引数として値の型を使用するテンプレートに変更する。そして、Link<God>を使って、第17章の練習問題13を再び実行する。

- 5  Intクラスを定義する。このクラスには、int型のクラスメンバーが１つだけ含まれている。コンストラクター、代入、演算子+、-、*、/を定義する。このクラスをテストし、I/Oを実行しやすくなるように、<<演算子と>>演算子を定義するなど、必要に応じて、設計を改善する


###追記
- テンプレートを使用することにより、vecotorなどのコンテナーを要素型の定義から切り離して定義できる
- 例外を使用することにより、エラーを検出して通知するコードを、エラーを処理するコードから切り離して記述できる。
- push_back() resize() reserve()を使用することで、vectorの定義をそのサイズの使用から切り離すことができる。





```
```

#データサイエンティスト養成読本　機械学習入門編
https://amzn.to/3fvlfpr

###第４章　深層学習最前線
- 損失関数とは、多層パーセプトロンが出力した予測がどれくらい外れているかを返す関数




```
```

#ブッダの言葉
https://amzn.to/2A4nVdf
**人工知能を勉強する上で、人間とはを考える**
###第３章　大いなる章
- 欲望に基づいて生存の快楽に囚われている人々は解脱しがたい。他人が解脱させてくれるのではないからである
- 自分を他人と等しいと示すことなく、他人よりも劣っているとか、或は、優れているとか考えてはならない。
- 学識に関しても特に依拠することをしない
- この世についても、来世についても願うことがない





```
```
Python タプルの内包表記とジェネレータ式

タプルの内包表記とジェネレータ式の違いについてメモを残しておきます

まずは内包表記の復習から///

```inner.py
list=[]
for x in range(10):
    list.append(x)
print(list)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


#これを内包表記に書き換えると

list2=[x for x in range(10)]
print(list2)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


```

では本題のタプルの内包表記とジェネレータ式について



``` tuple.py
#普通のイテレータ
def g():
    for i in range(4):
        yield i
g=g()
print(next(g))
print(next(g))
print(next(g))
print(next(g))
"""
0
1
2
3
"""


g=(i for i in range(4))#タプルのように思えるがジェネレーターである
print(type(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
"""
<class 'generator'>
0
1
2
3

"""







```

```iterator.py
g=tuple(i for i in range(4))#タプルの場合は括弧の前にtupleと記述する必要あり
print(type(g))
print(g)
#<class 'tuple'>
#(0, 1, 2, 3)

```

#まとめ
ジェネレータ式では()内に記述すればいいのに対し、

タプルの内包表記では()の前にtupleと記述する必要があります。
Swiftで条件を満たす時のみfor文を実行する方法

`where`はめちゃくちゃ便利です。
1から64までのうち3の倍数かつ5の倍数でない数を出力させたい時には下のように書くことができます。

```swift
for i in 1...64 where i % 3 != 0 && i % 5 != 0 {
    print(i, terminator:" ")
}
```
※`terminator:" "`は改行させないために書いています。
出力　`1 2 4 7 8 11 13 14 16 17 19 22 23 26 28 29 31 32 34 37 38 41 43 44 46 47 49 52 53 56 58 59 61 62 64 `
IISに配置したWebアプリからSQL Serverへ接続できなくなったときの対処

#背景
- [チュートリアル: ASP.NET Core で Web API を作成する](https://docs.microsoft.com/ja-jp/aspnet/core/tutorials/first-web-api?view=aspnetcore-3.1&tabs=visual-studio)をやった
- "UseInMemoryDatabase"だとPC再起動でデータが消えてしまう
- 次のステップとして、SQL Serverに保存してみよう
- そうすればPC再起動してもデータは残る:ok_hand:

# SQL Server 2019をインストールした
- ここで「既定のインスタンス」と「名前付きインスタンス」を選択するところがある
- ずっと「規定のインスタンス」かつLocalDBにして作業していた
- IIS EXPRESSではうまくいく。だけど。IIS(本番)にしたらエラー続出:frowning2:
- SQL Serverのエラーコードは主に**50**と**26**
- [SSMS](https://docs.microsoft.com/ja-jp/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15)でログイン権限を変えてみたり、IIS ManagerでAppPoolのIDをいじってみたりしたけど、むりぽ。

# SQL Serverを再インストールした
- こんどは名前付きで SQLExpress
- IISだとLocalDBにアクセスするときにコケてたから、なんとなくNetworkDBにあるほうがうまくいきそうな気がした
 ![SSMS-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/718c5e69-47a8-408f-f06e-1e9fbcbbfa7a.png)

# 最後はできた！
VS2019のプロジェクトにSQLEXPRESSを追加し、PSでコマンドをうつ！

```xml:PoworShell
Add-Migration Initial
Update-Database
```
すると勝手に空だったtestDbにテーブルができている！

![vs-db.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/e52365d2-04b2-d2a4-89f4-06ad9c9bdb08.png)


```json:appsettings.json
"ConnectionStrings": {
    "WorkContext": "Data Source=.\\SQLEXPRESS;Initial Catalog=testDb;Integrated Security=True"

    ずっと苦戦してたlocalDb時代のはこれ↓
    "WorkContext": "Server=(localdb)\\mssqllocaldb;Database=WorkContext-2;Trusted_Connection=True;"
  
}
```
データソースだとかサーバだとか、カタログだとか、、、同じものを違う言葉で言ってるだけなように見える。



```XML:web.config
  <connectionStrings>
    <add name="WorkContext" connectionString="Data Source=.\\SQLEXPRESS;Initial Catalog=testDb;Integrated Security=True" />
  </connectionStrings>
```

# IIS配置後
![app poop1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/e496679d-43c3-f2e5-3058-6c6d090543f1.png)

カスタムアカウントのところに、WindowsOSログイン時に使用したユーザIDとパスワードを入力

（逆にデータベースのほうにIISの資格を与えてもいいのかは、知らない。）
（推奨されなてないけどSQL認証のほうがデータベース接続っぽくてかっこいい）

# まとめ
- IISに配置するならlocalDBじゃなくてSQL EXPRESSにする
- Windows認証ならIIS配置後にIDも変える

いろいろ無知なので、ご指導・ご鞭撻のほどよろしくお願いいたします。

# おまけ
冒頭に書いたチュートリアル(InMemory)ではID重複をPUTすると**Status500**が返ってたけど
データベースにしたら**Status409**が返ってくるようになったから、フロントの方も変更しなくちゃならなかった:point_up:
![omake.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/2c25f1cd-47d4-d4df-cf9a-edf0e1bdf64a.png)
オンライン研修でのアイスブレークのコツ

#概要

オンライン研修で成功したアイスブレークを紹介します。　一瞬で全員の一体感が得られます。
参加者がみててなんとなく笑えるのもいいですね。

どうやるかというと、タイル表示にして全員でEXILEします。w
ぐるぐるあたまを、円をかくようにまわします。
全員が回っているのをみるのは、結構壮観な眺めですよ。

かさなってはできないけど、みてておもしろく、一瞬で一体感が出てきます。
ファシリテーションのポイントはファシリテーターが面白がるということです。

#手順とポイント

ファシリテーターのために面白そうだから協力してくれとみんなに頼む形にしておくと、みんなが協力しやすくなります。

こちらから、いきなりやろうというのではなく、全員の動きをみていると一人ぐらいあたまを回す人がいるので、それを拾って「それおもしろいねー」といってみんなでやってみないとふります。
あくまで、参加者からでてきたものを増幅する形にしておくと、押しつけ感が軽減でき拾った相手をちゃんと承認することで、あくまでも参加者が主体であることを意識づけできます。　これがファシリテクニックです。

#背景
これは、ドラムサークルでよくやるテクニックの一つを応用したものです。
ドラムサークルではこれをリズムでやるわけです。
ドラムサークルは、打楽器でリズムを使ったレクリエーションの一種で、地域のコミュニティや幼稚園、小学校、高齢者施設、企業等でやられていて、全世界で多くのファシリテーターが活躍しています。
チームビルディングや、メンタルヘルスにも効果があるといわれています。

筆者は、ドラムサークルファシリテーター協会が認定するSF（スティミュレーティブ・ドラムサークル・ファシリテーター）です。

#応用編
応用編は、全員を観察してちょっとおもしろい動きをひろってそれを拡大して、みんなでコピーしてみるというのもいいでしょう。

#参考資料

ドラムサークルファシリテーター協会
https://dcfa.jp
PDOでMySQLとの接続が切れた際に再接続する

PHP で MySQL に接続する際に PDO を使う場合、 MySQLi と比べて不便なのがDBとの接続が切れたときの再接続。

MySQLi の場合なら [mysqli::ping](https://www.php.net/manual/ja/mysqli.ping.php) があるのですが、PDO には無い。

なので、自前で似たようなものを作って対応する。

# 再接続する意味

そもそも、なんで再接続なんかが発生するのか？

これは、環境と実行する内容によるのでなんとも言えないが、下記のような構成の処理の場合には比較的頻繁に発生すると思う。

- phpスクリプト と DB が別なサーバーにある
- ループ回数が多い（数十万回とか）
- ループで処理される内容の中に DB での処理とは別な時間のかかる処理がある
- DB のタイムアウトの設定が短め

前に、[MySQL server has gone away の時は wait_timeout](https://qiita.com/YKInoMT/items/1be4b52430cbe48913e4) でも書いたように、timeout 系のパラメーターが短めに設定されている場合、処理の中で時間のかかる処理、例えば別な WEB API を叩くとか、どっかからファイルをダウンロードしてくるとか、その手の処理があると確実に発生します。

もちろん、回避策は再接続以外にもあります。

代表的なのは、（意図してかどうかは別として）クエリ実行のたびに DB 接続を初期化する（プリペアドステートメントも毎回 `prepare` してたりする）タイプのソースで、この手のソースはDB接続が切れても全く問題ありません。

あとは、処理件数が少ない場合には、バッチ処理自体を再実行しても良いかもですね。

ただ、再接続できるとコネクションが切れたとしても処理を止める必要がない。

数百万レコードの突合など、比較的処理時間が長い処理を定期的に実行するような場合には、接続が切れたとしてもエラーで止まらないほうが楽だったりします。

というわけで、 `mysqli::ping` 的な処理を PDO で実現する処理を自前で作ります。

# ping の要件

基本的に、 mysqli::ping と同じ。

> サーバーとの接続をチェックし、もし切断されている場合は再接続を試みる
https://www.php.net/manual/ja/mysqli.ping.php

# 元にしたソース

似たような需要は必ずあるはずなので、探してみたら
https://terenceyim.wordpress.com/2009/01/09/adding-ping-function-to-pdo/
に、理想のソースがあったので、それを自分の処理に合うように改良しました。

## 改良のポイント

- 再接続を行ったかどうかのステータスを取得可能にした
- 再接続を試みる条件を `server has gone away` に限定
- エラー処理を入れた

私はプリペアドステートメントを使うことが多いので、単純に再接続するだけだとオブジェクトが無くなってエラーになってしまうので、再接続時にプリペアドステートメントを作り直す処理を入れたかった、というところです。

# PDO に ping 追加したクラス

```php
<?php
class RPDO {
    private $pdo;
    private $params;
    public $reconnect;
 
    public function __construct() 
	{
        $this->params = func_get_args();
        $this->init();
    }
 
    public function __call($name, array $args) 
	{
        return call_user_func_array(array($this->pdo, $name), $args);
    }
 
    public function ping() 
	{
		$this->reconnect	= False;
		
        try {
            $this->pdo->query('SELECT 1');
			
			$errorInfo = $this->pdo->errorInfo();
			
			if (!empty($errorInfo[1])) {
				if ($errorInfo[0] == 'HY000' && stristr($errorInfo[2], 'server has gone away') ) {
					$this->reconnect	= TRUE;
				} else {
					throw new Exception("RPDO::pingでエラーが発生しました。" . print_r($errorInfo, TRUE));
				}
			}
        } catch (PDOException $e) {
			if ($e->getCode() == 'HY000' && stristr($e->getMessage(), 'server has gone away') ) {
				$this->reconnect	= TRUE;
			} else {
				throw $e;
			}
        }
		
		if ($this->reconnect) {
			$this->init();
		}
 
        return true;
    }
	
	private function init() 
	{
        $class = new ReflectionClass('PDO');
        $this->pdo = $class->newInstanceArgs($this->params);
    }
}
```

このソースでは再接続の対象を 2006 `MySQL server has gone away` に限定しているが、他にも再接続で回避可能なエラーが発生した場合にはそれらも含めて処理するように改良する余地はある。

## 利用方法

`RPDO::ping` を実行して接続が確立されていることを確認してからクエリを実行する。

例えば `PDO::prepare` で作成した `PDOStatement` が必要な場合には、単純に再接続しただけではエラーになる。

下記のように ping を実行し、`$reconnect == TRUE` ならオブジェクトを再作成するような処理を入れておくと便利。

```php
<?php
$this->pdo->ping();

if ($this->pdo->reconnect) {
    // ここで PDO::prepare で PDOStatementオブジェクトを作成する
}
```

このあたりの処理は実際にはメソッド化した方が楽。

という感じ。

当然、トランザクション内では利用できないので、その辺りは考慮して実装する必要があります。
プログラミング初心者 Python3エンジニア認定基礎試験の記録


## はじめに
Python3エンジニア認定基礎試験に合格したので所感や対策を記録します。

## 私の経歴
プログラミング経験無し、テスター歴半年。
勉強したことのある言語はJava、ExcelVBAなど。
変数、関数、繰り返し、条件分岐などの基本ルールなら受け入れられる程度の頭。

## 試験を受けた動機
勤務先にてPythonで作成されたツールのコードを見られる機会があった。せっかくなら少しでも箔をつけるために関連する試験が受けられないかな、と思った。合格して何かの役に立つのかは不明。

## 試験の概要
基礎とデータ分析の2種類しかないそう。Javaのようなレベル分けは現在無い。
基本情報のような決まった場所や日時で受けるのではなく、ITパスポートのように好きな場所と日時を自分で指定して受けられる。
受験にかかる金額が高い。11000円。高い…。
60分で全40問解く。7割の28問正解で合格。

## 他の受験経験者の記事について
すごい人しか記事を書かないのかもしれない。少ない勉強時間で合格した方が多く不安を煽られた。
下記の記事より、対策に使用したKindleの本と、出題率を参考にした。以下このサイトを★とする。
https://ccie-go.com/python-exam-study/

## 私が取った試験対策
#### 期間
受けようかな〜と思ってから受験するまで5ヶ月。その間とても勉強したり全く勉強しなかったりした。
#### 対策
1. 公式の参考書をとりあえず読み終える。
・「Pythonチュートリアル 第3版」が公式の参考書とのこと。
・最初は内容が全然わからなかったがのちのち比較して成長を感じるためにもまず読んだほうが良いのかもしれない。
・私はこれが嫌で嫌で3ヶ月くらい時間を取られた。対策2と順番を逆にしてもおそらく読み終えるのはきつい。
・この本はPython製作者本人が書いているそう。当たり前なのかも知れないが初心者向けでは無い。正直文章がかなり読みにくいし分かりにくいし、サンプルコードへの説明も不足している。

2. Kindle Unlimitedで基礎の本を3冊読む。
・★サイトにも記載がある、「プログラミング超初心者が初心者になるためのPython入門」シリーズの3冊。
・サンプルコードはもちろん書いてみたほうが良いが、私は隙間時間にスマホで読んでいたので書いていない。

3. Pythonになんとなく慣れる。
・他の初心者向けの本(「Python3入門ノート」や「ふりがなプログラミング」など)を読んでサンプルコードを書いてみるのが良い。あくまで試験が目的なので最初から最後まできれいに読む必要は無いと思う。
・私の場合は勤務先でコードを読める機会があった。
(実際使われているコードを読むときは試験にあまり出ないクラスの概念が重要なので、ここでその理解をしたことが試験の役に立ったかは不明)

4. 模試で満点取れるまで実施と復習を繰り返す。
・https://exam.diveintocode.jp/exam
に無料登録して模試を実施する。
・私の場合5回目くらいで満点を取れた。そうならなければもう少し他の参考書などを読んで慣れる必要があるかも知れない。
・いろんな人が利用しているサイトなので復習をする際コードに使われている単語そのままの検索で引っかかることが多い。
・満点を取れたあとも他に何をすれば良いか分からず追加で10回くらい解いた。

5. もう一度公式の参考書を読む。
・おそらくだいぶ理解できるようになっている。模試の影響が大きいと思う。
・★サイトの、出題率の表を参考に、重要な部分に重きをおいて読んでいく。出来る限りサンプルコードを自分でも書いてみる。

6. 最後にもう一度模試を受ける。
・おそらくよりしっかりと理解しながら解けるようになっている。安心できる。
・対策5と6は受験前の2日間でおこなった。

## 当日
#### 時間配分
10分ほどで一周解き終わって、15分ほどで不安な問題を見直して、10分でもう一周解き直して確認した。時間はたっぷりあるので焦らずゆっくり解くことが大切だと感じた。試験完了後はアンケートがあった。
#### 試験内容
ここまで簡単な問題出す必要ある？という問題からこんなモジュール参考書に載っていたっけ？というものまである。金額の割に試験が簡単すぎると書いてある記事もあったが、全体的にはそこまで簡単だとは思わなかった。勉強したからこそ解けたと思う。

## 所感
何度も受ければ運でも受かりそうな試験だが、金額が高いので一回で確実に受かりたいと思うとなかなか受験に踏み出せない。公式の参考書の取っつきにくさと金額の高さが試験のハードルを上げている。出題範囲や問題数は公式の参考書と一致しているのでこれをもとに対策をしたいが、初めは読めば読むほど不安になった。同じ内容を分かりやすく書いた他の参考書があれば良いのになと思う。そしたらきっと全員受かる。

## おわりに
以上、プログラミング初心者の方の参考になれば幸いです。