Wednesday, August 3, 2016

Alfresco勉強会#34 Alfrescoをカスタマイズする時に知っておくと便利なこと

こんにちは。てらしたです。黄色チームでまったりやってます。課金はまだしてません。

さて、1週間も経ってしまいましたが先週7/27(水)に第34回Alfresco勉強会が開催されました。

今回はAlfrescoを初めてカスタマイズする人にとって取っ掛かりになればいいなと思い、Alfrescoをカスタマイズする時に知っておくと便利なこと、というタイトルで発表しました。詳しい内容は以下の資料を見ていただればと思いますが、Alfrescoの大まかな構成と個人的にオススメしたいソースコードの確認方法についてご紹介しました。


Eclipseを使いこなせればもっと簡単にできること(特にgrepかける方法のあたり)がありそうな気がしているので、こういう方法もあると知っている方がいればぜひ勉強会で教えていただけるとうれしいです。

次回のAlfresco勉強会は9月28日(水)です。たくさんの方のご参加お待ちしております。参加登録は以下のリンクからお願いします。

第35回 Alfresco勉強会

もちろん発表も大歓迎です。発表はできないけどこういう内容が知りたい、こんなところで困っているから教えてほしい、といった要望があればconnpassのフィードに投稿していただければと思います。

Monday, August 1, 2016

Alfresco勉強会#34でAlfresco5のプレビュー機能とコンテンツ変換機能について発表しました

こんにちは。おおたにです。

 先日Alfresco勉強会でAlfresco5のファイルプレビュー機能とその裏で使われるコンテンツ変換機能について発表しました。



プレビュー機能は便利だけどプレビューがうまく働かない場合がそれなりにあり、その場合はバックエンドで動いているコンテンツ変換の設定を見直すことでプレビューできるようになりますよ、というような話の流れでした。主な発表内容は以下のとおりです。
  • ファイルプレビュー機能の概要とデモ
  • うまくプレビューできない例
  • コンテンツ変換機能の概要
  • 利用可能なコンテンツ変換の確認方法
  • コンテンツ変換の設定の在り処と設定変更方法
  • コンテンツ変換の設定変更によるプレビュー機能の改善

また、発表後の質問では、プレビューのためのコンテンツ変換(最終的にPDFに変換します)が重なるとサーバの負荷が高まることや、別途PDFが生成されることによるストレージ容量への影響などの話が出ました。
なお、資料の最後の方のCSV=>PDFへのコンテンツ変換を設定変更してCSVのプレビュー文字化けを回避する方法については、5.1.gではうまく動作しませんでした(5.0.xではうまくいってたのですが…)。特定のテキストファイルをPDFに変換する際にエラーを吐いてしまうようです。

最後に次回Alfresco勉強会のお知らせですが、次回は2016年9月28日(水)に開催される予定です。興味のある方は第35回Alfresco勉強会のページから参加申し込みをお願いします。

Thursday, July 21, 2016

NemakiWareでEFKスタックを立てました

こんにちは。linzhixingです。

文書管理製品NemakiWareも、開発だけでなく保守運用フェーズが増えてきたため、ログの収集・分析にEFKスタック(今更感)を立ててみました。とくにクラウドサービスとしてNemakiWareを提供する場合、CMIS規格に沿ってマルチリポジトリ=マルチテナントのように扱うケースがあるので、ログをリポジトリごと(顧客ごと)に分けて即時に分析したいというニーズがあります。

EFKスタック(ElasticSearch, fluentd, Kibana)の組み合わせで、
- fluentd によりNemakiWareからログをリアルタイムでElasticSearchに送信
- ElasticSearchに登録されたログをKibanaにより様々な切り口でビジュアライズ
します。

@Ubuntu14.04
NemakiWare 2.4(?), td-agent 0.12.20,

@ログ取得用の環境
ElasticSearch 2.3.4, Kibana 4.5.2
を使用します。

(NemakiWareの現在のバージョンは2.3.15で、ここではログ出力内容をエンハンスしたバージョンを使用していますが、この記事の内容には影響ありません。エンハンスは次期リリースに含められる予定です)

細かい設定はいくらでもできますが、世の中に解説記事は溢れているので、
ここではひとまず最短でハマらずにログ収集・分析ができること、を目指します。

NemakiWare 

NemakiWareをUbuntuにインストールします。
https://github.com/aegif/NemakiWare/releases

こんな感じのログが出るようになる予定です。
{"@timestamp":"2016-07-15T08:49:58.414+09:00","@version":1,"thread_name":"http-nio-8080-exec-12","level":"INFO","message":{"uuid":"56e06eea-e70c-4d4f-bb3e-ad60f955cbcc","repo":"bedroom","user":"admin","when":"completed","time":12519,"method":"getChildren","input":{"folderId":"c0a29c9e5a4f28f3117cc6edada56c39"},"output":{"num":100,"hasMoreItems":false,"totalNum":100}}}

リポジトリやユーザだけでなく、処理にかかった時間やメソッドの入出力値も取ることができます。

fluentd

fluentd自体はRubyのgemとして提供されていますが、特にこだわりがなければRubyインタプリタ等も同梱されていてapt-getやyumでインストールできるtd-agentを使います。

# td-agentのインストール
http://docs.fluentd.org/articles/install-by-deb
curl -L https://td-toolbelt.herokuapp.com/sh/install-ubuntu-trusty-td-agent2.sh | sh

# fluent-plugin-elasticsearchのインストール
(fluentdにはfluent-gemでインストールできるたくさんのプラグインがあります)
sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-elasticsearch

# NemakiWareからElasticSearchへの転送設定
/etc/td-agent/td-agent.confを編集します。
詳しくは説明しませんが、
- <source>でNemakiWareのログをtailで監視し、tagを付けて<match>に渡す
  type jsonにより、ログの持つタイムスタンプやログレベルといった情報がjson形式で解釈されます 。
  ログメッセージ自体もNemakiWareによりjson形式で出力されている部分も含めて、全体がjsonになります。
  その結果、ElasticSearchやKibanaで、jsonのフィールド(message.input.folderId 等)構造にそって、そのまま検索することができます。
- tagが一致する<match>が実行される
  さきほどインストールしたfluent-plugin-elasticsearchプラグインが利用されています。
  Kibanaともともと相性がよいLogstash形式を指定しておきます。

<source>
  type tail
  path /opt/NemakiWare/apache-tomcat-8.0.28/logs/nemakicore.log
  pos_file /tmp/fluentd_nemaki_core_pos
  format json
  tag nemaki.core
</source>

<match nemaki.core>
  type elasticsearch
  logstash_format true
  logstash_prefix logstash
  # ElasticSearchのホストに書き換えてください
  host xxx.xxx.xxx.xxx
  port 9200
  type_name nemaki-core-log
</match>

#td-agentを再起動して設定を反映
sudo service td-agent restart

ElasticSearch

ElasticSearchとKibanaは、ログの収集・分析用ですので、NemakiWare + td-agentとは別インスタンスに立てます。
 
適当にインストールしてください。(適当)
https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-repositories.html 
http://qiita.com/hana_moto/items/762aae6b8f2a93d176d2
http://qiita.com/inouet/items/6276c5a08c4fe5eecdb5

localhost:9200にアクセスして、jsonのメッセージが返ってくれば正常に起動しています。

UIとしてHEADをインストールしてもよいかもしれません。
sudo /usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head

# 設定
- 外部への公開
デフォルトではElasticSearchのホストはlocalhostにバインドされており、そのままでは外部から接続できません。
/etc/elasticsearch/elasticsearch.ymlの"network.host"で、IPアドレス外部への公開先を指定できます。
同じインスタンス上にあるKibanaだけを外部公開する場合はlocalhostのみで構いませんが、ElasticSearchもUIで見たいとか、Kibanaが更に別インスタンスである場合には、外部に公開するよう設定します。
ここではElasticSearchの中身を外から覗きたかったため、簡単のため0.0.0.0としています。

-マッピング
ログの項目(タイムスタンプなど)のインデクスへのマッピングとして、項目の値型やアナライズをするかどうか等は、事前に決めておくこともできますし、マッピングを変更するにはインデクスの作り直しが必要になるのでそのほうが望ましい場合もありますが、ここでは何もマッピング情報を定義せず、ElasticSearchに最初に送られたログデータにより自動的にマッピング情報を認識してもらいます。

幸い、Logstash形式を指定しているので、ログのインデクスはデフォルトでは日次で新しく立てられています。ログの内容が変わったりマッピングを変更したい場合は、次の日のインデクスから変更を適用することができます。

新しいマッピングフィールドが追加される分にはインデクスの再作成は必要ありません。
NemakiWareが出力するjson形式のログは、メソッドの入出力内容を細かく制御できるので、今までログに出していなかった引数をあらたに出すようにした場合、とくに何もしなくても、ElasticSearchやKibanaでそのフィールドにより検索することができます。

Kibana

適当にインストールしてください。(適当)
公式 https://www.elastic.co/jp/downloads/kibana からwgetして展開するか、
リポジトリを登録してパッケージからインストールすることができます。
http://qiita.com/windows222/items/57423a420d57399cbc3e#kibana

/opt/kibana/config/kibana.ymlのelasticsearch.urlに、ElasticSearchのURLを指定します。ここでは同一インスタンスになります。

sh ./opt/kibana/bin/kibana もしくは自動起動の設定をして、Kibanaを起動します。
http://localhost:5601にアクセスしてKibanaのぺージが表示されれば、正常起動しています。
 
# Out of Memory対策
Kibanaを素のままで動かしていると、そのうちOut of Memoryエラーで、そのインスタンス全体がにっちもさっちも動かなくなります。(メモリが潤沢にある場合は大丈夫なのかもしれませんが、2GB程度だと死にます)
原因は
http://mnatsu31.hatenablog.com/entry/2015/12/14/154427

Node.jsのv8エンジンがメモリを無制限に消費するためだそうです。
起動スクリプト本体である/opt/kibana/bin/kibanaファイルを編集して、Node.jsに対してオプションを外から渡せるようにしてあげましょう。

/opt/kibana/bin/kibanaファイル
-exec "${NODE}" "${DIR}/src/cli" ${@}
+exec "${NODE}" $NODE_OPTIONS "${DIR}/src/cli" ${@}
 
と編集した上で、
 
NODE_OPTIONS="--max-old-space-size=250" /opt/kibana/bin/kibana
により起動します。
 
# ElasticSearchからデータを取得していることの確認
画面上部ナビゲーションバーのDiscoverで、タイムスタンプごとの単純なCount数ヒストグラムと、そのソースになっているjsonログデータが確認できます。
画面左カラムからもわかるように、NemakiWare固有のログのjsonフィールドも認識されています。


 
 # Kibanaで表示するグラフの設定
Kibanaには、ElasticSearchに保存されたログデータを検索して、グラフとして表示する機能が充実しています。
画面上部ナビゲーションバーのVisualizeから、作成するグラフの種類を選びます。

特にsaved searchを作成していないので、From a new searchを選択します。










左カラムで、X軸(値を集計するための切り口=バケット)とY軸(集計された値=メトリクス。CountやAverage等)を指定します。


ここでは単純に、Y軸にはログの件数(Count)を指定しつつ、X軸にはタイムスタンプに加えて各リポジトリごとにY軸の値を分解するようSplit Linesをサブバケットとして追加してあります。
グラフ右側に、アクセスのあったリポジトリが数種類表示されており、折れ線グラフもリポジトリごとに色分けされています。

X軸を工夫してCMISメソッドごとの切り口を追加し、Y軸を工夫してログ件数のかわりに平均処理時間をグラフにする、ということもできるようになります。


今回はここまでです。
主にKibanaによる可視化をゴールとして最短で進みましたが、せっかくfluentdを使っているので、保守運用のうえで必要になる各種ミドルウェアからのログも集約し、アプリ側のログとKibana上で突き合わせられるようにしたいところです。
機会があれば、また。

まとめ

- EFKスタックをインストールした。
- 次期NemakiWareの新しいjson形式ログにより、リアルタイムで様々な切り口によるログ分析が可能になった。ノーモア目検。

Friday, May 27, 2016

Alfresco勉強会#33でファイルの自動削除機能を実装する話をしました

こんにちは。おおたにです。

先日第33回Alfresco勉強会が開催され、そこでファイル自動削除機能の実装について発表させていただきました。

out-of-the-boxのAlfrescoでは、ファイルの有効期限を管理するための属性を付与することはできるのですが、 その有効期限に応じた何らかのアクション(削除とかアーカイブとか)を実行するための機能は提供されていません。そこで、今回の発表では、有効期限を過ぎたコンテンツを自動削除するようなスケジュールジョブの実装方法を紹介しました。なお、ジョブの実装を変えることで、コンテンツのアーカイブを実現することも可能です。



カスタマイズにはAlfresco SDKを使ったのですが、Alfresco SDK + Eclipseの開発の進め方については以前の勉強会で発表された「Alfresco SDK+Eclipseで開発してみよう」Alfresco公式のドキュメントがとても役に立つので是非チェックしてみてください。


なお、次回の第34回Alfresco勉強会は2016年7月27日(水)ですので、興味がある方はAlfresco勉強会ページから参加登録してみてください。

Thursday, May 26, 2016

Alfresco勉強会#33 Alfresco Solr Admin UI

こんにちは。てらしたです。昨日5/25に第33回Alfresco勉強会が開催されました。

参加していただいた方の中で、Alfresco興味あるけどまだあまり触ってないしどんな機能があるのかもよく知らないんだよね、といった方が多い場合は(もちろんそのような方も大歓迎なので)あらかじめ用意していた発表の前にAlfrescoの概要についてご紹介するようにしているのですが、今回もその流れで進めました。以下の記事にある過去の勉強会の資料を使用してご説明したので、興味がある方はご覧ください。

Alfresco勉強会#27で Alfrescoの主要機能についての紹介発表をしました
Alfresco勉強会#32 Alfresco Community 5.1.eの機能紹介

上記のAlfrescoの概要の後に、今回用意していた内容であるSolr Admin UIの開き方についてご紹介しました。また、AlfrescoではなくSolrの機能なんですが、シノニム(類義語)検索についても簡単にご紹介しました。


ここからさらに進んでSolr Admin UIの具体的な使い方や望みの検索結果を得るための設定方法を知りたい場合はSolrに関する書籍やWebサイトで調べていただくのが近道だと思います。

最後に、発表資料の中でもご紹介していますが、Alfresco 5.1のSolrに関して非常に詳しく解説されているページをご紹介しておきたいと思います。今回の発表内容はこのページのほんの一部を抜き出したものです。AlfrescoのSolrに関して大体のことは書いてあるんじゃないかと思うほど詳しく書かれているので、何か調べたい時は役に立つと思います。

Searching with Alfresco 5.1 Community

さて、次回のAlfresco勉強会は7月27日(水)です。たくさんの方のご参加お待ちしております。参加登録は以下のリンクからお願いします。

第34回 Alfresco勉強会

もちろん発表も大歓迎です。発表はできないけどこういう内容が知りたい、こんなところで困っているから教えてほしい、といった要望があればconnpassのフィードに投稿していただければと思います。

Monday, May 23, 2016

Alfresco SDK 2.2でJARパッケージの拡張モジュールを作る

こんにちは。おおたにです。

今回はAlfresco SDKを使ってAlfresco Community Edition 5.1系向けの開発を行うためのtipsを紹介したいと思います。なお、Alfresco SDKの詳細やEclipse+Alfresco SDKでの開発方法については本ブログの記事「Alfresco勉強会#26でAlfresco SDK + Eclipseによる開発方法について発表しました」を参照すると実践的な情報が得られると思います。

記事執筆時点でのAlfresco Community Editionの最新版は5.1.fです。5.1系に対応したAlfresco SDKは2.2.xで、現時点での最新版は2.2.0です。以下ではこれらの最新版を用いて、JARパッケージングされた拡張モジュールを作りたいと思います(拡張モジュールのJARパッケージングは5.1で初めてサポートされました)。

なお、事前準備としてこちらのドキュメントの内容をひととおり設定しておく必要があります。

Alfresco SDKで拡張モジュールを作ってみる(Alfresco Repository編)


では早速拡張モジュールを作っていきます。JARパッケージングの場合はGitHubで公開されているAlfresco SDK Examplesを使うのが手っ取り早いです。Download ZIP等でコード一式をダウンロードして展開しておきます。手順は以下のとおりです。

1. ./samples/alfresco-simple-module/repo/pom.xml を以下のように編集する。
  • alfresco-sdk-parent のバージョンを2.1.0から2.2.0に変更する
  • alfresco-rad のバージョンを2.1.0から2.2.0に変更する
  • <alfresco.version>5.0.d</alfresco.version> をコメントの外に出し、<alfresco.version>5.1.f</alfresco.version> に変更する
  •  tomcat7-maven-plugin の <dependencies> 内に以下の2つのdependencyを追加する(これ重要)
<dependency>
    <groupId>org.alfresco</groupId>
    <artifactId>alfresco-repository</artifactId>
    <version>${alfresco.version}</version>
    <classifier>h2scripts</classifier>
    <exclusions>
        <exclusion>
            <groupId>*</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.codehaus.plexus</groupId>
    <artifactId>plexus-archiver</artifactId>
    <version>2.3</version>
</dependency>

2. 以下のコマンドを実行してテスト用サーバを起動する。
> cd ./samples/alfresco-simple-module/repo
> mvn integration-test -Prun

Mavenの諸々の処理の後にTomcatが起動し、ログにエラー無く Starting ProtocolHandler ["http-bio-8080"] と出力されればOKです。以下のようなエラーが出ている場合はpom.xmlの記述が足りないor間違っている可能性があります。

 org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Failed to get resource: alfresco/ibatis/#resource.dialect#/activities-insert-SqlMap.xml

このサンプルには以下のカスタム実装が同梱されていますので動作を確認してみてください。
  •  Alfresco Repository起動時に標準出力に"SDK Sample Repo JAR class has been loaded"と出力するカスタムクラス
  •  拡張モジュール読み込み時にログに"Test debug logging. Congratulations your JAR is working"と出力するカスタムクラスとログレベル変更ファイル
  • 静的/動的コンテンツ http://localhost:8080/alfresco/alfresco-simple-repo-module/index.html
  • テスト用サーブレットとサーブレットマッピング(test-servlet)
  • 簡単なテキストを返すJava-backed WebScript(/sample/helloworld)
  • ワークフローのプロセス定義my-process
  • モデル定義のコンテンツタイプmyc:dox
もちろん、個別にインストールしたAlfrescoのクラスパスに生成されたJARファイルをコピーすることで拡張モジュールを適用することができます。

Alfresco SDKで拡張モジュールを作ってみる(Alfresco Share編)


続いて、Alfresco Share向けの拡張モジュールを作ります。引き続きAlfresco SDK Examplesを使います。手順は以下のとおりです。

1. ./samples/alfresco-simple-module/share/pom.xml を以下のように編集する。
  • alfresco-sdk-parent のバージョンを2.1.0から2.2.0に変更する
  • <alfresco.version>5.0.d</alfresco.version> を <alfresco.version>5.1.f</alfresco.version> に変更する
  • <dependencies> 内の spring-surf-api dependency を以下の内容に置き換える(このissueへの対応策です)
<dependency>
    <groupId>org.alfresco.surf</groupId>
    <artifactId>spring-surf-api</artifactId>
    <version>${dependency.surf.version}</version>
    <scope>provided</scope>
</dependency>

2. 以下のコマンドを実行してテスト用サーバを起動する。
> cd ./samples/alfresco-simple-module/share
> mvn integration-test -Prun -Ddependency.surf.version=6.3

Mavenの諸々の処理の後にTomcatが起動し、ログにエラー無く Starting ProtocolHandler ["http-8081"] と表示されればOKです。以下のようなエラーが出ている場合はpom.xmlの記述が足りないor間違っている可能性があります。

 [ERROR] 'dependencies.dependency.version' for org.springframework.extensions.surf:spring-surf-api:jar is missing.

http://localhost:8081/share にアクセスしてAlfrescoにログインできることを確認したら、サンプルに含まれる以下のカスタム実装の動作を確認してみてください。
  •  Alfresco Share起動時に標準出力に"SDK Sample Share JAR class has been loaded"と出力するカスタムクラス
  • 静的/動的コンテンツ http://localhost:8081/share/alfresco-simple-share-module/index.html
  • テスト用サーブレットとサーブレットマッピング(test-servlet)
  • Aikau Pageを生成するWebScript(/helloworld)
こちらも生成されたJARファイルをAlfresco Shareのクラスパスにコピーすることで拡張モジュールを適用することができます。


以上が、Alfresco SDK 2.2.0 + Alfresco Community Edition 5.1.fでJARパッケージの拡張モジュールを開発するための大まかな手順となります(それぞれ若干の追加ステップが必要となりますが、将来的にはAlfresco SDKが吸収してくれそうな気がします)。是非皆様も最新のAlfresco SDKを使ったAlfrescoカスタマイズを試してみてください。

Wednesday, April 20, 2016

Alfresco Community Edition 5.1の新機能を見てみよう

こんにちは。大谷です。

今回は、Alfresco Community Edition 5.1の新機能について紹介します。既にAlfresco勉強会の方で「Alfresco Community 5.1.e 機能紹介」という発表があって、GUI上でのモデル定義とスマートフォルダ機能については触れられていますが、ここではそれ以外の変更点についても紹介したいと思います。

なお、インストール方法については「Alfresco Community Edition 5.1をインストールしてみよう」という記事を見てみてください。


今回使っているバージョンは?


2016/02/17にリリースされたAlfresco Community Edition 5.1.eというバージョンです。Community 5.1.x系の最新版であり、かつ初のGA(Generally Available)版となります。

実は、5.1系からバージョンの呼称が変わっていて、201508_EA(Early Access)、201509_EA、201510_EA、201512_EA、201602_GAとバージョンを重ねてきました。そして、それぞれが内部的にはこれまでの命名規則と同じ5.1.a、5.1.b、5.1.c、5.1.d、5.1.eというバージョン番号が振られています。というわけで、5.1.e = 201602_GA版ということになります。


新機能の前に、出来なくなったこと


大きく2つの機能が落ちています。1つはNFS、もう1つはjBPMです。

ファイルサーバ機能としてNFSが利用できなくなった

AlfrescoはFTP、CIFS、WebDAV等のファイルシステムアクセス機能を持っていますが、これまで利用できたNFS機能が標準機能から外れました。ただ、ソースコードはGitHub上に公開されているので、それをビルド/パッケージングすることで引き続きNFS機能を利用することはできるようです(未検証ですすいません…)

ワークフローエンジンとしてjBPMを選択できなくなった

これまでもjBPMはオプション扱いで、alfresco-global.propertiesで設定変更することで利用できましたが、5.1からはalfresco-global.propertiesで設定することもできなくなりました。完全にActivitiに移行したということになります。しかし、Spring bean定義が生きていることや、jBPM関連のjarファイルが相変わらず同梱されているところを見ると、Spring beanの設定を変更することで相変わらずjBPMを利用できるかもしれません(こちらも未検証ですすいません…)


5.1で出来るようになったこと


次に、Alfresco Community Edition 5.1の新機能を挙げていきます。これまで幾度となく要望があがっていてやっと実現したもの、Alfresco Explorer(=過去の遺物)でしか操作できなかったものがやっとAlfresco Shareに実装されたものなど、大小様々なエンハンスメントがありましたが、ここでは主要なものをいくつか挙げたいと思います。


スマートフォルダ機能

まずは、スマートフォルダから紹介します。スマートフォルダとは、指定した切り口(条件)に合致したコンテンツを仮想的なフォルダに表示する機能です。よく仮想フォルダなどと呼ばれています。データベースでいうところのビューみたいなものかと思います。まず、この機能を使うためにはAlfrescoの設定を変更する必要があります。<tomcat_dir>/shared/classes/alfresco-global.propertiesで、以下のようにスマートフォルダの設定をtrueに変更します(デフォルトでfalseとなっています)。

smart.folders.enabled=true

Alfrescoを再起動したら、管理者でログインして「リポジトリ」から リポジトリ/データディクショナリ/スマートフォルダテンプレート フォルダに移動し、ここにjson形式で書かれたテンプレートファイルをアップロードします(今回はデフォルトで入っているsmartFoldersExample.jsonを利用します)。テンプレートファイルをアップロードしたらコンテンツ詳細画面の「タイプの変更」でコンテンツタイプを「スマートフォルダテンプレート」に変更してください。

以上でスマートフォルダのテンプレート登録が終わりました。続いて、テスト用にフォルダを作り、フォルダ詳細画面の「アスペクトの管理」から「システムスマートフォルダ」アスペクトを追加します。すると、フォルダのプロパティ編集画面にテンプレート設定欄が表示されるので、適用するテンプレートを選択して保存します。

では、スマートフォルダテンプレートを設定したフォルダを見てみてください。メガネアイコンの付いたフォルダが表示され、そのフォルダ内に指定の条件に合致するコンテンツが表示されているはずです。

この機能、従来はAlfresco Workdeskという製品で実現されていたのですが、Workdeskの開発が終わったためか、Alfrescoの標準機能として搭載されました。要望としてよく伺っていた機能なので(特に競合製品で出来て標準のAlfrescoではできていなかった)、Alfrescoの適用範囲というか利用シーンがググッと広がるんじゃないかなと思っています。


GUI上でのモデル定義機能

これも大きなエンハンスメントですが、Alfresco Shareの管理画面上からカスタムモデルを定義できるようになりました!これまでも、Data Dictionaryフォルダ以下にモデル定義のxmlファイルをアップロードして動的にモデル定義を読み込ませることはできましたが、
  • モデル定義をxmlで記述しなくてはならない
  • Alfresco Shareのフォーム定義(要Alfresco再起動)を別途行わないとAlfresco Share上でカスタムプロパティが表示されない
という状況でした。Alfresco 5.1からは、カスタムモデル定義が管理画面上の操作で完結するようになります。

以下、簡単にカスタムモデルの定義方法を見ていきます。まず、管理者でログインし、「管理ツール」→「モジュールマネージャ」に移動して「モデルの作成」をクリックします。ここで、カスタムモデルの情報を入力します。

次に、作成したカスタムモデルを開き、「カスタムタイプの作成」もしくは「アスペクトの作成」をクリックし、タイプもしくはアスペクトの情報を入力します。

続いて、作成したカスタムタイプもしくはアスペクトを開き、「プロパティの作成」をクリックし、プロパティを追加します。名前やラベル、データ型の他、必須か否か、複数値、デフォルト値、制約、インデックス種類を設定することができます。

必要なプロパティを追加し終わったら、アクションの「レイアウトデザイナー」をクリックします。

ここで、Share上での表示フォームを設定します。「デフォルトのレイアウトを適用」をクリックすると標準的な表示レイアウトを作ってくれるので、それをベースに調整するのもよいかもしれません。なお、このステップは必須で、レイアウトを保存しないとカスタムモデルが有効になりません。


必要なモデル定義が完了したら、カスタムモデルのアクションから「有効化」をクリックすることでモデルを有効にすることができます。エクスポートを実行すると、モジュールとしてパッケージングされたモデル定義/フォーム定義を取得することができます。GUIベースでモデル定義を進めて、エクスポートした定義ファイルで詳細を調整する、というようなモデル定義の進め方もできるうえ、モデル定義の可搬性も高くなって嬉しい事ずくめです。

以上でカスタムモデル定義が使えるようになります。適当なコンテンツの「タイプの変更」をクリックすると、先ほど追加したモデルが選択できるようになっているはずです。


ホームページ指定機能

ログイン後に○○のページに遷移してほしいという要望は結構あって、これまでは都度カスタマイズで対応していたのですが、この機能を使うとユーザ毎に自分の好きなページをホームページに指定して、ログイン直後に表示することができます。



「解凍先(Unzip to)」アクション

これも、Alfresco Explorerで出来ていた機能がAlfresco Shareで実現されたパターンになります。Alfresco上にアップロードされたZIPファイルもしくはACP(Alfresco Content Package)ファイルを、指定したフォルダに展開する機能です。ルールのアクションとしては既に実装されていたのですが、ZIPファイルもしくはACP ファイルのアクションから直接実行できるようになりました。




「所有者になる(Take Ownership)」アクション

これまでAlfresco Explorerで出来ていたコンテンツ所有権の取得をAlfresco Shareで実行できるようになりました。コンテンツ所有権は権限管理上地味に重要な概念で、コンテンツ所有者はそのコンテンツに対して特別な権限が与えられています。しかし、Alfresco 5.0からAlfresco Explorerが廃止となり、コンテンツ所有権をGUI上で操作できない状況になっていました。



Admin Consoleでのノードブラウズと管理

Alfresco Community Edition 5.0系の後半から、Enterprise Edition限定だったAdmin Consoleの一部がCommunity Editionにも開放されました。 http://localhost:8080/alfresco/s/admin/ にアクセスすると、Admin Consoleにログインすることができます。モデル/テナント/ワークフローの各コンソールが利用できる他、ノードブラウザを利用することができます。Alfresco Shareにもノードブラウザがあるのですが、Admin Consoleではノードに対して以下のような操作を行うことができるようになりました。
  • ノードの削除
  • ノードの強制削除(アーカイブせずに削除)
  • 所有権の獲得
  • 権限を元に戻す
  • ノードの復元(アーカイブされたもののみ)
  • ノードプロパティの削除


さいごに


以上が、Alfresco Community Edition 5.1の新機能になります。是非みなさんもAlfresco Community Edition 5.1をインストールして、これらの新機能を確認してみてください。