Tuesday, October 29, 2013

CMISに準拠しているとはどういうことか

こんにちは、linzhixingです。現在、aegifでの仕事をお休みしてフランスに1年間の滞在中です。もう2ヶ月ほど経ちました。日本ではずっとNemakiWareの開発をしていましたが、開発の方は社内で引き継がれています。おかげで、すでにNemakiWareはバージョン1.0GA2がリリースされており、パフォーマンスの飛躍的な改善や、CMIS1.1機能などが実装されました。

私自身もこちらで日曜大工的にちょくちょくgithubにpushしているのですが(オープンソースですし)、弊社で社内コミュニケーション用に導入されているco-meetingのおかげで円滑に進められています。もともと日本でも、(プロジェクトによりますが)わりと自宅で仕事+co-meetingというスタイルだったので、場所が変わってもとくに変わらないんですが、それが新鮮といえば新鮮です。



今回のテーマ

さて 、今回のブログのテーマは、「CMISに準拠しているとこんなことができるよ」というCMIS関連でよく聞くセールスポイントではなく、「CMISに準拠しているとはどういうことか」です。少しわかりにくいタイトルですね。CMIS仕様に準拠していると一言で言うのは簡単なものの、CMIS仕様の仕様としての特殊性から、準拠といっても様々なグラデーションが考えられたり、サーバ/クライアントがそのCMISに準拠するためにどういう戦略を取り得るか、なんていう側面から、CMIS仕様に対する理解を深めてみたいと思います。そして最後に、CMIS化する(CMISに準拠させる)ためにNemakiWareを使う、というコンセプトについて紹介します。

ですので、CMISという規格について少しは馴染みのある方向けの内容となりますが、
特にCMISをご存知ない方でも、一般に既存の仕様にあわせて新しく製品を開発するときどんなことを考えればいいか、という視点で流し読みしてくだされば幸いです(CMISを知らないと分からないような例は、なるべく「たとえば」として括り出してあります)。



CMISの沿革

まずはじめに、CMIS規格が策定された経緯から。CMISはもともと2008年にIBM、EMC、MicrosoftといったECM界のビッグネームがOASISに提出した仕様で、Content Management Interoperability Service(コンテンツ管理相互運用サービス)の略です。つまり、異なるECM製品同士でも共通のプロトコルにより操作できるようにするための規格です。
 http://www.insightnow.jp/article/2074

業界全体で既にデファクトスタンダードが成立していた、というわけではなく、既にある程度確立・乱立していたECM製品同士の間に新しく共通言語としてのCMISが定められました。もちろん、いったんCMISという規格が定められた以上、ECMとして望ましい機能を今後CMISが自主的に取り込んでいく動きはあって、たとえばタグ/カテゴリの仕様策定も検討されていたようですが、いずれにせよだいぶ先の話になりそうだという印象です。 

CMISは既存ECMを抽象化したものといえますが、NemakiWareは反対に、最初からCMIS準拠を目指してスクラッチで開発されたものなので、「CMIS準拠という制約を極力守りながら、どこまでやりたいことが自由に表現できるか」についてセンシティブにならざるを得ませんでした。それが、このブログのタイトルになっています。



CMISは最大公約数 

さて、CMISはこのような経緯から、既存のいろいろなECMの機能から最大公約数を取って定義し直したようなものになりました。(追記2013/10/29: 厳密に「最大」とはいえないかもしれませんが)

ECMが持ち得る諸機能のうち、このミニマムに含まれない部分をCMIS外で提供するのは、もちろん自由です。
  •  たとえば監査(Audit)機能などはCMIS仕様では定義されていませんが、Alfrescoなどは提供しています。また、ユーザ/グループはCMISでは定義されていません。しかしCMIS仕様自身が、権限設定やコンテンツの属性としての「作成者」などでユーザの存在を前提しています。その実装は各CMISサーバに任されているわけです。 

CMIS外で提供される機能はさておき、CMIS仕様内部にも、個々のECMサーバごとに実装方針を選択していいよ、という可変な部分があります。



CMISの可変性 

CMIS内部での可変性には2種類あります。Capabilityと呼ばれる、どの実装方針を選択したのか示す情報と、もう一つは、名前はついていませんが仕様上いくつかの選択肢がゆるされている場合です。

 

Capability 

CMISサーバではリポジトリを指定してその中のファイルやフォルダを操作しますが、リポジトリ全体のメタデータであるRepositoryInfoの中にCapabilityという項目があります。これは簡単に言えばそのサーバでどの機能がON/OFFになっているかを示すものです。
  • たとえば、OrderBy CapabilityがONなら、クライアントは名前や作成日時などでソート済みのコンテンツ一覧を要求できますが、OFFなら順序が保証されません。
  • たとえば、Multifiling / Unfiling CapabilityがONならサーバは1つのファイルを複数の親フォルダに格納したり、どのフォルダにも属さないファイルの存在を許可できます。 
クラアントは、サーバがどのCapabilityを提供しているか知ることができます。様々なCMISサーバに接続する可能性がある汎用CMISクライアントは、サーバごとに必要なCapabilityが提供されているか事前にチェックして、提供されていない場合はワークアラウンドを実行する、といった戦略が必要になってきます。 
  • たとえば、コンテンツのチェンジログをクローリングするCMISクライアントは、Changes CapabilityがONならチェンジログを取得できますが、OFFの場合はワークアラウンド(そのサーバがCMIS外でチェンジログを提供していればそれを取得するなど)を取る、など。

仕様上、複数の選択肢がある場合

Capabilityのように明示的に「このサーバはこの機能を提供すると保証します」と宣言があるわけではないけれど、仕様書で「あなたのサーバがどちらの挙動をするかはお好みで」と書かれているものがあります。 
  • たとえば、ドキュメントのメタ情報を更新するsetPropertiesメソッドやドキュメントのファイル実体を更新するsetContentStreamメソッドで、これらのメソッドを実行したらドキュメントのバージョンを上げる/上げない、はサーバが任意に実装方針を選択します。どちらを選択したか告げるCapabilityは存在しません。ちなみにNemakiWareではどちらもマイナーバージョンアップ(e.g. 1.0 → 1.1)することにしています。マイナーにするかメジャーにするか、なんてこともサーバ側の自由です。 
どういう挙動になるのかクライアントからは事前に知ることができませんが、このようなケースは仕様書上それほど多くあるわけではないですし、Capabilityほど派手に挙動が変わるものでもありません。それでも、CMISが規格として公約数をとった影響か、仕様としてカッチリ固定されていない部分がままあるという印象を受けます。



デファクトスタンダードとしてのApache Chemistry

ここまで、CMISの機能セットについて論理的な特徴を説明してきましたが、CMISに準拠した製品を作る上でデファクトスタンダードとなっているApache Chemistryライブラリについても説明したいと思います。


Apache Chemistryとは

Apache ChemistryはCMIS仕様のオープンソースな実装ライブラリです。Apacheのtop levelプロジェクトになっているようです。近々CMIS and Apache Chemistry IN ACTIONという書籍(洋書)も出るようです。

なんで"Chemistry"という名前なのかというと、CMIS(シーミス)を"Content"の音でケーミス?と呼ぶこともあるから、みたいです。

Chemistryのコミッタの多くはCMIS仕様の策定メンバと重なっているようです。仕様と実装は区別しないといけませんが、CMISの挙動でよくわからないときはChemistryのJIRAにあたってみるのもいいかもしれません。

ライブラリとしては、サーバ用とクライアント用から成っています。サーバ用はJavaによるOpenCMIS一択で、クライアント用にはJAVA/Python/PHP/.Net/Objective-Cによるライブラリが存在しています。
CMISが複数のECMに共通する仕様であるように、そのデファクトスタンダードな実装ライブラリであるChemistryも多くのECMで利用されています。Wikiにあるものを挙げると、Alfresco, Nuxeo, SAP, Open Text, Liferay……


(Chemistry固有の制約)

というのはほとんどないと思いますが(CMIS仕様あっての話なので)、稀に、「仕様によればpropertyの値がnullでも許されるが、OpenCMISではエラーになる」みたいな細かい問題はあったようです。ほとんどバグのレベルと言っていいと思いますが、一番開発が進んでいるOpenCMISでも今もときどきバグfixがあります。

また、OpenCMISライブラリだけ独自に対応してくれることもあります(Atomバインディングでは普通返されないchangeTokenをOpenCMISライブラリでは特別に返してくれる、など)。 デファクトスタンダードとはいえ、アドホックな対応になるので、どこまで依存させるかの判断になります。

なんにせよ、CMISを実装していくためにCMIS仕様上の文言を解釈するとき、OpenCMISがどう実装しているのかという視点も重要になることは間違いありません。

なお余談ですが、CMIS仕様自体に「バグ」があることもあります :)
https://tools.oasis-open.org/issues/browse/CMIS-757



いっそCMISに準拠しない

さて、このブログのテーマは「CMISに準拠しているとどう嬉しいのか」ではないので、CMISに準拠しないパターンも書いてみたいと思います。

とはいっても、もちろんCMISで定義されていない機能はCMIS外で実装すればいいだけなので、ここで述べるのは「CMISの機能のうちのいくつかを単に提供しない」のと、「CMIS機能を通じて情報をやりとりするときに、CMIS外のデータを紛れ込ませる(&そのデータに基づいてCMIS外のサービスを行う)」の二つです。


「特定の機能を提供しない」

まず、CMISの機能のうちいくつかを提供しない場合ですが、ドキュメントやフォルダはCMISで提供したいがポリシーやリレーションシップなどのオブジェクトは使わない場合、その部分のメソッドを実装しない / モックに留める、ということが考えられます。CapabilityでOFFにできるのであればOFFと宣言すればよいですが、そうでない(=CMISとして必須)場合は、もうCMIS準拠していると胸を張って言うことは出来なくなります。しかし、CMISは様々なECMから機能を抽出したものなので、用途によってはポリシーなど不要で、提供しなくても他の部分への影響はほとんどないわけです。また、CMIS1.0からCMIS1.1を追加で実装するにあたって、セカンダリオブジェクトなどは実装したけれどもバルクアップデート機能はサポートするつもりがない、というケースは今後現実的にはあり得る話だと思います。


「CMIS外のデータを紛れ込ませる」

CMISは、サーバとクライアントの実際の通信にWebServicesバインディングとAtomバインディング(とCMIS1.1ではBrowserバインディング)を定めています。データはXML(かJSON)でやり取りされるので、その中にCMIS外のデータを紛れ込ませれば、なにかと便利なときがあります。
  • たとえば、Alfrescoのaspectのような情報。これはCMIS1.1でセカンダリタイプが定義されたことで、CMISの枠内に取り込まれましたが、CMIS1.0しか対応していなければCMIS外のデータになります。
  • また、コンテンツの権限設定情報であるACLが、特定の親コンテンツから特定の子コンテンツに継承されるか否かは、実はCMISでは表現できません。なんらかの意味で「継承」されているなら、親コンテンツACLへの変更を伝播する/しないはCapabilityやメソッドの引数で調整できるよ、とは書いてあるので、「継承」概念自体は前提されているのですが……。クライアントからACL継承フラグを直接設定できるようにしたい場合、サーバがフラグをCMIS外のデータとして提供できると好都合です。
CMIS外のデータは、もちろんCMISでサポートされていませんが、サーバ側のデファクトスタンダードであるOpenCMISライブラリではCmisExtensionクラスを提供しています。これはサーバ/クライアント間がCMISとしてやり取りするxmlの中に、CMIS外のデータを埋め込むためのものです。汎用性はもちろん保証されませんが、特定の(OpenCMISベースの)CMISサーバと通信するクライアントがCmisExtensionをパースしたり送信したりするケースが考えられます。

NemakiWareでも、上述のACL継承フラグをCmisExtensionで提供しています。NemakiWareの場合、クライアントはApache Chemistryではなく、RailsベースのActiveCMISライブラリを使っているので、CmisExtnsionをパースするためのコードを追加しています。(そのうち本家にpush予定)

既存のECMサーバであれば、CMISで表現できない機能は無理にCmisExtensionで押し込まず、元々のAPIや規格でのみ提供することも考えられます。しかしNemakiWareはCMIS準拠によるメリットを発揮するため、どんな機能でもできる限りCMISだけで表現しようとしています。そしてどうしてもCMISで表現できないときには、まずCmisExtensionを検討し、それでも難しい場合には独自のREST APIを実装する、という判断をしています。



CMISとデータベースのあいだ

さて、少し話は変わりますが、CMIS仕様を一言で説明したいとき、「CMISはECMのSQLだ」ということがよく言われます。SQLがさまざまなDBを統一的に操作できるように、それと平行的に、CMISはさまざまなECMサーバを統一的に操作できる共通言語だというわけですね。

とはいえ、ドメインモデルとサービスを論理的に定めるCMIS仕様と、その背後にあってデータ実体を格納するデータベース(厳密にはInMemoryサーバとかもあります)との間には大きな開きがあります。どう大きく開いているかというと、当然CMIS仕様を満たすためにいろんな実装をしないといけないのと、その実装には可変な選択肢が多くて実装方針を決めないといけないことが多いのです。
  • 前者については、デファクトスタンダードとしてのApache Chemistryがある程度までは負担を減らしてくれます。しかしそれでも、実際にNemakiWareを実装してみた感想としては、サーバではOpenCMISライブラリとDBの間に大きな開きがなお残されています。CMISで定義されたエラーを正確に返したり、フォルダツリーを辿りながらコンテンツを削除し、途中で失敗した場合は特定の出力を返すよう実装したり……。OpenCMISライブラリは、xmlによる通信部分とそのパース、および各サービスメソッドへの振り分けやデフォルト値の設定まではやってくれますが、50個近いメソッドの中身は各サーバが実装しないといけません。しかしそれらの実装は、極端にDB依存な最適化をしない限り、誰がやってもある程度似たものになるはずです。
  • また、後者については、既存ECMが自らをCMIS化するときは選択肢が多くてやりやすかったでしょうが、新しくECMサーバを作ったり、既存のCMS製品をCMIS化したい場合には、CMISのコア機能さえ実装できてCMISクライアントと通信できれば充分で面倒くさいことは考えたくない、というニーズも考えられます。
したがって、これから新しくCMISを実装する場合、特に強い拘りやパフォーマンス上の問題がない限り、DBの単純なCRUD操作さえ書けば、あとの部分はすべてライブラリとして用意されているのが便利です。そして現在、NemakiWare(+OpenCMIS)をそのようなライブラリとして整備中です。

NemakiWareはバックエンドにCouchDBがあることが特徴の一つですが、実はデータベースをほかのもの(MySQLや、ユーザ/グループ部分だけLDAPなど)に取り換えることができる設計になっています。もっとも、キャッシュ機構なども含めるとまだ少し取り換え手順は複雑なので整備が必要ですが、機能的にCouchDBに依存していたSolr連携の部分は私の開発環境では既に解決していますので、近いうちにDB取り換え可能なNemakiWareをお見せできると思います。

「DB部分」には、DB以外のものを入れてもかまいません。たとえば、既存のECMサーバでCMISをサポートしていないものでも、コンテンツのCRUD APIをNemakiWareに繋ぐことで、比較的簡単にCMIS化できるでしょう。

また、NemakiWareはCMISで提供されていない機能であってもECMとして必要最低限と思われる機能(ゴミ箱からのリカバリや、ユーザ/グループ管理など)を独自に実装しています。CRUDを一式用意するだけで、自動的にそれらの機能も使えるようになるわけです。



おわりに

NemakiWareは、AlfrescoなどのECMサーバと異なり、最初からCMIS仕様に準拠することを目指して開発されました。いろいろな製品を「CMIS化」するモデルケースと成り得るのではないでしょうか。最後の、OpenCMISとDBのあいだを埋めるという話はまだコンセプト段階ではありますが、興味を持たれた方は、ぜひgithubのNemakiWareリポジトリを覗いてみてください。ソースコードのpushやコメントなど、いつでも歓迎しています!
https://github.com/NemakiWare/NemakiWare

Friday, October 25, 2013

NTLM SSO with Alfresco 4.2 and Active Directory

Do you have an Active Directory server, and want to set up Single-Sign-On (SSO), so that everyone in the domain can log into Alfresco without providing their credentials? Then this article is for you!

What you will need

Obviously, you need to download Alfresco, if you don't have it already. The newer the better, but I guess the instructions below would work for any Alfresco above 3.2.

While downloading, find and take note of the information below, you will need it:
  1. Name of the Active Directory server (let's say it is kate)
  2. Name of the domain (let's say it is aegif.local)
  3. Name of the domain administrator (let's say it is Administrator)
  4. Password of the domain administrator (let's say it is thepassword)
  5. For tests, you will also need a machine that belongs to the domain, different from the domain server itself.
Now let's get started!

Set up Alfresco

Install Alfresco on the Active Directory server, and run it once to check that it works.
If you have not specified any particular port, then Alfresco is running on port 8080. If you have chosen a different port, just adapt the occurrences of 8080 in the following.

Add the following lines at the top of file tomcat\shared\classes\alfresco-global.properties :

authentication.chain=passthru1:passthru,ldap-ad1:ldap-ad,alfrescoNtlm1:alfrescoNtlm
ldap.authentication.active=false
ldap.authentication.userNameFormat=%s@aegif
ldap.authentication.java.naming.provider.url=ldap://kate:389
ldap.synchronization.java.naming.security.principal=Administrator@aegif
ldap.synchronization.java.naming.security.credentials=thepassword
ldap.synchronization.groupSearchBase=cn\=Users,dc\=aegif,dc\=local
ldap.synchronization.userSearchBase=cn\=Users,dc\=aegif,dc\=local
synchronization.import.cron=0 0 5 * * ?
ntlm.authentication.sso.enabled=true
passthru.authentication.defaultAdministratorUserNames=Administrator
passthru.authentication.useLocalServer=true
passthru.authentication.domain=
passthru.authentication.servers=
  1. Replace aegif with your domain name minus the .local part
  2. Replace kate with your the name of your Active Directory server.
Note: The above supposes that Alfresco is on the same server as Active Directory. If not, just replace the last 3 lines with these ones:

passthru.authentication.domain=aegif
passthru.authentication.servers=aegif\\nameoftheactivedirectoryserver
passthru.authentication.defaultAdministratorUserNames=Administrator

Set up Alfresco Share

Open tomcat/shared/classes/alfresco/web-extension/share-config-custom.xml

Find the block that says <config evaluator="string-compare" condition="Remote"> (it is towards the end)
Delete this entire block, and also delete the <!-- and --> commenting around it.
Instead, paste this:


   
      
         alfrescoCookie
         Alfresco Connector
         Connects to an Alfresco instance using cookie-based authentication
         org.alfresco.web.site.servlet.SlingshotAlfrescoConnector
      
      
         alfresco
         Alfresco - user access
         Access to Alfresco Repository WebScripts that require user authentication
         alfrescoCookie
         http://kate:8080/alfresco/wcs
         user
         true
      
   


Configure the domain server

Logged as the administrator of the domain, press Win+R and execute gpedit.msc .
Gpedit is the group policy editor, with which you can modify policies for the whole domain. With this tool, we will just need to modify a single parameter.

In the tree in the left pane, select Local Computer Policy > Windows Settings > Security Settings > Local Policies > Security Options.
A long list of items with similar names will appear in the  right pane. Select Network Security: LAN Manager authentication level.











A dialog will appear.
In the dropdown box, set the value to Send LM & NTLM - use NTLMv2 session security if negotiated, as highlighted below:



Press OK and quit the policy editor.

Configure each client

Yes, you will need to perform the following on ALL client machines :-/

Open Internet Explorer (you know, that tool you use to download Firefox)
Click Tools > Internet options > Security > Local intranet > Sites > Advanced.



You will get the dialog below:



If you want to access your Alfresco server via HTTP (not HTTPS), then you might need to first uncheck Require server verification (https:) for all sites in this zone.

Type in the protocol and machine name of your Alfresco server, as seen above, then press Add and close.

Other browsers like Firefox and Chrome also have settings for this.

Test

That's all, time to test!
Open http://kate:8080/alfresco in Internet Explorer.
It should show your documents immediately, without asking for for any username/password.

Troubleshooting

If things don't go as well as expected:

1) Read alfresco.log and spot any exception.

2) Run the LDAP queries (ldap.synchronization.groupSearchBase and ldap.synchronization.userSearchBase) in an LDAP browser like Apache Directory Studio.
Nicolas Raoul

Tuesday, October 15, 2013

海外へソフトウェアを売る:海外のお客さんにとって便利かつ、手数料が少ない支払い方法?

イージフはCmisSyncという120USドルのソフトウェアを海外に売って初めたら、支払いの選択を検討しました。完璧な方法がないので、選択肢を下記に説明します。



銀行振込

銀行振込は海外のお客様にとって一番不便な選択肢です。

ヨーロッパ人はヨーロッパ内へ振込をするとき、IBAN("国際講座番号")という便利なシステムに慣れていて、金額と相手の番号だけ入れたら終了です。米国だとRTNという似てるシステムがあります。IBANは最近アジア、アフリカと中米に普及していますが、残念ながらまだ全世界ではありません。
特に、日本ではSWIFTコードという古い仕組みしかなく、IBANはまだ使用できません。

海外のお客様にとっての不便ポイント:
1.カザフスタンへ振込は30秒で終わりますが、銀行員は日本への振込経験がなく、振込をするのは難しいです。私が銀行で手続きした際は、銀行員が混乱してしまい、色々な資料を書かされました。
2.外国人は、日本の名前と住所を書くのは苦手です。文字を書き間違えることが多く、振込がうまく行きません。8つの情報も必要です:受取人取引銀行名、受取人取引支店名、受取人口座名義、会社住所など、銀行支店住所まで必要とします。一般の米人にとっては、これはありえません。

逆に、弊社にとっては一番楽な方法です:銀行口座を持ってるだけでできます。ただし、書き間違いの際に、サポートの手間が掛かります。

銀行振り込みの手数料は、固定の部分が大きいので、120USドルの場合は不利です。
送金手数料、海外電信手数料、為替取扱手数料など掛かります。お客様側の手数料もあり、弊社側の手数料もあります。

結論:
金額が大きい場合、もしくは一回のみの場合には、便利です。
120USドルの商品を大量に売りたい場合は、お勧めしません。手間が掛かり、買わないお客様もいます。

VisaやMastercardクレジットカード

海外のお客様にとって一番便利な方法です。
ソフトウェアをインターネットで買うと、クレジットカードの番号を聞かれます。

VisaとMastercardだけで、世界中で対応できます。
しかし、この2社と契約を結ぶ必要もあり、支払いの為のウェブページを作る必要もあり、手間が掛かります。手数料も掛かります。

クレジットカード会社の上に、まとめてサービスを提供してる会社もあります。もちろん、手数料が更に掛かります。
例えば、イプシロンという会社がVisa、Mastercard、Diners、American Express、JCBを扱っていていますが、手数料は約8%掛かります。

結論:
手数料は高いですが、たくさん売る場合は必要な方法になります。

ペイパル

会社にとっても、お客様にとっても、比較的に簡単な方法です。

振込やクレジットカードと違って、手数料は弊社が払います。
手数料が銀行振込より低いです:基本は3.9% + $0.30 USDです。

例:
・取引手数料:ドル取引の場合3.9%+0.3USD
・換算レート:本日のTTM96.94円に対して94.8円
・出金手数料:5万円未満の場合250円
なので、一回ずつなら6%+0.3USDぐらいになります。

ペイパル法人アカウントを作るのは難しいくありませんが、
・ 色々な資料を送る必要があります。
・手続きは、取締役か代理人がを行えます。
・テスト振込と郵便で確認されます。
・およそ一週間ほど掛かります。

Bitcoin

大幅に、手数料が低い方法です:0.06% (銀行振り込みはその100倍ぐらい)

bitcoinをもらったら、そのまま保存するか、簡単に日本円に変換もできます。
MT.GOXという世界一大きいBitcoin取引所は東京の渋谷にあります。

しかし、 Bitcoinを使うお客様が少ないです。特に、企業ではほとんど使用されていません。
弊社にとっては、設定はクレジットカードより簡単です。

結論

銀行振り込みとペイパルでめて、売上が上がりそうの場合はクレジットカード、という戦略をお勧めします。
他の方法やアイディアがあれば、ぜひ nicolas.raoul@aegif.jp へご連絡ください!(日本語の対応も可能です)
Nicolas Raoul

Monday, October 7, 2013

Alfresco 4.2.dの新機能というか改善点

こんにちは。旅行のスケジュールがなかなか決まらないおおたにです。

来る10/18(金)~10/20(日)に弊社社員旅行で北海道の富良野~美瑛~白金あたりに行くのですが、まだ全然計画を立てていません。娘(2歳)を連れて行くので、トイレ的な何かとか、そもそも子供も喜びそうなところを探すとか、ある程度は予定を組んでおくべきなのですが…。

さて、今回は8月末にリリースされたAlfresco Community 4.2.dの新機能や改善点などを紹介しようと思います。なお、当エントリはこちらの記事を参考にしています(一部補足もあり)。では、早速見てみましょう。


Shareヘッダがかっこよくなった!


いきなり見栄えの話で恐縮ですが、Shareのヘッダがかっこよくなりました。モノトーンですっきりしました。「マイファイル」「共有ファイル」というメニューも新しく登場しましたが、これらについては後述します。


また、注意点としては、これまではshare-config-custom.xmlでヘッダ表示内容をカスタマイズできたのですが(デフォルト設定はshare-config.xmlに記載されている<config><header>セクション)、当バージョンではこの設定ではカスタマイズできません。webapps\share\WEB-INF\classes\alfresco\site-webscripts\org\alfresco\share\imports\share-header.lib.jsでハードコードされているので、これを変更することになります(将来的には設定ファイルで変更できるようになりそうですが…)

ちなみに、インストールしてみたもののヘッダ表示が文字化けもしくは崩れちゃいますよという方はこちらの記事「Alfresco 4.2.dがリリースされたので早速インストールしてみた」を参照してみてください。


ドキュメントライブラリがかっこよくなった!


はい。かっこよくなったシリーズ第2弾です。 ドキュメントライブラリに限りませんが、アイコンが一新されたりして流行のフラットデザイン風になっています(ヘッダの変更もその一環のように思われます)。もちろんデザインの変更だけでなく、いくつかの機能追加がなされています。


1. スライド表示

これまで、「詳細表示」「シンプル表示」「ギャラリービュー」の3種類の表示がありましたが、新たにスライド表示」が加わりました。画面右上の「オプション」から「スライドの表示」をクリックすると以下のような画面になります。新たに「全ウィンドウ表示」や「全画面表示」機能も追加されているので、それと合わせると、簡易スライドショー的な使い方ができます(ESCキーで元のサイズの表示に戻ります)。


2. テーブル表示

ついにコンテンツのテーブル表示ができるようになりました!これたくさん要望いただいていて、実際にカスタム実装されていた方もいるような機能なのですが、やっと標準機能で対応されたようです。「オプション」から「表の表示」「オーディオの表示」「メディアの表示」を選択するとテーブル表示に切り替わります。


3種類のオプションがあるところから容易に察することができますが、表示列のカスタマイズや表示形式の追加が簡単に行えます。具体的にはshare-config-custom.xmlで設定することになります(デフォルト設定はshare-documentlibrary-config.xmlの<config evaluator="string-compare" condition="DocumentLibrary"><doclist><view-renderers>セクションで定義されています)。"table"というidのview-rendererがデフォルト表示に対応するようですので、これを参考にしてカスタムプロパティの表示を追加するなどすればよいと思います。

3. 表示形式の保存

これ地味に便利な機能なんですが、ユーザごと、フォルダごとに好きな表示形式を保存することができるようになりました。これまでは一度詳細表示に切り替えると全てのフォルダが詳細表示になってしまいましたが、画像フォルダはギャラリービューにしたいなど、特定のフォルダのみ特定の表示形式に固定することができます。「オプション」の「このフォルダのデフォルトとして○○を設定する」から表示形式を固定することができます。


マイファイルと共有ファイル


かっこよくなったシリーズはこれくらいにしておいて、便利になったシリーズに移ろうと思います。第1弾はマイファイルと共有ファイルです。それぞれShareのヘッダから直接アクセスすることができます。

Alfrescoには2つの使い方、サイトとリポジトリというものがあります(くわしくは「Alfresco 4.0の使い方 - 準備編(2) - リポジトリとサイトの準備をしよう」を参照) 。サイトを利用していると、チーム単位での情報共有はできるのですが、個人毎のチームに属さないコンテンツの管理、チームをまたいだ情報共有などを行うために一工夫必要でした。そのためにリポジトリを使うという手段もあるのですが、リポジトリのルートフォルダには各種システムフォルダが見えてしまうため(もちろん一般ユーザはリードオンリーですが)、実運用的にはイマイチ、という状況でした。

マイファイルは、自分だけが参照・管理できるコンテンツを格納することができます。この実体は何かというと、既存のAlfrescoにも存在するユーザホームフォルダになります。これまではリポジトリ経由でないとアクセスできませんでしたが、そのフォルダにShareヘッダから直接アクセスできるようになりました。これでリポジトリを一般ユーザに晒さなくてもユーザホームフォルダを活用できるようになります(ユーザホームフォルダの実体はCompany Home/User Homes/以下に生成されるユーザID名のフォルダ)。

共有ファイルは、全員がアクセスできる全ユーザ共有のフォルダスペースになります。このフォルダを使うことでサイトに囚われないコンテンツ共有を実現することができます。ただ、デフォルトでは全ユーザ書込み可能なので、管理者がフォルダを作成して各フォルダに権限設定するなどして、通常のファイルサーバと同様のアクセス権管理を行う必要があります。この機能も、リポジトリを一般ユーザに晒さずに実施することができます(共有ファイルの実体はCompany Home/Sharedフォルダ)。

ちなみに、Shareヘッダの「リポジトリ」リンクは、share-config-custom.xmlに以下の内容を追記すると隠ぺいすることができます(管理者は設定に関わらず表示されます)。
<config evaluator="string-compare" condition="RepositoryLibrary">
   <visible>false</visible>
</config>



ユーザ毎のごみ箱機能


地味に便利になったシリーズ第2弾はごみ箱機能です。これまでは管理者権限を持つユーザだけが、ファイルを1つずつ復旧もしくは削除するだけの簡易的なごみ箱機能しか提供されていませんでしたが、当バージョンからはユーザ毎のごみ箱機能が追加されました。しかも複数ファイル選択してまとめて復旧/削除したりできます!画面右上のユーザ名のプルダウンから「マイプロファイル」をクリックし、「ごみ箱」タブをクリックしてください。




さいごに


上記以外にも設定ファイルでカスタマイズできる項目が増えていたり、便利なREST APIが追加されていたり、細かいところでパフォーマンス改善がはかられていたりと、様々なエンハンスメントが行われているようです。あとは、エントリ「Alfresco 4.2.dから追加されたCSRF Policyをひとまず無効にする 」にあるようなセキュリティ対策も4.2.dで新規実装されています(記事では盛大に無効っちゃってますが…)。これを機会に是非皆様もAlfresco Community 4.2.dを試してみてはいかがでしょうか。

Wednesday, October 2, 2013

Alfresco勉強会#18 振り返り

こんにちは。自動車保険の更新時期が近づいてきて不眠気味の大谷です。

生命保険とか医療保険みたいに乗り換えるとペナルティがある(契約時期が若いほど安い)ものだと基本継続で良いのですが、自動車保険は見直すたびに他社が安いので毎回それなりの労力をかけて5社~10社程度オンライン見積もりで比較して最安値のところを見つけています。これまで一度も継続したことないんですが、自動車保険って乗り換えのお客さんに裏で値引きした金額を提示してたりするんでしょうか?自動車保険に安寧の地はあるのだろうか…

さて、少し遅くなってしまいましたが、さる9/25(水)に第18回Alfresco勉強会が開催されました。今回は2つの発表がありましたので、それぞれ簡単に紹介したいと思います。


1. Alfrescoのバックアップとリストア

資料はこちらです。

はい、自分の発表です。Alfresco4でのバックアップとリストアの方法について簡単に(というかエッセンシャルな部分を)紹介しました。

バックアップの対象となるデータがDBとファイルシステム(コンテンツのファイル実体)、全文検索インデックスの3つで、コールドバックアップとホットバックアップでそれぞれどのようにバックアップ/リストアを行うのかという内容です。ホットバックアップ時の3データのバックアップ順序がとても重要です。


2. パフォーマンスチューニングのさわり

資料はこちらです。

続いて弊社戸谷からの発表で、Alfrescoについての(一部はもっと一般的なJavaアプリケーションにも共通する)パフォーマンスチューニングの概論が紹介されました。

この手の話はなかなかまとまった情報として存在しないので、とても重宝する内容じゃないかと思います。パフォーマンスに影響を及ぼす要素とAlfresco上での具体的なイベント、それらへの対処方法が説明され、一部はAlfrescoでの実際の設定項目が紹介されました。話の中で一番意外だったのは、搭載メモリを出来るだけたくさんJVMのヒープ領域に充てるのではなく、必要量を実践的に決定し、残りをディスクキャッシュとして有効活用できるようにする、という点でした。


次回、第19回Alfresco勉強会は11/27(水)19時を予定しています。Alfrescoについて発表をしたいよ、という方を含め、たくさんのご参加をお待ちしております。