yikegaya’s blog

仕事関連(Webエンジニア)と資産運用について書いてます

「プログラミングコンテスト攻略のためのアルゴリズムとデータ構造」読んだ

2ヶ月くらい地道に読んでいた「プログラミングコンテスト攻略のためのアルゴリズムとデータ構造」読み終えた。

プログラミングコンテストにデビューするために読んだ。。 。わけではなく、アルゴリズムとデータ構造をちゃんと勉強してみようと思って、評判のいい教材を探していたら本書を見つけた感じ。

サンプルコードはCとかC++だけど、普段Rubyばかり使っててCとかあんま知らない私でもその点は大丈夫で普通に読めた。

内容

「Aizu Online Judge」という会津大学が運営しているオンラインジャッジシステムの問題を取り上げてその問題を解説しながらコンピュータサイエンスのメジャーな アルゴリズムとデータ構造を勉強できる。

「基礎編」で情報処理試験でも見るような並び替えアルゴリズム、データ構造、探索ヒープ、グラフアルゴリズム(グラフアルゴリズムは情報処理でみた覚えない気も。。)を学んで、「応用編」でその知識を応用して高度なデータ構造、グラフアルゴリズム、計算機科学、動的計画法整数論ヒューリスティック探索とだんだん問題の難度が高くなってく感じ。

感想

ソートアルゴリズムとかデータ構造とか探索アルゴリズムとかは学んだことがあったけど、そこから繋がっていくグラフアルゴリズムを学べたのが個人的には良かった。

本書の中で

コンピュータで扱う多くの問題は「対象」とそれらの「関係」を抽象的に表した"グラフ"と呼ばれるデータ構造で表すことができます。

と書いてあるけど、例えば深さ優先探索幅優先探索とハッシュを組み合わせて行くとチェス盤にどのクイーンも他のクイーンを襲撃できないようにする「8クイーン」問題がとけたりする。

こうして初歩的なデータ構造とアルゴリズムを発展させて応用していろんなパズルが解けるようになるんだな。。

と、こうしてどう使われているかをイメージできるとアルゴリズム学ぶのも面白くなってくる感があった。

Trelloでのマルチタスク管理

長いことタスク管理はメモ帳に雑に箇条書きしていたんだけど少しずつ Trello で管理するように移行してみている。

Trelloとはそもそも

Trelloはカンバン方式でタスク管理できるツールでボード、リスト、カードの3つの要素でタスクを管理できる。

これまで

これを最近開発の時に使っていて

ボード→チケットとかisuue名(なんとか機能の実装とか、バグ修正とか)
リスト→未着手、進行中、完了
カード→細々としたこと(バリデーション足すとか、クラスファイル作るとか、ルータの実装とか、テストとか)

みたいに組んでたんだけど今やってるタスクでは違う構成でやってみたら割と良かった

今やってるチケット

管理画面に機能追加するタスクでアプリを2ついじらないといけない(リポジトリも2つ)

アプリ1(本体)にAPI実装して、アプリ2からリクエスト投げてデータをupdateする感じ。

で、それぞれにやることがあってごちゃごちゃするので

ボード→チケット名
リスト→アプリ1の進行中タスク、アプリ1の完了タスク、アプリ2の進行中タスク、アプリ2の完了タスク
カード→細々としたこと

の構成に変えてみて割とスッキリ整理できた。リストが増えすぎるのはなんか嫌だったので未着手と進行中はまとめてみた。

割とTrelloいい

ググってみるとTrelloの使い方は色々とパターンあるみたいなので調べてみようかと。

ただ他にもタスク管理ツールで評判いいのはあるっぽいので他のも試してはみたい

Rails APIモード + Reactに入門してみる

Reactのチュートリアルをやったので、次にRailsと連携させてみた。

RailsとReactの連携方法を調べるとざっくり2パターンあって

  1. Rails側でルータやビューを作ってjQueryの代わりのライブラリとしてReactを導入する。
  2. APIモードでRailsアプリを作って、それとは違うポート番号でReactのアプリを起動してRailsから飛ばした APIとReactを連動させる

前者はすでにRailsで作られたアプリがあってとりあえずそこでReactを試してみたい。という場合に採用される。

メジャーなやり方は後者で、メリットもこっちのが大きくて以下が挙げられる

  • フロントエンドとバックエンドの開発を切り分けれられる。デプロイも別々にできたりする
  • ルータをReactに寄せられるのでSPAで快適なユーザ体験を作れる

いい感じのチュートリアルがないか探してみた

なんかいい解説ないかなと探してみて以下のQiitaの記事が良さそうだったので参考にさせてもらい作ってみることにした。

react.orgのReactチュートリアルのアプリとRailsを連携させる解説記事。

qiita.com

この記事が書かれたのは2017年で今はReactチュートリアルの内容は変わっている(この記事のアプリはテキストフォームから文字列を入力して入力したコメント一覧を画面に表示するアプリを作るのが、2019年現在はReactチュートリアルの内容が三目並べに変わっている)

が、2017年時点でのReactチュートリアルのコードは Githubに置いてある ので特に問題なくできる。

仕組み

react側の実装

public以下にjavascript(example.js)を置いて、あらかじめreactチュートリアルで用意されているrubyで書かれたwebサーバ(server.rb)を起動する。

server.rbに以下のようにHTTPリクエストの内容とURLを指定している。

  if req.request_method == 'POST'
    # Assume it's well formed
    comment = { id: (Time.now.to_f * 1000).to_i }
    req.query.each do |key, value|
      comment[key] = value.force_encoding('UTF-8') unless key == 'id'
    end
    comments << comment
    File.write(
      './comments.json',
      JSON.pretty_generate(comments, indent: '    '),
      encoding: 'UTF-8'
    )
  end

example.jsを読むと最終的にHTMLを描画するrenderメソッドの中身は以下のようになっていて

  render: function() {
    return (
      <div className="commentBox">
        <h1>Comments</h1>
        <CommentList data={this.state.data} />
        <CommentForm onCommentSubmit={this.handleCommentSubmit} />
      </div>
    );
  }

コメントリストはコンポーネントでstateに入れて、コメント送信はhandleCommentSubmitメソッドで実装されている。

コメント登録処理

handleCommentSubmitメソッドの中をみてみると、引数にフォーム入力したcommentを取ってそれをAjaxjson形式でPOSTしている。

引数に取ったcommentは他のコメントとconcatしてreactのsetStateで状態保持させる。

  handleCommentSubmit: function(comment) {
    var comments = this.state.data;
    comment.id = Date.now();
    var newComments = comments.concat([comment]);
    this.setState({data: newComments});
    $.ajax({
      url: this.props.url,
      dataType: 'json',
      type: 'POST',
      data: comment,
      success: function(data) {
        this.setState({data: data});
      }.bind(this),
      error: function(xhr, status, err) {
        this.setState({data: comments});
        console.error(this.props.url, status, err.toString());
      }.bind(this)
    });
  },

飛ばす先のURLはReactDOM.renderで指定している

ReactDOM.render(
  <CommentBox url="http://localhost:3001/comments" pollInterval={2000} />,
  document.getElementById('content')
);
コメント表示処理

Railsがデータベースからコメントを取り出してAPIを飛ばす。それをserver.rbでJSONに入れてReactの状態に入れて描画している。

フォーム送信時(POSTした時)は追加されたコメントがReact側の状態(props)に追加されてそれも描画される。

var CommentList = React.createClass({
  render: function() {
    var commentNodes = this.props.data.map(function(comment) {
      return (
        <Comment author={comment.author} key={comment.id}>
          {comment.text}
        </Comment>
      );
    });
    return (
      <div className="commentList">
        {commentNodes}
      </div>
    );
  }
});

rails側の実装

まず/comments へのpostを受けとるとコントローラのcreateメソッドを呼ぶようにルータを定義。

createメソッドの中身は以下の通りでパラメータをCommentモデルに渡してsaveする。 最初に全コメントを描画するためのselect(Comment.all)もこのメソッド内でやってしまう。

  def create
    @comment = Comment.new(author: params[:author], text: params[:text])

    if @comment.save
      comments = Comment.all
      render json: comments, status: :created, location: @comment
    else
      render json: @comment.errors, status: :unprocessable_entity
    end
  end

やってみて

やっぱ読むだけより実際手を動かして動くところまで作ると気づきが多い感ある。

ただ今回のやり方はReactをrubyで書いたwebサーバで起動してそのサーバのコード内でHTTPリクエストの内容とURLを指定して実装していたけどそのやり方はメジャーではないかもしれない。

Reactはyarnとかnpmで起動させてAPIの受け渡しはjavascript側でaxiosとか使ってやってるところが多いのではないかと。その辺のやり方は別途深掘りしたいけど入門としては今回くらいがわかりやすくてよかった。

Reactに入門してみる

次の職場のフロントエンドがReactらしいので予習として このサイト のReactチュートリアルやってみた。

+よくわかんないとこググって調べてみた

チュートリアルの内容

Reactを使って三目並べのアプリを作るチュートリアル

Reduxとかルータの話題は出ない。

感想

無料だし最初のとっかかりとしてよかった。

Reactは前に Udemyの講座 を受けてみたことがあったけど、先にこっちのチュートリアルやってからの方がよかった気がする。

Udemyの方は

  • 作るのが本格的なアプリで情報量が多い
  • ReactライブラリだけでなくRedux、ルータの解説もある
  • 楽天API、GoogleAPIの使い方も学べる
  • 有料といってもセールだと2000円以下なので安い

とかで充実はしていたけど当時の前提知識だと重く感じた。

あと動画が配信されてから日が経っていてライブラリとかAPIの情報が古くて自分で色々デバッグするはめになったりはしていた。

気づき的なことメモ

  • 一昔前は日本語ドキュメントの多さでVueがだいぶ有利だったかもしれないけど、色々ググってみてReactの方も十分日本語の情報揃ってる感はあった。
  • 「React」っていうとフレームワーク扱いされるけど、ReactもVueと同じでそれ単体だとjQueryの問題を踏まえて作ったフロントエンド開発の保守性を高めるライブラリであって、Reduxとかルータとか後付けて色々足してくとフレームワークっぽく使える
  • コンポーネント」という再利用可能なUI部品を組み合わせて開発する
  • コンポーネント間で「状態」(三目並べでいうと◯×とか)を受け渡す
  • stateに状態を保持して親コンポーネントから渡ってきたものをpropsに受け渡す
  • 最終的にコンポーネントから受け取った状態をrenderメソッド内のHTMLで描画する
  • renderメソッドは初回の描画でこの中では状態とかDOMを変更してはいけない。コンポーネント間で状態受け渡し→renderで描画のルールがある

これから学ぶこと

この後またReact深掘りしようと思った時に何しようか、思いつくまま書いてみると

  • Railsと連携させてみる(RailsからAPI飛ばしてReactと受け渡しさせる)
  • Reduxとかルータの話題は出なくてその辺の理解まだいまいちなので深掘りする
  • Reactベースで開発に必要な機能全部入りのNext.jsとかいうやつも気になる
  • javascriptの復習する。今回のチュートリアル内で このサイトjavascriptのおすすめおさらい教材として紹介されてたので読んでみたい
  • リントとかテスト触る
  • 「Reactは関数型言語っぽい」らしいけどよくわかってないので調べる。今の理解だと関数型言語は「関数の中の変数の状態を変えずに、関数そのものを他の関数の引数にする」的な組み方をするのでその辺が状態→renderメソッドの流れに似てるとかかと思ってるけど知らない。

キャリアプラン的には当面バッグエンドよりかと思ってるし、 Githubの有名なロードマップ みると道のりは険しいというかそんなに簡単にキャッチアップはできないのかもしれんけど、フロントエンドもできるようになれればいいな。。

その他Reactを調べていて参考になった記事

入門記事としてはこれ読めば良いのでは

https://qiita.com/tomzoh/items/7fabe7cb57dd96425867

メモ管理を色々試した結果

今までメモの手段は色々試してみていて ツールとしては手書き(ほぼ日手帳)、macのローカルのメモ帳、evernoteと試してみたけどしっくりこなかった。

で、最近「simple_note」というクラウドのメモアプリを試したらかなりしっくりきていてヘビーユーザー化している。

今までのツールへの不満としては以下の感じ

手書き

  • 当たり前だけど検索機能が無い
  • 毎年変わるので昨年度のメモが消えていく
  • タイピングの方が早い

maciPhoneのローカルメモアプリ

  • UI的には好きなんだけど、会社のPC、自宅のPC、iPhoneで同期できないのが不満

evernote

  • クラウドで管理できて割といいけどそこまで凝ったUIを求めてなくてmacのローカルメモ超アプリくらいのシンプルさでいい。
  • わからない英単語とりあえずメモっといたり、あとで見返したいURL貼ったりとかさっと書きたい時が多いのでシンプルのがいい

そこでsimple_note

  • UIがほぼmaciphoneのメモアプリのまま
  • クラウドで管理できる
  • フォルダではなくタグでメモを分類するんだけど、これが結構良い

だいたい満足してるけど不足点

やっぱ手書きで図を書きたい時とかがあってそういう時に対応できない。 手帳だと続かないんで、タブレットのお絵かきアプリとかでさっと書いて、クラウドで管理するといいかもと妄想している

求職活動時に聞いたGo言語の話

2つ目の会社をマッハで退職することになって今月、正社員とフリーランスで求職活動してみた。

で、私が希望している条件の職場はやたらGo言語率が高かったので、その時に聞いたGoの話をメモってみる。 私はGoはチュートリアルざっとやっただけなのであくまで聞いたことのメモ

ざっと箇条書きすると

  • 言語として優秀。速くて学習コストが低い
  • Dockerと相性がいい
  • エンジニアに人気があるので採用活動で有利に働く

言語として優秀

大方のWeb系企業のサーバサイド技術はそこまで実行速度を求められない部分はRubyPHPPythonフレームワークで作って実行速度早くしたいところはJavaとかScalaで書いたりするケースが多かったのが、その辺をGo言語に置き換える率が高くなっていて理由としては

  • シンタックスがシンプル
  • 学習コストが低い。Javaに比べて覚えることが少ない。Scalaみたいに関数型の振る舞いを覚える必要も無い
  • ポインタや並列処理が書けるので高速な処理を作れる

Dockerと相性がいい

JavaよりもGoの方がDockerコンテナ上で速く動くらしい。細かいことは知らない

エンジニアに人気があるので採用活動で有利に働く

優秀なエンジニアほど新しい技術触ってみたがるし、なんかGoできるとかっこいいみたいな風潮があるらしいので使っとくとエンジニア採用しやすいらしい

とにかく評判がいい

とにかく評判が良くて上り坂の言語であるので使ってみたさある。次の職場でも採用されているので隙をみて触らせてもらおうと思う。

エンジニアの錯覚資産について考えたこと

某テック系youruberさんがエンジニアが信用を価値散る上での「錯覚資産」というテーマで語っていて個人的にも色々考えさせられたので考えたこと書いてみる。

個人的にはエンジニアという職種のメリットの一つは錯覚資産の勝ちとりかたに幅があって学歴以外の錯覚資産を積み上げていけば十分に稼げたりポジション取りできる点で、実際観察した範囲だとエンジニアコミュニティの中である程度名をあげている人でも高卒だったりMARCH文系だったり無名大学だったりする人はいると思っていたり。

個人的に観察した範囲でのエンジニアの錯覚資産になりそうな実績、肩書き

職歴

やっぱり有名IT企業で働いてたとかCTO、テックリード経験ありというのは信用を勝ち取る上で有利なのは間違いないと思う

学歴

他の職種と同様に東大卒とかの学歴は業界を渡っていく上で有利に働くことは事実だと思う。後コンピュータサイエンス出身ってのはやっぱ有利。

ただ、前述したように他の錯覚資産でこれによるヒエラルキーを壊していけるのはエンジニア職のいいとこかと。

資格

Disられがちだけどエンジニアのキャリアアップの手段として結構ありだと思う。エンジニアになりたかったらとりあえずポートフォリオ作れって意見もあるけど、初学者が良質なポートフォリオを作るよりかは基本情報とかJava SilverとかLPICをとる方が楽だしエンジニア職につくには近道な気もする。 ただ、資格が評価されるのはSI、業務システムの世界で、Web系にいきなりいくならどこまで有効かは微妙。

ポートフォリオ

PHPとかRuby、モダンフレームワークで良質なポートフォリオを作れれば求職で有利に働くのは間違い無いかもしれないけど正直プログラミングスクールとかに通わずに自力でやり遂げるのは難しいと思う。

twitter、ブログでの発信

これはまめにやっとくと効果ある気が。

結局どれがいいのか

初学者でCSの学位がなくて自力でポートフォリオ作れる気がしない場合

プログラミングスクール通ってポートフォリオ作成してWeb系に潜り込む or 資格とってとりあえず業務システム開発案件に入ってJavaとかC#あたりで経験積む

自力でいける場合

ポートフォリオ作ればいい

高学歴かCS出身

まあ、そのまま新卒カードでどっかいいとこ入れば