« 2010年2月 | トップページ | 2010年4月 »

2010年3月の8件の投稿

2010/03/28

Grailsでワーカスレッドを作ってそこからHibernateで永続化したい、んだけれど…

coroidでは、動画変換serviceを作って、そこで動画の処理を行っています。その中で、処理の経過を永続化しています。

class NicoContentService
    def transcode(){
        // (1)処理開始状態を永続化
        // (2)変換処理
        // (3)処理終了状態を永続化
    }
}

(2)が重たい処理なので、ワーカスレッドを作成し、処理完了を待たずに制御を戻すことにしました。

class NicoContentService
    def transcode(){
        Thread.start{
            // (1)処理開始状態を永続化
            // (2)変換処理
            // (3)処理終了状態を永続化
        }
    }
}

coroid ver.0.1.0まではこのような実装でした。これでGrails1.1.1ではうまく動いていたのですが、1.2.1にバージョンを上げるとこちらに書かれている通り、

org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

という例外が出るようになりました。これは、Thread.startで作ったワーカスレッドがHibernateのセッションを持っていないので発生したのでしょう。1.1.1では、セッションが必要になればGrailsフレームワーク側で自動で取得していたのではないかと想像します。また、1.2.1でも、Grailsフレームワーク側を変更すればそのような動作にできるようです(参考)。Grailsの中で使用しているSpringFrameworkのHibernateTemplateクラスコンストラクタに渡す引数を変更する、という対応のようです。

coroidはGrailsを含めて配布しているわけではないので、上記の対応は採用できません。他の方法を探したところ、BackgroundThread pluginというものがありました。このプラグインの説明に以下のような記述がありましたので、問題を解消できるだろうと考えました。

Beyond the inherent difficulty of concurrent programming, Grails had a few other difficulties: most significantly, the Hibernate session is bound to the thread, and so threads need to do their own Hibernate session management. This plugin takes care of those issues.

このプラグインを用い、以下のようにソースを変更しました。これがcoroid ver.0.2.0です。

class NicoContentService
    def transcode(){
        backgroundService.execute("Working for converting",{
            // (1)処理開始状態を永続化
            // (2)変換処理
            // (3)処理終了状態を永続化
        })
    }
}

 

ここからが問題です。

こちらに記載した通り、次のバージョンでは処理の進捗率を表示させたいと考えています。この情報は、さきゅばすが通知するステータステキスト(さきゅばすをGUIで起動して変換処理を行ったとき、画面下部のステータスバーに表示される情報です)を加工して永続化すれば良いと考えました。

この通知は、さきゅばすが作成するワーカスレッドが行います。つまり、この処理を追加することで、backgroundServiceワーカスレッドとはまた別のスレッドでHibernateを利用する必要がでてきた、ということです。

backgroundThread pluginのソースコードBackgroundThreadManager.javaを見ると、Hibernateセッションを以下のように取り扱っていました。パッケージ名を見るにつけ、どうやらSpring Frameworkの機能を利用しているようです。

開始時(bind):

Session session = SessionFactoryUtils.getSession(sessionFactory, true);
TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));


終了時(unbind):

SessionHolder sessionHolder = (SessionHolder)TransactionSynchronizationManager.getResource(sessionFactory);
TransactionSynchronizationManager.unbindResource(sessionFactory);
SessionFactoryUtils.closeSession(sessionHolder.getSession());

上記と同じようなコードを、さきゅばすのワーカスレッド永続化処理に追加してみたのですが、”(3)処理終了状態を永続化”のところで以下の例外が出ました。

ERROR events.PatchedDefaultFlushEventListener  - Could not synchronize database state with session
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect):

さて、これをどう解決すればよいやら。Springも絡んできそうな様相なのですが、さっぱり知らないし、というところです。

2010/03/26

coroid ver.0.3.0 全ランキングと詳細情報表示対応

ダウンロードはこちらから。なお、旧バージョンからのアップデートの場合、上書きインストールは行わず、coroidディレクトリ自体を置き換えて下さい。その上で、自身で更新したConfig.groovyの内容の書き換えや、ffmpeg.exeの置換えなどを新しいcoroidに対して行って下さい。また、上記ページの「アップデートに関する注意事項」も参照して下さい。

今回のバージョンからJavaScriptを使用するようになりました。今のところJavaScriptは切っていても動作しますが、将来的にはJavaScriptはONの前提で開発しようと考えています。AndroidでJavaScriptをOFFにして使用されている方がいるのかどうか分からないので、これについてご意見いただければと考えています。

本バージョンの新機能は以下のとおりです。

  • ニコニコ動画サービスが提供しているランキングに全て対応しました。
    • 従来は”カテゴリ合算”のデイリーマイリストランキングだけでした。
  • 詳細情報(サムネイル画像と投稿者メッセージ)が表示できるようになりました。
    • 一覧の動画タイトルをクリックして下さい。
  • 一覧からマイリスト登録ができるようになりました。
    • サムネイル画像をクリックして下さい。
    • マイリストページのサムネイル画像クリックもできるのですが、意味ないです…(既に登録されている動画なので)

 

以下、今後の対応予定について記述します(注:予定は未定)。

ユーザエクスペリエンス的な問題点として、以下のようなものがあると考えています。

  1. 変換処理がどれだけ進んでいるのか分からない
  2. 変換エラー時、エラー理由が分からない(再変換すればOKになるのか、そもそも変換不可能な動画なのか)
  3. 変換が完了したかどうか、ページをリロードしないと分からない
  4. 変換リンクをクリックするとページがリロードされてしまい、ページ表示状態(スクロールしてた場所、詳細情報表示など)がリセットされてしまう
  5. 詳細情報を一旦表示させると、非表示にできない

1.と2.については、今のところ実現方法について全く未検討なのですが、優先度高めで検討していきたいと思っています。

3.については、Ajaxで実現しようと思えばできるはずです。ただ、やり方としてはクライアント(Android端末)からポーリングでサーバ(coroid)へ問い合せることになると思います。そうすると、ネットワークや電池に優しくないなあ、と思いますので、(クライアントがPCであることを前提にするならともかく)Android向け機能としては止めておいた方が良いのかな、と考えています。

4.と5.についてはAjaxで実現できると思いますので検討します。

次に、追加機能として考えていることを以下に挙げます。

  • 検索機能
  • 認証機能
  • 複数マイリスト
  • コメントなどの更新

検索機能の基本的な部分については、既にNicoBrowserのAPI(coroidもこれを利用しています)に実装済みです。ただし、ずいぶん昔に実装して放置しているので、現在のニコニコ動画サービスのページ構成に対応出来ていません。少し修正すれば実現できるでしょう。

認証機能については、coroidではGrailsのプラグインですぐに実現出来ます。ただ、認証機能をつけるとnicoroidの対応が少し面倒かなあ、と。あと、この機能が必要になるのは外のネットワークから利用する場合(例えば3G回線で接続する場合)になると思うのですが、そういった環境で利用されている方はどれくらいいるのでしょう…

複数マイリストの対応は、後方互換性を保ったまますぐ実現できるのですが、nicoroidと一緒に機能追加したいと考えたので今回は見送りました。

最後の「コメントなどの更新」について。nicoroidは現在動画コンテンツとコメントコンテンツをマージして配信する動画を作成しています。このためコメントを更新しようと思うと配信動画の再作成処理が必要になり、ニコニコ動画サービスのようにほぼリアルタイムでコメント更新を行うことができません。対応としては

  • ユーザが再変換要求を行えるようにして、要求を受けた時点で最新コメントで配信動画を再作成する
  • Android側で動画コンテンツとコメントコンテンツをマージする

の2点が考えられます。簡単なのは前者なので、取り敢えずはこの機能を実現しようと思います。後者はこちらのオーバレイ方式にも書いたのですが、今の方式とメリット/デメリットを比較して熟慮しないといけないなあ、というところです。

以上の点や、その他の要望など、ご意見有れば伺いたいと思います。

2010/03/23

続ハードディスク運が悪い

前回書いたハードディスク、WD3200JSは購入してから結構時間が経つ(5年保証に入っていた気もしますが、保証書が見つからない)ので廃棄することに。WD15EADSは保証書があったので販売店に連絡したところ、交換対応してもらいました。ただ、交換品がWD15EARSなので、予断を許さないところ(これも低速病の報告が挙がってるモデルです)。

上記のハードディスクを繋げているのはサブPCなのですが、ちょっと気になったのでメインPCのハードディスクのS.M.A.R.T.値をCrystalDiskInfoで見てみました。

hdd21

「注意」となっているハードディスクが3体中2体あります。どちらも代替セクタが~10個できているのが理由みたいです。大きなファイルにアクセスしたとき、たまにOSごと落ちてたのは多分これのせいだな…

3体全部ばらばらのメーカなのですが、今チェックツールでチェックを行っているところです。

そのうち、Seagateのチェックツール”Seatools for Windows”でstxcon.exeが強制終了して起動できないという不審な挙動を示しています。

hdd22

また、前回作成したWesternDigital用のUSBメモリもこちらのマザーボードでは起動できないようで、このPCも前途多難なようです。

2010/03/18

coroid ver.0.2.0 – Grails1.2.1対応

以前報告いただいた、Grailsの最新版で動作しない問題に対応しました。

DB(インメモリDB)への永続化をワーカスレッドで行っていたのですが、Hibernateのセッションを取得しないまま行おうとしていたためにエラーが起こっていたようです。

1.1ではどうもセッションを持っていなかったら自動で取得するような動作がデフォルトだったようで、意識しないでよかったのですが、1.2.1ではこのデフォルト動作が変わったようです。

ダウンロードはこちらから。

2010/03/17

未解約端末ではe-mobileの新規契約ができない

ネットブックを衝動買いしてしまったので、有効活用しようと、無線インターネット接続サービスの利用を検討しました。

日常は既にインターネット接続サービスを利用しており、家の中での利用は無線LANでまかなえます。従って、たまに外で使用するときのために、1日定額や1週間定額のような、スポット利用できるサービスが無いか探したところ、e-mobileのEMチャージ、UQ WiMAXのUQ 1Dayというものがあるようでした。

UQ WiMAXの方はLinuxでの動作実績が無いようでしたので、私はe-mobileにしようと決めたのですが、UQ WiMAXはUQ Wi-Fiというサービスも行っているようで、これが利用できるところで頻繁に利用する場合にはUQ WiMAXの方が利便性が高いかもしれません。利用してから気づいたのですが、東海道新幹線は思ったよりトンネルが多く、e-mobileは結構通信が途切れる状況が多かったです。

 

ところで、e-mobileを新規契約する場合、基本的には端末購入と同時に行うようです。webサイトからではその他の手段が提供されていません(以前は必ず端末購入と同時に行う必要が有ったそうです)。

ただし、手元に解約済みの端末がある場合は、その端末の固有番号(IMEI番号)を電話で伝えることで新規契約できるようになったそうです。

じゃあネットオークションなどで出品されている通信端末を入手すれば良いのかというと、結構失敗事例もあるようです。前述の通り、新規契約出来る端末は「解約済み」のものに限るらしく、出品者が解約済みかどうかを明示していない場合もあり、買ったは良いが契約できない事態にも。

私も勘違いしていたのですが、「白ロム」として出品されているものはEM chip(USIM)がついていない、というだけであり、必ずしも解約済みを表している訳ではないそうです、というか、出品の殆どは未解約のものみたいです。

以上、e-mobileの新規契約する場合には未契約(解約済み含む)の端末が必要であると説明しました。

これに加えて、EMチャージ新規契約の場合はもう一つ手段があります。

e-mobileのサポートに連絡すればサービスが自分の生活範囲で利用できるかどうか試用機を借りることができます。これを借りる際にEMチャージの契約が必須になります(クレジットカードが必要です)。この契約は試用機返却後も継続されますので、未解約の端末でも利用できることになります。

…というか諸事情により私が現在その状況で利用しています。ぶっちゃけ手間が掛かるのでおすすめしません。e-mobileのアウトレットを利用するのが、そこそこ低額で手間もかからなくて良いのではないでしょうか。

Data Lifeguard DiagnosticをUSBブートで利用する

Western Digital社製ハードディスクのテストには、Data Lifeguard Diagnostic(DLGDIAG5.EXE)を利用したのですが、少し厄介だったのでメモ。

このツール、フロッピー版、CD版、Windows版があるようです。まず、Windows版を試したのですがなぜかハードディスクを認識しない(後で調べたところ、最新版の1.17にはバグがあるらしく、1.13を使う必要があったようです)。次にCD版を試したところ、起動時に以下のメッセージが出て進まない。

Unable to locte the license Agreement file, DLGDIAG.TXT
Please make sure that the License Agreement file is
located in the same path as DLGDIAG.EXE

cannot load the file A:\COMMAND.COM
Insert correct disk and Strike any key

これもバグだそうで、CD版は現在利用できないようです。

最後にFD版なのですが、私のPCにはFDDがついていない…

結局USBからDOSを起動して、そこで実行することにしました。

使用したのは、HP USB Disk Storage Format Tool - v2.1.8 と、Windows 98 System Files。前者のツールを起動して、”Create a DOS startup disk”にチェックをつけ、”using DOS system files located at:”のところで、後者を指定すればbootable USBカードが作成できました。ここに、CD版のData Lifeguard Diagnosticのファイル一式をコピーし、テスト用起動ディスクの完成。

USBからのブート方法ですが、私のPCのBIOSでは、HDDやCDからのブートのように、BIOS設定画面ではUSBデバイスを選択することはできませんでした。ただ、BIOS起動時にF11キーを押すことでブートディスク選択のポップアップ(BIOS画面には BBS POPUPと書かれていました)が出て、そこからはUSBデバイスを選択し起動できました。

ハードディスク運が悪い

1体目。Western Digital社WD3200JS(320GB)。ファイルのコピーにやたらと時間がかかるようになり、Outlook Expressが起動しなくなりました。ツール(DLGDIAG5.04f)でチェックしたところ、エラー(ERROR/STATUS CODE: 0223)が見つかるも、修復されたようなので使用を継続。

hdd01

しかし同様の症状が再発。ここで一旦全セクタに書き込みを行い(Write Zeros。ちなみに102時間ほどかかった)、再度テストを実施したところ、”TOO MAY ERRORS FOUND – PLEASE CONTACT TECHNICAL SUPPORT ERROR/STATUS CODE: 0225”とのメッセージが。

hdd02

 

2体目。同じくWesten Digital社WD15EADS(1.5TB)。こちらの症状は、定期的にアプリケーションの動作が止まったようになること。ただし、スタートメニュー画面のクリックなどは、受け付けられるような感じで、CPU負荷が高くなった時のような感じではない。上記と同様のテストを実施するも、正常との判断。

ハードディスクを繋ぎ直してみたり、無線LANを疑ったりしたのですが、問題が見つからず往生していたところ、検索してみると「低速病」というキーワードがかかりました。

にちゃんねるのスレッド「WD製HDD CaviarGreen EADS/EARS 低速病 Part3」によると、

WesternDigital製HDDのCaviarGreenシリーズにおいて型番が
WD**EADS/WD**EARS等の製品でリード・ライトの異常な速度低下
いわゆる「低速病」の報告が日本国内や海外で相次いでいます。

症状としてはリード・ライトの速度が最低でおおよそ数MB/sまで落ち込み
ファイルやフォルダの読み書きが極端に遅く感じられることもあります。
ただし明らかな物理的故障やそれに準じる状態とは異なり、またPIO病とも違います。

ということだそうです。

早速そのスレッドで示されているツールHDTuneで計測してみました。結果はこちら。

hdd11

数MB/sどころか、1byteも転送されていませんでした…

 

そんなわけで、当分の間Western Digital社製のものは避けることになりそうです。

文体を変えることにしました

今まで、このブログのエントリは「だ、である」調の文体で書いてきました。

この理由としては、blogを始めたのが論文を書いていた時期と重なっていて、文体を統一した方が面倒でなかったこと(当初は句読点も論文の記述に合わせて半角カンマとピリオドでした)と、小飼弾さんのブログエントリ「公言は傲慢にするべき3つの理由」に書かれているまさにそのことを意識していたためでした。

しかし、現在においては、このブログ以外に「だ、である」調の文章を書くことは無くなったことと、やっぱりこの文体は自分で読み返しても小飼弾さんの謂う所の「傲慢な態度」に取られがちだなあ、ということで、「です、ます」調に変えようと思い立ちました。

あと、単なる冗談を書きたい場合でも、「だ、である」だと、悪意を含んだ皮肉みたいに見えるのでそういうことが書きにくく余計に文章が固く読みにくくなるなあ、ということもあります。

そんな感じでやっていこうと思いますヾ(*・ω・)ノ

« 2010年2月 | トップページ | 2010年4月 »

other sites

  • follow us in feedly
  • github
  • stackoverflow

ソフトウェアエンジニアとして影響を受けた書籍

  • Christain Bauer: HIBERNATE イン アクション

    Christain Bauer: HIBERNATE イン アクション
    理論と実践が双方とも素晴らしい製品であるHibernate。本書はそのプロダクトを書名に冠していますが、Hibernateを使うつもりがなく、ORマッピングの解説書として読むにしても十分な良書です。Second EditionとしてJava Persistence With Hibernateという書籍も出版されていますが、残念ながら現在のところ 和訳はされていません。-インアクションは2.xの、Java Persistence-は3.1の頃のものなので、最新版とはちょっと違うところもあることに注意。 (★★★★★)

  • アンドリュー・S・タネンバウム: 分散システム 原理とパラダイム 第2版

    アンドリュー・S・タネンバウム: 分散システム 原理とパラダイム 第2版
    クライアント/サーバシステムを構築する上で必要となる知識が総論されてます。Web技術者も、フレームワーク部分を開発するのであれば必読。 (★★★★★)

  • Joel Spolsky∥著: ジョエル・オン・ソフトウェア

    Joel Spolsky∥著: ジョエル・オン・ソフトウェア
    前述の書籍「ソフトウエア開発プロフェッショナル」をより砕いたもの、という感じでしょうか。 前書きではプログラマでなくSE向けの本のように書かれているが、プログラマが読んでも面白い本であると思われます。 SEになった新人(あるいはそういう会社に入る/入りたての人)にとっては、これからどういったことが仕事を遂行していく上で起こりえるのか、どのように考えて行なっていけばいいのか決定する助けになると思います。 元は″Joel on Software″というブログの記事で、web上でも一部日本語で読めます。 http://japanese.joelonsoftware.com/ (★★★)

  • ドナルド・C・ゴース,ジェラルド・M・ワインバーグ: ライト、ついてますか

    ドナルド・C・ゴース,ジェラルド・M・ワインバーグ: ライト、ついてますか
    問題解決(一昔前のの流行語で言うところの『ソリューション』)能力は、システムエンジニアのスキルとして備えるべきもののうちのひとつです。しかし、これは難しい。学校で出されるテストと違い、唯一の、(問題提出者が想定している)解を求めるだけが「問題解決」では無いからです。そもそも、何が問題なのか、それは本当に問題なのか、それは本当に解決すべき問題なのか、その問題解決方法は正しいのか、などを解決しなければ、「その解は正しいのか」に辿りつくことができません。この本の最も良いところのひとつは、本があまり厚くないこと。すぐに読めるし、何回も読み返す気になるでしょう。 (★★★★★)

  • スティーブ・マコネル: ソフトウエア開発プロフェッショナル

    スティーブ・マコネル: ソフトウエア開発プロフェッショナル
    コードコンプリートで有名なスティーブマコネルの著書。新人SEに読んで欲しい。個人として業界の中でどうあるべきか、組織としてどうあるべきか、SEのプロ意識とは?SEの心構え概論、といったところでしょうか。また、業界における資格の重要性についても説かれています。この業界では資格が特に軽んじられる傾向がありますが、この傾向はどんな弊害をもたらすのか、将来的にこの業界は資格に対してどのような姿勢で臨んでいくべきなのか。日経BP社では(他の出版社もだが)最近、似たような類いのあまり面白くない書籍が乱出版されていますが、この本は別格だと思うので安心して購入して欲しいと思います。 (★★★★★)

無料ブログはココログ