notepad.exe

つまり覚え書き

エンジニアを職業にするということ

この記事は「貴族会 Advent Calendar 2018」の9日目の記事です。

はじめに

11月にサボり癖がついてしまい長らく記事を書いていませんでした。 そういえばアドベントカレンダーに登録したなと思っていつだっけとカレンダーを見たら今日だったので、 大急ぎで書いています。

エンジニアという職業

私は今エンジニアとして日々働いています。 とはいえ別に昔から強い思い入れがあったからエンジニアをしているというわけではなく、 いろいろあって専門学校に行くことになったのでそのままそのスキルを一番活かせるエンジニアの道に進んだだけです。

とは言え、社会人になってエンジニアとして働くうちに楽しくなっていろいろなスキルを付けるようになりました。 その中で勉強会に行ったりいろいろなエンジニアと話したりしていくうちに、 このエンジニアという職業についていろいろ考える機会があったのでそのうちの一つだけまとめます。

なぜ新しい技術を学びスキルを付けるのか

大抵のエンジニアは日々勉強していると思います。 「日々勉強していること」それは何を「目的」としているのでしょうか。

技術を身に着けるのが楽しくなって技術を身に着けることが目的となっている人がいますが、 それは違うと思っています。技術をつけた先に何かしたいことがあるからこそその技術を学んでいるので、 技術を学ぶことはあくまで一つの「目標」なのです。

何か達成したいことがあるからこそそれを実現するための技術が必要となり、そのために毎日勉強をしている。 それが答えだと思います。

エンジニアとしての目的とはなにか

まず、エンジニアに限らす社会人(企業そのものも含む)としての目的ですが、 何らかの問題を解決、または価値を与えることだと思います。 この目的はエンジニアに絞っても同じままだと思います。 エンジニアはあくまでその手段が技術を使うということになっただけです。 その問題や価値をより大きいものにするために日々技術の勉強をしているわけですね。

自分ができること

価値を提供するとか問題を解決するとか聞くと難しく聞こえてしまいますが実際はそんなことはありません。 小さな価値の提供であれば、例えばブログを書くことも読んだ人にとって何かしらの収穫があれば、 そのブログの記事は価値を提供していると考えることができるのです。

たしかに目的を意識することは大切ではありますが、あまり意識を強く持ちすぎずとりあえず何かしらの物を他人に提供するだけでも一つの成果となります。 提供してみなければ問題を解決できるかもわからないし、価値の提供をおこなえるかどうかもわかりません。

そのためにも、とりあえず行動をする・とりあえず勉強をするといったことは大切になってくるわけですね。

まとめ

  • スキルを身に着けることは目的に対する一つの手段である
  • 目的には問題解決や価値提供などの形が考えられる
  • 目的を考えて日々の勉強をする
  • とはいえ意識しすぎずとりあえずやってみるのは大事

社内プロコンの問題作ったよ!(2回目)

というわけで前回に引き続き社内プロコン(一般)の問題を作りました。

問題は全部で4問で配点はこんな感じ。

問題 満点
A Bring Boarding Pass 50
B Rita in Roma 100
C Boarding is Boring 150
D Souvenir Sequence 200

難易度は ABC を意識した難易度で作っていて、時間は3時間です。 すべての問題について部分点がかならず設定されていて、 一部でもあっていれば点数が入るようなテストデータになっています。

実はなんと今回D問題の案は けんちょんさん に作っていただきました!!!
ありがとうございました!!
本当にレベルも高い問題で感謝も大きく勉強することも多かったです。

A - Bring Boarding Pass

入力として  x, a, b が与えられて大きさ  x (S or L) の飛行機の前から  a 番目、 左から  b 番目の座席番号を出力する問題。 小さい飛行機が 33 の座席で大きい飛行機が 343 の座席です。 入力例と出力例はこんな感じ。

  • 入力 L 10 9
  • 出力 10J

これは座席の英字が ABC DEFG HJK と言うようになっているので注意が必要ですねと言う問題でした。

B - Rita in Roma

ローマ数字をアラビア数字に変換する問題。 入力例と出力例はこんな感じ。

  • 入力 MMMCMXCIX
  • 出力 3999

基本的には対応している数字を足していくのですが、4とか9の表記が減算側で表記されているので そこに注意して変換を行えばいい問題でした。

C - Boarding is Boring

数字で遊ぶ問題です。入力として a, b ( 0 \leq a, b \leq 10^5 ) が与えられて、 a に対して以下の3種類を行うことができます。

  •  a に2をかける
  •  a を2で割り小数点以下を切り捨てる
  •  a に1を足す

この3つの各操作を好きな回数行うことができるときに a bにするための最小の操作回数を求めてくださいという問題です。 ちなみに操作を行ったことによるオーバーフローなどは考えないとします。

入力例と出力例はこんな感じ。

  • 入力 17 4
  • 出力 2

この問題はC問題として出したのですが、コンテストが終わってみると通してる人がほとんどいなくてびっくりしました。
(思ったより難しかったみたい?)ちょっと反省

D - Souvenir Sequence

これはけんちょんさんにいただいた問題の原文が一番ようやくとしてわかりやすいのでそれを載せます。

 n 個の整数から成る数列  a_1, a_2, \dots, a_n が与えられる。 これを  K 個の連続する区間に分割して、各区間について総和をとって得られる数  b_1, b_2, \dots, b_K の最大値を最小化したい。

これの最小値を求めてくださいという問題でした。 制約は、

  •  2 \le K \le N \le 5000
  •  0 \le a_i \le 1000

部分点として  K = 1, 2, 3 の時にそれぞれ50, 100, 150 点が入るようになっています。 入力例と出力例はこんな感じ。

  • 入力
5 2
3 6 7 1 9
  • 出力
16

実は、案をいただいた時は  -1000 \le a_i \le 1000 という制約だったのですが、 この制約にすると、満点解法の難易度がAtCoderでいうと500点レベルになります。 これだとさすがに社内で誰も解けないだろう、ということで泣く泣く制約を小さくさせていだたきました… この問題は各部分点に対しての解法がしっかりと考え込まれていて、これが競プロの上位の力かと思い知らされました。(すごい)

問題文と回答例はあとでGitHubにアップします。
上級の方の感想は書くか考え中…

登壇の覚え書き & 転職活動終わりました

二つまとめてメモ

登壇の覚えがき

話したのはこれです

supporterzcolab.com

少し前に話したのとほとんど同じ内容です。 一度やったこともあり、話はかなり落ち着いてすることができたと思います。 内容自体も前回から時間がたち理解度も上がっているのでそのあとの懇親会の中でのお話も 上手くできたように感じます。次回もし同じような内容を話すとしたらもう少しデザインパターンを混ぜこんだ内容にするのもありかなと感じました。 反省は特にないですが、次は月末にもう一回登壇があるのでそちらの準備を頑張らねば…

転職活動終わりました

タイトルの通りです。 転職活動のスタートは前にも載せましたがこのツイートから

このツイートを見ていただいて自分が想像していた以上の方から声をかけていただきました。 その中の1社でご縁ある話をいただけたので転職活動自体は1週間くらいですかね。

次の会社は現職との必要スキルが違う部分が多いので入社までになんとかしておかないとならないので、 今から勉強を頑張ります。

転職活動始めてました

そういえば書いてませんでした。

新しいことをやりたくなったので転職活動を始めました。

とりあえずやっていることはエージェントに登録したことと、 Twitterハッシュタグ付けてつぶやいたことくらいです。

そしたらいくつか面白そうなところからお話しいただいたのでもしかしたらこの中から決めて転職活動終了かも…

登壇のおぼえがき ~しゃべりながらコード書くの難しい!~

今回はVue.jsでした。

supporterzcolab.com

反省

そもそもVue.jsを初めて触ったのがこの勉強開催日の2週間前という時点で割と怪しさ満点でしたが、結果的にはなんとかなりました。 当然ですが対象を初心者に絞って扱う技術もwebpackを使わないレベルの簡単なものにしました。 逆にそう決めてしまえば2週間と時間がない中(実質土日だけでしたが…)でも範囲を絞って勉強と準備ができるので結果的によかったと思います。

初めてのライブコーディング

今回の勉強会は前回と違ってスライドを使って話す時間は10分くらいにしました。 スライドで話したのはVue.jsがどんなものかという話と簡単な文法の説明だけです。 残りの時間は実際にVue.jsを使ってTODOアプリを目の前で説明しながら作りました。

当然説明をしながらコードを書くのですがこれが思ったより難しかったです。 緊張するのでtypoはおおいし書き間違えで間違い探しを始めたりと少しグダグダしてしまう場面がありました。 とはいえ何とか完成させることはできたのでよかったです…(本当によかった……)

事前練習で作ったものはこれ↓
GitHub - Vue Todo

ライブコーディングはいい練習になるので、もっとできるようになってから再挑戦したいですね。

Javaのtry-catchを1行で書きたかったのでクラスを作ってみた

こんなことを思った

Javaにあるtry-catch文なんですが、例えばこんな処理を書くとします。 (funcが例外を起こす可能性のある処理だとします)

String str;
try {
    str = func();
catch (Exception e) {
   str = "hoge";
}

これ長くないですか?こう書きたくないですか?

String str = Try(func()).catchThenReturn(Exception.class, "hoge");

とりあえず書いてみる

処理が値を返すか返さないかで大きく変わってしまうのでとりあえずは値を返すものを対象にします。
まずはResultクラスを定義してその中に結果と例外をまとめるようにします。そして値を取り出すときはunwrap()を呼ぶ形にします。 ここまでの単純なところだけだとこんな感じ。

Resultクラス

class Result<R> {
    R r;
    Throwable e;

    public R unwrar() {
        return this.r;
    }
}

Tryクラスでの実行部分

class Try<T, R> {
    public Result<R> eval(T t, ThrowableFunction<T, R> func) {
        try {
            return new Result<>(func.apply(t));
        }catch (Throwable e) {
            return new Result<>(e);
        }
    }
}

これでとりあえず1行で書けるようになったのであとは例外を拾うためのメソッドを定義します。
例外を拾うメソッド自体もResultクラスを返すようにしておけば複数の例外に対処できそうな感じ。

public Result<R> catchThenReturn(Class<? extends Throwable> clazz, R t) {
        return new Result<>(equals(clazz) ? t : this.r, this.e);
    }

    private boolean equals(Class<? extends Throwable> clazz) {
        return this.e.getClass().getName().equals(clazz.getName());
    }
}

というわけでtry-catchをこんな感じで1行で書くことができました。

String ans = new Try<String, String>().eval("hoge", func).catchThenReturn(Hoge.class, "aaa").unwrap();

全体像

これです。Try.java · GitHub

new しないと使えなかったり、値を返さない場合のチェーンがやりにくかったりと問題は山ほどありますが、 なんとなく満足したので、これはこれで置いておきます。

SpringBootの概要に触れるコンテンツを作ったメモ

こんなものを作りました。

github.com

SpringBoot + Thymeleaf + Bootstrapで構成されています。 モデルの作成から始まって、最後は登録した商品の検索までを行うアプリを作れるようになっています。 本筋から離れてしまう認証(Spring Security)はなしで実装しています。

目的は1dayインターンと社内の新人教育用に作りました。 形式的にはハンズオンとして作っていますが、 自分が口で説明しながらの前提があるので、説明は少なめです。 説明自体はアプリを起動してhttp://localhost:8080/aboutにアクセスすると読むことができるので (もとはmarkdownファイルなのでそれを読んでもいいですが)、 自分で調べながらすすめるといったやり方もできます。

とはいえ、モデルとリポジトリの作成から、 コントローラとビューまでの一連の流れは実装しながら体験することができるので 1日用の想定とは言ってもそこそこの分量があるものになってしまいました。

ちなみに動作イメージはこんな感じです。 f:id:mosmos_21:20181022222411g:plain

実際に使ってみて難易度や乗せるコンテンツを調整できたらいいかなという感じです。 もしダウンロードして動かしてみた人がいたらぜひ感想を教えてください。