2012年11月

半年経ったのでまとめ

こちらのブログを見習い、半年くらいの事をまとめる。 入社からを基準に考える。

身につけたこと

  • Scala
    • 主に使っている。まだ困る事がしょっちゅうある。match case文で立ち止まる事が多い。
  • Playframework2(Scala)
    • 適当なAPIから取得した結果をキャッシュしてから表示するといったアプリケーションは個人でも組んだ。
    • Redisを使ったアプリは作ったが、MySQLを使ったアプリはまだやってない
  • finagle(Scala)
    • Future(非同期処理に使うもの)を多少は扱えるようになった。
  • Java
    • ScalaでJavaのライブラリを使う事はある。
    • それ以外だと練習的に触っただけ。
  • PHP
    • 仕事ではほとんど使っていない。
  • シェルスクリプト
    • テスト向けにcurlまわしたり、jar起動用のシェル書いたりした。
  • テスト
    • 多少書いたがまだ勘所はわからない。
    • Jenkinsはテスト回す程度。
  • オブジェクト指向
    • きちんとした理解までは行ってない
  • DDD(Domain-Driven Design)
    • よくわかっていない部分が多い。
  • 設計全般
    • 大規模サービスを作るときに何を考えるのか?の部分を見れたが知識が足りない。
  • HTML/CSS
    • 仕事でほとんど触ってない。
    • Twitter Bootstrap以外触ってない。テンプレートに配置しているだけ。
  • javascript
    • 仕事でほとんど触ってない。
    • jQueryとjQuery Mobile以外は触ってない。簡単なDOM操作を多少しているぐらい。
そういえば4月以降スマホアプリ開発にさわってない。

今後やること

  • 設計
    • 自分のアプリの設計、実装、リファクタリングをまわしていく。
    • 書籍は設計に関するものを増やして行く。
  • サーバーサイド
    • サーバー側で何を意識すれば良いか、さくらVPS等で動かしながらやっていく。
  • Scala
    • 今後も使っていく。
  • iOS
    • やる必要が出てきたので、とりあえず昔のアプリをiOS6対応してから新しく何かリリースする。
  • 他言語
    • 他言語もだが、他のフレームワークを使ってどういう設計をするように考えられているのかやっていきたい。


結局「できる事」は何だ?

 結局僕ができる事とは何なのかと考える事はありますが、現段階だと非常に限られた事しかできません。狭い範囲の事しかできなくなるのでは、とか色々考えてしまいます。環境のこととか。とにかく書いて読んで自分のできる事を押し広げて行くしか無いですね。

付記

入社以降読んだ本を並べてみました。なお漫画と技術書は登録していない事も多い。目についたものを片端から読んでいるらしいが、もうほんの少し自分の仕事に関わりそうな所に集中すべきかもしれない。
呪いの時代 著者:内田 樹
化物語(下) (講談社BOX) 著者:西尾 維新
絶望の国の幸福な若者たち 著者:古市 憲寿
ねじまき少女 上 (ハヤカワ文庫SF) 著者:パオロ・バチガルピ
ねじまき少女 下 (ハヤカワ文庫SF) 著者:パオロ・バチガルピ
複雑さと共に暮らす—デザインの挑戦 著者:ドナルド・ノーマン
数学ガール 乱択アルゴリズム (数学ガールシリーズ 4) 著者:結城 浩
マルドゥック・フラグメンツ (ハヤカワ文庫 JA ウ 1-11) 著者:冲方 丁
情報処理2012年05月号別刷「《特集》CGMの現在と未来: 初音ミク,ニコニコ動画,ピアプロの切り拓いた世界」 著者:
伏 贋作・里見八犬伝 著者:桜庭 一樹
虚航船団 (新潮文庫) 著者:筒井 康隆
ビジョナリー・カンパニー 2 - 飛躍の法則 著者:ジム・コリンズ
ラスト ラン (カドカワ銀のさじシリーズ) 著者:角野 栄子
歴史は「べき乗則」で動く——種の絶滅から戦争までを読み解く複雑系科学 (ハヤカワ文庫NF—数理を愉しむシリーズ) 著者:マーク・ブキャナン
プログラマが知るべき97のこと 著者:和田 卓人, Kevlin Henney, 夏目 大
倍音 音・ことば・身体の文化誌 著者:中村 明一
ドグラ・マグラ (上) (角川文庫) 著者:夢野 久作
ドグラ・マグラ (下) (角川文庫) 著者:夢野 久作
なんでコンテンツにカネを払うのさ? デジタル時代のぼくらの著作権入門 著者:岡田 斗司夫, 福井 健策
時をかける少女 (角川文庫) 著者:筒井 康隆
マイノリティ・リポート—ディック作品集 (ハヤカワ文庫SF) 著者:フィリップ・K. ディック
桐島、部活やめるってよ 著者:朝井 リョウ
フェイスブックが危ない (文春新書) 著者:守屋 英一
閉じこもるインターネット——グーグル・パーソナライズ・民主主義 著者:イーライ・パリサー
サイコパスを探せ! : 「狂気」をめぐる冒険 著者:ジョン・ロンソン
十月の旅人 (新潮文庫) 著者:レイ ブラッドベリ
南極点のピアピア動画 (ハヤカワ文庫JA) 著者:野尻 抱介
「ネットの自由」vs.著作権: TPPは、終わりの始まりなのか (光文社新書) 著者:福井 健策
メタルギア ソリッド ガンズ オブ ザ パトリオット (角川文庫) 著者:伊藤 計劃
日本2.0 思想地図β vol.3 著者:東 浩紀, 村上 隆, 津田 大介, 高橋 源一郎, 梅原 猛, 椹木 野衣, 常岡 浩介, 志倉 千代丸, 福嶋 麻衣子, 市川 真人, 楠 正憲, 境 真良, 白田 秀彰, 西田 亮介, 藤村 龍至, 千葉 雅也, 伊藤 剛, 新津保 建秀
増補 iPS細胞 世紀の発見が医療を変える (平凡社新書) 著者:八代 嘉美
ケータイ化する日本語—モバイル時代の“感じる"“伝える"“考える" 著者:佐藤 健二
情報の呼吸法 (アイデアインク) 著者:津田 大介
[Web開発者のための]大規模サービス技術入門 —データ構造、メモリ、OS、DB、サーバ/インフラ (WEB+DB PRESS plusシリーズ) 著者:伊藤 直也, 田中 慎司
アウト・オブ・コントロール—ネットにおける情報共有・セキュリティ・匿名性 著者:大谷 卓史
プレゼンテーションzen 著者:Garr Reynolds, ガー・レイノルズ
俗物図鑑 (新潮文庫) 著者:筒井 康隆
リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice) 著者:Dustin Boswell (著), Trevor Foucher (著), 須藤 功平 (解説), 角 征典 (翻訳)

finagle入門 - 複数Serviceの作り方

前回:finagleを動かすまで。
今回:複数のServiceを持たせる。

Serviceについて

 finagleでは、Serviceというものを使いアプリを作っていきます。Serviceはリクエストを受け取り、Futureの形で処理結果を返すものです。これにより非同期な処理も実現しています。
 ここで、finagleにリクエストが来たときにどのServiceを使うか振り分けるのに使うのが、RoutingService.byPathです。finagleのソースで軽く触れられていますが、どれにも該当しなかった場合は404が返ります。

サンプル

今回作成したサンプルはこちらですので、これを参照してください。
tattyamm/finagle-http-sample at v0.2
RoutingService.byPathを使ったのはこの辺りです。
  val routingService =
    RoutingService.byPath {
      case "/hello" => new HelloService
      case "/echo" => new EchoService
    }

  val server: Server = ServerBuilder()
    .codec(RichHttp[Request](Http()))
    .bindTo(new InetSocketAddress(8080))
    .name("httpserver")
    .build(routingService)

finagle入門 - サンプルを動かすまで

finagle入門記事です。finagleについて調査して最初のサンプル作るところまでをまとめました。

finagleとは

Finagle, from Twitterを見ましょう
・読み方はフィネーフル、ネにアクセント。
・Twitter社が公開したRPCフレームワーク。
・クライアント、サーバー。
・Scalaです。
・Nettyの薄いラッパー。Netty側もたまに必要になる。
・プロトコルとしてHTTP、Streaming HTTP などをサポート。
・ドキュメントだけではよくわからない事もある。ソース読む必要も。
・Futureという物を使い、非同期処理が書ける。

ドキュメント

・公式のドキュメント。一読する必要がある。
Finagle Developer Guide
Finagle Developer Guide (December 15, 2011 Draft) の適当な和訳 — Gist
・公式のAPIリファレンス
API Reference (Scaladoc)
・Twitterが公開しているScala Schoolの中にfinagle入門のドキュメントがある
Scala School - An introduction to Finagle
・日本語でFuture等についての解説が読める。
Effective Scala

Futureについて

・Futureは、まだ完了していない計算結果に対する約束(Promise)を保持する。
・同期的にブロックして結果が欲しいなら、Futureを.getすれば結果を受け取れる。
・非同期に結果が欲しいなら、Futureをmapして結果を受け取る。Effective Scalaの例に考える。
val result: Future[Int]
val resultStr: Future[String] = result map { i => i.toString }
ここでresultは、なんか処理した結果Intが結果として返ってくるFurure。このresultの結果を受け取りたいときは、Future型のresultをmapすれば良い。mapの中の値iより先は、iが受け取れるようになったら実行される。
・いくつかの処理を並列で実行し、その結果を受け取る為の仕組みも準備されている。Future.collect()やFuture.join()を使う。
・日本語ドキュメントが最近できましたので、こちらもお読みください。 Future と Promise - Scala Documentation
・Serviceとは、requestを受け取りFutureを返すもので、これを組み合わせてアプリケーションを作っていく。

finagleをはじめる準備

finagleはScalaで作ります。Scalaのビルドツールであるsbtを用意しましょう。またテンプレートを使いたいのでgiter8も入れてください。まずg8コマンドでscalaプロジェクトを作成します。
$ g8 typesafehub/scala-sbt

Scala Project Using sbt 

organization [org.example]: jp.tattyamm.finagle.sample
name [Scala Project]: finagle-sample
scala_version [2.9.2]: 2.9.2
version [0.1-SNAPSHOT]: 0.1-SNAPSHOT

Applied typesafehub/scala-sbt.g8 in finagle-sample
プロジェクトのディレクトリが作成されます。これをInteliJで読み込むためにsbt-ideaを準備しましょう。プロジェクトのディレクトリ下にproject/plugins.sbtを作成。内容は以下の通り。なお、com.github.mpeltonenの最新バージョンを確認して導入した方が良いです。(sbt-assemblyもついでに入れちゃいましょう。必須ではありません。)
resolvers += "sbt-idea-repo" at "http://mpeltonen.github.com/maven/"

addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.0.0")

//sbt-assembly
resolvers += Resolver.url("artifactory", url("http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases"))(Resolver.ivyStylePatterns)

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.8.4")
このプラグインを読み込ませ、InteliJ用のファイルを作成します。
$sbt update
$sbt gen-idea
これでInteliJのOpen Projectからプロジェクトを読み込めるようになりました。InteliJの設定がまだ残っているので、以下のことをやってください。
・File -> Project Structure -> Project -> Project SDKをJavaのバージョン(1.7)に設定。
・File -> Project Structure -> Modules -> 表示されているやつ両方 -> DependenciesのModule SDKをJavaのバージョン(1.7)に設定。
・File -> Project Structure -> Facets -> Scala -> Compiler instantiationでUse ordinary compilerを選択し、Scalaのバージョン等を設定。
これでビルドできるようになります。次は実行する為の設定です。
・Build -> Edit Configuration -> 左上のプラスボタンからApplicationを選択 -> Main classを適切に設定、Use classpath of moduleをプロジェクト名のものに設定してOKで確定
これで実行もできるようになりました。Runして確かめられます。
あと、sbtのバージョンを定義する必要があるので、project/build.propertiesに以下の1行を書いたファイルを作成してください。バージョンは環境依存ですので、sbt --versionでバージョンを確認してください。
sbt.version=0.11.3


finagleのはじめ方

さて、ここからがfinagleの準備です。finagleにはfinagle-coreというものが必要です。今回はfinagle-httpも使います。その為の準備をbuild.scalaで行います。安定板がどれかわからないので、とりあえず現時点で最新の5.3.20を入れました。最終的にこのような感じになります。resolversとlibraryDependenciesがポイント。
import sbt._
import sbt.Keys._
import scala._

object FinaglesampleBuild extends Build {

  lazy val finaglesample = Project(
    id = "finagle-sample",
    base = file("."),
    settings = Project.defaultSettings ++ Seq(
      name := "finagle-sample",
      organization := "jp.tattyamm.finagle.sample",
      version := "0.1-SNAPSHOT",
      scalaVersion := "2.9.2",
      // add other settings here
      resolvers ++= Seq(
        "Twitter Repository" at "http://maven.twttr.com/"
      ),
      libraryDependencies ++= Seq(
        "com.twitter" % "finagle-core" % "5.3.20",
        "com.twitter" % "finagle-http" % "5.3.20"
      )
    )
  )
}
ここに書いたものがInteliJに読み込まれなければ$ sbt gen-ideaなどをすれば解消されるはずです。またhttp://maven.twttr.com/は接続できない事も多いので、何度かリトライして下さい。

サンプルはfinagleのサイトにあるHttpというものを使います。ただしFilterの例としてAuthorizeクラスがあるのですが、シンプルにする為に取り除きました。ほぼコピーですがソースコードはこんな感じになります。(ソース全体はgithubのtattyamm/finagle-http-sampleにあります。)
package jp.tattyamm.finagle.sample

import com.twitter.finagle.{Service, SimpleFilter}
import org.jboss.netty.handler.codec.http._
import org.jboss.netty.handler.codec.http.HttpResponseStatus._
import org.jboss.netty.handler.codec.http.HttpVersion.HTTP_1_1
import org.jboss.netty.buffer.ChannelBuffers.copiedBuffer
import org.jboss.netty.util.CharsetUtil.UTF_8
import com.twitter.util.Future
import java.net.InetSocketAddress
import com.twitter.finagle.builder.{Server, ServerBuilder}
import com.twitter.finagle.http.Http

/**
 * This example demonstrates a sophisticated HTTP server that handles exceptions
 * and performs authorization via a shared secret. The exception handling and
 * authorization code are written as Filters, thus isolating these aspects from
 * the main service (here called "Respond") for better code organization.
 */
object HttpServer {
  /**
   * A simple Filter that catches exceptions and converts them to appropriate
   * HTTP responses.
   */
  class HandleExceptions extends SimpleFilter[HttpRequest, HttpResponse] {
    def apply(request: HttpRequest, service: Service[HttpRequest, HttpResponse]) = {

      // `handle` asynchronously handles exceptions.
      service(request) handle { case error =>
        val statusCode = error match {
          case _: IllegalArgumentException =>
            FORBIDDEN
          case _ =>
            INTERNAL_SERVER_ERROR
        }
        val errorResponse = new DefaultHttpResponse(HTTP_1_1, statusCode)
        errorResponse.setContent(copiedBuffer(error.getStackTraceString, UTF_8))

        errorResponse
      }
    }
  }

  /**
   * The service itself. Simply echos back "hello world"
   */
  class Respond extends Service[HttpRequest, HttpResponse] {
    def apply(request: HttpRequest) = {
      val response = new DefaultHttpResponse(HTTP_1_1, OK)
      response.setContent(copiedBuffer("hello world", UTF_8))
      Future.value(response)
    }
  }

  def main(args: Array[String]) {
    val handleExceptions = new HandleExceptions
    val respond = new Respond

    // compose the Filters and Service together:
    val myService: Service[HttpRequest, HttpResponse] = handleExceptions andThen respond

    val server: Server = ServerBuilder()
      .codec(Http())
      .bindTo(new InetSocketAddress(8080))
      .name("httpserver")
      .build(myService)
  }
}
これを実行し、http://localhost:8080/にアクセスした結果、「hello world」と表示されれば成功です。ServerBuilderのcodecにHttpを渡すだけでHTTPサーバーとして機能し、ここにDefaultHttpResponseを返すServiceを定義する事でサーバーに何をさせるかを定義しています。

まとめ

今回はfinagleを動かすところまでをまとめました。次回以降はもうちょっとfinagleを使った具体的な使い方を書きたいです。

参考、または参考になりそうなサイト

・最もシンプルと思われる、Herokuによるfinagleの始め方。
Heroku | Scala on Heroku
・全体の解説
steps to phantasien(2011-11-04)
・Herokuでfinagleを動かしている
Nihitok's Tumbir - finagleで作るtwitterのRESTAPIのようなサーバー1

更新履歴

2013.11.14 バージョン依存の部分を少しだけ加筆。
このサイトは
 Webアプリケーション開発のことや、iPhone・Android向けアプリ開発の話題がメインです。技術情報を取り扱っています。
 管理:えんたつ。twitter: @tattyamm
mimage
カテゴリ別アーカイブ
RSS
リンク
プログラミング本
アプリを作る時などに読んだ本
iPhoneプログラミングUIKit詳解リファレンス iPhoneプログラミングUIKit詳解リファレンス Android Layout Cookbook アプリの価値を高める開発テクニック パーフェクトPHP (PERFECT SERIES 3) JavaプログラミングBlack Book 2nd Edition (Black Bookシリーズ)
表記
当サイトではGoogle Analyticsを使用しております。詳細はこちらを御覧ください