AtCoder Beginner Contest 51 C問題

atcoder.jp

最短経路はいくつかありうるが、 - 1回目はx, yの座標差分だけ移動 - 2回目は1回目を迂回するように、x, yの座標差+2の距離ずつ移動する ようにすればよい。

迂回の仕方はいろいろあるが、1パターンだけでいいので以下の経路でコーディングする。

f:id:ofton_queen:20220411215545j:plain

use proconio::input;

fn main() {
    input! {
        sx: i32,
        sy: i32,
        tx: i32,
        ty: i32,
    };

    let dx = (tx - sx) as usize;
    let dy = (ty - sy) as usize;

    // 1
    print!("{}", "U".repeat(dy));
    print!("{}", "R".repeat(dx));
    print!("{}", "D".repeat(dy));
    print!("{}", "L".repeat(dx));

    // 2
    print!("L");
    print!("{}", "U".repeat(dy + 1));
    print!("{}", "R".repeat(dx + 1));
    print!("DR");
    print!("{}", "D".repeat(dy + 1));
    print!("{}", "L".repeat(dx + 1));
    println!("U");

}

Submission #30898620 - AtCoder Beginner Contest 051

  • .repeatの存在を初めて知ったので覚えておく。
  • Rustはusize型と数値型の変換が面倒なので良い書き方を覚えたい。

Webエンジニア3年目、デザインパターンの本を久々に読み返す

ブログを少しカジュアルに書いてみようと思って書いてみる(めっちゃ久々…

最近、オブジェクト指向言語を使ってるのにオブジェクト指向を深く理解していない・使いこなせていないんじゃないかと思うことがあって、とりあえず前に買ったデザインパターン本を引っ張り出してきてみた。

この本は一度メジャーそうなパターンだけ2、3年前くらいに通読したことがあって、そのときはあんまり実際のWebアプリケーションを開発した経験も浅かったのでいまいちピンと来ていない感があった。当時は道具だけ与えられて作りたい料理がないみたいな感じだったので、今読んでみたら発見があるのかなと思った。

結論として、前よりは有用性を実感できるデザインパターンの数も増えたなと思った。

以下のパターンはエンジニア生活で実際に出会ったもの。

  • Iterator
  • Adapter
  • Template Method
  • Factory Method
  • Singleton
  • Prototype
  • Builder
  • Facade
  • Observer
  • Command

とはいえこれ以外のデザインパターンに対してはそこまで理解していないし、実際にそれが使える場面になったときに引き出せるのか自信がない。必要なときに出てこない道具っていうのは意味ない気がしてきた(今更)

理解しておきたいデザインパターン

名前はよく聞くけどちゃんと説明できないので以下は要旨は理解しておきたいと思った。 - Bridge - Strategy - State

デザインパターン不要論(?)

Googleデザインパターンを検索すると以下のように古いとか使わないとかサジェストされる。 f:id:ofton_queen:20210613225430p:plain 確かにQiitaとかZennとか見ててもデザインパターンの話は出てこない。 「古い 」のほうの検索結果を見てみるとこういう記事が出てきて、書いてあることは納得することが多かった。ライブラリやフレームワークの中にいるんだという話

GoFはどこへ消えた? - カレーなる辛口Javaな加齢日記

私が業務コードで見たことのあるデザインパターンもだいたい言語の機能、フレームワーク、ライブラリの一部に組み込まれていて、それに乗っかってコーディングしてる感覚が強かった。(SingletonはScalaのコンパニオンオブジェクトで、Commandはフロントの状態管理ライブラリでstateに対するActionの型とかが近い感覚)

オブジェクト指向をもっと理解したい

デザインパターン本に関してはたまたま本棚で目についたから読み直したという感じなので、もともとのオブジェクト指向を理解したいという目的に対してはその一部でしかない。 以前同僚が以下の本について話していた記憶があるのだが、値段に圧倒され手を出せてはいない(けど手に入れれば色々網羅できそう)

Classi Angular Night #2 参加記

去る2019年3月27日(水)に、Classi Angular Night #2に参加してきました!

classi-angular-night.connpass.com

・Classiさんのイベントレポ: www.wantedly.com

・Togetter: togetter.com


というわけで、自身の復習も兼ねて参加記です。

(Angular始めて3ヶ月(というかJSフレームワーク業務で使うのもこれが初めて…)なので理解が間違っているところもあると思いますので、なにか気づいたことがあればご指摘お願いしますm( )m)

1. Angular Way をまっすぐ歩くために

・発表者:Classi 笠原さん

・資料:Angular Way をまっすぐ歩くために / classi-angular-night-number-2 - Speaker Deck

コンポーネント設計周りは、他社さんがどのようにやっているのか気になっていたので非常に興味深く聞かせていただきました。

普段開発している中でほぼほぼ内容同じだけど微妙に違う(追加画面と編集画面とか)コンポーネントの共通化ってどうしているんだろう?と思うことがあったのでとても参考になりました。

何気なく使っていたasync pipeのメリットや、TSLintのおすすめ設定も目から鱗でした!

2. テストカバレッジ100%のプロジェクトで体感した、テストのメリット

・発表者:Classi 原さん

・資料: テストカバレッジ100%のプロジェクトで学んだ、 ユニットテストの書き方 - Speaker Deck

発表の最初に「みなさん、テスト書いてますかー?」と質問されていましたが、確か半分行かないくらいだったかな?(私も書いたことないです。。)

とても印象的だったのが、「テストを書きやすくするために考えることが、設計の見直しのチャンスになる」とおっしゃっていたことです。(ほんとその通りですよね。)

テストカバレッジ100%のメモ帳を見ながら、Angularのテストの勉強したいなーと思いました。

3. Angular初心者からのネクストステップ

・発表者:lacoさん

・資料:20190327 - Classi Angular Night #2 - Google スライド

Angularチュートリアルが終わったら何やればいいの?←まさに今の私!だったので、今後の学習の方向性が見えてとてもよかったです。

Angularに限らず、様々な技術の勉強にも横展開できる内容でした。

守→破→離のどこに自分がいるのか常に考えながら、ステップアップしていきたい…!(Angular After Tutorial - Angular After Tutorial やります)

4. NgRxは入れるだけでいいのか? 発生する懸念と考えられるアーキテクチャ

・発表者:奥野賢太郎さん

・資料:NgRxは入れるだけでいいのか? 発生する懸念と考えられるアーキテクチャ / NgRx Architecture - Speaker Deck

まずアーキテクチャを考える必要性について。巨大なクラスを分離するためにServiceを闇雲に増やしていくのではなく、何のためのServiceかなのか意識することが大切というお話。(そしてそれは結局、テストをしやすくするため、につながる!)

その上でNgRxについてでした。NgRxは入れるだけでなく、アーキテクチャを考えることが重要!

Effectsの多用は避ける、など具体的なプラクティスも述べられていて参考になりましたー。

自社プロダクトにおいても、NgRxを以前から用いておりましたが、コードが長くなりがちだったりしているのみんなどうしているんだろう?と思っていました。

まとめ

Angular関連の勉強会は初めて参加しましたが、他社さんの事例を聞くことができてとても良かったです。(初心者の方も結構いて安心しました!)

また、個人的に懇親会などで感じたこととして、初心者すぎて自分が発信できる内容が少ないな。。。と。

今回の勉強会をきっかけにAngularのステップアップをしていけたらな、と思います。

2018年 買ってよかったもの

こんにちは!

2018年もあと10日ほどで終わってしまうので、振り返りを兼ねて買ってよかったものをシェアします。定番品ばかりですが。

こういう記事を読むのが好きなので自分でも書いてみました(他人がどんないいお買い物してるかって気になる)

1. Anker SoundCore2

夏のプライムデーに勢いで買った初のBluetoothスピーカー。コンパクトかつ防水対応、車に置いて使うのも割といけます。

家族と貸し借りもしているんですが、返してもらって再生した途端、家族のスマホで再生する音楽(DA PUMPのUSA)が流れてきてしまう(ペアリング解除忘れ)という事件も発生しました。みなさん気をつけてください。

やっぱりスピーカーを通した音は違うね。

2. HUAWEI P20 lite

話題のファーウェイですが…製品としてよかったのでレビューしたくて。

この商品は本当にコスパがいいです。2〜3万円でこの性能はちょっと意味がわからない。iPhoneから乗り換えましたが、今のところこれといったストレスは感じていません。

何の変哲もない川を、何も考えずに撮ってみてこの美しさ。

f:id:ofton_queen:20181221151124j:plain

インスタ映えカメラと言われているだけあり、発色が鮮やかな感じがします。

買って1ヶ月くらい経ちましたが、他にもネットのレビューで見るような以下の特徴は実感しています。

  • 爆速の指紋認証・顔認証
  • 美しいディスプレイ、iPhone Xっぽいノッチ
  • 高速充電
  • サクサク

3. SHURE イヤホン SEシリーズ SE215

メインで使っているBluetoothイヤホンのサブとして。

ロングセラーのものだけあって安定感があります。さすがに3万円以上のイヤホンほどの快適な音質ではないですが、華やかな音がする気がする。SHURE掛けして耳に押し込めば遮音性も抜群です。

ちなみにメイン機のBose Quiet Control 30もノイズキャンセリング性能が非常に高く、推したいところですが、壊れやすいみたいです。(1回交換済み)

4. Kindle Paperwhite

白黒で構わないような、読み物系の書籍やマンガならこれでかなり快適な電子書籍ライフを送れます。外出先でもその時の気分で読みたいものを読めます。

Kindleに対応している本なら文字サイズが変更できますし、メモ、ハイライトなどの機能は特に自己啓発書を読んでいるときによいです。ブラウザがついているのでKindleから本を買うこともできます。

質感がほぼほぼ紙です。こんな感じでオシャレな壁紙がランダムで表示されます。

f:id:ofton_queen:20181221153013j:plain

ただ、サイズ的に小さいので大判の本は厳しい。最近は特に技術書などは、紙で買っていますね。

5. バンカーリング

地味ですが。iPad miniにつけてます。寝転がってとか、電車内でとか、動画見るときのスタンドとして使ったりだとか、何かと便利。

6. 電動コーヒーミル

Kalita 電動コーヒーミル CM-50 (ブラック)

Kalita 電動コーヒーミル CM-50 (ブラック)

こんな感じの小さいのがあると、豆挽いてお湯沸かしてドリップしてみたいなのが気軽にできて、コーヒー生活が捗ります。

7. ドレッサー

ドレッサー&スツール 化粧台 LIEBE  ブラウン IR-DR-001

ドレッサー&スツール 化粧台 LIEBE ブラウン IR-DR-001

これで部屋に化粧専用エリアを作りました!

机が散らかる問題が解決できました。

来年ほしいもの

VRヘッドセット

やっぱりOculus Goかなー

4Kディスプレイ

意外と5万円くらいで買えるんですね〜。オススメあったら教えてください。

オーディオプレイヤー

WALKMANを考えていましたが、Astell & Kernなどのプレイヤーも気になっています。

こういうハイエンドモデルをパッと買える大人になりたいですね!

食器洗浄機

ずっとほしいと思っていたのですが、ビル・ゲイツは皿を洗ってるらしいと知って迷っている。

courrier.jp

レコードプレイヤー

こういう感じで好きなミュージシャンの音源がレコードで発売することがたまによくあるんですが、

デビュー20周年記念!スーパーカーのオリジナルアルバムがアナログで再リリース|HMV&BOOKS online

レコード再生環境がなくてちょっとさみしい思いをしてきたので。

DENON アナログレコードプレーヤー USB録音機能/フルオート ブラック DP-200USB-K

DENON アナログレコードプレーヤー USB録音機能/フルオート ブラック DP-200USB-K

AtCoder Beginner Contest #034 C問題

久々のAtCoder復習記事です。

久々と言いつつなんだかんだいってC問題は結構埋まってきてます。

https://kenkoooo.com/atcoder/?user=oftonkingdom&rivals=&kind=category

今回解いた問題は全く知らなかった知識(フェルマーの小定理)が出てきたので備忘のために書きます。(記述はあんまり厳密じゃないです!ごめんなさい!)

参考:

AtCoder Beginner Contest 034 解説

フェルマーの小定理について

フェルマーの小定理とは、 {p}素数のとき、以下が成り立つことである。

{ \displaystyle
\begin{eqnarray}
a^{p-1}  = 1 \bmod p
\end{eqnarray}
}

ここから、以下が言える。

{ \displaystyle
\begin{eqnarray}
a^{p-2}  = a^{-1} \bmod p
\end{eqnarray}
}

これはつまり、 {p}素数ならば、ある数 \frac{n}{a} {p}で割った余りは、 {n * a^{p-2}} {p}で割った余りに等しいということ。

combinationを計算するときに活かせるフェルマーの小定理

今後活かせるタイミングは、combinationを計算した結果を素数(1000000007など)で割った結果を求めろと言われたとき。

mod pの世界では、数 {a}で割るということは {a^{p - 2}}をかけることに等しい。

今回の問題は{ \displaystyle
\dfrac {(H + W - 2)!}{(H - 1)! (W-1)!}
}を1000000007で割った余りが答え。

まず分子については、1000000007で割った値をループを回してかけていけばよい。

分母についてはフェルマーの小定理の変形バージョンにより、各数の {p-2}乗を {p}で割った余りを、ループを回してかけあわせていけばよい。

提出コード

beta.atcoder.jp

すごく参考になる記事

けんちょんさん本当にいつもありがとうございます…!

drken1215.hatenablog.com

qiita.com

SIer→Web系企業への転職活動(いち女性エンジニアとして)

この記事は

#しがないラジオ 2 Advent Calendar 2018 - Adventar

の4日目の記事です。


こんにちは。

このようなAdvent Calendarに参加するのは今回が初めて(緊張)なのですが、

来年からWeb系企業で働き始めるというタイミングなので、私の転職活動の話が誰かの役に立ってくれればうれしいな、と思って書きます。

タイトルに「女性エンジニア」を入れたのは、SIer退職エントリは世の中に数あれど、女性エンジニアの記事ってあまり見たことがなく(明記されていないだけかもしれませんが)、

もし同じような境遇の女性エンジニアの方がいらっしゃったら、こういう奴もいるので、よかったら参考にしてくださいという一心で入れています。

(といいつつ、あまり女性ならではのコンテンツは入れられなかったです。すません。)

自己紹介

大学までは情報系の研究してて、SIerに就職した人間です。

インターネットに育てられ、インターネットとかフリーソフトが大好きで、よくいるHTML・CSSJavaScriptでホームページ作ってる子供時代で、Webサービスの可能性に興味はすごくありました。

SIerでの業務内容は、よくある典型的なSIerって感じです。

なんで転職したのか

転職を考えた理由はいろいろありますが、これもまた、世の中のSIer退職エントリの部分集合って感じです。

その中でも大きなものは以下の3つです。

  1. 自分の思い描くキャリアパスと会社のキャリアパスのミスマッチ
  2. 会社にロックオンされることへの抵抗感
  3. エンジニアの裁量の小ささ

まず1については、自分の中で技術への関心が強く、アグレッシブに技術を使って問題解決したいと思うようになったからです。

しかしながら会社における一般的なキャリアパスはプロジェクトマネージャーが目標であり、非常に若いうちから開発を離れてリーダーになることが求められました。

もちろん技術に全く触れなくなるわけではないのですが、自分の手を動かしてモノを作ることのほうが好きで、やりたいことだと気づいた*1ので、方向転換するなら早いほうがいい(自分にとっても、会社にとっても)だろうと考えました。

2については、私のいたところが大企業で、そこそこに働いていればまあまあお給料がもらえるという環境だったのが大きいです。

そんな環境でしたが、なんとなく「ここにいるべきなのだろうか?」という疑問がありました。もっと自分で課題を発見して解決できる人材になるべきじゃないか?一応まだまだ若くて、頭も回るはずなので、もっと鍛えられる環境に行ってみるべきじゃないか?みたいな危機感ですね。

そして、会社に依存せず、動きたいときに動ける、転職先に困らない人間になりたいと思いました。

ここらへんの話は、散々話題になっている以下の本に感銘を受けました。

このまま今の会社にいていいのか?と一度でも思ったら読む 転職の思考法

このまま今の会社にいていいのか?と一度でも思ったら読む 転職の思考法

3については、話題になったNTT退職エントリなどでも挙がっていた、メモリ容量少ない問題などもありましたが、

例えば、開発において、社内で作られているツールが微妙に使いづらい…というシーンで、もしコードを書いてプルリクできたらどんなにいいだろう…?私が作りたい!とか考えてしまいました。

他にも好きなエディタを使えなかったり、新しいツールを導入できなかったり、などなど、技術のアップデートがしづらい環境、は私にとっては結構ストレスでした。(効率厨なので)

転職活動について

ごくごく一般的なエンジニア転職の手順を踏みました。

転職エージェントと面談→企業と面接→内定 です。

技術力不足で落とされまくることもあってつらかった。

ただ、足りないものはどうしようもなくて、できる限りのことをして、最大限見せて、それを買ってくれる会社を見つけるしかないのだなあ、と思いました。

全体を通して反省点を挙げるとするなら以下です。

  1. さっさと目に見えるポートフォリオ作ればよかった
  2. 求人に応募しすぎて、1つ1つに割くリソースが小さくなってしまった
  3. エンジニアコミュニティに積極的に参加しておけばよかった

1については、いろいろなところで言われていることなのでもはや当たり前かもしれませんが、モノがあるのとないのとで本当に違います。面接でも、より自信を持って話せるようになった気がします。

内定いただけたのは、アプリを作って、恥を忍んでGitHubのURLを職務経歴書に載せたのが大きいと思います。

2については、そのままですが…エージェントに紹介されるがままに受けると大変なことになるという教訓です。

よっぽど一刻も早く会社をやめたいという状況でもない限り、厳選して受けたほうがいいですよね…。

あと、本当にいいエージェントもいるので、諦めずにたくさんのエージェントと会ってみるというのも、重要かもですね。

3については…なんとなくエンジニア勉強会とか、強い人がいっぱいいそうで怖かったのですが、

ちゃんと探せば初心者向けとか、同じように転職を考えている人の集まりとか、いろいろあるし、

視野が狭くならないように勇気を出して参加しておけばよかったと思います。

女性エンジニアとして

最近はTwitterなどでよく観測されるようになってきましたが、まだまだITエンジニアとして女性が働くって知られていないですよね。

私も、今の会社ではIT好きを公言してきましたが、え?女性なのにIT技術好きなの?というのが理解されてない感もありました。(実際どうかはわからない)

ただ、ITが好き!楽しい!と思った女性の方は本当に周りの目を気にせず、自分が活躍できる環境を探し、飛び込んだほうがいいと思いました。

私は新卒就活時は、周りが大手企業に行く人ばかりだったのもありますが、Web系のベンチャーで働く女性エンジニア、というイメージがなかったので、今考えると就職先で検討すらしませんでした。

漠然と、いやプロマネよりエンジニアのほうが気質的に合ってそう…?と思いながらも。。

なので、自分の直感を大切に、内なる声に耳を傾け、選択肢を広く持つというのは本当に大事なことだと思いました。

ちなみに少し脱線しますが、私は、もともとは理系科目もそんなに得意ではなかったのですが、ITが「好き」だったので、どうやったら得意になれるのか試行錯誤して理系学部に進学し、いろいろあってなんとかここまで来ました。諦めなくてよかった〜。

しがないラジオについて

実は私がしがないラジオを知ったのは、内定をもらってからでした笑

技術書典に出されていた「SIer完全脱出マニュアル」、BOOTHで+1000円で購入させていただきました…!内定後の意思決定時にとても助かりました。

このような活動をされている方がいるのをもっと早く知っていればなあ…という一心です。

SIerで働くことに違和感を感じている人が、Podcastで耳から、同じ考えの人の生の声を聞ける、これってかなり心理的に違いますよね。

リアルにWeb系の知り合いがいなかったとしても、非常に心強いと思います。

これからも頑張っていただきたいです(陰ながら応援しています)。

まとめ

まだ、Webエンジニアとして働き始めたわけでもないので、転職After Storyは書けないのですが、

落ち着いたタイミングでこのブログに書きたいと思います。(すでに次の会社のエンジニアの皆さんとお話させてもらって、「しがない」予感がすごいですが!)

ここまで読んでいただきありがとうございました。世のエンジニアに幸あれ。

*1:思い返すと幼少期から起床即レゴブロック弄ってました

ABC 084 Special Trains

問題

C - Special Trains

前に解いたときにACできなかったのでリベンジです

考察

ある駅iに着いたとき,開通式開始後からかかった時間がTとすると,

  • T>= S_i なら,F_i間隔で走っている電車が来るまで待つ.待ち時間は,T % F_i = 0なら「0」,T % F_i ≠ 0なら「F_i-T%F_i」である.
  • T< S_i なら,まだiからの電車は走り始めていないので,待ち時間はS_i-Tである.

以上の待ち時間に,次の駅までかかる時間C_iを加えたものを足していけば,求める答えとなる.

計算量的にもO(N2)で間に合う.

コード

https://beta.atcoder.jp/contests/abc084/submissions/2874094

反省

時間測ってませんでしたがリベンジ後1発AC

  • 改めて解いてみると過去の自分がなんでできなかったのかわからない.成長したということか.
  • 基本的に解説通りだったし特に言うことはない