Thursday, December 25, 2014

それ、CMISで繋げます(Liferay編その1)

CMISは文書管理リポジトリにアクセスするための仕様ですが、「CMIS対応しているっていうけど、何ができるの?」という質問を最近ときどき頂きます。

何ができるか、という質問に対する答えは、技術的な観点に限定しても、以下の2つの要素に分解できるでしょう。
・CMIS単体で提供される、文書管理機能のセット
・CMISによるシステム間連携

CMISは、連携、あるいはデータやサービスの相互運用性(interoperability)を主眼として策定されたもので、そのために文書管理機能としてはいろんなECMの最大公約数的な機能に絞られています。そういう意味では、CMISで実際にいろいろ繋いだものをお見せするのが、CMISのメリットを理解していただく早道かと思います。
(※最大公約数とはいえ、CMISの提供する文書管理機能にもある種のクセはあるのでその点は機会があれば別途)

 Liferayと繋いでみた

というわけで初回はLiferayと繋いでみましょう。
Liferayでは、そのCMS的な機能のバックエンドとして、バージョン6.1からCMISリポジトリをサポートしています。

ここではLiferay6.2を使用して、弊社製品であるCMIS対応の文書管理リポジトリであるNemakiWareに接続してみます。
NemakiWareを使う理由なのですが、単に弊社製品だからという商売っ気だけでなく、実際にCMIS仕様の遵守率が100%で、他ECMと比較しても現時点で1位にあるからです。
http://cmissync.org/CmisCompat/

NemakiWare自体のインストール・起動はまた別途ご紹介しますが、
インストーラのダウンロード:こちら
インストール・起動方法:こちら
になります。

CMIS接続のための設定は、LiferayのWiki(英語)を参照しました。
 
 

下準備

Liferay側での下準備として、ポータルのプロパティ(portal-ext.propertiesなど、プロパティの上書き機構に準ずる)に
session.store.password=true
company.security.auth.type=screenName 
と設定します。
 
この設定では、Liferay上のログインユーザ持つスクリーン名/パスワードが、CMISリポジトリにログインするためのユーザID/パスワードと一致している必要があります。
LiferayのUIからCMISリポジトリを操作することになるので、Liferayのログインユーザ情報がCMISリポジトリのログインユーザ情報として引き渡されるためです。
もしCMISリポジトリがLDAP認証などに対応していれば、ID/PWDは簡単に統一化できるでしょう。

ここではLiferay、NemakiWareともに、admin/adminユーザでログインするものとします。

リポジトリの追加

AdminメニューのContentを開きます。

左側のペインからDocument and Mediaを開き、AddボタンのドロップダウンメニューからRepositoryを選択します。


新規に追加するリポジトリのために、設定項目を入力します。
重要なのは
RepositoryType
CMISには接続方式として、WebService、AtomPub(およびBrowser)が定義されています。ここではAtomPubが推奨されています。
AtomPub URL
AtomPubで接続する場合のコンテキストURLを入力します。おつかいのCMISリポジトリによって当然異なります。なお、このURLを開こうとするとリポジトリ全体の情報を記述したxmlファイルがダウンロードできます。NemakiWareの場合はデフォルトで
http://localhost:8080/core/atom
です。
RepositoryID
省略可能です。
CMISサーバでは、一番大きな単位としてリポジトリがあり、1つのCMISサーバは複数のリポジトリを持てることになっています。ですが実際は「メイン」リポジトリが1つだけということも珍しくありません。
この値を省略すると、CMISサーバ側で設定されているメインリポジトリが自動的に選択される仕組みになっています。





最後にもう1つ、Permissionという設定項目がありますが、これはLiferay上で、このCMISリポジトリを見られるユーザを制限するものです。CMIS側の権限設定とは関係ありません。
値にはAnyone(Guest Role), Site Members, Ownerがあります。

以上、設定できたらSaveを押したら、リポジトリの追加完了です。

Liferayのスクリーン名/パスワードがCMISリポジトリのそれと一致していない場合は、エラーになります。上手く行かない場合はCMISリポジトリ側のエラーログを見てください。

コンテンツの表示

CMISリポジトリにあるコンテンツに、LiferayのUIからアクセスできることを確認してください。
ファイルに対して、コンテキストメニュー的なものも表示されていますね。
アクションとしてCheckoutも行えるようです。

Checkout時の挙動については、CMISリポジトリごとに微妙に揺れがあるので、また次回の話題とさせていただきます。

なお、画像にもあるようにリポジトリを追加すると"Access these files offline using Liferay Sync."というメッセージが表示されます。Liferay Syncの説明はここでは省きますが、オフラインのときにした編集でもDropboxライクに同期できる仕組みです。

CMISリポジトリに限っていえば、CMISインタフェースのレベルでCmisSyncというDropboxライクな同期ツールが既に存在していますので、そちらもご検討ください。と陰に陽に自社製品をご紹介させてもらいまして、今回の結びとさせていただきます。


(文:linzhixing)

Monday, December 22, 2014

Alfresco勉強会#25でAlfrescoのアップグレードについて発表しました

こんにちは、かわべです。
12月17日に弊社オフィスで第25回Alfresco勉強会が開催されました。
寒い中ご参加いただいた皆様、ありがとうございます!

発表振り返り

今回は発表が2つありましたが、発表ごとに別の記事としています。
私はAlfrescoのアップグレードについて発表しました。
発表資料はこちら

Alfrescoのアップグレードは、コンテンツ実体(ファイルシステム)とメタデータ(データベース)のコールドバックアップデータを新しいAlfrescoに移行することで実行できます。ただし、カスタムモジュールなどが移行対象のバージョンでも期待通り動作するか、事前に検証することも大切です。
という発表の最後に、デモとして4.2.fから5.0.cへのアップグレードをお見せした…の で す が!

うまくいきませんでした…
(3回ぐらい練習したのに…)

時間を掛けた割に、ちゃんとしたものをお見せできなくてすみませんでした。
検証したところ、SQLのdumpを書き戻すときにデータベース名を指定する部分を飛ばしてしまったようです。
あのあと一旦DBをドロップして、再作成してから書き戻すとちゃんと移行できました。
勉強会が終わるまでに解決できなかったのが心残りですが、資料の手順は間違っていないはずなので参考にしてみてください。

告知1

次回のAlfresco勉強会は2015年2月18日(水)に開催予定です。
たくさんの方のご参加をお待ちしております!参加登録はこちらからお願いします。
また、「こういうテーマの発表が聞きたい」などのご意見があれば、ぜひconnpassのフィードなどでご連絡ください。

告知2

こちらは勉強会ではなく、弊社セミナーのご案内です。
2015年1月20日(火) 19時〜20時、Alfrescoの基本的な機能や使い方についての少人数セミナーを開催いたします。
(勉強会の終わりではWebinarだとお伝えしてしまいましたが、弊社オフィスで行うようです)
詳細や申し込み、お問い合わせは以下のリンクからお願いします。
基礎からわかるAlfrescoセミナー
ご都合が合えば、こちらもぜひご参加ください。

Thursday, December 18, 2014

Alfresco勉強会#25でワークフローについて話しました

とたにです。

久しぶりにAlfresco勉強会でしゃべりました。
今回はAlfrescoのワークフローについて、どういった機能が用意されているのか、また新しくワークフローを追加するにはどんな作業が必要なのかを具体的にイメージしてもらえることをゴールにして、入門レベルの内容を準備しました。

ワークフローはAlfrescoの活用方法によっては重要な位置づけとなる機能ですが一方で全く利用するつもりのない方もいるので、勉強会の題材としては少しささる人が少ない、狭い話題を選んでしまったかも、という反省をしつつこのブログを書いています。

アドバンストワークフローでは最低限必要な2つのファイルのみを作って、Alfrescoにワークフローを追加する方法について説明したのですが、説明後に「もっと簡単にワークフローを開発する方法はありますか?」という質問を頂きました。アドバンストワークフローはactivitiというBPMエンジンを採用していてプロセスの記述能力は非常に高いのですが、その反面、開発者レベルのスキルが要求されるのも事実です。このあたりは勉強会で理解いただくというアプローチのほかに、手軽に利用できるワークフローのセットを公開して選択して使っていただく、というアプローチもいいかもしれないと思いました。

また日本型ワークフロー(という言葉があるかどうかは知らないですが)では、必ず期待される機能として承認フロー上の承認者としてユーザの上司を自動でアサインしたい、というものがあり、それについても質問されたのですが、標準のAlfrescoにはそのような組織モデルが実装されていないので実現するためには、Alfresco内もしくは外部にそのような組織モデルおよび取得のサービスを実装する必要があります。

第25回Alfresco勉強会ワークフロー入門編
サンプルコードはこちら

ワークフローの開発は細かいTipsがたくさんあるので応用編として書ける内容もまだまだあるのですが、やはり少し題材として狭いので勉強会で取り上げるかは現時点では未定です。他のネタが思いつかなければ取り上げるかもしれません。

Wednesday, December 17, 2014

Alfresco 5.0とActive DirectoryでNTLM SSOを設定する

こんにちは。おおたにです。今回はActive Directory(以下AD)と連携してAlfrescoでSSOを実現する方法を紹介したいと思います。


何が実現できるのか


AlfrescoとADのSSO設定を行うと、ADで管理された端末からユーザID/パスワードを入力することなくAlfrescoにアクセスできるようになります。

端末上のWindowsにログインする際に利用した認証情報(ADによって管理されているユーザに関するもの)を利用し、Alfrescoへのアクセス時に自動的に認証を行います。認証方法としてはNTLM v1とKerberosの2種類がありますが、以下ではNTLM v1を使ったSSOの設定手順を説明します。


必要なもの


以下の説明での前提条件、事前に準備が必要なものは以下のとおりです。なお、筆者はAlfresco 5.0.b、Windows Server 2012 (AD)、Windows 7 Professional (Client)という構成で動作確認を行いました。
  • Alfresco 5.0 (3.2以上であれば基本的に同様の手順で設定可能です)
  • Active Directoryサーバ
    • サーバ名もしくはサーバIP (ここでは kate とします)
    • ドメイン名 (ここでは aegif.local とします)
    • LDAPサービスでユーザ/グループ情報の取得権限を持つユーザ名 (ここではAdministrator を使います)
    • 上記ユーザのパスワード (ここでは thepassword とします)
    • ユーザ情報格納先のベースDN (ここでは cn=Users,dc=aegif,dc=local とします)
    • グループ情報格納先のベースDN (ここでは cn=Users,dc=aegif,dc=local とします)
    • ドメインに所属するクライアントPC(テストに利用します)

Alfrescoの設定


まずAlfrescoをダウンロード、インストールします。インストーラが提供されているのでインストール自体はそんなに難しくありませんが、こちらの記事が参考になると思います。インストールが完了したら、 ブラウザで http://localhost:8080/share にアクセスし、adminユーザでログインできることを確認しておいてください。

Alfrescoが正しくインストールされたら、alfresco-global.propertiesに以下の設定を追記します。

<tomcat_dir>/shared/classes/alfresco-global.properties :
authentication.chain=passthru1:passthru,ldap-ad1:ldap-ad,alfrescoNtlm1:alfrescoNtlm
ntlm.authentication.sso.enabled=true

ldap.authentication.active=false
ldap.authentication.userNameFormat=%s@aegif.local
ldap.authentication.java.naming.provider.url=ldap://kate:389

ldap.synchronization.active=true
ldap.synchronization.java.naming.security.principal=Administrator@aegif.local
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 * * * ?

passthru.authentication.useLocalServer=false
passthru.authentication.domain=aegif.local
passthru.authentication.servers=aegif.local\\kate
passthru.authentication.defaultAdministratorUserNames=Administrator

ドメイン名、サーバ名、LDAP認証情報、ベースDN等は環境に合わせて設定してください。以下、上記設定の説明です。
  • authentication.chain でAlfrescoログインのための認証チェーンを指定します。passthruがSSO認証、ldap-adがAD認証(ユーザ/パスワード入力タイプ)、alfrescoNtlmがAlfrescoが管理するユーザ情報での認証です。認証チェーンとは、複数の認証方式を連鎖させるもので、ここでは、SSO→AD認証→Alfresco認証の順に認証をトライします。
  • ntlm.authentication.sso.enabled=true でNTLM SSOが有効になります。
  • ldap.authentication.active=false でldap-adの認証機能を無効化し、ldap.synchronization.active=true でldap-adのユーザ/グループ同期機能を有効化します。
    • ここではAD認証自体は行わず、AD上のユーザ/グループ情報をAlfrescoに同期させる(定期的に差分情報をインポートする)ことのみを行います。
  • synchronization.import.cron で同期周期を設定します。デフォルトでは1日1回0時に実行されます(上記例では毎時0分に実行されます)。
  • passthru.authentication.useLocalServer でADサーバ上でAlfrescoが稼働しているか否かを指定します。falseの場合は passthru.authentication.domain, passthru.authentication.servers を指定する必要があります。
  • passthru.authentication.defaultAdministratorUserNames にAlfrescoの管理者権限を与えたいユーザ名を列挙します。

次に、share-config-custom.xmlの設定を変更します。デフォルトでは以下のSSO向けの設定がコメントアウトされていますので、コメントアウトのタグを外して設定を有効にします。

<tomcat_dir>/shared/classes/alfresco/web-extension/share-config-custom.xml :
   <config evaluator="string-compare" condition="Remote">
      <remote>
         <keystore>
             <path>alfresco/web-extension/alfresco-system.p12</path>
             <type>pkcs12</type>
             <password>alfresco-system</password>
         </keystore>
         
         <connector>
            <id>alfrescoCookie</id>
            <name>Alfresco Connector</name>
            <description>Connects to an Alfresco instance using cookie-based authentication</description>
            <class>org.alfresco.web.site.servlet.SlingshotAlfrescoConnector</class>
         </connector>
         
         <connector>
            <id>alfrescoHeader</id>
            <name>Alfresco Connector</name>
            <description>Connects to an Alfresco instance using header and cookie-based authentication</description>
            <class>org.alfresco.web.site.servlet.SlingshotAlfrescoConnector</class>
            <userHeader>SsoUserHeader</userHeader>
         </connector>

         <endpoint>
            <id>alfresco</id>
            <name>Alfresco - user access</name>
            <description>Access to Alfresco Repository WebScripts that require user authentication</description>
            <connector-id>alfrescoCookie</connector-id>
            <endpoint-url>http://localhost:8080/alfresco/wcs</endpoint-url>
            <identity>user</identity>
            <external-auth>true</external-auth>
         </endpoint>
      </remote>
   </config>

以上でAlfrescoの設定は終わりです。設定を反映させるため、Alfrescoを再起動します。


Active Directoryサーバの設定


次に、ADサーバ上での設定を行います。AlfrescoのNTLM SSOはNTLMv1だけでNTLMv2に対応していないため、AD配下のクライアントのLAN Manager認証レベルを変更する必要があります(セキュリティレベルを落としたくない場合はKerberos認証の利用をお勧めします)。

まずは、Win+R を押して gpmc.msc を実行します。「グループポリシーの管理」コンソールが起動するので、目的のドメインのデフォルトグループポリシーを編集します。


以下のエディタが表示されるので、コンピューターの構成→ポリシー→Windowsの設定→セキュリティの設定→ローカルポリシー→セキュリティオプションをクリックし、「ネットワークセキュリティ:LAN Manager認証レベル」をダブルクリックします。


以下のダイアログが表示されるので、「このポリシーの設定を定義する」にチェックを入れて、「LMとNTLMを送信する(ネゴシエートした場合NTLMv2セッションセキュリティを使う)」を選択してOKをクリックします。


以上でADサーバ上での設定は完了です。


クライアントPCの設定


以下の設定は全てのクライアントPCで設定する必要があります。クライアントのログイン情報をAlfrescoに渡すためには、AlfrescoのURLがイントラネットゾーン判定される必要があるため、インターネットオプションのセキュリティ設定にAlfrescoのURLを追加します。

Internet Explorerのインターネットオプションを開き、ローカルイントラネットにAlfrescoのURLを追加します。HTTPでアクセスする場合は「このゾーンは…」のチェックを外します。



テストしてみよう


では、ADユーザでログインしたクライアントPCを利用し、Alfrescoにアクセスしてみましょう。先ほどイントラネットゾーンに追加したURLを使ってアクセスしてください(先のスナップショットの例ですと、http://alfresco.aegif.jp:8080/share となります)。ログイン画面が表示されず、直接ダッシュボード画面が表示されればテスト成功です。


トラブルシューティング



うまくいかない場合は以下のことを試してみてください。
  • alfresco.log, catalina.out等に出力されているExceptionを確認してみる
  • ユーザ/グループの同期が正常に行われているか(AD上のユーザ/グループがAlfresco上にも生成されているか)を確認してみる
  • LDAPクライアントを使ってユーザ/グループの検索ベースDNを実際に確認してみる
  • passthru.authentication.domain, passthru.authentication.servers あたりのプロパティ値から.localを省略してみる

今回の紹介は以上です。AD環境がある場合は是非ADとの連携、SSO設定を試してみてください。

Wednesday, December 10, 2014

CmisSync on Raspberry Pi: The Internet of Things meets document management

Raspberry Pi is a tiny board (the size of a credit card) that allows you to create any kind of robot or fun hardware:


Examples:
- Santa detectors
- Sandwich carriers
- Ultra-cheap laptops (UNICEF)
- Industrial robots
- Audit sensors

And guess what? CmisSync runs on Raspberry Pi!
CmisSync is a file synchronization tool compatible with any document management server (Alfresco/SharePoint/FileNet/Documentum/etc) thanks to the CMIS protocol.
Imagine for instance a tiny sensor measuring air pollution and sending a weekly report directly to your document server over Wi-Fi.

A South African company is already embedding CmisSync in office scanners, so that scanned documents get automatically synchronized to Alfresco or another ECM server:




Compare that with the pain it is to achieve the same thing using a normal scanner, and you can easily feel the need for such intelligent hardware based on open standards.

Raspberry Pi + CmisSync can also be used in environments with no permanent network connection, for instance fleets of trucks travelling in uncovered areas and sending reports (load/unload/sleep) when network becomes available. CmisSync makes the Internet of Things survive Internet cuts.
Nicolas Raoul

Tuesday, November 25, 2014

Alfresco 5.0とSolr 4を手動インストールしてみた(Alfresco 5.0.b以降)

こんにちは。大谷です。

以前、「Alfresco4.2をインストールしてみよう(手動インストール編)」という記事を書いたのですが、先ごろリリースされたAlfresco Community 5.0.bで構成に大きな変更があったので、改めて手動インストールの方法を紹介しようと思います。

※ なお、インストーラを利用したインストールは以前と変わっていませんので、「Alfresco4.0をインストールしてみよう(インストーラ編)」を参照してください。インストーラを使うとウィザードに沿っていくつかの設定項目を入力するだけでAlfrescoがインストールできますので、てっとり早く試してみたい場合はインストーラの利用をお勧めします。

「大きな変更」とはSolr 4への対応のことで、これまでの手順に加えてSolr 4のセットアップが新たに必要になりました。これまでは検索エンジンとしてLuceneを使ったインストール手順を紹介していましたが、Alfresco Community 5.0.bからはLuceneをサポートしなくなっています。なお、本記事では以下のような構成を想定しています。
  • OS : Windows
  • Java : JDK7
  • Alfresco : Alfresco Community 5.0.b
  • アプリケーションサーバ : Tomcat 7
  • RDBMS : MySQL Community Server 5.6
  • Solr 4はAlfrescoと同じTomcatインスタンス上にデプロイ
  • Alfresco - Solr間は非SSL通信


JDKのインストール


  1. こちらのサイトからJDK7をダウンロードします。Alfresco 5.0ではJDK7が必要になります。
  2. ダウンロードしたファイルを実行し、JDKをインストールします。


Tomcatのインストール


  1. Alfresco用のディレクトリを作成します。ここでは、Cドライブ直下にalfresco50bというディレクトリを作成し、以下ではALF_HOMEと表記します(ALF_HOME = C:/alfresco50b)。
  2. Apache TomcatのサイトからTomcat 7をダウンロードします。
  3. ダウンロードしたファイルをALF_HOMEに展開します。展開するとALF_HOME以下にapache-tomcat-<バージョン番号>という名前のディレクトリが作成されますので、このディレクトリをTOMCAT_HOMEと表記します(TOMCAT_HOME = C:/alfresco50b/apache-tomcat-7.0.xx)。


MySQLのインストール


  1. MySQL Developer ZoneからMySQL Community Server 5.6をダウンロードし、インストールします。また、後ほど利用するMySQL Connector/J 5.1(JDBCドライバ)をここからダウンロードします。


Tomcatの設定


  1. Alfresco Community Editionのダウンロードサイトにアクセスし、Alfresco 5.0.b Community -> alfresco-community-5.0.b.zipをダウンロードします。
  2. ダウンロードしたファイルを適当なディレクトリに展開します。このうち、alf_data, amps, bin, solr4ディレクトリをALF_HOMEにコピーし、web_serverディレクトリの中身をTOMCAT_HOMEにコピーします(webapps等既存フォルダへのファイル追加も行われます)。
  3. JDBCドライバをTomcatのクラスパスに配置します。先ほどダウンロードしたMySQL Connector/Jを展開し、mysql-connector-java-5.1.xx-bin.jarを<TOMCAT_HOME>/libにコピーします。
  4. Tomcatの設定を変更します。<TOMCAT_HOME>/conf/catalina.properties のshared.loaderプロパティを以下のように変更します。
  5. shared.loader=${catalina.base}/shared/classes,${catalina.base}/shared/lib/*.jar
  6. <TOMCAT_HOME>/conf/server.xml の8080番ポートのConnector設定を以下のように変更します。AJPを利用する場合は8009番についてもURIEncoding設定を追加します。
  7. <Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
               connectionTimeout="20000"
               redirectPort="8443" />
  8. <TOMCAT_HOME>/bin/catalina.bat に以下の行を追加してJVMの設定を変更します。JRE_HOMEや最大/最小ヒープサイズ等はPCの設定・スペックに応じて変更してください。alfresco.homeは<ALF_HOME>のパスを指定します。
  9. set JRE_HOME=C:\Program Files\Java\jdk1.7.0_xx\jre
    set JAVA_OPTS=-Xms1024m -Xmx2048m -XX:MaxPermSize=512m -server -Dalfresco.home=C:/alfresco50b -Dcom.sun.management.jmxremote
  10. <ALF_HOME>/solr4/context.xml を <TOMCAT_HOME>/conf/Catalina/localhost/solr4.xml にリネーム/コピーし、環境変数の値を環境に応じて設定します。
  11. <Environment name="solr/home"        type="java.lang.String" value="C:/alfresco50b/solr4" override="true"/>
    <Environment name="solr/model/dir"   type="java.lang.String" value="C:/alfresco50b/alf_data/solr4/model" override="true"/>
    <Environment name="solr/content/dir" type="java.lang.String" value="C:/alfresco50b/alf_data/solr4/content" override="true"/>


データベースの作成


Alfrescoはコンテンツのメタデータをデータベースで管理し、コンテンツのファイル実体をファイルシステムで管理します。データベースについてはAlfrescoが起動時に必要なテーブルを自動生成するため、まずはデータベース(とユーザ)を作成しておくだけで構いません。
  1. コマンドプロンプトで以下のコマンドを実行し、MySQLにログインします。
  2. mysql -u root -p
  3. 以下のコマンドでMySQLにAlfresco用のデータベースを作成します。この例では、データベース名をalfrescoとし、ユーザ名/パスワードもalfresco/alfrescoとなります。
  4. create database alfresco default character set utf8 collate utf8_bin;
    grant all on alfresco.* to 'alfresco'@'localhost' identified by 'alfresco' with grant option;


Solrの設定


  1. <ALF_HOME>/solr4/workspace-SpacesStore/conf/solrcore.properties と <ALF_HOME>/solr4/archive-SpacesStore/conf/solrcore.properties のdata.dir.rootプロパティ(インデックス格納先)とalfresco.secureCommsプロパティ(SSL通信か否か)を以下のように変更します。パスは環境に応じて変更してください。
  2. data.dir.root=C:/alfresco50b/alf_data/solr4/index
    alfresco.secureComms=none


外部ツールのインストール


次に、Alfrescoが利用する外部ツールのインストールを行います。ここではLibreOffice, ImageMagick, Ghostscript, SWFTools(pdf2swf)について説明します。この4つのツールの用途は以下のとおりですので、必要に応じてインストール、設定を行ってください。
  • LibreOffice : Alfrescoでファイルフォーマット変換を行う際に使います。PDF変換機能などを利用する場合に設定する必要があります。(手元の環境では少し古い4.1.0.4を利用)
  • ImageMagick : コンテンツのサムネイルやプレビューを生成する際に使います。(手元の環境では6.8.6.9を利用)
  • Ghostscript : ImageMagickが間接的に利用します。(手元の環境では9.10を利用)
  • SWFTools : 一部コンテンツのプレビューを生成する際に使います。(手元の環境では0.9.0を利用)


Alfrescoの設定


続いて、Alfrescoの設定を行います。大きく分けると、データベース接続設定、ファイルシステムの設定、外部ツール連携設定の3つがあります。
  1. <TOMCAT_HOME>/shared/classes/alfresco-global.properties.sample をalfresco-global.propertiesにリネームします。以下のプロパティ設定は全てalfresco-global.propertiesに行います。
  2. データベース接続設定、ファイルシステムの設定について、以下のように設定します(全てデフォルトでコメントアウトされているので、コメントアウトを外して環境に合わせて設定変更してください)。
  3. #
    # Sample custom content and index data location
    #
    dir.root=C:/alfresco50b/alf_data
    
    #
    # Sample database connection properties
    #
    db.username=alfresco
    db.password=alfresco
    
    #
    # MySQL connection
    #
    db.driver=org.gjt.mm.mysql.Driver
    db.url=jdbc:mysql://localhost/alfresco?useUnicode=yes&characterEncoding=UTF-8
  4. 検索エンジンとしてSolr 4を使い、Alfrescoとの通信を非SSL化するために以下の設定を追記します。
  5. index.subsystem.name=solr4
    solr.secureComms=none
  6. 外部ツールとの連携について、環境に合わせて以下のように設定します(コメントアウトされているものもあるので適宜コメントアウトを外すなりして設定変更してください)。
  7. ooo.exe=C:/Program Files (x86)/LibreOffice 4/program/soffice
    ooo.enabled=true
    img.root=C:/Program Files/ImageMagick-6.8.6-Q16
    img.exe=${img.root}/convert.exe
    img.gslib=C:/Program Files/gs/gs9.10/lib
    swf.exe=c:/SWFTools/pdf2swf.exe


Alfrescoの初回起動と追加の設定


最後に、一度Alfrescoを起動してWARファイルを展開し、その展開されたファイルの設定を修正します。
  1. <TOMCAT_HOME>/bin/startup.bat を実行してAlfrescoを起動します。
  2. コンソールの出力内容(もしくはalfresco.logやcatalina.out)をチェックします。初回起動時はデータベースにテーブルを追加する作業やwarファイルを展開する作業がありますので時間がかかりますが、最終的にはExceptionが断続的に出力される状態となります(一部SSL通信の設定が残っているため)
  3. <TOMCAT_HOME>/bin/shutdown.bat を実行してAlfrescoを停止します。
  4. <TOMCAT_HOME>/webapps/alfresco/WEB-INF/web.xml を編集し、SSL設定に関する以下の箇所をコメントアウトします。
  5. <security-constraint>
       <web-resource-collection>
          <web-resource-name>SOLR</web-resource-name>
          <url-pattern>/service/api/solr/*</url-pattern>
       </web-resource-collection>
    
       <auth-constraint>
          <role-name>repoclient</role-name>
       </auth-constraint>
    
       <user-data-constraint>
          <transport-guarantee>CONFIDENTIAL</transport-guarantee>
       </user-data-constraint>
    </security-constraint>
    
    <security-constraint>
       <web-resource-collection>
          <web-resource-name>SOLR</web-resource-name>
          <url-pattern>/s/api/solr/*</url-pattern>
       </web-resource-collection>
    
       <auth-constraint>
          <role-name>repoclient</role-name>
       </auth-constraint>
    
       <user-data-constraint>
          <transport-guarantee>CONFIDENTIAL</transport-guarantee>
       </user-data-constraint>
    </security-constraint>
    
    <security-constraint>
       <web-resource-collection>
          <web-resource-name>SOLR</web-resource-name>
          <url-pattern>/wcservice/api/solr/*</url-pattern>
       </web-resource-collection>
    
       <auth-constraint>
          <role-name>repoclient</role-name>
       </auth-constraint>
    
       <user-data-constraint>
          <transport-guarantee>CONFIDENTIAL</transport-guarantee>
       </user-data-constraint>
    </security-constraint>
    
    <security-constraint>
       <web-resource-collection>
          <web-resource-name>SOLR</web-resource-name>
          <url-pattern>/wcs/api/solr/*</url-pattern>
       </web-resource-collection>
    
       <auth-constraint>
          <role-name>repoclient</role-name>
       </auth-constraint>
    
       <user-data-constraint>
          <transport-guarantee>CONFIDENTIAL</transport-guarantee>
       </user-data-constraint>
    </security-constraint>
    
    <login-config>
       <auth-method>CLIENT-CERT</auth-method>
       <realm-name>Repository</realm-name>
    </login-config>
    
    <security-role>
      <role-name>repoclient</role-name>
    </security-role>
  6. <TOMCAT_HOME>/webapps/solr4/WEB-INF/web.xml を編集し、SSL設定に関する以下の箇所をコメントアウトします。
  7. <security-constraint>
        <web-resource-collection>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>repository</role-name>
        </auth-constraint>
        <user-data-constraint>
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
    </security-constraint>
    
    <login-config>
        <auth-method>CLIENT-CERT</auth-method>
        <realm-name>Solr</realm-name>
    </login-config>
    
    <security-role>
       <role-name>repository</role-name>
    </security-role>


動作確認


以上で設定は完了です。Alfrescoを起動して動作確認してみましょう。
  1. <TOMCAT_HOME>/bin/startup.bat を実行してAlfrescoを起動します。
  2. コンソールの出力内容(もしくはalfresco.logやcatalina.out)をチェックします。正常に起動すると、コンソールもしくはログに"Server startup in xxxxxx ms"と表示されます。
  3. 、ブラウザで http://localhost:8080/share にアクセスします。管理者ユーザのデフォルトユーザ名/パスワードは、admin/adminになりますのでそれを入力します。

  4. ログインに成功し、ユーザダッシュボード画面が表示されたら動作確認完了です!

  5. 念のため、Solrにもアクセスしてみましょう。URLは http://localhost:8080/solr4 です。以下の画面が表示されたらOKです。

以上がAlfresco 5.0(5.0.b以降)をインストールする手順となります。本番環境構築の際には、Solr 4の別建てやAlfresco - Solr間のSSL化など、さらに考慮する必要のある事項がありますが、本質的にはこの手順でいけると思います。

Alfresco 5.0の新機能については本ブログの記事「Alfresco 5.0.bの機能紹介」をチェックしてみてください。また、基本的な使い方については「Alfresco 4.2の使い方 - ユーザ管理・グループ管理」、「Alfresco 4.2の使い方 - リポジトリとサイトの準備をしよう」あたりが参考になるかと思いますので是非ご一読ください。

Tuesday, November 18, 2014

Alfrescoでリアルタイムウイルススキャンを実装する


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

今回は、Alfrescoでファイルアップロード時にウイルススキャンを行うようなカスタムモジュールを作ってみたいと思います。想定している環境は、以下のとおりです。Alfrescoについては、多分このままもしくは多少の修正で5.0.xでも動くと思います。
  • Alfresco : Alfresco Community Edition 4.2.f
  • OS : CentOS 6系
  • ウイルススキャンツール : Clam AntiVirus


準備


まずは、AlfrescoとClam AntiVirusをインストールします。AlfrescoのインストールはAlfresco4.0をインストールしてみよう(インストーラ編)Alfresco4.2をインストールしてみよう(手動インストール編)あたりを参考にしてください。

次に、Clam AntiVirusをインストールします。CentOSへのインストールはこちらの記事が参考になります。基本的にはファイルアップロードのタイミングでスキャンコマンドを実行するだけなので、自動起動や定期実行の設定は必要ありません。clamscanコマンドがパス指定なしで実行できるようになっていればOKです。


カスタムモジュールの開発


では、早速コードを見てみましょう。今回作ったコード/設定ファイルは以下の4つになります。なお、サンプルコードはこちらからダウンロードすることができます。
  • VirusScanActionExecuter.java : ウイルススキャン処理の実装
  • VirusDetectException.java : ウイルス検知時に投げるException
  • VirusScan.java : OnContentUpdatePolicyを利用したコンテンツ実体更新フック
  • alfresco-virusscan-sample-context.xml :VirusScanActionExecuterとVirusScanのSpring bean定義ファイル

VirusScanActionExecuter.java

ウイルススキャン処理を、ActionExecuterとして実装します。ActionExecuterとして実装するとActionServiceから名前を指定するだけで処理をキックできるため、Alfresco内での再利用性が高まります。具体的には、ActionExecuterAbstractBaseのexecuteImplに処理を実装します。

public class VirusScanActionExecuter extends ActionExecuterAbstractBase {
...
    @Override
    protected void executeImpl(Action action, NodeRef nodeRef) {
        String fileName = (String) fileFolderService.getFileInfo(nodeRef).getName();
        LOGGER.debug("Virus scan start : " + fileName);

        // Output content to temporary file
        ContentReader contentReader = contentService.getReader(nodeRef, ContentModel.PROP_CONTENT);
        File targetFile = null;
        try {
            targetFile = TempFileProvider.createTempFile(contentReader.getContentInputStream(), "virusscan_", ".bin");
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }

        // Execute virus scan
        Map<String, String> properties = new HashMap<String, String>();
        properties.put("target", targetFile.getAbsolutePath());
        ExecutionResult result = virusScanCommand.execute(properties);

        // Check result and delete infected file.
        int exitValue = result.getExitValue();
        if (exitValue == 0) {
            LOGGER.debug("Virus not detected : " + fileName);
        } else if (exitValue == 1) {
            fileFolderService.delete(nodeRef);
            throw new VirusDetectException("Virus detected and cleaned up : " + fileName);
        } else {
            LOGGER.error("Unable to scan : " + result);
        }
    }
...
}

VirusScan.java

OnContentUpdatePolicyを利用して、コンテンツ実体更新時(正確にはそのトランザクションのコミット時)にウイルススキャン処理をキックします。

public class VirusScan extends TransactionListenerAdapter implements OnContentUpdatePolicy, InitializingBean {
...
    @Override
    public void onContentUpdate(NodeRef nodeRef, boolean newContent) {
        if (!nodeService.getType(nodeRef).equals(ContentModel.TYPE_CONTENT) || nodeService.getProperty(nodeRef, ContentModel.PROP_CONTENT) == null) {
            return;
        }
        AlfrescoTransactionSupport.bindListener(this);
        AlfrescoTransactionSupport.bindResource(NODE_KEY, nodeRef);
    }

    @Override
    public void beforeCommit(boolean readOnly)
    {
        final NodeRef nodeRef = AlfrescoTransactionSupport.getResource(NODE_KEY);
        String fileName = (String) nodeService.getProperty(nodeRef, ContentModel.PROP_NAME);

        LOGGER.debug("beforeCommit start : " + fileName + ", readonly : " + readOnly);
        actionService.executeAction(actionService.createAction("virus-scan-action"), nodeRef);
        LOGGER.debug("beforeCommit end : " + fileName);
    }
}

alfresco-virusscan-sample-context.xml

上記2つの実装をSpring beanとして定義します。VirusScanActionExecuterはvirus-scan-actionという名前で登録し、Java APIやJavaScript API、REST APIからこの名前でウイルススキャン処理を実行できるようになります。

コマンドの中身はLinux用になっているのでOSに応じて変更もしくはOSごとに指定してください。

<bean id="virus-scan-action" class="jp.aegif.alfresco.sample.action.executer.VirusScanActionExecuter" parent="action-executer">
   <property name="contentService">
      <ref bean="ContentService" />
   </property>
   <property name="fileFolderService">
      <ref bean="FileFolderService" />
   </property>
   <property name="virusScanCommand">
      <bean class="org.alfresco.util.exec.RuntimeExec">
         <property name="commandsAndArguments">
            <map>
               <entry key=".*">
                  <list>
                     <value>clamscan</value>
                     <value>--stdout</value>
                     <value>--no-summary</value>
                     <value>${target}</value>
                  </list>
               </entry>
            </map>
         </property>
      </bean>
   </property>
</bean>


テストしてみよう


では、カスタムモジュールを適用し、ウイルススキャン機能をテストしてみましょう。

JavaクラスファイルはalfrescoVirusScanSample.jarなどにパッケージングして<tomcat_dir>/webapps/alfresco/WEB-INF/lib/にコピーし、alfresco-virusscan-sample-context.xmlは<tomcat_dir>/shared/classes/alfresco/extension/にコピーします。もちろんAlfrescoを再起動する必要があります。

そして、クライアントPCはリアルタイムスキャンが無効になっていることを確認します。クラ イアントPCにリアルタイムスキャンが設定されていると、テスト用のウイルスファイルが自動除去されてしまってテストができません。そして、テスト用のウイルスファイルをこちらからダウンロードしておきます。

Alfrescoが起動したら、Alfrescoにログインして先ほどのテスト用ウイルスファイルをアップロードします。以下のようにアップロードに失敗し、ウイルスが検知された旨が表示されればOKです。


さらに、catalina.out等のログにはVirusDetectExceptionが出力されているはずです。

ERROR [extensions.webscripts.AbstractRuntime] [http-bio-8080-exec-19] Exception from executeScript - redirecting to status template error: 10120029 Virus detected and cleaned up : eicar.com.txt
 jp.aegif.alfresco.sample.action.executer.VirusDetectException: 10120029 Virus detected and cleaned up : eicar.com.txt
 at jp.aegif.alfresco.sample.action.executer.VirusScanActionExecuter.executeImpl(VirusScanActionExecuter.java:68)
 ...

まとめ


テストはうまくいきましたでしょうか?以上でウイルススキャンを行うカスタムモジュールの基本的な部分ができたかと思います。実際に利用するにあたっては、さらに以下のようなことを考慮する必要があるかもしれません。
  • 1トランザクションで複数のファイル(ノード)が作成されるような場合には対応していない
    • ウイルススキャンアクション呼び出し部分に工夫が必要
  • clamscanはパフォーマンスが良くない
    • ウイルス定義を予めメモリに展開しておくclamdscanの利用
    • Clam AntiVirus以外のウイルススキャンツールの利用
  • ファイルアップロード時ではなく、アクションメニューから手動で実行したい
    • ウイルススキャンをActionExecuterとして実装しているので簡単に実現できます(何人かが既に実装して公開しています) 

Wednesday, November 12, 2014

Alfresco 5.0.bの機能紹介

こんにちは、かわべです。先日会社の人たちとサバイバルゲームをしました。初体験だったのですがとても楽しかったですし、もっと痛いのかと思いきや顔も体もちゃんと防護されているので意外と平気でした。「痛くないので撃たれたのかどうかよくわかりません」とスタッフさんに言ったら、「それは相手も同じなので、なるべく顔を狙ってあげてください」と笑顔で言われたのが印象的です。(ゲームの終盤になっても狙った場所を打てるような余裕は生まれませんでしたが…)

さて、本日はAlfresco 5.0.bでの追加機能について紹介します。Alfresco 5.0.bがリリースされたのは2014年10月なので少し遅くなってしまいましたが、気にせずいきましょう。記事を作成するにあたってはMac OS X 10.9.5にインストーラを利用してインストールしたAlfresco Community Edition 5.0.bを使用しています。

5.0.aがリリースされた際にも当ブログで新機能の紹介を行い、その際に4.2系と比較して主に「検索」と「プレビュー」が強化されたという風にご紹介しました。5.0.bではこの2点のさらなる強化が見られます。まずはこちらから確認していきましょう。

検索機能の強化(サジェスト、スペルチェック)

5.0.bにおける最大の変化として、インストーラに同梱されるSolrのバージョンが4系になりました(5.0.aの段階ではSolr1.4でした)。Solrのバージョンが上がったことによって、5.0.aで実装された検索フィルタはより高速になり、さらに管理者によって設定を変更・追加できるようになりました。

検索結果右上の「検索マネージャ」をクリックすると、フィルタの管理画面に移動できます。



新規フィルタの作成画面はこんな感じです。フィルタ対象を細かく指定できるようになっています。

検索結果に対してフィルタを適用する場合にはURLが変わるので、よく使う検索条件をブックマークして使用することもできます。

入力途中での予測検索の性能も向上しました。5.0.aと比較するとスマートな表示となっています。



検索結果から続けて検索を行う場合に、入力途中の単語と一致する言葉を存在するコンテンツの名前や内容からサジェストする機能も追加されました。


検索結果が見つからないワードで検索した場合には、自動的に置換したワードで検索をする機能も備わりました。

 

検索結果でのプレビュー

検索結果のページから移動することなく文書をプレビューすることが可能になりました。検索結果のサムネイルをクリックするとプレビュー画面が立ち上がります。このプレビュー画面内での検索もできます。


検索結果に対するアクション実行機能の実装と合わせて、検索がより使いやすくなりました。

その他に追加された機能も少し見てみましょう。

 

アクティビティの記録

ユーザのアクティビティとして「プレビュー」と「ダウンロード」も記録され、ダッシュレットに表示されるようになりました。これまでと比較すると件数が増えてしまうため、類似アクティビティは纏めて折りたたみ表示されるようになりました。

 

新しいサイトダッシュレット

サイトの利用状況の分析に役立つ2つの新しいダッシュレットが追加されました。サイトのファイルの種類、特定の期間のコントリビュータの内訳をわかりやすいグラフで表示してくれます。今後はこのような分析機能もより強化されていくようなので、こちらも期待です。


 

注意点

便利になった5.0.bですが、削除された機能もいくつかあります。Alfresco Explorerクライアント(いわゆるShareでない旧UI画面)はこのバージョンから利用できなくなりました。
また、当記事で触れたように検索機能が強化されたのですが、インデックスシステムとしてluceneを利用するとこれらの機能を完全に利用することはできません。
詳しくはリリースノートをご覧ください。

 

まとめ

これまでのバージョンを知っている方も知らない方も、ぜひAlfresco 5.0.bをインストールしてこれらの機能を試してみてください。また、今後のAlfresco勉強会でも5.0.bを題材とする回があると思いますので、もっと知りたい方はぜひご参加ください。

Monday, October 20, 2014

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

こんにちは。てらしたです。最近社内でも緑と青の陣営に分かれて戦う例のゲームが流行ってきています。が、ハマり過ぎると家庭が壊れる未来が容易に想像できるのであえてのんびりやるようにしています。同時期に始めた同僚ははるかに先に進んでいますが、まだ家庭が壊れている人はいないようです。今のところは。

さて、先週10/15(水)に第24回Alfresco勉強会が開催されました。
ここ何回かの勉強会と同じように、今回も参加者の方がAlfrescoに興味はあるけどまだ使っていないという状況だったので、前半は弊社のカワベが画面をお見せしながら機能や基本的な使い方について説明しました。こういう使い方はできるか、とか、どのように使われているか具体的な事例を教えてほしい、といった質疑応答も活発に行われて、気付けば1時間近く経過していました。思ったよりサクサク動くしUIもよくできているという感想もいただけたので、こちらの記事スライドなどを参考にしてぜひ一度使ってみていただければと思います。

そして後半は私がAlfrescoのコンテンツのライフサイクルについて発表しました。

コンテンツのライフサイクル

発表資料はこちら

Alfresco ShareのUIからコンテンツを作成 → 削除 → ごみ箱から削除 という操作を行った時に、裏側のファイルシステムやDB、インデックスはどうなっているのか、という内容です。普段はあまり意識することはないのですが、Alfrescoを導入して運用していく上で管理者の方は知っておいた方がいい内容だと思います。バックアップからのリストアや、削除されたコンテンツのファイル実体をファイルシステムから削除して容量を空ける、といったことをやる時に必要になる知識です。一連の流れをファイルシステム、DB、インデックスの中身を見ながら通していただくと、Alfrescoでコンテンツがどのように管理されているのかについての理解が深まると思います。

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

Wednesday, October 15, 2014

iplus1: Enrich your existing flashcards deck with new example sentences written by bilinguals


You already know all your language-learning flashcards by heart, and want new study material?
How about adding to your deck a dozen new sentences, written by bilingual people, and that match your current level?

Tatoeba is a community-maintained database of example sentences. For example:
  • 散歩しましょう。 (Japanese)
  • Let's take a walk. (English)
  • Давай прогуляемся. (Russian)
  • Bir yürüyüş yapalım. (Turkish)

iplus1 allows you to enrich your flashcards deck with sentences from Tatoeba.
Chosen sentences are those that you will like to learn: they contain words that you already know, plus one new word.

iplus1 has been developed by an American student under my mentoring, as part as a Google Summer of Code project of Tatoeba. iplus1 is open source and works fine on test servers with Anki decks, expect to see it go live soon!

Wednesday, October 8, 2014

Aegif joins the Open Invention Network

Today, Aegif has joined the Open Invention Network, following 1000 other companies like Google, IBM, RedHat, Twitter.

Besides the big names, many of the Open Invention Network members operate in the same realm as Aegif:
- Alfresco
- Liferay
- Magnolia
- Moodle
- OpenBravo
- OpenStack
- Salesforce.com
- SugarCRM
- The Document Foundation

All of these organizations have pledged to not use their patent portfolio to extort money from Linux users. The pledge actually covers Linux and a few hundred Open Source packages (details).

Aegif believes that using patents against Open Source software is harmful to innovation.
Rather than patent litigation, we believe that openness is the best way to perform business in the software field.

Friday, September 5, 2014

Alfresco Community 5.0の検索BOXとIMEの相性が悪い

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

Alfresco Community 5.0.aの検索BOX(画面右上の検索ツール)ですが、4.2系から若干仕様が変わり、日本語IMEとの相性が悪いようです。具体的には、日本語変換を確定させる時にEnterキーを押すと、そのまま検索が実行されてしまいます。検索文字列を追加入力できず、とても不便です。なお、この現象はChromeでは起きず、IE、Firefoxでのみ発生します(Safariでも起きるかもしれないです)。

原因は、検索BOXのキー入力イベントの拾い方にあるようです。Alfrescoのコードを見てみると、4.2系ではEnterキーのkeydownを拾って検索を行っているのですが、5.0.aではkeyupを拾うようになっています。IMEでの日本語変換確定時のイベント発火はブラウザによって異なりますが(詳しくはこちら)、この結果として一部のブラウザで日本語変換確定時に検索も実行されてしまうようです。

これを直すには、従来のようにEnterキーのkeydownで検索を行うようにすればよいので、当該箇所(SearchBox.jsの255目くらい)を以下のように修正します。また、このSearchBox.jsを圧縮したSearchBox-min.jsも新しく作り直します。オンラインのJavaScript圧縮サービスなどを利用してください。修正部分はクライアントサイドJavaScript(静的ファイル)なので、Alfrescoの再起動は必要ありません(ブラウザのキャッシュクリアくらいは必要かも…)。

<tomcat_dir>/webapps/share/js/alfresco/header/SearchBox.js
...
DomAttr.set(this._searchTextNode, "id", "HEADER_SEARCHBOX_FORM_FIELD");
DomAttr.set(this._searchTextNode, "placeholder", this.message("search.instruction"));
// on(this._searchTextNode, "keyup", lang.hitch(this, function(evt) {
on(this._searchTextNode, "keydown", lang.hitch(this, function(evt) {
   this.onSearchBoxKeyUp(evt);
}));
...

これでChrome以外のブラウザでも日本語変換確定時に検索が行われないようになりましたでしょうか。keyupをkeydownに変更することによる副作用はまだ詳しく調査していませんが、ひとまずはこの修正で様子を見てみようと思います。

Monday, September 1, 2014

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

こんにちは。てらしたです。ちょっと報告が遅くなってしまいましたが、先日8/24(水)に第23回Alfresco勉強会が開催されました。
今回は参加者の方がまだあまりAlfrescoを触っていないとのことだったので、用意していたWorkdeskの検索テンプレートの作り方の発表は再度保留にして、より入門的な内容の発表のみにしました。Workdeskについては次回、ある程度Alfrescoを使っていてカスタマイズ等にも興味がある参加者が多い場合にご紹介したいと思います。とはいえ今回のように初心者の方が多い可能性もあるため、入門っぽい内容のものも用意しておこうかなと考えています。

Alfresco Community 5.0をインストールする

発表資料はこちら

Community Editionの最新版である5.0.aのインストーラを配布し、実際に手元の環境にインストールして起動してみよう、という内容で弊社の大谷の発表でした。Windowsの場合にハマるポイントと解決方法の紹介があったり、最後に余談として5.0の新機能の紹介もあったり、Alfresco初心者の方への内容としては非常によかったのではないかと思います。

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

Wednesday, August 27, 2014

The CmisSync context menu: Check out documents, modify metadata

Context: CmisSync synchronizes documents between Alfresco and your PC:


NEW: We implemented a CmisSync context menu for Windows Explorer:


From this context menu, you can check out a document.
This will lock the document for you, so that you can edit it:




The same dialog also allows you to view metadata of the document:



You can modify the metadata, even when offline. It will be synchronized as soon as you are back online.

The document's history is also visible:



The CmisSync context menu is part of CmisSync Business, which also includes Single-Sign-On and professional support.

Friday, August 1, 2014

Liferay WEBコンテンツのストラクチャーとテンプレートの紹介

こんにちは、かわべです。本格的な夏ですが、近年は夏になると夕立を通り越したゲリラ豪雨があったりしますよね。天気が怪しいときはアメッシュを定期的にチェックして帰るタイミングを逃さないようにしているのですが、ときどき失敗してしばらく帰れなくなります。今回は雨が止むのを待つ間にブログを書くことにしました。

以前にWEBコンテンツについて紹介した際にはスルーしてしまったWEBコンテンツのストラクチャーとテンプレートについて簡単に紹介したいと思います。

WEBコンテンツのストラクチャーとテンプレートとは?

WEBコンテンツを作成する際にはストラクチャーを選択します。インストールした直後のLiferayには、タイトルとHTMLコンテンツを要素として備えたデフォルトのストラクチャーのみ存在しています。HTMLエディタで編集できるので自由度は高いですが、決まった構造のコンテンツを繰り返し作成するには手間がかかることもありますし、作成者によって違う見た目になってしまうかもしれません。同じ種類のWEBコンテンツを何度も作成する場合は、入力する要素の構造(ストラクチャー)と各要素の表示方法(テンプレート)を事前に定義しておけば、どのユーザでも簡単に同じ見栄えのコンテンツが作成できるようになります。

今回はデモ目的で作成した「社長あいさつ」というWEBコンテンツのストラクチャーとテンプレートを例として見ていきます。
とてもシンプルな例なのですが、使用するとこのようなWEBコンテンツが作成できるようになります。

では、まずはストラクチャーから追加していきます。以下の手順はすべて管理者権限のあるユーザで実行しています。

ストラクチャーの追加

「システム管理→コンテンツ→WEBコンテンツ」と移動してWEBコンテンツの管理画面へと移動し、そこから「管理→ストラクチャー」を選択すると、ストラクチャーの管理画面が表示されます。ここからストラクチャーの新規追加や、既存のストラクチャーの編集ができます。


左側にWEBコンテンツに定義できる様々な項目が用意されています。ドラッグ&ドロップで項目を追加後、設定タブで表示値などを変更してストラクチャーを作成していきます。
先ほどの「社長あいさつ」のストラクチャーは以下のような定義にしました。



「内容」はHTML、「感想をお聞かせください」はページヘのリンクとなっています(これはサイト内のページへのリンクになります)。

テンプレートの追加

次に、作成したストラクチャーに対応するテンプレートを作成します。ストラクチャーの管理画面から「テンプレートの管理→追加」をクリックすると、テンプレートの作成/編集画面に遷移します。


 テンプレートの記述方法としてFreeMarker、拡張可能スタイルシート言語、Velocityが選択できるようになっています。今回はFreeMarkerで作成してみましょう。といっても、Liferay 6.2でのテンプレートエディタは高機能なので、ストラクチャーの要素を表示させるのは非常に簡単です。
ストラクチャーで定義した要素は左ペインに用意されているので、必要な場所でクリックするだけで表示可能な状態でテンプレートに追加されます。


テンプレートエディタ上部のコメントにもあるように、変数やメソッドの自動補完機能も備わっています。


ストラクチャーで定義した要素以外でWEBコンテンツが持っている値(例:タイトル)を表示させたい場合は以下のように記述します。

${.vars['reserved-article-title'].data}

FreeMarkerで記述する場合、変数名にダッシュ等が含まれる場合のFreeMarkerの記述方法Velocityの変数一覧が参考になるかと思います。

さて、今回の「社長あいさつ」はhtmlのタグなども含めて、最終的に以下の内容でテンプレートを記述しました。


デフォルト値の設定

ストラクチャーを利用したWEBコンテンツの各要素にはデフォルト値を設定することができます。この機能も試してみましょう。ストラクチャーの管理画面から、今度は「デフォルト値の編集」を選択します。


表示される画面から、先ほど作成した感想リンク付きのテンプレートをデフォルトのテンプレートとして設定します。そして、「感想をお聞かせください」のリンクからは感想メールフォームのページへ遷移したいので、リンクのデフォルト値を「感想フォーム」として保存します。これは同じサイトに予め作成してあるページです。



これで準備は完了です。あとはこのストラクチャーを利用して好きなだけWEBコンテンツを作成しましょう。

ストラクチャーを利用したWEBコンテンツの作成

WEBコンテンツを作成するときに「社長あいさつ」ストラクチャーを選ぶと、デフォルト値の設定が反映された状態でコンテンツ作成画面が表示されます。




内容を適当に入力して保存し、どのように表示されるか見てみると…



こんな感じに表示されました。タイトル、内容、リンクが存在します。タイトルは<h3>要素として強調されています。また、リンク部分はテンプレートで指定したクラスに合わせてcssを適用しているので、ボタン風に表示されています。
感想リンクをクリックすると、感想フォームのページに飛ぶことができます。



ストラクチャーとテンプレートのいいところ

今回のはかなり単純な例ですが、ストラクチャー・テンプレートを適切に定義するとコンテンツ作成の手間が大幅に省けることがおわかりいただけるかと思います。もちろんストラクチャーやテンプレートを準備するユーザとコンテンツの作成者を別のユーザにすることも可能なので、コンテンツ作成者には難しい知識は必要ありません。

また、ストラクチャーは作成時に親を指定することで既存のものを拡張して作成することができます。例えば今回の「社長あいさつ」を拡張し、アイキャッチ用の写真を追加するのも簡単です。



WEBコンテンツの管理画面ではストラクチャーごとの閲覧ができますし、アセットパブリッシャーで特定のストラクチャーを持つWEBコンテンツのみを表示させるように設定することもできるので、コンテンツ管理も捗ります。




おわりに

WEBコンテンツでストラクチャーとテンプレートを利用するメリットが伝わったでしょうか。同種類のコンテンツを複数作成することが予めわかっている場合はぜひ利用してみてください!