Monday, April 28, 2014

第21回Alfresco勉強会が開催されました

こんにちは。寺下です。

先日4/23(水)に21回目のAlfresco勉強会が開催されました。
この勉強会ではいつも2つ発表があるのですが、今回は参加者の方が知りたい内容と発表予定の内容がちょっとズレていたため、発表を1つ次回以降に回すことにして、その時間を使って質疑応答に充てることになりました。Alfrescoの認証連携の仕組みやampファイルを適用すると実際は何が起こっているのか、といった内容についてご質問があり、実際に設定ファイル等を画面に映しながらご説明することができたので、自分で調べるよりは早く疑問を解消できたのではないかと思います。参加者の方の希望によってはこういう進め方もアリですね。

ちなみに、次回以降に回すことになったのはAlfrescoのマルチテナントの話でした。おそらく次の勉強会で発表することになると思うので、興味のある方はぜひ参加していただければと思います。

というわけで、今回の発表は以下の1件でした。

Alfresco Workdesk ConfiguratorによるPluginの設定変更方法

発表資料はこちら

前回に引き続きAlfresco Workdesk関連の内容です。WorkdeskはExplorerやShareとは違い、Configuratorというツールを使用して比較的簡単にUIをカスタマイズすることができるようになっています。今回の発表では具体的に要件を設定してそれを実現するための設定方法をご紹介する、という内容ではなく、より基本的なConfiguratorの使い方(インストール方法含む)についてご紹介しました。WorkdeskのPluginは大きく分けて4種類あり、それぞれに非常に多くの設定項目があるため、Configuratorでどの設定を変えればどこが変わるのか色々試してみていただければおもしろいと思います。

さて、次回の勉強会は6月25日(水)に開催予定です。たくさんの方のご参加をお待ちしております。参加申し込みはこちらからお願いします。

Wednesday, April 23, 2014

Alfresco 4.2の使い方 - リポジトリとサイトの準備をしよう

こんにちは。大谷です。

前回の記事「Alfresco 4.2の使い方 - ユーザ管理・グループ管理」に引き続き、Alfrescoを使い始めるための準備のお話をしたいと思います。

ユーザ・グループを登録して早速利用開始!と言いたいところなのですが、実はAlfrescoにはコンテンツ管理を行う方法が2種類あります。この2種類は「リポジトリ」と「サイト」と呼ばれるものです。
そこで今回は、その2種類の概要と特徴、利用シナリオを説明し、それぞれの準備方法を紹介しようと思います。


リポジトリ vs サイト


まずは、リポジトリとサイトについて、それぞれがどういうもので、何ができて何ができないのか、どのように選択すればよいかを説明します。

リポジトリ

ざっくり言うと、リポジトリとはお馴染みのファイルサーバ、共有フォルダと同様で、ルートフォルダ以下にツリー構造のフォルダを作成し、適切に権限を付与してコンテンツ管理を行うものです。

サイト

サイトとは、部署、プロジェクトなどチームごとのコラボレーションスペースを提供し、その単位で各種情報を共有しようというものです。その箱をサイトと呼び、サイトごとに以下のツールを利用することが可能です。
  • サイトダッシュボード: サイトごとにアクティビティ等の情報を集約表示する画面
  • 文書ライブラリ: リポジトリとほぼ同等のコンテンツ管理ツール
  • 議論: 掲示板(discussionが「議論」と訳されてしまっています…)
  • Wiki: 一般的なWiki
  • ブログ: 一般的なブログ
  • カレンダー: チームのイベントを管理するもの
  • リンク: URLリンクのリスト
  • データリスト: 課題やToDo等のリストを管理するツール

リポジトリとサイトの大きな違いはコンテンツ管理以外のツールの有無と、チーム単位での情報共有ということになりますが、その他にも以下のような違いがあります。
  • リポジトリではユーザ/グループ単位で権限管理を行うが、サイトの文書ライブラリではサイトで与えられるロールごとに権限管理を行う。
  • Microsoft Office連携(オンライン編集機能)はサイトの文書ライブラリのみで利用可能

以上を踏まえて、以下にリポジトリとサイトの利用シナリオを挙げてみます。
もちろん、要件によっては逆のもので対応できる場合もあるでしょうし、併用するという選択肢もあります。

リポジトリを利用すべきシナリオ

  • ユーザ単位での厳密な権限管理が必要な場合
  • コンテンツ管理以外のコラボレーションツールを利用する必要がなく、なるべくシンプルなUIが求められる場合
  • コンテンツ管理プラットフォームとして、主に他システムとの自動的なコンテンツのやりとりに利用され、ユーザが介在する場面が少ない場合

サイトを利用すべきシナリオ

  • コンテンツ管理以外のコラボレーションツールを利用する場合
  • 組織、プロジェクトごとの情報共有に主眼が置かれている場合


では、続いてリポジトリとサイト、それぞれの使い方を見てみましょう。


リポジトリを使ってみる


まずはリポジトリにアクセスしてみましょう。リポジトリはAlfrescoインストール時にデフォルトで準備されているため、特別な設定は必要ありません。
Alfrescoのヘッダにある「リポジトリ」をクリックします。

すると、以下のような画面が表示されますが、これがリポジトリのルートフォルダになります。

画面左にツリー構造のフォルダがあり、画面右にはカレントフォルダ内のコンテンツ一覧が表示されますが、これはファイルサーバや共有フォルダと全く同じイメージだと思ってもらって結構です。
基本的な使い方も同じで、フォルダを作成し、ファイルをアップロードしていきます。ファイルの詳細な情報を参照するためには、ファイル名もしくはサムネイルをクリックして詳細画面を表示します。「ダウンロード」をクリックするとファイルをダウンロードすることができます。


実際にアクセスしてみると、リポジトリのルートフォルダ以下にはData DictionaryやSites、IMAPホームなどのシステムフォルダが見えることが分かると思います。これらは一般ユーザであればリードオンリーですが、これらを見えないようにしたい場合には「共有ファイル」機能を利用することもできます。ヘッダから「共有ファイル」をクリックしてみましょう。

今度はリポジトリと同等のUIがシステムフォルダ無しで表示されたかと思います。実は、ここではリポジトリルートの「共有」フォルダ以下が見えるようになっており、システムフォルダを隠ぺいするための手軽な手段となります。ヘッダの「リポジトリ」リンクを設定で非表示にして、サイトと共有ファイルを併用するという運用も考えられます。


サイトを使ってみる


次に、サイトの使い方を説明します。サイトはAlfrescoインストール時にサンプル用サ イト「Sample: Web Site Design Project」が用意されているので、どのようなものかを知るためにはこのサイトにアクセスしてみるのが一番です。「あなたのサイト」ダッシュレット、もしくはヘッダの「サイト」からアクセスすることができます。しかし、実際にサイトを使い始めるためには新しいサイトを準備する必要があります。

まずはサイトの作成から

では、早速サイトを作ってみましょう。
まずは上記画面の「サイトを作成」をクリックしましょう。すると以下の画面が表示されるので、必要な項目を入力します。


公開レベルについては以下の通りです。
  • 公開: 全ユーザに公開され、ユーザは自由にサイトへ参加することができます。参加していなくてもサイト内のコンテンツを閲覧することができます(書き込みはできません)。
  • 条件付き公開: 全ユーザに公開されますが、サイトへの参加にはサイト管理者の承認が必要です(ユーザは参加リクエストを投げることができます)。参加していないユーザはサイト内のコンテンツにアクセスできません。
  • 非公開: サイト管理者が招待したユーザにしか公開されません。
ここでは公開レベルを「公開」にしてみましょう。必要な情報を入力して「OK」をクリックすると、以下のようにサイトが作成され、サイトダッシュボードが表示されます。

次に、「サイトの設定オプション」アイコン→「サイトのカスタマイズ」をクリックします。

サイトのカスタマイズ画面が表示されるので、サイトで利用するツールをドラッグ&ドロップで追加・削除します。

最後に「OK」ボタンを押すと、追加されたコンポーネントがサイトダッシュボードに追加されます。なお、全てのコンポーネントが表示されていない場合は「その他」をクリックすると残りのコンポーネントが表示されます。


サイトにメンバーを招待する

サイトの準備が完了したら、サイトにユーザを招待します。
公開の場合では、ユーザがサイトに参加しなくてもサイト内の情報にアクセス可能ですが、その場合はゲスト権限でのアクセスになります。 より強い権限でのアクセスを許可するためには、サイト管理者がユーザを招待する必要があります。
では、早速ユーザを招待してみましょう。

まず、「ユーザーの招待」アイコンをクリックします。

サイトメンバー画面が表示されるので、ユーザを検索して「追加」ボタンをクリックし、「役割の選択」から付与する役割を設定します。各役割の詳細はAlfresco Helpを参照してください。

招待するユーザを設定したら、「招待」ボタンをクリックします。これで招待処理が完了ですが、最後にユーザ側で招待の承認を行う必要があります。なお、招待したけど承認されていないユーザは、「保留中の招待者」から確認することができます。

招待されたユーザでAlfrescoにログインすると、ユーザダッシュボードの「あなたのタスク」ダッシュレットに招待の通知が表示されます。

これをクリックすると以下の画面が表示されるので、「承認」をクリックします。

以上で招待とそれに対する承認が完了し、設定した役割でのサイトへのアクセスが可能になります。

サイトの文書ライブラリにアクセスする

最後に、サイトの文書ライブラリにアクセスしてみましょう。サイトダッシュボードから「文書ライブラリ」をクリックすると以下の画面が表示されますが、これが文書ライブラリのルートフォルダになります。

基本的な操作感はリポジトリとほぼ同じですが、両者には前述の違いがあることに注意が必要です。
ま た、文書ライブラリはサイトごとに生成されるため、サイトをまたぐ形でのコンテンツ共有ができないことに注意が必要です。その必要がある場合は、 両サイトの参加ユーザを包含する形のサイトを別途作成してそちらで共有する、リポジトリ(もしくは共有ファイル)を併用する等の対処が必要になります。

Thursday, April 17, 2014

Alfresco 4.2の使い方 - ユーザ管理・グループ管理

こんにちは。大谷です。
今回は、Alfresco 4.2の使い方のうち、Alfrescoをエンドユーザが使い始める前に最低限行う必要のある管理タスクについてまとめてみました。

なお、インストール方法についてはAlfresco4.0をインストールしてみよう(インストーラ編)Alfresco4.2をインストールしてみよう(手動インストール編)に詳細が載っていますので参考にしてください。


管理者でログインする


まずは管理者ユーザでログインし、Alfrescoを使い始めるための一通りの準備を行います。

ブ ラウザで http://<サーバIP>:<ポート番号>/share/ (例えば http://localhost:8080/share/ 等)にアクセスし、管理者ユーザのユーザ名とパスワードを入力します。ユーザ名はadmin、パスワードはデフォルトでadminとなっています(インス トーラを使ってインストールした場合は、インストールウィザードで指定したパスワードになります)。


ログインに成功すると、ユーザダッシュボード画面が表示されます。
このユーザダッシュボード画面には様々な情報が集約して表示されますが、「ダッシュボードのカスタマイズ」アイコンをクリックして表示内容をカスタマイズすることもできます。

ヘッダに並ぶアイコンは各機能へのリンクになっており、ユーザダッシュボードやマイファイル(ユーザごとのフォルダ)、共有ファイル、サイト、リポジトリ、その他の管理アクションの画面へ飛ぶことができます。

また、画面右上のユーザ名をクリックすると、自身のユーザ情報やパスワード変更、ログアウト等のメニューが表示されます。




ユーザを登録する


続いて、Alfrescoにユーザを登録します。管理系のメニューには画面上部の「管理者ツール」からアクセスします。まず「管理者ツール」をクリックします。


すると、以下のように管理者コンソールが表示されるので「ユーザー」をクリックしてユーザ管理画面に移動しましょう。例えば「a」と入力して検索を行うと以下のように検索結果が表示されます。


デフォルトの状態では、admin(管理者ユーザ)と2人のサンプルユーザが登録されていますが、サンプルユーザは無効状態になっています(赤色のアイコン)。

で は、新規ユーザを追加してみましょう。「新規ユーザー」をクリックすると、以下のような画面が表示されるので、「名」、「姓」(表示に使用)、「Eメー ル」、「ユーザー名」(ログインに使用)、「パスワード」、「パスワードの確認」を入力し、「ユーザーの作成」をクリックします。



登録が完了したら、作成したユーザを検索してみましょう。

ここで注意が必要なのは、Alfresco上では名前が「名」「姓」の順に表示されるということです。例えば、姓名を逆に登録するなどの運用対応が考えられます。

また、Alfrescoはユーザの一括登録(インポート)にも対応しています。「Alfrescoのユーザインポート機能を試す」に詳しい方法が書かれていますので参考にしてください。


グループを登録する


続いて、Alfrescoにグループを登録します。
アクセス権管理等にグループを用いることで、管理の手間を削減することができます。

まず、管理者コンソールの「グループ」をクリックします。
すると、グループ画面が表示されるので、「閲覧」ボタンをクリックします。


グループの一覧が表示されるので、「新規グループ」アイコンをクリックします(小さいアイコンで分かりにくいですが、ツールチップで分かります)。


次に、グループ情報を入力します。以下のように入力して「グループの作成」をクリックします。IDはAlfresco内部での処理等に利用され、表示名はグループ表示の際に利用されます。


正常に追加されると一覧に表示されるので、先ほど追加したグループをクリックし、「ユーザーの追加」アイコンをクリックします(これまた分かりづらいです…)。



検索ダイアログが表示されるので、追加するユーザを検索し、「追加」ボタンをクリックします。
これを繰り返し、グループにユーザを追加していきます。


削除する場合は、ユーザにマウスカーソルを当て、「ユーザーを取り除く」アイコン(×アイコン)をクリックします。また、グループのメンバにグループを指定することも可能です。


(2014/4/23) 「Alfresco 4.2の使い方 - リポジトリとサイトの準備をしよう 」を公開しました。

Friday, April 11, 2014

Private cloud vs. public cloud for document management

I sometimes get asked: "Why set up a private cloud (or on-premise server) for your company's document management, when offers like Office365 and Dropbox for Business are available?"

Security

If your company's information is one of its main assets, don't give it to third parties.

As revealed by Snowden, the NSA spies at the root of public clouds' infrastructure. And ironically, one of Dropbox's board members is an ex-US Secretary of State famous for authorizing wiretapping.

Dropbox, Office365, Google Docs store your documents unencrypted, out of your control, where they have high chances of getting spied on. Think you are not interesting enough for spies? Think again, most surveillance targets are innocent civilians.

Integration

Document management is not your only tool.
Your company has tools for messaging, scheduling, custom relationship management, business intelligence.
Public cloud offers just do not integrate with any of these tools.

Going a step further, many real-world companies extend beyond the Internet.
Even if not, soon will come a day where you want to:
  • Integrate with a printing system
  • Scan efficiently (customer applications, resumes, ...)
  • Unify data from CCTV videos, fire sensor reports, and any other source of information.
Such real-world integration is common in on-premise document management solutions, but cloud offers are light-years away from it.

The CMIS protocol is designed to facilitate integration with document management systems. It is implemented by 99% of on-premise document management systems, but only by a single public cloud document management (Alfresco Cloud).

Real workflows

Public cloud document management offers typically have poor workflow engines. In addition, all companies are different and have not only different business processes, but different ways of controlling their business processes. All public cloud offers totally lack this flexibility.

A real workflow engine can be extended, adapting itself to your workflows.
Dropbox does not even have workflows. Office365 has simplistic workflows in which your business processes won't fit well, making your whole company less efficient, and irritating your employees. The engine should adapt to your workflows, not the other way round.

Sustainability

Choosing a private cloud offer means locking yourself with a particular public cloud vendor. While this is true with all non-open-source products, the problem is worse here because the vendor can limit your number of users, number of documents, storage space, and anything they want to limit.

While $125 per user might sound reasonable right now, it might sound less so when suddenly your company needs to let 200 external contractors access to a folder. That is a scalability issue.
Also, your vendor will change its pricing in the future, and it might not be at your benefit.

Migrating from an on-premise vendor to another is doable thanks to the CMIS standard. On the other hand, it is nearly impossible to migrate out of a public cloud offer without losing the metadata, document relationships, and versions history.
A welcome exception is Alfresco, which implements CMIS both on cloud and on-premise, making migrations easier.

Quality of Service

Dropbox outages happen frequently. Office365 rolls up new (buggy) releases just when your company is extremely busy and can't afford to take any risk.

With your private cloud, you have the freedom to:
  • Define the QoS (Quality of Service) you need.
  • Roll out changes only when your staff is not already 100% busy.

Agility

Public cloud offers like Office365 and Google Docs rely on heavy factorization to be competitive. Just try contacting Google and asking them to fix one of their bugs: You probably won't have any impact, even if the bug is extremely important for your company.

Indeed, factorization comes with a total lack of flexibility. Public clouds are so big they can't afford to reconfigure a server for your particular needs.

Conclusion

On the other hand, what is good with public cloud for document management?
  • It is easy to get started.
  • Cheaper for very small companies.
  • You get a convenient sync client. Actually there is also a sync client compatible with private clouds.
  • Infrastructure maintenance is done for you, which can be interesting if you have no I.T. team.
For middle/large companies though, in most cases private cloud is the most rational solution.

Wednesday, April 9, 2014

Alfrescoにカスタムindicatorを追加しよう(evaluatorも追加するよ)の巻

こんにちは。最近よく全身筋肉痛になる大谷です。

先日、弊社の花見兼BBQがあって家族を連れて行ったのですが、娘と遊んだり抱っこしたりしてたら見事に筋肉痛になりました。運動不足の賜物なので、もうそろそろ何がしかの運動を再開しないとまずいなと気持ちを新たにしている年度明けです。

前置きはさておき、今回はAlfrescoのindicatorとevaluatorを紹介したいと思います。以下の記述は現時点での最新バージョンであるAlfresco Community Edition 4.2.fに基づいています。


indicatorとは?


indicatorとはドキュメントの左上に表示されるアイコンのことで、ドキュメントの状況に応じてアイコンの表示/非表示を制御することができます。例えば標準のAlfrescoでは、ワークフローが回っているドキュメントや、特定のアスペクト(EXIF等)が付いているドキュメントにアイコンが表示されます。



デフォルトのindicatorは、以下のファイルの<indicators>セクションで定義されています。

<tomcat_dir>/webapps/share/WEB-INF/classes/alfresco/share-documentlibrary-config.xml
<indicators>
   <!-- Being edited by current user -->
   <indicator id="editing" index="10">
      <evaluator>evaluator.doclib.indicator.editing</evaluator>
   </indicator>
   <!-- Locked by current user -->
   <indicator id="lock-owner" index="10">
      <evaluator>evaluator.doclib.indicator.lockOwner</evaluator>
   </indicator>
   <!-- Locked with owner identified by cm:owner property -->
   <indicator id="locked" index="10" icon="lock-owner-16.png">
      <evaluator>evaluator.doclib.indicator.lockedOwner</evaluator>
      <labelParam index="0">{jsNode.properties.owner.displayName}</labelParam>
      <labelParam index="1">{jsNode.properties.owner.userName}</labelParam>
   </indicator>
   <!-- Locked with owner identified by cm:lockOwner property -->
   <indicator id="nodeLock" index="10" icon="lock-owner-16.png" label="status.locked">
      <evaluator>evaluator.doclib.indicator.nodeLocked</evaluator>
      <labelParam index="0">{jsNode.properties.cm_lockOwner.displayName}</labelParam>
      <labelParam index="1">{jsNode.properties.cm_lockOwner.userName}</labelParam>
      <override>locked</override>
   </indicator>
   <!-- Google Docs Editing -->
   <indicator id="google-docs-editing" index="10">
      <evaluator>evaluator.doclib.indicator.googleDocsEditing</evaluator>
      <override>editing</override>
   </indicator>
   ...

カスタムindicatorを追加したい場合は、このような設定を追加する必要があります。


evaluatorとは?


evaluatorとは、このindicatorやドキュメントアクションの表示条件を指定するものです。条件に応じてtrueもしくはfalseを返すというシンプルなもので、indicatorやアクションなど、Alfresco Shareの様々な場所で、条件指定のパラメータとして利用されています。実際に、デフォルトで定義されているindicatorを見てみても、evaluatorセクションにてどのevaluatorを使うかが指定されています。

デフォルトで利用可能なevaluatorは、以下のファイルで定義されています。

<tomcat_dir>/webapps/share/WEB-INF/classes/alfresco/slingshot-documentlibrary-context.xml
<!-- Being edited by the current user -->
<bean id="evaluator.doclib.indicator.editing" class="org.alfresco.web.evaluator.doclib.indicator.EditingEvaluator" />
<!-- Locked by the current user -->
<bean id="evaluator.doclib.indicator.lockOwner" class="org.alfresco.web.evaluator.doclib.indicator.LockOwnerEvaluator" />
<!-- Locked by another user -->
<bean id="evaluator.doclib.indicator.locked" class="org.alfresco.web.evaluator.doclib.indicator.LockedEvaluator" />
<!-- Locked by another user, indicated by cm:owner property (no cm:lockOwner) -->
<bean id="evaluator.doclib.indicator.lockedOwner" class="org.alfresco.web.evaluator.ChainedMatchAllEvaluator">
   <property name="evaluators">
      <list>
         <ref bean="evaluator.doclib.indicator.locked" />
         <ref bean="evaluator.doclib.indicator.hasOwner" />
         <ref bean="evaluator.doclib.indicator.noLockOwner" />
      </list>
   </property>
</bean>
...

独自のevaluatorを定義するにはこのような設定を追加する必要がありますが、具体的には以下の2通りの方法があります。
  1. 既存のevaluatorを利用してカスタムevaluatorを定義する
    • evaluator bean定義においてparent属性で親evaluatorを指定する
    • propertyセクションでプロパティを指定する
  2. カスタムevaluatorクラスを作成する
    •  org.alfresco.web.evaluator.BaseEvaluatorクラスを継承し、boolean evaluate()をoverrideして条件判定ロジックを記述する
    • このカスタムevaluatorクラスについてのevaluator bean定義を追加する
1.は、既存のevaluatorで実現可能な条件判定を行う場合に利用でき、xmlの設定を追加するだけで実現することができます。例えば、特定のタイプやアスペクト、属性値を判定したり、複数の条件の組み合わせで判定する場合などに利用できます。


カスタムindicatorを追加しよう


というわけで、早速カスタムindicatorを追加してみようと思います。今回のサンプルでは、更新日から1日以内のドキュメントにアイコンを表示するようなindicatorを作ります。

1. indicatorを定義する


まず、indicatorを定義します。定義は以下のとおり、share-config-custom.xmlに記述します。

<tomcat_dir>/shared/classes/alfresco/web-extension/share-config-custom.xml
<alfresco-config>
   <config evaluator="string-compare" condition="DocumentLibrary">
      <indicators>
         <indicator id="new-arrival" index="5">
            <evaluator>evaluator.doclib.custom.newArrival</evaluator>
         </indicator>
      </indicators>
   </config>
</alfresco-config>

Alfrescoをインストーラでインストールした場合などは既にshare-config-custom.xmlが存在すると思うので、その時は上記内容をマージしてください。

まず、indicatorセクションでは以下の属性を指定できます。
  • index :indicatorアイコンの表示順序。index値の小さいものから順に表示されます。
  • icon : アイコンファイル。省略すると、/res/components/documentlibrary/indicators/{id}-16.png が使われます。
  • label :アイコンのツールチップラベルのリソースキー。省略すると、status.{id}が使われます。
また、indicatorセクション内ではevaluatorセクションで表示条件を指定します。ここで指定するのはevaluatorのクラス名ではなくbean idです。evaluator.doclib.custom.newArrivalはデフォルトでは定義されていないevalutorですが、後ほど説明します。その他にも設定可能な項目がありますが、詳しくはAlfrescoのHelpを参考にしてください。

上記の例ではicon属性が省略されているため、new-arrival-16.pngという画像ファイルが表示されます。当然デフォルトでは入っていないので、以下のディレクトリに適当な画像(16x16)を追加してください。

<tomcat_dir>/webapps/share/components/documentlibrary/indicators/new-arrival-16.png

2. メッセージリソースを追加する


次に、ツールチップ用のメッセージリソースを追加します。先ほどの定義ではlabel属性も省略されていたので、リソースキーはstatus.new-arrivalとなります。必要なのは以下の2ファイル、メッセージファイルを読み込むためのbean定義ファイルとメッセージファイル本体です。

<tomcat_dir>/shared/classes/alfresco/web-extension/custom-slingshot-application-context.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>

<beans>
   <bean id="evaluator.doclib.custom.newArrival" class="jp.aegif.alfresco.sample.CustomEvaluator"/>
   <bean id="share.custom.resources" class="org.springframework.extensions.surf.util.ResourceBundleBootstrapComponent">
      <property name="resourceBundles">
         <list>
            <value>alfresco.messages.custom-messages</value>
         </list>
      </property>
   </bean>
</beans>


<tomcat_dir>/shared/classes/alfresco/messages/custom-messages.properties
# status.new-arrival=新着
status.new-arrival=\u65b0\u7740

1つ目のファイルのファイル名は*-context.xmlであれば何でも構いません(Alfrescoが自動的に読み込んでくれます)。evaluator.doclib.custom.newArrivalというidのbean定義については、後ほど説明するので今は無視してください。

3. evaluatorを追加する


最後にevaluatorを追加します。今回は更新日(cm:modifiedプロパティ)から1日未満か否かを判別するevaluatorが必要ですが、デフォルトで定義されているevaluatorだけでは実現できないため、カスタムevaluatorを作成します。

前述のとおり、org.alfresco.web.evaluator.BaseEvaluatorクラスを継承し、boolean evaluate()をoverrideして条件判定ロジックを記述します。以下にサンプルコードを記載します。

package jp.aegif.alfresco.sample;

import java.util.Date;
import org.alfresco.web.evaluator.BaseEvaluator;
import org.json.simple.JSONObject;
import org.springframework.extensions.surf.util.ISO8601DateFormat;

public class CustomEvaluator extends BaseEvaluator {
    @Override
    public boolean evaluate(JSONObject jsonObject) {
        String modifiedDateString = (String)((JSONObject)getProperty(jsonObject, "cm:modified")).get("iso8601");
        Date modifiedDate = ISO8601DateFormat.parse(modifiedDateString);
        Date now = new Date();
        if (now.getTime() - modifiedDate.getTime() < 24*60*60*1000) {
            return true;
        }
        return false;
    }
}

jsonObjectにドキュメントのメタデータ等が入っているので、そこからcm:modifiedプロパティの値を取得し、現在の時刻と比較します。コンパイルしたらjarでパッケージングするなどして、Alfresco Shareのクラスパス上にコピーします(<tomcat_dir>/webapps/share/WEB-INF/lib/ 等)

また、このクラスを新しいevaluatorとしてAlfrescoに認識させるためのbean定義を記述する必要がありますが、それが前述のevaluator.doclib.custom.newArrival beanになります。

以上でカスタムindicatorの準備は完了です。


動作確認しよう


では、実際に動作確認をしてみましょう。カスタムモジュールを配置したら、Alfrescoを再起動します。
Alfrescoが起動したら、リポジトリもしくはサイトのドキュメントライブラリにアクセスしてみましょう。ファイルをアップロードすると、更新から1日経っていないドキュメントに新着アイコンが表示されるはずです。もちろん、1日以上経ったドキュメントには新着アイコンが表示されません。



というわけで、今回はindicatorとevaluatorのカスタマイズについて紹介しました。比較的簡単に追加できますので、みなさんも是非挑戦してみてください。なお、ここで紹介したコードはこちらにありますので必要に応じて参照いただければと思います。

Wednesday, April 2, 2014

オープンソースのクラウドソーシングで学んだこと

今日はAnkiDroid 2.1.2をリリースしました。
AnkiDroidは現在85万ダウンロードなので、このバージョンで100万ダウンロードを超えると想定しています :-)

AnkiDroidは、オープンソースな単語帳アプリです。

オープンソースだから、開発は皆ボランティア…というわけでもない!
今回は普通の開発会社に、カードプレビューという機能を外注しました。
Chrisさんという一般のAnkiDroidユーザが要件定義を書いて、お金を集めて、外注ウェブサイトにRFPを公開しました。
色々な会社が提案を出して、ChrisさんがJoltaTechというパキスタンの会社を選んで開発してもらいました。

オープンソースのクラウドソーシングについて学んだこと:
・要件定義前、実現したい機能をプロジェクトのイシュートラッカーに詳しく入力して、プロジェクトのコア開発者からできるだけ高い優先度にもらいましょう。優先度が低いままなら、実現してもリリースソースに入れてくれない可能性もありますので。この機能はそもそも要らないか、既に存在しているかもしれません。イシュートラッカーの入力で確認ができます。
・プロジェクトのメーリングリストに、「この機能を実現するパッチを作成したら、リリースソースに入れてもらえますか」というメールを送りましょう。ポジティブな返事が来ないと先に進めません(その場合はフォークでも考えられますが、そうすると運営経費がかなり上がります)
・Gitの経験をRFPの条件にしておくと、実際に開発が始まった後で、オーバヘッドが下がります。今回の会社はそういう経験がなくて、納品と修正のときに一番混乱したポイントでした。
・他のRFPの要件として、ソースコードをプロジェクトと同じライセンスにすることも必要です。
・納品のとき、テストは大切なので、その工数とスケジュールを予め考えておく必要があります。
・プロジェクトの中にリリースされることを条件にすることもできます。これはプロジェクトによって読みづらいので、メイン支払いの後のボーナスとするのが一番良いと思います。

下記のワークフローをお勧めします:
Nicolas Raoul