Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Spring XMLでCamelを書いて、twitterとelasticsearchを連携(Apache Camel入門 その3 Spring XMLについて)

こんにちは、もっと多くのJava技術者がCamelで楽できるはずと信じているツカノ(@)です。

前回は、発達したJavaのエコシステムの恩恵にあずかり、実質数行のJavaコードで、twitterとelasticsearchを連携させることができました。
今回は、Spring XMLでCamelを記述することで、twitterとelasticsearchを連携させてみましょう。

f:id:acro-engineer:20131125064348p:plain

「Camelって何?」って人は、前回までの内容を確認しておきましょう。

CamelのDSLについて

これまで説明してきたCamelのサンプルは、Javaのコードでした。実はこれはCamelの一面でしかありません。Camelは様々なDSLで表現することができ、Java DSLはその中のひとつです。CamelのDSLページによると、今のところ、以下のようなDSLを使うことができます。

プロジェクトの特性などに合わせて好きなDSLを使えるのは、Camelの良いところです。今後、Clojureとか、JRubyのDSLが出てきたら面白いですね。
さて、Springを使っているプロジェクトは多いと思いますので、Spring XMLを使ってみましょう。今までJavaのコードで表現していたCamelをSpringのXMLで表現します。このDSLを使うと、Camelのoption設定等をハードコードせずにCamelを利用することができます。また、Springの資産(DI等)を利用することができます。今回の例では登場しませんが、Springのscopeを利用すれば、グローバルなオブジェクトを利用することも、スレッド単位で異なるオブジェクトを利用することもできます。

Spring XMLで実装してみましょう

mavenをインストールしてあれば、アプリケーション開発のひな型を生成できます。以下のコマンドを実行してください(groupId, artifactId, versionは作成するアプリケーションに合わせて読み換えてください)。

mvn archetype:generate -DgroupId=snuffkingit \
    -DartifactId=camel-example-spring \
    -Dversion=1.0.0-SNAPSHOT \
    -DarchetypeGroupId=org.apache.camel.archetypes \
    -DarchetypeArtifactId=camel-archetype-spring \
    -DarchetypeVersion=2.12.1

このシリーズの1回目で似たようなこと行いましたね。そこではarchetypeArtifactIdとして「camel-archetype-java」を指定していました。それを「camel-archetype-spring」に変更しただけです。

さて、mavenでひな型を生成ましたが、今回はJavaコードは生成されていません。代わりに生成される、以下の設定ファイルを変更します。

src/main/resources/META-INF/spring/camel-context.xml

前回作成したTwitterCrowler.javaをcamel-context.xmlに置き換えると以下の通りです。(twitter APIのconsumerKey, consumerSecret, accessToken, accessTokenSecretについてはマスクしています)

<?xml version="1.0" encoding="UTF-8"?>
<!-- Configures the Camel Context-->

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:camel="http://camel.apache.org/schema/spring"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

  <camel:camelContext>
    <camel:route>
      <camel:from uri="twitter://search?type=direct&amp;keywords=camel&amp;consumerKey=xxx&amp;consumerSecret=xxx&amp;accessToken=xxx&amp;accessTokenSecret=xxx"/>
      <camel:marshal>
        <camel:json library="Jackson"/>
      </camel:marshal>
      <camel:to uri="elasticsearch://elasticsearch?operation=INDEX&amp;indexName=twitter&amp;indexType=tweet"/>
    </camel:route>
  </camel:camelContext>

</beans>

直観的にイメージは伝わると思いますが、詳細はSpring XMLのページを確認してください。また、前回のコンポーネント説明でcamel-twittercamel-elasticsearchの使い方ページを確認した際に気がつかれたかもしれませんが、Camelの公式サイトでは多くのページでJava DSLとSpring XMLの両方で解説してあります。

Spring XMLを使ったCamelの概要は以下の通りです。

  • camelContextタグに囲った中にCamelの処理を記述します。このタグの外側は通常のSpringのXMLとして使えます。
  • camelContextタグの中にrouteタグを書き、その中にrouteの構成を記述します。
  • fromやtoはタグ名に置き換えて、uriは属性として記述します。
  • 注意点としては、Javaでは文字列に「&」を使えますが、XMLの属性には「&」は使えません。「&」はエスケープが必要なため、「&」→「&amp;」に置き換えます。

また、JSONに変換する部分はCamelでのJSONを説明したページが参考になります。

前回同様、pom.xmlに以下のdependencyを入れることも必要です。

    <dependency>
      <groupId>org.apache.camel</groupId>
      <artifactId>camel-twitter</artifactId>
      <version>${camel-version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.camel</groupId>
      <artifactId>camel-elasticsearch</artifactId>
      <version>${camel-version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.camel</groupId>
      <artifactId>camel-jackson</artifactId>
      <version>${camel-version}</version>
    </dependency>

ちなみに、archetypeArtifactIdにcamel-archetype-springを指定してgenerateしているため、生成されたpom.xmlのdependencyにはcamel-springが予め記述されています。

Spring XMLを実行してみましょう

では、これを実行してみましょう。
手っ取り早く実行するには、mavenで実行して下さい。

mvn camel:run

Javaコマンドから実行するには、以下のように実行してください。(Camelから環境変数を参照している訳ではないため、${CLASSPATH}は直接記述しても問題ありません)

java -cp ${CLASSPATH} org.apache.camel.spring.Main

デフォルトでは「${CLASSPATH}/META-INF/spring/*.xml」というファイルを探し、それを設定ファイルとして利用します。具体的にファイルを指定する場合は、引数「-fa」で指定します。(Camelから環境変数を参照している訳ではないため、${CLASSPATH}、${CONTEXT_PATH}は直接記述しても問題ありません)

java -cp ${CLASSPATH} org.apache.camel.spring.Main -fa ${CONTEXT_PATH}/camel-context.xml

実行結果をkibanaで見てみると以下のようになりました。
f:id:acro-engineer:20131211081825j:plain

と言う訳で、Spring XMLを使って、twitterとelasticsearchを連携させることができました。

まとめ

3回にわたりApache Camelの入り口について説明してきましたが、その強力さの一端は伝わったでしょうか。
このようなことができる背景には以下のような要因があります。

  • Java製のOSSは非常に多いこと(今回の例ではtwitter、elasticsearchへのアクセス)
  • OSS同士をCamelで連携できること
  • Spring XMLを使えばハードコーディングせずCamelを使ったアプリケーションを書けること

Camelのコンポーネント一覧を見ると、twitterやelasticsearchだけでなく、多数のOSSに関するコンポーネントが提供されていることが分かります。また、対応しているOSSは日々増えています。「Camelを積極的に使い、使いづらければCamelのコンポーネントを修正してコミュニティにフィードバック」という流れができると、より使いやすさが増すのではないかと思います。

このシリーズで説明したCamelの機能は本当に触りの部分です。Camelでは多くの処理を実現できます。分岐させたり、データ変換したり、特定部分をマルススレッド化したり、、、気になった方は、是非、Camelを利用して今使っているOSSにアクセスしてみてください。
Camelを使って楽をしましょう!
 

Acroquest Technologyでは、キャリア採用を行っています。


  • 日頃勉強している成果を、Hadoop、Storm、NoSQL、HTML5/CSS3/JavaScriptといった最新の技術を使ったプロジェクトで発揮したい。
  • 社会貢献性の高いプロジェクトに提案からリリースまで携わりたい。
  • 書籍・雑誌等の執筆や対外的な勉強会の開催を通した技術の発信や、社内勉強会での技術情報共有により、技術的に成長したい。
  • OSSの開発に携わりたい。

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
 キャリア採用ページ

twitterとelasticsearchを簡単に連携させる(Apache Camel入門 その2 コンポーネントについて)

こんにちは、もっと多くのJava技術者がCamelで楽できるはずと信じているツカノ(@)です。

よくJavaで書くと冗長だと言われます。確かにそうだし、欠点もいろいろありますが、誇れる点も多くあります。そのひとつが、発達したJavaのエコシステムです。Javaで書かれたOSSは非常に多く、GitHub上に登録されている言語で最も多いのはJavaです。
自分に必要なOSSを使いこなせれば、実はそんなに書かなくて良いことが多いはずです。そのサポートを行ってくれるのがCamelです。

f:id:acro-engineer:20131125064348p:plain

ちなみに、今回はJava Advent Calendar 2013の10日目の投稿でもあります。9日目は櫻庭さんによる、以下の投稿でした。

11日目は高橋徹さんによる、以下の投稿です。

さて、前回はいかがでしたか? ぶっちゃけ、「Hello, World!」程度じゃCamelのパワーは伝わりきらなかったと思います。前回は導入ということで、雰囲気を伝えることに注力しましたが、今回はもっと面白いサンプルを使って解説します。この記事を読めば、「自分の仕事で使えないか調べたくなる」くらいCamelのパワーが伝わるのではないかと思います。

コンポーネントの話

それでは、本題に入っていきましょう。今回はCamelのコンポーネント周りについて、紹介します。
Camelのコンポーネントを使いこなすことによって、発達したJavaエコシステムの恩恵を受けることができます。
そのあたりを詳しく説明します。

今回は、次のようなプログラムを作りながら説明します。

  • twitterからキーワード「camel」で検索する
  • 検索結果をJSONに変換する
  • elasticsearchに書き込む

この目的なら通常はTwitter River Pluginを使うのかもしれませんが^^ ここでは、Camelを使います。

コンポーネントの調べ方

twitterやelasticsearchにアクセスする部分は、世の中的にはtwitter4jやelasticsearchのclientがあるはずです。こういう「OSSにアクセスする部分」をCamelではコンポーネントとして提供しています。

では、どのようなコンポーネントがあるのでしょうか? それは、Camelのコンポーネント一覧を見ると分かります。ここでは、Camelで提供しているコンポーネントがアルファベット順に並んでいます。
これを見て行くと、、、ありますね。「camel-elasticsearch」や「camel-twitter」があります。

OSSの名称の部分は、個々のコンポーネントの使い方が書かれたページにリンクしています。
ひとまず、camel-twitterの使い方を見てみましょう。

まずは、Mavenのdependencyにコンポーネントを登録するよう、書いてあります。

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-twitter</artifactId>
    <version>${camel-version}</version>
</dependency>

次にURI formatの説明として、以下のように書いてあります。

twitter://endpoint[?options]

この文脈で「URIって何?」と思うかもしれません。説明します。
前回のサンプルでfromやtoの引数に指定した文字列を、Camelでは「Endpoint URI」と言います。これは以下のようなフォーマットです。
f:id:acro-engineer:20131210080622p:plain
※図はCamel in Actionから引用しました。

SchemeとはCamelのコンポーネントを表しています。今回のサンプルでは、twitterやelasticsearchのコンポーネントにあたります。
Context Pathコンポーネントによっても違いますが、概ねどの機能を呼び出すかを表しています。
Optionsではそのコンポーネントを利用するための詳細なパラメータを指定します。

このように考えて、camel-twitterの使い方を読んでいくと、今回のサンプルでは以下のようなEndpoint URIを指定すれば良いことが分かります。(twitter APIのconsumerKey, consumerSecret, accessToken, accessTokenSecretについてはマスクしています)

twitter://search?type=direct&keywords=camel&consumerKey=xxx&consumerSecret=xxx&accessToken=xxx&accessTokenSecret=xxx


また、camel-elasticsearchの使い方ページを読んでいくと、以下のようなEndpoint URIを指定すれば良いことが分かります。
(clusterName=elasticsearch, indexName=twitter, indexType=tweetとしています)

elasticsearch://elasticsearch?operation=INDEX&indexName=twitter&indexType=tweet

camel-twitter以外もまとめて書くと、以下のdependencyをpom.xmlに入れます。

    <dependency>
      <groupId>org.apache.camel</groupId>
      <artifactId>camel-twitter</artifactId>
      <version>${camel-version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.camel</groupId>
      <artifactId>camel-elasticsearch</artifactId>
      <version>${camel-version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.camel</groupId>
      <artifactId>camel-jackson</artifactId>
      <version>${camel-version}</version>
    </dependency>

実装してみましょう

さて、ここまで分かったところで、この処理をCamelで実現するコードを書いてみましょう。

  • TwitterCrowler.java
package snuffkingit.camel.example;

import org.apache.camel.CamelContext;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.model.dataformat.JsonLibrary;

public class TwitterCrowler {

    public static void main(String... args) throws Exception {
        CamelContext context = new DefaultCamelContext();
        context.addRoutes(new RouteBuilder() {
            @Override
            public void configure() {
                from("twitter://search?type=direct&keywords=camel&consumerKey=xxx&consumerSecret=xxx&accessToken=xxx&accessTokenSecret=xxx") // (1)
                .marshal().json(JsonLibrary.Jackson) // (2)
                .to("elasticsearch://elasticsearch?operation=INDEX&indexName=twitter&indexType=tweet"); // (3)
            }
        });
        context.start();
        Thread.sleep(10 * 1000);
        context.stop();
    }
}

前回解説したあたりは飛ばして、簡単に解説します。
(1) twitterからキーワード「camel」で検索します。
(2) twitterからの検索結果をJSON形式に変換します。
(3) JSON形式の文字列をelasticsearchに書き込みます。

これを動かしてみると、twitterからキーワード「camel」で検索し、JSON形式に変換し、elasticsearchに書き込むことができます。
(今回の本題ではないため、twitter APIの登録や、elasticsearchのセットアップに関する説明は省略しています。また、1回検索して終了させていますが、常駐プロセスにして定期実行、というのもできます)

まとめ

今回のコードを振り返ってみると、以下のような特長があります。

  • どのようにOSSにアクセスするのか分かっていれば、個々のOSSのAPIを直接使わなくて良い
  • OSSへのアクセス方法はEndpoint URIとして抽象化されており、細かなパラメータは違えどフォーマットは共通
  • Endpoint URIで記載することアクセスできるため、実装量が削減される

そして、Camelのコンポーネント一覧を見ると分かるように、Camelはかなり数のOSSに対応しています。この資産を使えば、OSSをつないだ処理を簡単に書くことができるようになります。

自分の仕事で使ってるOSSのコンポーネントが用意されているか、調べたくなったのではないでしょうか?
ぜひ、Camelを使ってもっと楽をしましょう!
 

Acroquest Technologyでは、キャリア採用を行っています。


  • 日頃勉強している成果を、Hadoop、Storm、NoSQL、HTML5/CSS3/JavaScriptといった最新の技術を使ったプロジェクトで発揮したい。
  • 社会貢献性の高いプロジェクトに提案からリリースまで携わりたい。
  • 書籍・雑誌等の執筆や対外的な勉強会の開催を通した技術の発信や、社内勉強会での技術情報共有により、技術的に成長したい。
  • OSSの開発に携わりたい。

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
 キャリア採用ページ

Apache Camel入門(その1 OSSをつなぐOSS)

こんにちは、ツカノ(@)です。
twitterのタイムラインを見ていると、新しいOSSが登場した、という情報が頻繁に流れてきます。何年か前と比べると「仕事で有用なOSS」の増加速度が早まっているように思います。その分、話題だけれどあまり知らないOSSもたくさんあると感じています。今回は、OSS時代の今にフィットしたOSSの紹介です。

様々なOSSを組み合わせて開発する時代

ここ数年、システム開発をする際に複数のOSSを組合せて利用することが一般的になってきています。このブログの最近1年くらいの記事を振り返ってみても、次のようなOSSについて取り上げています。

  • アプリケーション基盤となるフレークワークではSpringやVert.x
  • ビッグデータ関連ではHadoopやStorm
  • 通信関連ではNettyやZeroMQ
  • NoSQLのミドルウェアではInfinispan

例えば、大量のデータをリアルタイムに処理し、さらにスケールさせる必要があるシステムを開発するケースを考えてみます。
何年も前なら、頑張って独自プロダクトで構築していたかもしれません。一例ですが、現在であればOSSを組み合わせて、

  • Nettyで受信する
  • NoSQLプロダクトを参照しつつ、独自ロジックでメッセージ変換
  • Stormに流し込む

という流れで処理することができます。自分でゼロからすべてを開発せずに実現できます。
重要な事なのでもう一回言いますが、複数のOSSを組合せて利用することが一般的になっています。

一方で、各OSS毎にAPIや利用している通信プロトコルが異なっているため、それなりに学習コストもかかります。また、開発期間も短いため、処理の流れを変えることになったり、特定箇所を分散させたりといったケースでも柔軟に対応できる必要があります。

こういった課題を解決してくれるのが、Apache発のOSSであるCamelです。
f:id:acro-engineer:20131125064348p:plain

という訳で、今回は、強力なパワーを持ったプロダクトであるにも関わらず、日本ではあまり利用されていないように見えるCamelを紹介します。

Camelとは?

システム統合のベストプラクティスをパターン化したものが、Enterprise Integration Patternsとして定義されており、書籍も出版されています。

Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions (Addison-Wesley Signature Series (Fowler))

Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions (Addison-Wesley Signature Series (Fowler))

Camelはここで定義された処理のパターンをシンプルに実現するために開発されました。

分厚くて、お固い雰囲気の本ですが、ご心配なく。Camelで実現できるパターンは、以下のページに図と共にまとまっています(^^)
Apache Camel: Enterprise Integration Patterns

Camelを使うと、「別システムからのリクエストを受け付け、一旦キューに入れて、取り出した所で並列実行する」といったことが簡単にできます。個々のパーツを組み合わせて処理の流れを作るため、リクエストを受け付ける部分を、定期的に情報を取得しに行く処理に変更することもできます。また、並列実行する部分をラウンドロビンで割り当てたり、キーのハッシュ値で振り分けたり、なんてこともできます。よく利用する処理の流れは大抵サポートしています。

先ほど「別システムからのリクエスト」と書いたような、OSSのプロダクトにアクセスしたり通信を行う処理を、Camelでは「コンポーネント」という概念で実現しています。
Camelの素晴らしいところは、豊富なコンポーネントが用意されており、現在も日々増加中であるところです。Camelのコンポーネント一覧を見ると、100以上のコンポーネントが用意されており、冒頭で紹介したOSSに関するコンポーネントも、ほとんどは既に存在するか開発予定になっています。
FTPSSH、HTTP(S)といった昔からある通信プロトコルや、AWSヘのアクセス、ビッグデータやNoSQL関連プロダクトとの通信、FacebookTwitterへのアクセス等、様々なコンポーネントが用意されています。

Camelでは、これら処理のパターンやコンポーネントを組み合わせることで、処理の流れを簡単に定義することができます。

Hello, World!

百聞は一見にしかず。さっそく実際にCamelを使ってみましょう。
mavenをインストールしてあれば、アプリケーション開発のひな型を生成できますので、これを利用します。以下のコマンドを実行してください(groupId, artifactId, versionは作成するアプリケーションに合わせて読み換えてください)。

mvn archetype:generate -DgroupId=snuffkingit \
    -DartifactId=camel-example \
    -Dversion=1.0.0-SNAPSHOT \
    -DarchetypeGroupId=org.apache.camel.archetypes \
    -DarchetypeArtifactId=camel-archetype-java \
    -DarchetypeVersion=2.12.1

これで、camel-exampleディレクトリ配下にCamelを利用するためのpom.xml等が作成されました。
ちなみに、Camel関連で用意されているarchetypeは以下のページに一覧があります。
Apache Camel: Camel Maven Archetypes

src/main/java配下に、ひな型のjavaのコードが作られますが、それは置いといて以下のコードを書いてみましょう。

package snuffkingit.camel.example;

import org.apache.camel.CamelContext;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;

public class HelloWorld {

    public static void main(String... args) throws Exception {
        CamelContext context = new DefaultCamelContext(); // (1)
        context.addRoutes(new RouteBuilder() { // (2)
            @Override
            public void configure() {
                from("direct:foo") // (3)
                .to("log:MyCategory"); // (4)
            }
        });
        context.start();
        context.createProducerTemplate().sendBody("direct:foo", "Hello, World!"); // (5)
    }
}

「Hello, Worldで、どうしてこんなに書かせるんだ!」と思われるかもしれませんが、怒らず最後まで聞いてください^^; もっと実際的な話は次回以降紹介しますが、まずは基本の理解です。
(1) まずは、Camelのコンテキストを初期化します。
(2) 処理の流れをCamelでは「ルート(route)」として定義し、その中を流れる「メッセージ」を処理します。この行では、コンテキストにルートを追加しています。
(3) fromとして、ルートの開始部分を指定します。ここでは開始部分に「direct:foo」という名前を付けています。(この意味の詳しい説明は次回以降行います)
(4) toとして、ルートの行き先を指定します。ここでは、メッセージをログ出力しています。
(5) ルートの開始部分「direct:foo」に"Hello, World!"というメッセージを送ります。

このクラスを実行すると、以下のログが出力されます(デフォルトのログフォーマットなので、ちょっと見づらいかもしれません)。

[                          main] DefaultCamelContext            INFO  Apache Camel 2.12.1 (CamelContext: camel-1) is starting
[                          main] ManagedManagementStrategy      INFO  JMX is enabled
[                          main] DefaultTypeConverter           INFO  Loaded 175 type converters
[                          main] DefaultCamelContext            INFO  StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html
[                          main] DefaultCamelContext            INFO  Route: route1 started and consuming from: Endpoint[direct://foo]
[                          main] DefaultCamelContext            INFO  Total 1 routes, of which 1 is started.
[                          main] DefaultCamelContext            INFO  Apache Camel 2.12.1 (CamelContext: camel-1) started in 1.027 seconds
[                          main] MyCategory                     INFO  Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello, World!]
[                          main] DefaultCamelContext            INFO  Apache Camel 2.12.1 (CamelContext: camel-1) is shutting down
[                          main] DefaultShutdownStrategy        INFO  Starting to graceful shutdown 1 routes (timeout 300 seconds)
[el-1) thread #1 - ShutdownTask] DefaultShutdownStrategy        INFO  Route: route1 shutdown complete, was consuming from: Endpoint[direct://foo]
[                          main] DefaultShutdownStrategy        INFO  Graceful shutdown of 1 routes completed in 0 seconds
[                          main] DefaultCamelContext            INFO  Apache Camel 2.12.1 (CamelContext: camel-1) uptime 1.089 seconds
[                          main] DefaultCamelContext            INFO  Apache Camel 2.12.1 (CamelContext: camel-1) is shutdown in 0.017 seconds

横長になっていますので、スクロールしないと見えないかもしれませんが、下から7行目(MyCategoryのところ)の右の方に「Hello, World!」と出ていますね。
「direct:foo」からメッセージが流れ、そのメッセージがログ出力されました。

実は「direct」や「log」というのがCamelのコンポーネントです。「direct」コンポーネントの中をメッセージが流れて行き、「log」コンポーネントがログ出力していたのです。
fromやtoに指定した文字列を替えるだけで様々な処理を行えるのがCamelの大きな魅力です。このあたりは次回のお楽しみです(^^)

参考情報

日本語で読めるCamelの情報はあまり多くありませんが、以下のサイトが参考になると思います。

「Camel in Action」はManning Publicationsから発売されています。

Camel in Action

Camel in Action

  • 作者: Claus Ibsen,Jonathan Anstey,Gregor Hohpe,James Strachan
  • 出版社/メーカー: Manning Pubns Co
  • 発売日: 2010/11/28
  • メディア: ペーパーバック
  • この商品を含むブログを見る


さて、どうでしたか。次回はCamelのコンポーネント周りについて、紹介します。それではまた~
 

Acroquest Technologyでは、キャリア採用を行っています。


  • 日頃勉強している成果を、Hadoop、Storm、NoSQL、HTML5/CSS3/JavaScriptといった最新の技術を使ったプロジェクトで発揮したい。
  • 社会貢献性の高いプロジェクトに提案からリリースまで携わりたい。
  • 書籍・雑誌等の執筆や対外的な勉強会の開催を通した技術の発信や、社内勉強会での技術情報共有により、技術的に成長したい。
  • OSSの開発に携わりたい。

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
 キャリア採用ページ