OmniAICreator/Qiita-1.07M huggingface dataset:
コミットメッセージにブランチ名を自動入力する

GithubのISSUE番号や、解決したいチケットの番号をブランチ名にすることがあるかと思います。
その番号を各コミットメッセージに入れておけば、コミットメッセージから関連ISSUEやチケットをたどることが簡単になるので、コミットの意図がわかりやすくなって便利になります。
ただ、手動でコミットメッセージに番号を打つのは面倒なので、git hooksを設定して、自動でコミットメッセージに入力されるようにします。

# Templateを設定する
まずはコミットメッセージのテンプレートを設定します。
個人的には、emoji prefixが確認しやすいテンプレートを使いたいので、[Goodpatchのテンプレート](https://goodpatch.com/blog/beautiful-commits-with-emojis/)を参考にして、以下のようなテンプレートを使用しています。

```sh
# 置く場所はご自由に
$ vi ~/.commit_template
```

```~/.commit_template
{branch}

# ==== Emojis ====
# 🎉  :tada: 盛大に祝うべき大きな機能追加
# 🎨  :art: 見た目の追加・修正
# 🔧  :wrench: 機能の修正
# ♻   :recycle: リファクタリング
# 🚿  :shower: 不要な機能・使われなくなった機能の削除
# 📝  :pencil: ドキュメントやコメントの追加・修正
# 🚚  :truck: ファイルの移動
# 🤖  :robot: テストの追加・修正
# 🆙  :up: 依存パッケージなどのアップデート
# 👮  :cop: セキュリティ関連の改善、Warningの解消

```

このテンプレートを任意のプロジェクトのgitテンプレートに設定します。

```sh
# 任意のプロジェクトで
$ git config commit.template ~/.commit_template
```

# Hooksを設定する
次に、.commit_templateに記載した`{branch}`にブランチ名が入るようにhooksを設定します。

```sh
# 任意のプロジェクトで
$ vi .git/hooks/prepare-commit-msg
```

```sh
#!/bin/sh
## prepare-commit-msg
  
branch=$(git branch | grep "*" | awk '{print $2}' | sed -e 's/[\/_]/ /g')
perl -i.bak -ne "s/{branch}/$branch/g; print" "$1"
```

編集が完了したら、権限を付与して適用します。

```sh
# 任意のプロジェクトで
$ chmod +x .git/hooks/prepare-commit-msg
$ git init
```

これで、ブランチ名が入った状態で`.commit-template`が立ち上がります。
Mysql を起動しようとすると「The server quit without updating PID file」

`mysql.server start`でMysqlを起動しようとすると以下のエラーが

```
The server quit without updating PID file
```

以下のログを見てみる

`/usr/local/var/mysql/***.local.err`


すると以下の内容が

```
dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
  Referenced from: /usr/local/opt/mysql@5.6/bin/mysqld
  Reason: image not found
```
この後、opensslを再インストールしたり、バージョンを変えてみたがエラー変わらず
参考：https://qiita.com/hirotech/items/d16988b79f7673fa2d31

brew update && brew upgradeしても変わらず
参考：https://qiita.com/kota-es/items/98ae6ee84fc59aaae2ea



`brew info mysql`でmysqlのinstallに問題がなかったか確認↓

```
mysql: stable 8.0.19 (bottled)
Open source relational database management system
https://dev.mysql.com/doc/refman/8.0/en/
Conflicts with:
  mariadb (because mysql, mariadb, and percona install the same binaries.)
  percona-server (because mysql, mariadb, and percona install the same binaries.)
Not installed
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/mysql.rb
```

Conflictが起きている。
以下を参考にmysql関連のものを削除&アンインストールして、再びインストール
（データが消えるので注意）
参考：https://qiita.com/harukikaneko/items/f0b70fada8216c63e6d6


`mysql.server start`でMysqlを起動すると成功

```
$ mysql.server start
Starting MySQL
 SUCCESS! 
$ 200605 11:08:11 mysqld_safe A mysqld process already exists
```
海外サイトを視野に入れれば問題解決の速度が上がる

## この記事で言いたいこと
タイトルの通り。最初はタスクスケジューラの設定コマンドではまった話を書こうと思ってたけど、書いていくうちに解決過程のほうがおもしろいなと思って急遽変更。

## スケジュール登録の省力化
ちょっと訳があって同じタスクスケジューラを複数の端末で登録する必要が出てきた。1台に登録するだけならGUIからぽちぽちやればいいんだけど複数の端末でGUIぽちぽちするのはダルいし登録ミスも絶対発生しそう…。ということでコマンドを使ってスケジューラの登録を省力化することにした


## 要件
1. 実行するタスクはbatファイルのキック
2. 5分に1回実行
3. <font color="Red">ログアウト時にも有効なスケジューラにする</font>

この要件をもとに基本的には[Microsoft公式のドキュメント](https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/schtasks#BKMK_create")を見ながらポチポチやっていく

## ハマった箇所
ドキュメントがめっちゃ親切に書いてあるし楽勝だなと高をくくって、3分で書いたコマンドが以下

```
schtasks /create /tn [スケジュール名] /tr [バッチファイルのパス] /f  /sc minute /mo 5
```

だけど、ログアウトしてるときにスケジューラが動かない…
”タスクスケジューラ ログアウト 動かない”とかでググってたんだけど全然ヒットしなくてしばらくインターネットをさまようことになる…（ググるセンスがないだけ）

## 助けを求めた先の海外サイト
しばらく日本語でググっていたけどなかなか良いページが見つからず…こうなったら海外のサイトに助けを求めようと思い立った。でも、そもそもなんという単語で調べればいいんだ…タスクスケジューラは英語でどういう表記なのかもいワカラナイ…

苦肉の末思いついたやり方…
"タスクスケジューラ 英語"でGoogle画像検索
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646573/dc86c36f-d448-fa91-a21f-79a045049bc8.png)
なるほど…この部分は"run whether user is logged on or not"と表現されるんだな…
次は"taskscheduler run whether command"でググる。

そしたら一瞬で[こちら](https://github.com/bnosac/taskscheduleR/issues/44)にたどりついた
>The default setting is that the task will only run when user is logged in.
>Is there a way to change this setting to allow tasks to run whether user is logged on or not?

ふんふん。。何やら同じ問題に当たってるっぽいな…

>It worked when I passed the user and password:
>schtasks_extra = "/ru username /rp password

おおお、…/ru /rp オプションをつければうまくいく…!?!?

## 出来上がったコマンド
最終的に出来上がったコマンドは以下、無事にログアウト時にも有効なスケジューラを登録することができた

```
schtasks /create /tn [スケジュール名] /tr [バッチファイルのパス] /f  /sc minute /mo 5 /ru %userdomain%\%username% /rp
```

## 学んだこと
~~タスクスケジューラの登録方法~~
何かを調べるときは、海外サイトも視野に入れていれば一瞬で解決することがある。
【Day79】積み上げ日記

##学習内容
■ストップウォッチ（続き）
■タイピングゲーム
■電卓アプリ
■this

##学習ポイント　
■keydown
■this

##参考記事
■ストップウォッチの作成
https://techacademy.jp/magazine/20949

■部分文字列の取得
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substring
【Rails】Axlsxを利用してExcelファイルを書き出すと「一部の内容に問題が見つかりました」と出てしまう問題

# 詳細
[AXlsx](https://github.com/randym/axlsx)というgemを利用してExcelファイルを生成してみたところ、
Excelアプリでそのファイルを開こうとすると、
`'XXX.xlsx' の一部の内容に問題が見つかりました。可能な限り内容を回復しますか? ブックの発行元が信頼できる場合は、[はい] をクリックしてください。`
というエラーが発生してしまった
<img width="422" alt="スクリーンショット 2020-06-05 10.47.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63597/9b94ea62-78e8-71da-2c9e-cd3be489443c.png">


`はい` を押すと、無事開けるのだが、シート名に `回復済み_XXX` というプレフィックスがついたシート名になってしまう
<img width="250" alt="スクリーンショット 2020-06-05 10.50.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63597/41ef6fad-bc95-438b-f3b2-fd807fde91db.png">

毎回このシート名を直すのは面倒なのでどうにか対処したい

# 対処方法
シート名を空文字にしていたのが問題だった

**before**

```ruby:qiita.rb
Axlsx::Package.new do |packge|
    packge.workbook.add_worksheet(name: '') do |sheet|
        sheet.add_row ['debug']
    end
    packge.serialize('debug.xlsx')
end
```

**after**

```ruby:qiita.rb
Axlsx::Package.new do |packge|
    packge.workbook.add_worksheet(name: 'Sheet1') do |sheet|
        sheet.add_row ['debug']
    end
    packge.serialize('debug.xlsx')
end
```

Excelファイルのエラー内容をみても原因が特定できないような内容だったのでちょっと詰まった
もしかするとAxlsx以外の方法で生成した場合でも起こり得るものかもしれない
独自ルール:多人数開発のためのGitLab・タグ・ブランチ

【[自分とこの環境下におけるGit & GitLabレクチャー](https://qiita.com/NeK/private/dee76f411cf2488b6873)】

研究室内でのプロジェクトの開発や共有を行いやすいように決めた独自ルールについて説明する．
ここでは多人数開発のためのタグおよびブランチの使い方ルールについての説明となる．
タグ・ブランチについては[A successful Git branching model](https://nvie.com/posts/a-successful-git-branching-model/)を参考にしている．
なおGitLabを前提にしたプロジェクトの在り方については[独自ルール:多人数開発のためのグループプロジェクトについて](https://qiita.com/NeK/items/2c4a8a7086c85d6461c0)を参考のこと．

# ブランチのルール
意識せず使用する場合，ブランチはmainとなっている．しかしmainブランチは重要であり必ずいつでも動作するものとしたいのでmainブランチを直接みんなで操作するのを避けたい．そのため，以下のようにする．

* ブランチを三つの役割(メインブランチ:main，開発用ブランチ，修正用ブランチ)に分ける．
* 開発用ブランチ，修正用ブランチで実際の編集を行い，動作確認を行う．
* 動作が確認できた上で，mainブランチにmergeする．

グループプロジェクトはもちろん，慣れるためにも個人プロジェクトでも上記ルールを適用すること．

## ブランチ詳細

<dl>
<dt>メインブランチ:main</dt>
<dd>プロジェクトを作成する側だけでなく，プロジェクトの成果を単純に利用する人もアクセスするブランチ．よって<font color="Red">必ず動作している状態にしておくこと</font>が重要．</dd>
<dt>開発用ブランチ:develop-(ブランチ作成者名)-(機能名称や通し番号)</dt>
<dd>新しい機能を追加したりロジックを変える時用のブランチ．<br>
例1:develop-ken-add_sumfunc<br>
例2:develop-ken-001
</dd>
<dt>修正用ブランチブランチ:hotfix-(ブランチ作成者名)-(GitLabのissue番号や修正内容)</dt>
<dd>バグ修正のためのブランチ．<br>
GitLabのissue番号:一般的にバクなどをGitLabで報告すると"issue10"など番号が付与される．これを使用する．<br>
例1:hotfix-ken-issue10<br>
例2:hotfix-ken-pointer-error
</dd>
</dl>

各ブランチの役割を名確認し，細かくきちんと分ける．

* 大きな開発用ブランチを作成しない．
    * 細かく開発内容を分け，細かくブランチを分ける．大きな開発用ブランチは完成せず，mainにmergeされず，利用されない．
* 大きな修正用ブランチを作成しない．
    * 同上
* 開発用ブランチと修正用ブランチを混ぜない．
    * 開発途中にバグを発見することはよくある．この時，その開発用ブランチにてバグ修正しない．mainから新しく修正用ブランチを作成し，そちらで修正が終わったらmainおよび開発用ブランチに反映させる．詳しくは[Git book 3.2](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%A8%E3%83%9E%E3%83%BC%E3%82%B8%E3%81%AE%E5%9F%BA%E6%9C%AC)を参照のこと．

# タグのルール
タグは基本的にメインブランチに付与する．他のブランチは作成者に任せる．

## タグ名:バージョン番号
タグは3桁ピリオド区切りのバージョン番号とする．

* α.β.γ
    * α
        * メジャーバージョン
            * <font color="Red">大きい仕様変更</font>が生じたら+1．特に下位互換がなくなったら+1しコメントにも詳細を残すこと．
    * β
        * マイナーバージョン
            * 機能追加など<font color="Red">内容の拡張</font>が起きたら+1．
    * γ
        * リビジョン
            * バグ修正など<font color="Red">本質的な変更のない修正</font>が起きたら+1．
* 例
    * 1.0.0

開発開始時は0.1.0あたりから開始し，外部公開できるレベル(他人に使ってもらえるレベル)になったら1.0.0くらいが目安．
郵便番号検索で住所自動入力ZipcloudAPIを利用

# 郵便番号検索で住所自動入力ZipcloudAPIを利用

## 目的
管理画面で郵便番号を入力すると該当する住所が自動でセットされる処理を実装する

画面イメージ：
<img width="670" alt="スクリーンショット 2020-06-05 9.32.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274686/b1c349c2-5ca8-ebfe-b69f-25ffca45dd04.png">

## Laravelコード

```
  {{ Form::text(zip_code, array('id' => zip_code, 'onchange' => 'javascript:getAddName(this.value)')) }}
  {{ Form::select(addr_state_id, $option->getOption('state'), array('id' => addr_state_id))}}
   {{ Form::text(addr_city, array('id' => addr_city)) }}
```

## 上手く行かなかったJSコード
市区町村は下記で上手く行きましたが、
document.getElementById("addr_city").value = _addStateCity;

セレクトボックスの設定が下記でいけるはずが上手くいかなかった
document.getElementById("addr_state_id").selectedIndex = _addStateId;

## 原因
下記のように表示と値の部分が分かれていたのが原因のようだった
（内部ではinputを使っている）
```
input type="text" class="select-dropdown" readonly="true" data-activates="select-options-6cdbf968-4234-b326-ae12-5e7b5ccb6f56" value="神奈川県">

select id="addr_state_id" class="form-control initialized" name="addr_state_id">
option value="14" selected="selected">神奈川県</option>
```

## 解決

値の部分の書換え
```
var _stateId = document.getElementById("addr_state_id").value;
document.getElementById('addr_state_id').options[_addStateIdBefore].selected = false;
document.getElementById('addr_state_id').options[_addStateIdAfter].selected = true;
```
表示の部分の書換え
```
document.getElementById("state").getElementsByTagName("input").item(0).value = _addStateName;
```

## jsコード

```
        var getAddName = function( $addNum ){
            var _zipcloudAPI = document.body.appendChild(document.createElement("script"));
            _zipcloudAPI.src = "https://zipcloud.ibsnet.co.jp/api/search?zipcode=" + $addNum + "&callback=getAddNameByZipcloudAPI";
            document.body.removeChild(_zipcloudAPI);
        };
        var getAddNameByZipcloudAPI = function( $getAdd ){
            var _stateId  = "";
            var _addStateId  = "";
            var _addStateCity  = "";
            var _addStateName  = "";

            if($getAdd.status == 200){
                _addStateId += $getAdd.results[0].prefcode; // 都道府県ID
                _addStateName += $getAdd.results[0].address1; // 都道府県名
                _addStateCity += $getAdd.results[0].address2; // 市町村名
                _addStateTown += $getAdd.results[0].address3; // 町域名
            }

            var _stateId = document.getElementById("addr_state_id").value;
            document.getElementById("state").getElementsByTagName("input").item(0).value = _addStateName;
            document.getElementById('addr_state_id').options[_stateId].selected = false;
            document.getElementById('addr_state_id').options[_addStateId].selected = true;
            document.getElementById("addr_city").value = _addStateCity;
        };

```

## ZipcloudAPI 取得URLはhttpsで取得するように
http://zipcloud.ibsnet.co.jp/api/search?zipcode=
上記で開発環境では問題なく取得できたが、本番でブロックされてしまったので、下記に書き直して問題なく取得
https://zipcloud.ibsnet.co.jp/api/search?zipcode=
mutagenでmp3とflacの埋め込み画像を表示

**Python 3.7.3** で動作確認

```python
import mutagen
from io import BytesIO
from PIL import Image

# ファイル名は適宜変更してください
file = r"example.mp3"
# ファイル読み込み
audio = mutagen.File(file)

# 画像のリストを取得
if 'audio/mp3' in audio.mime:
    images = [audio[i] for i in audio if "APIC" in i]
elif 'audio/flac' in audio.mime:
    images = audio.pictures

for imgb in images:
    # 画像を表示用に変換
    img = Image.open(BytesIO(imgb.data))
    img.show()
```

検索しても画像を新たに埋め込む記事ばかりで、埋め込み画像を表示する記事が見つけられなかったから書いてみました。

**"APIC" == i** ではなく **"APIC" in i** としたのは、
Mp3tagで埋め込んだ画像のキーが **"APIC:"** となっていたから。

テキトーに書いたから最適なコードではないかも。
[技術]SQLとは


##SQLとは
Structured Query Languageの略で、リレーショナルデータベース管理システム（RDBMS）と
対話するための言語です。
RDBMSにquery（問い合わせ）を投げることでデータベースのあらゆる操作を行うことが
できます。

##具体的にどのようなことができるのか
データベースやテーブルの「作成/更新/削除」やデータの「登録/更新/削除/検索」、
またデータを特定するための条件を指定することができます。

##基本構文
CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT
[Android Studio] Kotlin Android live template

Android Studio 4.0 の新機能のうち Live Template が少し気になっていたので調べてみた。
[Kotlin Android live template](https://developer.android.com/studio/releases/#4-0-0-live-templates)
調べ始めたら、そんなに調べることもないことがわかった…。

Live Template を調べてみると、結構昔からある機能じゃない？新機能ってどういうことだ？と思ったら、4.0で変わったのは「Kotlin関連のクラスのlive templateを追加したよ」くらいの話らしい。

リリースノートで説明されているとおり、登録されているLive Templateは、メニューから **File > Settings..**　で Settings画面を開き、 **Editor > Live Templates** と辿れば確認できる。
Android Studio 3.6 から増えたグループは

- AndroidCommentsKotlin
- AndroidKotlin
- AndroidLogKotlin

くらいだろうか？(旧バージョンを残していないのでもうわからない)

![2020-06-05_01h59_35 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7933/d3e83862-1687-50cc-42b4-efe43dcef578.png)

## 登録されている Live Template の例

### toast

```kotlin:展開後
Toast.makeText($context$, "$text$", Toast.LENGTH_SHORT).show()
```

`toast` と打って、補完候補をEnterで選べば、↑を入力してくれる。便利そう。
`$contexts$` と `$text$` は Tab 押したときにカーソルが飛ぶところ。
(最近あんまりToast使ってない)

### logd

```kotlin:展開後
Log.d(TAG, "$METHOD_NAME$: $content$")
```

すごいな、と思ったのは、 `$METHOD_NAME$` のところ。
`onCreate` の中で `logd` と打てば `Log.d(TAG, "onCreate: $content$")` と自動的に **onCreate** が入力された状態で `$content$` にカーソルが当たった状態になる。便利！
`TAG` が定義されている前提なので、 `TAG` のところはエラーになる。ここは自分で書き換えるのが良さそう。
`logd` だけじゃなくて `loge` とか `logi` とかもある。
(Logも最近あんまり使わないなぁ…)

### exfun

```kotlin:展開後
fun $RECEIVER$.$NAME$($PARAMS$) : $RETURN$ {
$END$
}
```

拡張関数を作るときに使える。使えるけど、省くことができるのは`.`とか`{}`とか限定的だ。Tabでジャンプできるのが便利なんだろうか。
Live Template 使わずにそのまま入力してしまいそうだ…。

### 他にもいろいろ

他にもいろいろある。いろいろあるけど、どれもイマイチピンとこない…。
元々登録されていた Kotlin 以外の Live Template とかも見てみたけど、そもそも補完が効くしなぁ…と思うものが多い印象。

## Live Template を自作する

新しくKotlin 用の Live Template が登録されたと言っても、各自微妙にコードの書き方も違うだろうから、このままではあまり使えるものが多くない気がする。
なので、自分に合った Live Template を作って使うのがいいんじゃないかなー、と思った。
登録も簡単だ。

### 登録方法

![2020-06-05_02h56_55_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7933/9fffc748-e15d-ebec-f5e5-3b5b09f84e85.png)

1. ＋ボタンを押して、Live Template を追加する
2. トリガーとなる文字を入力する
3. Live Template の説明を書く
4. 挿入されるコードを書く
5. どのファイル(言語？)のどこ(トップレベルとかクラスの中とか)で反応するか決める
6. 4に `$` で挟まれた文字列があると「Edit variables」ボタンが有効になる。この例だと `$sudden_death$` にどんな機能をもたせるかを設定できる(関数名を挿入させたり、デフォルト値を決めたり)。

## 感想

デフォルトで登録されているものそのものは微妙に使えなさそう。やはり自分で登録するしかない。
メソッド名とかクラス名を自動的に挿入できる機能は便利だな、と思った。何かに使えそう感がある。

さあ、自分にあった Live Template を作って快適な開発環境を作ろう！(まだやってない)
デザイン思考で行うプロダクト開発

## 自己紹介

初めましてぐなしです。初回なので簡単に自己紹介を。
ずっとデザインに興味を持っていた（憧れていた？）都内で働く20代のエンジニアです。
最近本格的に勉強し始めて、いろんな本を読んだり、ワークショップ参加したり、XDで何か作ってみたりしてます。
このブログではデザインに関して勉強したことのまとめを記事にしていきます。

初回の今回は、デザイン思考について勉強したことと自分なりの解釈を書いていきます。

ではまず、

## デザイン思考とは

簡単にいうと、より良いユーザーの体験を実現するために、ビジネス上の課題を解決するための考え方です。

新規事業立ち上げなどで注目されがちですが、事業を立ち上げることに特化したものではなく、あくまでもより良いユーザーの体験をデザインするための考え方、それを実現するための手法やプロセスのことを指します。

これは余談ですが、自分はエンジニア出身で大学時代は無線通信の研究をしていた、デザインとは無縁の人間でした。
そんな自分がデザイナーにデザイン思考のことを聞くと、「当たり前のことで、デザイン思考って名前がついてることにびっくりした」なんて言われます。

そんな当たり前のことをどうやって実践してばいいかを、「ギャレットのUX５段階モデル」というのをベースに、エンジニアの人にも分かってもらえるように紹介していきます。

## ギャレットのUX５段階モデル

デザイン思考でいうデザインとは、ビジュアルデザインのことだけではなく

「何を誰のために作るのか（戦略）」
「それを使ってユーザーはどんな体験をするのか（要件）」
「ユーザーの体験はどんな要素で構成されているのか（構造）」
「要素をどのように組み合わせると体験が向上するか（骨格）」
「どう見せたら・どう動いたらより良い体験につながるか（表層）」

もデザインの対象で、これらを体系的にまとめたのが「ギャレットのUX５段階モデル」です。
（この画像は、今回参考にしたgoodpatchさんのUX５段階モデルの紹介ブログのものです。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649767/0bfa6336-4b25-56a7-8727-381a91cc4a82.png)

デザイン思考ではこのモデルで表されている5階層全てがデザインの対象であり、戦略から始まり表層までのデザインを一貫して行うことで、より優れたユーザー体験を提供することができます。
各階層では、一旦アイデアを発散させることが重要です。発散させたアイデアを収束させることで次の階層へと進みます。
その際に念入りにアイデアを検証することが、次の階層の質を上げるためにとても重要になってきます。

各階層でのアウトプットをここでは以下のように定義しておきます。

- 戦略：デザインコンセプト、ペルソナ
- 要件：必要な情報と機能
- 構造：UIモデル
- 骨格：ワイヤーフレーム
- 表層：プロダクト

それぞれのアウトプットが次の階層へのインプットになっていきます。

次回からは、各階層で実際に用いられる手法をご紹介していきます。
（もしかしたら次回は他の勉強したことになるかも。）
AWSソリューションアーキテクトアソシエイト 復習2

##AWS　小テストシリーズ

ルーティン的に小テスト形式

引用
>https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-AWS%E8%AA%8D%E5%AE%9A-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E6%95%99%E7%A7%91%E6%9B%B8-%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-ebook/dp/B07M7S9GDL

####AWS CLIやAWS SDKを利用するために必要な認証情報は次のうちとれか。
- IAMユーザーのログイン名とパスワード
- IAMユーザーに付与されたIAMポリシー
- IAMユーザーのアクセスキーIDとシークレットアクセスキー
- ワンタイムパスワード

**AWS Command Line Interdace(CLI)とは**
AWSサービスを管理するためのコマンド郡。
AWS CLIをインストールすることで、WindowsコマンドプロントやLinuxシェルから各種コマンドを利用できる。

**AWS SDKとは**
Javaなどの主要なプログラミング言語向けにAWSから提供されているAPI群。
JavaなどのプログラムからAWS SDKで提供されているAPIを指定することで、AWSの各種サービスを操作できる。

コマンド操作には、操作先のリージョンおよびIAMユーザーごとに作成できるアクセスキーIDとシークレットアクセスキーを事前に作成する必要がある。

ということなので正解は、
IAMユーザーのアクセスキーIDとシークレットアクセスキーとなります。
【Rails】deviseでの機能制限（ログイン・ログアウト）

# deviseでの機能制限（ログイン・ログアウト）

### 目次
1. ログイン・ログアウト機能のみ利用したい
2. deviseでのデフォルト機能について
3. 機能を制限する

## 1. ログイン・ログアウト機能のみ利用したい

私は予約管理ができるアプリを作成していました。（ユーザーは会員登録不要）
管理者画面では、権限のあるユーザーのみ利用できるようにするため、```gem 'devise'```を利用し認証機能を作成することに決めました。
devise関連のインストールと設定を完了後、利用できる機能を確認したところ、不要な機能（ユーザー登録・パスワード設定、etc..）が多いことに気づきました。
管理者画面は基本的に2人しか利用しないので、2人のユーザー情報だけをアプリ作成時に設定しました。（rails console もしくはSQLで設定）

## 2. deviseでのデフォルト機能について

| module | 機能 |
|:--|:--|
| database_authenticatable | DBに保存するパスワードの暗号化(この機能が無いとユーザー登録ができません) |
| registerable | サインアップ処理 |
| recoverable | パスワードリセット |
| rememberable | クッキーにログイン情報を保持 |
| trackable | サインイン回数・時刻・IPアドレスを保存 |
| validatable | メールアドレスとパスワードのバリデーション |

デフォルトでは```trackable```を除いた機能が有効になっています。

```app/models/user.rb
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable :validatable
end
```

## 3. 機能を制限する

今回利用する機能は主に「ログイン・ログアウト」のみなので以下のように変更を行います。
```registerable	サインアップ処理``` （不要機能）
```recoverable	パスワードリセット```（不要機能）

```app/models/user.rb
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :rememberable, :validatable
end
```
確認のため、ターミナルで```rake routes```でルーティングを確認します。

```
    new_user_session GET    /users/sign_in(.:format)  devise/sessions#new
        user_session POST   /users/sign_in(.:format)  devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
```
「ログイン・ログアウト」時に利用するルーティングのみになっています。
※ viewファイルなどは削除するのか残しておくのか適宜判断するようにしましょう。
以上でRailsにおいてのdeviseでの機能制限となります。

[【Rails】deviseでのセッションタイムアウト設定](https://qiita.com/kaz04/items/261f8bc123aaca5cd601)
visual stduioでもsublimeのctrl+dと同じショートカットがあった

ショートカットキー

```
Shift+Alt+ .
```

マルチキャレット選択っていうんですね。
その単語がみつからず「visual stduio sublime ctrl d」で探していました。

公式ページに詳細が載っています。
https://docs.microsoft.com/ja-jp/visualstudio/ide/finding-and-replacing-text?view=vs-2019
binary tree traverseのわかりにくさ

binary tree
下記のwikiのリンクの図があったときに、
https://ja.wikipedia.org/wiki/%E4%BA%8C%E5%88%86%E6%9C%A8#:~:text=%E4%BA%8C%E5%88%86%E6%9C%A8%EF%BC%88binary%20tree%3B%20%E4%BA%8C,%E3%81%A7%E3%81%82%E3%82%8B%E3%82%82%E3%81%AE%E3%82%92%E3%81%84%E3%81%86%E3%80%82

・root: 一番上の点＝②
・node:点＝②〜１１の全ての点
・link:つないでいる線＝②〜１１を繋ぐ全ての線
を指している。

#traverseについて
```python
#下記のような関数について (Postorder)
#getLeftChild=左側の点に移動
#getRightChild=右側の点に移動
#getRootVal＝一番上の点に移動
#つまり、下記の場合、右をとって、左をとってから、真ん中をとる。
#wikiでいうと、2-5-11-6-7-4-9-5-2
def traverse(tree):
    if tree:
        traverse(tree.getLeftChild())
        traverse(tree.getRightChild())
        print(tree.getRootVal())
```

sorted BSTについて
averageのruntimeはO(logn)
worstのruntimeはO(n)
worst caseは、すべてのchild nodeが１つずつしかついていない場合

BSTにおいては、常に左が小さく右が大きくならなくてはいけない。
CloudWatch Metrics から DynamoDB On-Demand 化した時に月額料金がいくらかかるか知る方法

## 非 On-Demand 運用の際の料金

調査したいテーブルの、

```
ProvisionedReadCapacityUnits
ProvisionedWriteCapacityUnits
```

を CloudWatch Metrics で表示する。

Duration を 6month とかにして、Period を 30 days で Type を SUM にする。
これにより過去6ヶ月の30日毎の累積値が出る。

ただ、この Metrics は DynamoDB が1時間あたりの ProvisionedXCapacityUnits を5分毎に CloudWatch に put した値の SUM なので、1/12 すると、本来得たい値に近しい値を算出できる。

その月毎の値を以下の料金仕様どおりに、単位料金をかける。

| プロビジョニングするスループットタイプ | 時間あたりの料金 |
|:--|:--|
| 書き込みキャパシティーユニット (WCU) | 0.000742USD/WCU |
| 読み込みキャパシティーユニット (RCU) | 0.0001484USD/RCU |

例：

30日毎の累積値が 10,000,000 ProvisionedWriteCapacityUnits だったら、
10,000,000 * (1/12) * 0.000742 = 618 USD
となる。

## On-Demand 運用の際の料金

調査したいテーブルの、

```
ConsumedReadCapacityUnits
ConsumedWriteCapacityUnits
```

を CloudWatch Metrics で表示する。

Duration を 6month とかにして、Period を 30 days で Type を SUM にする。
これにより過去6ヶ月の30日毎の累積値が出る。

その月毎の値を以下の料金仕様どおりに、100万で割ってから単位料金をかける。

| 料金タイプ | 料金 |
|:--|:--|
| 書き込み要求単位 | 書き込み要求ユニット 100 万あたり 1.4269USD |
| 読み出し要求単位 | 読み出し要求ユニット 100 万あたり 0.285USD |

例：

30日毎の累積値が 10,000,000 ConsumedWriteCapacityUnits だったら、
(10,000,000 / 1,000,000) * 1.4269 = 10.4269 USD
となる。
[技術メモ]アジャイル開発の利点


アジャイル開発の一番の利点は顧客の要望に臨機応変に対応できること。
イテレーションという「計画」「設計」「実装」「テスト」からなる一つのサイクルを
1~2週間で、すばやく繰り返すことで変更に強い開発手法を実現しています。
Javaのカプセル化とゲッターとセッター

###カプセル化
何人かで開発するとき、自分がクラスを作る際には他の人がそのクラスを使えるように、使ってほしい機能は公開し、クラスの外で使ってほしくない機能は隠すことです。
具体的にはフィールドとメソッドへのアクセスを制限します。
クラスの外部からアクセスできるようにするには「public」を使い、アクセスできないようにするには「private」を使います。
【例】

```
public String name;  //クラスの外部からアクセスできます
private String name;  //クラスの外部からアクセスできません
```
###ゲッター
先ほどの「private」で、フィールドにクラスの外からアクセスすることができなくしました。
しかし、「private」でも、クラス内からはアクセスすることができてしまいます。
どうするかというと、フィールドを「private」にし、クラス外からフィールドの値を取得するために、フィールドの値を返すだけのメソッドを定義します。これを**ゲッター**と呼びます。
ゲッターは「getフィールド名」のように命名するのが一般的らしいです。
【例】クラスをPersonとしています

```
class Person {
  public 戻り値の型 getフィールド名() {
    // フィールドの値を返す
  }
}
```
###セッター
フィールドのアクセス権を「private」にすると、フィールドの値をクラスの外から変更ができなくなります。
そこで、フィールドの値を変更するメソッドを定義します。
フィールドの値を変更するメソッドを特に「セッター」と呼びます。
セッターは「setフィールド名」のように命名するのが一般的らしいです。
カプセル化の定石はフィールドは「private」、メソッドは「public」と覚えておけば問題ないと思います。
【例】

```
class Person {
  public void setフィールド名(データ型 仮引数) {
    // フィールドに値をセット
  }
}
```
AndroidStudio:kotlinで時刻を表示する

# やりたいこと

* 画面に時刻を表示する

# 実装

## 画面側

### activity_main.xml

```xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ここに時計が表示される"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
```


## メイン処理

### MainActivity.kt

```kotlin
package com.example.yamato200605a

import android.icu.util.Calendar
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Handler
import androidx.annotation.RequiresApi
import kotlinx.android.synthetic.main.activity_main.*
import kotlin.concurrent.timer

class MainActivity : AppCompatActivity() {
    @RequiresApi(Build.VERSION_CODES.N)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val handler = Handler()
        timer(name = "testTimer", period = 1000) {
            val calendar = Calendar.getInstance()
            val hour = calendar.get(Calendar.HOUR_OF_DAY)
            val minute = calendar.get(Calendar.MINUTE)
            val second = calendar.get(Calendar.SECOND)
            handler.post {
                textView.text = "${hour}時 ${minute}分 ${second}秒"
            }
        }
    }
}
```
[技術メモ]参照渡し、値渡しについて


##参照渡し
実引数と仮引数がメモリ上の同じ場所を指すため、仮引数に変更を加えた際に実引数の方にも影響がでます。

##値渡し
実引数の値がコピーされるため、仮引数に変更を加えても実引数には影響がありません。
N==2^n 判定

[Cortex-M3以上でN == 2^n判定とビット列反転](https://qiita.com/amutou/items/3272fa35ba7b8b5fc90e)を参考に、x86 での判定を探してみた。

**算術演算と論理演算で判定**

```C:C
int is_pow2n(unsigned x)
{
  return ((x != 0) && (x == (x & -x)));
}
```

**BSF/BSR 命令で判定**

```C:BSF/BSR
int is_pow2n(unsigned x)
{
  unsigned p, q;

  if (x == 0) return 0;
  __asm__ ("bsf %1,%0": "=r" (p) : "X" (x));
  __asm__ ("bsr %1,%0": "=r" (q) : "X" (x));
  return (p == q);
}
```

**LZCNT/TZCNT 命令が使用可能な場合**

```C:LZCNT/TZCNT
int is_pow2n(unsigned x)
{
  unsigned p, q;

  __asm__ ("lzcnt %1,%0": "=r" (p) : "X" (x));
  __asm__ ("tzcnt %1,%0": "=r" (q) : "X" (x));
  return ((p + q) == 31);
}
```

**POPCNT 命令が使用可能な場合**

```C:POPCNT
int is_pow2n(unsigned x)
{
  unsigned n;

  __asm__ ("popcnt %1,%0": "=r" (n) : "X" (x));
  return (n == 1);
}
```
研究室用 MacTeX導入・各種環境設定・Beamer

##MacTeXの導入

1. https://tug.org/mactex/ にアクセスし，「MacTex.pkg」のリンクからインストーラをダウンロード
2. ダウンロードしたインストーラ，「mactex-(バージョン).pkg」を起動しMacTeXをインストール
3. インストーラをゴミ箱に入れる

##TeXShopの環境設定
TeXShopで日本語を使うため，設定を次のように変更します．

1. 環境設定から設定プロファイルを「pTeX(ptex2pdf)」に変更
<img width="671" alt="スクリーンショット 2020-06-05 9.01.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649742/b6f3ca32-cba9-9513-0a1c-366006b52a3f.png">
2. 環境設定>内部設定タブ>パス設定 から
    - (pdf)TeX : `/Library/TeX/texbin`
    - Distiller : `/usr/local/bin`
<img width="669" alt="スクリーンショット 2020-06-05 9.01.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649742/d6dd3e0c-7d75-2429-e0d4-b987113c0d25.png">

##LaTeXiTの環境設定
LaTeXiTで日本語を使うため，設定を次のように変更します．

1. 環境設定>プログラム>コマンド から「latex+dvipdf」に変更
2. 環境設定>プログラム>コマンド から
    - pdflatex : `/Library/TeX/texbin/pdflatex`
    - LaTeX : `/Library/TeX/texbin/platex`
    - dvipdf : `/Library/TeX/texbin/dvipdfmx`
    - Ghostscript(gs) : `/usr/local/bin/gs`
    - ps2pdf : `/usr/local/bin/ps2pdf`
  <img width="601" alt="スクリーンショット 2020-06-05 9.02.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649742/a65fe4ea-9735-d2c1-32ad-6d550b664b87.png">
   
##Beamerでプレゼンテーション作成
beamer パッケージはTeXに標準で準備されており，文書クラスを`beamer`とすれば利用できる．
Beamerでは，各スライドの内容はframe環境内に記述する．

```
\documentclass[dvipdfmx]{beamer}
\begin{document}

\begin{frame}
    1枚目のスライドの内容
\end{frame}

\begin{frame}
    2枚目のスライドの内容
\end{frame}  

\end{document}
```

Beamerには多くの機能・テーマが用意されており，多様なスライドを作成することができる.

- 機能紹介を兼ねたテンプレート例
    - https://qiita.com/birdwatcher/items/5dd8a5f453bdc0c6940e/
- テーマ例
    - https://hartwork.org/beamer-theme-matrix/
    - https://qiita.com/htlsne/items/70cbb488e7a87cd9e228/
【jQuery】初心者でもよく理解できたやつ

##【メリット】
■　UXの向上
■　javascript理解度向上


##【開発環境】
■ Mac OS catalina
■ Ruby on Rails (5.2.4.2)
■ Virtual Box:6.1
■ Vagrant: 2.2.7


##【実装】

###環境構築

■アプリケーションを作成

```
$ rails new hoge

$ cd hoge

$ rails s -b 0.0.0.0
```

■下記URLよりJquery.min.jsをダウンロード
　https://jquery.com/download/

■ダウンロード完了後、アプリケーション内assetsへ配置


##【よく使った記述】
※以下はjsファイルへ記述。htmlファイルへ直書きする場合は<scrit>タグが必要。

###.css
※対象のCSSを変更。下記の場合は背景色が赤に

```
$(".hoge").css({"background-color":"red"});
```

###.slideUp
※idでの指定は””内が「 . 」 ではなく 「 # 」 になります
※対象のものが上に上がっていきます。

```
$("#hoge").slideUp(任意のスピード)
```

###.slideDown
※対象が上から現れます。
※cssでhogeクラスにdisplay:none;を追加する必要があります。

```
$(".hoge").slideDown(任意のスピード)
```

###.fadeIn
※hogeクラスがうっすら写ってきます
※CSSでhogeクラスに　display: none;を指定

```
$(".hoge").fadeIn(任意のスピード)
```

###fadeOut
※hogeクラスがうっすら消えていきます

```
$(".hoge").fadeOut(任意のスピード)
```


###.mouseover
※jquey使います
※対象にマウスが乗ると赤色に変わります。
※CSSのhoge::hoverと同義。

```
$(function(){
  $(".hoge").mouseover(function(){
    $(".hoge").css({"background-color":"red"});
  });
});
```

###.mouseout
※こちらを追加しないと一生mouseoverで指定したままです
※マウスが外れると白色に戻す

```
$(function(){
  $(".hoge").mouseout(function(){
    $(".hoge").css({"background-color":"white"});
  });
});
```

###.on("click", function)
※クリックすると発火します。
※対象をクリックすると背景色を赤に

```
$(function(){
  $(".hoge").on("click", function(){
    $(".hoge").css({"background-color":"red"});
  });
});
```

###.this
※HTML
ファイルに下記を追記

```/.html
    <body>
        <div class="box-container">
            <div class="box aa"></div>
            <div class="box bb"></div>
            <div class="box cc"></div>
            <div class="box dd"></div>
        </div>
    </body>

```

※CSSファイルに追記

```/.css
*{
	margin: 0;
	padding: 0;
	box-sizing: border-box;
}

.box {
    background-color: white;
    height: 200px;
    width: 200px;
    float: left;
}
 
.aa {
    background-color: gray;
}
 
.bb {
    background-color: lightgray;
}
 
.cc {
    background-color: lightgreen;
}
 
.dd {
    background-color: green;
}
```

※jsファイルに追記
※この場合「this」はクリックされたものつまり「box」を指します
※クリックした背景色は赤に変更されます

```
$(function(){
  $("box").on("click", function(){
    $("this").css({"backgroun-color":"red"});
  });
});
```

###.children
※htmlファイルに追記

```/.html
<div>
  <ul>
    <li>aaaaaa</li>
    <li>xxxx</li>
    <li>ccccc</li>
    <li>vvvv</li>
    <li>dddd</li>
  </ul>
</div>
```

※jsファイルへ
※ulの配下のliが赤色の
文字へ変更されます。

```
$(function(){
	$("li").mouseover(function(){
	  $("ul").children().css({"color":"red"});
	});

	$("li").mouseout(function(){
	  $("ul").children().css({"color":"black"});
	});
});
```

以上です。
これだけで、結構動き着くので試してみたください！！！
プログラマーからインフラエンジニアへ、そしてまたプログラマーへ

noteに書いた__プロフィール__の加筆転載です。
[プログラマーからインフラエンジニアへ、そしてまたプログラマーへ](https://note.com/tetsuya_ito/n/ndcd67dc4c890)

#概要
##①プログラマー時代
SIerに新卒入社し、開発フェーズからリリースにSEとして携わる。
通販パッケージソフト運営企業に転職し、__設計業務からユーザーサポートまで__プログラマーとして携わる。

##②インフラエンジニア時代１
コンテンツ配信企業に転職し、開発フェーズからクローズまでシステム構成からインフラエンジニアとして携わる。
__キー局テレビ連動__では短時間の高アクセスを実現し、パチンコ案件では__100万人級システムのDBチューニング__を担当。

##③インフラエンジニア時代２
大手ゲームメーカーに転職後、__プライベートクラウド__における開発フェーズからクローズまでインフラエンジニアとして携わる。
クラウド全体を俯瞰したシステム構成設計や、__サーバアプリ設計まで踏み込んだチューニング__により、危機対策に貢献。

##④ふたたびプログラマー（予定）
深夜休日対応はもうきつい。__日本の多くの企業では待機時間は就業とみなされないばかりか、評価されない__。（動いていて当たり前と評価される）
インフラ領域も理解できるプログラマーに転身予定。

#実績
##①経験した業種
ゲーム / マスメディア / エンタメアイドル / 通販 / 省庁

##②経験したシステム規模
社内システム / 携帯端末 / スマートフォンゲーム / テレビ連動
アイドルグループ

##③経験したレイヤー
物理サーバ / 仮想サーバ(プライベートクラウド) / データベース
ネットワーク / ディレクトリサービス / サーバアプリケーション
Webミドルウェア / Windowsアプリ

##④経験したフェーズ
開発 / リリース / アップデート / クローズ/最小化 / システム移管
イベント対策(連動) / 危機対策 / システム稼働状況の日次レポート

##⑤経験したソフトウェア
Ansible / Apache / bind / BIG-IP / keepalived / lsyncd / ntpd / NetApp
memcached / MySQL / Oracle RAC / Postfix / PostgreSQL / qmail / Redis
Sybase / WordPress / VMWare vSphere / ZABBIX

##⑥経験した言語
Bash / C / Perl / PHP / PowerShell / Python / VBA(Excel) / VisualBasic

##⑦経験したAWS
ACM / CloudWatch / EC2 / Lambda / Route53 / S3 / VPC / WorkSpaces

#思い出深いこと
##①SIer
省庁システムにトラブルが20時に発覚、徹夜で準備して__そのまま始発で東京→福岡出張__したこと
##②インフラエンジニア１
DBのシステム移行__36時間デスマッチ__をひとりでやり遂げたこと（オフィスの椅子３つ並べて仮眠しました）
##②インフラエンジニア２
ゲームのクレジットタイトルに__名前が残る仕事__をしたこと

#noteとの棲み分け
##Qiita
技術的なまとめ、備忘録。事実をベースに。
##note
エピソードを中心としたノウハウまとめ。感性をベースに。
【python】収穫できるリンゴとオレンジの数を求めるプログラム

#【python】収穫できるリンゴとオレンジの数を求めるプログラム

個人メモです。


##設問
家の敷地内（座標s~t）に入ったリンゴの数をカウントする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/e21d7d50-ac57-de5e-92e7-1abcd9c9d244.png)

s：家の始点
t：家の終点
a：りんごの木の位置
b：オレンジの木の位置
apples：リンゴの落下地点（相対）
oranges：オレンジの落下地点（相対）

[URL](https://www.hackerrank.com/challenges/apple-and-orange/problem)

▼sample input

```python:
s=2
t=3
a=1
b=5
apples=[-2,2,1]
oranges=[5,8,-2,-1]
```

▼sample output

```python:
2
1
```

▼my answer

```python:
def countApplesAndOranges(s, t, a, b, apples, oranges):
    yeiledApple = 0
    yeiledOrange = 0

    #apple
    for apple in apples:
        aloc = a + apple
        if s <= aloc and aloc <= t:
            yeiledApple += 1

    #orange
    for orange in oranges:
        oloc = b + orange
        if s <= oloc and oloc <= t:
            yeiledOrange += 1

    print(yeiledApple)
    print(yeiledOrange)
    
if __name__ == '__main__':
    st = input().split()
    s = int(st[0])
    t = int(st[1])
    ab = input().split()
    a = int(ab[0])
    b = int(ab[1])
    mn = input().split()
    m = int(mn[0])
    n = int(mn[1])
    apples = list(map(int, input().rstrip().split()))
    oranges = list(map(int, input().rstrip().split()))

    countApplesAndOranges(s, t, a, b, apples, oranges)
```


**・denotes**
～を表す
the red region denotes his house.

**・メソッドの出力形式**
print。メソッド実行で終了しているため。
 countApplesAndOranges(s, t, a, b, apples, oranges)


<br>
問題は簡単だけど、設問が長い、、
Rubyのchomp!にだまされる!

最後の改行を取り除いた文字列をメソッドに渡したいとき

```ruby
def foo(str)
  p str
end

str = "abc\n"

foo(str.chomp)  # "abc"
p str           # "abc\n"
```

`chomp`を使えばよい。

メソッドに渡すと同時に変数の中身も書き換えたいとき

```ruby
str = "abc\n"

foo(str.chomp!) # "abc"
p str           # "abc"
```

ビックリマークのついた`chomp!`を使えばよい。`str`変数の中身も書き換えてくれている。

文字列に改行がない場合はそのままで処理したい。`chomp`は改行がなければきっとそのままにしてくれるだろう。

```ruby
str = "abc"

foo(str.chomp)  # "abc"
p str           # "abc"
```

OK。

`chomp!`も

```ruby
str = "abc"

foo(str.chomp!) # nil
p str           # "abc"
```

あれ？`nil`？

公式ドキュメントを見ると、たしかに改行がない場合は`nil`を返す、とある。

[String#chomp! (Ruby 2.7.0 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/latest/method/String/i/chomp=21.html)

> chomp! は通常 self を返しますが、取り除く改行がなかった場合は nil を返します。

わざわざ`nil`を返す仕様になっているのは、改行を取り除いた場合になにかをする、というコードが書けるようにでしょうか？？？

```ruby
if str.chomp!
  puts "chompしたよ!"
else
  puts "chompしなかった"
end
```

思いがけず`nil`が返されてしまう場合があってハマった、という話でした。


# 追記

以下の記事に整理されていました。

- [self時々nilを返す破壊的メソッド - Qiita](https://qiita.com/HMMNRST/items/15504596ed6f0373b10e)
[技術メモ]オブジェクト指向とは何ですか？


##オブジェクト指向とは
現実世界を正しく捉えることで、プログラムの動作をある特徴(属性値とメソッド)を持ったパーツの組み合わせで実現するという考え方。

パーツの特徴を定義するのがclass、実際のパーツはインスタンス。
インスタンスはclassから生み出される。
[技術メモ] エラー解決はどのように行うのか


##回答例
まず、起こっているエラーのログを見ます。
良く遭遇するエラーであれば(例えばtemplate missingやundefind method for nil NilClassなど)自分で仮説をたて考えて原因を探ります。

あまり見たことがないエラーについては必要に応じて検索します。


##自分の場合
開発環境の場合、エラー文がかなりヒントを与えてくれるので
読んで状況を理解、意味がわからなければ検索

①過去のエラー経験に基づいて対応
②検索して、似た事例があれば同じ対応を
③改めて、今の状況がどうあれば理想なのか考えてデバックを駆使し、
　どこまでが理想通りなのかを確認
などでしょうか。

②の検索精度を上げるため、③をしっかりしないといけない場合は
多いですね！
【AtCoder】ABC085C - OtoshidamaのPython回答

AtCoder Beginners Selectionから，ABC085C - Otoshidamaを解きました．
問題は[こちら](https://atcoder.jp/contests/abs/tasks/abc085_c)．

## 解法

Pythonで書いてます．

```python
n, y = list(map(int, input().split()))

a = b = c = 0

yen_a = 10000
yen_b = 5000
yen_c = 1000

target = y - yen_c * n
coef_a = yen_a - yen_c
coef_b = yen_b - yen_c
a = int(target / coef_a)
if a > n or target < 0:
    a = b = c = -1
else:
    while a >= 0:
        if coef_a * a + coef_b * b == target and n-a-b >= 0:
            c = n - a - b
            break
        elif coef_a * a + coef_b * b > target:
            a -= 1
        else:
            b += 1
    if a == -1:
        b = c = -1

print(a, b, c)
```

我ながらあまり美しくないコードだなと思いますが，残念ながら自力で解くとこんなものですね．

追記：
@c-yan さんに`print()`の小技を教えていただいたので，`print()`部分を変更しました．@c-yan さんありがとうございます！
@DaikiSuyama さんにコメントいただいた部分を修正しました．@DaikiSuyama さんありがとうございます！

## 解説

上の方では標準入力を受け取ったり，変数を初期化したりしています．
if文の前のブロックでは，２つの３元一次方程式から，２元一次方程式を導き出しています．以下の数式の中から`c`を消去するような処理です．

```math
\left\{
\begin{array}{l}
a + b + c &=& n \\
10000a + 5000b + 1000c &=& y
\end{array}
\right.
```

結果こんな式になります．

```math
9000a + 4000b = y - 1000n
```

後はこれを満たす`(a, b)`の組み合わせを探します．

`a = int(target / coef_a)`で上の数式を満たす最大の`a`を導き出しています．`a > n`の場合，つまりお札の枚数が少なくて，目標の金額に届かない場合と`target < 0`の場合，これはお札の枚数が多すぎて表現できる最小金額を目標金額が下回る場合のことですが，この２通りの場合に指定されたお札の枚数で目標金額を表現することはできないということで，`a = b = c = -1`にしています．

その後は，上記以外の場合で，`a`，`b`の値を上下させて上式を満たす組み合わせがないかを探しています．

## あとがき

反省点としては，最初から`a + b + c = n`の範囲で全件調べればよかったなと思いました．
私の方法は全然いい方法ではないので，[こちらの解法](https://ikatakos.com/pot/programming_algorithm/contest_history/atcoder/2018/0107_abc085)を参照してください．

問題を解くのに加えて，プログラムの内容を言葉で説明するのは頭の体操になっていいなぁと思いました．
docker-compose を使ってwordpressとmysqlを１コマンドで環境構築する

# 参照サイト
https://knowledge.sakura.ad.jp/16862/
https://qiita.com/tegnike/items/bcdcee0320e11a928d46
https://coinbaby8.com/docker-beginner.html

上記の記事が参考になりました。

# docker-compose.yml
```
version: '3'
services:

  wordpress:
    image: wordpress
    container_name: wordpress-docker-compose
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_PASSWORD: access-to-db-pw

  mysql:
    image: mysql:8.0
    container_name: mysql-docker-compose
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: access-to-db-pw
```

# terminal-command
前提として、docker-compose.yml　ファイルがあるディレクトリへcdで移動してください。
- command:upでイメージのビルドからコンテナの作成までできるようです。
- command:buildではイメージのビルドのみとなり、コンテナは作成されません。
- option:-dをつけることで、バックグラウンドで起動することができます。

```
docker-compose up -d
```
[技術メモ]AWSとは何か？裏側ではどのような技術が動いているのか？



##Amazon Web Servicesの略
Amazonが提供するクラウド型Webサービスの総称。
Webエンジニアが利用する代表的なものはEC2。
EC2はクラウドサーバといって、自社にサーバ本体を置く必要がなくなります。
他にもS3など。
[技術メモ]MVCの仕組みについて


##MVCとは

プログラミング手法のアプローチの一種でRuby on Railsでも採用されています。
Webアプリケーションを動かすために必要な処理の一部を分類し分けることで、保守性、可読性の高いコードを維持できます。

##「V」はViewの略
実際にクライアント側に表示される見た目の部分です。

##「M」はModelの略
Webアプリケーションにおけるビジネスロジック(データベースから取得してきた値を加工するメソッドや、レコード検索の条件が書かれたメソッド、データを保存する前に加工するメソッドなど)を定義します。

##「C」はControllerの略
クライアントからのリクエストに対して適切なレスポンスを返すことや、そのレスポンスに必要なデータの用意を行う。

あくまでも用意するだけが責務なので、データの加工など複雑なロジックはControllerには書きません。
【Rails】「Uglifier::Error: Unexpected character '`'」の解決方法

#開発環境

・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・OS: macOS Catalina

# 事象

Capistranoでデプロイした際に下記エラーが発生

```terminal:ターミナル
deploy:assets:precompile
　01 $HOME/.rbenv/bin/rbenv exec bundle exec rake assets:precompile
　01 rake aborted!
　01 Uglifier::Error: Unexpected character '`'
```

# 原因

JavaScriptファイル内で記述していたテンプレートリテラルのバッククォート(`)が原因でした。

# 解決方法

`production.rb`の27行目をコメントアウトする。

```ruby:production.rb
# config.assets.js_compressor = :uglifier
```
【python】得点を丸め込むプログラム


#【python】得点を丸め込むプログラム

個人用メモです。

##設問
- ①得点と②その得点の次の5の倍数との差が3未満(less than)の場合、①を丸め込んで②にする。
- 得点が38未満(less than)の場合は丸め込みしない。


▼sample input

```python:
73
67
38
33
```

▼sample output

```python:
75
67
40
33
```

▼my answer

```python:
def gradingStudents(grades):
    finals=[]
    for grade in grades:
        if grade >= 38:
            a = str(grade)[1]
            if a == "3":
                grade += 2
            elif a=="4":
                grade += 1
            elif a=="8":
                grade += 2
            elif a=="9":
                grade += 1
        finals.append(grade)
    return finals


if __name__ == '__main__':
    fptr = open(os.environ['OUTPUT_PATH'], 'w')

    grades_count = int(input().strip())

    grades = []

    for _ in range(grades_count):
        grades_item = int(input().strip())
        grades.append(grades_item)

    result = gradingStudents(grades)

    fptr.write('\n'.join(map(str, result)))
    fptr.write('\n')

    fptr.close()
```


■考え方
・次の5の倍数との差分が3未満になるのは、１の位が3,4,8,9の場合のみ。

■注意点
１桁の場合はパス。（２桁目が存在しない）
出力は配列で渡す。（配列をreturn）
「fptr.write('\n'.join(map(str, result)))」

※return gradeで返すと、メソッドが１回目の処理で終了してしまう。

<br>

**・next multiple of n**
nの倍数。

If the difference between the grade and the next multiple of 5 is less than 3, round up to the next multiple of 5.

得点と、その得点に近い5の倍数の値の差分が3以下なら、その5の倍数の値に丸め込みをする。

**・constraints**
制約。数値の条件。
1<n<100　など
【Rails】JavaScriptを特定のビューで読み込む方法

# 開発環境

・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・OS: macOS Catalina

# 前提

下記実装済み。

・[Slim導入](https://qiita.com/matsubishi5/items/b639ffddecc626856039)

# 実装

### 1.`application.js`を編集

`=`を削除する。
こうする事で、`assets/javascripts`内のjavascriptファイルが自動で読み込まれなくなる。

```javascript:application.js
//変更前
//= require_tree

//変更前
// require_tree
```
### 2.`environments`を編集

開発環境で反映させたい場合は`development.rb`、
本番環境で反映させたい場合は`production.rb`を編集する。

```ruby:development.rb
Rails.application.configure do
  # 個別で読み込みたいjavascriptファイルを設定
  config.assets.precompile += ['gmap.js']
  # coffeeスクリプトは拡張子を付けるとエラーが出るので注意！
  config.assets.precompile += ['jquery.jpostal']
end
```

### 3.ビューを編集

```slim:~.html.slim
/ このページで読み込みたいjavascriptファイルを設定
= javascript_include_tag 'gmap.js'
```
WEBサイトに無音の動画を背景にしてみる1日目【WEBサイトを作る30日チャレンジ】

# なぜやるのか？
　・フロントが好き
　・なにかにチャレンジし、新しい体験をしたい
　・新たな体験から、なにか新しい夢や希望をみつけたい
　・経験値や技術力を高める
　・wordpressのテーマのレパートリーを増やす
　（随時編集）

### せっかくなのでざっくりルールを作る
　・知らない領域に挑戦する
　・おしゃれなサイトを意識
　・なるべくレスポンシブwebデザインを意識
　・多少矛盾しますが、上記ルールに対して無理しない（完璧を目指さないこと）
　（随時編集）

# webサイト作成1日目、おしゃれなWEBサイトによくある背景が動画なトップのサイトを作成

　・Bootstrapを使用します
　・レスポンシブwebデザインを意識
　・背景に動画を挿入し、動画を自動再生させて、音は無音、動画はループさせます
　・動画については以下フリーのサイトからダウンロードしました
　　https://mazwai.com/video/goomalling-storm/455092
　・CSSは記述量が少ないため、htmlに直接かきます

# コーディングしたWEBサイトが以下の通り

```html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
  <title>Videoタグで無音の動画を背景にしてみる</title>

<style>
.bgv{
  position: absolute;
}

.video-text{
  position: relative;
  margin-right: 10%;
  margin-top: 50%;
  color: white;
}

.video-second-text{
  position: relative;
  margin-right: 15%;
  margin-top: 50%;
  color: white;
}
</style>
</head>
<body>
  <div class="container-fluid">
    <div class="row no-gutters mt-3">
      <a href="#" class="col-sm btn btn-primary stretched-link ml-2 mr-1">ホーム</a>
      <a href="#" class="col-sm btn btn-primary stretched-link ml-2 mr-1">背景動画</a>
      <a href="#" class="col-sm btn btn-primary stretched-link ml-2 mr-1">チャレンジ</a>
    </div>
    <h2 class="text-center">ここから下に動画背景↓↓↓</h1>
    </div>
      <video src="goomalling-storm.mp4" loop="" autoplay="" muted=""  width="100%" class="bgv"></video>
      <div class="container">
        <div class="row video-text-box">
          <div class="video-text btn btn-dark col-1.5 offset-1 text-nowrap">ボタン</div>
          <div class="video-second-text btn btn-info col-1.5 offset-1 text-nowrap">第2ボタン</div>
        </div>
      </div>
</body>
</html>
```


# 完成したWEBサイト

<img width="847" alt="スクリーンショット 2020-06-05 7.39.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540462/7936c86f-2785-9791-bd92-e59c328b418d.png">

動画ver
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540462/86fb5301-1197-4550-8978-125ea2c2f243.gif)



### 苦労した点
　・当初動画が流れなかったが、videoタグにmuted="" を記述することによって解決しました
　・レスポンシブサイトにする際のボタンの場所の工夫
　・横いっぱいに動画を表示したかったためwidthは100%を記述したが、heightを記述すると横いっぱいにならなかったため、記述をせず、widthのみを記述。

# 感想

結構たのしい。ずっといじっていられる（笑）
おしゃれなサイトとなると、もっとこうできないかな？っと繰り返し良くしたい思いが先行して
ついついこだわって作っていきたくなってしまう。
完璧主義はドツボにはまると危ないため、ここまでとしました。

ここまでみていただき、ありがとうございます。
【Rails】Geolocation APIを用いて位置情報を取得する方法

# 開発環境

・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・OS: macOS Catalina

# 前提

下記実装済み。

・[Slim導入](https://qiita.com/matsubishi5/items/b639ffddecc626856039)
・[Google Map表示](https://qiita.com/matsubishi5/items/196fa1941da2152b6d5d)

# `Geolocation API`を有効化

下記記事の「Geocoding APIを有効化」と同様の手順で、`Geolocation API`を有効化して下さい。

[Geolocation APIを用いて緯度経度を算出する方法](https://qiita.com/matsubishi5/items/1b784dbbe5f1c336ac70)

# 実装

```slim:~.html.slim
#map style='height: 500px; width: 500px;'

- google_api = "https://maps.googleapis.com/maps/api/js?key=#{ ENV['GOOGLE_MAP_API'] }&callback=initMap".html_safe
script{ async src=google_api }

javascript:

  let map;

  function initMap() {
    // 位置情報を取得
    navigator.geolocation.getCurrentPosition(function (position) {
    LatLng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);

      // 取得した位置情報を中心に表示
      map = new google.maps.Map(document.getElementById('map'), {
        center: LatLng,
        zoom: 15
      });
    });
  }
```

# 注意

`turbolinks`を無効化しないと地図が切り替わらないので、必ず無効化しておきましょう。

[turbolinksを無効化する方法](https://qiita.com/matsubishi5/items/c4c8a5df03ae630ae534)
【EC2】seleniumでスマホの画面キャプチャを撮る方法

#【EC2】seleniumでスマホの画面キャプチャを撮る方法

スマホ用のUAをoptionsの引数に追加すればOK。

**▼iphone safariの場合**

```pyhthon:追加するオプション
options.add_argument('--user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 10_2 like Mac OS X) AppleWebKit/602.3.12 (KHTML, like Gecko) Version/10.0 Mobile/14C92 Safari/602.1')
```


**▼コード全体例**

```python:
#-*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True

#キャプチャする画面サイズを指定
options.add_argument('--window-size=412,732')
####driver.set_window_size(600,1000)

#UAを指定
options.add_argument('--user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 10_2 like Mac OS X) AppleWebKit/602.3.12 (KHTML, like Gecko) Version/10.0 Mobile/14C92 Safari/602.1')

driver = webdriver.Chrome(options=options)

#URLを指定
driver.get("https://www.google.co.jp/")

#キャプチャのファイル名と拡張子を指定
driver.save_screenshot('googletop-sp.png')


driver.quit()
```


<br>
##主要なユーザーエージェントの一覧
https://developers.whatismybrowser.com/useragents/explore/


###Android(Google WebLight Proxy)

```
Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 5 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko; googleweblight) Chrome/38.0.1025.166 Mobile Safari/535.19
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/c9c2be88-9c90-4fd7-a0a3-c81e8ce7c0bf.png)

mobile用とmobile Phone用がある。


###iphone(Safari 13)

```
Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Mobile/15E148 Safari/604.1
```
【Python】変数前方のアスタリスクの役割。入力値を分割し変数に代入

#【Python】変数前方のアスタリスクの役割。入力値を分割

下記のような表記で実行されていることの確認。

`a,*b = [1,2,3,4,5]`

**▼処理内容**
一番最初の要素をaに代入。
それ以降をbに代入。

```python:
a,*b = [1,2,3,4,5]
print(a)
print(b)

#出力
1
[2,3,4,5]
```

<br>
**▼基本の確認**
変数を要素分用意すると、一つ一つ格納できる。

```python 
a,b,c=1,2,3
print(a)
print(b)
print(c)

#出力
1
2
3
```

▼要素の数と変数の数が合わないとエラー

```python
a,b=1,2,3
print(a)
print(b)

#出力
too many values to unpack (expected 2)
```


**▼アスタリスクを使うことで変数と要素の数を合わせる必要がなくなる**

・最初や間にも使える。



```python
a,*b,c,d=1,2,3,4,5,6,7,8,9
print(a)
print(b)
print(c)
print(d)

#出力
1
[2, 3, 4, 5, 6, 7]
8
9
```

```python
*a,b,c,d=1,2,3,4,5,6,7,8,9
print(a)
print(b)
print(c)
print(d)

#出力
[1, 2, 3, 4, 5, 6]
7
8
9
```


##応用例
`name, *line = input().split()`

- 空白やTABを含んだ入力値を分割しlist化。
- １つ目の要素をnameに代入
- 以降の要素をlineに代入


```python:

    n = int(input())

#辞書型を定義
    student_marks = {}
    for _ in range(n):

#１つ目の要素はnameに。以降はlineに格納
        name, *line = input().split()
#lineに格納された数値をfloatにしてlist型に
        scores = list(map(float, line))
#キーをname,値をscoresとして辞書型に格納
        student_marks[name] = scores
    query_name = input()

#辞書型のfor文はkeyを取り出す。
    for key in student_marks:
        if key==query_name:
#平均を求める sum()/len()
         ave = sum(student_marks[key])/len(student_marks[key])

#小数点２桁表示。f文字列を使用
         print(f'{ave:.2f}')
```

`f'文字列'`
`f'{変数}'`
値:.nf →　小数n桁まで表示
【python】listの各要素を一つづつ比較し勝敗を出すプログラム。zip()

#【python】listの各要素を一つづつ比較し勝敗を出すプログラム。zip()

２つの配列が与えられたときに、各々の１つ目の要素を比較し、勝った方に１点を与え、それぞれの点数を出力する。

Alice対Bob。勝った方に1点ずつ入る。引き分けの場合0点。

▼sample input

```
17 28 30
99 16 8
```

▼sampel output

```
2 1
```

▼my answer

```python:

def compareTriplets(a, b):
#勝敗数カウント用の変数をセット。初期値０
    alice=0
    bob=0

#与えられた配列の要素を一つづつ比較
    for pair in zip(a,b):
        if pair[0]>pair[1]:
            alice+=1
        elif pair[0]<pair[1]:
            bob+=1

#戻り値を返す
    return (alice,bob)

#input処理
if __name__ == '__main__':
    fptr = open(os.environ['OUTPUT_PATH'], 'w')

    a = list(map(int, input().rstrip().split()))

    b = list(map(int, input().rstrip().split()))

    result = compareTriplets(a, b)

    fptr.write(' '.join(map(str, result)))
    fptr.write('\n')

    fptr.close()
```


##複数の配列の要素を一つづつ抜き出す
`zip(配列１，配列２)`を使う
型はzip。
ネスト構造で配列1の１つ目と、配列2の１つ目の要素をセットにし、新たに１つ目の要素にする。

```python:
a=[1,2,3]
b=[4,5,6]
print(list(zip(a, b)))

#出力
[(1, 4), (2, 5), (3, 6)]
```

###zipとfor文の組み合わせ

```python:
a=[1,2,3]
b=[4,5,6]

for pair in zip(a,b):
    print(pair)

#出力
(1, 4)
(2, 5)
(3, 6)
```


##rstrip()
末尾の空白を削除する

```python
a="   a bcd efg     "
a.rstrip()

#出力
'   a bcd efg'
```

##文頭と文末の空白を削除
`.strip()`　先頭と末尾の空白を削除
`.lstrip()`　先頭の空白を削除
`.rstrip()`　末尾の空白を削除

※間の空白は消えない


```python:
letter="   a bcd efg     "

s = letter.strip()
l = letter.lstrip()
r = letter.rstrip()

print(s)
print(l)
print(r)

#出力
a bcd efg←ここまで
a bcd efg     ←ここまで
   a bcd efg←ここまで
```


##文頭と文末の指定した文字を削除
`.strip("文字列")`　先頭と末尾
`.lstrip("文字列")`　先頭
`.rstrip("文字列")`　末尾

※連続しているばあいはすべて
※間の文字は消えない

```python:
letter="a bad eaa"

s = letter.strip("a")
l = letter.lstrip("a")
r = letter.rstrip("a")

print(s)
print(l)
print(r)

#出力
 bad e
 bad eaa
a bad e
```


##メソッドの出力定義
①return
呼び出しに、fptr = open(os.environ['OUTPUT_PATH'], 'w')がある場合。
メソッドは変数に代入さている。result = compareTriplets(a, b)

②print
メソッドを実行している場合。
最終出力がcompareTriplets(a, b)であれば、メソッド内はprint()とする。