サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
GPT-4o
tetsuya-odaka.hatenablog.com
前回に引き続き、使用するHadoopのバージョンは2.4。1年前の記事をもとに、Eclipseで開発環境を作る。 開発を行うクライアントは、MacBook Pro (OSX 10.9.3)。クライアントのJavaのバージョンは以下。 MacBook-Pro:~ tetsuya$ java -version java version "1.6.0_65" Java(TM) SE Runtime Environment (build 1.6.0_65-b14-462-11M4609) Java HotSpot(TM) 64-Bit Server VM (build 20.65-b04-462, mixed mode) ダウンロード hadoopのダウンロードページから、hadoop-2.4.0.tar.gzをダウンロードする。 クライアントの設定 ダウンロードしたhadoop-2.4.0.ta
2014/6/8 記事を更新しました。 Amazon Elastic MapReduceを使う:SSHでマスタノードにログインする。sftpでファイルを転送する。 今回の記事では、AmazonEMRのマスターノードにSSHで接続してみる。 結論をいってしまうと、EMRのEC2インスタンスにログインして、普通にhadoopを使う事ができる。 セキュリィーグループの変更 EMRを一度使うと、EC2のセキュリティーグループに、以下の2つのセキュリティグループが追加される。前者はマスターインスタンスグループに適用され、後者がコアインスタンスグループ、タスクインスタンスグループに適用される。 ElasticMapReduce-master ElasticMapReduce-slave マスタインスタンスにログインするには、ElasticMapReduce-masterを変更して、Inboundに22
前回の記事で、Hadoop2にしたら随分たくさんMapとReduceが動いたので、スレッドじゃないよね、と思ってしまった。特にMapperは起動の仕方でプログラムがデタラメになってしまうので、ちょっと調べてみた。 Hadoop2.4のAPIをみると、Mapperをつかってる限りでは、Runnableを引き継いでくることはないようで、Javadocのdescriptionの下の方に、 Applications may write a custom MapRunnable to exert greater control on map processing e.g. multi-threaded Mappers etc. と書いてあって、MapRunnableを使うとスレッドで処理できるよ、となっている。 ちなみに、MapRunnableのJavadocをみると、runメソッドがあって、これを
さて、前回のログでは、Mahout 0.7に付属する「factorize-movielens-1M.sh」というサンプルをつかって、Pararell ALSというアルゴリズムを動かしてみた。 少し誉めすぎた感が否めないので、原論文「Large-scale Parallel Collaborative Filtering for the Netflix Prize」を解説しつつ、Mahoutでの実装を追いかけてみたい。 内容的には、理工系学部の専門過程の人あたりをターゲットに書いていく(自分は一サラリーマンであって、大学の先生ではないのだが、前提を書いておくのは重要だと思う)。 先のログにも書いたが、Parallel ALS(Parallel Alternating Leaset Squares)は、疎な行列(Sparse Matrix)を前提とした、次元縮約(dimension reduc
追記:2013/9/17 このログの続編の投稿が完了しましたので、記事の末にリンクを追加しました。これで、このログの方法を応用した分散レコメンデーションエンジンの構築もばっちり(のはず)です。 先のログでは、Parallel ALS(Alternating Least Squares)を用いたレコメンデーションの理論面のフォローアップと、Apache Mahoutでの実装を少し詳しくみた。 このアルゴリズムは極めてシンプルで、かつ、Apache MahoutではHadoop上でスケーラブルに実装されている。 Apache Mahoutは発展途上のプロジェクトなので、スケーラブルに実装されているアルゴリズムとそうでないアルゴリズムがあって、レコメンデーションについていえば、0.8では、アイテムベースのレコメンデーション、Slope Oneレコメンデーション、Parallel ALSを使ったレ
さて、夏休みもそろそろ終わり。総力(自分のですが)を結集して、一仕事してみたいと思います。 今回のログでは、MahoutのサンプルにあるParallel ALS(という次元縮約の分散計算アルゴリズム)を使ったジョブを動かしてみる。 Mahoutに、Parallel ALS(Alternating Least Square)が実装されているということは、協調フィルタリング(リコメンデーションエンジン)のエリアにとどまらず、注目に値することと思う。 注記: Mahout0.7では、Amazon EMR(Hadoop1.0.3)で動いたのだが、0.8になってジョブが変更されており、RMSEまで計算したところでジョブが落ちてしまう。 RMSEが計算されているということは、予測値(リコメンデーション)まで計算できているということだが、ここでは、0.7の環境で実行する。 $MAHOUT_HOME/ex
EC2上にHadoopをインストールする手順は、たくさん記事にされているが、備忘のためログにしておく。 「kj-kiのはてなダイアリー:疑似分散モードでHadoopインストール」を参考にさせていただいた。 スケールアウトのメリットを測定することが当面の目的ではないため(MapReduceが動けばよいため)、疑似分散モードで動かす。 Hadoopのバージョンは1.2、AMIはAmazon Linux AMI、typeはt1.micro、リージョンはN.Virginia(U.S.Standard)で行った。 クライアントはMac Book Pro(OSX Lion)。 EC2の利用方法については、他の記事を参考にしていただくとして、ここでは割愛する。 セキュリティーグループは以下のようにした。 (注記)実際には、もっときちんと設定しなくてはならないが、テンポラリーで利用するためのインスタンスな
「エコノミスト誌(6/4号;使える統計学)」で特集を組んだ「Twitterのつぶやきから景気動向指数を推定する」についてだが、第一ステップの簡単な絵を書くと、以下のようになる。 NTTデータさんが、Twitterの全データの取得権を持っている(これは、「権利を買える」という意味なのだろうか)ということで、TwitterのAPIを経由して、分散処理環境に「つぶやき」を取得してモデリングする。 特集記事では、分散処理にhadoopを使ったとは記載していないが、Hadoopをつかった、もしくは、Hadoop上で稼働するソフトウェアを利用したと仮定するのが(現時点では)適当だろう。 今回は、TwitterからTweetを取得するプログラムサンプルを作成してみる。 開発言語は、hadoopと同じJavaとした。Tweetを取得するには、簡便なTwitter4Jを使った。 ただし、1回の実行で1500
2014/6/13 新しい記事があります。 「EclipseでHadoop2.4の開発環境を作る&ワードカウントのプログラムを作成する。」 - Hadoopを実験するにあたって、プログラムが作れる環境を構築した。 構築には、「30 分で NetBeans を使って Hadoop のプログラムを作ってみる」 を参考にさせていただいた。ただし、慣れているEclipse(Juno)を使うことにした。 開発機はMac Book Pro (OSX Lion)。 まず、Eclipseの本家ページより、Eclipse Juno JEEをダウンロードして、抵当な場所に解凍し、wordbenchを開くところまでやる。 次にhadoopの本家サイトより、hadoop-1.1.2をダウンロードし、ホームディレクトリに解凍、以下のようなシンボリックリンクを張った。 Javaプロジェクトの作成 javaパースペクテ
html5を触ってみようと思い、videoタグをいじっていたのだけど、iPadで自動再生(autoplay)ができない。 PCの方は、IE9, chrome17, firefox11, opera11, safari5で問題なくautoplayが効く。 safari developerに行ってみると、iOSの注意事項(こちら)として以下と書いてあり納得。 ...上記リンク先から転記 In Safari on iOS (for all devices, including iPad), where the user may be on a cellular network and be charged per data unit, preload and autoplay are disabled. No data is loaded until the user initiates it.
Windows 2008R2で、ファイルシステム内を全文検索をするには、まず、Windows Searchの機能を有効にして、適当なiFilterを導入します。 ファイルサービスだけ役割を追加しても、Windows Searchは導入されないので、サーバーマネージャーでファイルサービスを選んで、「役割サービスの追加」を行います。それで、Windows Searchのところにチェックを入れて導入。下の図のように、システムサービスのところに、Windows Searchと出ればOK。 Windows7と違って、これをやっておかないと、コンパネに「インデックスのオプション」が入ってきません。「あれ、インデックスのオプションがない」と思ったら、Windows Searchが入っていないということなので、上の手順で導入します。すると、コンパネに「インデックスのオプション」が導入されます。 それでも、
MySQLの検索に絡んで、FedoraにHyper Estraierを入れてみた。むかーし、日経LinuxにEstraierの記事があって、試しにインストールしたことがある。 本家サイトをみてみると、流行りのKey-ValueストアTokyo Cabinetの平林幹雄氏によるプロダクトと知って、すごい人がいるものだなぁ、と思ってしまった。 基本的には、本家サイトのマニュアル通りに入れれば大丈夫なのだが、覚書きしておく。 まず、Fedora13にはgccとgcc++が必要なので、yumでインストールしておく。(MeCabのコンパイルでg++のエラーが出たら、gcc++が入っていないので、以下でインストール。) yum install gcc-c++ 今回は、テキスト(html)とpdfの検索がしたい。 必要なのは、 libiconv zlib xpdf mecab mecab-ipadic
2009年のマイコミジャーナルの記事を参考にすれば、とっても簡単にExcelを動的に生成して、ダウンロードさせることができる。 Excel2007形式でダウンロード 以下のようなフォーマット(見出しとシート名)をテンプレートとしてよみこんで、簡単な見積書のダウンロードを作ってみる。 コントローラーは以下。上のテンプレートを、webroot/tmp/template.xslxとして保管してある。 <?php require_once '../vendors/phpexcel/phpexcel.php'; class ExcelSamplesController extends AppController{ public $name = 'ExcelSamples'; public $uses = array(); /** * * 初期画面(一覧表示) */ function index(){
ファイル共有を目的としてWindows Serverを導入した場合、Active Directory(AD)を利用しないということはまずありえない。 ここまでは、WORKGROUPサーバーとしての簡単な設定手順を書いたが、全ての役割と機能を削除して、ADを入れてみた。 ADは、Windows Server 2008R2では、複数の役割に分割されている。最初にAD DSを導入しなくてはならない。 ネットワークの設定変更 コンピュータ名(hq-fs01)の設定、静的IPアドレスの設定(以下の例では、192.168.11.2)は済ませてあるとする。 DNS(正確には、ADの情報を格納するためのDynamicDNS)が一緒にインストールされるので、サーバーのDNSを変える。 「ネットワークと共有センター」を開く。 「アダプターの設定変更」で「ネットワーク」を選択して右クリック。プロパティーを表示す
ここまでで、本社-支店間でインターネットVPN(IPsec VPN)が引けて、支店から本社のファイルサーバー(Windows Server)へアタッチすることができるようになった。 ついでに、本社のRTX1200にPPTPの設定を追加して、外出先から接続できるようにしておく(残念ながら、支店のSRT100にはPPTPは設定できない仕様になっている)。 PPTPはGUIから設定できないので、SSHで接続して、コンフィグに追加をする。 以下がコンフィグ。前回設定したものに追加しただけ。2名のユーザーに対して、192.168.11.100-192.168.11.101をリースするように設定する。 login password encrypted * administrator password encrypted * login user [ログインユーザー名] * user attribute
前回までで、とりあえず、本社-支社間でインターネットVPN(IPsec VPN)がはれた。 だが、GUIでデフォルトの設定をしてしまうと、トンネルインターフェイスに対してIPフィルタリングがかかって、ファイル共有のためのポート(135,137-139,445)を閉じてしまう。 この状態だと、支社から本社のファイルサーバー(Windows Server 2008 R2)の共有フォルダーを、支社のクライアントがアタッチできない。 このトンネルインターフェイスにかかっているIPフィルタリングを取っ払ってしまう(インターネットに向かっているLAN2インターフェイスではないことに注意)。 このIPフィルタリングを除いてしまっても、外側に向かってポートが解放されることはない。 IPフィルタリングは、RTX1200もSRT100もGUIから取り除くことができるが、ルーターのコンフィグが汚くなってしまうの
今日でWindows Sever 2008 R2編も最後。 これは、ちょっとした覚え書き。 キーボードをさしたら106キーボードの配列になっていなかった(デバイスマネージャーをみるとHID:Human Interface Deviceと認識)。 そのときの覚書き。参考1。参考2。 サーバーマネージャーからデバイスマネージャーを起動する。 キーボード(HID)を選択して右クリックし、プロパティーを表示する。 ドライバータブを開き、「ドライバーの更新」を選択する。 「コンピュータを参照して…」を選択する。 「コンピュータ上の…」を選択する。 「互換性をある…」のチェックをはずし、MicroSoftのBasic KeyBoard106/109を選択する。
YUI(先月v3がリリースされましたねぇ。v2も2.8.0rになってます)にはクロスドメインなJavascriptライブラリー「Getツール」があるのだが、GAE/JのURL FetchをつかってProxyとなるプログラムを作成してみた。 Fetchしたのは、YAHOO Web Search API。たとえば、「YAHOO」というキーワードで検索した場合、以下のようなXMLが戻ってくる。 appidには、自分のapplication idが入ってくる。 <?xml version="1.0" encoding="UTF-8"?> <ResultSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:yahoo:jp:srch" xsi:schemaLocation="urn:yahoo:jp:srch htt
先のログでは、Google App Engine/Java(GAE/J)へファイルをアップロードし、データストアにBlob形式で保存をした。今回は、そこで保存したデータを取り出して、ダウンロード&復元してみる。 以下のような画面を用意し、「ダウンロード」ボタンでファイルをダウンロードする。ダウンロードするファイルは、前回のサンプルでアップロードしておく。 Strutsには、v1.2から、ファイルのダウンロードのためのDownloadActionというActionクラスが用意されている。だが、ファイルシステムからのダウンロードを前提にしているので、GAE/Jでは使用することができない。したがって、(前回同様)これも昔ながらの方法でダウンロード処理を実装する。 以下の作業は、GAE/JのプラグインがインストールされたEclipse3.4(Ganymede)で行った。 プロジェクトの作成 必要な
なんというか、ブログに乗せるのもみっともないのだが、小1時間ほど悩んでしまったので、メモとして残しておく。 先のログで、Struts1.3をつかって「GAE/Jのデータストアにあるバイナリーをダウンロード」してみた。 これでは「つまらない」し、「用途が限られている」ので、「データストアに入れた画像を表示しましょう」と思ったのが発端。習慣というか摺りこみというかは恐ろしい。「画像はファイルシステムにおいて、そこにリンクをする」という先入観がある。だが、GAE/Jでは(ファイルシステムへの書き出しが禁止されているので)、これはできない。ちなみに、昔懐かしいAppletも使えない仕様になっている。それで「さてさて」となってしまった。 「あらら、imgのsrcにアクションを指定すればいいんだね」と気がつくまでに小一時間。先入観は怖い。だが、簡単にできることがわかってよかった。以下は、そうやって表示
よく、下のような形式の関数を『クロージャー(closure)』と呼ぶ。 // クロージャー var test1 = function(){ --- (1) var _i = 1; return function(){ alert(_i); _i++; }; }; 形式的には、先のログ『Javascriptの基本:いろいろな関数』で照会した、「関数を戻り値にする関数」と同じ。 これを以下のようにして実行すると、'1'、'2’…という値がアラートに上がってくる。 var func = test1(); func(); // '1'がアラートされる。 func(); // '2'がアラートされる。 func(); // '3'がアラートされる。 perlやruby,phpなどでもクロージャー(と呼ばれるもの)を作ることができる(Java7へのクロージャーの導入は見送られた)。 クロージャーと聞い
前々回までのサンプルコードを使って、GAE/Jの認証をカスタマイズする(最終回)。 GAE/Jは(今のところ?)認証時に設定できるロール(役割)が 一般ユーザー Admin(管理)ユーザー のいずれかとなっている。コンシューマー向けのサイトを少人数で開発・運用するのであれば、これで行けると思うのだが、B2Bのサイトであるとか、大人数でメンテナンスをするサイトになると、もう少しきめ細かい認証方式が欲しくなる。GAE上にワークフロー(業務フロー)みたいなものを作る場合にも、必要になることが多いだろう。ディレクトリー・サービスみたいなものが提供されると、こういうことも可能になるのだろうが、「普通のデータとしてユーザー・マスタを持って、それでコントロールする」という「昔ながらの方法」も敷居が低くて捨てがたい。 今回は、前々回までのサンプルをつかって、以下のようなサンプルを作ってみる。 GAE/Jに
以前のログ「GAE/JにStruts1.3のサンプルを乗せてみた」でファイルのUploadがうまくいかない、と書いた。 これは、GAE/Jのランタイム環境でFileOutputStreamがサポートされていないのが原因。GAE/Jがファイルシステムとして利用できないことはよく知られたことなので、ファイルシステムにuploadするのではなく、uploadしたファイルをBlob形式でデータ・ストアに保管すればよい。 実際に少し触ってみたところ、Strutsが抱え込んでいるcommons-fileuploadが、GAE/Jで利用できないということに帰着されるようだ。commons-uploadだけを使ったサンプルを書いてみたが、これもうまくいきそうにない。というのも、commons-fileuploadは、uploadしたファイルが「ある閾値を超えると一時的にファイルシステムに書き出す」という仕
数回のログにわたって、GAE/Jのデータストアを触ってみた。 雑誌の記事や、いくつかのHPを参考にさせていただいたが、まだ情報量が少ないのだなぁ、と思う。 自分より先に利用をしてみた友人らと話していると、「GAE/Jはデータストアが特殊だからな。。。」という意見を持っている者が多い。 JDOなり、JPAなりの一本槍というのは極端な話だから、そういう意見が出ても、全く不思議はない。 もっと砕けてしまうと、HibernateならHibernateのみで実装するとかいうのも、実際の開発現場ではちょっと厳しい話なのだろうと思う。やっぱり、開発者は融通のきくSQLで実装をしたいという本音がある。EzoGPでのJava開発ではApache iBatisを利用しているのだが、iBatisは適度にオブジェクト指向かつ、SQL指向の開発者にもスムーズに使ってもらえる、という実績があるため。 とはいえ、こうい
先のログでは、先走ってGoogle App Engine/Java(GAE/J)のデータストアにおけるカスケード・デリート(Cascade Delete。もしくは、リカーシブ・デリート。Recursive Delete)の問題を書いてしまったのだが、とりあえず、話を整理するために、順をおって、GAE/Jからデータストアを使ってみる。 試してみるのは、以下。 エンティティー・グループを規定するRootエンティティーをストアする。 このRootエンティティーのChildをストアする。 キーによって、Childをフェッチ(取得)する。 JDOQLによって、Childをフェッチする。 Childを削除する。 Rootを削除する。 GAE/Jのマニュアルによれば、親を定義しないエンティティーがRootエンティティーとなり、エンティティー・グループを規定する。ストアされたデータに対するトランザクション
先日のログ「Google App EngineにDWR2を乗せてみた」で、Google Apps Engine(GAE)にDWR2を乗せて簡単なサンプルを動かしてみた。 GAEに関する記事などを読むと、GAEではファイルIOに制限があるとのこと。「(GAEのプラットフォームを)ファイルシステムと見なして使うことは出来ない」という意味のはずだが(実際に、「JRE クラスのホワイトリスト」を見ると、java.io関連のクラスがたくさん含まれている)、「テキストファイルが全く読み込めない」のでは困る。特に、コンテキストパス配下にテキストを置くことはよくあるので、試しておこうと思う。 以前に「DWR: Javaオブジェクトを画面の要素にマップする」というログで紹介したサンプルが、ちょうどいい実験材料になりそうなので、GAEプロジェクトに移植してみた。このサンプルでは、コンテキストパス配下の以下のよ
Google Apps Engine(GAE)では、Java6.0の実行環境とServlet API 2.5に準ずるサーバー環境が提供されている。Servlet APIバージョンはスタブとして作成されるweb.xmlから見て取れる。 仕様の中で気になることの1つが「セッション管理」である。 Webアプリケーション・サーバーをスケールアウトした構成にする際に必ず出てくるのが、「セッション・レプリケーション」という技術。これは、複数のサーバー間で、セッションIDやセッションオブジェクトを、active-activeな関係でコピーし合うものである。これができないと、アプリケーションサーバーをスケールアウトし、完全な形でロードをバランスさせることができない。 (とはいえ、ロードバランシングの方法論にも色々あって、クライアントのIPアドレスでスティックするような方法を取れば、セッション・レプリケーシ
Google App Engineのスタブ(appengine-web.xml)に <!-- Configure java.util.logging --> <system-properties> <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/> </system-properties> とあるように、デフォルトの設定ではjava.util.loggingを使う設定になっている。 これと一緒に、src下にlog4j.propertiesの雛形が用意されている。 先のログでDWR2を配備した際に、commons-loggingを配置した。DWRは「org.directwebremoting.util.CommonsLoggingOutput」という奴が、commons-log
いろいろバタバタしてしまい、ブログの更新が滞っているのはうまくない。 mezawa氏と「RIA型アプリとMVC2モデルの関係性」についてメイルのやり取りをした。 これは以前から議論になっている話題。 RIA型のアプリを頑張って作るという行為は、「頑張って画面を作る」という行為と同じ意味。 このブログでも取り上げたサンプルも、サーバーサイドの処理をいれる場合には、 Javascript(クライアントサイドのプログラム)<=> PHPプログラム(a) <=> PHPクラス(ロジック)(b) という形式になっている。 これは、コントローラの在り処が、PHPプログラム(a)にあることを示唆している。 これをJavaEEに置き換えると、 Javascript(クライアントサイドのプログラム)<=> サーブレット(c) <=> Javaクラス(ロジック)(d) となる。 MVC2パターンは、エンタープ
次のページ
このページを最初にブックマークしてみませんか?
『tetsuya_odakaの日記』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く