Quantcast
Channel: aegif Labo Blog
Viewing all 244 articles
Browse latest View live

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

$
0
0
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)

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

$
0
0
こんにちは。大谷です。
今回は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) - リポジトリとサイトの準備をしよう」を公開しました。

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

$
0
0
こんにちは。大谷です。

前回の記事「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勉強会#9 振り返り

$
0
0

皆さんこんにちは。

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

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

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

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


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


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

$
0
0
こんにちは。大谷です。
今回は、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を参考にしてください。

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

$
0
0
mryoshioです。

今日の内容はAlfrescoについての話になります。Alfrescoについてのインストールや初期設定については書き秋田こういう他の記事を参考にして頂くとして、今日はチューニングポイントの概要として少しだけ突っ込んだ話を書きたいと思います。
システムを構築する上で当然パフォーマンスには注意しなければならず、Alfrescoを使う場合でも同様です。JVMチューニングについてはここで少し触れられていますが、Alfrescoのチューニングポイントについての日本語のまとめは情報としてないと思います。そのため今日の内容を書くことにしました。

次の図は、インターネット経由でAlfrescoへアクセスするまでの流れです。

チューニングポイント

今回触れるのはポイントCとします。
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


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

$
0
0
こんにちは。大谷です。

今回は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を公開しました)

Alfresco勉強会#10 振り返り

$
0
0


皆さんこんにちは。

先日行われた第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


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

$
0
0
こんにちは!大谷です。

今回は、以前の記事「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の利用を検討している方は、ファイルサーバ機能の利用も検討してみてはいかがでしょうか。

AlfrescoとSolr

$
0
0
こんにちは。

今更ながら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

    Alfresco勉強会#11 振り返り

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

    昨日行われた第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尽くしの回になります。今回の参加者の方から指摘していただいて初めて気付いたんですが。。。
    お申込みはこちらからできます。
    ご興味ある方はぜひご参加ください。発表者も大歓迎です。

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

    $
    0
    0
    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)

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

    $
    0
    0
    こんにちは、杉本です。

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

    ぼくは普段 .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 で接続することを試してみたいと思います。


    Alfresco4の使い方 - 基礎編(1) - コンテンツ管理を始めよう!

    $
    0
    0
    こんにちは。大谷です。
    本年もどうぞよろしくお願いします。

    今回は、Alfresco4の基本的な使い方について紹介させていただこうと思います。Alfrescoを使ってみようと考えている方の多くはコンテンツ管理を目的とされていると思いますので、ここではリポジトリもしくはサイトのドキュメントライブラリについて基本的な機能を見ていくことにしましょう(本記事ではAlfresco 4.2.cを利用しています)。

    なお、リポジトリやサイトについては、Alfresco 4.0の使い方 - 準備編(2) - リポジトリとサイトの準備をしようで詳しく説明していますので必要に応じて確認してみてください。


    ファイル/フォルダ操作


    まずは基本的なファイル/フォルダ操作について見てみましょう。Alfrescoにおけるコンテンツ管理は一般的なファイルサーバ等と同様に、階層構造を持つフォルダとそのフォルダに配置されるファイルからなります。

    フォルダのブラウズは画面左のフォルダツリーもしくは画面右の一覧画面のフォルダをクリックすることで行い、フォルダの追加は「新規フォルダ」から行います。


    ファイルの追加方法は2通りあります。1つ目は「アップロード」から行う方法で、複数のファイルを一括アップロードすることができます。2つ目はPC上のファイルをブラウザにドラッグ&ドロップする方法で、こちらも複数のファイルを一括でアップロードすることができますが、一部対応していないブラウザ(Internet Explorer 9等、HTML5に完全対応していないもの)があるので注意が必要です。
    ※ Firefox, Chrome等ではD&Dできます。また、IE10(Release Preview版で確認)でもD&Dできました)


    また、ファイル/フォルダのアクションメニューから、ダウンロードやコピー、移動、削除、更新(新規バージョンのアップロード)などを行うことができます。フォルダの場合は「Zip形式でダウンロード」というアクションが表示され、フォルダ内のファイル/フォルダを一括ダウンロードすることができます。
    ※ Windowsクライアントで「Zip形式でダウンロード」を行うと、MBCSのファイル名が文字化けしてしまう問題があるようです(Macではうまくいきます)

    さらに、ファイルのサムネイルもしくはファイル名をクリックすると、コンテンツの詳細情報が表示されます。この画面ではファイルのプレビューやプロパティ情報の確認などを行えます。



    タグ機能/カテゴリ機能


    いわゆるフォークソノミ、タクソノミに対応する機能です。両者ともコンテンツの分類を行うためのものですが、タグ機能はユーザが自由な文言をタグとしてコンテンツに付与するもの、カテゴリ機能は管理者があらかじめ設定した階層化されたカテゴリをコンテンツに付与するものです。

    タグ付けは、コンテンツ一覧画面もしくはプロパティ編集画面から行います。コンテンツ一覧画面ではタグをインライン編集することができます(以下のスナップショット)。
    タグ付けを行うと、画面左側のタグ欄に非同期的に反映され、付けられているタグとその件数が表示されます。このタグをクリックすると、当該のタグが付与されたコンテンツの一覧が表示されます。もちろん、検索時にはタグも検索対象となります。


    カテゴリは、デフォルトの状態では利用することができません。カテゴリを利用するためにはコンテンツに「分類対象」アスペクトを付与する必要があります。自動的にアスペクトを付与する一番簡単な方法はルール機能を用いる方法です。以下でその手順を説明します。

    1. カテゴリを付与するコンテンツをアップロードするルートのフォルダで「ルールの管理」をクリックする。

    2. 「ルールの作成」をクリックする。

    3. 以下のように設定して「作成」をクリックする。

    以上で、コンテンツ追加時に「分類対象」アスペクトを自動的に付与し、カテゴリを利用可能にする設定は完了です。さっそくこのフォルダにコンテンツを追加してみてください。一覧画面にカテゴリが表示され、プロパティ編集画面でカテゴリが編集できるようになっているはずです。



    画面左側のカテゴリ欄でカテゴリを選択すると、そのカテゴリが付与されたコンテンツの一覧が表示されます。フォルダ階層とは異なる、カテゴリ階層のビューを使ってコンテンツにアクセスすることができます。もちろん複数のカテゴリが付与されたコンテンツは、カテゴリ階層の複数の場所に表示されます。



    お気に入り、いいね、コメント…


    その他、ブックマーク的に利用できる「お気に入り」や、ソーシャル的な要素である「いいね!」や「コメント」などもあります。

    「お気に入り」 をクリックするとコンテンツに星マークが表示され、画面左の「お気に入り」やダッシュボードにお気に入りコンテンツの一覧を表示することができます。解除する場合は星マークを再度クリックしてください。

    「いいね!」はいわゆる巷のWebサービスのlikeと同様の機能で、「いいね!」をクリックするだけです。Alfrescoではこの「いいね!」 の数が人気順のソートに反映されます(以下のスナップショット)。


    また、コンテンツ一覧画面の「コメント」もしくは、コンテンツ詳細画面の「コメントの追加」をクリックしてコメントを追加します。コンテンツ詳細画面でコメントを確認することができ、コンテンツに関するちょっとしたディスカッションなどに利用できます。



    他にもあるけど…


    他にもたくさんの機能がありますが、まずは基本的な機能を見てみました。また折を見てAlfrescoに備わる強力な機能を紹介していきたいと思いますので引き続きよろしくお願いします。

    Alfresco4の使い方 - 応用編(1) - ルールでスクリプトを実行する

    $
    0
    0
    こんにちは。大谷です。

    今回は、ルール機能を使って自動的に任意の処理をキックする方法を紹介したいと思います。ルール機能については以前の記事「Alfresco4の使い方 - 基礎編(2) - ルール機能を使ってみよう!」で紹介していますので、設定方法などはこちらを見てください。


    スクリプトの準備


    まずはスクリプトを準備し、所定の場所にアップロードします。ここではAlfrescoにデフォルトでついているスクリプトを使います。

    1. adminでログインし、画面上部の「リポジトリ」をクリックする。


    2. 「リポジトリ」->「データディクショナリ」->「スクリプト」に移動する。


    3. backup.js.sampleをこのフォルダにコピーし、プロパティを編集して名前をbackup.jsに変更する。


    以上でスクリプトの準備が完了です。もちろん自作のカスタムスクリプトをこのフォルダに登録することもできます。JavaScriptで記述し、ファイル名が*.jsとなっている必要があります。カスタムスクリプト作成の際には、このフォルダにあらかじめ登録されているサンプルスクリプトや、AlfrescoのJavaScript APIリファレンスを参考にしてみてください。


    ルールの設定


    続いて、スクリプト実行のルールを指定します。詳しくは以前のエントリを参考にしてもらうとして、今回のポイントは、実行アクションを「スクリプトを実行する」に設定し、実行スクリプトとして先ほど格納したスクリプトを指定するということです。


    今回の例では、ルールを設定したフォルダにアップロードしたファイルが自動的にBackupフォルダにバックアップされるようになるので、実際に確認してみてください。


    まとめ


    この仕組みを利用すれば、ファイルの追加や更新をトリガとして独自のビジネスロジックをキックすることができるので、是非試してみてください。
    AlfrescoのJavaScript APIを使えばJava APIには敵わないものの、それなりの処理を記述することができるので、てっとり早くAlfresco上にビジネスロジックを実装することができます。

    Wikivoyage Offline: Travel guide for Android

    $
    0
    0
    I just released Wikivoyage Offline, an Android application that contains guide books for 27,000 destinations.

    Instead of carrying a heavy guidebook that shouts "I am a tourist", just use your phone!

    Content is downloaded to the phone's SD card, so you can use it offline (useful in case of no Internet or expensive roaming).
    The whole world is a 80MB download.

    Content is updated every two weeks, from Wikivoyage, the "Wikipedia for tourism information", which graduated from beta last week.

    The app is free and open source.

    Alfresco4の使い方 - 基礎編(2) - ルール機能を使ってみよう!

    $
    0
    0
    こんにちは!大谷です。

    今回は、Alfrescoを特徴づける機能の1つであるルール機能について紹介したいと思います。


    ルール機能って何?


    ルール機能をざっくり一言で表すと、コンテンツの追加・更新・削除をトリガに処理を自動実行する、機能ということになります。例えば、コンテンツ追加時にメールを送信したり、オフィス文書が追加されたらPDF化したりすることが、簡単な設定のみで実現できます。


    どういう設定ができるの?


    では、実際にはどのような設定ができるのかを見てみましょう。

    フォルダに対して設定する

    ルールはフォルダに対して設定します。1つのフォルダに複数のルールを設定することも可能で、ル適用するルールの順序も指定できます。
    ルールが設定されているフォルダには一律のルールが適用されます。サブフォルダにもルールを適用するか否かは、設定するルールごとに設定可能です。

    アクション実行の条件を指定可能

    アクション実行の条件と、その条件評価のタイミングを指定することができます。タイミングはアイテム(コンテンツもしくはフォルダ)作成/受入時、アイテム更新時、アイテム削除/流出時から選択可能です(複数選択も可)。アクション実行条件は、当該アイテムについて以下のような条件を複数組み合わせることが可能です。
    • すべてのアイテム
    • 作成日、変更日
    • 作成者、変更者
    • MIMEタイプ
    • エンコーディング
    • 名前
    • タグ、カテゴリ
    • コンテンツタイプ
    • アスペクト
    • プロパティ

    実行するアクションを指定可能

    実行するアクションを指定することができます。デフォルトでは以下のようなアクションが用意されており、簡単な設定だけで処理を追加することができます。複数のアクションを設定することもできます。
    • アイテムのコピー、移動
    • コンテンツのチェックイン、チェックアウト
    • カテゴリの付与
    • アスペクトの追加、削除
    • 簡易ワークフローの開始
    • Eメールの送信
    • コンテンツの別形式への変換
    • メタデータ抽出
    • ACP形式でのコンテンツインポート
    • コンテンツタイプの変更
    • スクリプトの実行
    このうち、スクリプトの実行はとても強力で、自前で用意したスクリプトを使って任意の処理を実行させることができます。これについては別の機会に説明したいと思います。

    同期実行・非同期実行を選択可能

    時間のかかる処理やリアルタイムで行う必要のない処理を非同期的に実行するよう設定することができます。


    どうやって設定するの?


    では、実際の設定手順を見ていきましょう。

    1. ルールを設定するフォルダのアクションメニューから「ルールの管理」をクリックする。



    2. 1件目のルールの場合は「ルールの作成」、2件目以降は「新規のルール」をクリックする。




    3. 名前、タイミング、条件、実行アクションを指定し、オプションを適宜指定する。


    4. 「作成」をクリックする。

    以上でルールの設定は完了です。複数のルールが設定されている場合はドラッグ&ドロップで順序を変更することができます。


    設定が終わったら、実際に動作を確認してみましょう。上記スナップショットのように設定すると、Wordファイルがアップロードされた時のみPDFに変換して宛先のフォルダにコピーされるはずです。(PDF変換処理にはOpenOfficeもしくはLibreOfficeが利用されます。インストーラインストールの場合は自動的に連携設定が行われますが、手動インストールの場合は連携のための設定が必要になります)


    前述のとおり他にもたくさんのアクションや条件設定ができるので、是非いろいろと試してみてください。なお、スクリプトの実行については次の機会に紹介する予定です。

    (2013/01/30 追記) 「Alfresco4の使い方 - 応用編(1) - ルールでスクリプトを実行する」を公開しました。

    Alfrescoにカスタム属性を追加する - タイプとアスペクト -

    $
    0
    0
    こんにちは。大谷です。
    日当たりが悪いのか、うちの周りが寒いのかは分かりませんが、うちの庭には相変わらず1月14日の雪が解け残っています(1月30日現在)。今回は、そんな大谷家からAlfrescoのコンテンツにカスタム属性を追加する方法をお伝えしたいと思います。基本的にはAlfresco4.2での話ですが、コンテンツモデルの仕組み自体はAlfresco3系でもほぼ同じです(そうそう変わるもんじゃない!)。


    属性って何?そもそもコンテンツって何?


    コンテンツは直訳すると内容物という意味です(当たり前ですが)。なので、ファイルサーバのコンテンツはファイルであり、CMSのコンテンツはリッチテキスト(と画像などの各種メディアファイル)ということになります。では、Alfrescoを始めとするECM(企業向けコンテンツ管理)の世界ではどうかというと、この世界では「コンテンツ=ファイル実体+属性情報(メタデータ)」と定義されることが多いです。つまり、ファイル実体とそのファイルに付随する各種の情報がセットで管理されるということを意味します。

    そうなると、管理すべき属性を予め定義しておきたくなると思います。例えば、そのコンテンツが契約書であれば、属性情報として契約書番号や顧客番号などを管理したいでしょうし、そのコンテンツがある製品の説明書であれば製品番号などを管理したいと思います(そもそもそのコンテンツが契約書なのか、説明書なのか、というコンテンツタイプ自体も管理したいと思います)。このように、ECM製品を利用しようとすると必ずと言っていいほど行われるのが、カスタム属性の追加というカスタマイズです。


    カスタム属性を実現するための2つの方法 -タイプとアスペクト-


    カスタム属性は、上記例よろしく「ある種類のコンテンツには属性Aと属性Bを、この種類のコンテンツには属性Cと属性Dを」というようにコンテンツ種別に応じて特定の属性セットを付与、管理するという要件が多いかと思います。これを実現するのがタイプになります。タイプは、事前に定義された属性セットを持つもので、Alfresco上のコンテンツを特定のタイプに指定すると、そのタイプに定義された属性が管理できるようになります。

    一方で、コンテンツ種別によらず、コンテンツ種別をまたぐような形で管理したい属性もあると思います。例えば、バージョン管理を行うときのバージョン番号や、タグ付け/カテゴリ付けする際のタグやカテゴリなどです。もちろん全てのタイプにそれら利用可能性のある全ての属性セットを持たせることも可能ですが、 それはとても無駄が多いことだし、そもそも各タイプにとってみればそれらの属性は本質的には関係ない属性だったりします。

    それを解決するために、Alfrescoではアスペクトと呼ばれる機能を使います。アスペクトもタイプと同様に属性セットを定義するものですが、任意のコンテンツ(=任意のタイプのコンテンツ)に対して複数のアスペクトを動的に付け外し可能である点がタイプと異なります。例えば、バージョンを管理したい任意のコンテンツに対してのみバージョン管理アスペクトを付与し、タグ付けを行いたい任意のコンテンツに対してのみタグ付け可能アスペクトを付与する、というような感じです。この機能により、Alfrescoではコンテンツ管理において無駄な属性の増殖や属性セットの体系が複雑化していくという状況(通称:属性ヘル)を避けることができます。


    じゃあどうやって定義するの?


    カスタム属性を追加するためには、
    1. コンテンツモデルの定義
    2. UIの設定
    が必要です。1.でタイプやアスペクトなどの属性セットを定義し、2.でその属性をShare UI上に表示するように設定します。

    コンテンツモデルの定義


    まず、以下のファイルを作成します。このフォルダには元々custom-model-context.xml.sampleというサンプルファイルがあるので、それをリネームするだけでもOKです。
    このファイルは、読み込むコンテンツモデル定義ファイルを指示するものです(以下の例ではcustomModel.xmlを読み込む)。Alfrescoはクラスパス上の*-context.xmlというファイルを自動で読み込むため、この命名規則に従う限り異なる名前でも問題ありません。

    <alf_dir>/tomcat/shared/classes/alfresco/extension/custom-model-context.xml
    <?xml version='1.0' encoding='UTF-8'?>
    <!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
    <beans>
    <!-- Registration of new models -->
    <bean depends-on="dictionaryBootstrap" id="extension.dictionaryBootstrap" parent="dictionaryModelBootstrap">
    <property name="models">
    <list>
    <value>alfresco/extension/customModel.xml</value>
    </list>
    </property>
    </bean>
    </beans>

    次に、以下のファイルを作成します(ファイル名は前述のファイル内で指定した名前にする必要がある)。このフォルダには元々customModel.xml.sampleというサンプルファイルがあるので、それをリネームして利用しても構いません。このファイルがタイプやアスペクトなどのコンテンツモデル定義の実体となりますが、今回はアスペクトを追加してみましょう。

    <alf_dir>/tomcat/shared/classes/alfresco/extension/customModel.xml
    <?xml version="1.0" encoding="UTF-8"?>

    <!-- Custom Model -->

    <!-- Note: This model is pre-configured to load at startup of the Repository. So, all custom -->
    <!-- types and aspects added here will automatically be registered -->

    <model name="custom:customModel" xmlns="http://www.alfresco.org/model/dictionary/1.0">

    <!-- Optional meta-data about the model -->
    <description>Custom Model</description>
    <author></author>
    <version>1.0</version>

    <imports>
    <!-- Import Alfresco Dictionary Definitions -->
    <import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d"/>
    <!-- Import Alfresco Content Domain Model Definitions -->
    <import uri="http://www.alfresco.org/model/content/1.0" prefix="cm"/>
    </imports>

    <!-- Introduction of new namespaces defined by this model -->
    <!-- NOTE: The following namespace custom.model should be changed to reflect your own namespace -->
    <namespaces>
    <namespace uri="custom.model" prefix="custom"/>
    </namespaces>

    <aspects>
    <aspect name="custom:reviewable">
    <title>Reviewable</title>
    <properties>
    <property name="custom:reviewer">
    <type>d:text</type>
    <mandatory>false</mandatory>
    </property>
    <property name="custom:reviewDate">
    <type>d:date</type>
    <mandatory>false</mandatory>
    </property>
    </properties>
    </aspect>
    </aspects>
    </model>
    ここではアスペクトcustom:reviewableが定義しています。テキスト型プロパティcustom:reviewerと日付型プロパティcustom:reviewDateを持ちます。コンテンツモデルの詳細はまた別の機会に説明したいと思いますが、基本的にはData Dictionary Guide - alfrescowikiにほとんどの情報がまとまっています。

    UIの設定


    次に、UIの設定を行います。UIの設定は以下のファイルで行います(もしshare-config-custom.xmlが存在しない場合は、同じフォルダにあるshare-config-custom.xml.sampleをコピー・リネームして上記ファイルを作成しておきます)。

    <alf_dir>/tomcat/shared/classes/alfresco/web-extension/share-config-custom.xml

    このファイルに以下の設定を追加します。サンプルファイルをリネームして使う場合は、既に同じconfigセクションが定義されている場合もありますので、その場合はそのセクションに以下の設定を追記してください。
    <alfresco-config>
    <config evaluator="node-type" condition="cm:content">
    <forms>
     <form>
    <field-visibility>
    <show id="custom:reviewer" />
    <show id="custom:reviewDate" />
     </field-visibility>
    </form>
     </forms>
    </config>
    <config evaluator="string-compare" condition="DocumentLibrary">
    <aspects>
    <visible>
    <aspect name="custom:reviewable" />
     </visible>
    </aspects>
     </config>
    </alfresco-config>
    この設定によって、コンテンツのプロパティ表示/編集画面にcustom:reviewableの2プロパティが表示され、アスペクトリストにcustom:reviewableが追加されてアスペクト管理やルールで利用できるようになります。


    ためしてみよう!


    では、早速カスタム属性を使ってみましょう。まずはAlfrescoを再起動します。これらの設定ファイルをいじった後は再起動が必要になります。

    まずは、適当なファイルをアップロードし、コンテンツ詳細画面のアクションメニューから「アスペクト管理」をクリックします。すると以下の画面が表示され、custom:reviewableアスペクトを使えるようになっているのでこれを選択します(表示されない場合は設定に問題があるはずです。alfrescoのログを見てみてください)。

     「変更を反映」をクリックすると、custom:reviewerプロパティとcustom:reviewDateプロパティが利用可能になります。ためしに「プロパティを編集」をクリックして値を入力すると、プロパティ一覧画面にもその値が表示されます(設定が間違ってるとプロパティが表示されません)。



    手動じゃちょっと…


    さすがに毎回手動でアスペクト付け外しやタイプ変更をするというのは実用的ではないので、実際に使う場合には、Java APIやJavaScript APIを使ってプログラマティックに行ったり、ルール機能を使ってコンテンツ追加時に自動的に行ったりします。ルール機能の使い方は「Alfresco4の使い方 - 基礎編(2) - ルール機能を使ってみよう!」に詳しいですが、例えば以下のような設定を行うと、特定のフォルダ以下に投入されたコンテンツに自動でアスペクトを付与することができます。


    今回はタイプとアスペクトを使ったカスタム属性の追加方法について説明しました。今回言及できなかった、プロパティで指定できるデータ型や制約に関することや、プロパティ名の日本語化などの話題は折を見て書いていこうかと思います。


    (2013/02/10 追記) 「Alfrescoのカスタム属性(とアスペクト名、タイプ名とか)を日本語化する」を公開しました。

    Alfrescoのカスタム属性(とアスペクト名、タイプ名とか)を日本語化する

    $
    0
    0
    こんにちは。大谷です。
    今回は「Alfrescoにカスタム属性を追加する - タイプとアスペクト -」に続く形で、カスタムモデル周りの日本語化(多言語化)について紹介したいと思います。基本的にはメッセージリソースの追加方法の説明だと思ってください。


    プロパティ名とか変じゃない?


    先ほどのリンク先の記事、特に画像を見た人は既にお気づきだと思いますが、追加したプロパティ名やアスペクト名がリソースIDみたいな文字列になっています。まあ頑張れば何を表しているか分からなくもないですが、あまりユーザフレンドリではありません。そこで、今回はこの表示をユーザが分かりやすい文字列に変えてみようと思います。つまり、表示ラベルを設定するようなものです。


    まずは英語で表示できるようにしてみる


    日本人であれば日本語で表示したいところですが、まずは英語にしてみましょう。日本語に関しては、設定時に一工夫必要なので(まあ大体想像つくと思いますが)、後ほど多言語化の方法と併せて説明することとします。

    まずは、プロパティの表示名を設定するために、以下の2ファイルを作成します。custom-model-context.xmlは前回作成してあるので、<property name="labels">タグを追加して読み込むリソースファイル名を指定します。そして、指定したファイル名のリソースファイルを作成します。コンテンツモデル名やプロパティ名の":"を"_"に置き換える形で用い、title(表示名)やdescription(説明)の文言を設定します。

    <alf_dir>/tomcat/shared/classes/alfresco/extension/custom-model-context.xml
    <?xml version='1.0' encoding='UTF-8'?>
    <!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
    <beans>
    <!-- Registration of new models -->
    <bean depends-on="dictionaryBootstrap" id="extension.dictionaryBootstrap" parent="dictionaryModelBootstrap">
    <property name="models">
    <list>
    <value>alfresco/extension/customModel.xml</value>
    </list>
    </property>
    <property name="labels">
    <list>
    <value>alfresco/messages/custom-model</value>
    </list>
    </property>
    </bean>
    </beans>

    <alf_dir>/tomcat/shared/classes/alfresco/messages/custom-model.properties
    custom_customModel.property.custom_reviewer.title=Reviewer
    custom_customModel.property.custom_reviewer.description=Reviewer's name
    custom_customModel.property.custom_reviewDate.title=Reviewed Date
    custom_customModel.property.custom_reviewDate.description=When this item reviewed

    次に、アスペクトの表示名を設定するために、以下の2ファイルを作成します。読み込むリソースファイル名を指定するcustom-messages-context.xmlはweb-extension以下に配置します。タイプもこの方法で表示名を設定できます。リソースファイル内でtype.***=***のように設定するだけです。

    <alf_dir>/tomcat/shared/classes/alfresco/web-extension/custom-messages-context.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
    <beans>
    <bean id="custom.resources" class="org.springframework.extensions.surf.util.ResourceBundleBootstrapComponent">
    <property name="resourceBundles">
    <list>
    <value>alfresco.messages.custom-share-messages</value>
    </list>
    </property>
    </bean>
    </beans>

    <alf_dir>/tomcat/shared/classes/alfresco/messages/custom-share-messages.properties
    aspect.custom_reviewable=Reviewable

    以上で設定完了です。Alfrescoサーバを再起動し、プロパティ名やアスペクト名が指定した文言になっていることが確認できると思います。先のエントリのスナップショットと比較すると変化が分かりやすいと思います。




    日本語表示を追加してみよう


    英語でうまく表示できたら、次は日本語表示に進みます。方法としては以下のように2通りの方法があります。
    1. 先ほど設定したリソースを日本語の文言に置き換える
    2. 先ほどのリソースファイルとは別に日本語用のリソースファイルを用意する
    Alfrescoの場合、ブラウザの言語設定によって表示言語が自動的に変更されます。例えばブラウザの言語設定を英語に変更すると、Alfrescoの表示が英語になるはずです。ここで改めて先ほどの2つの方法を見てみると、2.の方法はこの言語切り替えに対応する方法ということになります。もちろんどちらの方法を選択するかは要件によりますが、ここでは2.の方法を紹介したいと思います。

    手順は簡単、以下の2ファイルを追加で用意するだけです。追加するファイル名は、既存のリソースファイル名に_jaを付けたものになります。これだけで日本語フランス語のリソースだったら_fr、イタリア語だったら_it、英語だったら_enという感じです。英語のリソースファイルも用意してあげれば、日本語/英語の両方に対応した表示が完成です。何もついてない元のリソースファイルはデフォルトの表示名ということになります。

    <alf_dir>/tomcat/shared/classes/alfresco/messages/custom-model_ja.properties
    custom_customModel.property.custom_reviewer.title=\u30ec\u30d3\u30e5\u30a2
    custom_customModel.property.custom_reviewer.description=\u30ec\u30d3\u30e5\u30fc\u8005\u540d
    custom_customModel.property.custom_reviewDate.title=\u30ec\u30d3\u30e5\u30fc\u65e5
    custom_customModel.property.custom_reviewDate.description=\u30ec\u30d3\u30e5\u30fc\u65e5

    <alf_dir>/tomcat/shared/classes/alfresco/messages/custom-share-messages_ja.properties
    aspect.custom_reviewable=\u30ec\u30d3\u30e5\u30fc\u53ef\u80fd

    ここでのポイントは、日本語の文言がUnicodeエンコーディングされている点です。JDKに付属するnative2ascii等を利用してエンコーディングする必要があります。もしくは、自動的にエンコーディングしてくれるようなEclipseプラグインを使ってpropertiesファイルを編集するなどの方法があります。

    では、Alfrescoサーバを再起動して再度プロパティ名やアスペクト名を確認してみましょう。無事日本語の文言に変わっているはずです。


     
    今回はextensionフォルダ側とweb-extensionフォルダ側から計2つのリソースファイルを参照しましたが、役割分担としては、extensionフォルダ側から参照するリソースファイルではカスタムモデルに関するものを、web-extensionフォルダ側から参照するリソースファイルではShare UI上のメッセージに関するものを指定します。


    今回の説明は以上になりますが、基本的なメッセージリソースの追加方法はお分かりいただけたかと思います。メッセージの追加が必要になった場合は是非参考にしてください。

    AlfrescoのJavaScriptコードをデバッグする

    $
    0
    0
    こんにちは。大谷です。

    今日はAlfrescoでJavaScriptのデバッグを行う際に便利な機能をまとめてみました。Alfrescoをカスタマイズする際にJavaScriptを触ることも多いかと思いますので、その際に参考にしてみてください。


    一言でJavaScriptって言っても


    Alfrescoでは、サーバサイド、クライアントサイド(ブラウザですね)の両方でJavaScriptのコードが実行されます。サーバサイドでのJavaScript実行にはRhino(JavaによるJavaScript実装)を利用しています。
     また、Alfrescoはリポジトリのコア機能を提供するalfresco、UIレイヤを提供するshareの2アプリケーションから構成されています。
    従って、 一言でJavaScriptと言っても、実際にはサーバサイドJavaScript(alfresco, shareの両者で実行)とクライアントサイドJavaScript(shareが提供)の計3ヶ所について、それぞれ個別にデバッグの方法を考えなくてはなりません。



    サーバサイドJavaScript(alfrescoアプリケーション)


    alfrescoアプリケーションのサーバサイドJavaScriptは主に、Web Scriptsと呼ばれる、簡単にREST APIを作ることのできるフレームワークを利用する際に使われます。

    まずはデバッグツールですが、AlfrescoにはRhinoで実行されるJavaScriptをデバッグするための仕組みが用意されています。まず、http://localhost:8080/alfresco/service/api/javascript/debuggerにアクセスし、管理者のログイン情報を入力します。すると以下の画面が表示されるので「Enable」をクリックします。


    あとは、通常どおりAlfrescoにアクセスすればOKです。JavaScript Debuggerのダイアログが表示され、あとはJavaScriptが実行されるタイミングで適切に割り込みが入るので、ブレークポイントを設定するなり変数をウォッチするなりすることができます。



    次に、ログの出力方法を見てみます。まず、JavaScriptにログ出力を仕込むには、Alfresco JavaScript APIのLogging APIを利用します(詳しくは4.0 JavaScript API - alfrescowikiを参照)。さらに、log4jの設定を変更してログレベルを適切に設定する必要があります。

    <alf_dir>/tomcat/webapps/alfresco/WEB-INF/classes/log4j.properties
    log4j.logger.org.springframework.extensions.webscripts=debug
    log4j.logger.org.springframework.extensions.webscripts.ScriptLogger=debug
    これで、JavaScript内で仕込んだログがAlfrescoログに出力されるようになります。もちろんログレベル変更後にはAlfrescoサーバの再起動が必要です。


    サーバサイドJavaScript(shareアプリケーション)


    次にshareアプリケーションのサーバサイドJavaScriptについてですが、基本的にはalfrescoアプリケーションのJavaScriptと同様の方法になります。デバッガを有効にするには、http://localhost:8080/share/service/api/javascript/debugger(URLのalfrescoがshareに変わってることに注意!)にアクセスすればよいだけですし、ログは<alf_dir>/tomcat/webapps/share/WEB-INF/classes/log4j.properties(こちらもファイルパスのalfrescoがshareに変わっていることに注意!)を先ほどと同じように設定するだけでOKです。


    クライアントサイドJavaScript(shareアプリケーション)


    最後はクライアントサイドのJavaScriptです。これは、UIレイヤを担当するshareアプリケーションがブラウザに実行させるスクリプトということになります。UIカスタマイズの際にいじることがほとんどで、<alf_dir>/tomcat/webapps/share/components/あたりにあるファイルがそれに該当します。

    まずデバッグについてですが、ブラウザ上で実行されるJavaScriptのデバッグになるので、ブラウザごとに利用可能なデバッグツールを利用してください。筆者の場合は、FirefoxならFirebugとか、IEならF12で起動する開発者ツールとか、Chromeならctrl+shift+Iで起動するデベロッパーツールとかを主に使っています。

    ログ出力に関しても、Alfrescoにはlog4javascriptを利用した仕組みが用意されています。まずは、以下のファイルの当該箇所を以下のように変更し、Alfrescoを再起動します。

    <alf_dir>/tomcat/shared/classes/alfresco/web-extension/share-config-custom.xml
    <alfresco-config>

    <!-- Global config section -->
    <config replace="true">
    <flags>
    <!--
    Developer debugging setting to turn on DEBUG mode for client scripts in the browser
    -->
    <client-debug>true</client-debug>

    <!--
    LOGGING can always be toggled at runtime when in DEBUG mode (Ctrl, Ctrl, Shift, Shift).
    This flag automatically activates logging on page load.
    -->
    <client-debug-autologging>true</client-debug-autologging>
    </flags>
    </config>

    ...

    </alfresco-config>
    これで、Alfrescoアクセス時にlog4javascriptのダイアログが表示されるようになり、このダイアログ上でログを確認できるようになります。もしくは、client-debug-autologgingをfalseにしておき、必要なタイミングでCtrl, Ctrl, Shift, Shiftと入力することでもこのダイアログを表示させることができます。


    ログ出力を新たに埋め込む場合は、Alfresco.loggerという名前のlog4javascriptロガーオブジェクトを利用します。例えば以下のように記述します(詳しくはlog4javascript manualのloggersを参照)。

    Alfresco.logger.info("test");
    Alfresco.logger.debug("current object: ", object);

    Viewing all 244 articles
    Browse latest View live