OmniAICreator/Qiita-1.07M huggingface dataset:
Re:ゼロからも始まらないGoogle Playデベロッパー生活

# はじめに
Google Playデベロッパーがいきなり停止になりアプリが公開できなかった・・というポエム（愚痴）です。
全て私が規約をよく読んでいなかったのがいけないのですが
（Re:ゼロのように時間が戻れば問題ないのですが）
同じ事にならないためにも、興味ある方は読んでいただけたらと思います。
(2020/10/03追記)奇跡が起こりました。

# アプリ作成
>エミリア：ねーねースバル何か面白いアプリ作ってよ♪
>スバル　：エミリアたんの為なら頑張るよ！

こんな感じではありませんが（笑）android用のソフトを
週末ふらっとFlutterとtwitterで一人(誰にも相手にされないで)つぶやきながら完成し
ついに公開するところまで来たときに
今回の件が発生しました

# Google Playデベロッパー登録
先人達の有益なサイトを参考にして、$25を支払い無事にデベロッパー登録（承認されるまでは時差あり）をしました。
アプリ開発時、家族に協力してもらったので
家族にありがとうの意味も込めてデベロッパー名を家族の名前から一文字づつとって

>T たかゆき
>M みちる
>N ななせ
>T ちずる

TMNTとしました。

これが大問題に発展します。

# 数日後
Google Playデベロッパー登録（承認）できたよ～というメールが届いて
一安心した20分後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236053/d997fd96-d9c6-57bf-c3c0-561e6178104c.png)
新たなメールが届きました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236053/9402854a-ff76-0e71-f1e3-a988d48bfd30.png)

日本語訳ですが、tmntが虚偽の振る舞いで
いきなりアカウントが停止になりました。

https://play.google.com/
にアクセスすると権限がないということでエラーになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236053/1e9c694e-7208-4227-b11b-056ec078156c.png)

何がどうなっているのか、よく理解できていなかったのですが
とりあえず意義申し立てが可能なので即行いました。

# 異議申し立て
結論ですが、メールの返答です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236053/9cb9fd2a-407d-751f-ba9e-e625ab2e1067.png)

>たとえば、デベロッパー名 tmntは、人気ブランド Teenage Mutant Ninja Turtlesとの関係を無断で示唆するものとなっています。

そんなの日本では流行っていないし（？）そんなの知るカメ！

>このコンテンツを使用する許可を得られている場合は、恐れ入りますがこのメールへの返信にて検証可能な権利証明を添付くださいますようお願いいたします。

そんなのあるカメ！！つか俺の作ったアプリに亀なんて出てこないぞ（ゴルァ）

# その後
google内部の担当者にデベロッパー名に悪意（虚偽）はない。デベロッパー名をすぐ変更します！
と、色々お願いするも、情けのかけらもなく
何回か意義申し立てしていると
返事も返って来なくなりました。

更に規約では以下のようになっている為、もうデベロッパーに登録することはできません
>Google Play デベロッパー コンソールのご利用の停止はデベロッパー様に対するもので、複数のアカウント登録や関連する Google サービスの停止に及ぶ場合もございます。このため、新しいデベロッパー アカウントは作成されないようお願いいたします。新しく登録するアカウントはすべて閉鎖され、デベロッパー登録料の払い戻しは行われません。恐れ入りますが、あらかじめご了承ください。

>今後アプリの販売、配布を行う際は、別の手段をご利用になることをおすすめいたします。

# 愚痴です
規約を読まなかった私が悪いのですが
デベロッパーアカウント停止になる条件が初心者に厳しすぎます。

登録完了20分後にいきなり停止になるのは理不尽です。
（デベロッパー名を直してよ～みたいな、警告とかあってもよいのではないかと思います）
あと、$25は勉強代として受け入れてもよいのですが
2度と登録できないというのはかなり厳しすぎます（涙）

Google Playデベロッパーは沢山いて、私みたいなちっぽけなゴミアプリ開発者は必要ないのかもしれませんが
私が作ったアプリがもしかすると世界を変えるようなアプリの可能性もあります（かなりもってますが（笑））
そういう人たちをgoogleが応援する立場なのではないかと思います。

# 最後に
私の作成したアプリはお蔵入りの可能性大です。
(意義申し立ては完全無視なので、google内部の方で共感される方がおられたら助けてください～)

あと、これからGoogle Playデベロッパーに登録される方がおられましたら
私の過ちを繰り返さないためにも
規約をよく読んでから登録することをおすすめします。
（今回の件だけでいうと、デベロッパー名は本名がベストかと思います）

以上になります。最後まで読んで頂きありがとうございました。

# 奇跡が起こる！！:santa_tone2:(2020/10/03追記)
ダメ元で昨日異議申し立てした際、この記事のURLを記述した結果
Google Playデベロッパーアカウント停止が解除されました。
Google及びGoogleの担当者には大変感謝です！
Androidのアプリ作成に励みたいと思います。
言っている事が180度変わりますが、googleは開発者の味方です！

（約2ヶ月かかりましたが）皆様も同じようなことがありましたら、諦めない気持ちが大事かもしれません！
(C#)次の平日を取得するLINQ

#はじめに
C#で、次の平日を取得するコードをきれいに書けないかなと思ってLINQで試してみました。
もっといいコードがあればコメントいただけると嬉しいです。

#環境
Windows 10
Visual Studio 2019

#参考

こちらの記載にアイデアをもらいました。
https://tercel-tech.hatenablog.com/entry/2014/02/08/183432

#コード
DateTimeの拡張メソッドとしています。

```NextWeekday.cs
public static DateTime NextWeekday(this DateTime date,List<DateTime> holidayList = null) {
	// 100日後までの間で最も近い営業日を取得
	// 100は適当な大きな数値でOK
	DateTime next = Enumerable.Range(1, 100).Select(x => date.AddDays(x)).First(
		x => x.DayOfWeek != DayOfWeek.Saturday && x.DayOfWeek != DayOfWeek.Sunday && !(holidayList?.Contains(x) ?? false)
	);
	return next;
}
```

###注意点
祝日リストはどこかから持ってくる AND DateTime.Todayなどで時刻部分は0の前提です。
単純に、「土曜日でない & 日曜日でない & 祝日リストに入ってない」日付を順に判定しています。


#おわりに (今後の展開)

次は祝日リストですが、Google Calendar APIを調べてみたいと思います。
ここを参考にして試してみようと思っています。
https://blog.divakk.co.jp/entry/holidays
個人情報は分けてGASを使う


やったこと
・特定のシートを複数PDF化けること。
・別途JSONファイルを保存して、そこから個人情報を取得すること
・複数のPDFをメールに添付すること。

経緯：
今まで直書きしてたけど、`.envfile` のように個人情報は分けたくなりました。

下記のようなJSONファイルを用意

```JSON
{
  "user_info": {
    "mail_adress": [
      "hoge@gmail.com",
      "huge@gmail.com"
    ]
  }
}
```


コードがこちら

```js
//個人データを保存したJSONファイル。共有用ファイルから確認可能。
const file_id = "1Jo6Dx6QPU_baFnCUzXlFiFyjRpyS71Nq";
//送信内容を保存したスプレッドシートのID
const sheet_id = "1x6olwI_XZALOzayxh0vXlxKXqtzhEwT_b92c0QUW7zY";

function sendMail(){
  
  const currentTime = new Date();
  //ファイルIDを元にスプレッドシートを開く
  // 実行ファイルを利用する場合は、SpreadsheetApp.getActiveSpreadsheet();, spreadsheet.getId();でも可。

  const spreadsheet = SpreadsheetApp.openById(sheet_id);
  
  const seetNameList = ["sample1", "sample2"];

  const token = ScriptApp.getOAuthToken();

  //PDFファイル配列を作成するためのmap処理
  const pdfFiles = seetNameList.map(function(seet){ 
    //seetNameListから取得したseet名を元にsheetを取得
    const sheetName = spreadsheet.getSheetByName(seet);
    const gid = sheetName.getSheetId();
   //PDF生成するURLをfetchする。特定のスプレッドシートの特定のシートだけPDF化するため
    const url = `https://docs.google.com/spreadsheets/d/${sheet_id}/export?gid=${gid}&format=pdf&portrait=false&size=A4&gridlines=false&fitw=true`;
    const pdf = UrlFetchApp.fetch(url, {headers: {'Authorization': 'Bearer ' +  token}}).getBlob().setName(`${currentTime}.pdf`);
    return pdf
  });

  // Jsonファイルを元にデータを取得
  var file = DriveApp.getFileById(file_id);
  // objectとして取得。　中身は空
  var blob = file.getBlob();
  var data = blob.getDataAsString();
  var jobj = JSON.parse(data);

  //jsonファイルに保存した連絡先の取得
　const contactLists = jobj.user_info.mail_adress;
 
   for (let i = 0; i < contactLists.length; i++) {
    var to = contactLists[i];
    var subject = "メールのタイトルを入力";
    var body ="メールの本文を入力"; 
    
    GmailApp.sendEmail(to,
                       subject,
                       body,
                       {attachments: pdfFiles})
  }
}
```

ファイル名に時間を利用していますが、表記に利用するならmoment ライブラリを利用するのがおすすめです。
varとletとconstの違い

#はじめに
自分が忘れないために備忘録的な物として残します。
ES6から変数宣言に利用可能なletとconstが追加されました。
10年選手のWEBアプリの開発をやっていたりすると、世の中から取り残される。
varとletとconstの違いを理解した上で、今後はletやconstを使う。

#先にまとめ
|       | 初期化なしの宣言| 再宣言 | 再代入 | スコープ|
|:------|:------------|:-------|:------|:------------|
| var   | 可能         | 可能   | 可能   | 関数 |
| let   | 可能         | 不可能  | 可能  | ブロック |
| const | 不可能       | 不可能  | 不可能 | ブロック |

#var
##初期化なしの宣言
**可能**

```
var x;
```

##再宣言
**可能**

```
var x = 1;
var x = 2;
```

##再代入
**可能**

```
var x = 1;
var x = 2;
console.log(var); // 2
```

##スコープ
**関数スコープ**

```
var x = 0;
function fn(){
    var x = 1;
    console.log(x); //1
}
fn();
console.log(x); //0
```
```
var x = 0;
function fn(){
    console.log(x); //0
}
fn();
console.log(x); //0
```
```
function fn(){
    var x = 1;
    console.log(x); //0
}
fn();
console.log(x); //ReferenceError: x is not defined
```

#let
##初期化なしの宣言
**可能**

```
let x;
```

##再宣言
**不可能**

```
let x = 1;
let x = 2; // SyntaxError: Identifier 'x' has already been declared
```

##再代入
**可能**

```
let x = 1;
x = 2;
console.log(x); // 2
```

##スコープ
**ブロックスコープ**

```
{
    let x = 1;
    if(1){
        x = 2;
        console.log(x); // 2
    }
    console.log(x); // 2
}
```
```
{
    if(1){
        let x = 1;
        console.log(x);
    }
    console.log(x);// ReferenceError: x is not defined
}
```
```
{
    let x = 1;
    {
        // この場合はスコープがブロックのため、同じ変数の宣言と判断されない
        let x = 2;
        console.log(x); // 2
    }
    console.log(x); // 1 
}
```
```
{
    for(let x=0; x<1; x++){
        console.log(x); //0
    }
    console.log(x);// ReferenceError: x is not defined
}
```

#const
##初期化なしの宣言
**不可能**

```
const x; // SyntaxError: Missing initializer in const declaration
```

##再宣言
**不可能**

```
const x = 1;
const x = 2; // SyntaxError: Identifier 'x' has already been declared
```

##再代入
**不可能**

```
const x = 1;
x = 2; // TypeError: Assignment to constant variable.
console.log(x); // 2
```

##スコープ
**ブロックスコープ**

```
    const x = 1;
    {
        // この場合はスコープがブロックのため、同じ変数の宣言と判断されない
        const x = 2;
        console.log(x); // 2
    }
    console.log(x); // 1
```

#変数の巻き上げ
**JavaScriptでは、関数内で宣言されたローカル変数は、すべてその関数の先頭で宣言されたものとみなされる。**

```
{
    let x = 1;
    {
        console.log(x); // ReferenceError: Cannot access 'x' before 
        // この場合はスコープがブロックのためか、同じ変数の宣言と判断されない
        let x = 2;
        console.log(x); // 2
    }
    console.log(x); // 1
}
```

参考： [知らないと怖い「変数の巻き上げ」とは？](http://analogic.jp/hoisting/)
勉強日誌19日目

本日も仕事が忙しい。
テレワークだとイレギュラーすぐ聞けないから時間がずるずる過ぎていく・・・。

それに他の作業も来ててんやわんや。

それでも勉強はやります！

正答率　89% (87)

ICMP
IPのエラーメッセージや制御メッセージを転送するプロトコル

192.168.0.0
192.168.255.255
クラスCのプライベートアドレス

/etc/services
ポート番号とサービス名
mybatis Spring Data JPAを初期設定したときに、必要なapplication propertiesの設定(MySQLの場合)

#そもそも
どのDBに接続するのかを設定ファイルに定義する必要がある
⇒application propertiesにDB設定(DBの住所、表札)を行う！

設定していないと以下のエラー内容が発生する
↓
#エラー内容
以下のエラーが発生しました。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738783/210f0db3-f97f-fce0-c4bb-4192a0fd97ef.png)
⇒データソースに接続するための設定が存在しない

#原因
application.propertiesにデータベースに接続するための設定が必要

-----------------------------------------------------------------------------
#今回はapplication.propertiesから外部ファイルを参照する!
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738783/2c8b7d8e-ef2e-8713-9478-652d799ef55c.png)
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738783/3f8b583b-c1ae-18ac-a0b0-045d46d7a0e1.png)

「spring.profiles.include=develop」を設定することで、application.propertiesからapplication-develop.propertiesを参照することができる。
実際に接続先DBの設定を行っているプロパティファイルはapplication-develop.propertiesである。

#application-develop.propertiesの設定内容
●MySQLのドライバ設定
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
⇒MYSQLをDBに使用している場合、設定が必要

●接続用URL
spring.datasource.url=jdbc:mysql://localhost:【ポート番号】/【パッケージ名】?serverTimezone=JST
⇒DBのポート番号とapplication propertiesが存在するパッケージ名を設定
⇒(?serverTimezone=JST)
サーバーのタイムゾーンの値が認識されていない場合に設定が必要

●接続用ユーザ
spring.datasource.username=【DB作成時に設定したユーザー名】

●接続用パスワード
spring.datasource.password=【DB作成時に設定したパスワード】
JavaScriptのドット記法とブラケット記法について

#プログラミング勉強日記
2020年9月24日
「ブラケット記法」という単語を初めて聞いたので、ブラケット記法について調べていくうちに似たようなドット記法を知ったので両者を比較してみる。

#ドット記法とブラケット記法
　どちらもオブジェクトのプロパティにアクセスする方法である。

　ドット記法はその名の通り`.`(ドット)を使ってプロパティにアクセスする。`[]`はブラケットと呼ばれるので、ブラケット記法もその名の通り`[]`(ブラケット)を使ってプロパティにアクセスする方法である。


#違い
　ブラケット記法はプロパティ名に変数を使うことができるが、ドット記法は変数を使うことができない。また、ブラケット記法はプロパティ名が数字で始まるような不正な文字でもアクセスできる。(ドット記法の場合はエラーになってしまう)

#まとめ
　ここまで聞くとじゃあブラケット記法で書けばいいのでは？と思うが、<b>基本はドット記法の方が読みやすいのでドット記法で書く</b>。
　違いのところでも述べているように、プロパティ名に変数を使う場合や不正なプロパティ名にアクセスしたい場合にはブラケット記法を使う。

#参考文献
[「JavaScript」ドット記法とブラケット記法](https://harakotan.hatenablog.jp/entry/2015/05/17/004707)
LaravelのSocialiteで404エラーから抜け出せなかった自分

##LaravelのSocialiteで404エラーから抜け出せなかった自分
こんばんは。
LaravelでTwitterやGoogle,GitHub,Facebookなどでログインを実装にはSocialiteが便利です。

環境はLaravel8系でuiを使ってTwitterAPIによる認証を試みました。
リダイレクトした際にどうもエラーが出るんですよね。
XAMPPWを使うと

```HTML
Object not found!
要求された URL は本サーバでは見つかりませんでした。 もし手入力で URL を入力した場合は、綴りを確認して再度お試し下さい。

サーバーの障害と思われる場合は、ウェブ管理者までご連絡ください。
Error 404
```

こんな感じ。

これの原因解決に2日を要したのですが、結局の所.env内のCALLBACK_URLが

```HTML
http://localhost/login/twitter/callback
```

となっていたのが問題みたいです。
Laravelで普通にphp artisan serveするとlocalhost:8000で開かれます。
でも上のURLだと:8000がないんです。なので.env内とTwitterDeveloperの箇所を

```HTML
http://localhost:8000/login/twitter/callback
```

こうするとうまくいきます。

こんなちょっとのところに1日以上悩んでしまいました。
Postgresqlに接続できなくなった時の対処法

# 環境
- macOS Catalina 10.15.6
- postgres (PostgreSQL) 12.4

# 内容
postgresqlサーバーに接続しようとしたら次のようなエラーが出てきたので、その時の解決方法を覚え書き
この記事が誰かの助けになれば幸いです

```
psql: error: could not connect to server: could not connect to server: No such file or directory
	Is the server running locally and accepting
	connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
```

# 解決までのプロセス
次のコマンドでログを確認

```
$ postgres -D /usr/local/var/postgres
```

すると次のようなエラーが

```
FATAL:  could not create lock file "/tmp/.s.PGSQL.5432.lock": Permission denied
```

権限がないようなので次のコマンドで/tmpに適切な権限を付与

```
$ chmod 1777 /tmp
```

再びログを確認したところ次のような内容がありました

```
FATAL:  lock file "postmaster.pid" already exists
HINT:  Is another postmaster (PID 3473) running in data directory "/usr/local/var/postgres"?
```

どうやら起動時に生成されるlock fileがすでに存在しているようなので、それを削除

```
$ rm /usr/local/var/postgres/postmaster.pid
```

次のコマンドで動作確認

```
$ psql -l
```

無事にデータベース一覧が表示されました！

おそらく、何かしらの理由でpostgresが正しく終了しなかったことが原因ではないかと考えられます

# 参考記事
https://stackoverflow.com/questions/33942967/unable-to-start-postgres-server-because-of-permission-denied-on-lock-file
https://qiita.com/great084/items/98c83364f246473249c4
画像認識屋さんのための「初めてのAttention」　

#概要

この頃、流行っているAttention構造ってなんだろう？　ということで、調べてみたら、解説が自然言語知ってて当然だよねってのばっかりで、画像認識しか知らない自分には、とっても大変だったので、画像認識の人向けに最低限必要な内容はこのぐらい、ってのをまとめてみた。

自然言語もGANもお友達じゃないので、間違っていたら、指摘していただけると、大変助かります。

おススメ解説はこれ！
https://www.youtube.com/watch?v=yGTUuEx3GkA

###まず、自然言語の用語説明

単語がいっぱい並んで文を作っているので、単語をTokenという単位でわける。このTokenの特徴量をベクトルで持つ。画像で言うところの、ピクセルにおいて、チャンネル方向に特徴量のベクトルが入るような感じ。
上のYoutubeにある解説の例を取ると
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/a7bdb0f5-1662-57d8-17b0-c955a5a635ff.png" width=80%>
最初のBankは銀行という意味ではなく、土手という意味だが、それは、$v_4$のriverによって決定される。
単語そのものだけでは、意味は決定できなく、意味は周りの単語に依存する。そのため、ベクトル同士の関係性を見る必要がある。

普通にtime series dataであれば、あるデータは周りのデータとの関係性が深いため、ガウシアンフィルタなんかをかけて、周りのデータからエラーを吸収することができる。

この考え方を拡張すると、上の特徴ベクトル$v_1$、$v_2$、$v_3$、$v_4$の$v_3$は、あるWeight　$[w_1 、w_2 、w_3]$を使って、以下のように変換して、出力$y_3$を作ることができる。
$$y_3= w_1 v_2+w_2 v_3+w_3 v_4$$
自然言語の場合、time series dataとは違い、近くにあるから関係性が深いとは限らないが、関係性が深いかどうかWeightを用いて表すと、同じことができる。
###ここで、self-attentionという考え方を導入。
特徴ベクトルの関係性を相関で見ると考え、$v_3$とその他を内積する（$v_3^T v_i$）。これで、比較するベクトルの数だけ関係性が出てくることになる。これをWeightとしてしまうと、スケールがベクトルのスケールによって変わるので、Weightのスケールを揃えるために、Normalize（良く使うのはSoftMax）する。これで、Weightができたので、さっきと同じ方法で、出力を計算。全体の流れは、以下。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/5a01bf33-153f-2de0-8b55-f70a4c72f369.png" width=70%>
このWeightに学習は入っていない。
なんで、Self-Attentionって言うかっていうと、自然言語の人は、メモリっていう辞書みたいなモノを使っていたかららしい。画像で最初の方のエッジ検出にガボールフィルターを決め打ちで使うようなイメージ？　まあ、これは入力が自分自身だけなので、Self-Attention。

ここから、じゃあ、学習も含めようってことで、入力に学習で作るLinear変換を入れる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/6bc4e388-9755-6132-cef3-92a0cbb64569.png" width=60%>

この時、他のベクトルと関係性を確認している$v_3$は、辞書と比較しているように見えるので、データベースの用語を引っ張ってきて、以下のようにLinear変換後の値を名付ける。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/d6b2bf5a-f39b-ff69-805d-adf99a5fe3f1.png" width=78%>
最終的に、全てのデータを集めるところは、Aggregationと呼ばれる。
ここで、学習されるLinear変換が一つであるということは、Weightも1種類しかできないということになるが、関係性というのは一つに絞れる訳でもないので、Linear変換をいくつか作った方が良い。これをMulti head attentionと呼ぶ。出てきた結果は全てConcatenateしてDimensionはDense Layerで調整する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/5c9c3a69-91b0-ba50-22da-34175d9d612c.png" width=100%>
全ての特徴ベクトルにこのOperationをするのがAttention Layerということなる。
###まとめ
自然言語の方の用語を一度忘れて図を見てみると、画像のある点においてチャンネル方向に特徴ベクトル$v_i$があるのと変わらない。画像で、Convolutionをする場合、Weightは、Forward中、変わることはないが、Attention構造では、入力に合わせて毎回作られることになる。

TransformerモデルとかのAttentionでは、さらにPosition Encodingと言って、Tokenがどこにあるかという情報も入れることで、単語の並びにより意味が変わる文にも対応する。画像でも同じように、位置情報は重要になるので、この考え方も継承されている。
Excel for macのVBAでフォルダ選択する方法

macではFileSystemObjectを使えないので、代わりにMacScriptを使ってフォルダ選択ダイアログを表示する。

```VBA
 Public Sub test()
 
    Dim SelectedPath As String
    
    SelectedPath = MacScript("return posix path of (choose folder with prompt ""Select the folder"") as string")
    
    Debug.Print SelectedPath
     
 End Sub
```

実行結果

```VBA
/Users/ooki/OneDrive/Documents/Qiita記事/
```

日本語フォルダも正しく表示されてる。バッチリ。



##確認バージョン

Excel for mac バージョン 16.41（20091302）
【Swift5】AVSpeechSynthesizerとSFSpeechRecognizerを併用する際の注意点

## 概要
iOSでは標準で音声合成と音声認識の機能を利用することが可能です。
- 音声合成: AVSpeechSynthesizer
- 音声認識: SFSpeechRecognizer

音声合成と音声認識を併用するケースはそこまで多くないと思いますが、一緒に利用する場合はハマりポイントがあるのでこの記事でメモします。

## 想定するケース
音声認識後に何らかの文字列を音声読み上げする場合を考えます。
イメージしやすいように、音声認識をして取得した結果を読み上げるだけのアプリを想定します。

1. 音声認識を行い、話しかけられたテキストを取得する
2. 取得した結果を音声で読み上げる


## 音声認識
iOSで標準利用可能なSFSpeechRecognizerを利用して音声認識をします。
※iOS10から利用可能

公式Doc
https://developer.apple.com/documentation/speech/sfspeechrecognizer

下記のような実装で音声認識が可能です。(最低限イメージが持てるよう、かなり省略したものを載せています。実装する方は公式Docをご参照ください。)

```swift
import UIKit
import AVFoundation
import Speech

class SampleViewController: UIViewController {

    private var audioEngine: AVAudioEngine!
    private var recognitionReq: SFSpeechAudioBufferRecognitionRequest?
    private var recognitionTask: SFSpeechRecognitionTask?
    private var recognizedText = ""
    private let synthesizer = AVSpeechSynthesizer()
    
    ~~~~
    
    private func startRec() throws {
        ~~~~
        
        let audioSession = AVAudioSession.sharedInstance()
        try audioSession.setCategory(.record, mode: .measurement, options: .duckOthers)
        try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
        let inputNode = audioEngine.inputNode
        
        let recordingFormat = inputNode.outputFormat(forBus: 0)
        inputNode.installTap(onBus: 0, bufferSize: 2048, format: recordingFormat) { (buffer, time) in
            recognitionReq.append(buffer)
        }
        audioEngine.prepare()
        try audioEngine.start()
        
        recognitionTask = recognizer.recognitionTask(with: recognitionReq, resultHandler: { (result, error) in
            if let error = error {
                ~~~
            } else {
                print(result.bestTranscription.formattedString))
            }
        })
    }
    
```

## 音声合成
AVSpeechSynthesizerの利用法はこちらの記事で紹介しています。
https://qiita.com/maKunugi/items/dc9da201a663c8773c8c



## 併用した場合のハマりポイント
音声認識直後にAVSpeechSynthesizerのspaekメソッドを使って読み上げをしようとすると下記のエラーが発生し、読み上げが行われません。

```
2020-09-24 20:33:33.228313+0900 xxxxxxx[10895:2365580] [AXTTSCommon] Failure starting audio queue \M-3<…>
```

## 解決方法
AVSpeechSynthesizerのspeakメソッドを利用する際は、audioSession.setCategoryを指定することで解決しました。

```swift
try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback)

```

この問題についてハマった際、ネット上の記事を探していると同様の事象についてのやりとりがあります。
ex
https://developer.apple.com/forums/thread/88030

ただし、ネット上の情報だと、

```
AVAudioSession.Category.playAndRecord
```
を指定するとうまくいくと記述されている情報が多いですが、自分の環境だと、このCategoryを設定してしまうと読み上げの音量が極端に小さくなってしまうという挙動を確認しました。

※調べきれていないですが、OSのバージョンによって挙動が変わる可能性もあります。
※iOS13, 14では「playback」を指定することで正常に動作することを確認しました (XCode12)

音声認識後に音量が小さくなってしまう事象はこの記事でも登場しています。
https://stackoverflow.com/questions/40639660/swift-3-using-speech-recognition-and-avfoundation-together

情報が錯綜しているので不安はあるものの、同様の事象で悩まれている方の参考になれば幸いです。
UnityでVisual Stadio Codeをデフォルトエディターに設定する

**Visual Studio Codeインストール**
[ダウンロード](https://visualstudio.microsoft.com/ja/downloads/)

**拡張機能の追加**
左ナビのアイコンから検索

- C#
![スクリーンショット 2020-09-24 20.41.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741370/356e10ca-f1b1-0904-9b73-cf1ad361d704.png)

- Debugger for Unity
![スクリーンショット 2020-09-24 20.42.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741370/25a5cac7-3e2d-df84-0f35-552c31927c56.png)

**Visual Studio CodeをUnityのエディターに設定**

- Unityを起動して環境設定を開く（ショートカット: `⌘ + ,`）  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741370/254fa388-5721-43d1-26df-bd9ff8b0f036.png" width="150px">
- External Tools > External Script Editor > Visual Studio Codeを選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741370/b80b2a86-4d4b-fe4f-ce2e-4404e610ed77.png" width="400px">


**[備考]Visual Studio Codeで補完が効かない場合**

- Visual Studio Codeを起動して環境設定を開く（ショートカット: `⌘ + ,`）  
![スクリーンショット 2020-09-24 21.00.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741370/5b316a5e-7cb0-443d-5680-d336f4b61592.png)
- 検索欄に `useGlobalMono`と検索
![スクリーンショット 2020-09-24 21.01.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741370/9e63bd7f-9c3c-3e3a-8e10-7bc5078f9ea6.png)
- `Omnisharp:useGlobalMono`を`always`にする
![スクリーンショット 2020-09-24 21.01.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741370/1b493a71-9cdb-2b58-0906-784b8bdd5d2f.png)
Typoraでフローチャートを書くには

##この記事の目的
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549093/ea7f96a3-bc87-47a4-8d7f-9e11ebdf77da.png)
[Typora](https://typora.io)を用いて画像のようなフローチャートが書けるようになることをこの記事の目的としています。ステップを踏み,飛躍のない説明を心がけています。

##準備
[Typora](https://typora.io)をインストールし開くと,画像のようなウィンドウが表示されます。
Typoraではmarkdown記法で記述した文をすぐに表示してくれます。
<img width="300" alt="スクリーンショット 2020-09-24 20.06.49.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549093/d68d1b6c-a548-c16e-0ff7-99a10c449e1e.jpeg">
コードを組み込む際に用いる**```**を書き,さらにflowと書くことで画像のような組み込みコード欄とEmpy Diagram -> Endの不rpーチャートが表示されます。
![スクリーンショット 2020-09-24 20.11.18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549093/7ce968fc-305f-8b1f-60d1-ff02d31ab168.jpeg)

##部品の用意
フローチャートには,はじめを表すものや処理を表すものなどの部品があり,それぞれ名前が決まっています。フローチャートを書く際にははじめに部品を用意し,その後用意した部品を矢印でつないでいきます。以下のようにして部品を用意します。
`部品の名前(なんでもいい)=>部品名(決まっている)(コンマ)(枠の中に各文字)`

##開始->終了を書く
開始と終了の部品を用意します。ここでは`kaishi`,`shuryou`がそれぞれ開始,終了の部品名になっています。

```flow
kaishi=>start: 開始
shuryou=>end: 終了
```

ここまで書くと,**ERROR [Flowchart] null is not an object (evaluating `t.key`)**というエラーが出ているはずです。このエラーは用意した部品をつなげることで解消されます。

```flow
kaishi=>start: 開始
shuryou=>end: 終了

kaishi->shuryou
```

![スクリーンショット 2020-09-24 20.43.02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549093/0da45adb-297c-5702-5ed8-0f56ee1a23ab.jpeg)
画像のような**開始->終了**のフローチャートを書くことができました。

##開始->処理->終了を書く
開始->終了の流れがわかれば,後はそれを応用するだけです。**部品を用意し流れを書く**流れはどのフローチャートでも変わりません。
入出力の部品名はinputoutputなので,同様に用意していきます。

```flow
kaishi=>start: 開始
shuryou=>end: 終了
nyushutshuryoku=>inputoutput: 処理
kaishi->nyushutshuryoku->shuryou
```

![スクリーンショット 2020-09-24 20.51.03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549093/c77f7df5-883d-264b-ba41-55488045f18b.jpeg)

##分岐させる
入室力や処理の結果によって分岐させたい時には`condition`という部品を使います。
condition部品を矢印で繋ぐ時には(yes),(no)によって矢印の行き先を変更させます。

```flow
kaishi=>start: 開始
shuryou=>end: 終了
nyushutshuryoku=>inputoutput: 入出力
bunki=>condition: 分岐

kaishi->nyushutshuryoku->bunki
bunki(no)->nyushutshuryoku
bunki(yes)->shuryou
```
![スクリーンショット 2020-09-24 21.00.56.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549093/01522625-3b85-3fa0-3814-229aded48b33.jpeg)

これで目的のフローチャートは達成されました。これらを応用することで様々なフローチャートを作成することができます。
【Docker】function not implemented @ io_fread ~　というエラーの解決方法【超簡単】

##まずは解決策からいいます
####Dockerデスクトップアプリを再起動するだけ！！

これだけでした、、今までの時間はなんだったんだろう、、
Docker for Windowなら右下のクジラのアイコンを右クリックしてRestartを押せばOKです！（画像参照↓）

![スクリーンショット 2020-09-24 202325.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632678/db1d6d86-4c73-e4fb-a54a-1aaa05093621.png)
![スクリーンショット 2020-09-24 202344.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632678/21588264-e69f-8ed6-cec7-5665686bc407.png)


##エラーの経緯
githubからcloneしたRailsアプリを動かすために新たしくDocker環境を構築して色々いじっていたら、なぜか他のプロジェクトで正常に動いていたDockerコンテナがいきなり起動しなくなったという感じです。

【環境】
- windows10 Pro
- Rails: 6.0.3.2
- ruby: 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]
- Docker for windows
- MySQL 5.7
- nginx:1.15.8


##エラー内容

```
・・・（省略） Function not implemented @ io_fread （ディレクトリやファイル名）
```

見たことないエラーで焦りました。仮想環境であるDockerコンテナが他のコンテナに影響を与えることなんてあるわけない、、なぜだ、、と思い、Dockerfileをあれこれいじってしまったのが地獄の始まりでした。
原因の切り分けがまったくできていませんでしたね。

##最後まで見ていただきありがとうございました。
エラー解決に少しでも役に立てば幸いです！！
【実務未経験】AWS認定ソリューションアーキテクトアソシエイト合格まで

2020年9月にAWS認定ソリューションアーキテクトアソシエイト(SAA-C02)に合格したので、
合格までの勉強方法を合格体験記みたいな感じでメモしておきます。

 
# 筆者について
現在、大学３年生(情報系の学科)で勉強を始めた時はAWSの使用経験はありませんでした。

ただ、８月末にAWS認定クラウドプラクティショナー(CLF)に合格していましたので、広くかなり浅くAWSの知識がある状態で勉強をスタートしました。
#受けた経緯
AWSに興味があったので、学習の一つの目標としてクラウドプラクティショナーを取得。思ったよりもスコアが高かったので、「SAAも行けるんじゃないか？」と調子に乗って受けることにしました。
[***クラウドプラクティショナーの合格体験記はこちら***](https://qiita.com/SraSora/items/031f1c50a500e6305022)

# 勉強方法

[***・これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）***](https://www.udemy.com/course/aws-associate/)

***【オススメ！】***
[***・【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）***](https://www.udemy.com/course/aws-knan/)

まずは、おなじみのudemy教材です。
月に2回くらいセールをやっているのでその時に買いました。（定価はちょっと高すぎかも）

***僕はほとんどこの模擬試験問題集の方で合格したといっても過言ではないのでオススメです。***

<br>

[***・AWS認定資格試験テキスト　AWS認定 ソリューションアーキテクト-アソシエイト***](https://www.amazon.co.jp/gp/product/B07R1H87Y1/ref=ppx_yo_dt_b_d_asin_title_o01?ie=UTF8&psc=1)

クラウドプラクティショナーの時と違って、SAAは本が何冊か出版されていましたが、クラウドプラクティショナーでお世話になった本のSAA版を購入しました。

ただ、先に言ってしまうと本は試験勉強中には読み切っていません。

<br>

[***・AWS サービス別資料***](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)

これもおなじみBlackBeltです。
***模擬試験をやってみてから、EC2、S3、EBSなどの主要なサービスで理解が浅いなと思うものはPDFを読むか、YouTubeを見ましょう。***
僕はS3だけ見ました。

# 勉強の流れ
２週間で合格とタイトルに書きましたが、最初の１週間はすごいだらけてしまいました。

***実は1週間で試験をうけるつもりだったのですが、受かる気が全くしなかったので試験日を変更して、1週間延ばしています。***

## ・最初の１週間
最初の１週間は本とudemyの突破講座(ハンズオン)を同時進行でやりました。

ただ、前述した通り、かなりだらけてしまったので、本は半分しか読めていなかったですし、ハンズオンはVPCまで(大体3割)くらいまでしか終わりませんでした。

ただ、ハンズオンはゆっくり丁寧にやっていたので、EC2とVPCの問題には結構強くなっていました。
***ハンズオンは余裕をもってゆっくり丁寧にやるとかなり力が付くと思います！***

## ・残り1週間
***ハンズオンと本はもう諦めた！！***

とにかく時間がないので、ハンズオンは試験が終わってからやりますと誓って、udemyのハンズオン講座の最後についている模擬問題と、udemyの390問の模擬問題をとにかく解きました。
***問題を解くよりも解説を読んで理解することに時間をかけました。***

どんな仕上がりだったのか、参考までに模擬試験のスコアを張っておきます。

#### 【ハンズオンの模擬1と模擬2】
![ハンズmain.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693048/9eb5ade3-71b3-4143-4562-b1e79aa2fd24.jpeg)
#### 【模擬試験1、2、3】
![演習main1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693048/169e24a4-87b0-997f-334c-ed6b4bf7848c.jpeg)
#### 【模擬試験4、5、6】
![演習main2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693048/f1056a61-fe03-eedd-e4c5-401cd2a8d5c1.jpeg)

正直、結構ズタボロな感じですが、udemyの模擬問題は難しくできてるから、、、
と自分に言い聞かせつつ解説の理解をとにかく深めました。

プラスでS3のblackbeltを見たのと、クラウドプラクティショナーの特典で、
公式の模擬問題が無料で受けられたので受けました。(スコアは75%でした)

# 試験当日
試験はピアソンVUEで受験しました。
ピアソンVUEの試験当日の流れなどは[***こちら***](https://qiita.com/SraSora/items/031f1c50a500e6305022)で解説していますので、ぜひ読んでみてください。

問題1周目は迷った問題にチェックを付けて、
2周目は全体を復習しつつ、チェックを付けたところに時間をかけました。
諦めない心の持ち主なので試験終了6秒前まで見直しをしていましたが、
チェックを20個くらい付けていたので、2週目は50問目くらいまでしか見直しが終わらず
「落ちたかなー、、」と思いながら最後のアンケートをポチポチ、、、、

最後に合否が出るのは知っていたのであまり期待しないで見てみると、
まさかの、***「合格」***。
小さくガッツポーズをして席を立ちました。
## 試験結果
![Inkedb5afe439faef972991362fca126f2d13[1]_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693048/7391500c-8123-13b5-f7c2-0781c5a07624.jpeg)
ご察しの通りギリギリ合格です(ｱﾌﾞﾅｰ)

後2問くらい間違えてたら不合格だったので、
最後の6秒まで諦めなくてよかったです（笑）

# おわりに
udemyのハンズオンをやり残していますが、Route53やCloudFrontについてはAWS認定SysOpsアドミニストレーターアソシエイト(SOA)の勉強の時に使います。

ただ、資格勉強ばかりしていても、意味がないので、一旦資格は置いておいてAWSを使って何か作ってみようかなと考えています。
暴走プロセスをcpulimitで落ち着かせるAppleScript（主にOneDrive for Mac OSX）

MacOS上でOneDriveが暴走しCPUをブン回し続けてしまう事態がしばしば発生します。
どうやら同じ症状に見舞われている方は多いようで，対策として，たとえば暴走したプロセスを`kill`するシェルスクリプトをcrontabに登録する手法が紹介されています。
→ [[Mac OS] OneDriveの暴走対策 - Qiita](https://qiita.com/rpscrw/items/a5fc3b017ac8a3328d42)

しかし臆病な私はプロセスを強制終了させるのが怖い。killではなくたとえばCPU使用率の制限でどうにかならないものか。
うってつけの，`cpulimit`というコマンドがあるようです。

- [GitHub - opsengine/cpulimit: CPU usage limiter for Linux](https://github.com/opsengine/cpulimit)
- [Deep Learning や仮想通貨のマイニング時に CPU 使用率が 100% になってしまうのを防ぐ (cpulimit) | まくまくLinux/Shellノート](https://maku77.github.io/linux/manage/cpulimit.html)

そこで，暴走を感じたときに手動で`cpulimit`を動作させて，頭を冷やしてもらうことにします。

#`cpulimit`のインストール

```sh
$ brew install cpulimit
$ which cpulimit
/usr/local/bin/cpulimit #←筆者の環境の場合。あとで使う。
```

#暴走中のプロセスに`cpulimit`を適用するAppleScript

なぜAppleScriptにするのかというと，スクリプト・メニューに登録してメニューバーから実行できるようにするためです。
`cpulimit`するべきプロセス，私の環境ではプロセス名`distnoted`が暴走する場合もあれば，プロセス名`OneDrive`が暴走する場合もある。
そこで，何でもいいから**一番CPUを使っているプロセスにリミッターをかける**ことにしました。たぶんkillほど丁寧に考えなくていいし。

```applescript:暴走プロセスcpulimit.scpt
set path_cpulimit to "/usr/local/bin/cpulimit" (* 上の$ which で得たパス *)

(* プロセスIDを取得 *)
set pid to (do shell script "ps -Aro pid | sed -n 2p") as number

(* 最大CPU使用率を30%に制限してみる。 *)
do shell script (path_cpulimit & " -l 30 -p " & pid)
```
<details>AppleScriptからの`do shell script`では（ターミナルの標準シェルでパスを通しても）パスが通らないらしいので，あらかじめ`which`でフルパスを調べた上で使います。
`cpulimit`コマンドは，CPU使用率とプロセスIDを指定して実行します。ここではCPU使用率は30%に決め打ちしてみましたが，プロセスIDは調べなきゃわからない。
そこで，`ps`コマンドでプロセスIDをCPU使用率順に並べた上で(`ps -Aro pid`)，その２行目（∵先頭行は見出し行）を抽出(`sed -n 2p`)することで，最もCPU使用率が高いプロセスのプロセスIDを取得します。</details>

このスクリプトをスクリプト・メニューに登録して実行すると，下図のように，ずっとスクリプトが回り続けます⚙。これはおそらく`cpulimit`がプロセスを常駐させるコマンドだからで，閉じるボタン(x)をクリックしても反応しません。並列処理の`&`オプションをつけても同じでした。
![shot_cpulimitAS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192970/a11b363e-c05a-0c5d-d1fa-36d7630725f5.png)
仕方ないので，cpulimitは別のスクリプトから終了させることにします。

#`cpulimit`を終了させるAppleScript
```applescript:killall_cpulimit.scpt
do shell script "killall cpulimit"
```
固定のコマンドを実行するだけですが，AppleScriptにしておくことで，cpulimit発動時と同様にメニューバーから実行できます。
これを実行すると，動き続けていた`暴走プロセスcpulimit.scpt`も終了します。おそらく，`cpulimit`の終了で処理に戻る結果，最後まで辿り着いて終了するのでしょう。

Enjoy!
foreachを使って並び替え

```php:index.php
<?php
$a = array(
  1 => array(1, 0),
  2 => array(2, 1),
  3 => array(3, 1),
  4 => array(4, 1),
  5 => array(5, 0),
  6 => array(6, 0),
  7 => array(7, 0),
  8 => array(8, 5),
  9 => array(9, 5),
);

$b = array();

foreach ($a as $key => $value1) {
//value1の2番目が0だったら処理を通す
  if ($value1[1] == 0) {
    $b[] = $value1;
//valueの1の1番目とvalue2の2番目が一緒だったら処理を通す
    foreach ($a as $key2 => $value2) {
      
      if ($value1[0] == $value2[1]) {
        $b[] = $value2;
      }
    }
  }
}

$a = $b;
print_r($a);


```
結果

```php:php.php

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 0
        )

    [1] => Array
        (
            [0] => 2
            [1] => 1
        )

    [2] => Array
        (
            [0] => 3
            [1] => 1
        )

    [3] => Array
        (
            [0] => 4
            [1] => 1
        )

    [4] => Array
        (
            [0] => 5
            [1] => 0
        )

    [5] => Array
        (
            [0] => 8
            [1] => 5
        )

    [6] => Array
        (
            [0] => 9
            [1] => 5
        )

    [7] => Array
        (
            [0] => 6
            [1] => 0
        )

    [8] => Array
        (
            [0] => 7
            [1] => 0
        )

)
```
【PHP】ユーザーの検索機能

PHPについて学習内容を備忘録としてまとめます。
ユーザーの検索機能を実装しましたので、作成方法を記載します。

![anime.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/e99b83e0-2c9e-5f15-21ce-8436adec96f6.gif)


##検索フォーム作成
まずはユーザーを検索するためのフォーム画面を表示させます。
内部では入力した値が入ったユーザー名を検索する処理を行います。

```php
//ユーザーを検索するフォーム
<form method="post" action="#" class="search_container">
	<input type="text" name="search_input" placeholder="ユーザー検索">
	<input type="submit" name="search_user">
</form>
```
`placeholder`を設定しフォーム画面にはデフォルトで`ユーザー検索`と表示させます。

##検索機能を動かす
先ほど作成した検索フォームと同じphpファイルに下記コードをかきます。
header関数があるのでなるべくファイルの上部にかくことを推奨します。

```php
<?php
if (!empty($_POST['search_user'])){
    $hoge = $_POST['search_input'];
    header("Location:user_list.php?type=search&query=${hoge}");
  }
?>
```
こちらは検索フォームが検索されたときに動く処理です。

`user_list.php`はユーザー一覧画面になっており、今回の検索機能を実装する対象のファイルなのですが、
検索機能が動いたときに`user_list.php`にリダイレクトし`type=search`で`type`の値を指定し、`query=${hoge}`で検索フォームの値を取り出しています。

##検索機能の処理
それでは受け取った値を元にユーザーを表示させていきます。

```php
$page_type = $_GET['type'];

switch ($page_type) {
    case 'all';
    $users = get_users('all','');
    break;

    case 'search':
    $users = get_users('search',$_GET['query']);
    break;
  }

foreach((array)$users as $user): 

 print'<br />';
 print '<a href="../user/user_disp.php?user_id='.$user['id'].'">'.$user['name'].'</a>'; 

endforeach
```
まず`$page_type = $_GET['type'];`でURLから`type`の値を取り出して`$page_type`に渡します。
そして`$page_type`の値によって出力するユーザーを変更します。
ユーザーを取り出す際には`get_users`関数を使って取り出します。

`get_users`関数は下記のようになっています。

```php
  function get_users($type,$query){
    try {
      $dsn='mysql:dbname=shop;host=localhost;charset=utf8';
      $user='root';
      $password='';
      $dbh=new PDO($dsn,$user,$password);
  
      switch ($type) {
        case 'all':
        $sql = "SELECT id,name,password,profile
                FROM user
                WHERE delete_flg = 0";
        $stmt = $dbh->prepare($sql);
        $stmt->execute();
        return $stmt->fetchAll();
        break;

        case 'search':
          $sql = "SELECT id,name,password,profile
                  FROM user
                  WHERE name LIKE CONCAT('%',:input,'%') AND delete_flg = 0";
          $stmt = $dbh->prepare($sql);
          $stmt->bindValue(':input', $query);
          $stmt->execute();
          return $stmt->fetchAll();
        break;
      }
    } catch (\Exception $e) {
      error_log('エラー発生:' . $e->getMessage());
      set_flash('error',ERR_MSG1);
    }
  }

```
引数で渡された値を元に処理を分岐して`$query`の値から取り出すユーザーを指定しています。
`WHERE name LIKE CONCAT('%',:input,'%')`で検索フォームに入力された値が入っているユーザー名を出力しています。

```php

foreach((array)$users as $user): 

 print'<br />';
 print '<a href="../user/user_disp.php?user_id='.$user['id'].'">'.$user['name'].'</a>'; 

endforeach
```
最後に取り出したユーザー名を表示させれば実装完了です。

##参考URL
https://qiita.com/nyann123/items/7320d98d17768986add0
【C#】【DxLib】FPSが全然出ない！？ そんな時はたった一行のコードを追加するだけで、一気に爆上がりするかも？

#概要
今回はたった一行追加することで、FPSが上がる``かも？``というやり方を紹介します。
この記事は、DXライブラリの関数を用いて上の課題を解決していきます。
サンプルコードをコピペしたり、可能ならば必要な関数を覚えながら書き写しましょう。

#やりたいこと
DxLib既存の関数を利用し、FPSをある程度上昇させたい。

#例
whileより前部にある、``DX.SetDrawScreen(DX.DX_SCREEN_BACK);`` は削除してしまって構わないです。

```csharp
 // メインループ
 while (DX.ProcessMessage() != -1)
 {
     // 描画先を裏画面に設定
     SetDrawScreen(DX.DX_SCREEN_BACK);
     // 画面をクリア
     DX.ClearDrawScreen();

     //
     //処理();
     //

     // 裏画面の内容を表画面に反映する
     DX.ScreenFlip();
 }
```

#説明
while処理内の先頭に```SetDrawScreen(DX.DX_SCREEN_BACK);```こちらの関数を呼び出しました。
ループするところにこんな関数を置いてしまって大丈夫なのか？と心配な方もいらっしゃるとは思いますが、画面・処理には何の支障をきたさないので安心してください。
PHPでDBのレコードを維持しつつテストするならDatabaseTransactionsを使おう

# 結論
DBの値を操作するテストを実行する場合、
既存のDBのレコードはそのままに変更した値だけ元に戻したい

そんな時は<b>DatabaseTransactions</b>を使おう🍄


# 事例
- 有用な大量の既存テストデータが存在するDBを使って、レコード追加のテストを行う
- 普通にテストを実行すると、都度レコードが増えてしまう……🥺
- <b>RefreshDatabase</b>を使ったら、既存のテストデータまで消えた🥺🥺🔪🔪🔪

## DatabaseTransactions とは
- テスト実行中のみ有効なトランザクションを設定する
- 自動的にsetUp()でbeginTransactionして、tearDown()時にrollbackする

## 解決方法
以下のように、<b>DatabaseTransactions</b>を使う

```
class HogeTest extends TestCase
{
    use DatabaseTransactions;

    /**
     * @var HogeService
     */
    private $hogeService;

    /**
     * 初期データ投入.
     */
    public function setUp(): void
    {
        parent::setUp();
        $this->hogeService = app()->make(HogeService::class);
    }

    /**
     * @test
     */
    public function insertRecord_正常()
    {
        $name = 'fuga';
        $no = $this->hogeService->insertRecord($name);
        $this->assertSame(1, $no);
    }
}
```

## 補足
- 自動採番する項目は、レコードに登録されていなくても、<br>
<b>内部的にはカウントされている</b>点に注意

例)
　既に4回、DatabaseTransactionsを使ったテストを実行していた場合、
　その後DatabaseTransactionsを使わずに新規追加された
　以下のレコードのno（bigIncrements）は1ではなく<b>5</b>になっている

```
mysql> select no, user_id, created_at from reports;
+----+------+---------------------+
| no | name | created_at          |
+----+------+---------------------+
|  5 | fuga | 2020-09-24 19:14:47 |
+----+------+---------------------+
1 row in set (0.01 sec)
```
公式YOLOv３物体検出モデルをiOSで使う手順。

[アップル公式配布モデル](https://developer.apple.com/jp/machine-learning/models/)をダウンロードして、物体検出してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/9b5ee8b2-78ca-8acf-3b46-3f80872cee5e.png)

以下のような「人間」「自転車」「車」「バイク」。。。という８０個の物体を認識して画像内の位置を教えてくれます。
![スクリーンショット 2020-09-24 19.41.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/a399d513-c6ec-53ba-cca4-89a32db00e95.png)


#手順

###１、Visionで実行リクエストを作成
YOLOv３.mlmodelをXcodeプロジェクトにドラッグ&ドロップして、

```swift
lazy var detectRequest:VNCoreMLRequest = {
    let model = try! VNCoreMLModel(for: YOLOv3().model)
    let request = VNCoreMLRequest(model: model, completionHandler: nil)
    request.imageCropAndScaleOption = .scaleFit
    return request
}()
```
###2、ImageRequestHandlerで画像を渡して実行
```swift
let handler = VNImageRequestHandler(ciImage: ciImage, options: [:])

DispatchQueue.global(qos: .userInitiated).async { [self] in
    do {
       try handler.perform([detectRequest])
    } catch let error {
       print("\(error)")
}
```

###3,結果（ラベル、信頼度、物体位置）を処理する

画像内で認識できた物体の数だけVNRecognizedObjectObservationが返ってきます。

```swift
guard let results = request.results as? [VNRecognizedObjectObservation] else { return }
```

一つ一つの物体について、ラベル、信頼度、物体位置が取れます。

```swift
for result in results {
    let label:String = result.labels.first!.identifier // ラベル名。「labels」の０番目（例えば”Car”の信頼度が一番高い。１番目（例えば”Truck”）の信頼度が次に高い。
    print(label)
    // "Car"
    
    let confidence = result.confidence // labelの信頼度
    print(confidence)
    // 0.8664

    let boundingBox = result.boundingBox // 認識された物体の境界ボックス
    print(boundingBox)
    // (0.4403754696249962, 0.3421999216079712, 0.12934787571430206, 0.38909912109375)    
    //* Core Imageと同じで右下が原点
}
```
🐣

****
Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[MLBoysチャンネル]
(https://www.youtube.com/channel/UCbHff-wfjTnB3rtXIP6y0xg)
[Medium](https://medium.com/@rockyshikoku)

[相棒](https://twitter.com/oka_yuuji)
[note](https://note.com/oka_yuuji)
Dockerで立ち上げたGitlabとGitlab Runnerを疎通させる

# 前提
さくらVPSで仮想サーバを借り，そのサーバ上でGitlabを運用しています．
Gitlabの立ち上げなどは，公式ドキュメントの[GitLab Docker images](https://docs.gitlab.com/omnibus/docker/)を参考にdocker-composeで立ち上げました．
また，SSLの対応などは 便利なnginx-proxyのイメージがあったので．そちらを使って行おうと思って死闘したのですが，内部nginxを介さずに nginx-proxyから直接pumaサーバに飛ばそうとするのがうまくいかず，現状Gitlab単体で立ち上げという形になっています．単体で立ち上げているので，[GitlabのSSLConfiguration(lets-encrypt-integration)](https://docs.gitlab.com/omnibus/settings/ssl.html#lets-encrypt-integration)を参考に内部でSSL証明証の取得と更新をしています．
これらはすべてdocker-composeのvolumeを指定してローカルホスト側でも保持できるように設定します．

今回はこれらの立ち上げ方法ではなく，Dockerコンテナ間の通信の疎通に関しての記事となります．


# Gitlab Runnerの運用
Gitlabの運用に伴いCIを動かしたくなったため，Gitlab Runnnerの追加運用を行うことにしました．
基本的なインストールなどは公式ドキュメントのRun [GitLab Runner in a container](https://docs.gitlab.com/runner/install/docker.html)に従い行いました．Docker初心者というのもあり，コンテナ間通信はDocker内の同じネットワークにあればいけると思い込んでいたため，いつものごとく``docker network create --driver=bridge --subnet=サブネットの指定 --gateway=ゲートウェイの指定 ネットワーク名``でネットワークを作成し，GitlabとGitlab Runnerを同一ネットワークで立ち上げました．

コンテナ間通信と調べるとおそらくローカルホスト間でのpingなどのことを指すのか，“同一のDockerネットワークに入れれば通信ができる”と書かれている記事をたくさん見かけます．しかし，外部向けに公開しているGitlabへのHttp通信などは何者かに弾かれて``curl: (7) Failed to connect to gitlab.example.com port 443: No route to host``とcurlでさえ返ってきませんでした．
Docker初心者すぎてお恥ずかしいのですが，皆さん当たり前かもしれない方法でこの点に関してコンテナ間を疎通を可能できました．そちらを戒め程度に残しておきたいと思います．

> 補足
gitlab.example.comはホストのグローバルIPにDNSが向いていて，コンテナ間でなければCurlなどは難なく返ってくるという状態でした．

# 解決策
結果として，ホスト側のファイアウォールが原因で弾かれているようでした．そこで，Dockerネットワークで使用しているネットワークをファイアウォールで通過できるような設定をする必要があることがわかりました．

今回．新しく作成したDockerネットワークは``172.31.0.0/16``をサブネットとして指定しています．ネットワークの確認に関しては``docker network inspect ネットワーク名``で調べることができます．

そのため，``172.31.0.0/16``のネットワークを通せばいいと思ってこのサブネットに関してファイアウォールのルールを追加しましたが，だめでした．ここで``172.0.0.0/8``に関してルールを追加すれば良いという記事([Docker - No route to host](https://stackoverflow.com/questions/40214617/docker-no-route-to-host))を見つけたため，実直にそれを試してみたところ無事に疎通できました．これでGitlabとGitlab Runner間の通信が可能になり，Runnerの登録ができるようになりました．

叩いたコマンドを以下にまとめておきます．もしサブネットが192.168.~~の方はそちらのファイアウォールを突破できるようにしたら良いと思います．（自信ありませんが）

```sh
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=172.0.0.0/8 accept'
sudo firewall-cmd --permanent --zone=public --add-masquerade
sudo firewall-cmd --reload
sudo less /etc/firewalld/zones/public.xml

>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="dhcpv6-client"/>
  <masquerade/>
  <!-- ここが追加されてたらGood -->
  <rule family="ipv4">
    <source address="172.0.0.0/8"/>
    <accept/>
  </rule>
</zone>
```


# 最後に
まだまだQiita書き慣れず汚い文章で申し訳ありません．Dockerが便利すぎて簡易なテストはDockerで行うようにしています．
Gitlab Runnerを使えるようになったものの，まだまだCIについては勉強不足なので精進したいと思います．

何か間違っていたらご指摘お願いします．
PHPUnitテスト実行時に「no such table」エラー

# 結論
PHPUnitテスト実行時に「no such table」エラーが出たら、
テスト接続先DBがインメモリになっていないか設定を確認しよう🍄

# 事例
LaravelプロジェクトでPHPUnitテストを実行したら、
以下のエラーが出た。

```
root@efed49901495:/var/www# vendor/bin/phpunit tests/Unit/HogeServiceTest.php 
PHPUnit 8.5.0 by Sebastian Bergmann and contributors.

E                                                                   1 / 1 (100%)

Time: 868 ms, Memory: 20.00 MB

There was 1 error:

1) Tests\Unit\ReportServiceTest::countHoge_正常
Illuminate\Database\QueryException: SQLSTATE[HY000]: General error: 1 no such table: hoges (SQL: select count(*) as aggregate from "hoges")
```

## 原因
テスト接続先DBの設定が、SQLiteのインメモリ機能を使用するようになっていた。

```:phpunit.xml
    <php>
        (省略)
        <server name="DB_CONNECTION" value="sqlite"/>
        <server name="DB_DATABASE" value=":memory:"/>
    </php>
```

### Q. テスト接続先DBの設定は`.env`管理じゃないの？
A. じゃない……です🍄

Laravelでは環境変数を`.env`で設定します。
ですが、テスト時の環境変数は`phpunit.xml`内で指定された値が利用されます。

## 解決方法
テスト接続先DBの設定を、指定したいDBに合わせて修正。

```:phpunit.xml
    <php>
        (省略)
        <server name="DB_CONNECTION" value="mysql"/>
        <server name="DB_DATABASE" value="testdb"/>
    </php>
```
Found multiple CRI sockets, please use --cri-socket to select one: /var/run/dockershim.sock, /var/run/crio/crio.sock

Init a kubernetes cluster with `cri-socket /var/run/crio/crio.sock`, when run `kubeadm reset`, got these error:

```
Found multiple CRI sockets, please use --cri-socket to select one: /var/run/dockershim.sock, /var/run/crio/crio.sock
```

## Reason

kubeadm detect known cri sock by finding sock file in fs( https://github.com/kubernetes/kubernetes/blob/8eda21ea3f1c2a95581e8b48b6333d600e7ecda4/cmd/kubeadm/app/util/runtime/runtime.go#L196-L229 ), if you having docker running too, you will get this error.

## How to resolve?

Stop docker and delete `/var/run/docker.sock `:

```
rm -rf /var/run/docker.sock 
```
【競技プログラミング】形式的冪級数(多項式)を係数倍するテク

#はじめに
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://twitter.com/hashtag/%E7%AB%B6%E3%83%97%E3%83%AD%E4%BD%9C%E5%95%8F?src=hash&amp;ref_src=twsrc%5Etfw">#競プロ作問</a> <a href="https://t.co/nf6fG2f42e">pic.twitter.com/nf6fG2f42e</a></p>&mdash; 5％の確率で橙パフォをとるhotman (@hotmanww) <a href="https://twitter.com/hotmanww/status/1309050292277784577?ref_src=twsrc%5Etfw">September 24, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

これが解けるようになります。

# 形式的冪級数(多項式)を係数倍するテク
$\sum_{n=0}^{\infty}\frac{1}{n!}z^n=e^z$と言うのは有名な式ですよね
では$\sum_{n=0}^{\infty}\frac{n^a}{n!}z^n$は何でしょうかと言うのが今回の議題です。
これがわかれば$z$に$b$を代入することで答えを求めることが出来ます。

# 結論:微分してz倍する。
$\frac{dz^n}{dz}\times z=nz^n$なので、うまくいきます。
これをオイラー作用素等と呼ばれたりもするようです。
今回の場合、
$\sum_{n=0}^{\infty}\frac{n^a}{n!}z^n$は
$a=0$の時$e^z$
$a=1$の時$(e^z)'\times z$=$(z^2+z)e^z$
$a=2$の時$((z^2+z)e^z)'\times z=(z^3+3z^2+z)e^z$
と続いて行きます
この漸化式を整理すると$f_{i+1}(z)=f_i(z)+f_i'(z)$のような式になって、
$S(n+1,k)=kS(n,k)+S(n,k-1)$のような式になって、
これが第二種スターリング数だとわかります。
あとは[FFT (NTT) 関連 -memo](https://min-25.hatenablog.com/entry/2015/04/07/160154)(いつもお世話になっております)
で出来ます。

# おまけ
$(xd/dx)^kf(x)$はどうなるのでしょうか
$k=0$の時$f(x)$
$k=1$の時$xf'(x)$
$k=2$の時$xf'(x)+x^2f''(x)$
$k=2$の時$xf'(x)+3x^2f''(x)+x^3f'''(x)$
より第二種スターリング数を用いて
$\sum_{t=0}^kS(k,t)x^tf^{(t)}(x)$と表せます。(数学的帰納法で証明できます。)
#練習問題
[sum_of_exponential_times_polynomial_limit](https://judge.yosupo.jp/problem/sum_of_exponential_times_polynomial_limit)
[sum_of_exponential_times_polynomial](https://judge.yosupo.jp/problem/sum_of_exponential_times_polynomial)

<details><summary>ヒント</summary>
式を求めずとも形がわかればラグランジュ補間が出来ます
</details>
# 参考
https://min-25.hatenablog.com/entry/2019/10/08/214743
terraformでociインスタンス作成するときのavailability_domain

availability_domainの値に入れられるものがわからず困ってました。

```
error:InvalidParameter. Invalid availabilityDomain. http status code: 400. Opc request id: 560ce3190611638967f249c3e31438b7/316D5D2276CE02D0D8764B4A8E2A2654/65AB2DE31FD19486344C59C4405277F0
```
ここに書いてあった
![oci.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296083/26eccd87-9fe5-dc34-7e97-d3907fe88276.jpeg)
SQLからRPGプログラムを（直接）呼び出す

SQLからRPGを呼び出す場合ストアドプロシージャ経由でしか呼び出せない思っていました。
内容的にはほぼこの[記事](https://github.com/worksofliam/blog/issues/42)です。

## ストアドプロシージャ呼び出し

サンプルプログラムを作成します。

```sql:sum.rpgle
**FREE

Dcl-Pi SUM;
  numa int(10);
  numb int(10);
  result int(10);
End-Pi;

result = numa + numb;

Return;
```

ストアドプロシージャを作成します。

```sql:sumpgm
create or replace procedure muralib.sumpgm (IN numa INT, IN numb INT, OUT result INT) 
LANGUAGE RPGLE  
EXTERNAL NAME MURALIB.SUM GENERAL;
```

ストアドプロシージャ経由で呼び出します。

```sql:
CALL muralib.sumpgm(5,5,null);
```

![sql1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146069/e194df11-926b-f6aa-0984-e6061a0f682c.png)

RPGを直接呼び出してみます。

```sql:
CALL muralib.sum(5,5,0);
```

![sql2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146069/cb8860af-c0bb-c26f-2e77-01d3acf46a52.png)

呼び出せますが、結果が戻りません。

## 直接呼出しで結果の取得

結果を戻すように改修します。

```sql:sum2.sqlrpgle
**FREE

     Dcl-Pi SUM;
       numa int(10);
       numb int(10);
     End-Pi;

     Dcl-S rowCount Int(10);
     Dcl-Ds resultSet Dim(1) Qualified;
       result int(10);
     End-Ds;

     resultSet(1).result = numa + numb;
     rowCount = 1;

     Exec SQL Set Result Sets Array :resultSet For :rowCount Rows;

     Return;

```

実行します。

```sql:
CALL muralib.sum2(5,5,0);
```

結果が取得できました。元記事では複数項目・複数レコードを返却しています。

![sql3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146069/7f41bfba-303e-81e1-bd82-25b6071c9788.png)
Cloud Guardを使ってみる

2020年9月にCloud Guardが正式にOracle Cloud Infrastructureの機能としてリリースされました。クラウド環境が正しくセキュアに使用されているかというのは管理者の心配事の一つですが、それを解決するべくCloud GuardはOCI上の各種設定がセキュアになっているか常に監視し、ポリシー違反や不正なアクテビティがあった場合にアラート通知、または設定の修正の自動化までを提供します。

ここでは、Cloud Guardの有効化手順と実際にパブリックになっているオブジェクト・ストレージ上のバケットの検出・修正までの一連の設定を紹介します。

今回は、OCI_Administratorロールを付与したユーザーですべてのコンパートメントを対象に設定をしていますが、参照のみのユーザーやコンパートメント単位で管理ユーザーを作成したいなどユーザーごとにアクセス制御の設定を追加したい場合は[ドキュメント](https://docs.cloud.oracle.com/en-us/iaas/cloud-guard/using/prerequisites.htm)のポリシーのユースケースを参考にして下さい。

## Cloud Guardを有効化する

- セキュリティ -> クラウド・ガード -> クラウド・ガードの有効化をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/4afb7022-e648-35ad-cef4-d7e62efb17e2.png)

- 必要なポリシーを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/3b22480a-3ff3-2798-2bb7-f81487d1618c.png)

- 以下の設定を選択し、有効化を実行
    - レポート・リージョン: 各種ログのストア先、レポートリージョンはテナントで１つ
    - モニターするコンパートメント：すべて or コンパートメント指定
    - 構成・ディテクタレシピ: Oracle管理
    - アクテビティ・ディタクタレシピ: Oracle管理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/c06cf8b0-7d88-355e-df12-6cf0ec62066a.png)

- 有効化が完了すると、以下のCloud Guardのダッシュボードが表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/d5ed854c-aff6-6391-8361-d5160460c07c.png)

## Cloud Guardの動作を確認する
Cloud Guardを有効化した時点で、二つのディテクタ・レシピは既に有効化されており、監視が開始されています。また、ダッシュボード上ではリスクスコアやいくつかの問題が検出され表示がされていると思います。

ここでは、OCI Configuration Detector Recipeの中にあるBucket is publicというパブリック・バケットに関するルールを検出させてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/c7238862-8052-2cb5-9bcb-6bb44097f5ab.png)

このルールに検出させるのは、オブジェクト・ストレージ上に新しくバケットを作成し、プライベートからパブリックに変更するだけです。

- バケットを作成するとCloud Guardの問題の画面にBucket is publicの問題が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/5b2b351a-e2bd-bf68-b1b3-a7ce87ccca8a.png)

- 問題を修正するには一番右のメニューから修正を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/ee68d373-2a68-cb1e-d384-66a1730b5c24.png)

- 必須のポリシーを追加し、修正を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/5af41508-52ae-3e6f-425b-70650721b97a.png)

- ダッシュボードのレスポンダ・ステータスにバケットをprivateに変更したことが確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/953cb038-fa9a-4066-61d4-ee8019d38967.png)

提供されているレシピは、ユーザー独自の条件をつけてカスタムすることが可能です。
また、ディタクタ・レシピやレスポンダ・レシピの数はまだまだ少ないですが、今後のアップデートでさらに充実してくる予定です。
Js：tokenを取得する為に苦労した事象

今回は、token取得が出来ない事象が発生しその原因と対処を忘れない様に覚書していきます。

事象内容
Payjpでのクレジット決済機能（テスト）を実装中にtokenが取得が出来なかった。
カード決済機能js
![jsカード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683447/79045455-3294-b1ab-eb4f-0581ec300df9.png)

そこでturbolinksをコメントアウトしてみました。
turbolinksは、たまに発火に悪影響を及ぼす事があるみたです。

![turbolinks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683447/5b7a3550-07f2-c659-c5d5-3a2c0edd14dd.png)

しかし、tokenが取得出来ない事と、その前に実装していた商品出品機能の販売価格のjsが発火しない様になってしまいました。
※販売価格jsはturbolinksを有効にすると発火することは確認出来ました。

そこで、販売価格のjsコードを見直して見た
当初のjsコード
![js当初.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683447/ba0ec20a-7b4d-0dba-d7b5-fef22f324de0.png)

変更後のコード
![js変更後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683447/40f7874d-d1c4-b885-230a-8cae5797e213.png)

コード変更後の動作確認で、turbolinksコメントアウト後の販売価格js、クレジットカード決済のtokenの取得も出来ました。

今回学んだこと
今の動作確認が良くても、後々エラーが発生する事がある。
コードを見直す際は、今記述しているところだけではなく、前後のコードの流れを考え記述する事

以上です。