Wednesday, December 19, 2012

.NETからAlfresco API につなぐ(その1)

こんにちは、杉本です。

いつもはこっちで書いてますが、勉強会の報告なのでこちらで書かせてもらいます。こちらでははじめまして。

ぼくは普段 .NET さんとお仕事をしているので、最近 Alfresco をぜんぜん触っていないのですが、今回は Alfresco とちょっと連携するようなコードを書いてみることにしました。

Alfresco は文書管理を行うための巨大な仕組みで、内部には RDB をつかっているわけですが、 API を通すことで Alfresco そのものを文書データベース、として扱うのも良いよね、と思っています。「文書管理の仕組み」を導入するとなるとなんだか大袈裟な気がしますが、別システムでファイルを保存するストアを文書管理 DB にする、というような視点で別システムのサブシステムとして見ることもできるんじゃないでしょうか。

AlfrescoのAPIといえば、普通は WebScript API を使いますね。ところが今回はあえてのSOAPで繋いでみます。


ちなみに、 Alfresco の Wiki をみると、Web Services という項目のところには、

Please note that this API has been superceded by CMIS (specifically, the CMIS SOAP binding). It's use is no longer recommended.

とあって、Web Service はもう使われなくなっていくことが書かれています(そもそも SOAP が……)

ただ、今回はちょっと簡単に実験したかったので、すでに消滅しつつある SOAP でやってみることにしました。続編として他のアクセス方法でもやっていきたいと思います。

環境としては手もとにあるものをそのままつかったので、Visual Studio 2012 で、.NET Framework 4.5 の環境下でやっています。たいしたことはしてないので、おそらく2010、4.0 の組み合わせでもいけると思います。

.NET では通信フレームワークとして WCF というのがあります。今回SOAPでお気軽にやってしまったのにはこれがあって、Web Service だと WDSL が型情報を持っているので戻ってくるオブジェクトのクラスを自動生成してくれるんですよね。 JSON からクラスを推測してくれるライブラリもあるにはありますが、標準で出来る以上たいへんお手軽なので、今回はWeb Serviceをつかって実験したのでした。

さて、WDSLの場所はこれです。

http://<servername:PORT>/alfresco/api/<サービス名>Service?wsdl
サービス名には Repository とか Content とかが入ります。

まずおもむろに Visual Studio 2012 で新規ソリューションとプロジェクトを作成して、「サービス参照の追加」を行います。

サービス参照追加画面がでるので、 URL を指定して、「探索」するとサービスのところにサービス一覧が出るので、それを選択、 OK をおせば完了です。簡単だ!(名前空間は適当に)


つづいて、 WCF で通信する際の設定です。app.config右クリックから[WCF構成の編集]を選べば UI で設定できます(app.configを直接編集しても良いです)昔はこんなのなかったんじゃなかったかなあ。便利だなあ。

[エンドポイント]でサービスを選択、[全般]タブ、項目 Binding が basicHttpBinding (デフォルトのまま)であることを確認します。

[バインド]でサービスを選択[セキュリティ]タブ、[(全般)]の下の項目 mode を TransportWithMessageCredential にセットします。

[MessageSecurityプロパティ]の下の項目 MessageClientCredentialType を UserName にセットします。

AuthenticationService はセキュリティ設定不要、 HTTP で接続します。
それ以外はセキュリティ設定が必要、HTTPSで接続します。

app.configは

    
        
            
                
                
                  
                    
                  
                
              
                
                  
                
              
            
        
        
            
            
            
        
    

こんな感じになりました。

次にコードを書いていきますが、今回はローカルに立てたサーバに繋ぐので SSL とかの処理をバイパスすることにします。


        private bool OnRemoteCertificateValidationCallback(Object sender, X509Certificate certificate, X509Chain chain,  SslPolicyErrors sslPolicyErrors) {
            return true; 
        }

こんなコードを書き、
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(OnRemoteCertificateValidationCallback);
こんな風に呼べばOKです。

今回はリポジトリサービス、コンテンツサービスを使ってリポジトリやコンテンツにアクセスしてみました。コードを全部載せてしまいます。


using System;
using System;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Windows;
using AuthenticationService = WpfApplication1.Alfresco.AuthenticationService;
using ContentService = WpfApplication1.Alfresco.ContentService;
using RepositoryService = WpfApplication1.Alresco.RepositoryService;

namespace WpfApplication1 {
    public partial class App : Application {
        private void Application_Startup(object sender, StartupEventArgs e) {
            ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(OnRemoteCertificateValidationCallback);

            var authClient = new AuthenticationService.AuthenticationServiceSoapPortClient();
            var ticket = authClient.startSession("takuma.sugimoto", "takuma");


            var repoClient = new RepositoryService.RepositoryServiceSoapPortClient();
            repoClient.ClientCredentials.UserName.UserName = ticket.username;
            repoClient.ClientCredentials.UserName.Password = ticket.ticket;
            var store = repoClient.getStores().FirstOrDefault(p => p.address == "SpacesStore");
            var query = new RepositoryService.Query() {
                statement = "ID:\"workspace://SpacesStore/3763112e-e36f-44de-9992-ab122350bc21\"",
                language = "lucene",
            };
            var result = repoClient.query(new RepositoryService.QueryConfiguration(), store, query, true);
            var resultNode = result.resultSet.rows.FirstOrDefault();
            var path = resultNode.columns.FirstOrDefault(p => p.name == "{http://www.alfresco.org/model/content/1.0}path").value;
            var name = resultNode.columns.FirstOrDefault(p => p.name == "{http://www.alfresco.org/model/content/1.0}name").value;

            var contentClient = new ContentService.ContentServiceSoapPortClient();
            contentClient.ClientCredentials.UserName.UserName = ticket.username;
            contentClient.ClientCredentials.UserName.Password = ticket.ticket;
            var reference = new ContentService.Reference(){
                store =  new ContentService.Store(){scheme = "workspace",address ="SpacesStore"},
                uuid = resultNode.node.id,
            };
            var predicate = new ContentService.Predicate() {Items = new ContentService.Reference[] { reference }};
            var contents = contentClient.read(predicate, "{http://www.alfresco.org/model/content/1.0}content");
            
            var content = contents.FirstOrDefault();
            var url = content.url + "?ticket=" + ticket.ticket;
            
            var req = WebRequest.Create(url);
            using (var rsp = req.GetResponse()) {
                var stm = rsp.GetResponseStream();
                if (stm != null) {
                    using (stm)
                    using (var reader = new StreamReader(stm))
                    using (var writer = File.OpenWrite(@"D:\Users\takuma.sugimoto\Desktop\temp\" + name)) {
                        var count = 0;
                        var buffer = new byte[4096];
                        do {
                            count = stm.Read(buffer, 0, buffer.Length);
                            writer.Write(buffer, 0, count);
                        } while (count != 0);

                    }
                }

            }
        }

        private bool OnRemoteCertificateValidationCallback(Object sender, X509Certificate certificate, X509Chain chain,  SslPolicyErrors sslPolicyErrors) {
            return true; 
        }
    }
}

ID を直接していしてダウンロードしているというサンプルのためのサンプルコードと言った内容ですが、ご容赦ください。ここにポイントがいくつかあります。

  • WCF で自動生成した場合、サービスごとに型が出来てしまうので、おなじリポジトリを指すクラスが別のものになってしまう。
  • ファイル実体のダウンロード用 Web Service はないので、認証済みのトークンをダウンロード URL につけたURLを直にたたいてダウンロードしてくる

こんなところです。最初の問題は自分で型を作ることも出来るのでそれで解決しますが、それをやるのであれば Web Service でやりはじめた意味があまりないので、自分で型クラスを作るのは次回以降、Web Scriptの API と連携するところで試すことにしましょう。

後者も WebScript であれば専用の API があるようです。ただ、このダウンロード URL を直に叩くというやり方も簡単ではあるので、やりかたとして頭に入れておくと良さそうです。

ハイ、そんなわけで、わざわざフェードアウトしつつある技術を使って Alfresco にアクセスしてみました。技術自体は古くてもかなり簡単にアクセスできるように作られていることが分かってもらえたかと思います。今回はここまで。(いつになるかわかりませんが)次回は Web Script の API と CMIS の API で接続することを試してみたいと思います。


Thursday, November 22, 2012

Employees use Dropbox? They will love CmisSync, and IT will benefit

How do you access your company's shared documents?
If your company has an ECM server, chances are you access documents either:
1) Via a web interface
2) As a shared drive

Now there is a third approach: CmisSync synchronizes your company's documents to your personal computer.

Advantage over a web interface:
- They are just normal files on your hard drive. No need to open a browser and download a copy.
- Documents downloaded from a Web interface quickly become outdated. With CmisSync, the files on your hard drive are always up-to-date.

Advantage over a shared drive:
- Slow network does not slow you down.
- Continue using your files even when out of the office, or even in the plane or subway.

The user interface of CmisSync will feel very familiar to Dropbox users.
But instead of having a Dropbox Inc.'s servers stores the files of each user, all of your content is securely stored on your company's ECM server.

(Liferay users can also use Liferay Sync)

Thursday, November 8, 2012

Alfresco勉強会#11 振り返り

こんにちは。てらしたです。

昨日行われた第11回Alfresco勉強会についてのエントリです。
今回も、aegifの二人が資料を元に発表を行いました。

1つ目は吉岡さん(@mryoshio)の「AlfrescoとSolr(中編)」でした。
Alfresco Solr PluginやAlfresco側に用意されているSolr連携用のクラス等について、実際にソースコードを見ながら解説してくれました。ちょっとSolrを使ってみようかなと思っている人はソースコードを確認しながら資料を見ると非常に参考になると思います。タイトルに(中編)とあるとおり、続きがあるということなので興味のある方は次回以降の勉強会に参加していただければと思います。やっぱり後で資料だけ見るより直接説明聞いた方がわかりやすいですしね。気になっていることは質問もできますし。

2つ目は私が「Alfresco 4.2の新機能」について説明しました。
先日、Alfresco Community 4.2bがリリースされたので、4.2で新しくなった機能や特徴について主なものをデモを用いながら紹介しました。ざっと紹介すると、

  • 追加/改良されたダッシュレット
    • 検索用のダッシュレットや画像プレビュー、Site Notice等。
  • Gallery View
    • ドキュメントライブラリの新しい表示形式。
  • Quick Share
    • コンテンツを簡単に公開するための新機能(SNS連携とは別)。
  • ワークフローのUI改善
    • 完了済みタスクや完了済みワークフローを表示できるようになった。

といった内容です。実際にCommunity版を落として試していただければと思います。

次回は12/12(水)を予定しています。12回目が2012年12月12日と12尽くしの回になります。今回の参加者の方から指摘していただいて初めて気付いたんですが。。。
お申込みはこちらからできます。
ご興味ある方はぜひご参加ください。発表者も大歓迎です。

Wednesday, October 31, 2012

AlfrescoとSolr

こんにちは。

今更ながらSolr関連の記事を書きます。
Alfresco 4.0からSolrに対応されました。

本稿では、概要やインストール等の基本事項について書きます。


概要

[Alfresco]
本ブログの読者なら当然ご存じの通り、Alfresco社が開発しているECMソフトウェアです。サブスクリプションを購入するEnterprise版と無償のCommunity版があります。RedHatとFedoraの関係を考えてもらえば分かりやすいかと思います。

Explorer(旧称DM)とShareの2つのUIがあり、現在はShare UIをメインとして開発が進められています。ShareはSpring SurfとYUIを使った今風のインターフェースになっています。

[Solr]
全文検索エンジンのLuceneを検索エンジンとして使う検索プラットフォームです。詳細はこちらをご覧ください。


AlfrescoでSolrを使うメリット・デメリット

[メリット]

  • Alfrescoのクラスタリングを行う場合、検索インデクスのレプリケーションが不要になる。
  • Alfrescoから見て外にあるSolrへHTTPベースの問い合わせを行うだけで検索が済むため、検索部分の冗長化が楽(HTTPサーバの冗長化と同じノリでできそう)


[デメリット]

  • AVMを使用するWCMでは使えない
  • RMモジュールを使えない
  • マルチテナントを使えない
  • トランザクション内でのインデクシング非対応なので、一貫性を重視する場面では使えない (e.g. WebScript内でコンテンツをアップロード後、同一WebScript内で検索を行う場合)


Solrの利用パターン

SolrとAlfrescoをどのように配置するかを考えてみます。

[パターン1: 同居]
AlfrescoとSolrが同じTomcatインスタンス上のWebアプリケーションとして存在するパターンです。Tomcatの起動・停止時に予期せぬエラーが発生したりしそうなのでできるだけやりたくないなというのが個人的な意見です。Alfresco Solr PluginはAlfrescoへ変更情報等を問い合せて定期的に検索インデクスを更新します。

[パターン2: 別居]
AlfrescoとSolrが異なるTomcatインスタンス上に存在するパターンです。こちらも当然Alfresco Solr Pluginが定期的にインデクスの更新作業を行います。

とりあえず別居推奨です。


インストール・設定

少々手抜きですが、過去のものをご覧ください...

[Alfrescoのインストール]
弊社が過去に実施した勉強会資料をご覧ください。

[SolrおよびAlfresco Solr Pluginのインストール]
Alfrescoと同様、過去の勉強会資料をご覧ください。


動作確認

Alfrescoが載っているTomcatのlog4j.propertiesへ次のものを追記します。

log4j.logger.org.alfresco.repo.search.impl.solr.SolrQueryHTTPClient=debug

その後、Alfrescoを起動します。すると次の様なエラーが発生すると思います。

2012-10-24 15:39:48,522  ERROR [ui.common.Utils] [http-8080-4] システムエラーが発生したため、検索できませんでした: 09240004  org.alfresco.repo.search.impl.lucene.LuceneQueryParserException: 09240004 at org.alfresco.repo.search.impl.solr.SolrQueryHTTPClient.executeQuery(SolrQueryHTTPClient.java:364)at org.alfresco.repo.search.impl.solr.SolrQueryLanguage.executeQuery(SolrQueryLanguage.java:49)at org.alfresco.repo.search.impl.solr.SolrSearchService.query(SolrSearchService.java:348)at org.alfresco.repo.search.SearcherComponent.query(SearcherComponent.java:78)(中略)at java.lang.Thread.run(Thread.java:680)Caused by: java.net.ConnectException: Connection refusedat java.net.PlainSocketImpl.socketConnect(Native Method)at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)(後略)

エラーが出れば、AlfrescoがSolrへ接続しようとしていることでOKです。


次にSolrを起動します。その後Alfrescoを再起動し、ログイン後に検索を実行します。
すると次の様なログが出力されます。


2012-10-24 15:45:54,157  DEBUG [impl.solr.SolrQueryHTTPClient] [http-8080-3] Sent :/solr/alfresco/alfresco?q=%28%28+TYPE%3A%22%7Bhttp%3A%2F%2Fwww.alfresco.org%2Fmodel%2Fcontent%2F1.0%7Dcontent%22++AND+%28%40%5C%7Bhttp%5C%3A%2F%2Fwww.alfresco.org%2Fmodel%2Fcontent%2F1.0%5C%7Dname%3A%22simple%22++TEXT%3A%22simple%22%29%29+%28+TYPE%3A%22%7Bhttp%3A%2F%2Fwww.alfresco.org%2Fmodel%2Fcontent%2F1.0%7Dfolder%22++AND+%28%40%5C%7Bhttp%5C%3A%2F%2Fwww.alfresco.org%2Fmodel%2Fcontent%2F1.0%5C%7Dname%3A%22simple%22+%29%29%29+AND+NOT+ASPECT%3A%22sys%3Ahidden%22+&wt=json&fl=*%2Cscore&rows=500&df=TEXT&start=0&locale=ja_JP&fq=%7B%21afts%7DAUTHORITY_FILTER_FROM_JSON&fq=%7B%21afts%7DTENANT_FILTER_FROM_JSON 2012-10-24 15:45:54,157  DEBUG [impl.solr.SolrQueryHTTPClient] [http-8080-3]    with: {"textAttributes":[],"allAttributes":[],"templates":[],"authorities":["GROUP_ALFRESCO_ADMINISTRATORS","GROUP_EMAIL_CONTRIBUTORS","GROUP_EVERYONE","GROUP_site_admins","GROUP_site_admins_SiteManager","GROUP_site_swsdp","GROUP_site_swsdp_SiteManager","ROLE_ADMINISTRATOR","ROLE_AUTHENTICATED","admin"],"tenants":[""],"query":"(( TYPE:\"{http://www.alfresco.org/model/content/1.0}content\"  AND (@\\{http\\://www.alfresco.org/model/content/1.0\\}name:\"simple\"  TEXT:\"simple\")) ( TYPE:\"{http://www.alfresco.org/model/content/1.0}folder\"  AND (@\\{http\\://www.alfresco.org/model/content/1.0\\}name:\"simple\" ))) AND NOT ASPECT:\"sys:hidden\" ","locales":["ja_JP"],"defaultNamespace":"http://www.alfresco.org/model/content/1.0","defaultFTSFieldOperator":"OR","defaultFTSOperator":"OR"} 2012-10-24 15:45:54,157  DEBUG [impl.solr.SolrQueryHTTPClient] [http-8080-3] Got: 6 in 904 ms

おめでとうございます。AlfrescoからSolrへ問い合わせがされたことを確認できました。


今回はここまでになります。この続きは、次回Alfresco勉強会でお話したいと思います。お楽しみに。

@mryoshio

Wednesday, October 24, 2012

Alfrescoのファイルサーバ機能TIPS(CIFSとかFTPとか) その2

こんにちは!大谷です。

今回は、以前の記事「Alfrescoのファイルサーバ機能TIPS(CIFSとかFTPとか) その1」に続き、CIFSやFTP等のファイルサーバ機能についてのお話をしようと思います。前回はファイルサーバ機能の概要と、アクセス方法、アクセス出来ない場合の確認事項について説明しましたが、今回は、ファイルサーバ機能のコンフィギュレーションについていくつかの例を挙げてその方法を説明したいと思います。
なお、本記事は基本的にWindowsを念頭に置いた内容になっているので、LinuxやMax OSをお使いの方は注意してください(まあ基本的なところはOSに依存しないとは思いますが…)。


どこらへんをいじればいいの?


まず、ファイルサーバ機能の設定に関連するファイルを挙げてみます。どのファイルを参考にしてどのファイルをいじればいいのかという目星をつけましょう。
  • <tomcat_dir>/webapps/alfresco/WEB-INF/classes/alfresco/subsystems/fileServers/default/file-servers-context.xml
    • ファイルサーバ機能を提供しているFileServersサブシステムの定義ファイル
    • 一部の設定がパラメータ化されており、*.propertiesファイルで設定できるようになっている。
  • <tomcat_dir>/webapps/alfresco/WEB-INF/classes/alfresco/subsystems/fileServers/default/file-servers.properties
    • 上記定義ファイルのパラメータの値を設定するファイル
  • <tomcat_dir>/webapps/alfresco/WEB-INF/classes/alfresco/repositry.properties
    • ファイルサーバ機能関係の一部のパラメータはこちらのファイルで設定されている
  • <tomcat_dir>/shared/classes/alfresco-global.properties 
    • 上記パラメータを変更する場合に設定を記述するファイル
    • 変更したいパラメータとその値をこのファイルに追記することで、file-servers.propertiesやrepository.propertiesにおける設定内容がこのファイルの設定内容で上書きされ、パラメータ値を変更することができる

というわけで、単純な設定変更であれば、file-servers-context.xmlやfile-servers.propertiesを見て変更すべきパラメータを確認し、alfresco-global.propertiesでそのパラメータの値を設定するだけでOKです。
設定項目の詳細については、Alfresco Helpの「Configuring file servers」alfrescowikiの「File Server Subsystem 4.0」あたりが参考になりますので必要に応じて参照してください(両方とも英語ですすいません…)。

では、実際にいくつかの例を見てみましょう。


例1. CIFSアクセス時のサーバ名を変更したい


前回説明したとおり、CIFSでAlfrescoにアクセスする場合は、サーバ名(正確にはNetBIOS名)としてマシン名+Aという名前を利用します(例えばマシン名がferganaの場合は、\\ferganaAにアクセスする必要があります)。この名前はfile-servers.propertiesで以下のように設定されています。
cifs.serverName=${localname}A
これを変更するために、例えば以下のような設定をalfresco-global.propertiesに追記し、オーバーライドします。
cifs.serverName=TestFileServer
設定が終わったらAlfrescoを再起動し、エクスプローラで\\TestFileServer\Alfresco等にアクセスできることを確認します。なお、デフォルトの設定で使われている${localname}というトークンは、PCのホスト名で置換される特別なトークンです。


例2. Alfrescoフォルダのマップ先を変更したい


デフォルトの設定では、CIFSやFTPでアクセスするとAlfrescoフォルダとAVMフォルダの2フォルダが存在します。さらに、Alfrescoフォルダを開くと、手動インストールだとAlfrescoのCompany_Home以下が、自動インストールだとCompany_Home/Sites以下が表示されます。
このAlfrescoフォルダのマップ先を特定のフォルダに設定するためには、filesystem.rootPathというプロパティをalfresco-global.propertiesでオーバーライドする必要があります。例えば、Alfrescoにログインしてルートフォルダ直下にtestフォルダを作成していくつかファイルをアップロードしておき、alfresco-global.propertiesに以下の行を追加します。
filesystem.rootPath=/app:company_home/cm:test
設定が終わったらAlfrescoを再起動してCIFSやFTPでAlfrescoフォルダにアクセスし、以下のようにAlfrescoフォルダのマップ先が変更されることを確認します。


例3. AVMフォルダを表示したくない、もしくは別のフォルダを追加したい


先ほど話した通り、デフォルトではAlfrescoフォルダとAVMフォルダが存在します。このうちAVMフォルダはWebコンテンツ管理に関連するものなので、表示する必要がないかもしれません。そんな場合は以下の手順でAVMフォルダの設定を抜くことができます。

1. <tomcat_dir>/shared/classes/alfresco/extension以下に、ディレクトリsubsystems/fileServers/default/defaultを作成します。

2. <tomcat_dir>/webapps/alfresco/WEB-INF/classes/alfresco/subsystems/fileServers/default/file-servers-context.xmlを、custom-file-servers-context.xmlという名前で1.で作成したディレクトリにコピーします。

3. custom-file-servers-context.xmlをテキストエディタで開き、filesystemContextsビーン以外の設定を削除し、さらにAVMフォルダの設定も削除します(Alfresco 4.0.dだと以下のようになります)。
<?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="filesystemContexts" class="org.springframework.beans.factory.config.ListFactoryBean">
      <property name="sourceList">
         <list>
            <!-- Alfresco repository access shared filesystem -->
            <bean class="org.alfresco.filesys.repo.ContentContext">
               <property name="sysAdminParams">
                  <ref bean="sysAdminParams" />
               </property>
               <property name="deviceName">
                  <value>${filesystem.name}</value>
               </property>
               <property name="storeName">
                  <value>${protocols.storeName}</value>
               </property>
               <property name="rootPath">
                  <value>${filesystem.rootPath}</value>
               </property>
               <property name="renameShufflePattern">
                  <value>${filesystem.renameShufflePattern}</value>
               </property>
               
               <!-- Mark locked files as offline -->
               <property name="offlineFiles">
                  <value>true</value>
               </property>
               
               <!-- Enable the quota manager -->
               <property name="quotaManager">
                  <ref bean="filesystemQuotaManager" />
               </property>
               
               <!--  Enables and disables pseudo files - cifs DesktopActions and URL shortcuts. -->
               <property name="pseudoFilesEnabled">
                  <value>${cifs.pseudoFiles.enabled}</value>
               </property>
               
               <!-- Add a pseudo links back to the alfresco explorer -->
               <property name="alfrescoURLEnabled">
                  <value>${cifs.pseudoFiles.explorerURL.enabled}</value>
               </property>
               <property name="URLFileName">
                  <value>${cifs.pseudoFiles.explorerURL.fileName}</value>
               </property>
               
               <!-- Add a pseudo links back to the alfresco share -->
               <property name="shareURLEnabled">
                  <value>${cifs.pseudoFiles.shareURL.enabled}</value>
               </property>
               <property name="shareURLFileName">
                  <value>${cifs.pseudoFiles.shareURL.fileName}</value>
               </property>
               
               <!-- Desktop actions -->
               <!-- Uses a client-side application to trigger a server-side action                         -->
               <!--   Echo - displays a message echoed from the server                                     -->
               <!--   URL  - launches a URL via the Windows shell                                          -->
               <!--   CmdLine - launches the Notepad application                                           -->
               <!--   CheckInOut - checks files in/out, drag and drop files onto the application           -->
               <!--   JavaScript - run a server-side script                                                -->
               <!--   JavaScriptURL - server-side script that generates a URL to the folder using a ticket -->
               <!--                   to avoid having to logon                                             -->
               <property name="globalDesktopActionConfig">
                  <bean class="org.alfresco.filesys.config.GlobalDesktopActionConfigBean">
                     <property name="path">
                        <value>alfresco/desktop/Alfresco.exe</value>
                     </property>
                  </bean>
               </property>
               <property name="desktopActionList">
                  <list>
                     <bean class="org.alfresco.filesys.repo.desk.CheckInOutDesktopAction">
                        <property name="name">
                           <value>CheckInOut</value>
                        </property>
                        <property name="filename">
                           <value>__CheckInOut.exe</value>
                        </property>
                     </bean>
                     <bean class="org.alfresco.filesys.repo.desk.JavaScriptDesktopAction">
                        <property name="name">
                           <value>JavaScriptURL</value>
                        </property>
                        <property name="filename">
                           <value>__ShowDetails.exe</value>
                        </property>
                        <property name="scriptName">
                           <value>alfresco/desktop/showDetails.js</value>
                        </property>
                        <property name="attributeList">
                           <value>anyFiles</value>
                        </property>
                        <property name="preprocess">
                           <value>copyToTarget</value>
                        </property>
                     </bean>
                     <!-- Other desktop actions which may be enabled -->
                     <!--
                        <bean class="org.alfresco.filesys.repo.desk.EchoDesktopAction"> <property name="name">
                        <value>Echo</value> </property> <property name="filename"> <value>__AlfrescoEcho.exe</value>
                        </property> </bean> <bean class="org.alfresco.filesys.repo.desk.URLDesktopAction"> <property
                        name="name"> <value>URL</value> </property> <property name="filename">
                        <value>__AlfrescoURL.exe</value> </property> </bean> <bean
                        class="org.alfresco.filesys.repo.desk.CmdLineDesktopAction"> <property name="name">
                        <value>CmdLine</value> </property> <property name="filename"> <value>__AlfrescoCmd.exe</value>
                        </property> </bean> <bean class="org.alfresco.filesys.repo.desk.JavaScriptDesktopAction">
                        <property name="name"> <value>JavaScript</value> </property> <property name="filename">
                        <value>__AlfrescoScript.exe</value> </property> <property name="scriptName">
                        <value>alfresco/desktop/dumpRequest.js</value> </property> <property name="attributeList">
                        <value>anyFiles, multiplePaths, allowNoParams</value> </property> <property name="preprocess">
                        <value>confirm, copyToTarget</value> </property> </bean>
                     -->
                  </list>
               </property>
               <!-- Additional access control of the filesystem -->
               <!-- Access type of 'none' will stop the filesystem from showing up for that user/address/protocol -->
               <!--
                  <property name="accessControl"> <bean class="org.alfresco.filesys.config.acl.AccessControlListBean">
                  <property name="defaultAccessLevel"> <value>Write</value> </property> </bean> </property>
               -->
            </bean>
         </list>
      </property>
   </bean>
</beans>

4. Alfrescoを再起動し、ftp://<サーバIP>にアクセスします。以下のように、AVMフォルダが表示されなくなっていることを確認します。

上記の手順では、FileServersサブシステムの設定を上書きすることでAVMフォルダを表示しないようにしていますが、同様の手順で、他に必要なフォルダを追加することも可能ですので是非チャレンジしてみてください。
また、サブシステム上書きについては、Alfresco Subsystems - alfrescowikiで詳しく説明されているので、必要に応じて参照してください。


今回は、以上になります。2回に分けて、ファイルサーバ機能の使い方、うまくアクセス出来ない時の対処法、いくつかのコンフィギュレーション例を説明してきました。
この機能はエンドユーザにファイルサーバと同様の使用感のUIを提供するとともに、他システムとの連携の際に相手先のシステムが標準で連携できる(可能性の高い)プロトコルを提供するものですので、実際にAlfrescoの利用を検討している方は、ファイルサーバ機能の利用も検討してみてはいかがでしょうか。

Wednesday, October 17, 2012

Alfresco勉強会#10 振り返り



皆さんこんにちは。

先日行われた第10回Alfresco勉強会についてのエントリです。
今回、aegifの二人が資料を元に発表を行いました。

1つ目はてらしたさん(@terajun)の
ドキュメントライブラリのUIカスタマイズ(一部)」でした。
Alfresco ShareのドキュメントライブラリのUIカスタマイズについて、デモを用いながらわかりやすく説明されていました。Alfresco Shareのカスタマイズは、当初3.x系ではテンプレートファイルを直接編集するなどの方法を採らざるを得なかったのですが、4.xでは設定で行えるようになり、だいぶカスタマイズしやすくなりました。この話は、Alfresco ShareのUIカスタマイズ入門として参考になると思います。

2つ目は私の「Alfresco ShareとGoogle Docs」になります。
機能としてたまに紹介されるGoogle Docs連携ですが、
実際に試した人が少ないのではと考えながら作りました。
ひじょうに簡単な設定で、Alfresco ShareからGoogle Docsへのチェックアウト、
Google DocsからAlfresco Shareへのチェックインができることをデモしました。

次回は11/7(水)を予定しています。
お申込みはこちらからできます。
ご興味ある方はぜひご参加ください。発表者も大歓迎です。
@mryoshio

Wednesday, October 3, 2012

Alfrescoのファイルサーバ機能TIPS(CIFSとかFTPとか) その1

こんにちは。大谷です。

今回はAlfrescoのファイルサーバ機能についてと、それを設定・利用するときに役立つマメ知識とかを書こうと思います。なお、本記事は基本的にWindowsを念頭に置いた内容になっているので、LinuxやMax OSをお使いの方は注意してください(まあ基本的なところはOSに依存しないとは思いますが…)。


ファイルサーバ機能って何?


Alfrescoはコンテンツにアクセスするための様々なインターフェースを用意しています。代表的なものはShareと呼ばれるブラウザアクセス用のGUIですが、その他にも、FTP、SMB/CIFS、WebDAV等でもアクセスできるようなインターフェースを提供しています。
このうちFTPとSMB/CIFS(とNFS。今更感満載なので割愛させてもらいます)の機能は、AlfrescoのFileServersサブシステムと呼ばれるモジュールによって提供されているので、併せてファイルサーバ機能と呼ぶこととします。
いずれもWindowsのエクスプローラや各種ハードウェア・ソフトウェアで簡単にアクセスできるインターフェースなので、ファイルサーバ機能を利用して、エンドユーザが既存のファイル共有サーバライクにAlfrescoを利用したり、スキャナ等から標準のインターフェースを利用して自動的にAlfrescoにファイルをアップロードしたりすることができます。


ファイルサーバ機能を利用するには?


基本的には何の設定もいりません。インストーラを利用しても、手動でインストールしても、FTP、CIFSともデフォルトで有効になっています。逆に、これらの機能を無効にしたい場合は、<tomcat_dir>/shared/classes/alfresco-global.propertiesに以下の設定を追記します。使わない機能を無効にすることは、サーバの負荷を軽減することにつながります。
  • FTP : ftp.enabled=false
  • CIFS : cifs.enabled=false



アクセスしてみよう!


では、実際にアクセスしてみましょう。まずはFTPから。適当なFTPクライアント(WindowsであればエクスプローラでOK)で、ftp://<サーバのIP>にアクセスします。ユーザIDとパスワードの入力を求められるのでAlfrescoに登録されたユーザの情報を入力すると、以下のようにアクセスできるはずです。ルートフォルダにはAlfrescoとAVMの2つのフォルダが存在することが分かります。

次にCIFSを試してみます。Windowsのエクスプローラで、\\<ホスト名>Aにアクセスします。ここで重要なのは、ホスト名の最後に"A"を付けることです(ブロードキャストされるNetBIOS名がデフォルトでこのように設定されているため)。もしアクセスできない場合は、\\<ホスト名>A\Alfrescoにアクセスしてみてください。ユーザIDとパスワードを入力すると以下のようにアクセスできるはずです(swsdpはAlfrescoにデフォルトで設定されているサンプルサイトです)。FTPの例を見ると想像がつくと思いますが、\\<ホスト名>A\AVMにもアクセスすることができます。

ちなみに、FTPやCIFSでAlfrescoフォルダにアクセスした際に表示される内容ですが、手動インストールした場合はAlfrescoリポジトリのルートフォルダ(Company_Homeと呼ばれます)、インストーラでインストールした場合はサイト一覧フォルダ(Company_Home/Sites)が表示されます。後で説明しますが、このルートパスを変更することもできます。


ん、アクセスできないんだけど…


上記のように一発でアクセスできればいいのですが、環境によってはうまくアクセスできないこともあります。ここではありがちな例をいくつか紹介します。

1. CIFSでアクセスできない(認証画面すら表示されない)
この場合は、AlfrescoがインストールされているPCで「コントロール パネル」→「ネットワークとインターネット」→「ネットワーク接続」から、利用しているネットワーク接続のプロパティを開き、「Microsoftネットワーク用ファイルとプリンター共有」のチェックを外してOKボタンをクリックします。
この機能もCIFSを利用しているため、チェックが入っていると競合が発生してAlfrescoにCIFSアクセスできなくなることがあるようです。

2. FTPでアクセスできない(認証画面は通るけどフォルダ一覧の取得に失敗する)
FTPのアクセスモードとファイアウォールの設定に依存している可能性があります。まずはクライアント側の設定でPASVモードを利用しているか否か確認しましょう。エクスプローラでアクセスするのであれば、Internet Explorerの「インターネットオプション」の「詳細設定」タブで「パッシブFTPを使用する」をチェックし、例えばこのチェックを外して再度アクセスできるか確認してみましょう。
もしくは、AlfrescoがインストールされているPCのファイアウォールを確認し、PASVモードが利用する可能性のあるデータポートが開放されているか確認します(ちなみにデフォルト設定のAlfrescoでは利用するポートレンジが指定されていないので、必要に応じてalfresco-global.propertiesにftp.dataPortFrom, ftp.dataPortToプロパティを追加してポートレンジを指定します)。


今回は、AlfrescoへFTPやCIFSのプロトコルを利用したアクセス方法について説明しました。次回は一歩進んで、ファイルサーバ機能の設定をいじってCIFSアクセス時のホスト名を変更したり、アクセス先のルートフォルダを変更したりする方法について説明しようと思います。

(2012/10/24追記:Alfrescoのファイルサーバ機能TIPS(CIFSとかFTPとか) その2 を公開しました)

Wednesday, September 26, 2012

Alfrescoのチューニングポイント(概要)

mryoshioです。

今日の内容はAlfrescoについての話になります。Alfrescoについてのインストールや初期設定については書き秋田こういう他の記事を参考にして頂くとして、今日はチューニングポイントの概要として少しだけ突っ込んだ話を書きたいと思います。
システムを構築する上で当然パフォーマンスには注意しなければならず、Alfrescoを使う場合でも同様です。JVMチューニングについてはここで少し触れられていますが、Alfrescoのチューニングポイントについての日本語のまとめは情報としてないと思います。そのため今日の内容を書くことにしました。
なお、AP(アプリケーション)サーバとしてTomcatを使っているという前提で進めます。
  • JVMの設定
    • bin/catalina.sh(Windowsの場合はcatalina.bat)
      • ヒープ領域の最大サイズ(Xmx)
      • ヒープ領域の最小サイズ(Xms)
      • Permanent領域の最大サイズ(MaxPermSize)
  • アプリケーションサーバソフトウェアの設定
    • server.xml
      • 最大スレッド数(maxThreads)
  • DBコネクションプールの設定
    • shared/classes/alfresco-global.properties
      • 最大プール数(db.pool.max)
      • インデクスリカバリ時の最大プール数(index.recovery.maximumPoolSize)
  • Luceneの設定
    • (設定項目が多いので別の機会)にご説明します。
普段Alfrescoを触っていてレスポンスが遅いと感じた場合、以上の項目をまず始めにチェックします。JVMの設定とアプリケーションサーバソフトウェアに関してはAlfrescoならではの話でないので割愛します。DBコネクションプールおよびLuceneの設定についてですが、まず前提としてお話したいのが、ほとんどの項目を設定をalfresco-global.properitesで行えるということです。ですので、Alfresco固有の設定はこのファイルで行うことになります。

DBコネクションプールについては、まずdb.pool.maxを確認します。たとえば、利用しているDBの最大接続数が200となっている時にAlfrescoの設定が32となっていると当然ながら最大性能を発揮するには程遠くなりますので注意しましょう。次にindex.recovery.maximumPoolSizeです。これは、Alfrescoが使うLuceneインデクスをリカバリ(再構築)する際に使用する最大プール数です。もしインデクスリカバリを実行していて遅いと感じた場合はここが関係している可能性があります。

4つ目のLuceneの設定に関しては、項目が多いのでまた別の機会に書きたいと思います。

他にsystem.acl.maxPermissionCheckTimeMillis等の設定についても書きたかったのですが、パフォーマンスとは異なるのでそれもまた別の機会に。

@mryoshio


Wednesday, September 19, 2012

AlfrescoのMicrosoft Office連携(オンライン編集機能)を試してみよう

こんにちは。大谷です。
今回は、Alfresco 4.0のMicrosoft Office連携について説明しようと思います。


Microsoft Office連携って何?


一言で表すと、AlfrescoがSharePointサーバのふりをするということになります。AlfrescoがSharePointプロトコルを話すことで実現しているのですが、これにより、SharePointサーバで提供されている以下の2つの機能がAlfrescoでも利用できるようになります。
  • Microsoft OfficeアプリケーションからSharePoint(Alfresco)サーバ上のリポジトリを参照し、ファイルを開く
  • SharePoint(Alfresco)サーバ上のファイルを直接Microsoft Officeアプリケーションで開き、編集、保存する
上記2機能はAlfrescoに同一の設定を施すことで利用可能になりますが、今回は後者の動作のみを確認してみようと思います(まあ後者の機能が正常に機能する場合は前者も正常に機能するはずです)。
ちなみに後者は、ローカル(オフライン)へのファイルダウンロードや、ローカルからの更新ファイルのアップロードを明示的に行う必要がないため、「オンライン編集」機能と呼ばれます。


ではまず機能のインストールから


では、早速機能のインストール方法を見てみましょう。

Alfrescoのインストールから始める場合は、「Alfresco4.0をインストールしてみよう(インストーラ編)」を参考にしてインストールを進めますが、「コンポーネントを選択」画面で「SharePoint」にチェックを付けるとMicrosoft Office連携機能が有効になります。インストールが完了したら、Alfresco側の設定は完了です。



既にAlfrescoがインストールされている場合、もしくはこれから手動でインストールする場合は、連携用コンポーネントを別途追加する必要があります。Download and Install Alfrescoの「Custom Installs & Optional Modules」から「SharePoint Protocol support」のzipファイル(4.0.eの場合はalfresco-community-spp-4.0.e.zip)をダウンロードして展開し、中身のAMPファイル(alfresco-community-spp-4.0.e.amp)をModule Management Toolを使ってインストールします。

※ Alfrescoを手動でインストールする場合は、「Alfresco4.0をインストールしてみよう(手動インストール編)」を参考にしてください。


クライアント側の設定と動作確認をしてみるが…


続いて、クライアント側の設定を行います。まずは、Web フォルダのソフトウェア更新プログラム: KB907306を適用します。

ひとまずこの状態でオンライン編集の挙動を確認してみましょう。確認手順は以下のとおりです。
  1. ブラウザで http://localhost:8080/share/ にログインする
  2. 「あなたのサイト」ダッシュレットに表示されているサンプルサイト「Web Site Design Project」をクリックする
  3. 「Project Library」をクリックする
  4. Microsoft Officeのファイルをアップロードする(例えばdocxファイルとか)
  5. アップロードしたファイルの「その他のアクション」->「オンライン編集」をクリックする
  6. 「ドキュメントを開く」ダイアログが表示されるので「OK」をクリックする




お、ちゃんとMicrosoft Officeアプリケーションが起動したぞ!と喜ぶのもつかの間、「このWebサーバーへのアクセスは規定で無効になっています。...」というダイアログが表示され、ファイルを開くことができません。



接続のSSL化か、認証レベルの変更か


上記のダイアログ、実はSSLでのアクセスじゃないとファイルを開けませんよ、という内容です。なので、対応方法は「SSL化する」「Microsoft Officeの認証レベルを非SSLを許可するように変更する」のどちらかになります。もちろんお勧めはSSL化なのですが、 今回はてっとり早く後者で対応したいと思います。
なお、1.についてはAlfresco Help - Setting up SharePoint Protocol Support to work with HTTPSに詳細な設定手順が書かれていますので参考にしてください。

Microsoft Officeの認証レベル変更は以下のように行います。
  1. クライアントPCでレジストリエディタを起動します(「ファイル名を指定して実行」->「regedit」)
  2. レジストリキー「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters\BasicAuthLevel」の値を2に変更する(キーが無い場合はREG_DWORDで作成する)
  3. レジストリキー「HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Common\Internet\BasicAuthLevel」の値を2に変更する(キーが無い場合はREG_DWORDで作成する)
これで非SSL接続を許可する設定になったので、再度オンライン編集の挙動を確認してみましょう。以下のダイアログが表示され、ユーザー名とパスワードを入力してファイルが開ければOKです。


続いて、実際に編集し、ファイルを上書き保存してみましょう。すると、Alfresco上のファイルが自動で更新され、ファイルが新しくなっていることが確認できると思います(以下の例では、オンライン編集で「オンライン編集してみたよ!!!!!」という文字列を追加しました)。



最後に


以上がオンライン編集機能の基本的な設定方法と使い方です。なお、オンライン編集は、リポジトリ(Alfrescoのヘッダの「リポジトリ」リンクから辿れるやつ)では利用できず、各サイト内の文書ライブラリでしか利用できないことに注意してください。

また、上記以外にも環境に合わせた様々な設定項目がありますので、さらなる詳細についてはAlfresco Help - Installing and configuring Microsoft Office SharePoint Protocol Supportを参考にしてください。


(2014/06/11追記)  「Alfresco 4.2のMicrosoft Office連携(オンライン編集機能)をSSL化する」を公開しました。こちらの記事ではレジストリをいじることなくOffice連携を実現する方法を紹介しています。

Wednesday, September 5, 2012

Alfresco勉強会#9 振り返り


皆さんこんにちは。

先日行われた第9回Alfresco勉強会のご報告です。
今回は、aegifの二人が資料を元に発表を行いました。

1つ目は林さん(@linzhixing)の「やさしいShareダッシュレットの作り方」でした。
タイトルのヒエログリフから窺える通り、なかなか言葉(文字数)が詰まった資料で
非常に読み応えがある仕上がりになっています。事例としてあまり上がってこないAlfresco Shareのダッシュレットの作成について丁寧な説明が為されています。
ダッシュレットの作り方、サンプルコードも豊富で後々の参考資料として充分に
活用できると思います。ぜひご覧ください。

2つ目は私の「Alfrescoクラスタリング入門」になります。
Mac上のAlfrescoとVMware上のUbuntu上に構築したAlfrescoの間で
次のものを同期させる為の設定について解説しています。

  • コンテンツストア
  • キャッシュ
  • Luceneインデクス
資料を通して見て頂くと、
実際にはセッション情報等他のものの冗長化も必要になるとは思いますが、
Alfrescoをクラスタリング構成にするのが非常に簡単であることが分かるはずです。


次回は9/19(水)を予定しています。
ご興味ある方はぜひどうぞ!
失敗談でも結構ですので、気楽に発表も頂ければと思います。
@mryoshio


Wednesday, August 29, 2012

Alfresco 4.0の使い方 - 準備編(2) - リポジトリとサイトの準備をしよう

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



こんにちは。大谷です。

前回の記事「Alfresco 4.0の使い方 - 準備編(1) - ユーザ・グループを登録してみよう」に引き続き、Alfrescoを使い始めるための準備のお話をしたいと思います。

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


リポジトリ vs サイト


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

リポジトリ

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

サイト

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

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

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

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

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

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

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


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


リポジトリを使ってみる


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


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

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


サイトを使ってみる


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

まずはサイトの作成から

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


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

次に、「その他」→「サイトのカスタマイズ」をクリックし、サイトで利用するツールを設定します。以下の画面が表示されるので、利用したいコンポーネントをドラッグ&ドロップで追加します。

追加し終わったら「OK」ボタンを押すと、追加されたコンポーネントがサイトダッシュボードに追加されます。

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

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

まず、「招待」をクリックします。

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

招待するユーザを設定したら、「招待」ボタンをクリックします。これで招待処理が完了ですが、最後にユーザ側で招待の承認を行う必要があります。

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

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

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

サイトのドキュメントライブラリにアクセスする

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

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



今回は、リポジトリとサイトの概念とその利用方法について説明しました。前回の記事と合わせて、これでコンテンツ管理のための最低限の準備ができると思います。

今後、各モジュールの詳しい利用方法についても記事にしていきたいと思いますので、引き続きよろしくお願いします。

Alfresco 4.0の使い方 - 準備編(1) - ユーザ・グループを登録してみよう

 

 (2014/4/17) 「Alfresco 4.2の使い方 - ユーザ管理・グループ管理」を公開しました。



こんにちは。大谷です。
今回はAlfresco 4.0の使い方について紹介します。

よく、「とりあえずAlfresco Community Editionをインストールしてみたんだけど、いざ使おうと思ったらどこから始めればいいか分からない」という声を聞きます。たしかにAlfrescoは機能が豊富でUIがリッチ(良くも悪くも…)だったり、そもそも日本語のドキュメント類があまり多くなかったりするので、実際に使い始める時には何をどのようにするのかが分かりにくい部分があると思います。

そこで、Alfrescoの使い方を何回かに分けて説明していこうかと思います。第1回は、Alfrescoをエンドユーザが使い始める前に最低限行う必要のある管理タスクについてまとめてみました。

前提条件としては、Alfresco 4.0がインストールされていることです。インストール方法については、Alfresco4.0をインストールしてみよう(インストーラ編)に詳細が載っていますので参考にしてください。


管理者でログインする


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

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


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

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

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



ユーザを登録する


続いて、Alfrescoにユーザを登録します。
管理系のメニューは画面上部の「その他のアクション」に集約されています。ユーザ管理の場合は「その他のアクション」→「ユーザー」をクリックします。


すると、以下の画面が表示されます。「*」と入力して検索を行うと全ユーザが表示されます。


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

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


登録が完了すると、ユーザ一覧に先ほど登録したユーザが表示されます。

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

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


グループを登録する


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

まず、「その他のアクション」→「グループ管理」をクリックします。


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


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


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


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


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


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


まとめ


今回は、ユーザ・グループの追加方法について紹介しました。次回はAlfrescoでコンテンツ管理を行う2種類の方法(サイト vs リポジトリ)の紹介をしようと思います。

(2012/08/29 追記) 「Alfresco 4.0の使い方 - 準備編(2) - リポジトリとサイトの準備をしよう」を公開しました。
(2013/07/29 追記) 4.2では、ユーザー管理画面で「*」と入力して検索しても検索エラーとなり、全ユーザを表示できなくなっています。

Tuesday, August 21, 2012

SolrのSSL証明書が有効期限切れになっていたら

Alfresco4.0から検索システムとして採用されているSolrですが、2012年8月16日を以てSolrに同梱されていたSSL証明書が有効期限切れになったとのアナウンスが出ています。
 Important: SSL certs for SOLR in Alfresco 4 expire this week 

もしお使いのAlfresco4.0系で以下のようなエラーがログに出続けていたら、証明書の有効期限切れです。
Caused by: java.security.cert.CertificateExpiredException: NotAfter: Fri Aug 17 21:04:11 JST 2012

影響としては、ログインや画面操作等は可能なものの、検索機能が機能しなくなり、タグなども正常に表示されなくなります。
お盆開けでAlfrescoを見てみたら急におかしくなっていた、なんて方もいらっしゃるかもしれません。( 筆者はそうでした :-) )


新しい証明書に差し替えたバージョンのAlfresco(4.0.2に対しては4.0.2.9、4.0.dに対しては4.0.e)がすでにリリースされていますが、ここでは既存のAlfrescoのまま証明書だけ新しく生成する方法をご紹介します。
※下記Wikiページか、またはEnterprise版をご利用の方はSupport Portalの方にも情報&生成用のスクリプトがあります。
Generating new SSL certificates


Solr用SSL証明書の生成手順
※ OSはWindows/Linux/Macいずれでも構いません。筆者は普段Mac上のAlfrescoを弄っていますが、Macでは以下の3.で躓いたので、参考にしていただければと思います。
 
0.前提条件として、Solrは展開済み、keystoreディレクトリも作成済みとします。

1.バージョン4.0.eのAlfresco一式またはSolr単体をDLして解凍します。

2.解凍したSolrの中にあるgenerate_keystores.sh(Linuxの場合)という証明書生成用スクリプトを、alf_data/keystore/直下に置きます。
 Windowsの場合はgenerate_keystores.batを置いてください。

3.スクリプトの冒頭にある変数ALFRESCO_HOMEを、Alfrescoをインストールしているフォルダパスに指定します(e.g. /opt/alfresco-4.0.0)。
Alfrescoをインストーラで入れたまま各種フォルダパスを特に変更していなければ設定はこれだけですが、変更していた場合は念のため他のフォルダパス変数も確認してください。

特にMac版インストーラによるフォルダ構成ではLinux版のそれと違って$ALFRESCO_HOME/javaフォルダが存在しておらず、そのままではスクリプトからkeytoolコマンドを実行できません。Macでの対処法としては、JDKが入っていてkeytoolコマンドが単独で動作することを確認したら、スクリプト上の"$JAVA_HOME/bin/keytool"をすべて"keytool"に置き換えればOKです。

 4. Tomcat、DBを停止してスクリプトを実行します。
※スクリプトを実行すると自動的にTomcatもDBも停止するので注意してください。

実行すると、

[root@localhost ~]# sh /opt/alfresco-4.0.0/alf_data/keystore/generate_keystores.sh

Using CATALINA_BASE:   /opt/alfresco-4.0.0/tomcat

Using CATALINA_HOME:   /opt/alfresco-4.0.0/tomcat

Using CATALINA_TMPDIR: /opt/alfresco-4.0.0/tomcat/temp

Using JRE_HOME:        /opt/alfresco-4.0.0/java

Using CLASSPATH:       /opt/alfresco-4.0.0/tomcat/bin/bootstrap.jar

/opt/alfresco-4.0.0/tomcat/scripts/ctl.sh : tomcat stopped

/opt/alfresco-4.0.0/postgresql/scripts/ctl.sh : postgresql stopped

証明書がファイル </root/ssl.repo.crt> に保存されました。

証明書がファイル </root/ssl.repo.client.crt> に保存されました。

証明書がキーストアに追加されました。

証明書がキーストアに追加されました。

証明書がキーストアに追加されました。

cp: cannot stat `/opt/alfresco-4.0.0/alf_data/solr/templates/test/conf/ssl.repo.client.keystore': そのようなファイルやディレクトリはありません

cp: cannot stat `/opt/alfresco-4.0.0/alf_data/solr/templates/test/conf/ssl.repo.client.truststore': そのようなファイルやディレクトリはありません

cp: cannot create regular file `/opt/alfresco-4.0.0/alf_data/solr/templates/test/conf/ssl.repo.client.keystore': そのようなファイルやディレクトリはありません

cp: cannot create regular file `/opt/alfresco-4.0.0/alf_data/solr/templates/test/conf/ssl.repo.client.truststore': そのようなファイルやディレクトリはありません

Certificate update complete

Please ensure that you set dir.keystore=/opt/alfresco-4.0.0/alf_data/keystore in alfresco-global.properties


となって、証明書が生成されます。
 /opt/alfresco-4.0.0/alf_data/solr/templates/test/conf下のファイルがありませんというエラーが出ていますが、これらは4.0.2以降のものなので気にしなくてよいようです。

以上で、証明書が生成されて検索機能が元通り使えるようになります。

(文責: hayashi@aegif)

Wednesday, August 8, 2012

Aegif publie un système de gestion de contenu révolutionnaire: NemakiWare 1.0

TOKYO Aujourd'hui Aegif a publié NemakiWare 1.0, un système de gestion de contenu dont le but est de battre tous les records en termes de scalabilité.

NemakiWare repose sur CouchDB, une base de données distribuée de type NoSQL.
C'est un changement radical par rapport aux autres systèmes de gestion de contenu, qui utilisent des bases de données traditionnelles comme Oracle ou MySQL.

Les points forts de NemakiWare sont la scalabilité et l'extensibilité.

Aegif a toujours été très proactif sur CMIS, publiant le premier explorateur CMIS orienté intégration, seulement quelques semaines après la parution du standard CMIS.

NemakiWare est Open Source, et est disponible gratuitement sur http://nemakiware.bitbucket.org

À propos d'Aegif

Aegif est une société de conseil japonaise, spécialiste de la gestion documentaire open source. Sa vaste expérience lui permet de minimiser les risques et catalyser le potentiel des solutions entreprise open-source, afin de proposer des solutions optimales, principalement dans des environnements à grande échelle. De la définition des exigences à la conception, Aegif accompagne ses clients en avance de pahse et jusqu'à la livraison de solutions performantes, efficaces et flexibles. Voir www.aegif.jp

À propos de CMIS

CMIS (Content Management Interoperability Services) est un standard pour l'interopérabilité entre les divers systèmes de gestion de contenu du marché. CMIS a été approuvé par le consortium OASIS (Organization for the Advancement of Structured Information Standards) en mai 2010. Tous les principaux vendeurs supportent CMIS:  Adobe, Alfresco, EMC, eXo, FatWire, HP, IBM, ISIS Papyrus, Liferay, Microsoft, Nuxeo, Open Text, Oracle, SAP et autres.

Contact

Aegif Corporation
Nicolas Raoul
nicolas.raoul@aegif.jp

Aegif releases revolutionary ECM server: NemakiWare 1.0

TOKYO Today Aegif released NemakiWare 1.0, an ECM (Enterprise Content Management) server that aims to redefine ECM scalability.

NemakiWare uses CouchDB, a NoSQL distributed database.
That is a radical shift from existing ECM servers, which are using traditional database engines like Oracle or MySQL.

The strengths of NemakiWare are scalability and extensibility.

NemakiWare was designed with the open standard CMIS in mind, making it an ECMS of choice when interoperability is needed. Aegif has always been very proactive on CMIS, releasing the first integration-oriented CMIS webapp only a few weeks after the CMIS standard was approved.

NemakiWare is Open Source, and can be downloaded for free at http://nemakiware.bitbucket.org

About Aegif

Aegif is a leading consulting firm in Japan, with a strong focus on open-source ECM consulting. Its extensive experience allows it to minimize risks while leveraging the potential of enterprise-class open-source software, to offer optimal solutions to clients, typically in large-scale environments. From requirements analysis to solution design, Aegif accompanies its clients from early phases until the delivery of a powerful, efficient and flexible solution. See www.aegif.jp

About CMIS

CMIS (Content Management Interoperability Services) is a standard for interoperability between Enterprise Content Management products. CMIS has been approved by the OASIS consortium (Organization for the Advancement of Structured Information Standards) in May 2010. All major ECM players support CMIS:  Adobe, Alfresco, EMC, eXo, FatWire, HP, IBM, ISIS Papyrus, Liferay, Microsoft, Nuxeo, Open Text, Oracle, SAP and more.

Contact

Aegif Corporation
Nicolas Raoul
nicolas.raoul@aegif.jp

Wednesday, August 1, 2012

Alfrescoのコンテンツ変換(content transformation)について少々

こんにちは。aegifの大谷です。

今回は、Alfrescoのコンテンツ変換機能についてお話ししようと思います。
Alfrescoはコンテンツ変換の仕組みを持っており、以前「AlfrescoでPDFファイルのプレビューができない!」というエントリでも触れたプレビューや、コンテンツのサムネイル生成などに利用されています。 もちろん、フォルダにルールを指定してアップロードされたコンテンツを他のフォーマットに変換するというような使い方も可能です。


そもそもコンテンツ変換って何?


そもそもコンテンツ変換とは何なのかという話ですが、読んで字のごとく、Alfrescoが管理しているコンテンツを別のフォーマットに変換する機能のことです。
例えば、先ほど例に挙げたプレビューやサムネイルなどは、AlfrescoにアップロードされたコンテンツをSWF(プレビュー用ファイル。Adobe Flashを使ってプレビューを表示しています)やjpeg, png等の画像ファイル(サムネイル表示用ファイル)に変換することで実現しています。
もちろん汎用的な仕組みになっているので、ルール機能のアクションとしてコンテンツ変換を設定することもできますし、カスタマイズで独自のロジックを作成する際にコンテンツ変換機能を呼び出して利用することもできます。


どのフォーマットの変換が定義されてるの?


コンテンツ変換が何者かということが分かると、Alfrescoで利用可能なコンテンツ変換のフォーマットって何なのか?一覧はないのか?という話になると思うのですが、これはAlfrescoにアクセスして確認することができます。
ブラウザで http://<サーバIP>:<ポート番号>/alfresco/service/mimetypes (例えば http://localhost:8080/alfresco/service/mimetypes とか)にアクセスすると、以下の画面が表示されます。

これはAlfrescoが認識可能なMIMEタイプの一覧で、「details for ...」をクリックすると、以下のような画面が表示されます(以下はapplication/mswordつまりWordのdocファイルについての詳細です)。

この例だと、docファイルはPDF、bmp等の画像、html等のテキストに変換可能で、逆に、rtfファイルからdocファイルに変換することも可能であることが分かります。


独自のコンテンツ変換を追加できるの?


できます。が、今回はその詳細については割愛させていただきます(すいませんすいません)。英語にはなりますが、具体的な方法についてはAlfresco WikiのContent Transformationsの項目(英語)で説明されています。
また、以前書いた「AlfrescoとTesseract OCR」の記事でも独自のコンテンツ変換(tiffからtextへの変換)を定義する手順を説明していますので、こちらも見てみてください。


そもそもコンテンツ変換ってどんな感じで使うの?


ありがちな使い方は、コンテンツを自動的に他のフォーマットに変換するというものです。一例として、あるフォルダにアップロードもしくはコピーされたファイルをPDFに自動変換するための設定方法を説明します(コンテンツの出入りをトリガにしてアクションを実行する「ルール機能」を利用します)。例えば、ワークフロー等で承認されたコンテンツを特定のフォルダにコピーして自動的にPDFファイルを生成したりするような使い方を想定しています。

1.  まず、設定に利用するフォルダを作成します。例えば、以下のように「承認済」フォルダと「PDF」フォルダを作成し、「承認済」フォルダのアクションメニューの「ルールの管理」をクリックします。

2. 「ルールの作成」をクリックし、以下のようにルールを設定します。ポイントは、「アイテムはこのフォルダで作成または入力されます」「すべてのアイテム」「コンテンツを変換およびコピーする」「Adobe PDF Document」「PDFフォルダ」です。設定が終わったら「作成」ボタンをクリックします。

3. ルールが設定されると、以下のようにフォルダにルールアイコンが表示されます。

4. テストを行います。「承認済」フォルダに適当なファイルをアップロードし、PDFフォルダに同名のPDFコンテンツが生成されていればOKです。


こんなコンテンツ変換にも注意が必要


ここまでAlfrescoのコンテンツ変換機能について説明しましたが、一つ注意が必要な点があります。コミュニティ版では4.0.dから、エンタープライズ版では4.0.1から、コンテンツ変換に対して制限を設定できるようになりました。変換を行う最大ファイルサイズやページ数、変換時間を設定し、それを超えるものについては変換を行わないもしくはその範囲について変換を行うようにすることができます。詳細についてはAlfrescoWikiにある解説ページ(英語)を参照してください。
これだけであれば便利な設定ができるね、という話なのですが、問題は以下の設定がデフォルトでなされていることです(repository.propertiesで設定されています)。
# Content Transformers

# Base setting for all transformers (2 min timeout)
content.transformer.default.timeoutMs=120000
content.transformer.default.readLimitTimeMs=-1
content.transformer.default.maxSourceSizeKBytes=-1
content.transformer.default.readLimitKBytes=-1
content.transformer.default.pageLimit=-1
content.transformer.default.maxPages=-1

# text -> pdf using PdfBox (txt=text/*) 10M takes about 12 seconds
content.transformer.PdfBox.TextToPdf.maxSourceSizeKBytes=10240

# pdf -> swf using Pdf2swf 1M takes about 30 seconds.
# Using a value of 1.25M (a bit larger that the txt or xlsx) used to create
# the pdf on the way to swf to avoid the second part of a transform failing
content.transformer.Pdf2swf.maxSourceSizeKBytes=1152

# txt -> pdf -> swf 1M (pdf is about the same size as the txt)
# Need this limit as transformer.PdfBox txt -> pdf is allowed up to 10M
# unlike transformer.OpenOffice and transformer.JodConverter which
# also only allow 1M text
content.transformer.complex.Text.Pdf2swf.maxSourceSizeKBytes=1024

# Limits for specific mimetype transformations (txt=text/plain only) 1M
# Has implication for Share preview which generally goes via pdf to get to swf
content.transformer.OpenOffice.mimeTypeLimits.txt.pdf.maxSourceSizeKBytes=1024
content.transformer.OpenOffice.mimeTypeLimits.xlsx.pdf.maxSourceSizeKBytes=1024

content.transformer.JodConverter.mimeTypeLimits.txt.pdf.maxSourceSizeKBytes=1024
content.transformer.JodConverter.mimeTypうeLimits.xlsx.pdf.maxSourceSizeKBytes=1024
これを見るとコンテンツ変換に120秒のタイムアウトが設定されていることが分かります(ちなみに-1は制限無しという意味です)。また、1152KBを超えるPDFのSWF(プレビューに使います)への変換は行われず、1024KBを超えるプレーンテキストやExcelファイルのPDFへの変換も行われない設定となっています。
ルール機能等でコンテンツ変換を仕掛けたけどうまく変換されない場合があります!という場合は、この設定を確認し、必要に応じて設定を変更する必要があります。

ただし、制限を緩めるとその分サーバへの負荷が高まることにも注意が必要です。そもそもこの制限が導入された背景には、コンテンツ変換の種類によってはCPUにそれなりの負荷がかかるということがあります。コンテンツ変換に制限を設けることで、その負荷を減らそうという狙いがあるわけですので、環境構築時にはその点に注意して制限を調整する必要があります。

また、エンタープライズ版のみですが、このコンテンツ変換自体を別サーバに外出ししてAlfrescoサーバの負荷を軽減することも可能です。Transformation Serverと呼ばれる機能ですが、詳細はAlfrescoのヘルプ(英語)を参照いただければと思います。ちなみにこの機能を使うと、OfficeファイルをMicrosoft Officeを使ってPDF変換することができるようにもなるため、PDF変換の精度が劇的に高まります(標準ではOpenOfficeを利用しているため、お世辞にも実用に耐える精度とは言えないのが実情です…)


最後に


今回は、コンテンツ変換についての説明と、簡単な使い方、注意点について説明しました。Transformation Serverについての詳細は今後記事にしていきたいと思いますので、引き続きよろしくお願いします。

Monday, July 30, 2012

Alfresco勉強会#8 振り返り

皆さんこんにちは。

先日行われた第8回Alfresco勉強会のご報告です。
普段は数名が簡単な発表を行う形式でしたが、今回は趣向を変えてみました。


  1. Alfrescoで実現したいことを出し合う
  2. こうすればできる、というものがあればその場で皆で回答し合う
  3. 残った幾つかのお題に対し、解決案を考えてみる。うまく行けば実装までやる。



このように進めようと思ったのですが、さすがに時間が足りなかったです。
しかし、お題(実現したいこと)を皆で出し合うということは
次回のネタにも困らないので非常に有益でした。

実際の内容ですが、1では次のような意見が出ました。

  • プログラム連携
  • UIのカスタマイズ自由度
  • 冗長構成
  • アクセス履歴
  • ワークフロー

プログラム連携とは、外部システムとの連携を意味しています。よくある話であり、当然のごとくAfrescoのようなECMには要求されるものです。保有しているコンテンツを異なるUIで表示したり、Liferayのような他のプラットフォームソフトウェア上でユーザに見せたりしたいという要望はよくあります。
UIのカスタマイズに関しては、当日出席していた弊社メンバがv4.0以降のAlfrescoについてそれほど知見を持ち合わせていなかったので良い意見は出せなかったです。
冗長構成も企業内システムとして考える場合には当然求められるものですね。次回あたりのネタにしようかと考えています。
アクセス履歴、ワークフローに関しても企業利用の場合にはよく言われます。事故に巻き込まれたくないので、私はワークフローにはあまり近づかないようにしています。

他にも意見はあったのですが、おおよそこのようなものを出し合いました。

2では1で出されたものに誰かが簡単に説明を行う、ということをしました。
3では

  • ワークフロー
  • アクセス履歴

を取り上げようとしていたのですが、ワークフローで時間を使ってしまいアクセス履歴の話には至りませんでした。主にActivitiとJBPMに関しての話が為されていました。

全体的にまとまらない話で終わった感がありますが、
お題を皆で出し合うことには意味があったのではないかと思います。
次回は何を発表しようか...


@mryoshio