雀巽の日記帳

雀巽が綴る日常の記録

年明けから作ってた新サービスをリリースしたよ

本日、年明けから作っていた新サービスをリリースしました。

fotowa.com

プロダクトオーナー・デザイナー・エンジニア(自分)の3人チーム (+ 周囲の惜しみない協力) で作っているため、システム側の決定権(責任)がほぼ全て自分にある状態で、それがなかなかに楽しいです。ビジネス要件定義、データモデル、システムアーキテクチャ、システム設計、プログラミングなどなど、ほぼ全部やってます。ある意味自由!

ほぼ全部をやってると書いてふと思ったのですが、やはり現在のプログラミングとシステム設計(詳細設計・基本設計)は切っても切れない関係だなと感じます。プログラマを単なる作業者として扱うことや、プログラミングに明るくない人がシステム設計に関わることの厳しさがよくわかります。 この辺の話も色々と自分なりの結論が出てきた*1のですが、とりあえずこの辺にしておきます。

そうえいば約1年前、転職する際の面接で「自分の作ったサービスと言えるものを作ってみたい」と何度か言った記憶があるのですが、今まさにそんな感じの仕事をしている状態です。有り難い。

サービス自体は、まだまだやることや決めきれていないところがたくさんあって、単にとりあえずリリースできたという状態なだけですので、ここからが勝負です……! 品質とスピードを両立させながら突き薦めるように色々試行錯誤してみます。

ちなみに個人的に思う品質の高いソフトウェアとは、

  • 求める機能が提供されている
  • 変更に強い

のどちらもが満たされている状態だと思っています。

しっかし、作ったものがちゃんと動くのかどうかという点に関してだけは、初めてプログラミングをしたときから未だに全く自分を信じられん……ホントに動くんかいなこいつ?

謎い。

*1:雑にまとめると、「大規模で複雑になった時点で人間の認知限界を超えるから負けで、こうなると SIer 的に挑むくらいしか対処法が思いつかない。それぞれを小さく疎結合で保ち続け、そのそれぞれを継続的改善していくのが良い。この継続的改善において、設計と実装の両方の知識が求められる」みたいに考えてます

Happy New Year 2016

あけましておめでとうございます!

昨年はありがとうございました。 今年もよろしくお願いします。

とりあえず、簡単に2015年の振り返りをしてみます!

necojackarc.hatenablog.com

去年の1月1日のブログによると、2015年の目標は、

  • Webエンジニアとしての基礎を修得する
  • 仕事を趣味の一部に組み込む
  • インプットの種類と量を増やす
  • 目に見える形でアウトプットを行う
  • インプット&アウトプットの継続化
  • 生活リズムを正常化する
  • 体調を整えて生き延びる

とのことです!ほう!

細かく振り返りはしませんが、生活リズム以外イケた気がします。 体調も若干怪しいですが生き延びたのでセーフです。

2015年に何をしてたかもざっくりまとめると、

こんな感じでしょうか。

2015年は転職したりベトナム行ったりオンライン英会話始めたり、変化の年って感じがします。

2016年は地力を底上げする成長の年にしたいなと思います。 始めた英語とか、中途半端にしかしかできなかった競技プログラミングとか、この辺をもっと本格的にやります。 そして、それを具体的に見えるような形で示したいと思います。

というわけで、2016年の目標は、

です!相変わらず目標って呼び方が相変わらず不適切な目標の建て方ですね!

基本的な方針は去年と全く変わらず、

  • 生きたいように生きる
  • 将来像に向けて歩を進める

のままです!

去年のブログに、

将来の自分が過去の自分に向かって胸張れる存在になれるようにマイペースに生きていきたい

って書いてありましたが、もちろんこの考え方も変更なしです。

マイペースに生きたいように行きたい方向に進んでいきます!

それでは、2016年も楽しんで行きましょう!

「Web開発者のための大規模サービス技術入門」を読んだ

同僚にオススメされたので読んでみました。

読んでみて、

「基本を応用するための基礎を教えてくれる本」

だと思いました。

負荷分散と OS の動作原理というコラム内で、

結果としては、OS の動作原理を知るということが、負荷分散の学習に重要でした。

とあるんですが、まさにこんな感じの内容です。

などの計算機科学の基本を、どのようにして応用するかの基礎が学べます。

とりあえず読んでて、

と思いました!素晴らしいインターンすぎでしょ!!

計算機科学ってことで、読みたい本リストに1年以上入りっぱなしの以下の本もぼちぼち手をだしたい……。

とりあえず、完全に競技プログラミングをサボってるので、まずはそっちですね!

基本の大切さと応用の基礎を教えてくれる良い本でした。

SQLアンチパターンが良書だった

8ヶ月位積読化していた SQL アンチパターンを読みました。

SQLアンチパターン

SQLアンチパターン

内容が非常に面白く、スラスラと読み進めることができました。

「この場合って確かにどうするんだろう……アンチパターンやっちゃいそう……」みたいなことや、「あ〜これ見たことあるわ〜遭遇したわ〜」みたいな内容が多く、とても楽しかったです。

リファクタリングの「コードの臭い」と同じで、「これなんか臭うな……」という嗅覚を磨けると感じました。

こういうタイプの本は読んでて楽しいし内容が入ってきやすいので好みです。

「うわ、なんかこれヤベェ……」って感じれるのは非常に重要だと思います。

印象的だった章

せっかくなので印象的だった章を幾つかピックアップしてみます。

2章 ナイーブツリー (素朴な木)

解決策のゴリゴリのアルゴリズム感にしびれました。Closure Table (閉包テーブル) が好き。

Common Table Expression を用いた再帰クエリを初めてみた時、摩訶不思議に感じた記憶が鮮明に蘇ってきました。

3章 ID リクワイアド (とりあえずID)

@t_wada さんが前書きで言っていましたが、まさに賛否両論ありそう。 実は今日、@t_wada さんにオススメしていただいた楽々 ERD レッスンという本も軽く読んでいたのですが、この本には ID を導入することの利点が載っていました。

楽々ERDレッスン (CodeZine BOOKS)

楽々ERDレッスン (CodeZine BOOKS)

ID とコードの違いや、ID の存在理由などについて、なるほどなぁと思わされたので、こちらにも目を通すと面白いかと思います。

5章 EAV (エンティティ・アトリビュート・バリュー)

RDB での継承の実装方法について学べたのが良かったです。

  • Single Table Inheritance (単一テーブル継承)
  • Concrete Table Inheritance (具象テーブル継承)
  • Class Table Inheritance (クラステーブル継承)

この辺の章は、データとメタデータについてきっちり考えろよ、というテーマだと思います。

11章 ファントムファイル (幻のファイル)

モノによっては BLOB 型が確かに使えるということに気付かされました。 ファイルの特性に応じて、アンチパターンにするかどうかをしっかり考える必要があると感じます。

13章 フィア・オブ・ジ・アンノウン (恐怖の unknown)

データ移行チームで SQL を毎日毎日書きまくってた時に、SQL が3値論理だということを知らずに少しハマった記憶が蘇ってきました。 ちなみに、上で挙げた CTE を初めてみたのもデータ移行チームで超大量のデータとスパゲッティクエリと戦ってた時です。

15章 ランダムセレクション

ランダムに値取り出したい時どうしよう!と、悩んだ記憶がこれまた蘇ってきました。 解決策で示されてた方法のどれかを使ってその時は凌いだような気がする。

16章 プアマンズ・サーチエンジン (貧者のサーチエンジン)

独立行政法人の巨大システムを作ってた時、なんかこれ使ってあいまい検索が実装されてた気がします。 フルテキスト検索専用の何かを使わないとキツイよね……。

24章 マジックビーンズ (魔法の豆)

個人的に一番印象に残りました。 アクティブレコードパターンを利用した全てのフレームワークで陥る可能性が高いので、これは気をつけたいです。

モデルをアクティブレコードの has-a (集約) で構成すれば良い、というシンプルな解決策に「確かにー!」となりました。

〜モデルはテーブルから分離させましょう〜

感想

面白いし勉強になるし素晴らしかった!

Rails5.0.0-beta1のActionCableを使って超簡易チャットを実装してみた

Rails 5.0.0-beta1 が December 18, 2015 にリリースされたようです。

公式ブログを爆速で翻訳してくださった方がいるので、そちらも貼っておきます。

qiita.com

WebSocket を扱える Action Cable に興味があったので、早速 Rails 5.0.0-beta1 を入れて、ほぼ写経で超簡易チャットを作ってみました。

Rails 5.0.0-beta1 をインストール

以下のコマンドでインストールできます。

$ gem install rails --pre

Ruby は 2.2.2 以上が必要らしいです。

Redis をインストール

Action Cable では Redis を使用するらしいので、そちらもインストールしておきます。

$ brew install redis

インストールしたらredis-serverと叩いて起動しておきます。

チャット画面の作成

ネットの海をさまよってたらやりたいことを Rails 4 と ActionCable を使ってほぼまんまやってるくださってる記事を見つけました。

nithinbekal.com

ありがたく写経に励みます。

config/routes.rb

Rails.application.routes.draw do
  resources :sessions, only: %i(new create)
  resources :messages, only: %i(index create)
end

app/controllers/sessions_controller.rb

class SessionsController < ApplicationController
  def create
    cookies.signed[:username] = params[:session][:username]
    redirect_to messages_path
  end
end

app/views/sessions/new.html.slim

= form_for :session, url: sessions_path do |f|
  = f.label :username, "Enter a username"
  br
  = f.text_field :username
  br
  = f.submit "Start chatting"

app/controllers/messages_controller.rb

class MessagesController < ApplicationController
  def create
    head :ok
  end
end

app/views/messages/index.html.slim

| Signed in as @
= cookies.signed[:username]
br
br

#messages
br
br

= form_for :message, url: messages_path, remote: true, id: "messages-form" do |f|
  = f.label :body, "Enter a message:"
  br
  = f.text_field :body
  br
  = f.submit "Send message"

erb ファイルは写経する気が起きなかったので、slim に書きなおしました。

これで画面が完成です。次は Action Cable の設定をしていきます。

Action Cable の有効化

先ほど紹介した記事中ではcable/config.ruを作成してbundle exec puma -p 28080 cable/config.ruを実行することでスタンドアローンで Cable サーバーを立ち上げていましたが、Rails 5.0.0-beta1 では デフォルト開発サーバーが Webrick から Puma に変更されているため、同一プロセス上で Action Cable が実行できます。

せっかくなので、bin/rails serverと起動するだけで Action Cable が使えるように設定したいと思います。

config/routes.rb

routes ファイルに以下のルーティングを追加します。

Rails.application.routes.draw do
  match "/websocket", to: ActionCable.server, via: %i(get post)
end

app/assets/javascripts/cable.coffee

次に、cable.coffee ファイルで Websocket サーバを指定します。

@App ||= {}
App.cable = ActionCable.createConsumer("/websocket")

Rails App と同一サーバで Action Cable を起動するため、上記のような記述になります。 開発サーバの設定がデフォルトであればws://localhost:3000/websocketに対してコネクションを要求するようになります。

チャット用 Channel の追加

Consumer に Subscribe させる Channel を追加します。

app/channels/messages_channel.rb

参考サイトに従い MessagesChannel を作成しました。

class MessagesChannel < ApplicationCable::Channel
  def subscribed
    stream_from "messages"
  end
end

チャットメッセージの Broadcasting

チャットメッセージが投稿された際に Channel に Broadcast するように設定します。

app/controllers/messages_controller.rb

class MessagesController < ApplicationController
  def create
    ActionCable.server.broadcast "messages",
      message: params[:message][:body],
      username: cookies.signed[:username]

    head :ok
  end
end

Channel の Subscribe

Consumer に MessagesChannel を Subscribe させます。

app/assets/javascripts/channels/messages.coffee

App.messages = App.cable.subscriptions.create 'MessagesChannel',
  received: (data) ->
    $('#messages').append @renderMessage(data)

  renderMessage: (data) ->
    "<p><b>[#{data.username}]:</b> #{data.message}></p>"

開発サーバの起動

開発サーバをbin/rails serverで起動するとあら不思議、WebSocket を利用したリアルタイムチャットの完成です!

感想

あっという間にリアルタイムチャットが完成しました。 サーバープッシュを初めて実装したので、ほぼ写経だったとはいえ動いた時は感動しました。

今回は認証は不要だったので Connection Identifier については一切設定していませんが、こちらを設定すればコネクションの貼り直しなども簡単に行えそうです。

フロントエンドも含めて Rails のレールに乗って開発するなら、Action Cable を使えばかなり効率的に WebSocket を利用できるような気がします。

まとめ

おおまかに、

  1. Action Cable を有効化する
  2. Channel を作成する
  3. Channel に対する処理を実装する (Server/Client)

と言った手順で Action Cable を使用できました。

また、作成したリポジトリGithub に置いてあります。

github.com

余談

最初読み間違えてて The Haskell Cabal の親戚か何かかと思ってました。

今だに脳内で「Cabal」と読んでしまう。

ネットワークスペシャリスト試験に合格しました

ネスペ合格しましたー!

ワーイヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノワーイ

去年は無勉で突撃して途中で逃げ帰りましたが、今年は無事に合格することができました。

備忘録的に各セクションで行った対策をまとめておきます。

起床対策

最難関セクション。

最悪の場合睡眠導入剤を使って強制入眠しましょう。

当日は超寝不足で死ぬかと思いました。
早起きしなきゃと思うと全く寝付けません。

誰か精神を落ち着けて早寝する方法教えてください。

午前対策

ネットワークスペシャリストドットコムネットワークスペシャリスト試験過去問道場のみを使いました。

応用情報にはここの姉妹サイトである応用情報技術者試験ドットコム応用情報技術者過去問道場スマホからポチポチしてただけで受かりました。

応用情報対策をしていたときには、まだネスペ対策サイトはなかったのですが、気がついたらできていました。素晴らしい。

今回もスマホからポチポチしてただけで問題なく午前突破できました。

午後対策

マスタリング TCP/IP の入門編を読みました。

マスタリングTCP/IP 入門編 第5版

マスタリングTCP/IP 入門編 第5版

試験自体への対策は面倒だったので一切行っておらず、本当にこの本を読んだだけです。

流石神書籍と言われるだけのことはあります。

あと、大事なのはきちんと問題文を頭から読んでいくことだと思いました。 登場人物の立場になりきって、問題文をしっかり読み進めると良いと思います。

問題文に出てくるエンジニア、めっちゃ優秀やわ〜って思いながら読んでました。

感想

とても嬉しい!

「例解 和文英訳教本 (文法矯正編) --英文表現力を豊かにする」が面白かった

最近、面白かった本を読み終えたらブログを書いている id:necojackarc です。

そんなわけで、先日「例解 和文英訳教本 (文法矯正編) --英文表現力を豊かにする」の一周目を終えました!

例解 和文英訳教本 (文法矯正編) --英文表現力を豊かにする

例解 和文英訳教本 (文法矯正編) --英文表現力を豊かにする

こんな重厚なタイトルの本に、2015年12月現在で43件のレビューで星4.7がついてる時点で、相当凄いなと思うんですが、実際読んでみると凄いです。凄く良いです。

購入した動機ですが、会話をする際や英文を書くとき、細かい部分がとっさにわからず「とりあえず通じはする気がするけど……」といった文章を組み立てることが多々あり、その辺をちょっと叩き直したいなと感じていたからです。

はじめに、

「文章を意識しない英語教育」は、低次元の英会話だけやっている文には可能かもしれないが、英作文という名の付く学習においてはあり得ないことである

と書かれているのですが、まさにそれを日々のオンライン英会話や業務で実感していました。

文法矯正編とあるように、徹底して叩きなおしてくれます。

和文を英訳し、解説を読み、最後に英文を諳んじることができるようにする、という読み方を一周目ではしたのですが、かなり時間がかかりました。

ただ、その分得られるものはあったと思います。

あと、他の書評でも仰ってた人も見かけましたが、一億人の英文法のあとに取り組むのに良いと感じました。

一億人の英文法 ――すべての日本人に贈る「話すため」の英文法(東進ブックス)

一億人の英文法 ――すべての日本人に贈る「話すため」の英文法(東進ブックス)

英文法へのアプローチというか、考え方というか、説明の仕方が似てるなと感じます。

「こういう思いやニュアンスを伝えたいからこういう文法があるんだ」という実践的な考え方が共通点しています。

一億人の英文法では広く網羅的に、和文英訳教本 (文法矯正編) では重点を徹底的に、と言った感じでしょうか。

とりあえず、一周読みきった程度では矯正しきれているとは到底思えないので、各例題をさらさら英訳できるように練習したいなと感じます。

が、重い……重いので、この本に関しては二周目は少しずつ頑張ります!笑

全ては気持ちを伝えるためのツール……英語で自分の気持ちを余すことなく伝えられるようになりたい……!

「英語は壮大な慣れである」という偉大な言葉を忘れず、毎日頑張りたいと思います。