OmniAICreator/Qiita-1.07M huggingface dataset:
今見ているページのTwitter投稿を補助するブックマークレット【選択したテキスト＋URL】

ニュースやブログなど、何らかのサイトを見ていて
:bird:Twitterで投稿したいけど、シェアボタンが無くて不便！
ボタンはあるけど文章がついていないなどの経験はありませんか？
特に古い記事、ブログ以外のサイトなど。

そんな時にこのブックマークレットがあれば、ワンボタンで
タイトルまたはH1タグまたは【選択したテキスト】＋
URL付きの投稿画面を表示出来ます。

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570700/451301af-c9cb-5eb5-34d2-31f3cdacefd8.png)

下記のコードをコピペして、ブラウザのブックマークの
URLに貼り付ける事で利用できます。
※PC版Chromeで動作確認しています。2020.07.01現在


**選択しているテキストを文章とする版**

```
javascript:tt=window.getSelection().toString();window.open('https://twitter.com/intent/tweet?url='+encodeURI(location.href)+'&text='+encodeURI(tt),'_blank')
```

---

**ページタイトル版**

```
javascript:tt=document.title;window.open('https://twitter.com/intent/tweet?url='+encodeURI(location.href)+'&text='+encodeURI(tt),'_blank')
```

----

**H1があればH1のテキストを、なければページタイトルを使う版**

```
javascript:tt="";if(document.getElementsByTagName('h1')[0]==undefined){tt=document.title;}else{tt=document.getElementsByTagName('h1')[0].textContent;}window.open('https://twitter.com/intent/tweet?url='+encodeURI(location.href)+'&text='+encodeURI(tt),'_blank')
```

##コード解説（H1版）

すごく単純なものです。h1タグが存在するかを確認し、
存在無ければタイトルを、存在すればh1内のテキストを使います。
`tt="";if(document.getElementsByTagName('h1')[0]==undefined){tt=document.title;}else{tt=document.getElementsByTagName('h1')[0].textContent;}`

location.hrefでURLを取得します。
日本語に対応するためURLもテキストもエンコードします。
`window.open('https://twitter.com/intent/tweet?url='+encodeURI(location.href)+'&text='+encodeURI(tt),'_blank')`


##利用イメージと利用方法

1.適当なブックマークを作ります。名前も適度に付けます。
2.そのURLを上記のコードにします。Javascript:～を貼り付ける
3.投稿したいサイトを開いている時にこのブックマークを押す


画像はGoogleが対象サイトだった場合の例です。

![tw.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570700/0f4dad32-0d76-d630-62ee-cc9ef80c24d5.gif)

※画像追加しました。

例、説明ページも下記に用意しました
http://allcountry.sakura.ne.jp/biz/code/javascript/20201001/texttwitter.html
今日学習した用語アウトプット

# IDセレクタ
## (例)$("#idSelector")
取得したいHTML要素のid属性の値に#（ハッシュ）を付けたものをセレクタとして利用します。
# クラスセレクタ
## $(".classSelector)
取得したいHTML要素のclass属性の値に.（ドット）を付けたものをセレクタとして利用します。
# 要素セレクタ
## $("h1")
要素セレクタは取得したいHTML要素の要素名をそのままセレクタとして利用します。
#　属性セレクタ
## 　$("input[ type='radio' ]");
HTMLのタグの属性値を指定したい場合、$("[ 属性 = '値' ]")で属性セレクタを取得できます。
# this
関数の中でthisを使うと、イベントの発生元となった要素を取得することができます。thisはJavaScriptで、非常によく使います。jQueryでは$(this)と記述します。
# removeClass(クラス名)
クラスを削除する事ができます
#　addClass(クラス名)
removeClassとは逆に、追加する事ができます
#
［Lightsail］さくらインターネットからAWS LightsailにWordPressを最速で移行する – スモールスタート編

![lightsail01_header.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593842/660af91f-9396-47c3-f62e-9aa4ec89f23b.png)

記事はこちら
https://myscreate.com/migration-sakura-from-aws/
新卒入社後、初めてプロジェクト配属されてからの１年間の振り返りをしてみた。

#自己紹介
　・文系の４年生大学を卒業後、2019年春に新卒未経験で主にSES事業を主軸と
　　しているIT企業に入社
　・入社から３ヶ月間の研修を受講（IT基礎、プログラミング(C言語, Java, 
　　HTML, CSS, PostgresQL)
　・研修後、昨年7月〜現在まで以下に記載のプロジェクトに参画中

#配属先のプロジェクトの概要
　・C#・SQLiteを使用した保険契約に関するWindowsデスクトップアプリの
　　開発プロジェクト
　・ウォーターフォールモデル型開発
　・昨年7月から詳細設計→実装→単体テスト→結合テスト→総合テストの順に工
　　程を経験（来月7月からは受け入れテスト）

#各工程の概要・経験したこと・所感
##(1)詳細設計　
○詳細設計とは？
　・開発者や内部者に向けて書類を作成し、実際にどのような開発を行いプログラムを動作させるかを決めていくフェーズ。

○経験したこと
　・前工程（基本設計）の成果物である外部設計書を元に、内部設計書を作成（７画面分を担当）しました。

○所感
　・初めて現場に配属されてすぐの頃であったため、最初はわからないことだらけでしたが、わからないことを自身で調査したり上長に相談して地道に一つずつ問題解決することで、問題なく業務を遂行できるようになって良かったです。
　・外部設計書はクライアント目線で作成されていたが、内部設計書はプログラマー目線でプログラミングすることを前提に考えて作成しなくてはいけないので、まだまだ開発経験が乏しい私には最初のうちは難しいと思うことが多かったです。しかし、業務と並行して、業務外の自主学習でプログラミングの勉強をしていたことで、システムの機能が正常に働いたパターンや異常パターン、詳細な処理フローを考えることができるようになり、次第にプログラマー目線で設計書を作成することができるようになりました。

##(2)実装
○実装とは？
　→基本設計や詳細設計の成果物である設計書を元にプログラマーが実際にプログラミングしていくフェーズ。
○経験したこと
　→外・内部設計書を元に各画面のプログラムを組んでいきました（自分の担当７画面＋他担当の画面２画面）
○所感
・C#・SQLiteを使用したプログラミングは自主学習で事前に勉強していたが、各画面のプログラミングの中で今まで使ったことがないメソッドや書いたことがない処理があり、最初のうちは戸惑いました。ここでも地道に調査・上長に相談することで一つずつ問題をクリアでき、自身の担当画面の実装を危なげなく終えられました。
・また、いち早く担当画面の実装ができたことで他担当画面の実装も任せてもらえて、担当画面以外の画面や機能について理解が深まったので勉強になりました。

##(3)単体テスト
○単体テストとは？
→プログラミングして完成した機能や画面単体がエラーなく設計書通りに動作しているのか確認するフェーズ
○経験したこと
→自分がプログラミングした担当画面（７画面）の単体テストを実施するための単体テスト仕様書を作成して、それを元にテストを実施したり、テスト証跡や障害一覧などのエビデンスを作成しました。
・仕様変更や障害対応に伴うプログラムや設計書の修正・テストの実施
○所感
・外・内部設計書通りにプログラムが動作するか、テスト項目やデシジョンテーブルを使ってテストパターンを作成するなど、地道な作業が続きミスがないように気を付けながら実施するのが大変でした。

##(3)結合テスト
○結合テストとは？
・単体テストでテスト済みの機能や画面同士を連携させて、エラーや設計書通りに動作しているのか確認するフェーズ
○経験したこと
・自分の担当画面（７画面）と他画面（４画面）の結合テスト実施、テスト証跡や障害一覧のエビデンスの作成を担当しました。
・仕様変更や障害対応に伴うプログラムや設計書の修正・テストの実施
○所感
・自分の担当以外の機能・画面のテストを担当させてもらったので、設計書や画面担当者に問い合わせることが多く、苦労しました。しかし、その反面で担当以外の画面や機能を知ることでシステム全体の理解度を深めることができました。

##(4)総合テスト
○総合テストとは？
・システム全体を連結させてその性能を確認するフェーズ。業務シナリオ通りにシステムを動かしていき、エラーなく動作するかを確認します。
○経験したこと
・仕様変更や障害対応に伴うプログラムや設計書の修正・テストの実施
○所感
・これまでの工程でも仕様変更や障害対応がありましたが、総合テスト工程になって一番それが多くなってきたので、プログラムや設計書の修正とテストの再実施など、手戻りでの作業が多くとても苦労しました。また、総合テストは別チームが実施していたため、総合テスト実施を経験することができなかったのが残念でした。

#総評・まとめ
・プロジェクトに参画した当初（7月）は、システム開発について右も左もわからない状態でした。この１年間、詳細設計、実装、単体・結合・総合テストと経験してきたことで、システム開発の大まかな流れやシステムが完成するまでにどんなことをするのか、とても勉強になったと思います。
・クライアント（プロジェクトのPMやPLなど）に「新卒1年目なのに、経験２・3年の人と同等の成果を上げてプロジェクトに貢献してくれた」と自身の働きぶりを高く評価していただきました。その結果、当初の予定では今年の3月まで（結合テスト工程まで）の契約でしたが、10月まで（総合テスト、受け入れテスト、リリースまで）に契約延長していただくことになりました。自分の頑張りが認められてこれまでやってきて良かったなと感じました。

・今回のプロジェクトは規模が大きく、品質を重視して、ウォーターフォール型でシステムの開発が進められていました。しかし、基本設計工程の時点で仕様が確定していない箇所が多く、テスト工程になってから仕様が確定しプログラムや設計書の修正、それに伴うテストの再実施などが頻繁に行われていました。手戻りが発生しその分工数や手間が増え、現在の工程と並行して作業を行う必要があったため、とにかく各作業がどの程度の時間がかかるのか見積もりを立てて、タスク管理を徹底し、かつ、どんな作業も地道に丁寧に実施することを心がけました。その結果、無事に成果物を納期までに仕上げ、プロジェクトを円滑に進めることに貢献できました。

・今後はさらに要件定義や基本設計などの上流工程を経験し、業務の幅を広げてさらにプロジェクト全体に貢献できるような人材になっていきたいです。
ポモドーロ・テクニック

# ポモドーロ・テクニックとは？
 1タスク = 25分 + 休憩5分 = 1ポモドーロとして生産性を向上させるテクニックです✨
 
 [フランチェスコ・シリロさん](https://francescocirillo.com/)が1980年代に開発
 トマト形のキッチンタイマーを使ってトラッキング(行動を追跡して分析)していたそうです🧐
 ポモドーロはイタリア語でトマト
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383237/e271f52f-7c75-f67a-a05f-9613e2b29e2b.jpeg" height= "200" width="250">
テクニックの核となる部分は非常にシンプル
 
## 基本的な考え方
 タイマーを25分で鳴るようにセットしてから、タスクに取り掛かる

 1度に1つのタスクをおこない、25分間はそれだけに集中する

 - ポイントはとにかく集中すること
 
 - 早く終わった場合は次のタスクに取り掛かる

 - 🍅×4で15分休憩
 
## 効果的な使い方
 効果的な使い方は、目標達成までの工程を見積もり、トラッキングするためのツールとして使う
 1日に何個ポモドーロを実行できたかをトラッキングして何個達成できるかを目標にする

### 多くの成果が得られる
 ・集中力の維持
 ・タスクを計画して分析できる
 ・モチベーションUP

### 毎週どれだけ🍅？
 1週間にできるポモドーロ数を知り、それに基づいてタスクを優先順位づけ
  ・1週間をポモドーロ何個分かの限りある資源として考えられるようになる
  ・優先順位づけの重要性を知ることができる
 
##Tried doing it!!
###目標
日 🍅×5
週 🍅×40～50

###結果
日 🍅×2～6
週 🍅×30～40😥

 ポモドーロ・テクニックを使う前は、実際に可能な量よりもはるかに多くのタスクをできると思っていました
 自分の時間を過大評価し、タスクにかかる時間を過小評価していました
 しかし、ポモドーロ・テクニックを使い始めると、1日のうちタスクに使える時間がどれだけあるか正確にわかり、タスクが必要とするポモドーロの数をしっかりとつかめるようになりました

##おわりに
ポモドーロ・テクニックを試したきっかけはプログラミングの学習方法を模索していたときに見つけました👨‍💻
私の場合は「Vue.js」を学習しているときに「HTML」「CSS」も並行して理解を深めたいと思いました
そんなとき🍅を使い学習サイクルを回して生産性向上と相乗効果を得ることが実感できたので記事にさせていただきました😊
初投稿

#はじめに
Markdown記法を簡単にまとめてみた。

## 見出し
```midashi.txt
# 見出し　1
## 見出し 2
### 見出し 3
```

## 強調
```kyoutyou.txt
**強調**
```
**強調あり**
強調なし

## リンク
```link.txt
[リンク](http://...)
```
[Qiita](https://qiita.com/)

## リスト
```list.txt
- リスト 1
- リスト 2
```
- リスト1
- **リスト2（強調あり）**

##番号付きリスト
```number_list.txt
1. 番号付きリスト 1
2. 番号付きリスト 2
3. 番号付きリスト 3
```
1. リスト1
2. **リスト2**
3. [Qiita（リンク付き)](https://qiita.com/)

#まとめ
より見やすくしていきたい。
valueとplaceholderの違い(input要素でtype属性の属性値がtextのとき)

#valueの場合


```
<div>
  <input type="text" value="テスト">
</div>
```
↓
<img width="419" alt="スクリーンショット 2020-07-01 23.38.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305648/8a2780a1-5a7d-660e-d22c-f494358b10d1.png">
初期値として設定することができる。


#placeholderの場合
```
<div>
  <input type="text" placeholder="テスト">
</div>
```

↓
<img width="381" alt="スクリーンショット 2020-07-01 23.35.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305648/626666fc-362d-dc91-55f6-2bcb4918bc99.png">
入力の見本のテキストを表示できる。
firebase functionsから別のfunctionsをキックする

## やりたいこと

- functionsから別のfunctionsをキックしたい

## 先に代替案

[firebase-queue](https://github.com/FirebaseExtended/firebase-queue) というものがあるので、条件に合えばこれを使っても良さそう

- firebase realtime databaseを利用している
- 4年くらい更新されていないので怖い


## ユースケース例

この記事では下記のような挙動を例にします

- チャットアプリ
- ユーザーAがメッセージを投稿する
- 同じチャットルームに属するユーザーB, C, Dにpush通知が届く

具体的には下記のような処理フローになります

- ユーザーAがメッセージを投稿するとfirestoreにドキュメントがinsertされる
- ドキュメント作成のイベントを受けて、functionsAがキックされる
- functionsAの中で
    - 同じルームのメンバー一覧を取得
    - メンバーそれぞれについて、push通知を発行するfunctionBをキックする


## functionA

実装のイメージです

```ts
// ポイント1: functionsの中だけど、クライアント用のSDKを利用している
import firebaseClient from "firebase";

firebaseClient.initializeApp(client_sdk_config);
const functionsClient = firebaseClient
  .app()
  .functions("asia-northeast1");

// ポイント2: timeoutを指定することで、functionsBをキックするけど結果を待たない、ということができる
const functionB = functionsClient.httpsCallable(
  "functionB",
  { timeout: 1000 } // msec
);

const pushTargetUsers = ["user-B", "user-C", "user-D"];
const pushSendTasks = pushTargetUsers.map(async (userId) => {
  try {
    await functionB(userId);
  } catch (error) {
    if (e.code === "deadline-exceeded") {
      // functionBの完了は待たないので、timeoutエラーは無視する
      return;
    }

    throw e;
  }
});

await Promise.all(pushSendTasks);
```


## ポイント

- client用のSDKを使う
    - functions内部では普通はadmin SDKしか利用しない
    - しかしadmin SDKにはfunctionsを呼び出す機能がない
    - なのでclient用のSDKを利用することでfunctionsを呼び出す
- functionsを呼び出すときにtimeout値を必要に応じてセットする
    - timeoutをセットしない場合
        - functionBが完了するまで待つことになる
        - この場合、functionBの返り値を受け取ることができる
        - 返り値を受け取りたい場合、わざわざ別functionに分離するメリットはあまりないので、このパターンはあまり利用機会がなさそう
    - timeoutをセットする場合
        - timeout以内にfunctionBが完了しなかった場合、 `deadline-exceeded` のエラーがスローされる
        - そのエラーは想定内なので握りつぶす


- functionsのタイムアウトは2種類ある
    - x: functionそのものの実行時間のタイムアウト
        - これはfunctionのデプロイ時にセットする
        - https://firebase.google.com/docs/functions/manage-functions?hl=ja#set_timeout_and_memory_allocation
    - y: functionを呼び出す側がレスポンスを受け取るまでのタイムアウト
        - これはfunctionを呼び出す側が、呼び出し時にセットする

↑xのタイムアウトを60秒、yのタイムアウトを10秒にセットしてfunctionを呼び出す、みたいなことができる

その場合、下記のような挙動になる

- 10秒以内に処理が完了した場合
    - functionは正常にレスポンスを返す
- 10秒以上かかった場合
    - 呼び出し側ではyのタイムアウトエラーがスローされる
    - **しかし、キックされたfunction自体は10秒を超えても動いており、60秒以内に処理が完了すれば正常終了となる**


## 感想

AWS LambdaではSDKが同期呼び出し、非同期呼び出しなどをサポートしており、もっとシンプルに同じことがやれます

firebase functionsでも同じことがやりたいと思って試行錯誤してこの結論に辿り着いたのですが、SDKでサポートしてくれるとありがたいですね...

また、そもそもfunctionからfunctionを直接呼び出すというのはあまり良い手段ではなく、AWSではstep functionsを使うべき場面だと思います

firebaseでも同様に別の手段を模索するべきなのかなとちょっと思いました
2つの母集団から抽出した標本から，母平均の差の検定をする方法

# １．この記事でまとめたいこと

2つの母集団から無作為に標本を抽出し，その標本から母平均に差があるかの検定を行う方法。
絵でいうと下記。
<img width="" alt="1_mission.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614756/a37a2fb0-c4a2-aef6-3e96-0d2ff0ab1771.png">



# ２．まとめた背景

参考書などで勉強していたところ，母分散の前提として下記3つのケースの検定が出てきた。

   -  母分散既知 
   -  母分散未知　ただし，${\sigma_X }^2 ={\sigma_Y }^2$
   -  母分散未知　・・・Welchのt検定 

それぞれのケースで，新たに定義する確率変数や，その確率変数が従う分布（標準正規分布/t分布）が異なっており，覚えられなかった。
基本となる出発点と，3つのケースの対比という見方をすれば，理解できそうなのでまとめた。

  

# ３．基本となる出発点

母平均の差の検定をするには，標本平均の差（$\bar{X} -\bar{Y}$）から求められそうなことはわかる。
そこで，確率変数$\bar{X} -\bar{Y}$の分布を考えると，下記となる。

   -  分布：正規分布・・・X,Yそれぞれ正規分布なので 
   -  平均：$\mu_X -\mu_Y$・・・確率変数から自明 
   -  分散：$\frac{{\sigma_X }^2 }{m}+\frac{{\sigma_Y }^2 }{n}$・・・XとYは独立のため，分散はそれぞれの和になる

つまり，下記確率変数Tを定義して，確率変数$\bar{X} -\bar{Y}$を標準化すると，Tは標準正規分布N(0,1)に従う。

```math
T=\frac{\left(\bar{X} -\bar{Y} \right)-\left(\mu_X -\mu_Y \right)}{\sqrt{\frac{{\sigma_X }^2 }{m}+\frac{{\sigma_Y }^2 }{n}}}
```

なお，ココの導出はモーメント母関数を使用することでも可能。マセマ出版社の参考書 P.201参照
この確率変数Tを念頭に置くと，3つのケースがすっと頭に入ると思う。



# ４．3つのケースで考えると

それぞれのケースの対比を取って考えると，下図のようにまとめることができる。

<img width="" alt="4_3case.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614756/20a27e33-7b42-7f2e-399e-795663882246.png">

  


ポイントとしてはこのあたりだと思う。

   -  ①～⑤の流れは全て共通 
   -  ②で帰無仮説（$\mu_X =\mu_Y$）を前提とするため，確率変数から$\mu_X -\mu_Y$は消える 
   -  母分散未知のケースは母分散を不偏分散的なもので代用するため，確率変数はt分布に従う※ 

※の部分は，[別記事](https://qiita.com/mikannto15/items/1c1907a7901b61a1424f)の★2参照


# ５．参考文献

・マセマ出版社　統計学キャンパス・ゼミ 改訂5　P.200-211
https://www.mathema.jp/product/統計学キャンパス・ゼミ-改訂5/


・ヨビノリ　確率統計　推定・検定入門
https://www.youtube.com/playlist?list=PLDJfzGjtVLHmx7qMP410-9gx0weC9d90X
CloudWatch Eventにてイベントソースからの情報をAWS Batch Jobのパラメータに渡す

# はじめに

本記事は、AWS公式ドキュメントの[CloudWatch イベント ターゲットとしての AWS Batch ジョブ](https://docs.aws.amazon.com/ja_jp/batch/latest/userguide/batch-cwe-target.html)の内容をより噛み砕いた記事になります。

# 例とともに

## やりたいこと

今回やりたかったことは、CloudWatch Eventsをスケジュール形式で実行させ、このときEventが持つその実行時の日時をAWS Batch Jobに渡すことです。

## Batchの状態

AWS BatchのJob Definitionには以下のように`date`という値をパラメータにした定義を持っています。

CLIで表示すると以下のように出ます。

```
$ aws batch describe-job-definitions --job-definition-name "my-job-definition-name"
{
    "jobDefinitions": [
        {
            "jobDefinitionName": "mixlunch-matching-job-definition",
            "jobDefinitionArn": "arn:aws:batch:ap-northeast-1:XXXXXXXXXXXX:job-definition/mixlunch-matching-job-definition:5",
            "revision": 5,
            "status": "ACTIVE",
            "type": "container",
            "parameters": {
                "date": "2018-11-01T00:00:00Z"
            },
            "retryStrategy": {
                "attempts": 1
            },
            "containerProperties": {
                "image": "XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/mixlunch-matching:latest",
                "vcpus": 1,
                "memory": 2000,
                "command": [
                    "python",
                    "./run.py",
                    "Ref::date"
                ],
.
.
```

私の上記の例の場合は`date`パラメータはPython実行にて引数としてアプリに渡すために利用します。

## CloudWatch Eventでの設定方法

今回の例ではスケジュール設定(cron)でのイベントソースを利用します。CloudWatch Eventのルールにおけるイベントソースはとても多様ですが、後述の設定方法はどのイベントソースでも共通です。

スクショとしては下記のようになります。

![CloudWatch_Management_Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91562/d1370041-e385-3da0-2c27-371bb72b1afc.png)

スクショ左下青枠はイベントソースからやってくるサンプルのJSON形式です。

今回AWS Batch Jobに渡したいのは赤枠の部分の`"time"`フィールドの中身です。

そのために、スクショ右側でのConfigure inputにはInput Transformerを設定します。

1つ目の枠には、イベントソースから来るJSONのフィールドを指定のキーに渡す設定です。

```json
{
  "detail": {
    "requestParameters": {
      "bucketName": "my-bucket"
    }
  }
}
```

上記のようなJSON形式の場合のイベントソースならば、`{"myValue": "$.detail.requestParameters.bucketName"}`のように記述できます。

2つ目の枠では1つ目で取得したキーを用いてAWS Batch Jobのパラメータに指定します。

今回の例では`{"Parameters" : {"date": <TimeValue>}}`とすることでAWS Batch Jobで定義している`date`へ渡すことができます。

AWS CLIでは以下で内容を取得できます。

```
$ aws events list-targets-by-rule --rule "matching"
{
    "Targets": [
        {
            "Id": "IdXXXXXXXXXXXX",
            "Arn": "arn:aws:batch:ap-northeast-1:XXXXXXXXXXXX:job-queue/mixlunch-matching-job-queue",
            "RoleArn": "arn:aws:iam::XXXXXXXXXXXX:role/service-role/AWS_Events_Invoke_Batch_Job_Queue_XXXXXXXXXXXX",
            "InputTransformer": {
                "InputPathsMap": {
                    "TimeValue": "$.time"
                },
                "InputTemplate": "{\"Parameters\" : {\"date\": <TimeValue>}}"
            },
            "BatchParameters": {
                "JobDefinition": "arn:aws:batch:ap-northeast-1:XXXXXXXXXXXX:job-definition/mixlunch-matching-job-definition:5",
                "JobName": "matching-job"
            }
        }
    ]
}
```
Windows 10環境 pipでbox2d-pyをインストールしよう

# box2d-pyとは？

Pythonの強化学習でよく使用するOpenAI Gymパッケージで利用されているライブラリです。

https://pypi.org/project/box2d-py/

# box2d-py Windwosのインストールの問題

このパッケージ、Windows環境でインストールするのは、なかなか骨が折れます。私も次のようなエラーで苦しみました。

```
swig.exe -python -c++ -IBox2D -small -O -includeall -ignoremissing -w201 -globals b2Globals -outdir library\Box2D -keyword -w511 -D_SWIG_KWARGS -o Box2D\Box2D_wrap.cpp Box2D\Box2D.i
    Box2D\Box2D.i(44) : Error: Unknown directive '%exception'.

```

Windows上で問題を避けるのはcondaでのインストールが最も手早いようですが、condaを使っていない私にはちょっとハードルが高いです。Wheelファイルを作って、pipで簡単にインストールできるようにしました。gym[all]などをインストールする前に、こちらのwheelファイルをご活用ください。

# wheelファイルでインストール

Python環境にあわせたwheelファイルをダウンロードし、wheelファイルでbox2d-pyをインストールしましょう。

https://github.com/kitfactory/box2d-py-wheel

```
> pip install box2d_py-2.3.8-cp38-cp38m-win_amd64.whl

> pip install box2d_py-2.3.8-cp37-cp37m-win_amd64.whl

> pip install box2d_py-2.3.8-cp36-cp36m-win_amd64.whl

```
Biopython Tutorial and Cookbook和訳(4.4)

## 4.4  Comparison
[4.3へ](https://qiita.com/chaos44/items/0a2fe67515a87d8eb05b)

The SeqRecord objects can be very complex, but here’s a simple example:
**SeqRecordはとても複雑ですが、簡単な例があります：**

```python
>>> from Bio.Seq import Seq
>>> from Bio.SeqRecord import SeqRecord
>>> record1 = SeqRecord(Seq("ACGT"), id="test")
>>> record2 = SeqRecord(Seq("ACGT"), id="test")
```

What happens when you try to compare these “identical” records?
**同じrecordで比較したらどうなりますか？**

```python
>>> record1 == record2
...
```

Perhaps surprisingly older versions of Biopython would use Python’s default object comparison for the SeqRecord, meaning record1 == record2 would only return True if these variables pointed at the same object in memory. 
In this example, record1 == record2 would have returned False here!
**古いッバージョンのBiopythonはpythonデフォルトのオブジェクト比較を使うため、メモリ上同じポイントを指すrecord1とrecord2の比較はTrueを返します。
この例ではFalseを返します。**

```python
>>> record1 == record2  # on old versions of Biopython!
False
```

As of Biopython 1.67, SeqRecord comparison like record1 == record2 will instead raise an explicit error to avoid people being caught out by this:
**Biopython 1.67ではSeqRecordの比較は明示的な例外を起こします。***

```python
>>> record1 == record2
Traceback (most recent call last):
...
NotImplementedError: SeqRecord comparison is deliberately not implemented. Explicitly compare the attributes of interest.
```

Instead you should check the attributes you are interested in, for example the identifier and the sequence:
**他はご自身で試して見てください。例えば配列の識別子の比較なら：**

```python
>>> record1.id == record2.id
True
>>> record1.seq == record2.seq
True
```

Beware that comparing complex objects quickly gets complicated (see also Section 3.11).
**複雑なオブジェクトを比較するとややこしくなることに用心しましょう。**
過去のコミットにタグを付けてgithubに反映させる

アプリのリリースのたびにリリースタグを付けています.

タグをつけ忘れたんですが, 過去のコミットIDに対してタグを付けて, タグ情報だけPUSHできるそうなので方法をまとめます.



## 1. コミットに対してタグを付ける

タグを付けるコマンドはこちら

```
git tag tab_name commit_id
```

githubからタグをつけたいコミットを探して, コミットIDをコピーしましょう〜


## 2. タグをPUSHしてgithubにも反映させる

タグつけただけだとgithubでは見れないので, タグをPUSHする必要がある模様です.

以下でできるそうです.

```
git push origin tag__name
```


めちゃ簡単でした.
deviseで複数モデルを管理

# deviseで複数のモデルを管理

最近、ECサイトを開発するにあたり、出てきたユーザーのログイン機能実装。

ですが、ECサイトのようなユーザーとは別な使用（今回でいう注文の確認と新規商品等の確認）をする管理者もログインが必要になる場合、どうしたらいいかということで下記サイトを参考にしました！

https://qiita.com/Yama-to/items/54ab4ce08e126ef7dade

ここからは自分の頭を整理するために流れを簡潔にまとめて見ました。



    rails g devise:install

config/initializers配下にdevise.rb が追加される。

最後の

    config.scoped_views = true

に変更してコメントアウト。
このファイル他にもコメントされている部分があってなんかすごい大事そうな気配がしたので、それぞれの意味を調べて見ました！
下記がとてもわかりやすくまとめてありました！

https://qiita.com/linkss/items/9b005ebc2ef81a39afa2

どうやらここではdeviseのviewsの編集を許可する意味の記載らしい。
またちょいちょい目にするscopeはとりあえず範囲という意味で把握すれば良いらしい。

あとはそれぞれdeviseと関連付けたいモデルとコントローラーを生成する。

     rails g devise "関連づけたいモデル名"
     rails g devise:controllers "関連づけたモデルと連動するコントローラー名（s）"
     rails g devise:views


##　ルーティングの設定

現状のままだと全て同じコントローラー経由になってしまう。
ルーティングをいじらないとだめということで、

    devise_for :models, controller: {
     sessions: "models/sessions",
     passwords: "models/passwords"
     registrations: "models/registration"
     }

みたいな感じで記載する。
Selenium::WebDriver::Error::StaleElementReferenceError


#開発環境

・Ruby: 2.6.3
・Rails: 6.0.3
***

#Selenium::WebDriver::Error::StaleElementReferenceError
**system specのテスト時**に以下のエラーが出ました。

```rails

Selenium::WebDriver::Error::StaleElementReferenceError:
       stale element reference: element is not attached to the page document
         (Session info: chrome=83.0.4103.116)
```

#ドキュメント


```
A command failed because the referenced element is no longer attached to the DOM.

訳:参照された要素がDOMにアタッチされなくなったため、コマンドが失敗しました。
```

#エラーが起きたテストをみてみる

```spec/system/users_spec.rb
#ログイン成功を確認するテスト
it 'is success that Creating new user with E-mail' do
      visit login_path
      fill_in 'E-mail', with: user.email, match: :first
      fill_in 'Password', with: 'suzuki1234'
      within '.login-form' do
      click_button 'Log in'
      expect(page).to have_content 'login success'
      expect(current_path).to eq user_path(user.id)
      end
    end
```

#結論


```spec/system/users_spec.rb
　　　 within '.login-form' do
      click_button 'Log in'
      expect(page).to have_content 'login success'
      expect(current_path).to eq user_path(user.id)
      end
```

に問題があった。
view内に、``Log in``というテキストが二箇所あるので、範囲指定をするために``within``を使っていたが、``end``の位置が悪かったみたい。

#修正版


```spec/system/users_spec.rb
it 'is success that Creating new user with E-mail' do
      visit login_path
      fill_in 'E-mail', with: user.email, match: :first
      fill_in 'Password', with: 'suzuki1234'
      within '.login-form' do
      click_button 'Log in'
      #ここにend
      end
      expect(page).to have_content 'login success'
      expect(current_path).to eq user_path(user.id)
    end
```

endの位置が悪かった。ごめんなさい...
JavaScriptで日付が変わったら処理する

## 改訂

以下に書いてある記事は思いつきで書いたものです、当初は毎日入っているデータに対して曜日を取れば処理できると思っていましたが、色々考えた結果普通にgetDateを使ったほうが同じ手間で簡単でした

## 前提

arrayにはこういう構造でデータが入っているものとする

```javascript
const messages = [
  {
    "date": new Date("2020/06/29")
  },
   {
    "date": new Date("2020/06/30")
  },
]
```

## 曜日比較コード

dateのgetDay()関数で曜日を示すindexが取れ、それが日付が変わることを示すのでそれを使った判定が楽だと思います。(日を取って比較してもいいがこちらのほうが手間がかからない)

formatにはdayjsを使っていますが気にしないでください

```javascript

  let day

  messages.forEach((message) => {
    // 次の日になったら日付を出力する
    if (message.date.getDay() !== day) {
      console.log(`\n${dayjs(message.date).format("YYYY/MM/DD")}`)
    }

    day = message.date.getDay()
  });
```

### 備考

- 曜日取得で判定しているので一週間分急にデータがなく過ぎたらバグる


## 改良版日付比較コード

同じくgetDateで日付のindexが取れるのでこっちのほうが同条件でおおむねバグらない感じでした

```javascript

  let date

  messages.forEach((message) => {
    // 次の日になったら日付を出力する
    if (message.date.getDate() !== date) {
      console.log(`\n${dayjs(message.date).format("YYYY/MM/DD")}`)
    }

    date = message.date.getDate()
  });
```

### 備考

- 日付の数字しか取れないので、一ヶ月急に過ぎたらバグるが多分現実にあまりないと思うので気にしなくていい
配列を使うメソッドがその配列を破壊🧟しないことを外部にアピールしたいとき

基本的に、副作用👶のあるメソッドを作るときは注意が必要です。
ここで言及している副作用👶とは、そのメソッドを呼ぶと、引数に使用したオブジェクトや、そのインスタンス自体に変更が及ぶことを指しています。

# 副作用👶と破壊🧟

そのメソッドが副作用👶をもっていることを示す例として一番わかりやすいのは戻り値を `void` にすることです。
ある処理をするのに戻り値がないということは、そのメソッドは以下のどれかです。

* 本当に何もしていない
* リポジトリやロガーなどを動作させている
* **副作用👶がある**

*リポジトリやロガーなどを動作させている*については、成功時は何もしないが失敗時は例外を投げるという運用になっていることがあります。

題名にある破壊🧟というのも似た表現で、たとえば引数が配列なら、中身が減っているとかを指します。
ありがちな例としてはメソッドの内部で `array.shift()` を呼んでいたりするとそのメソッドを呼ぶだけでもとの配列の中身が消えてしまいます。

## どうやってアピールしますか

「ぼく悪いスライム🙄じゃないよ」と言っているスライム🙄がいたとして、それがまもののスライム🙄なら人語を操る悪いスライム🙄かもしれないわけです。
悪くないなら悪くないなりのアピールをしないと使用する側は中身を見なければいけなくなります。

そこで、引数だけでこれはいいスライム🙄！となるような引数設計をします。

## 「ぼく悪いメソッド🙄じゃないよ」の例

1. `readonly`
2. `ReadonlyArray`
3. `ArrayLike`

### `readonly`

最も簡単な方法です。配列の型の前につけます。
この方法は配列を `array` 方式で書いたときと `tuple` のときに限り使用可能です。

```typescript
const enumerate = (elements: readonly unknown[]): void => {
  elements.forEach(console.log);
}
```

### `ReadonlyArray`

`generic` 方式で `Array<T>` と書くときの `Array` の代わりに `ReadonlyArray` と書くだけです。

```typescript
const enumerate = (elements: ReadonlyArray<unknown>): void => {
  elements.forEach(console.log);
}
```

### `ArrayLike`

`ArrayLike` は厳密には配列ではないのですが、最低限配列として振るまえる機能をもっているオブジェクトが実装しているインターフェイスです。TypeScriptでは以下のように定義されています。

```typescript
interface ArrayLike<T> {
  readonly length: number;
  readonly [n: number]: T;
}
```

つまり `array[n]` と `array.length` だけができるオブジェクトを指します。このインターフェイスは、破壊🧟的なメソッドの宣言自体がありません。

定義の通り `array.forEach()` すらないので上記のような動作を期待するときは予備動作が必要になります。

```typescript
const enumerate = (elements: ArrayLike<unknown>): void => {
  Array.from<unknown>(elements).forEach(console.log);
}
```

`Array.from<T>()` を介して一度 `ArrayLike<T>` を `Array<T>` に変換して、そこから `array.forEach()` を使います。

配列への変換により配列自体は別オブジェクトとして(要素はそのままですが)生み出されているので、たとえその配列に破壊🧟的なメソッドを適用しても元の `ArrayLike<T>` には影響を与えなくなります。

## 番外編

配列に shallow copy を施したいときは spread syntax を用いれば簡単にコピーできます。

```typescript
const array: number[] = [1, 2, 3, 4];
const copied: number[] = [...array];
```

これは `ArrayLike` には使うことができないので注意してください。
JavaScriptの基礎文法

<img width="334" alt="スクリーンショット 2020-07-01 22.54.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663122/417e72af-9f5b-12a7-8b64-1c43c9442d82.png">
コンソールにて　Heloo world と出力されます

下記の解説をします。
# let btn = document.querySelector("button");
ノードオブジェクトのbuttonをbtnに代入しています。
# function printHello() {
  console.log("Hello world");
printHello関数を定義しています。
２番目の記述で、コンソールにHello worldと出力しています
# btn.addEventListener("click", printHello);
buttonのノードオブジェクトに対して、clickイベントとprintHello関数を紐付ける仕組みであるイベントリスナを追加する。



## DOM
DOMとはDocument Object Model(ドキュメントオブジェクトモデル)の略です。HTMLを解析し、データを作成する仕組みです。HTMLで書かれたファイルは結局ただの文字情報なので、そのまま表示しても意味がありません。HTMLを解析し、CSSやJavascriptによる装飾を行ってから画面に映すという工程が必要です。
## ノード
HTML1つ1つのタグが、DOMツリーの中ではノードと呼ばれます。
## document.getElementById("id名");
documentは、開いているWebページのDOMツリーが入っているオブジェクトです。documentに対していくつかのメソッドを利用することで、DOMツリーに含まれる要素を抽出して取得することができます。.getElementById("id名")はDOMツリーから特定の要素を取得するためのメソッドの1つです。引数に渡したidを持つ要素を取得します。
## document.querySelector("セレクタ名");
セレクタ名とは、CSSでスタイルを適用するために指定している要素です。セレクタ名を指定してDOMを取得する場合、querySelectorメソッドを使用します。HTML上から、引数で指定したセレクタに合致するもののうち一番最初に見つかった要素1つを取得します。
## addEventListener
(ノードオブジェクト).addEventListener("イベント名", 関数);
上記のような記述により、この記述の読み込み以降で「ノードオブジェクト」に「イベント」が起きた時、「関数」を実行するようになります。

## addEventListener
「ノードオブジェクト」に「イベント」が起きた時、「関数」を実行します。
AndroidStudioでPluginを導入する方法

# 概要
AndroidStudioでPluginを導入する際に少々ハマったので忘備録として残しておく。
~~こんなことでハマるのはどうなの....~~

## Androidバージョン
Android 3.5.3

## Pluginの導入方法
File -> Settings -> Plugins
![AndroidStudioProj.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325874/db533d8a-eca8-4151-5dd3-8e47888c2a81.png)
![Settings 2020-07-01 23.09.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325874/76175dd8-d06a-ce93-d3a9-64c12b7629a6.png)

**以上**
ubuntu: マウス・タッチパッドの入力軸を回転


## terminalで以下を実行
```:左90度回転
xinput set-prop 13 'Coordinate Transformation Matrix' 0 -1 0 1 0 0 0 0 1
xrandr -o left
```
```:右90度回転
xinput set-prop 13 'Coordinate Transformation Matrix' 0 1 0 -1 0 0 0 0 1
xrandr -o right
```
```:180度回転
xinput set-prop 13 'Coordinate Transformation Matrix' -1 0 0 0 -1 0 0 0 1
xrandr -o inverted 
```
```:0度に戻す
xinput set-prop 13 'Coordinate Transformation Matrix' 1 0 0 0 1 0 0 0 1
xrandr -o normal
```

上記コマンド中`13`は各端末のデバイスidに書き換える。
デバイスidは、以下のように、`xinput`コマンドで確認可能。

```terminal
kinomi@pop-os:xinput

⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad              	id=13	[slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]
    ↳ Power Button                            	id=6	[slave  keyboard (3)]
    ↳ Video Bus                               	id=7	[slave  keyboard (3)]
    ↳ Power Button                            	id=8	[slave  keyboard (3)]
    ↳ Sleep Button                            	id=9	[slave  keyboard (3)]
    ↳ Topre Corporation HHKB Professional     	id=10	[slave  keyboard (3)]
    ↳ HD Webcam: HD Webcam                    	id=11	[slave  keyboard (3)]
    ↳ MSI WMI hotkeys                         	id=14	[slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard            	id=12	[slave  keyboard (3)]

```

## 任意の角度に回転
`1 0 0 0 1 0 0 0 1` 部分を書き換える
これは行列を表す
回転角度０の場合
| 1 0 0 |
| 0 1 0 |
| 0 0 1 |

反時計回りにθ回転の場合は、
| cosθ -sinθ 0 |
| sinθ cosθ 0 |
| 0 0 1 |
` cos -sin 0 sin cos 0 0 0 1`に書き換える

## 関連する数学
[アファイン変換(affine transformation)](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%95%E3%82%A3%E3%83%B3%E5%86%99%E5%83%8F)
プログラミングでよく見かけるhogeとは

プログラミング経験者なら一度は見たことあるであろう``hoge``について調べてみた。

```html:hoge
<html>
<head>
<title>HOGEHOGE</title>
</head>
<body>
<p>hogehoge</p>
</body>
```

#``hoge``とは？
``hoge``とは意味を持たないということを示す言葉でメタ構文変数と言われるものとのこと。

#なぜ``hoge``？
知り合いのエンジニアに聞いてみたところ、打ちやすいでしょ？と言われたので恐らくタイピング的に打ちやすく使われ始めたのではないかと思った。
仮説はいくつかあるらしく、調べてみたが1980年代頃から使われ出したくらいしか分からなかった。

#``hoge``の他にもメタ構文変数はあるの？
他にも``foo``,``bar``,``foobar``,``piyo``,``fuga``などがある。自分は聞いたことがないが、``hagehage``,``hogera``なんかもあるらしい。
正規表現キャプチャあれこれ

### 正規表現のキャプチャの利用例

#「@+数字」を抜き出したい

```java
String target = 'テスト@123テスト'

pattern myPattern = pattern.compile('@[0-9]');
matcher myMatcher = myPattern.matcher(target);

if (myMatcher.find()) {
    System.debug(myMatcher.group());
}
/** Log
 *
 * @123
 * /
```
#「@+数字」を抜き出したい(一致が複数あり)
上記のifの部分をwhileループに変更

```java
String target = 'テスト@123テスト@456'

pattern myPattern = pattern.compile('@[0-9]');
matcher myMatcher = myPattern.matcher(target);

Integer i = 1;
while (myMatcher.find()) {
    System.debug(String.valueOf(i) + '番目: ' + myMatcher.group());
    i++;
}
/** Log
 *
 * 1番目: @123
 * 2番目: @456
 * /
```
#「@+数字」の数字部分を抜き出したい
groupの引数を設定

```java
String target = 'テスト@123テスト456'

pattern myPattern = pattern.compile('@([0-9])');
matcher myMatcher = myPattern.matcher(target);

Integer i = 1;
while (myMatcher.find()) {
    System.debug(String.valueOf(i) + '番目: ' + myMatcher.group(1));
    i++;
}
/** Log
 *
 * 1番目: 123
 *
 * ※456は出力されない
 * /
```
#「@+数字+英語」の数字+英語と数字と英語部分をそれぞれ抜き出したい
上記の応用
groupの引数を諸々設定(引数なしと0の結果は同じ)


```java
String target = 'テスト@123ABCテスト@456'

pattern myPattern = pattern.compile('@(([0-9])([A-Z]))');
matcher myMatcher = myPattern.matcher(target);

Integer i = 1;
while (myMatcher.find()) {
    System.debug(String.valueOf(i) + '番目グループ空白該当 : ' + myMatcher.group());
    System.debug(String.valueOf(i) + '番目グループ0該当 : ' + myMatcher.group(0));
    System.debug(String.valueOf(i) + '番目グループ1該当 : ' + myMatcher.group(1));
    System.debug(String.valueOf(i) + '番目グループ2該当 : ' + myMatcher.group(2));
    System.debug(String.valueOf(i) + '番目グループ3該当 : ' + myMatcher.group(3));
    i++;
}
/** Log
 *
 * 1番目グループ空白該当 : @123ABC
 * 1番目グループ0該当    : @123ABC
 * 1番目グループ1該当    : 123ABC
 * 1番目グループ2該当    : 123
 * 1番目グループ3該当    : ABC
 *
 * @456については出力されない
 * /
```
Cloud Firestore でサーバーの現在時刻を保存する

# 概要

Firebase の Cloud Firestore でサーバーの現在時刻を保存する方法を調べたので、ご紹介します。

# Firestore でサーバーの現在時刻を保存するサンプルコード

結論としては、 `require("firebase-admin").firestore.FieldValue.serverTimestamp()` を利用すれば良いです。

以下、Node.js のサンプルコードです。

```js
const admin = require("firebase-admin");
const db = admin.firestore();
const FieldValue = admin.firestore.FieldValue;

let docRef = db.collection('objects').doc('some-id');

let updateTimestamp = docRef.update({
  timestamp: FieldValue.serverTimestamp()
});
```

以上、Cloud Firestore でサーバーの現在時刻を保存したい、現場からお送りしました。

# 参考情報

- [サーバーのタイムスタンプ - Cloud Firestore にデータを追加する  \|  Firebase](https://firebase.google.com/docs/firestore/manage-data/add-data?hl=ja#server_timestamp)
- [FieldValue \| JavaScript SDK  \|  Firebase](https://firebase.google.com/docs/reference/js/firebase.firestore.FieldValue)
.sort.uniq か、.uniq.sort か


配列をソートしてユニークするのに、`.uniq.sort` と `.sort.uniq` どっちが良いのか。

長いものには巻かれようと思ったものの、破壊的に実行すると、`.uniq!.sort!` は実行出来ないケースがある事が判明 `@2.7.1`

```ruby:test.rb
r = {
  's' => [5,1,3,53,2],
  't' => [5,3,4,4,3,2],
}
r.each_key{|k|
  #r[k].sort!.uniq!
  r[k].uniq!.sort!
  #  => ダメ
}
p r
```

```shell-session:
$ ruby test.rb
Traceback (most recent call last):
	2: from hoge2.rb:5:in `<main>'
	1: from hoge2.rb:5:in `each_key'
test.rb:7:in `block in <main>': undefined method `sort!' for nil:NilClass (NoMethodError)
```
`.sort!.uniq!` では実行出来る。


普通に、

```ruby:test2.rb
a = [5,3,4,4,3,2]
#a.sort!.uniq!
a.uniq!.sort!

p a
```

な場合はエラーになんない。

ベンチが遅かろうと、`.sort.uniq` の方を使うかな[^1]

[^1]: こっちの方が、シェルで馴染み深いし。
Time.strptime で、%j (年中の通算日)がアレ


他人様のコードをメンテする必要があって、コードを追ってると、`%j` な年月日を `UNIX time` に変換するのに、面倒な事やってた。

で、嫌気が差して、「`ruby` でも `strptime` あるだろ?」と適当に探すと、ビンゴ!!


## 問題発生

差し替える前に、テスト。

以下の様なコードを実行

```
$ ruby -e 'require "time" ; p Time.strptime("2003,070,12:21:51 JST", "%Y,%j,%H:%M:%S %z").to_i'
1041391311
# ↑ 2003/01/01 12:21:51 JST
```

問題発生。

え? `%j` 解釈してくれないの?

ググって見ても答えは得られず[^1]

[^1]: そもそも `%j` なんて使う事って特殊だし、、、

色々試して、、、

## 結論

古い `ruby` の `Time` クラス(モジュール?)の `.strptime` は、`%j` 解釈してくれないっぽい[^2]

検証では、`2.7.1p83` はOKだった[^3]

[^2]: で、コード差し替えに関しては、 `DateTime` 使うのも色々と問題があり、結局検証用に作った自作コードを埋め込む形に、、、 

[^3]: `2.6.3p62` でもOK。


## 検証
以下のコードを、`1.9.2p290`, `2.0.0p481`, `2.7.1p83` で、それぞれ実行

```ruby:test.rb
require 'date'
require 'time'

# コントロール用の自作関数
def manu(t)
  arr = t.split(/[,: ]/).map(&:to_i)
  Time.mktime(arr[0],1,1,arr[2],arr[3],arr[4]) + ( arr[1] - 1) * 24 * 60 * 60
end

str = "2003,070,12:21:51 JST"
# DateTime.strptime の結果
p DateTime.strptime(str, "%Y,%j,%H:%M:%S %z").strftime("%s").to_i
# 自作関数の結果
p ( manu str ).to_i
# Timme.strptime の結果
p Time.strptime(str, "%Y,%j,%H:%M:%S %z").to_i
```

`1.9.2` と、`2.0.0` では、`Time.strptime` は `%j` を解釈しない。`DateTime.strptime` は解釈してくれる。

```shell-session:1.9.2p290,2.0.0p481
$ ruby test.rb
1047352911
1047352911
1041391311  # <= 2003/01/01 12:21:51 JST
```

に対し、`2.7.1` は `Time.strptime` も解釈してくれてる。

```shell-session:2.7.1p83
$ ruby test.rb
1047352911
1047352911
1047352911
```

`ruby` 版の `delta` みたいなのがあれば、それ読めば一発なんだろうけど、そこまでの情熱は湧かない、、、
三項演算子で、複数変数への代入


10年ぶりくらいに `ruby` のコードに立ち向かわなくてはならなくなった

```shell-session:
$ ruby -e 'i, j = 1 ? [1,2]:[3,4] ; p i, j'
1
2
```

こんなので数時間悩んだのがアホみたい
Ionicでcontenteditableがiphoneのブラウザで動作しないを解消

Ionicでcontenteditableしたらiphoneで文字入力できなかったのでメモ

###styleのuser-selectで解決

``` html
<div appAutofocus contenteditable="true" style="user-select: text; -webkit-user-select:text;"></div>
```

###参考サイト
bug: contenteditable not selectable or editable in iOS #18368
https://github.com/ionic-team/ionic/issues/18368
【Rails】resourceとresourcesは別物ですね

題の通りです。
私はタイポに気づかず1時間悩みました。

#環境
Rails v5.2.4.3
Ruby v2.5.1

#やりたかったこと
index.html.erb内にlistsコントローラーのeditにつながるリンクを作りたかったです。

```list_controller.rb
def index
	@lists = List.order("id")
end
```

```index.html.erb
<% @lists.each do |list| %>
	<%= link_to "編集", [:edit, list] %>
<% end %>
```

```routes.rb
resource :lists
```

ここまで授業を振り返りながらやっていたつもりだったから間違えていると思っていなかった。
だがしかしエラーが出る。

```
undefined method `edit_list_path' for #<#<Class:hoge>:hogehoge>
```

メソッドがないと。

ターミナルの方でルーティングを出してみました。

```
$ rails routes
（省略）
edit_lists GET    /lists/edit(.:format)
（省略）
```

はて。
ここで私は`/lists/:id/edit`と表示される気満々だった。
そりゃメソッドがないわけだ。
調べてたらルーティングで`resource`としていると`:id`とならないことがわかり。

```routes.rb
resources :lists
```

`resource`を`resources`にしたら問題なく動作しました。

ルーティングも

```
$ rails routes
（省略）
edit_lists GET    /lists/:id/edit(.:format)
（省略）
```

となったので一安心です。

#resourcesとresource
ここからはついでに調べたので自分用のメモ書きです。

`resources` は今回のように、ユーザから見てたくさんある対象に対して使うと。
例えば今回ではlistは複数あるものであり、idという番号が振られていて、そのidのlistを編集するためのルーティングが欲しかった。
なので `resources`。

`resource` は、ユーザから見て一つしかないもの。マイページなどが相当する。
一つしかないからidで絞る必要がないというわけですね。

勉強になりました。

#参考にさせていただいたサイト
[Railsのルーティング | Railsガイド](https://railsguides.jp/routing.html)
[Railsのresourcesとresourceついて | Qiita](https://qiita.com/Atsushi_/items/bb22ce67d14ba1abafc5)
UpdraftPlusでバックアップを取り、復元する方法【WordPress】

WordPressのプラグイン「UpdraftPlus」の使い方を簡単に紹介します。

##手動でバックアップを取る方法
ダッシュボードの上の「UpdraftPlus」を押して「バックアップ/復元」を選びます。
![202007012137.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643170/e0c56497-ec8f-7abc-87c1-eff967888591.png)
「今すぐバックアップ」を選びます。
![202007012139.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643170/3fb191b8-c72e-a8a1-676d-24fb218e4b42.png)
ポップアップが出てくるので、「今すぐバックアップ」を選びます。
![202007012140.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643170/1e0d83ad-e495-5a2e-7d39-0a9cddcfe82b.png)
下記の画面が出てきたら、バックアップは完了です。
![202007012141.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643170/62a96a14-c301-5310-82d0-dd3428786c1f.png)

##外部に保存したバックアップから復元する方法
外部に保存したバックアップをアップロードします。ドロップできるので便利です。
![202007012228.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643170/546d82f8-fa05-39d0-b726-94ab1e193940.png)
すると下記のような画面が出るので、先程アップロードしたものを選び、「復元」を押します。
![202007012234.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643170/692e3c3f-6394-ddaf-7401-50ffc1e2d391.png)
復元したい項目を選び、「次へ」押します。
![202007012236.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643170/25886407-6890-b010-c3b6-158b6a1bd3fc.png)
復元が完了すると、下記の画面に変わります。
![202007012238.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643170/a094ff05-4414-41b9-ebb6-2cce59224662.png)

##定期的に外部にバックアップを自動的に保存する
設定タブを開くと、定期的に外部で保存する設定を行うことができます。
![202007012245.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643170/8db98342-7654-4da5-9ccb-9580a511ebbf.png)
私の場合は週に1度バックアップを取り、10週間分保管する設定にしてあります。バックアップ先はGoogle Driveを選んでいます。

以上簡単ですが、WordPressのプラグイン「UpdraftPlus」を利用してバックアップを取り、復元する方法をご紹介しました。
クラウドにおける3つのサービス

どうも何回も間違える問題。
そもそもクラウドには仕組みとして3つのサービスがある。それが以下の3つである。

####クラウドにおける3つのサービス

![k35833.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421663/8553b9bb-bc53-3151-e388-459f094323d2.jpeg)


##SaaS
・読み方：サース（サービスとしてのソフトウェア）
・例）Gmail

・インターネット経由でサービスとして提供・利用する形態
・データをインターネット上に保存することができる
・PC、スマートフォン、タブレットなど端末を選ばずにデータにアクセスできる
・複数の人間が同一データを共有し、更に編集もできる


##PaaS
・読み方：パース（サービスとしてのプラットフォーム）
・例）Azure

・アプリケーションソフトが稼動するためのハードウェアやOSなどのプラットフォーム一式を、インターネット上のサービスとして提供する形態
・プラットフォームを大規模なデータセンターなどに用意して外部に開放し、主に企業などのユーザーが、その上にサービスを開発するもの
・開発者は、あるシステム設計に沿った方法でアプリケーションを開発できるので、コストを抑えてかつ早くシステム開発をおこなうことができる


##IaaS
・読み方：イアース（サービスとしてのインフラ）
・例）Amazon Elastic Compute Cloud (EC2)

・情報システムの稼動に必要な仮想サーバをはじめとした機材やネットワークなどのインフラを、インターネット上のサービスとして提供する形態
・サーバを利用する際に必要なハードウェアのスペックやOSを、ユーザーが自分で自由に選定して、ネットワーク越しに利用することが可能


####まとめ
イアースのイメージがつきにくい
パースといアースの違いがわかりにくい→OSを触れるかどうか→触れるのがIaaS

####参考資料
https://data.wingarc.com/saas-paas-iaas-11087
https://www.cloud-ace.jp/column/detail01/
psqlコマンド一覧

## psqlコマンド

#### psqlを実行してpostgreSQLの対話モードに入る
PostgreSQLのデフォルトのルートユーザーは「postgres」です。
このため、ユーザーを指定する「-U」オプションで「postgres」を指定して「psql」コマンドを実行します。
``` terminal:ターミナルからpostgresSQL対話モードに入る
$ psql -U postgres
```

##### PostgreSQLを起動した状態で、次のコマンドで接続
```terminal:
$ psql [データベース名] #dbに接続

postgres=>\q #終了
```

##### 操作
``` :postgresql
$ \l　# データベース一覧を表示
$ \d  # テーブル一覧を表示
$ \du # ユーザー一覧を表示
$ \q # psqlのメタコマンド終了
```


``` terminal:データベース一覧を表示
$ psql -l
```

##### DBユーザ操作
``` terminal:ユーザー作成・削除
$ createuser (ユーザー名)
$ dropuser (ユーザー名)
```

##### テーブル操作
``` terminal:データベース作成・削除
$ createdb (データベース名)
$ dropdb (データベース名)
```

## postgreSQLの特性
ゼロパディング対応
> http://senoway.hatenablog.com/entry/2014/03/18/161308

PHPで123を000123のように６桁の0詰めを作るなら、例えば、
sprintf('%06d',123)のようにできるが、そもそもDBから取得する際にSQL内で、TO_CHAR(123,'FM000000')とすれば 000123が取得できます。

123の部分は適宜カラム名等に置き換えてください。
【2日目】Clamp関数をホームページ制作に使った件

**clamp関数は、編集者草案の段階のCSSです**
◎編集者草案とは？
clamp関数のMDNから「CSS Values and Units Module Level 4」を自分なりに確認したところ、
以下翻訳にかけて抜粋
>編集者の下書きの公開コピー
>いつでも変更される可能性があります。

らしいので使用するのは注意が必要そうです。

今回はあくまで社内向けサイト制作だったのでclampを使ってみました。

# 使い方
font-size、width、margin/paddingなどで使うことができます。

`h1 {font-size:clamp(14px,0.83vw,20px)}`
**デザインは1920px、h1は16pxで作成されているケース：**
1つめの数値が最小値、2つめが基準値、3つめが最大値です。
基本→画面幅に対して0.83vwの大きさで表示する。
画面幅を縮小した時→14pxを下回る場合は14pxで固定。
画面幅を広げた時→その逆で20pxで固定する仕組みです。

たった一行で最大値/最小値を設定できるのは便利ですよね！


# 対応ブラウザ
下記はCalmp関数が、実際に動くことを確認しています。
Mac(Safari)
Windows(firefox/Edge(chromium)/Chrome)※全て最新
※2020年7月段階の最新version

Can I use...
https://caniuse.com/#feat=css-math-functions


# 似た関数 max関数とmin関数
結論からいうとSCSSでこの2つの関数は使えませんでした。。
` is not a number for max ` というエラーが出てコンパイルができないのです。
なので私の場合は、clamp関数で最大値もしくは最小値を適当に設定して対応しました。

また、もちろんIEではclamp関数は動かないので
使用する場合は、

```
    padding-left: 6.25%;
    padding-right: 6.25%;
    padding-left: clamp(80px, 6.25vw, 120px);
    padding-right: clamp(80px, 6.25vw, 120px);
```
というようにフォールバックしておけばIEでは6.25%を読み込んでくれます。

まだまだ調べきれていないことがありそうですが
ひとまずこんなのがあるんだなとだけ覚えとこうと思います。
Amazon Transcribeでテレテキストのようなものをやってみる

テレテキストと言われても何のことかわからんって方はとりあえずこの動画を見てみてほしい。
[![ビデオが開けなかった場合に表示されるテキスト](http://img.youtube.com/vi/XmAFt1bVApY/0.jpg)](http://www.youtube.com/watch?v=XmAFt1bVApY)

こんな感じに動画にほぼ同期して文字起こしが表示されると、ネイティブ並みのヒアリング能力がなくてもスピーチの把握がやりやすい。CNNとかで時々やってたりする。Youtubeだと自動文字起こしをやってくれるのだが、それ以外の方法で動画が配信されているとかなりしんどい。最近やってる海外のバーチャルイベントとか。

そこで[Amazon Transcribeというサービス](https://aws.amazon.com/jp/transcribe/)で似たようなことをやってみた。

# Transcribeで文字起こしを取得する

まずAmazon Transcribeに与える音声データをS3にアップロードする。Transcribeにかけると文字起こしのデータが得られる。抜粋するとこんな感じのJSONになっている。

```json:transcribed.json
{
    "jobName": "aaabbbccc",
    "accountId": "123456789012",
    "isRedacted": true,
    "results": {
        "transcripts": [
            {
                "transcript": "XXXXXXXXXXXXXXXXXXXX"
            }
        ],
        "items": [
            {
                "start_time": "193.92",
                "end_time": "199.55",
                "alternatives": [
                    {
                        "confidence": "0.2774",
                        "content": "thing"
                    }
                ],
                "type": "pronunciation"
            },
            (中略)
        ]
    },
    "status": "COMPLETED"
}
```

itemsのところに発音した時間と、発音内容、信頼度が出ている。あとはこれを時間に従って表示すればいい。

# テレテキストっぽく表示する

こんな感じにpythonスクリプトを書く。特にコメントは書いていないが短いので何をやっているかはわかると思う。

```python:teletext.py
import sys
import json
from datetime import datetime, timedelta

jsonobj = None

with open(sys.argv[1]) as fh:
    try:
        jsonobj = json.load(fh)
    except:
        raise

jsonobj = jsonobj["results"]["items"]

idx = int(0)
ntime = float(0.0)
jsonlength = len(jsonobj)

n1 = datetime.now()
while True:
    if "start_time" in jsonobj[idx]:
        if float(jsonobj[idx]["start_time"]) < ntime:
            print(jsonobj[idx]["alternatives"][0]["content"], end=' ')
            idx += 1
            if idx >= jsonlength:
                break
    else:
        print(jsonobj[idx]["alternatives"][0]["content"])
        idx += 1
        if idx >= jsonlength:
            break
    d = datetime.now() - n1
    ntime = float(d.total_seconds())
```

実行はこんな感じにする。

```shell
$ python3 -u teletext.py transcribed.json
```

# さいごに

30分で作ったにしては結構役立つなあ、と

もう少し丁寧にしたやつをGitHubに上げといた https://github.com/mkiuchi/transcribe-teletext
C言語で0文字でセグフォらせる（ただし外道）

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">セグフォコードゴルフってジャンルでもあるんでしょうか()<br><br>ところでC言語の場合で<br><br>main(){int*a;a[1]=1;}<br><br>より短くってできますか？<br><br>pythonを2行でセグフォらせる <a href="https://t.co/3D2HTjfL72">https://t.co/3D2HTjfL72</a> <a href="https://twitter.com/hashtag/Qiita?src=hash&amp;ref_src=twsrc%5Etfw">#Qiita</a></p>&mdash; namnium (@namnium_01) <a href="https://twitter.com/namnium_01/status/1277044613862182913?ref_src=twsrc%5Etfw">June 28, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

から始まったセグフォコードゴルフ。やってみよー

参考リンク：

[pythonを三行でセグフォらせる](https://qiita.com/autotaker1984/items/a8ba955acdc81c907b3d)

[pythonを2行でセグフォらせる](https://qiita.com/sh1ma/items/a6dd1bcca0d9725e7e67)

[C言語で16文字でセグフォらせる](https://qiita.com/yasuo-ozu/items/ddc5d3e8e4a97eaa470c)


# 外道な回答

```c:a.c
```

以上です！！やったー！！0文字だー！！

やったーじゃない、これにコンパイラオプション指定してごにょごにょしてやる。

```Makefile
[kmtr@localhost ~]$ cat Makefile
all: a.out

a.out : a.c Makefile
        LANG=C gcc a.c -o a.out -nostdlib -Wl,--build-id=none

clean :
        rm a.out
```

コンパイルと実行時のログ

```bash
[kmtr@localhost ~]$ cat a.c
[kmtr@localhost ~]$ make a.out
LANG=C gcc a.c -o a.out -nostdlib -Wl,--build-id=none
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000400078
[kmtr@localhost ~]$ file a.out
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
[kmtr@localhost ~]$ ./a.out
Segmentation fault (コアダンプ)
```

# 解説というほどでない解説

## -nostdlib
https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

リンク時に、標準スタートアップや標準ライブラリを使いません。

## --build-id=none
気分でつけているだけですが、コンパイル時のsessionに紐づいたハッシュを生成しなくする（なくてもよい）

以上です。いや、何も書くことがない……
AWS 認定ソリューションアーキテクトアソシエイト(SAA-C02)を取得した際のメモ

# はじめに

2020年6月から勉強を始めて、同年6月30日にAWS Solution Architect Associate (SAA-C02)を取得することができたので、勉強した内容をメモします。

# 前提

仕事で多少AWSを使ったことがある程度（VPC作成〜パブリック/プライベートサブネット作成〜EC2起動〜SSH接続を2回程度やったことがある）。
RDSやKinesisについてもちょっとだけ知っていましたが、細かいオプションや設定はしたことなし。
テストで重要なSQSやCloud Frontなどは全く知りませんでした。
GCPやAzureについても上記と同様の知識レベルです。

# 勉強で使ったもの


- 書籍：[「AWS認定資格試験テキスト AWS認定ソリューションアーキテクト-アソシエイト」]( https://www.amazon.co.jp/dp/B07R1H87Y1/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)


- オンライン学習：[Udemy 【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集](https://www.udemy.com/course/aws-knan/)

- 公式の模擬試験

- AWSの各種機能のドキュメントやwebページ


書籍は自宅の近くの本屋であったものを購入しました。
あまりAWSのサービス全体について分かっていなかったので、体系立てて学びたいと思って購入しました。

上記の書籍だけだと本番を想定した問題に慣れるのが難しいと思い、申し込んで活用しました。
スマホからでも問題を解いて勉強できるので、非常に便利でした。

書籍やUdemyの解説だけでは理解しにくい部分の確認や、最新情報の確認のためにAWSのWebページも参照しました。
例えば、S3のドキュメントに記載されている、[オブジェクトクラス](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/storage-class-intro.html)は非常に分かりやすく、参考になりました。

# 勉強の時間など

- 1日目~14日目：1日1時間程度：書籍で基礎を勉強しました。全部で14章で構成されているので、1日1章ずつ進めていったイメージです。

- 15日目〜27日目：1日1時間程度：Udemyで問題を解きました。間違えた内容についてノートにポイントなどを整理しつつ進めました。模擬試験→答え合わせ→ポイント整理→同じ問題を再試験というループを全6回分回しました。

- 28日目：公式の模擬試験で最終確認しました。


# 試験について

自宅からの受験で申し込みしたのですが、試験2日前に急にキャンセルされ、後日メールで受験のソフトウェアトラブルのためキャンセルしたとのメールが来ました。
もともと希望していた日時で受けられなかったため、仕方なくテストセンターで受験しました。
試験当日は顔写真付きの身分証明書が2種類必要なので、要注意。

[SAA試験の公式情報](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)にも記載がありますが、65問に対して130分という時間設定になっています。
実際には30分程度時間が余りました。

# 結果、感想など

750点程度取ることができ、合格でした。
ギリギリで危なかった...

Udemyや公式の模擬試験では初回はどれも50%程度しか正答できませんでしたが、
できないところをひたすらつぶして復習していきました。

書籍だけでは正直なところ合格は厳しいかと思いました。
書籍の弱点でもありますが、情報が古い部分があったりするので、Udemyの問題集は役に立ちました。
もしかしたら同じUdemyの[オンラインコース](https://www.udemy.com/course/aws-associate/)も受けているともう少し余裕を持って合格できたかもしれません。
ご参考までに。
WordPressで作ったサイトが「偽のサイト」とされたら、wp-embedを無効にする

自分で作ったサイトが、突然 WordPressに次のような「偽のサイトにアクセスしようとしています」という判定がされてしまいました。

![original.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977/413598b4-a761-e677-ab20-020465457c93.jpeg)

通常は、フィッシングサイトなどから利用者を守るための機能ですが、自分で作成した通常のサイトでこの判定がされてしまい、非常に焦りました。

落ち着いて、プラグインをすべて無効にしたり、空のテーマで確認をしながら検証をしていくと、原因が分かりました。

## wp-embed.min.jsでエラーに

検証を進めると、`wp_footer()`でこの警告が出ることが分かりました。そのため、フッターで出力している内容を確認していくと、どうやら次の記述でこの警告が表示されていたようです。

```html

<script type='text/javascript' src='https://example.com/wp-includes/js/wp-embed.min.js?ver=5.4.2'></script>
```

そのため、これを削除するために functions.phpに以下を記述しました。

```php
add_action( 'wp_footer', function() {
	wp_deregister_script( 'wp-embed' );
});
```

これで警告が消えました。他にも WordPressのサイトは構築しているものの、ある1サイトでだけこの警告が表示されたので非常に焦りました。本当にこの対処で良いのか、まだ分かっていませんが、ひとまずの対処法として共有いたします。
SQL文  順序メモ

SELECT 構文を書く際の**WHERE**句とか**GROUP**句とか
たまに順序がわからなくなるので慣れるまでここにメモする

## SELECT構文

1. SELECT   : カラムの指定

2. FROM　    : テーブルの指定

3.  JOIN  : 結合処理

4. WHERE     :絞り込み条件の指定

5. GROUP BY  : グループ化条件の指定

6. HAVING    :グループ化した後のにさらに条件を絞る

7. ORDER BY　:並び替え条件を指定

8. LIMIT  　 :行数の指定


## 例

例えばこんなテーブルがあったとして

| users |
| :--: |
|id|
|email|
|last_name|
|first_name|
|birthday|
|prefecture_id|

usersテーブルから**（from）**

苗字が中を含む **(where, like)**

ユーザーの数を

都道府県別に(idが20以上のみ)　**（group by ,having）** 

5件 **(limit)**

表示してください  **(select)**


をSQLで表すと

```SQL

select count(*),prefecture_id 
from users 
where last_name 
like '%中%'
group by prefecture_id 
having prefecture_id >= 20  
limit 5; 

```

てな感じに、、

都道府県を一部限定した意味は特にありません。