Taste of Tech Topics

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

Marionette.js 2.4 で AppRouter を使う方法

こんにちは。masudaです。

今日はBackbone.js 上のフレームワークであるMarionette.jsについて
小ネタを書こうと思います。

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


最近、仕事でお世話になることが多いMarionette.jsですが、
Marionette.jsの公式ドキュメントを確認していたところ
Marionette.Controllerがdeprecatedとなっていました。

Warning: deprecated. The Controller object is deprecated. Instead of using the Controller
class with the AppRouter, you should specify your callbacks on a plain Javascript object.

http://marionettejs.com/docs/v2.4.1/marionette.controller.html


ControllerはMarionette.AppRouterの処理を呼び出す為のモジュールだから、
AppRouterも使用しないということですかね?

でも、AppRouterはdeprecatedになっていませんね。


web上のサンプル実装を見ても探した限りでは
Marionette.Controllerを使用しているものがほとんどで、
よくわからないので調べました。


結論としては、JavaScriptのObjectを使用する」が正しいようです。

確かに、上述の警告文にも、よくよく見ると、書いてますね^^;


AppRouterのサンプルでも、その通りになっています。

var someController = {
  someMethod: function(){ /*...*/ }
};

Backbone.Marionette.AppRouter.extend({
  controller: someController
});

http://marionettejs.com/docs/v2.4.1/marionette.approuter.html


Controllerがdeprecatedになった経緯は以下ではないかと思います。

  1. 2.1以前には、Marionete.Controllerが存在していたが、MVCフレームワークのControllerと異なる使い方であり紛らわしかった。
  2. 2.1以降では、Marionette.Object が導入され、Controllerの代わりに使うようになった。
  3. 結果的に、Marionete.ControllerがAppRouter呼び出しだけに使用するものになったため、2.4でdeprecatedにした。

Prior Usage

Before Marionette 2.1, the Controller had another use, which was a general-purpose, white-label object. This was confusing given its other use within the Router, and its name, which carries so much meaning in the context of MVC frameworks.

As of v2.1, a new Class is available for your use: Marionette.Object. We recommend using Marionette.Object instead of Marionette.Controller in all situations outside of the Router.

http://marionettejs.com/docs/v2.4.1/marionette.controller.html

Marionette.js 2.4 以降を使う皆さんは、注意してください。

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

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

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

Java Day Tokyo 2015に参加してきました。

Java Day Tokyo 2015 に参加してきました!!

みなさん、こんばんは。
fujiiです。

4/8(水) にJava Day Tokyo 2015に参加してきました。

f:id:acro-engineer:20150408084632j:plain

今年は、Java 20周年 ということもあり、イベントが多かった印象です。


簡単ですが、Java Day Tokyo 2015 の様子を紹介していきたいと思います♪

Keynote

f:id:acro-engineer:20150408085724j:plain

Java8の機能説明や、Javaの展望、デモなど、何人かのスピーカーが交代しながら、説明していました。
JDK 9 は来年リリース予定のようですね。

f:id:acro-engineer:20150408095105j:plain

JavaOneでも紹介されていたJava Car も説明してもらえました。
IoTデバイスが組み込まれた車がサーバと連携して、車を制御してくれるとのことです。

自分の車がJavaで制御されていると、改造したくなりそうです(^O^)

f:id:acro-engineer:20150408093014j:plain

Java SDK for Pepperが出るということで、Pepperも登場しました!!

ますます、Pepperが欲しくなりますね!

■セッション

Java8やJavaEEを中心に話を聞いてきました♪

セッションの詳細については、Twitterやブログを見れば、だいたい紹介されているので、詳細は割愛します。

f:id:acro-engineer:20150408153755j:plain

当社の谷本も、

人気番組との戦い! Javaシステムのパフォーマンス・チューニング奮闘記

というテーマで発表させていただきました!!


■セッションの裏でも

セッションの裏でも企画がありました。

f:id:acro-engineer:20150410031901j:plain

NIGHT HACKINGの収録では、

・末永恭正氏
鈴木雄介
・岩崎浩文氏

といったJava会の著名人に加え、当社の谷本もインタビューを受けました!


Java Day Tokyo 2015 | NightHacking


f:id:acro-engineer:20150408143823j:plain

こちらは、O'REILLY本の販売コーナー。

f:id:acro-engineer:20150410033255j:plain

本日、4/10(金)発売の「Javaパフォーマンス」本の先行販売も行われており、
監訳者の寺田佳央氏と当社の谷本が買ってくれた人に、
サインをするサービスもありました!!

もちろん、私もサインをもらいました^^;


また、中身が豊富・解説が詳細で、すべてのJavaエンジニアにオススメの一冊です。

Amazon.co.jp: Javaパフォーマンス: Scott Oaks, アクロクエストテクノロジー株式会社(監訳), 寺田 佳央(監訳), 牧野 聡: 本



Java 20周年記念セッション

f:id:acro-engineer:20150408175505j:plain

最後は、Java 20周年記念セッション!


Javaに関するクイズ大会で盛り上がってきました。



他のセッションも含め、盛り沢山な内容でした。


次回も是非、行きたいと思います♪

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


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

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

3分でできる!Google CodeからGitHubへの移行

こんにちは、ツカノ(@)です。

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

先日、Google Codeが2016年1月に閉鎖されると発表されました。
長年使っており残念だ、と言う方もいらっしゃると思いますが、時代の流れでしょうか。
Google Codeにホスティングしている方は、忘れないうちにGitHub等への移行が必要です。

幸いにもツールが用意されているため、いくつかの制約を許容すれば、3分で移行できます
そこで、今回はGoogle Code上のコードをGitHubへ移行してみましょう。

実際に、移行してみましょう

ここでは、Google Codeにある「mibible」というプロジェクトを例に説明します。
事前に、Google Code、GitHubにログインしているものとします。

それではまず、移行したいGoogle Codeのページに行きましょう。
すると、「Export to GitHub」というボタンが表示されています。これを押しましょう。
f:id:acro-engineer:20150407064304j:plain


簡単な説明画面に遷移するため、ここで「Start Export」を押しましょう。
f:id:acro-engineer:20150407064311j:plain


GitHub側の認証画面が表示されますので、「Authorize application」を押しましょう。
f:id:acro-engineer:20150407064713j:plain


確認画面が表示されます。「Confirm」を押しましょう。
f:id:acro-engineer:20150407064719j:plain


Google CodeからGitHubへの移行が開始されます。
f:id:acro-engineer:20150407064335j:plain


しばらく待てば、完了します。
f:id:acro-engineer:20150407064344j:plain


GitHubを覗いてみると、、、おっ移行できてますね。
f:id:acro-engineer:20150407064359j:plain

とても、簡単に移行できました。
巨大なプロジェクトでもなければ、時間的にも3分あれば移行できると思います。

制約について

とても簡単に移行できましたが、制約もあります。
気付いた点を記しておきます。

  • 一部の文字が、文字化けした
  • GitHubのコミット者はGoogle Code側のアカウント名になる
  • issuesの作成者は「GoogleCodeExporter」になる。

上記は移行データだけの問題ですので、そのあとGitHubで作業を進める上では問題ありません。
Google Codeのアカウント名と、GitHubのアカウント名が異なる場合は、ちょっと残念ですが。


それではまた、OSSライフを楽しんでください~

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


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

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

ENdoSnipe5.2の新機能紹介

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

こんにちは、fujiiです。


かれこれ1年ぶりになりましたが、ENdoSnipeをバージョンアップし、ver5.2をリリースしました!
そこで今回はENdoSnipe5.2の新機能を紹介したいと思います。
おっと、その前に「ENdoSnipeって何?」という方は、技術評論社さんのサイトの連載を読んで、ENdoSnipeについて復習しましょう!


今回のリリースはDashboard機能の強化をメインに行っています。


それでは、さっそく紹介していきますね。

グラフ機能強化

グラフ機能を強化し、グラフを任意にカスタマイズできるようになりました。

ツリーの任意の要素を右クリックし、「Add Multiple Resource Graph」
というメニューを選ぶことで、グラフの追加ができます。

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

表示する系列を指定する方法には、系列指定(Graph Selection)正規表現指定(Regular Expression)の2つがあります。

系列指定では、表示されている任意のグラフを選択し、好きなグラフを作ることができます。

正規表現指定では、正規表現で系列の指定ができます。

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

サマリしたいグラフが複数あるときには、正規表現で指定する方が便利ですね。

閾値判定機能

ENdoSnipeで取得したデータをグラフにするだけでなく、予め設定した閾値を超えたことをシグナルとして表示する機能を追加しました。

ツリーの任意の要素を右クリックし、「Add Signal」
というメニューを選ぶことで、設定ができます。

シグナルの種類は、3段階(3Level)と5段階(5Level)の2種類から選ぶことができ、
設定した閾値を超えるごとに、

(緑)→黄→(橙)

のように色が変わります。

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


設定が完了すると、ツリーにシグナルが生成され、
閾値を超えると色が変わるようになります。

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


シグナルを作っておくと、グラフを開かなくても、
問題のあるリソースを見ることができるので、便利ですね。

Dashboard

これまでに作成したグラフやシグナルをダッシュボードで表示できるようになりました。

画面右上の「Dashboard」ボタンを押すと、Dashboardが表示されます。

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


デフォルトでは、以下を確認できるテンプレートを用意しています。

  1. システムのリソース使用状況
  2. Javaプロセスのリソース使用状況
  3. Javaアプリケーションの性能
  4. Webアプリケーションの性能
  5. DBに対するアクセス状況


もちろん、表示したいグラフやシグナルを自由に配置するための編集機能もついています。

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


編集機能を利用し、監視したい内容に合わせ、カスタマイズしてみてください!



今回紹介した機能の他に、ENdoSnipe5.2ではレポート機能の強化や実行計画表示機能なども行っています。


ENdoSnipeここからダウンロードできますので、是非感想等をお知らせください。

それでは。

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


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

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

Elasticsearch設定に関する小ネタ

こんにちは、ツカノ(@)です。

この記事はElasticsearch Advent Calendar 2014の21日目です。
20日目はjtodoさんの「Spark on elasticsearch-hadoop トライアル」でした。

さて、以前、「Elasticsearchソースコードリーディング~内部構造把握の第一歩~」と題してElasticsearchのスレッド構成といった内部構造の話を書きましたが、今回もまた、似たような話です。
今回はElasticsearchの設定ファイルについてです。
f:id:acro-engineer:20140131080117p:plain

1.ノード名について

Elasticsearchのデフォルトのログフォーマットでは、ノード名が出力されます。クラスタで運用することも考えると、ノード名って重要ですよね。ノード名の設定方法については、公式ページに記載があります。
ここで面白いのが、設定を省略した場合の動きです。Marvelのキャラクター名からランダムで設定されるそうです。
githubにある設定を実際に見てみましょう。

2826個も名前が書いてあります。
ざっと見ると、Iron ManとかX-Manとかって名前がありますね。運が良ければ(?)あなたのノード名が「Iron Man」になるかもしれません。

この設定ファイルには、以下のような名前も書いてありますね。日本っぽい名前だけれど、私はMarvelは良く分からないので、Marvelの何に由来しているのか分かりません。。。

  • Kimura
  • Mariko Yashida
  • Mikado
  • Shingen Harada
  • Shirow Ishihara
  • Sushi
  • Yukio

こういうノード名が付く可能性があるんですね。

2.設定ファイルのフォーマット、読み込む順序

Elasticsearchの設定ファイルはjson形式でもyaml形式でもproperty形式でも書け、結構便利ですね。
設定ファイルも「elasticsearch.拡張子」と書いてconfigディレクトリに置けば勝手に読んでくれます。
どんな風に読み込んでいるのか気になったので、コードを読んでみました。
ElasticsearchのInternalSettingsPreparerクラスを読むと、以下のようなコードが書いてあります。

                try {
                    settingsBuilder.loadFromUrl(environment.resolveConfig("elasticsearch.yml"));
                } catch (FailedToResolveConfigException e) {
                    // ignore
                } catch (NoClassDefFoundError e) {
                    // ignore, no yaml
                }
                try {
                    settingsBuilder.loadFromUrl(environment.resolveConfig("elasticsearch.json"));
                } catch (FailedToResolveConfigException e) {
                    // ignore
                }
                try {
                    settingsBuilder.loadFromUrl(environment.resolveConfig("elasticsearch.properties"));
                } catch (FailedToResolveConfigException e) {
                    // ignore
                }

「elasticsearch.json→elasticsearch.yml→elasticsearch.properties」の順序で設定ファイルを探して、読み込んでいるんですね。
同じ設定を記述した場合は、後から記載した設定で上書きされるので、設定ファイルの優先順序は以下のようになります。

  1. elasticsearch.properties
  2. elasticsearch.json
  3. elasticsearch.yml

また、yamljsonで階層構造で設定を記述した場合は、階層を「.」でつないだ設定名になります。
例えば、json形式で以下の2つのケースは同じ設定で、Elasticsearch内部では、「node.name」として扱われます。

{
  "node" :
      { "name" : "json" }
}
{
  "node.name" : "json"
}

yaml形式で設定を記述するときも、同様に階層を「.」でつないだ設定名になります。
property形式の場合は「node.name=json」のように記載するしかないですね。

設定ファイルを記述する際の参考になればと思います。ちょっとした小ネタでした。

それではまた~

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


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

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

Impalaにファイルで投入したデータはいつから検索可能になるの?

こんにちは。kimukimu(@)です。

このエントリはSpark, SQL on Hadoop etc. Advent Calendar 2014 - Qiitaの12/14分です。

多くの人がSQLなら書けるということで、
開発者でなくても自在に検索を定義可能なSQL on Hadoopが今非常に広まりつつあります。
私はそんなSQL on Hadoopの中でImpalaを今使用しているため、Impalaについて書かせていただきますね。
f:id:acro-engineer:20141209070857j:plain

Impalaをデータの集計で使用しているのですが、
その際に「元々存在しているテーブルにデータをファイルで投入する」ことがあります。


ですが、ファイル投入後クエリを実行してみても投入した結果が表示されないことがありました。
かつ、Impalaのサイトを見てもどのタイミングでデータが検索可能になるか、は明確には見つからないんですよね・・・

そのため、「Impalaにファイルで投入したデータはいつから検索可能になるの?」が
気になったので確認してみました。

1.前提環境

今回の確認は下記の環境で確認しています。

  • CDH 5.2.0(Cloudera Managerで構築、完全分散モード)
  • CentOS 6.6

Cloudera Managerを使うとHadoopクラスタ構築が本当に楽になりますね。

2.使用するファイル

実際に投入して確認してみるファイルの内容は下記です。

いつから検索可能になるかを確認できればいい、ということと、
あとは確認をわかりやすくするため、各ファイルには必要最小限のデータのみ定義しています。
■201412141000.csv

2014-12-14 10:00:00,Record1,100,12.34,Record1 Comment

■201412141100.csv

2014-12-14 11:00:00,Record2,200,34.56,Record2 Comment

■201412141200.csv

2014-12-14 12:00:00,Record3,300,45.67,Record3 Comment

■201412141300.csv

2014-12-14 13:00:00,Record4,400,56.78,Record4 Comment

2.ファイル投入後の表示タイミング確認パターン

Impalaに対してファイルで投入したテーブルの内容を表示するための関連オペレーションとして、
下記の4つの処理があります。

  1. Impalaにテーブル(EXTERNAL TABLE)を定義する。
  2. 定義したテーブルに対してクエリを発行し、結果を表示する。
  3. ファイルを投入する。
  4. ファイルを削除する。

すると、ざっと考えて下記くらいのパターンが挙げられると思います。
ファイル追加/ファイル削除の順番入れ替えはパターンも多くなるので省きます。

  • A.テーブル定義→クエリ発行(1→2、基本)
  • B.テーブル定義→ファイル追加→クエリ発行(1→3→2)
  • C.テーブル定義→クエリ発行→ファイル追加→クエリ発行(1→2→3→2)
  • D.テーブル定義→ファイル削除→クエリ発行(1→4→2)
  • E.テーブル定義→クエリ発行→ファイル削除→クエリ発行(1→2→4→2)
  • F.テーブル定義→ファイル追加&削除→クエリ発行(1→3&4→2)
  • G.テーブル定義→クエリ発行→ファイル追加&削除→クエリ発行(1→2→3&4→2)

3.確認結果

では各パターン毎に実際に実行してみて結果がどうなるかを確認してみます。
まず下準備としてimpalaユーザの操作可能なディレクトリ上に先ほど定義したファイルを配置します。
その上でHDFS上にImpalaがアクセス可能な下記のディレクトリを作成しておきます。

/ImpalaTest/TestPattern1
/ImpalaTest/TestPattern2
/ImpalaTest/TestPattern3
/ImpalaTest/TestPattern4
/ImpalaTest/TestPattern5
/ImpalaTest/TestPattern6
/ImpalaTest/TestPattern7

結果上では通常のLinux impalaユーザのコマンドを「>」、impala-shellからの実行コマンドを「[impala:21000] >」と記述しています。
また、impala-shellからimpala-daemonへの接続といった共通コマンドや、冗長な記述は省いています。

3-A.テーブル定義→クエリ発行(1→2、基本)

> hadoop fs -copyFromLocal 20141214* /ImpalaTest/TestPattern1
[impala:21000] > CREATE EXTERNAL TABLE test_pattern_1(record_time TIMESTAMP, record_name STRING, record_value_int INT, record_value_float FLOAT, record_comment STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/ImpalaTest/TestPattern1';
[impala:21000] > select * from test_pattern_1 ORDER BY record_time;
+---------------------+-------------+------------------+--------------------+-----------------+
| record_time         | record_name | record_value_int | record_value_float | record_comment  |
+---------------------+-------------+------------------+--------------------+-----------------+
| 2014-12-14 10:00:00 | Record1     | 100              | 12.34000015258789  | Record1 Comment |
| 2014-12-14 11:00:00 | Record2     | 200              | 34.56000137329102  | Record2 Comment |
| 2014-12-14 12:00:00 | Record3     | 300              | 45.66999816894531  | Record3 Comment |
| 2014-12-14 13:00:00 | Record4     | 400              | 56.77999877929688  | Record4 Comment |
+---------------------+-------------+------------------+--------------------+-----------------+

データを投入してからテーブルを定義し、クエリを発行するという基本パターンですので、当然のことながら全データが表示されます。

3-B.テーブル定義→ファイル追加→クエリ発行(1→3→2)

> hadoop fs -copyFromLocal 2014121410* /ImpalaTest/TestPattern2
> hadoop fs -copyFromLocal 2014121411* /ImpalaTest/TestPattern2
[impala:21000] > CREATE EXTERNAL TABLE test_pattern_2(record_time TIMESTAMP, record_name STRING, record_value_int INT, record_value_float FLOAT, record_comment STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/ImpalaTest/TestPattern2';
> hadoop fs -copyFromLocal 2014121412* /ImpalaTest/TestPattern2
> hadoop fs -copyFromLocal 2014121413* /ImpalaTest/TestPattern2
[impala:21000] > select * from test_pattern_2 ORDER BY record_time;
+---------------------+-------------+------------------+--------------------+-----------------+
| record_time         | record_name | record_value_int | record_value_float | record_comment  |
+---------------------+-------------+------------------+--------------------+-----------------+
| 2014-12-14 10:00:00 | Record1     | 100              | 12.34000015258789  | Record1 Comment |
| 2014-12-14 11:00:00 | Record2     | 200              | 34.56000137329102  | Record2 Comment |
| 2014-12-14 12:00:00 | Record3     | 300              | 45.66999816894531  | Record3 Comment |
| 2014-12-14 13:00:00 | Record4     | 400              | 56.77999877929688  | Record4 Comment |
+---------------------+-------------+------------------+--------------------+-----------------+

テーブル定義後にファイルを追加した場合でも、クエリを発行する前に追加しておけば追加結果が反映されることがわかります。

3-C.テーブル定義→クエリ発行→ファイル追加→クエリ発行(1→2→3→2)

> hadoop fs -copyFromLocal 2014121410* /ImpalaTest/TestPattern3
> hadoop fs -copyFromLocal 2014121411* /ImpalaTest/TestPattern3
[impala:21000] > CREATE EXTERNAL TABLE test_pattern_3(record_time TIMESTAMP, record_name STRING, record_value_int INT, record_value_float FLOAT, record_comment STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/ImpalaTest/TestPattern3';
[impala:21000] > select * from test_pattern_3 ORDER BY record_time;
+---------------------+-------------+------------------+--------------------+-----------------+
| record_time         | record_name | record_value_int | record_value_float | record_comment  |
+---------------------+-------------+------------------+--------------------+-----------------+
| 2014-12-14 10:00:00 | Record1     | 100              | 12.34000015258789  | Record1 Comment |
| 2014-12-14 11:00:00 | Record2     | 200              | 34.56000137329102  | Record2 Comment |
+---------------------+-------------+------------------+--------------------+-----------------+
> hadoop fs -copyFromLocal 2014121412* /ImpalaTest/TestPattern3
> hadoop fs -copyFromLocal 2014121413* /ImpalaTest/TestPattern3
[impala:21000] > select * from test_pattern_3 ORDER BY record_time;
+---------------------+-------------+------------------+--------------------+-----------------+
| record_time         | record_name | record_value_int | record_value_float | record_comment  |
+---------------------+-------------+------------------+--------------------+-----------------+
| 2014-12-14 10:00:00 | Record1     | 100              | 12.34000015258789  | Record1 Comment |
| 2014-12-14 11:00:00 | Record2     | 200              | 34.56000137329102  | Record2 Comment |
+---------------------+-------------+------------------+--------------------+-----------------+

テーブル定義後、クエリを実行した後にファイルを追加した場合は追加結果はそのままでは反映されないようです。
そのため、クエリ初回実行時に実際に検索対象となるデータに対して何かしらのインデックス処理のようなものを施している・・?
尚、これは1日たっても結果はそのままでしたので、タイミング問題、というわけでもないようです。

3-D.テーブル定義→ファイル削除→クエリ発行(1→4→2)

> hadoop fs -copyFromLocal 20141214* /ImpalaTest/TestPattern4
[impala:21000] > CREATE EXTERNAL TABLE test_pattern_4(record_time TIMESTAMP, record_name STRING, record_value_int INT, record_value_float FLOAT, record_comment STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/ImpalaTest/TestPattern4';
> hadoop fs -rm /ImpalaTest/TestPattern4/201412141300.csv
[impala:21000] > select * from test_pattern_4 ORDER BY record_time;
+---------------------+-------------+------------------+--------------------+-----------------+
| record_time         | record_name | record_value_int | record_value_float | record_comment  |
+---------------------+-------------+------------------+--------------------+-----------------+
| 2014-12-14 10:00:00 | Record1     | 100              | 12.34000015258789  | Record1 Comment |
| 2014-12-14 11:00:00 | Record2     | 200              | 34.56000137329102  | Record2 Comment |
| 2014-12-14 12:00:00 | Record3     | 300              | 45.66999816894531  | Record3 Comment |
+---------------------+-------------+------------------+--------------------+-----------------+

削除についても追加と同じく、テーブル定義後クエリ発行前に実施しておけば反映されるようです。

3-E.テーブル定義→クエリ発行→ファイル削除→クエリ発行(1→2→4→2)

> hadoop fs -copyFromLocal 20141214* /ImpalaTest/TestPattern5
[impala:21000] > CREATE EXTERNAL TABLE test_pattern_5(record_time TIMESTAMP, record_name STRING, record_value_int INT, record_value_float FLOAT, record_comment STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/ImpalaTest/TestPattern5';
[impala:21000] > select * from test_pattern_5 ORDER BY record_time;
+---------------------+-------------+------------------+--------------------+-----------------+
| record_time         | record_name | record_value_int | record_value_float | record_comment  |
+---------------------+-------------+------------------+--------------------+-----------------+
| 2014-12-14 10:00:00 | Record1     | 100              | 12.34000015258789  | Record1 Comment |
| 2014-12-14 11:00:00 | Record2     | 200              | 34.56000137329102  | Record2 Comment |
| 2014-12-14 12:00:00 | Record3     | 300              | 45.66999816894531  | Record3 Comment |
| 2014-12-14 13:00:00 | Record4     | 400              | 56.77999877929688  | Record4 Comment |
+---------------------+-------------+------------------+--------------------+-----------------+
> hadoop fs -rm /ImpalaTest/TestPattern5/201412141200.csv
> hadoop fs -rm /ImpalaTest/TestPattern5/201412141300.csv
[impala:21000] > select * from test_pattern_5 ORDER BY record_time;
WARNINGS: Failed to open HDFS file hdfs://cluster1:8020/ImpalaTest/TestPattern5/201412141200.csv
Error(2): No such file or directory
Backend 1:Failed to open HDFS file hdfs://cluster1:8020/ImpalaTest/TestPattern5/201412141200.csv
Error(2): No such file or directory

クエリを実行した後にファイルを削除した場合、その後再度クエリを実行するとファイルが存在しない旨のエラーとなります。
結果も表示されませんでした。
やはりクエリの初回実行時にファイル単位のインデックス作成に近いものを行っていて、
以後クエリを実行した場合はそのインデックスにそって検索を行うようです。

・・と、とりあえずここまでで大体動きの予測はつきますが、念のため追加と削除を両方行うパターンについても確認しておきます。

3-F.テーブル定義→ファイル追加&削除→クエリ発行(1→3&4→2)

> hadoop fs -copyFromLocal 2014121410* /ImpalaTest/TestPattern6
> hadoop fs -copyFromLocal 2014121411* /ImpalaTest/TestPattern6
> hadoop fs -copyFromLocal 2014121412* /ImpalaTest/TestPattern6
[impala:21000] > CREATE EXTERNAL TABLE test_pattern_6(record_time TIMESTAMP, record_name STRING, record_value_int INT, record_value_float FLOAT, record_comment STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/ImpalaTest/TestPattern6';
> hadoop fs -copyFromLocal 2014121413* /ImpalaTest/TestPattern6
> hadoop fs -rm /ImpalaTest/TestPattern6/201412141200.csv
[impala:21000] > select * from test_pattern_6 ORDER BY record_time;
+---------------------+-------------+------------------+--------------------+-----------------+
| record_time         | record_name | record_value_int | record_value_float | record_comment  |
+---------------------+-------------+------------------+--------------------+-----------------+
| 2014-12-14 10:00:00 | Record1     | 100              | 12.34000015258789  | Record1 Comment |
| 2014-12-14 11:00:00 | Record2     | 200              | 34.56000137329102  | Record2 Comment |
| 2014-12-14 13:00:00 | Record4     | 400              | 56.77999877929688  | Record4 Comment |
+---------------------+-------------+------------------+--------------------+-----------------+

予想通り、ではありますが、クエリを初回実行前にファイルの追加削除を両方行っても問題なく検索可能です。

3-G.テーブル定義→クエリ発行→ファイル追加&削除→クエリ発行(1→2→3&4→2)

> hadoop fs -copyFromLocal 2014121410* /ImpalaTest/TestPattern7
> hadoop fs -copyFromLocal 2014121411* /ImpalaTest/TestPattern7
> hadoop fs -copyFromLocal 2014121412* /ImpalaTest/TestPattern7
[impala:21000] > CREATE EXTERNAL TABLE test_pattern_7(record_time TIMESTAMP, record_name STRING, record_value_int INT, record_value_float FLOAT, record_comment STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/ImpalaTest/TestPattern7';
[impala:21000] > select * from test_pattern_7 ORDER BY record_time;
+---------------------+-------------+------------------+--------------------+-----------------+
| record_time         | record_name | record_value_int | record_value_float | record_comment  |
+---------------------+-------------+------------------+--------------------+-----------------+
| 2014-12-14 10:00:00 | Record1     | 100              | 12.34000015258789  | Record1 Comment |
| 2014-12-14 11:00:00 | Record2     | 200              | 34.56000137329102  | Record2 Comment |
| 2014-12-14 12:00:00 | Record3     | 300              | 45.66999816894531  | Record3 Comment |
+---------------------+-------------+------------------+--------------------+-----------------+
> hadoop fs -copyFromLocal 2014121413* /ImpalaTest/TestPattern7
> hadoop fs -rm /ImpalaTest/TestPattern7/201412141200.csv
[impala:21000] > select * from test_pattern_7 ORDER BY record_time;
WARNINGS: Failed to open HDFS file hdfs://cluster1:8020/ImpalaTest/TestPattern7/201412141200.csv
Error(2): No such file or directory
Backend 1:Failed to open HDFS file hdfs://cluster1:8020/ImpalaTest/TestPattern7/201412141200.csv
Error(2): No such file or directory

予想通り、クエリを1回実行後にファイルの追加削除を行った場合、対応できませんでした。

4.テーブル定義後にファイルの追加削除を行った場合結果に反映させるには?

では、ファイルの追加削除を反映させるためにはどうすればいいのでしょうか。
Impalaクエリのマニュアルを見てみると「REFRESH」というコマンドがありました。
REFRESHコマンドを実行することで、追加削除の結果が反映され、現状のファイルに対して検索を行うことが可能でした。

[impala:21000] > REFRESH test_pattern_7;
[impala:21000] > select * from test_pattern_7 ORDER BY record_time;
+---------------------+-------------+------------------+--------------------+-----------------+
| record_time         | record_name | record_value_int | record_value_float | record_comment  |
+---------------------+-------------+------------------+--------------------+-----------------+
| 2014-12-14 10:00:00 | Record1     | 100              | 12.34000015258789  | Record1 Comment |
| 2014-12-14 11:00:00 | Record2     | 200              | 34.56000137329102  | Record2 Comment |
| 2014-12-14 13:00:00 | Record4     | 400              | 56.77999877929688  | Record4 Comment |
+---------------------+-------------+------------------+--------------------+-----------------+

5.確認結果まとめ

これまでの結果をまとめると下記のようになります。

  1. ImpalaはEXTERNALテーブル定義後、クエリを初回実行した際にインデックスのようなものを作成する。
  2. インデックス(?)を作成する前に行ったファイル追加削除はクエリ実行結果に反映される。
  3. インデックス(?)を作成した後に行ったファイル追加削除はクエリ実行時に反映されない。(削除の場合はエラーになる)
  4. REFRESHコマンドを実行することで現状の最新の状況にインデックス(?)が更新される。

テーブル定義後、データを投入しながらインクリメンタルにクエリを発行する場合、
データ投入時の事後処理かクエリ発行時の事前処理でREFRESHコマンドを実行すればOK
となりますね。
これで追加しながら検索、もデータ未反映を気にすることなく実行可能ですね。

小ネタでしたが、以上です。

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


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

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

Pepperについて調べてみました&会いに行ってみました

こんにちは、ツカノ(@)です。

皆さん、ロボットは好きですか?

子どもの頃、ロボットアニメに興奮した方も多いと思います。
私も好きなロボットアニメがありました。

昔は夢の話だったロボットも、科学が進歩し、段々と人型ロボットが実現されてきました。
AIBOが走ったり、東大発のロボット関連ベンチャーGoogleに買収されたりと、研究的な部分で進歩する一方で、ソフトバンクから家庭向けにPepperというロボットが発表されました。
f:id:acro-engineer:20140916003007p:plain
今回は、ソフトバンクから来春発売されるPepperの話です。

初めての方には基礎知識の紹介、知っている方にはおさらい、ということで、まずはPepper関連の情報をまとめてみました。

Pepperとは?

Pepperソフトバンクが2015年2月に発売する、子どもくらいの身長のロボットです。
孫さんが自ら発表するくらい期待しているようで、感情を理解して自ら動くロボットとのこと。
価格は19万8000円。これなら、一般家庭でも購入できる価格ですね(少々高価ですが)。ロボットを家庭に届けたい、という孫さんの意気込みを感じます。

発表会の様子はこのサイトで見ることができます。


ソフトバンクにはPepperについて書かれたページがあります。Pepperの紹介や、動画も公開されていて面白いです。




Pepperのコンセプト

これらページの情報をまとめると、以下のような感じです。
コンセプトは「人によりそうロボット」。世界初の感情認識パーソナルロボットだそうです。

道具として役立ってきたこれまでの機械とは違い、人間とのふれあいの中で自律的に反応しながら、あなたを楽しませてくれます。

あなたが悲しんでいるときに励ましてくれたり、あなたが嬉しいときに一緒に喜んでくれたり、そんな存在になれることを目指しています。

Pepperは共に暮らす家族とのやり取りを受けて少しずつ成長していきます。

お掃除ロボットやお茶くみロボットと違い、道具として役立つ事が目的ではないようです。
人間とコミュニケーションを取って、楽しませてくれるのが目的のようです。
学習するそうなので、成長していく過程を見るのも楽しそうですね。

PepperSDK

技術者として期待するのは以下の記述。

開発環境(SDK)が公開される予定ですので、思いもよらない機能が今後アプリストアに追加されていくことでしょう。

SDKが公開され、Pepperで動くアプリを開発できるとの事。
また、アプリストアもできるそうで、アプリをインストールすることでPepperに様々な機能を持たせる事ができるようです。
個体毎に異なった振る舞いをするPepperに育っていくと面白そうですね。


では、機能面のうち、一般受けしそうな点を見てみましょう。

  • クラウド連携で豊富な知識を披露
    • インターネットにアクセスして最新のニュースや天気などを教えてくれるそうです。やはりYahoo! Newsと連携するのでしょうか?
  • あんしんのセーフティー機能を多数搭載
    • 衝突防止機能やオートバランス機能など、家庭で使う事も考えると必須機能ですね。


エンジニア的には、他にもこんなことが気になります。

  • 連続稼働時間が12時間以上
    • 朝から晩まで動かして、夜に充電しておけば良いですね。スマホと同じく、毎晩充電必要ですが。
  • 体中に大量のセンサーを搭載
    • タッチセンサー、ジヤイロセンサー、レーザーセンサー等、25個くらいありますね。
  • 頭部にタッチセンサーが3個も付いている
    • これはどういうことでしょうか? 頭を撫でたりしたときに、細かく識別できるのでしょうか?

Pepperに会いたい!

こんなPepperに会ってみたいですよね。
そう思った人は、Pepperがいるソフトバンクショップに行ってみましょう。
このページPepperがいるソフトバンクショップを調べることができます。

私が最初に行ったとき、Pepperは充電中で眠っていました。

えっ、連続稼働12時間じゃないの? なんで? 店員さんが、前日晩に充電を忘れたのでしょうか?
充電中のPepperは、しょぼんとしていて、いかにも悲しい感じです。

こんなんで断念したくないので、別のソフトバンクショップに会いに行ってみました。

今度はPepperが動いています!

Pepper!」と声をかけると振り向いて、話しかけてきます。


ロボットと話すのが慣れないせいか、私の受け答えが素人演技みたいな感じになってしまい、ぎこちない会話です。
自然に会話できるよう慣れる必要がありますね。

このPepperソフトバンクショップ仕様になっているせいか、「一生のお願い」と言いながら、私に新しい携帯電話を買うよう要求してきました

携帯電話を買いに来た訳でなく、Pepperとコミュニケーションを取りに来たので、「私から質問していい?」と何度か言ってみましたが、無視されました^^;

製品版ではそんなことがないはず、と期待しています!

Pepperに会いに行ってみて、本当に動いているし、人間とある程度会話もできるし、来年にはこのロボットを自分でいじれると思うと、非常に楽しみですね。

Pepperの開発元

あとから気付いたのですが、ソフトバンクのページには

お客さまがPepperに向けて発話した内容を、弊社及び弊社グループ企業であるAldebaran Robotics SASのサーバーに一定期間保存致します。

と書いてあります。
これがクラウド連携か。1体のPepperに日本語を覚えさせたら、他のPepperにうつったりするのでしょうか。変な事は教えない方が良いのかな。。。私が話しかけたときは、まだ残念な子でしたが、今後の成長に期待。

それと、「Aldebaran Robotics SAS」って、単語が気になる。。。そういえば、製品発表会の動画ではAldebaran社の人が何かしゃべっていましたね。

調べてみると、Aldebaran Roboticsはフランスにあるロボット開発を行っている会社で、これまでもNAOという小型ロボットを実用化しています。ソフトバンクがこの会社を買収して開発したのが、Pepperなんですね。

NAOも人型ロボットで、ひとりで立ったり座ったりもできます。Pepper情報はまだまだ少ないので、NAOを調べてみると面白いかもしれません。Pepperで利用するOSが、元々NAOで開発されていたものだったり、Pepperにつながる話を知ることができます。

Pepperについて、もっと知るには

「このくらい情報では、飽き足らない! もっとPepperの事が知りたい!」と思う方もいるでしょう。
実は、今週末にPepper Tech Festivalというイベントが開催され、様々なことが発表されるそうです。
気になる方は、今週末に開催されるPepper Tech Festivalで発表される情報に期待しましょう! 私ももちろん行きます!


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

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

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