OmniAICreator/Qiita-1.07M huggingface dataset:
ethers.js で UTF-8 文字列とバイト列の相互変換

# UTF-8 文字列 => バイト列

```js
// ethers.js をインポート
const ethers = require('ethers')

// バイト列に変換する文字列
let strings = "piyo"

// 文字列をバイト列（Uint8Array）に変換
let bytes = ethers.utils.toUtf8Bytes(strings)
console.log(bytes)
```

# バイト列 => UTF-8 文字列

```js
// ethers.js をインポート
const ethers = require('ethers')

// 文字列に変換するバイト列
let bytes = [ 112, 105, 121, 111 ]

// バイト列（Uint8Array）を文字列に変換
let strings = ethers.utils.toUtf8String(bytes)
console.log(strings)
```

# Ref.
- https://scrapbox.io/a42/ethers.js_で_UTF-8_文字列とバイト列の相互変換
- https://docs.ethers.io/ethers.js/html/api-utils.html?highlight=sha256#utf-8-strings
Google AnalyticsのChrome拡張を入れると便利な件

## Google AnalyticsのChrome拡張を入れると便利な件
Webに携わる方であれば、GAはまず間違いなく活用していることでしょう。

さらにGAには公式のChrome拡張があります。特に便利な機能として、そのページの訪問者の何％の人がどのリンクを次に辿ったかを表示してくる機能があります。
ぜひ活用してみてください。リンクはこちらです。 https://chrome.google.com/webstore/detail/page-analytics-by-google/fnbdnhhicmebfgdgglcdacdapkcihcoh?hl=en

この記事が参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
windowsにGitサーバーを構築する

#Linux情報だらけ
そもそもwindowsをサーバーにして運用する事が少ないためかと思われます。
情報を探す際は覚悟してください。

##手順
手順を丁寧に記述して下さってる方がいるのでそちらを参考にしてください。変に説明するより分かりやすいです。
http://imamachi-n.hatenablog.com/entry/2018/06/09/170331
気をつける事といえば、
`ipconfig`を実行してIPアドレスの確認
と
sshのポート番号はデフォルトで22なので外からのアクセスを許可する場合は変えておいた方が良いです。

##ここからが本番
SourceTreeでcloneをしようとすると
`git-upload-pack command not found`と吐かれました。
原因はサーバー側にgit-upload-packのパスが通ってないとのこと。

##解決法
サーバー側とクライアント側にGitの中にあるgit-upload-packまでのパスを環境変数に設定すればいいだけのこと
~~自動でやれや~~
場所はGit bashを管理者権限で実行し、
`which git-upload-pack`コマンドを実行するとどこにあるか探してくれます。結果が返ってくるのが早いから地味に感動しました。すげえ
最後にサーバー側のsshdを再起動すると繋がります。
再起動のやり方は分からなかったのでタスクマネージャーから停止させ、また実行しました。

windowsが嫌いって人が多い理由が最近わかってきた気がします。情報が少ない。
Railsチュートリアル（第3章）

# はじめに
Railsチュートリアルの第3章が終わりました。
ポイントだけメモしておきます。

# コントローラーの作成
`rails generate`コマンドでコントローラーを作成します。
アクション名はスペース区切りで複数作成できます。
※私はDocker上で動かしているので、先頭にdocker-compose run webをつけています。

```
$ rails generate controller "コントローラー名" "アクション名"
```
`rails generate`の部分は`rails g`と省略して記述できます。
また、コントローラー名はキャメルケースで記述します。そうすると、自動でスネークケースでコントローラーのファイルを作成してくれます。
（例：StaticPages → static_pages_controller）

また、自動生成したコントローラーを削除したい場合は、`generate`の部分を`destroy`に書き換えて実行します。

# ページ表示の簡単な流れ
URLにアクセスすると、まず`config/routes.rb`ファイルを元にコントローラーとアクションを決定します。
例えば、以下はGETで`static_pages/home`というURLにアクセスした際のルートを定義しています。

```rb:config/routes.rb
get 'static_pages/home'
```
次に、ルートを元にコントローラーにアクセスします。
`static_pages/home`であれば、`static_pages_controller`の`home`アクションにアクセスします。
以下のアクションに記述された処理を実行します。

```rb:app/controllers/static_pages_controller.rb
  def home
  end
```
その後、`app/view/"コントローラー名"/"アクション名".html.erb`の内容をviewとして表示します。
`static_pages/home`であれば、`app/view/static_pages/home.html.erb`です。

# テスト
テストは、コントローラーのテストあれば、`test/controllers`配下にあります。
例えば、以下であれば、GETでhomeにアクセスして、成功するかというテストです。

```rb:static_pages_controller_test.rb
  test "should get home" do
    get static_pages_home_url
    assert_response :success
  end
```
以下のコマンドで、テストを実行します。

```
$ rails test
```

# Rubyの埋め込み
`erb`ファイルにはRubyのコードを埋め込むことができます。
`<% 〜 %>`では括弧内の処理を実行するだけで、`<%= 〜 %>`では括弧内の処理の実行結果を挿入します。

また、`app/views/layouts/application.html.erb`が全体の共通テンプレートのようなもので、そのbodyタグ内の`<%= yield %>`の部分に、view配下のerbファイルが展開されるイメージです。

```erb:app/views/layouts/application.html.erb
  <body>
    <%= yield %>
  </body>
```
[LINE BOT]芸術を感じつつスムージーを嗜むLINE BOTを作ったwithおまけ

#目次
* はじめに
* 「芸術とスムージー　魅惑のコラボレーション」の概念図
* 実際に作ってみた
 * 苦労したところ
* おまけ
* 感想
* 参考にしたサイト、記事

#はじめに

※QRコードについては、[この記事](https://qiita.com/zerozeronineking/items/ee85baab0df731992606)を参照されたし。

protooutStudioに参加してからずっと、筋肉について、筋トレについて考えてきた。
考えるうちに、自分は何故これ程までに筋肉に魅かれているのだろうかと自問するようになった。

ある日、自宅にあったルーベンス展の画集を見ていた時、ふと、思い至った。

**<font color="Red">肉体美だ、と</font>**。

思えば、人は肉体を重要な評価軸にしているきらいがある。
古代ギリシャでは、肉体は神の贈り物であり、肉体を鍛え上げることで神への感謝を表したという。
また、中世ヨーロッパでは、肉体美に純粋無垢なる側面を見出し、筋トレをすることで神と一体化しようとしていたらしい。

そう考えると、自分が**<font color="Red">筋肉に、筋トレに魅かれるのは当然の摂理なのだ</font>**。

そして、それは皆さんにも当てはまるはずだ。

自分は、そういう人たちをサポートしたい。そのための、「哲学的筋肉BOT」だ。

さあ、筋トレをしよう！そして、古来のロマンに思いを馳せてみよう！

#「芸術とスムージー　魅惑のコラボレーション」の概念図
7/13(土)のLINE Thingハッカソンに参加した際に作成した[「スムージーチェッカー」](https://qiita.com/zerozeronineking/items/78fc1860d8726944f0f0)を改良したモノで、Youtube Data APIを使ってみた。
<img width="633" alt="cc7eb9121a4275c0c2cc4da97152032e.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341829/b90ad8a5-ee9f-4410-30e6-fda3fa1a3f5e.png">

#実際に作ってみた
●開発環境
Node.js v10.16.0
npm v6.9.0
Windows10 pro

Youtube Data API の取得方法については、[この記事](https://qiita.com/chieeeeno/items/ba0d2fb0a45db786746f)をご参考にされたし。
3年前の記事だが、問題なくAPIを取得できる。

●コード
[Github](https://github.com/KumaKing009/artSmoothie)に公開しているので、そちらをご参考にされたし。

#おまけ
当初、リッチメニューを実装し、美術館の位置をプッシュするようにしたかったが、結構躓きポイントがあったので、それを共有したい。

①curlの使い方 in Windows User
[公式サイト](https://developers.line.biz/ja/docs/messaging-api/using-rich-menus/)によると、リッチメニューを作るにはcurlコマンドでhttpリクエストを叩かなければならないという。
当時はcurlについて知らなかったので、インターネットでcurlコマンドについて調べたが、MacかLinux基準のコマンドしか出てこなかった。なので、requesterrorが続き、心が折れかけた。
そんなとき、[このような](https://qiita.com/tokoroten-lab/items/291b463e45f422abd425)[サイト](https://qiita.com/yamachan360/items/8c928738289cd518eec8)を見つけた。それらの内容通りにやったら、無事リッチメニューを実装できた。勝手ながら、記事の筆者様方に感謝したい。
拙作のコードについては、[Githubに投稿した](https://github.com/KumaKing009/smoothieBOT)ので、参考にされたし。

最終的にリッチメニューを実装できたが、
**美術館の場所が分かったところでどうだっていう**。。。
なので、今回は実装を見送った。

#感想
最初は、curlって何だ…？httpリクエストって何だっけ…？という状態だった。
そんな中、試行錯誤を繰り返してリッチメニューを実装できたのは、本当に嬉しかった。
出来なかったことが出来てくる感覚は、非常に新鮮で、しかし芯から達成感、充実感を味合わせてくれる。
**<font color="Red">これは、筋トレと同じである</font>**。こうして理想に近づいていくのだ。

これからも、筋肉について、筋トレについて思考し、肉体美の実現を支えられるモノを開発していきたい。

それはさておき、今後の展開として、ロボットの操作とLIFFを考えている。
ロボットは、プロテインスムージーを運んでくれるモノ。
LIFFは、筋トレのメニューを表示して、回数を記録してくれるモノをとりあえず作りたい。
obnizを使ったら楽に実装できるか。

理想のLINE BOTは、筋トレメニューを組んでくれて、それに合ったプロテインスムージー(もしくはそれのレシピ)をプッシュしてくれるモノ。なおかつ、カロリー計算や、お気に入りの女優が応援してくれるUIがあるとなおいいとも思っている。

いつ頃実現できるかわかりませんが、地道に進めていきます！

※後日、動画を掲載予定

#参考にしたサイト、記事
◎腹筋カウンター。
https://qiita.com/karu/items/87e79eeb3c3a0892d00a
◎curlコマンドについて。
https://viral-community.com/security/curl-8263/
◎Youtube Data API で取得できる情報について。
https://hafilog.com/youtube-data-api
memo

https://github.com/pixelspark/corespark/blob/master/Libraries/atlmfc/src/mfc/dlgcore.cpp
https://learn.microsoft.com/ja-jp/cpp/mfc/using-the-mfc-source-files?view=msvc-160

静的解析
人がやることじゃないと思う。つまんねー指摘はツールに任せたい。
https://docs.microsoft.com/ja-jp/visualstudio/test/analyze-cpp-code-quality-of-store-apps-using-visual-studio-static-code-analysis?view=vs-2015

SAL
ライブラリー、ユーティリティのpublicなメソッドに限定するのがよさそう。
https://docs.microsoft.com/ja-jp/visualstudio/code-quality/understanding-sal?view=vs-2015&redirectedfrom=MSDN

IDisposableのお作法
using (new MyDisposeAction(() => {Dispose時の処理}))みたいなの、try-finallyでいいじゃん。Dispose使いたいだけの本末転倒な感じがする。
https://docs.microsoft.com/ja-jp/dotnet/standard/garbage-collection/implementing-dispose

仮想関数のオーバーライドにはoverrideキーワードを使おう
仮想関数の引数が変わったりとか、overrideをつけていればコンパイラーがエラーにしてくれる。人
https://qiita.com/yumetodo/items/f3ceb1a64a1540f85568

変数の生存区間は明確にしよう
長大な関数の中を中括弧で段落みたいにしてるの、なんなん? その中でしか使わない変数を中括弧の外で定義しているのはどうしてなの?

拡張メソッドは適切に使おう
拡張メソッドの体裁なのに第一引数使ってないとかただのstaticメソッドじゃん。市販のクラスとかを「拡張」する程度にとどめてほしい。

シングルトンじゃないじゃん
体裁はシングルトンなのに、そのクラスのとあるpublicメソッドが呼ばれると何か処理した後Disposeが呼ばれてその中で_instanceにnullを入れてる。_instanceいらないし、usingでいいじゃん。

1行に詰めて書かないでください
視線を真横に移動させられるから読みづらい。本筋の処理は視線を上から下に移動したら読めるよう書いてください。お願いします。
【Java】本当は怖いswitch文の話

# はじめに

随分前に、私自身がswitch文でしくじった時の話をまとめてみました。
非常に恥ずかしい話ですが、再び同じような事故が起きないように、記事としてまとめてみました。


# 1. 初期状態

* 以下のTestServlet.javaのように、リクエストパラメーターの値に基づいて処理を振り分ける目的で、switch文を利用していました。
* 実際には条件分岐の数が10個近くになっていたので、if文にせずswitch文を採用しました。

```java:TestServlet.java
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		// リクエストパラメーターの"id"の値を取得する。
		int id = Integer.parseInt(request.getParameter("id"));

		// "id"の値に基づいて処理を振り分ける。
		switch(id) {
		case 1:
			// 処理1-A
			break;
		case 2:
			// 処理2-A
			break;
		case 3:
			// 処理3-A
			break;
		default:
			// デフォルト処理
			break;
		}
		...
	}
}
```

# 2. 機能追加に伴う改修

* 機能追加に伴ってswitch文内の処理が増えたため、以下のようにswitch文が全体的に肥大化しました。
* この時、コードを書いたり消したり繰り返している内に、**誤って一か所のbreakを消してしまっていた**ようです。
 * switch文が肥大化していたため、breakを消したことに全く気が付きませんでした...
 * **ちなみに、breakを消してもコンパイルエラーにはなりません！**

```java:TestServlet.java
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		// リクエストパラメーターの"id"の値を取得する。
		int id = Integer.parseInt(request.getParameter("id"));

		// "id"の値に基づいて処理を振り分ける。
		switch(id) {
		case 1:
			// 処理1-A
			// 処理1-B
			// 処理1-C
			break;
		case 2:
			// 処理2-A
			// 処理2-B
			// 処理3-C（★この直後のbreakを消してしまった...）
		case 3:
			// 処理3-A
			// 処理3-B
			// 処理3-C
			break;
		default:
			// デフォルト処理
			break;
		}
		...
	}
}
```

# 3. 事故発生

* 機能追加したコードをリリースした後、しばらく経ってからユーザーから「システムの動きが変だ」との問い合わせがありました。
* 単体テストからシステムテストまで、全てのテストに通っていたはずなのに...と思いながら詳しく調べてみると、確かに処理結果が変だと分かりました。

|パラメーターidの値|期待している処理結果|実際の処理結果|
|---|---|---|
|1|X|X|
|2|Y|Yではない|
|3|Z|Z|
|その他|α|α|

# 4. 事故の理由

* switch文からbreakが消えてしまった箇所で、全く意図していない**「フォールスルー」**が発生していました。
 * 上記の通り、breakが消えてもコンパイルエラーが発生するわけでもないので、コードをよく読まないと見落としてしまいます...
* テストを通過していたのは、「条件分岐を網羅したテストをしていなかった」ことが原因。
 * ただし、全ての条件分岐を網羅するテストを作るのは、かなり骨が折れる...

# 5. 事故後の対処

* ベストな対応ではないと思いますが、私の中では「switch文をむやみに使わない」としました。
 * 今回の事故原因は「肥大化して見通しが悪くなったswitch文」なので、「switch文を使う時は、switch文の全体がスリムで見通しが良いことが前提」というマイルールを作りました。
 * そもそも「見通しの良くないコード」自体が問題なのですが、「意図しないフォールスルー」を防ぐためには、無思慮にswitch文を使わない方が無難だと考えました。（"switch文アレルギー"かもしれませんが...）
* よく考えてから単体テストを作るように、これまで以上に心掛けるようにしました。
 * ちょっとした改修でも、デシジョンテーブルを使ってテストパターンを洗い出すなど、これまで以上にテストパターンの取りこぼしをなくす工夫をするようになりました。（意識低すぎでしょと言われそうですが...）
 * 当時はCoberturaなどで分岐レベルの網羅率を確認するなど、客観的な指標も利用するようになりました。

# 参考URL

* [switch文の危険な使い方](https://www.linuxacademy.ne.jp/lablog/programmer/861/)
* [すごいswitch文に出会った](https://qiita.com/segur/items/b11702d5360feeeab0f9)
【Kotlin】Sequenceでスターリンソート

スターリンソートは [`Sequence`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/-sequence/index.html) 向きです。
普通のソートでは内部処理にリストが必要になりますが、
スターリンソートでは不要です。

というわけで、実装しました。

```Kotlin
fun <T : Comparable<T>> Sequence<T>.stalinSorted(): Sequence<T> =
    stalinSortedWith(naturalOrder())

fun <T : Comparable<T>> Sequence<T>.stalinSortedDescending(): Sequence<T> =
    stalinSortedWith(reverseOrder())

inline fun <T, R : Comparable<R>> Sequence<T>.stalinSortedBy(
    crossinline selector: (T) -> R?
): Sequence<T> =
    stalinSortedWith(compareBy(selector))

inline fun <T, R : Comparable<R>> Sequence<T>.stalinSortedByDescending(
    crossinline selector: (T) -> R?
): Sequence<T> =
    stalinSortedWith(compareByDescending(selector))

fun <T> Sequence<T>.stalinSortedWith(
    comparator: Comparator<in T>
): Sequence<T> = sequence {
    val itr = iterator()
        .takeIf { it.hasNext() }
        ?: return@sequence

    var previous = itr.next().also {
        yield(it)
    }

    while (itr.hasNext()) {
        itr.next()
            .takeIf { comparator.compare(previous, it) <= 0 }
            ?.also {
                yield(it)
                previous = it
            }
    }
}
```

一人ずつ呼び出され、粛正されたものは帰ってこない。
『スラスラ読めるJavaScriptふりがなプログラミング』

で、勉強を始めました。ちょっと前からですが。

今日は、p.46からp.69まで。第1章「JavaScript最初の一歩」を終えて第2章「条件によって分かれる分を学ぼう」に入ったところで切り上げました。以下、今日覚えたことと思ったことです。

- promptで入力した値は全部文字列ということ？
- だからparseIntで数値にするのね
- メソッドとプロパティは、この段階で理解しようとすると先に進めなくなりそうなので流し読み:ok_hand_tone3:
- ifは括弧を伴うけど、関数とは言わないの？（本書でもif文と記述）
- ほほぅ、elseは続けざまに書けばいいのか

今日はたいしたことしていないので、こんなもんかな。次回はもっと頑張ります！ ← 口だけっぽい
ES2015(ES6)から追加されたオブジェクトのキー名に変数を使う方法

# 最初に
ES2015から、オブジェクトのキー名の記述が便利になったのでその記述を紹介する。

# TL;DR
以下の記述をすることで、オブジェクトを作成する際にもキー名に変数が使用できる。
変数を[]で括ることで、変数の値がキー名となる。

```javascript
var keyName = "age";
var user = {name: "kanade", [keyName]: 17}; 
console.log(user); // { name: 'kanade', age: 17 }
```

# 今まではどうだったか
上記の記述が使用できないため、オブジェクトのキーに変数を使用したい場合は
一旦変数を作成した後に、`[]` で変数を括ってやる必要があった。

```javascript
var keyName = "age";
var user = {name: "kanade"};
user[keyName] = 17
console.log(user); // { name: 'kanade', age: 17 }
```

# 最後に
実際に使う場面はあまりないかも知れないが、知っているとシンプルにかけるので良いと思います。
ReduxのReducerでは、新しいStateを作成するときにスプレッド演算子を使用することが多いので、割と使い所ではないだろうか。
hackerrankでより早く成長するには？

どうも未来電子でインターンをしているものです。
今回はhackerrankでどのようにすれば成長できるのかを自分なりに考えてみました。

私はプログラミング初心者であるため間違っていることがあるかもしれませんが、お手柔らかにお願いします。

#目次
・まずは自分で考える
・長くても20〜30分以上は考えない
・自分でできても一応Discussionsを見る

#まずは自分で考える
始めたては何もわからないためすぐに答えを見てもいいかもしれません。
しかしある程度わかるようになれば自分で考えることが重要です。

自分なりにコードを書いていくことで、自分の知識をアウトプットし、
同時に、わからない部分を調べることでインプットもできます。

私も問題を説いていく中でソートの使い方、辞書のキーの取得といった基本的なことを身に着けていっています。

#長くても20〜30分以上考えない
私は自力でときたいという性格であるため時間を大量にかけてしまうことがあります。

しかしこれは非効率的です。


それほど時間がかかる時点でほとんどわかっていないのですからその場合
先に答えを見てインプットする方が優先順位が先です。


#自分でできても一応Discussionsを見る
これは私もあまり実践できていないことです。
自分で書いたコードが通ったからと言ってよりきれいな解答を求めず、それで満足してしまうことがあります。

例えばある問題で私の解答は次のようになりました。
(https://www.hackerrank.com/challenges/2d-array/problem)

>```
def hourglassSum(arr):
    b = []
    c = 0
    for i in range(0, 4):
        for a in range(0,4):
            dex1 = arr[i]
            c += dex1[a] + dex1[a+1] + dex1[a+2]
            dex2 = arr[i+1]
            c += dex2[a+1]
            dex3 = arr[i+2]
            c += dex3[a] + dex3[a+1] + dex3[a+2]
            b.append(c)
            c = 0
    return max(b)
```

Discussionsを見てみると

>```
def hourglassSum(arr):
    total = []
    for i in range(4):
        for j in range(4):
            total.append(sum(arr[i][j:j+3]) + arr[i+1][j+1] + sum(arr[i+2][j:j+3]))
    return max(total)
```

という別解がありました。

処理している内容はほとんど同じなのですが、
簡潔に表現しているためどんな処理をしているかが私のよりもわかりやすいです。

このとき私はリストの中のリストを表現する方法がわからなかったため自己流でしていました。
しかしこの解答を見ることによってよりきれいな表現の仕方を学ぶことができました。

このように、他の方の、より洗練された解答を見てそれを真似ることが重要です。

#まとめ
私も以上のことをきちんと実践できていないため、
気をつけていきたいですzzz
月末だけ失敗するspecテストと対策(テストを時刻に依存させるな運動)

この記事で言う現在時刻というのは、例えばTime.zone.nowとか、Date.current, Date.todayのような、今日とか現在時刻、をとってくるメソッドのことです。
railsではtimezoneの扱いを大事にするため、Time.nowじゃなくてTime.zone.nowを使う、みたいなノウハウがありますが、今回の話はそれとは関係がありません。
specテストにおいて、そういう「現在時刻に関するメソッド」を安易に使うと、「特定の日だけ落ちるテスト」「特定の時間だけ落ちるテスト」になりやすいのでやめよう、という話。

# 例えばこんなケース

> 渡されたdateに対して、その月の残りの日付を配列で返す関数 remaining_days_of_month を作ります。例えば 1/28が渡されたら、***[29,30,31]*** を返します。31日だと、残りの日付はないので ***[]*** です

コーディングテストに良さそうな題材ですね。これをどうにかして実装したとして、この関数に対するspecテストを考えましょう。

「これ、引数に渡したその日は含まれないのよね」

```ruby
it 'not contains the day' do
  expect(remaining_days_of_month(Time.zone.today)).not_to include Time.zone.today.day
end
```

「で、その次の日から始まる、と」

```ruby
it 'contains next day' do
  expect(remaining_days_of_month(Time.zone.today)).to include Date.tomorrow.day
end
```

いろいろつっこみどころはあるかと思いますが、話の都合で、これがコードレビューを通ったことにしましょう。テストはなにか書いてあればOKという職場、あるでしょ？

# 月末の悲劇

月末の夜、リリースに向けてコードを書く職場で悲鳴が上がります。
「なんかテスト落ちてるぞ！」
「Aくん、rspec落ちてるから確認して」

AくんはCircleCIで落ちた箇所を確認します。おかしいな。こんなところ触ってないのに、これ一体何なんだろう...触ったこともないところだから全然わからん...これぼく関係ないんじゃないの？だからテストって嫌いなんだ...

# 問題

簡単な例なので大半の方は気づいていると思いますが、問題のコードはこれです。

```ruby
it 'contains next day' do
  expect(remaining_days_of_month(Time.zone.today)).to include Date.tomorrow.day
end
```

このコード、通常はテストが通りますが、月末最終日に限り、Time.zone.todayはその月、Date.tomorrowは翌月を指すようになるのでテストが失敗します。

この一行なら誰だってわかるけど、これ１０行くらい書いた中に埋め込まれると結構わからなくなるのです....

# 対策

よく言われる対策は「TimeCop / TimeHelpersを使って時間を固定する」です。

ですが、正直この程度のことにそんな大道具持ち出すのもどうなのよ、そういうことしていると、今度は開放し忘れて別の箇所で悲劇を引き起こすんじゃないの？

ぼくがすすめている対策は、「rspecで現在時刻は使わない」です。

例えば今回のテストはどう書くのが正解だったのか。

```ruby
describe 'remaining_days_of_month' do
  it 'contains remaining days' do
    let(:date) { Date.new(2019, 1, 28) }
    expect(remaining_days_of_month(date)).to match_array [29, 30, 31]
  end
end
```

テスト日付を固定します。そうすると答えもおのずから決まるから、includeじゃなくてmatch_arrayで確認することができる。

そもそも、テストを実施する日によってテスト内容が変わる時点でおかしいですよね。specテストに書いたコードにバグがあっても、specテストをspecテストすることはできないのだから、テストは可能な限りシンプルなロジックであるべきで、Time.zone.nowみたいに値が変わるものを使うのは良くないことです。

# よくある反論

よくある反論は、「現在時刻使っておけばいろんな日付が試せるから潜在バグを洗い出せるよ」です。

**甘えるんじゃねえ！**

その潜在バグとやらが自分の手元で見つかるのならともかく、わけのわからんタイミングで爆発して始末させられる方の身にもなってください。

境界値が不安なのであれば、自分でテストを書きましょう

```ruby
  it 'contains remaining days' do
    let(:date) { Date.new(2019, 1, 28) }
    expect(remaining_days_of_month(date)).to match_array [29, 30, 31]
  end
  it 'return empty at the end of the month' do
    let(:date) { Date.new(2019, 1, 31) }
    expect(remaining_days_of_month(date)).to match_array []
  end
```

# 使っても良いケース

メソッド内に現在時刻が使われている場合、テスト側も現在時刻を使わざるを得ないケースがあります。
例えば、「今日以降の日付を配列で返す関数」のような場合です。

ただこの場合でも、こういう実装にしてあれば、現在時刻を使わなくてもテストすることができます。

```ruby
# 指定された日以降の日付を配列で返す. 省略すると当日が使われる
def remaining_days_of_month(date = Time.zone.today)
:
```

この辺の実装の工夫について、下記が詳しいです。

[「現在時刻」を外部入力とする設計と、その実装のこと](https://techlife.cookpad.com/entry/2016/05/30/183947)

で、いろいろな事情によりそこまでやれない場合に、TimeHelpersで時間を固定した上で、Time.zone.now/Time.zone.todayを使うのは仕方ないかなあ、という感じですね。
specテストにおいて、固定しないTime.zone.now/Time.zone.todayを使ってよい場面は存在しません。

# まとめ

現在時刻を使うことによって、月末だけ失敗するrspecバグを埋め込むパターンを説明しました。

いくつかのrailsプロジェクトを渡り歩いていて、このルールはあたりまえのように守られているところもあれば、どんなに説明してもご理解いただけないところもあったりして苦労しています。
この記事を示すことで誰でもわかってもらえるようになるといいなあ。
LaTeXでヘッダとフッタを見出しページでも統一したい

この記事では，LaTeXのドキュメントクラス（`jsreport`など）において全ページ（chapterが始まる見出しページ等を含む）のヘッダやフッタを統一する方法を示します．

LaTeXでファイルを生成する際，ヘッダやフッタを挿入したい場合があります（実際にはいったんdviファイルが作られ，そこからpdfなどのファイルに変換されますが，仕組みのお話はここではしません）．文書クラス（`jsreport`や`book`など）にはそれぞれ，デフォルトのヘッダやフッタがあります．それぞれの文書クラスで定義されたデフォルトの物を使いたくないことがあるかもしれません．

# LaTeXでのヘッダやフッタの編集方法
ヘッダを編集するにはページスタイルを変更することで可能です．プリアンブルで`\pagestyle{plain}`のように指定します．主に次のものがあります．

- plain
- empty
- headings
- myheadings
- fancy （利用するには`fancyhdr`パッケージを読み込む必要があります）

例えば`fancy`の場合，次のようにプリアンブルに置くことでページスタイルを決めます．詳しくは Page layout in LaTeX [1] を参照してください．

```latex
\documentclass[a4paper]{jsreport}
\usepackage{fancyhdr}
\pagestyle{fancy}
    \lhead{ヘッダ左} %ヘッダ左
    \chead{ヘッダ中央} %ヘッダ中央
    \rhead{ヘッダ右} %ヘッダ右．コンパイルした日付を表示
    \lfoot{フッタ左} %フッタ左
    \cfoot{\thepage} %フッタ中央．ページ番号を表示
    \rfoot{フッタ右} %フッタ右
% \renewcommand{\headrulewidth}{} %ヘッダの罫線
% \renewcommand{\footrulewidth}{} %フッタの罫線
\begin{document}
.
.
\end{document}
```
このようにしてページスタイルを決めて，ヘッダやフッタを編集します．上記の設定の場合は，以下の画像のようになります．
<img width="1552" alt="Screen Shot 2020-06-20 at 20.16.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425475/4c54987f-477d-301d-8b33-875d4dce9875.png">
# LaTeXやupLaTeXでの見出しページ
`\chapter`や`\section`といったコマンドは見出しと呼ばれます．

デフォルトでは次のようになっています[2]:

```latex:\chapter
\renewcommand{\chapter}{%
	\if@openleft\cleardoublepage\else
	\if@openright\cleardoublepage\else\clearpage\fi\fi
	\plainifnotempty %元: \thispagestyle{plain}
	\global\@topnum\z@
	\if@english \@afterindentfalse \else \@afterindenttrue \fi
	\secdef
	{\@omit@numberfalse\@chapter}%
	{\@omit@numbertrue\@schapter}}
```

`\pagestyle`が`empty`に指定されていない場合は，そのページのページスタイルが`plain`になります．章扉のページはページ番号がヘッダ右側に記載され，プリアンブルでヘッダやフッタを編集しても効果がありません．なお，`jsreport`や`jsbook`などの`\chapter`が利用可能な文書クラスでは，章扉のページは右側のページに配置されます．

# `\chapter`を“再再定義”してしまえ
`\chapter`のすぐうしろに`\thispagestyle{}`を用いることも可能です．ただし，この記事では別の方法を示します．

ヘッダやフッタの様式をすべてのページで統一したいけれど，これができない原因は，前章で示した`\chapter`の定義にあります．LaTeXには，定義されたコマンドを再定義し，再定義されたコマンドを使うことができます．プリアンブルで，次のように再定義しておきます．`\plainifnotempty`がある行を消すだけです．以下の内容を，プリアンブルに記述します．なお，LaTeXに対する理解が不十分な場合は，`\def`を用いないようにしましょう．「LaTeXが壊れた！」事態になりかねません．

```latex:\chapter
\makeatletter
\renewcommand{\chapter}{%
	\if@openleft\cleardoublepage\else
	\if@openright\cleardoublepage\else\clearpage\fi\fi
	%\plainifnotempty %元: \thispagestyle{plain}
	\global\@topnum\z@
	\if@english \@afterindentfalse \else \@afterindenttrue \fi
	\secdef
	{\@omit@numberfalse\@chapter}%
	{\@omit@numbertrue\@schapter}}
\makeatother
```

このように再定義することでプリアンブルで定めたヘッダやフッタがそれぞれの章扉ページに記述されます．

<img width="1552" alt="Screen Shot 2020-06-20 at 20.32.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425475/6ecdcc00-5efc-0102-7cc4-dc5b8df97804.png">

# Reference
[1] Piet van Oostrum, *Page layout in LATEX*
[2] 奥村晴彦, *pLATEX2ε 新ドキュメントクラス*

##### 補足

- これらのマニュアルは，コマンドプロンプトやターミナルでそれぞれ次のように入力すると，マニュアルが開きます:

```terminal
$ texdoc fancyhdr
$ texdoc jsclasses
```

- ここで紹介した方法を実際に用いる場合は自己の責任のもとで行うよう，お願します．
vpsの比較

#概要

vpsの比較してみた。

#比較

| 　　　　　　       |   さくら    |  conoha    |カゴヤ|webarena|idcf|gmo|cloudn|お名前|ServersMan|Lightsail|
|:-----------------|:-----------|:------------|:---|:----    |:---|:---|:---  |:---  |:--- |:--- |
| 最小プラン        |    685円   |   630円      |864円| 360円 | 500円|780円|850円|896円|350円 |420円|
| クレジットカード   |    ○       |     ○       | ○   | ○      | ○   |  ○  |  ○  |  ○  |  ○  | ○   |
| 銀行振込         |     ○       |     ×       | ×   | 800円  | ○   |  ○  |  ×  |  ○  |  ×  | ×   |
| 口座振替         |     ○       |     ×       | ○   | 800円  | ○   |  ×  |  ×  |  ○  |  ×  | ×   |
| centos          |     ○       |     ○       | ○   | ○      | ○   |  ○  |  ○  |  ○  |  ○  | ○   |
| debian          |     ×       |     ○       | ○   | ×      | ○   |  ○  |  ×  |  ○  |  ×  | ○   |
| ubuntu          |     ○       |     ○       | ○   | ○      | ○   |  ○  |  ○  |  ○  |  ×  | ○   |
| kusanagi        |     ○       |     ○       | ×   | ○      | ○   |  ○  |  ○  |  ×  |  ×  | ×   |
| 逆引き           |     ○       |    ○        |  ○  | ×      | ○  |  ○  |  ○   |  ○  |  ○  | ○  |


以上。
Leetcode #852: Peak Index in a Mountain Array

Solution 1: Intuitive

```swift
func peakIndexInMountainArray(_ A: [Int]) -> Int {
    for i in stride(from: 1, to: A.count, by: 1) {
        if A[i] < A[i-1] {
            return i-1
        }
    }
    return -1
}
```

Solution 2: Binary Search

```swift
func peakIndexInMountainArray(_ A: [Int]) -> Int {
    var start = 0
    var end = A.count - 1
    while start < end {
        let mid = start + (end - start) / 2
        if A[mid] < A[mid+1] {
            start = mid + 1
        } else {
            end = mid
        }
    }
    return start
}
```
動的計画法（DP）の勉強法まとめ

動的計画法（DP）を勉強したときの方法をまとめておきます。

# 蟻本を読んでコードを書いた
[蟻本](https://www.amazon.co.jp/dp/4839941068/)には、単純な再帰（もちろんTLE） → メモ化再帰（これでもAC） → DPに発展的に書き換えていく手順が載っていますので、これを読んで理解し、自分の理解だけをもとにコードを書いて書き換えていってみました。
この時点ではDPをメモ化再帰からの書き換えなしにいきなり書けるようになる気はしませんでした。しかし、漸化式で書ける問題はDPで解けるんだなということはわかりました。つまり、文字列だか数列だかが与えられたとき、どちらかの端から順番に処理していって、今処理している桁より前の桁の結果だけをもとに今の桁の結果が求まるなら、DPで書けるということです。

# ABC135 D問題がDPで解けた
ちょっと考えて「端から順番に処理して、今処理している桁より前の桁の結果だけをもとに今の桁の結果が求まる」ということは分かりましたが、DPをいきなり書ける気がしなかったので、メモ化再帰を書くことにしました。
ところが、この時点で```sys.setrecursionlimit```を知らなかったのでメモ化再帰が再帰深さ上限オーバーでREしてしまいました。仕方なく唸りながらDPに書き換え、ACすることに成功しました。リアルタイムにコンテスト参加していたからこそ自力でここまで考えられたと思います。
これでちょっと自信がつきました。

# ABC129 C問題がDPだということを知って解いてみた
この問題はDPを勉強し始める前に、壊れている段で区切ってその間の組み合わせを求める力技で解いていました。しかし[この記事](https://note.mu/cbox360/n/n7cc967a7df83)でDPで解けるということを知り、解法は読まずに自力でDPを書いてみることにしました。
壊れている段は0、壊れていない段はdp[i-2] + dp[i-1]というだけの単純なdpなので、慣れないいきなり書きで時間はかかりましたがACできました。

# Educational DP Contestを解いてみた
優しい人が[Educational DP Contest](https://atcoder.jp/contests/dp/tasks)というものを作ってくれていたので、Aから順番に解きました。Eのようなイレギュラーなもの（蟻本に解説があります）は初見では解けませんでしたが、他の問題は意外にもいきなり書けるようになっていました。
[最短実行時間の人のコードを読む](https://qiita.com/yutasth/items/74f7378653a6727de06b#解けた問題でも最短実行時間の人の解答を読んで理解する)と、dpの範囲を絞ったり、空間計算量が小さかったりと、恐ろしくエレガントな解答があってかなり勉強になりました。

# 未完
まだ長いDP坂を登り始めたばかりです。よい課題などあればぜひ教えてください。
Leetcode #977: Squares of a Sorted Array

```swift
func sortedSquares(_ A: [Int]) -> [Int] {
    var start = 0
    var end = A.count - 1
    var result = Array(repeating: 0, count: A.count)
    var index = A.count - 1
    while start <= end {
        if A[start] <= 0 && A[end] <= 0 {
            for i in stride(from: start, through: end, by: 1) {
                result[end-i] = A[i] * A[i]
            }
            break
        } else if A[start] >= 0 && A[end] >= 0 {
            for i in stride(from: start, through: end, by: 1) {
                result[i-start] = A[i] * A[i]
            }
            break
        } else if A[end] > -A[start] {
            result[index] = A[end] * A[end]
            end -= 1
            index -= 1
        } else {
            result[index] = A[start] * A[start]
            start += 1
            index -= 1
        }
    }
    return result
}
```
【swift 5】 AVSpeechSynthesizer で英語→日本語→英語→日本語と交互に話すアプリ

AVSpeechSynthesizer で英語→日本語→英語→日本語と交互に話すアプリを作ってみました。AVSpeechSynthesizer は一個の String を喋ると終了してしまいます。複数の String や複数の言語を喋らせるには工夫が必要です。
![Speech.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193431/a75f3409-6d74-8f38-6fe0-979347fa5798.gif)
以下のコードをコピペして IBAction func speechButtonPushed() を画面のスピーチボタンに紐付けます。

```swift
import UIKit
import AVFoundation

class ViewController: UIViewController, AVSpeechSynthesizerDelegate {

    let synthesizer = AVSpeechSynthesizer()
    var speechCounter = 0
    var speechText = [String]()
        
    override func viewDidLoad() {
        super.viewDidLoad()
        synthesizer.delegate = self
        let english = "alternately"
        let japanese = "交互に"
        let sentence = "This app speaks English and Japanese alternately."
        let yaku = "このアプリは英語と日本語を交互に話します。"
        speechText = [english,japanese,sentence,yaku]
    }
    
    @IBAction func speechButtonPushed(){
        speechCounter = 0
        speech(text: speechText[0])
    }
    
    func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) {
        speechCounter += 1
        guard speechCounter < speechText.count else {return}
        speech(text: speechText[speechCounter])
    }
    
    func speech(text: String) {
        let utterance = AVSpeechUtterance(string: text)
        switch speechCounter {
        case 0, 2:
            utterance.voice = AVSpeechSynthesisVoice(language: "en-US")
        case 1, 3:
            utterance.voice = AVSpeechSynthesisVoice(language: "ja-JP")
        default:
            break
        }
        synthesizer.speak(utterance)
    }
}
```
【Swift】URLにdictionary型でoptionalパラメータを付与する対応

# 背景
APIを叩くときのURLの処理で、オプショナルの値をパラメータに追加したいという背景で躓いたところが今後にも活かせそうなのでメモ。


# 前提
* オプションで追加するパラメータ（クエリ）がある
* パラメータの表示を状況に応じて以下のの三つで分けたい

| Pattern | URL sample |
|:---|:---|
|show|~/id=123&opt=bar|
|blank|~/id=123&opt=|
|nil|~/id=123|


# 追加前コード
```Swift
//  適当にAlamofireなど使用
// 以下のparametersで状況に応じてもう一つオプショナルなパラメータを追加して返したい
struct APIRequest {
    public var method: HTTPMethod { return .get }
    public var path: String { return "/path_dayo" }
    public var parameters: [String: Any]? {
        return ["id": id]
    }

    private let id: String

    public init(id: String) {
        self.id = id
    }
}
```

# 改善策
## ボツ１　△
```Swift
struct APIRequest {
    public var method: HTTPMethod { return .get }
    public var path: String { return "/path_dayo" }
    public var parameters: [String: Any]? {

        if let opt = opt, !opt.isEmpty {
            return [
                "id": id,
                "opt": opt
            ]
        } else if let opt = opt, opt.isEmpty {
            return [
                "id": id,
                "opt": ""
            ]
        } else {
            return ["id": id]
        }
    }

    private let id: String
    private let opt: String?

    public init(id: String, opt: String) {
        self.id = id
        self.opt = opt
    }
}
```

### 備考
イニシャライズ周りは普通に。
分岐は`if`で行った。


だけれども`optional`を`unwrap`しなきゃいけないけど毎回する必要なくねってことで改良。


## 修正後　○
```Swift
struct APIRequest {
    public var method: HTTPMethod { return .get }
    public var path: String { return "/path_dayo" }
    public var parameters: [String: Any]? {
        
        var dict: [String: Any] = ["id": id]
        guard let unwrappedOpt = opt else { return dict }
        dict["opt"] = unwrappedOpt
        return dict

    }

    private let id: String
    private let opt: String?
 
    public init(id: String, opt: String) {
        self.id = id
        self.opt = opt
    }
}
```

### 備考
固定で返す`id`を`dictionary`で宣言。
`guard let`でアンラップすれば、後続処理を端折って`nil`だったら宣言済の値だけ返る、というフローができる。
値が入っている場合は
`dict["opt"] = unwrappedOpt`
で追加すればOKで、`String`が空文字なら`~id=00opt=`で表示される。


## 更なる改良　◎ or △？
```Swift
var dict: [String: Any] = ["id": id]
dict["opt"] = opt
return dict
```

### 備考
率直にいうと、改善１の`guard let`では`nil`とそれ以外を分岐してるわけですが、単に`dictionary`に`nil`を追加すると値がないことになる（削除される）ので上記のような書き方が可能。


`nil`(optional)をそのまま突っ込むという行為が果たして好まれるのかどうかはわかりませんが、コードがスッキリします。


## まとめ / 学び
URLに`opt=`というブランクを残す、残さないにフォーカスした流れでした。
URL x Optional x dictionary でカテゴライズできる処理では今後も個人的にはヒントになりそうなもの。繰り返しそうなものまとめちゃえ！でもそれはダメ！精神を鍛えられた。

こうやって今読むと何にも難しくないフローなのに開発中はなぜか一瞬では閃かない。
引き出し増やしていきたい。
[VS Code]Remote Developmentで動かない拡張機能はポートフォワーディングしてみる

## はじめに

`Remote Development` すごい！はかどる！
でも、プレビュー機能をもつ拡張機能（ `Git History` , `Swagger Viewer` など）がうまく動いてくれない……。

と悩んでましたがちゃんと動きました、という報告。

|Name |Version |
|---|---|
|Visual Studio Code |1.36.1
|Remote Development |0.15.0
|OpenSSH for Windows | 7.6p1

## 結論

問題が発生する原因として、

1. 拡張機能は `http://localhost:xxxx` を使おうとする
1. **リモート側** のポートが使用される
1. `http://localhost:xxxx` にアクセスしようとする
1. このときの `localhost` の解釈が **ローカル側** になる
1. 当然ローカルのポートは機能していないので動作してないように見える

ということが考えられます。

したがって、これの対策として **ポートフォワーディング** することで解決しました。

## VS Codeでのポートフォワーディング方法

接続方式（ *SSH* , *Containers* ）によってやり方が異なるようです。

今回は *SSH* の方法しか試していないので、*Containers* の場合は [ドキュメント][container] を参考にしてみてください。

### SSH

* 一時的なポートフォワーディング

    VS Code上から一時的にポートフォワーディングを設定可能。
    1. コマンドパレット開く（ `F1` ）
    1. `Remote-SSH: Forward Port from Active Host...` コマンド実行
    1. ポート番号入力
    1. ポートフォワーディングの名称入力（空白可）

    以上でポートフォワーディングされます。

* 常時ポートフォワーディング

    リモート接続時には常にポートフォワーディングをしたい場合。
    `ssh_config`（一般的に `~/.ssh/config` ファイル）において、`LocalForward` 項目（ディレクティブ）を追記する。

    ```config:~/.ssh/config
    Host hoge
        HostName hoge.com
        User foo
        LocalForward localhost:8080 localhost:8080
    ```

    * `LocalForward` の **2番目の引数** における `localhost` は `HostName` （上記例では `hoge.com` ）を示す。

        ```config:LocalForwardの書式
        LocalForward [bindするアドレス:]<ローカル側ポート> <ホスト名>:<ホスト側ポート>
        ```

### Containers

[こちらのドキュメント][container] を参考にしてください。

## 拡張機能 `Git History` について

2019/7現在、使用するポートが固定されていない。
（参考：[Git Histrry don&#39;t work on vs code remote environment·Issue #389·DonJayamanne/gitHistoryVSCode](https://github.com/DonJayamanne/gitHistoryVSCode/issues/389)）

よって

1. `Git History` 起動
1. `出力 -> Git History` のログから使用するポートを確認
    ![githistory-log.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238841/c7361b23-f2da-c360-20b7-fe346b8e2ed5.png "Git History の起動ログ")
1. `Git History` タブを一度閉じる
1. 確認したポートでフォワーディングする
1. 再度 `Git History` 起動

という手順をとる必要があります。

### `Git Graph`（追記）

`Git History` と同様にコミット履歴をグラフで表示する拡張機能として `Git Graph` もおすすめです。
この `Git Graph` はリモートでもそのまま動いてくれる（本記事のような操作・設定が不要）ので、最近はこちらを使ってます。

GitHub: [mhutchie/vscode-git-graph](https://github.com/mhutchie/vscode-git-graph)

## おわりに

自分の環境ではRemote-SSH上だけ動かない拡張機能はポートフォワーディングが原因のものばかりでしたので、ポートフォワーディングすれば何とかなるはず。

ポートフォワーディングするのを思いつくまでに時間がかかったので今回記事にしました。
（というかすぐにドキュメント確認してれば……！）

とりあえず、これでますます `Remote Development` が気持ちよく使っていけそうです！

## 参考

* [Visual Studio Code Remote Development](https://code.visualstudio.com/docs/remote/remote-overview)
* [SSH_CONFIG (5)](https://euske.github.io/openssh-jman/ssh_config.html)

[ssh]:https://code.visualstudio.com/docs/remote/ssh#_forwarding-a-port-creating-ssh-tunnel
[container]:https://code.visualstudio.com/docs/remote/containers#_forwarding-a-port
LINEで減塩量を可視化しようとした話

#概要
IoTで減塩量を可視化できないかなと思っている時に
M5Stack Grayを手に入れたのでチャレンジしてみた話です。（Arduino環境触るの初）

[M5Stack Gray](https://www.switch-science.com/catalog/3648/)

題材としては日常でよく使う「醤油」を想定し、減塩量を測ってみることに。
今回はM5Stack Grayに標準搭載されている９軸センサーで、
傾斜を取得し、それをLINE Thingsを使ってLINEに送ってみます。

##構成
環境構築はMacとArduino IDEで。
・M5Stack Gray
・LINE Things
・enebular
・醤油瓶

![スクリーンショット 2019-07-30 21.55.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248994/a6d30882-0c20-e4c7-4457-40927f35088d.png)

#参考
LINE Things用のサンプルはこちら
https://github.com/line/line-things-starter/tree/master/m5stack

M5StackのMPU9250（９軸センサー）のサンプル
https://github.com/m5stack/M5Stack/tree/master/examples/Modules/MPU9250/MPU9250BasicAHRS
実行すると下記が表示される
![S__27779128.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248994/dcdfbf77-dbaf-4f56-94fd-0171d9a3ded3.jpeg)

これらを組み合わせて実装していく。

#実装メモ
実装にあたってのメモ


①M5Stackのディスプレイ調整
LINE ThingsとM5Stackを組み合わせた際に
表示崩れたのでLINE Things側のサンプルコードのLCD周りの記述を削除
　
②LINE Thingsへの通知設定
LINE Thingsの通知周りの設定がうまくいってなかったので、
「LINEで俺を呼べるボタン」を参考にenebularを設定

③データ量の制御
enebularを使ってLINE Thingsに傾きのデータを送るときに
制御しないとLINEアプリが落ちてしまうためdelay（1000）に設定して調整

今回は傾きでデータが送られて、LINEでアラート（通知）がいくようになったところまで。


#所感
傾きと傾けた時間から正確に使用量割り出せば、しっかり減塩量出せそう。
（減塩醤油使えばよくね？という話もあるが…）
あとはLINE Things使わない方が楽に実装できそうだなと思った。

やはりデータ可視化するならためた方が良いと思い、
M5StackでFirebaseにデータ送るところまでは下記を参考にしてやってみた。
[M5StackとFirebaseを使ってenebularとつないでみよう](https://blog.enebular.com/firebase/m5stack-firebase-enebular-collaboration/)
[M5StackとFirebaseを使ってenebularからトイレを流してみる](https://qiita.com/yamacho1111/items/b2ef97c02546f7684fec)

一旦ここまで。
【随時更新】時間がない人のAtCoder勉強法

[時間が取れない](https://qiita.com/yutasth/items/27b5dd2e2ec8aa9ab3d9)私が、効率的にやろうと考えて取り組んでいる勉強法をまとめておきます。

# 自分の実力を常に数値化する
## AtCoderを初めてやるとき
まず自分の現時点での実力を把握することにしました。過去問を数回やって解ける問題だけACし、システムに慣れて、実力ではないところでパフォーマンスが落ちないようにしました。それから数回ABCに参加して（レートは最初のうちは補正がかかるので）[パフォーマンス値を出し](https://atcoderapps.herokuapp.com/atcoderperformances/show_graph/?username=yutasth&rivalname=)、自分の実力を掴みました。

## コンテストはできるだけリアルタイムで出る
レートやパフォーマンスを見て実力を測りたいので、特にABCはできるだけリアルタイムで出るようにしています。
実力を測ることが目的なので、コンテスト中に分からない問題の解き方を調べることはしていません。思考力・実装力のトレーニングも兼ねて、分からなくてもひたすら考え、TLEっぽい解法しか思いつかなくても正解が出そうならTLEを出すまで書いています。

# 勉強法
## ひとつのアルゴリズムを集中して学ぶ
他のアルゴリズムに浮気せずひとつに集中して勉強し、自分で組めるようになるまで[類題をひたすらやっています](https://qiita.com/yutasth/items/420d5aeef6780f4584e8)。コンテストで自分が取り組むべき点数帯（下記）の中で解けなかった頻度が高いアルゴリズムから手をつけています。練習問題は[こういうまとめサイト](https://www.hamayanhamayan.com/entry/2100/01/01/000000)を参考にしています。

## 過去問は点数帯を絞って取り組む
時間がないので全埋めとかはできません。というか、上記のアルゴリズム勉強を優先しているので、ただ過去問をやる時間というのはほとんどありません。やるときには、[chokudai氏のツイート](https://twitter.com/chokudai/status/986561875344158720)を参考に、取り組むべき点数帯を決めます。AtCoderを始めた2019年7月時点で[自分は水色くらいだと認識した](https://atcoderapps.herokuapp.com/atcoderperformances/show_graph/?username=yutasth&rivalname=)ので、ABCのA, Bはやる意味がないと判断し、C（抜け漏れ確認のため）, D, Eのみに取り組みます。

## 計算量を考えてから書く
自分の書くアルゴリズムがTLEにならないかどうかは書き始める前に判断できるようになりたいと思っているので、考えてから書くようにしています。2019年7月時点では自分の見積もりにぜんぜん確信を持てていませんが、少しずつ向上していくつもりです。

## コンテストで解けなかった問題は、終了後にすぐ解く
問題の内容を忘れないうちに解説や最速コードを読んで理解し、自分で解いておきます。自分の分を超える点数帯の問題は割り切ってスルーしています。

## 解けた問題でも、最短実行時間の人の解答を読んで理解する
自力で解けた問題でも、よりエレガントな解答を出した人がいる場合がありますので、毎回確認するようにしています。
同じ問題＋同じ言語＋ACで検索し、実行時間でソートして、最短の人のコードを読みます。競プロ特化コード（マクロだらけ）とか変数名の命名規則が自分と違いすぎて読みにくい、とかはサッとスルーして、簡潔に書いている人を選びます。
読んで理解したら、お手本のコードは見ないようにして、自分の理解だけをもとにコーディングしてみます。ACが出れば完了です。

## 最適なアルゴリズムがわからなくても解けそうなら解いてみる
知っている知識を組み合わせて通す力も重要だと思っています。ただし、計算量を考えてTLEっぽいなと思ったら諦めます。

## 方針さえ見えない過去問は10分くらい考えたら諦めて調べる
アルゴリズムを知らなければ手もつけられない問題は往々にしてあります。数学的知識が必要なものとか。解説を読むと使うアルゴリズムの名前が載っていますので、それを手掛かりに調べます。
expand_pathについてのまとめ

##expand_path("./lib")
第二引数を指定しない場合は、カレントディレクトリを相対パスの基準にして、絶対パスに変換する。


##expand_path("lib", "User/****?Desktop/ruby_test")
第二引数にパスを指定する場合、指定したパスを相対パスの基準にして、絶対パスに変換する。


##expand_path("lib", __FILE__)
第二引数に__FILE__を指定する場合、 expand_path("lib", __FILE__)が記述されているソースファイルを相対パスの基準にして、絶対パスに変換する。



参照ページ
https://maeharin.hatenablog.com/entry/20130104/p1
startx で X を自動起動する

# 動機
使用しているノートパソコンに Fedora をインストールしているが、GUI 起動ができないため
# 実施項目
以下の設定をするだけです。

```Bash:/etc/profile.d/sh.local
#Add any required envvar overrides to this file, it is sourced from /etc/profile
if [ "${LANG}" != "ja_JP.utf8" ]; then
    export LANG=ja_JP.utf8
fi
if [[ -z "${DISPLAY}" && "${XDG_VTNR}" -eq 1 ]]; then
    exec startx
fi
```
（参考）
[xinit-Archwiki](https://wiki.archlinux.org/index.php/Xinit)

# /etc/profile を解読する

```
/usr/bin/id が実行可能であれば以下を実行
  EUID が空ならば、以下を実行
    EUID に /usr/bin/id -u と、UID に /usr/bn/id -ru を設定
    USER に usr/bin/id  -un を設定
    LOGNAME に USER を設定
    MAIL に /var/spool/mail/$USER を設定

EUID が 0 ならば、以下を実行
  PATH に /usr/sbin がなければ、PATH の最初に /usr/sbin を追加
  PATH に /usr/local/sbin がなければ、PATH の最初に /usr/local/sbin を追加 
上記以外なら、以下を実行
  PATH に /usr/local/sbin がなければ、PATH の最後に /usr/local/sbin を追加
  PATH に /usr/sbin がなければ、PATH の最後に /usr/sbin を追加

HOSTNAME に、/usr/bin/hostname の結果を設定
HISTSIZE に 1000 を設定
HISTCONTROL が ignorespace なら、以下を実行
  export HISTCONTROL=ignoreboth を実行
上記以外なら、以下を実行
  export HISTCONTROL=ignoredups を実行
次のコマンドを実行
  export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL

UID が 199 より大きく、id -gn と id -un が等しいならば、以下を実行
  umask 002
上記以外なら、以下を実行
  umask 022

/etc/profile.d/ 配下のスクリプトの実行
  その際、以下をチェック
      "${-#*i}" と "$-" が等しくなければ、以下を実行（$- は bashオプション）
           各スクリプトを順番に実行して結果を表示する
        上記以外なら、以下を実行
           各スクリプトを順番に実行するが、結果を表示しない
        この際、最後に、/etc/profile.d/sh.local を実行 ★<-- ここに記述するとよい

BASH_VERSION が空でなければ、以下を実行
 /etc/bashrc が存在すれば、/etc/bashrc を実行
```

[man 7 bootup](http://man7.org/linux/man-pages/man7/bootup.7.html)
Leetcode #1021: Remove Outermost Parentheses

```swift
func removeOuterParentheses(_ S: String) -> String {
    var stack = [Character]()
    var answer = ""
    var tmp = [Character]()
    for char in S {
        tmp.append(char)
        if char == "(" {
            stack.append(char)
        } else {
            stack.removeLast()
            if stack.isEmpty {
                tmp.removeFirst()
                tmp.removeLast()
                answer += String(tmp)
                tmp = []
            }
        }
    }
    return answer
}
```
Ruby on Rails大枠の流れまとめ



Ruby on Railsを本格的に学習する前に全体像を掴むためにまとめました。


# 名称と役割
**ルーティング・・・ブラウザからのリクエストをコントローラで定義したアクションと結びつける**
設定ファイルは、「config/routes.rb」
コードを書くときは、「優先順位は、上から順」という点に気をつける

**コントローラ・・・ブラウザからのリクエストを受け取り、モデルやビューなどと連携し結果をユーザーに返す役割をする部分**
コントローラには (※1)複数のアクション が含まれている。また、コントローラの名前の付け方には決まりがある

※１.7つのアクション（index,show,new,create,edit,update,destroy)で構成されることが多い。

**モデル・・・データベースとやりとりを行うクラスのこと**
モデルクラスのインスタンスは、1つの行(レコード)を表すオブジェクトになり、テーブルの列(カラム)に相当する属性を持つ

**データベース・・・何らかのデータを集め、データの操作や検索を行えるようにしたもの**
テーブルの内容を変更するには、「変更を指示するファイル（マイグレーションファイル）を作成→変更を反映させるコマンド（$ rails db:migrate)を実行」の手順が必要

**ビュー・・・ブラウザにHTMLなどの各種フォーマットでのレスポンスを生成する**
ビューはRailsアプリケーションの中に複数用意されている。1つ1つはHTML文書の雛形のようになっており、与えられたデータから文書を作成する


#それぞれの相関と流れの図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423914/96157684-f261-d93e-dea9-380febcf3bc3.png)
プログラミングコンテストチャレンジブックをpythonで解く(1-6)

```test.py

#三角形の最大の周長を求める。
#三角形を作れない場合は0を出力する。

list = [2,3,4,5,10]
line_sum = 0

for i in range(len(list)):
    for j in range(i+1, len(list)):
        for k in range(j+1, len(list)):
            max_num = max([list[i], list[j], list[k]])
            other_sum = sum([list[i], list[j], list[k]]) - max_num
            if other_sum - max_num > 0:
                if line_sum < sum([list[i], list[j], list[k]]):
                    line_sum = sum([list[i], list[j], list[k]])
                    
print(line_sum) #12

```


[プログラミングコンテストチャレンジブック-第2版-～問題解決のアルゴリズム活用力とコーディングテクニック]( https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8%E3%83%96%E3%83%83%E3%82%AF-%E7%AC%AC2%E7%89%88-%EF%BD%9E%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E6%B4%BB%E7%94%A8%E5%8A%9B%E3%81%A8%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E3%82%92%E9%8D%9B%E3%81%88%E3%82%8B%EF%BD%9E-%E7%A7%8B%E8%91%89%E6%8B%93%E5%93%89/dp/4839941068)
Coursera Machine Learning Stanford Univ. Week9

今週のテーマはAnomaly detectionとRecommender system
Anomaly detectionはめったに起こらない異常な状態、故障を検知する方法。
Recommender systemは映画のratingの情報から次に見るお勧めを提示したり、ratingから映画を分類する方法。

#Anomaly detection
各featureのガウス分布の積からある小さなεより小さい事象が起きたらanomalyだと判断する。
起こりにくい方を1として検出するようにすることでPesision/Recallでアルゴリズムの出来を判断できる用意する。通常状態を1とするとほとんど1として検出するのでとりあえず1を出せばPrecision/Recallの成績がよくなるから。これは何週か前にも説明していた。

Multivariate Gaussian DistributionはOptionalになっている。先週PCAの説明でΣとして出てきたcovariance matrixが再び登場。数学的に高度な話になるのでOptionalの扱いなんでしょうか。話としてはそんなに難しくないですが特異値分解とその応用については理解できるようにしようと思います。

#Recommender System
映画を見た人が星いくつかで映画を評価し、それに基づきその人におすすめの映画を提案すると同時に映画の分類もするというシステム。
個人個人の評価から決まるΘと映画の分類をするXと、その人が評価を行った映画かどうかを区別るるためのRこれらの行列を学習し、レコメンドを提案する。やっていることはそんなに難しいことではないので簡単と思っていたらPrograminの課題でちょっとてこずることになった。ΘとXの2つの変数を同時に学習していき、個人の好みから映画を提案するだけでなく映画の分類もしてしまうのが面白い。

#Programming
今週の提出物は下記の３つ

- estimateGaussian.m - Estimate the parameters of a Gaussian distribution with a diagonal covariance matrix
- selectThreshold.m - Find a threshold for anomaly detection
- cofiCostFunc.m - Implement the cost function for collaborative filtering

採点は6つのパートに分かれています。
Anomaly detectionが2つの残りがRecommender systemに関するもの。

## Anomaly detection
estimateGaussian.m
与えられた行列から各列の平均と分散を求めます。
分散はvar()を用いるとデフォルトでは不変分散だからねってpdfに注意書きがありますのでその通り対応すること。

selectThreshold.m
forループでεを変化させて最適なεを求める。F1スコアが一番良いεを返せばよい。
PrecisionとRecallを求めてF1を計算するという問題
一応 division by 0とならないように注意した。

## Recommender Systems
octaveのコードをどう書くのかてこずりました。PDFで説明されたとおりにやればできるんですがgradの計算で使うfindの使い方を知らなかったので最初はどういうことなのか理解できなかった。

コストJ(X,Θ)の計算のΣの(i,j):r(i,j)=1の処理とgradienntの計算のΣのj:r(i,j)=1とi:r(i,j)=1の処理をどうするのかてこずりました。どちらもpdfにImplement Note, Implementation Tipに説明がありますのでそれを参考にすればわかると思います。
コストの方は　R.*M　という形でRを作用させればOKです。
gradientの方はidx = find(R(i, :)==1)という列を選択する変数を使います。
gradientのもう一方のThetaのgradientはidx = find(R(:, j)==1)として行を選択してやればいいのですがY_tmpを転置しないと行x列が合わなくなるとこに気が付かないで時間がかかってしまいました。こういう時は各行列の大きさを書き出して隠しながらやるといいですね。
【随時更新】AtCoder+PyPy3で詰まったところ

AtCoderにPython初心者ながらPyPy3で参加しているので、仕様で詰まったところを備忘録として並べておきます。もし誰かの役に立てば幸いです。

# 文字列の連結が遅い
以下はべらぼうに遅い。

```python:
str = ""
for i in range(N):
    str += tmpstr[i]
print(str)
```

こういうときはjoinを使う。

```python:
print("".join(tmpstr))
```

# 再帰の深さに上限がある
REが出ます。デフォルトは1000回。以下で好きな値に設定する。でも再帰よりDPしなきゃ。。

```python:test.rb
import sys
sys.setrecursionlimit(N)
```

# sys.stdin.readlineは\nを含む
N回のinput()をするときは

```python:
import sys
input = sys.stdin.readline

Ss = []
for i in range(N):
    Ss.append(input())
```
とやるほうが速いのだが、このとき通常のinput()とは違い末尾に\nが入ってしまう。
以下のように解決する。

```python:
input().rstrip("\n")
```

# 他の問題の解答をA問題に提出する
うっかり（問題A, B, ...のページではなく）問題集ページなどから「提出」を押すと、提出先がA問題になります。これを直さずに提出すると、当たり前ですがREが出て通りません。
Laravel  View表示におけるview()とredirect()の違いについて

#はじめに
ControllerやRouteからViewを展開する方法に
view()とredirect()をよく使いますが、その違いはなんでしょうか。
例えば

```php5
return view('profile.index')
return redirect('profile/index')
```
こちらはどちらも同じ結果を返します。
中身はどう違い、どういう原理で動いているのか、疑問に思ったので調べてみました。


#view()
`resources/views`ディレクトリに保存されているファイルを呼び出し相手のブラウザに表示させることができます。

例えば

```php5:resources/views/profile/index.blade.php
<html>
    <body>
        <h1>My name is kenji.</h1>
    </body>
</html>
```
上記、`resources/views/profile/index.blade.php`という
Blade記法のファイルをRouteから直接呼び出し相手ブラウザに表示させたいときは

```php5
Route::get('profile/index', function () {
    return view('profile.index'); 
});
```
となり、`https://~~/profile/index`にアクセスがあると
`index.blade.php`がレンダリングされブラウザに表示されます。

#redirect()
ユーザーを他のURLへリダイレクトさせることができます。

>**リダイレクトとは**
別のページへ転送すること
出力先を本来のものから変えること
参照：https://wa3.i-3-i.info/word1482.html

redirect()は直接表示させたいViewを呼び出しているのではなく
RouteのGETリクエストからredirect()を介し
別のRouteのGETリクエストを通りViewを呼び出しています。
例えば

```php5

Route::get('test-redirect', function () {
    return redirect('profile/index');
});

    /*上記、redirect('profile/index')から
        下記、get引数の'profile/index'へ*/

Route::get('profile/index', function () {
    return view('profile.index'); 
});
```

`https://~~/test-redirect`にアクセスがあったとすると
`redirect('profile/index')`によって`https://~~/profile/index`へアクセスを返し
`view('profile.index')`によって`index.blade.php`を表示させています。
この場合、イメージとしては2回Routeを通しています。
つまり、GETリクエストが2回行われていることになります。

#まとめ
####view()
RouteやControllerから直接ファイルを呼び出し、ブラウザへ表示させています。

####redirect()
RouteやControllerから別のRouteへリクエストを出し、
そのRouteに沿ってViewを表示させています。

#参照

公式：ビュー
https://readouble.com/laravel/5.5/ja/views.html
公式：レスポンス（リダイレクト）
https://readouble.com/laravel/5.5/ja/responses.html
※redirectはControllerアクションへリダイレクトすることもできたりと
他にも機能は様々です。詳しくは上記からお願いいたします。

最後までありがとうございます。
間違いご指摘ありましたら編集リクエストやコメントをしていただけると幸いです。
Coursera Machine Learning Stanford Univ. Week8

今週のテーマはK-meansとPCA

K-meansの方は割と理解しやすいというか、直感的に理解しやすい手法だと思います。

次元削減の考え方自体は直感的にわかりやすいのですがその実現方法でいきなりSVDが出てきて、ああそうですかという感じになりました。
2次元に次元削減する際はあるベクトルを選んでそのベクトルへの射影を使う。どのようなベクトルを使えばよいかはそのベクトル（延長）と元の点の距離をもとめすべてのデータの距離の和が最小になるようなベクトルを選べばよい。
ここまではいいけどいきなりsvd()を使いますってなってはあ？となりました。

Matlabのマニュアルによると

[U,S,V] = svd(A) は、A = U*S*V' となるように、行列 A の特異値分解を実行します。

特異値分解とはなにか調べると

- U,Vはユニタリ行列
    - 今扱っているのは実数の行列なので転置をとると逆行列になる、このことを後で使う
- 特異値分解と行列の低ランク近似 で検索すると意味を理解するのに役立つ情報が得られました



Programing exerciseの提出物は以下の6つ

1. pca.m - Perform principal component analysis
2. projectData.m - Projects a data set into a lower dimensional space
3. recoverData.m - Recovers the original data from the projection
4. findClosestCentroids.m - Find closest centroids (used in K-means)
5. computeCentroids.m - Compute centroid means (used in K-means)
6. kMeansInitCentroids.m - Initialization for K-means centroids

ex7.mとex7_pca.mの2つのパートに分かれている。
ex7がK-means clustering
ex7_pcaがもちろんPCAについて
上の提出物のファイルの順番はなぜかPACのファイルから書いてあって、順番が逆になっている。

K-meansの方から始める
findClosestCentroids.m
K点のcentroidとの距離を計算して一番近い点を選んでidxに登録する。
普通に二重のforループを書いてやれば難しくはないけどそこはoctaveっぽく書くとforループは二重にしなくて済むようだ。

computeCentroids.m
Xの各点をcentroidに一番近いか分類したので、各centroidに属する点の重心を求めてcentroidを更新する。これもforループは1つでかけるようだけど2つforループを書いて対応。

kMeansInitCentroids.m
これはpdfにあるコードをそのまま利用。
randperm (n)を使って1:nのベクターをシャッフルできる。
1:Xの行数をシャッフルして、ランダム順になったものを最初からKを使ってそれに対応するXの行を選んでcentroidsの初期値にする。

pca.m
pdfにある式を使ってΣを計算してsvd(Σ)とする

projectData.m
svdで計算したUからK個選んでこれを使ってfeatureを削減したZを求める
これも2重のforループを書いてしまったけど、マトリクスのまま1行で書けるようです。

recoverData.m
ZをUを使って元の次元（の近似値）に戻す。
Uは直行行列なので転置をとると逆行列になることを使って逆変換をする。
これさえわかればprojectData.mと同じようにできます。
eslint で Definition for rule was not found エラーが出る

eslint 走らせると、すべての `// @flow` の箇所で

```bash
  1:1  error  Definition for rule 'no-async-promise-executor' was not found      no-async-promise-executor
  1:1  error  Definition for rule 'no-misleading-character-class' was not found  no-misleading-character-class
  1:1  error  Definition for rule 'no-useless-catch' was not found               no-useless-catch
```

とエラーが出た。

なんでかな〜とおもって調べたけどわからなかった。
結局、原因は、そもそも `yarn add -D eslint` をしてなくて eslint が無く、ちゃんと入れたら治りました。
［ネタ］ 要素数が変化しないO(n)のソートアルゴリズム

要素数が変化しないO(n)のソートアルゴリズム
======================================

[計算量O(n)の画期的なソートアルゴリズムであるスターリンソートをHaskell で実装してみた #Haskell](https://qiita.com/Tatsuki-I/items/380d6bd06515b872b2b2)

上記アルゴリズムはO(n)時間でソートが完了する画期的なアルゴリズムである。ただし、つぎのような問題がある。

「`length xs == length $ stalinSort xs`が`False`になる」

今回紹介するのは、この問題を解決した修正版のアルゴリズムである。

追記
----

「タイトル詐欺はけしからん」との声がありましたので、マジメなほうを急遽作成しました。

[O(n)時間でソートが終了するバケットソートをHaskellで実装する](https://qiita.com/YoshikuniJujo/items/0ffbcc2e6e5dca35f6a0)

考えかた
-------

要素数が変化してしまうのは「粛正」してしまうからだ。そんな乱暴なことをする必要はない。言うことをきかないなら「洗脳」してしまえばいい。

コード
-----

```haskell
bwsort :: Ord a => [a] -> [a]
bwsort [] = []
bwsort [x] = [x]
bwsort (x : xs@(y : ys))
        | x > y = x : bwsort (x : ys)
        | otherwise = x : bwsort xs
```

```haskell
> bwsort [3, 7, 5, 2, 9, 15, 1, 4, 8]
[3,7,7,7,9,15,15,15,15]
```

これなら`length xs == length (bwsort xs)`はTrueになる。

まとめ
-----

O(n)時間でソートが完了し、かつ要素数が変化しない「洗脳ソート」を紹介した。
AtCoderを始めました

ABC133から[AtCoderを始めました](https://atcoder.jp/users/yutasth)。

# 動機
プログラミングは昔から好きで趣味として嗜んでいましたが、なにしろ趣味程度なので、アルゴリズム力や実装力はぜんぜん育ちませんでした。このたび、子育てを始めてまとまった時間が取れなくなったため、細切れ時間に練習できる競技プログラミングを始めて鍛え直すことにしました。

# 言語の選択
趣味でも仮に仕事になるにしてもC++を使うという選択肢はないと思ったので、流行しているPythonを選択しました。また、せっかくあるのでPyPyという高速処理系を使うことにしました。

# サイトの選択
子育てをする都合上、日本時間で無理のない時間にコンテストが開かれる必要があります。したがって、候補は最初はAtCoderかyukicoderくらいでした。正直どちらでも良かったのですが、勢いのありそうなAtCoderを選択しました。

# 目標
鍛えたいのは競プロ力ではなく実装力・アルゴリズム力なので、競プロに最適化しなくても到達できそうな青コーダーになること、またはAtCoder Beginners Contestで安定して6完することを目標にします。数回ABCに参加してみた感じ、今（2019年7月）時点の実力は[水色くらいかなあと感じています](https://atcoderapps.herokuapp.com/atcoderperformances/show_graph/?username=yutasth&rivalname=)。
Leetcode #975: Odd Even Jump

```swift
func oddEvenJumps(_ A: [Int]) -> Int {
    //  from index i, whether it can reach the end by taking an odd or even jump
    var oddDp = Array(repeating: false, count: A.count)
    var evenDp = Array(repeating: false, count: A.count)
    
    // when at last index, no need to jump
    oddDp[A.count-1] = true
    evenDp[A.count-1] = true
    
    var oddNext = Array(repeating: -1, count: A.count)
    var stack = [Int]()
    for (i, _) in (A.enumerated().sorted { $0.1 < $1.1 }) {
        while !stack.isEmpty && stack.last! < i {
            oddNext[stack.removeLast()] = i
        }
        stack.append(i)
    }
    
    var evenNext = Array(repeating: -1, count: A.count)
    stack = []
    for (i, _) in (A.enumerated().sorted { $0.1 > $1.1 }) {
        while !stack.isEmpty && stack.last! < i {
            evenNext[stack.removeLast()] = i
        }
        stack.append(i)
    }
    
    var answer = 1
    for i in stride(from: A.count-2, through: 0, by: -1) {
        if oddNext[i] != -1 {
            oddDp[i] = evenDp[oddNext[i]]
        }
        if evenNext[i] != -1 {
            evenDp[i] = oddDp[evenNext[i]]
        }
        if oddDp[i] {
            answer += 1
        }
    }
    return answer
}
```