Friday, September 25, 2020

Alfrescoのプレビューで日本語が文字化けする問題

こんにちは。てらしたです。今回はAlfrescoのプレビューで日本語が文字化けしてしまう問題の原因と修正方法をご紹介します。201911GAをDocker Composeで起動した場合(やり方はこちらの記事を参照)を例にご説明しますが、インストール方法によってはDocker Composeを使っていなくても起こり得る問題だと思います。

まずはどのような問題なのかを見ていきます。Alfrescoに日本語を含むテキストファイルをアップロードしてドキュメントの詳細画面を開きます。すると、プレビューでこのように日本語部分が文字化けして正常に表示されません。

試しにPowerPointのファイルをアップロードしてみても同じです。

これは、LibreOfficeが実行されているコンテナに日本語フォントがインストールされていないことが原因のようです(LibreOfficeはテキストファイルやMS Officeファイルの変換に使用されています)。そのため、このコンテナに日本語フォントをインストールしてあげれば解決するはずです。

まずLibreOffice用のコンテナにroot権限で入ります(コンテナ名やコンテナIDは docker ps で調べます)。

docker exec -it docker-compose_libreoffice_1 /bin/bash

入ったらIPAフォントをインストールします。

  yum -y install ipa-gothic-fonts ipa-pgothic-fonts ipa-mincho-fonts ipa-pmincho-fonts

インストールできたら、コンテナを再起動します。再起動するのはLibreOfficeコンテナだけで大丈夫です。起動したら先ほどと同じファイルをアップロードしてプレビューを確認してみます。

このようにテキストファイルも、

PowerPointファイルも無事に文字化けが解消されていました。

フォントをインストールすれば無事に解消できることが確認できたので、コンテナを作り直すたびに手作業でフォントをインストールしなくてもいいようにDockerfileを作ってdocker-compose.ymlをちょっと修正します。

まず、docker-compose.ymlのあるディレクトリにlibreofficeディレクトリを作成し、そこに以下の内容を記載したDockerfileを作成します。

FROM alfresco/alfresco-libreoffice:2.1.0

USER root

RUN yum install -y \
            ipa-gothic-fonts \
            ipa-pgothic-fonts \
            ipa-mincho-fonts \
            ipa-pmincho-fonts \
           &&yum clean all

USER libreoffice

元のDockerfileでは最終的にlibreofficeユーザになっているのでrootに変更してフォントをインストールしたらlibreofficeユーザに戻るという操作をしています。

次に、docker-compose.ymlの以下の部分を

libreoffice:
    image: alfresco/alfresco-libreoffice:2.1.0
    mem_limit: 1g
    ...

このように書き換えます(image名は好きにつけてもらって大丈夫です)。

libreoffice:
    image: custom-alfresco-libreoffice:2.1.0
    build:
        dockerfile: Dockerfile
        context: ./libreoffice
    mem_limit: 1g
    ...

修正して保存したらコンテナを作り直して動作確認をしてみます。LibreOfficeコンテナだけ作り直せばよいはずですが、キャッシュの影響等でうまく再構築してくれないとか、他の問題が絡んでくるとわかりにくくなってしまうので、ここでは docker-compose down でコンテナを一掃してから docker-compose up で起動し直しました。Alfrescoのデータは残しておきたいとか、状況によっては docker-compose down は使えないと思うので、状況に合わせてコマンドは適当に変えていただければと思います。

起動したら同様にファイルをアップロードして、プレビューが文字化けしていなかったら成功です(結果は上と同じなのでスクリーンショットは省略)。

Monday, September 7, 2020

Liferay 7とMicrosoft365(Office365)を連携させてOfficeファイルをオンライン編集する

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

今も昔も仕事でMicrosoft Officeを利用しているユーザは多いと思いますが、今やその月額/年額サブスクリプションサービスであるMicrosoft 365(旧Office 365)をご利用の会社も多いかと思います。今回はそのMicrosoft 365(旧Office 365)とLiferayのドキュメントライブラリ(ファイル管理機能)の連携機能について紹介したいと思います。
なお、この機能はLiferay DXP 7.2で新しく追加された機能になります。実際に試してみたい方はLiferayDXP 7.2以降でお試しください。

また、LiferayはGoogle Drive/Google Docsとの連携機能も備えており、これらのサービスを用いてOfficeファイルをオンライン編集することもできます。具体的な設定方法については別の記事「Liferay 7とGoogle Drive / Google Docsを連携させる」を参考にしてください。

Microsoft 365(Office365)連携機能で実現できること


LiferayのドキュメントライブラリとMicrosoft 365を連携すると、ドキュメントライブラリ上のOfficeファイルをMicrosoft 365を利用してオンライン編集できるようになります。具体的には以下のことができます。
  • Microsoft 365を使い、新規Wordファイル(.docx)、新規Excelファイル(.xlsx)、新規PowerPointファイル(.pptx)をブラウザ上で作成する
  • 作成したファイルをドキュメントライブラリに保存する
  • ドキュメントライブラリ上の以下の形式のファイルをMicrosoft 365を使ってブラウザ上で編集する。
    • Word/テキスト系ファイル(.doc, .docx, .docm, .dot, .dotx, .dotm, .html, .txt, .rtf, .odt)
    • PowerPoint/スライド系ファイル(.ppt, .pptx, .pptm, .pps, .ppsx, .ppsm, .pot, .potx, .potm)
    • Excel/シート系ファイル(.xls, .xlsx, .xlsm, .xlt, .xltx, .xltm, .ods, .csv, .tsv, .txt, .tab)
なお、Microsoft 365でファイル編集を開始するとOneDrive上にファイルがコピーされ、Microsoft 365でファイル編集を終えるとOneDrive上のファイルは削除されます。詳しい説明はLiferayヘルプセンターのこの記事この記事をご参照ください。

Azure PortalでMicrosoft 365の連携設定を行う


では早速設定方法を見ていきましょう。まずはAzure PortalでMicrosoft 365側の設定を行います。具体的には、Microsoft Graph APIをLiferayが利用できるように公開し、Liferay向けにOAuth2.0クライアントIDを発行します。

1. Azure Portalに管理者アカウントでログインする
2. Azure Active Directoryをクリックし、「アプリの登録」->「新規登録」をクリックする 
3. 「名前」にアプリケーション名を入力し(認証時に表示されます)、「アカウントの種類」を適宜選択して「登録」をクリックする
4. 作成が完了すると以下のような画面が表示されるので、「アプリケーション(クライアント)ID」「ディレクトリ(テナント)ID」の値をコピーし、「リダイレクトURIを追加する」をクリックする
5. 「プラットフォームを追加」をクリックして「Web」を選択する
6. 「リダイレクト URI」にhttp(s)://<host or IP>:<port>/o/document_library/onedrive/oauth2と入力して「構成」をクリックする
7. 「証明書とシークレット」->「新しいクライアントシークレット」をクリックし、「説明」と「有効期限」を適宜入力して「追加」をクリックする
8. クライアントシークレットが登録されたら「値」欄に表示されたクライアントシークレットをコピーする
9. 続いて「APIのアクセス許可」->「アクセス許可の追加」をクリックする
10. 「Microsoft Graph API」をクリックする
11. 「委任されたアクセス許可」を選択し、Files.Read.AllFiles.ReadWrite.Allにチェックを入れて「アクセス許可の追加」をクリックする

以上でMicrosoft 365側の設定は終わりです。

Liferayの設定を行う


続いて、Liferay側の設定を行います。

1. Liferay DXP 7.2に管理者でログインする
2. 「Control Panel」->「Configuration」->「Instance Settings」->「Documents and Media」をクリックする(この場合、インスタンス毎の設定になります。グローバルに設定する場合は「System Settings」->「Documents and Media」をクリックします)
3. 「OneDrive」を選択し、Client IDに「アプリケーション(クライアント)ID」、Client Secretに「クライアントシークレット」、Tenantに「ディレクトリ(テナント)ID」を入力して「Save」をクリックする

以上で設定完了です。Liferay側の設定はとても簡単です。

動作確認してみよう


では動作確認してみましょう。ドキュメントとメディアの新規作成メニューをクリックすると、Word、PowerPoint、Excelが表示されるようになります。

これらをクリックしてファイル名を入力すると、Microsoft 365のログイン画面が表示されるので認証情報を入力します。初回はアクセス許可の画面が表示されるので許可します(2回目以降は表示されません)。すると、OneDrive上にファイルが生成されオンラインのOfficeアプリでファイルが編集できるようになります。ファイルを保存すると、OneDrive上のファイルをLiferayに保存し、OneDrive上のファイルは削除されます。

また、アクションメニューの「Edit in Office 365」をクリックすると、OneDrive上にファイルをコピーしてOfficeアプリでのオンライン編集が始まります。

今回の紹介は以上です。Officeファイルをオンライン編集できるメリットは大きいと思いますので、組織でMicrosoft 365をお使いであれば是非お試しください。

Friday, August 28, 2020

gogo shellコマンドを作ってみよう

 とたにです。

今回は実は色々な用途に使えるgogo shellコマンドの作り方を紹介したします。

※本記事はLiferay DXP 7.1を使用していますがバージョン7.0〜7.2でも(おそらく7.3も)問題なく動くと思います。

そもそもgogo shellとは

gogo shellコマンドの前にgogo shellとはなんでしょうか。LiferayはDXP(7.0)以降、アーキテクチャがOSGiベースに刷新されました。gogo shellはそのOSGiランタイムのコマンドラインシェルのことで、正しくはApache felix gogo shellといいます。
Liferayにも、このgogo shellを組み込まれているためgogo shellにアクセスしてさまざまな情報を取得したりOSGiバンドルの操作をしたりすることができます。

gogo shellへの接続方法

gogo shellへの接続方法は大きく2通りあります。
1つ目はLiferayのコントロールパネルからgogo shellにアクセスする方法です。
コントロールパネルの設定からGogo shellをクリックすると以下のようなGogo shellコマンドをWebページから入力できます。


2つ目は、telnetを使って接続する方法です。ただし7.1以降でtelnetを使って接続するためには以下の設定をportal-ext.propertiesに設定しておく必要があります。

 module.framework.properties.osgi.console=localhost:11311

この状態でLiferayを起動すると以下のようにtelnetからgogo shellに接続することができます。

$ telnet localhost 11311
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
____________________________
Welcome to Apache Felix Gogo

gogo shellではさまざまなコマンドが標準で用意され、主にOSGiバンドルの状態確認や調査、状態変更などが行えます。helpコマンドで使用できるコマンドの一覧を確認することができるので興味のある方は確認してみてください。

gogo shellコマンドの作成方法

gogo shellでは用意されたコマンドを使うだけではなく新しくコマンドを追加することができます。
今回は非常に簡単なコマンドを作成してみたいと思います。

step.1 Liferayモジュールプロジェクトの準備

Liferay IDEやbladeコマンドでLiferay workspaceとコマンドを追加するためのモジュールプロジェクトを作成します。プロジェクトの種類はシンプルでよいのでactivator等を選んでおくのが簡単かと思います。

今回はLiferayのサイト一覧とサイトメンバの一覧をコマンドで表示するコマンドを作ろうと思っているので、Liferayのサービスが呼び出せるようにbuild.gradleを以下のようにしておきます。
dependencies {
	compileOnly group: "org.osgi", name: "org.osgi.core"
	compileOnly group: "org.osgi", name: "org.osgi.service.component.annotations"
	compileOnly group: "com.liferay.portal", name: "com.liferay.portal.kernel"	
}

step.2 コマンドクラスの作成

package sample;

import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.service.GroupLocalService;
import com.liferay.portal.kernel.service.UserLocalService;
import com.liferay.portal.kernel.util.PortalUtil;

import java.util.List;

import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;



@Component(
        property = {
                "osgi.command.function=listSites",
                "osgi.command.function=siteMembers",
                "osgi.command.scope=sample"
        },
        service = Object.class
)
public class SIteMemberCommand {

    public void listSites() {
    	List>group> sites = this.groupLocalService.getGroups(QueryUtil.ALL_POS, QueryUtil.ALL_POS);
    	
    	sites.stream().forEach(g -> System.out.println(g.getFriendlyURL()));
    	System.out.println("-- Total: " + sites.size());
    }
    
    public void siteMembers(String siteUrl) throws PortalException {
    	
    	Group g = this.groupLocalService.getFriendlyURLGroup(PortalUtil.getDefaultCompanyId(), siteUrl);
    	List>user> users = this.userLocalService.getGroupUsers(g.getGroupId());
    	
    	users.stream().forEach(u -> System.out.println(u.getScreenName() + ", " + u.getEmailAddress()));
    }
    
    @Reference
    private GroupLocalService groupLocalService;
    
    @Reference
    private UserLocalService userLocalService;
}
大した長さではないので、クラスのコードを全部はっています。

一番大切な部分は、クラスに付与されたアノテーションで、osgi.comand.functionとosgi.comnand.scopeプロパティの部分です。
osgi.command.functionはコマンドの名前と対応するメソッド名を定義しています。今回の例だとlistSitesと入力するとこのクラスのlsitSitesメソッドが実行されるようになります。
またosgi.command.functionは複数行記述することで複数のコマンドをひとつのクラスにまとめて定義することができます。

osgi.command.scopeはコマンドの名前空間でコマンド実行時には省略することもできますが、コマンド名が衝突しているケースで[スコープ名]:[コマンド名]のように入力することでコマンドを限定することができます。

コマンドの中身はLiferayの標準サービスを使って簡単な情報を出力しているだけなので詳細は省略しますが、コマンドを実行すると以下のように動きます。

  • listSitesコマンドはLiferay上のサイトのフレンドリURL一覧を出力します。
  • siteMembersコマンドはフレンドリURLを引数にとって、そのサイトの所属ユーザ一覧を出力します。

step.3 結果確認

モジュールをビルドしてLiferayにデプロイしたらコマンドの動作を確認してみましょう。

g! listSites  
/landing1
/landing2
...
/uitest
/personal_site
/template-35187
/template-35237
/template-33896
/template-20154
/template-33875
/template-33851
/template-33862
-- Total: 115

サイトテンプレートなどもサイトのひとつとして表示されていますが、いちおうサイトの一覧は取得できているようです。
次にsiteMembersもためしてみましょう。

g! siteMembers /contacttest
test, test@liferay.com

サイトメンバが1人しかいないですが、サイトのメンバーが表示されていることがわかります。

まとめ

Liferayのサービスと連携したgogo shellコマンドを作成しました。
gogo shellコマンドはこのようにLiferayのサービスやサービスビルダで作成したサービスを呼び出すことができるので、例えば初期データの登録やサービスレイヤーのテストなどさまざまな用途に活用することができます。
作成方法も簡単なのでぜひ活用してみてください。

Alfresco 201911GAで管理ツールからユーザ検索できない問題の解決方法

こんにちは。てらしたです。今回はAlfresco 201911GAのリリースノートにKnown Issuesとして記載されている、Shareの管理ツールからユーザ検索ができない問題の解決方法についてです。

リリースノートからもリンクが貼られているこちらのissueに問題の内容と解決方法が書いてあるので、その内容のご紹介になります。どうやらEnterprise版(有償版)のための機能のバグ修正の結果として生まれた新たなバグのようです。

解決方法の前に、まずは問題の内容を確認します。Alfrescoを起動し、Shareにadminでログインしてヘッダの「管理ツール」をクリックします。次に管理ツール画面で左メニューの「ユーザー」をクリックします。本来はこのページでユーザを検索できるはずですが、検索しても「アイテム読み込み時のエラー」というエラーメッセージが表示されて検索できません。ブラウザの開発ツールで確認してみると、people-enterpriseというapiにリクエストを投げて404が返ってきていることが原因のようです(Enterprise版用のAPIだから)。

上にリンクを貼ったissueによると、share-config.xmlでshow-authorization-statusというプロパティがtrueになっていることが原因のようなので、これをfalseにしてあげれば解決します。

Alfresco SDK 4.1で修正する場合

SDKを使って修正する場合(SDK4.1の開発環境構築についてはこちら)は、share-jarプロジェクトの [artifactId]-share/src/main/resources/META-INF/share-config-custom.xmlの<alfresco-config>タグの間の適当な場所に以下のコードを追記してリビルドすればOKです。

<config evaluator="string-compare" condition="Users" replace="true">
    <users>
        <!-- minimum length for username and password -->
        <username-min-length>2</username-min-length>
        <password-min-length>3</password-min-length>
        <show-authorization-status>false</show-authorization-status>
     </users>
     <!-- This enables/disables the Add External Users Panel on the Add Users page. -->
     <enable-external-users-panel>false</enable-external-users-panel>
</config>
  

Dockerfileで修正する場合

201911GAをdocker composeを使って試用している場合(やり方についてはこちら)でも、show-authorization-statusというプロパティを書き換えればいいだけなので方法はいろいろあると思いますが、手っ取り早く確認したいのであれば以下の方法が簡単なのではないかと思います。

docker-compose.ymlと同じディレクトリに以下の内容を記載したDockerfileを作成します。

FROM alfresco/alfresco-share:6.2.0

ARG TOMCAT_DIR=/usr/local/tomcat

# Patch for https://github.com/Alfresco/acs-community-packaging/issues/367
RUN sed -i 's@true@false@' \
	$TOMCAT_DIR/webapps/share/WEB-INF/classes/alfresco/share-config.xml

次に、docker-compose.ymlの以下の部分を

share:
    image: alfresco/alfresco-share:6.2.0
    mem_limit: 1g
        environment:
    ...

以下のように書き換えます。image名は既存のものと被らなければ何でもいいと思いますし、指定しなくても動くはずです。

share:
    image: custom-alfresco-share:development
    build:
        dockerfile: ./Dockerfile
        context: ./
    mem_limit: 1g
        environment:
    ...

修正した後に確認してみると、以下のようにユーザ検索が問題なく実行できると思います。

こんなことをしなくてもいいようにいずれ修正されるのではないかと思いますが、今のところはこのような方法で修正することが可能です。

Tuesday, August 25, 2020

Liferayテーブルを見てみよう〜サイト情報編

こんにちはナクラです。

前回はユーザの情報についてみましたが、
今回はサイトに関連する情報についてみていきましょう。
LiferayではいくつかのWebページをまとめてサイトを構成しています。
表示しているサイトに関する情報はコントロールパネルのサイトのセクションで確認できます。
サイトのセクションでは、サイトの所属するユーザの情報や、
サイト内のWebコンテンツやWiki、ドキュメントなどの情報を確認することができます。
特にサイト自体についての設定情報は
「設定」> 「サイトの設定」になります。

サイト設定では4つタブがあります。

・共通
・ソーシャル
・言語
・詳細設定

それぞれ見ていきましょう。


1.共通タブ

共通タブの画面はこのようになっています。


この画面の設定項目の大半はサイト情報のメインのデータであるGroup_テーブルに含まれている情報です。
(このテーブルも最後に"_"がついてます。)
サイトなのにGroup_という名前になっているので、注意してください。
実は、Group_テーブルには、この記事で取り扱っている"サイト"以外にも
いろいろな"サイト"的なものを登録するテーブルになっていて、
"サイト"自体は、Group_の一部という取扱いになっています。
Group_テーブルの定義は、前回でも確認しましたが、以下のようになっています。
Group_テーブル
+-------------------------------------+------------------+---------+---------+----------+-------+
| Field                                     | Type              | Null     | Key    | Default | Extra |
+-------------------------------------+------------------+---------+---------+----------+-------+
| mvccVersion                        | bigint(20)        | NO     |           | 0           |          |
| uuid_                                    | varchar(75)    | YES   | MUL   | NULL    |          |
| groupId                                 | bigint(20)       | NO     | PRI     | NULL   |          |
| companyId                           | bigint(20)        | YES  | MUL    | NULL   |          |
| creatorUserId                       | bigint(20)        | YES  |            | NULL   |          |
| classNameId                        | bigint(20)        | YES  | MUL    | NULL   |          |
| classPK                                | bigint(20)        | YES  |            | NULL   |          |
| parentGroupId                      | bigint(20)        | YES  |            | NULL    |         |
| liveGroupId                           | bigint(20)        | YES  | MUL   | NULL   |          |
| treePath                                | longtext          | YES  |            | NULL   |          |
| groupKey                              | varchar(150)  | YES  |            | NULL   |          |
| name                                     | longtext         | YES  |             | NULL   |         |
| description                            | longtext          | YES  |            | NULL    |         |
| type_                                     | int(11)            | YES  | MUL    | NULL    |         |
| typeSettings                          | longtext         | YES  |             | NULL    |         |
| manualMembership              | tinyint(4)        | YES  |             | NULL    |         |
| membershipRestriction         | int(11)            | YES  |            | NULL    |          |
| friendlyURL                           | varchar(255)  | YES  |            | NULL    |          |
| site                                        | tinyint(4)         | YES  |            | NULL    |          |
| remoteStagingGroupCount   | int(11)            | YES  |            | NULL    |          |
| inheritContent                        | tinyint(4)        | YES  |            | NULL    |          |
| active_                                   | tinyint(4)        | YES  |            | NULL    |          |
+--------------------------------------+------------------+-------+----------+-----------+--------+

さて、共通タブの項目とデータベースでの設定値との対応についてみていきましょう。

●詳細セクション
・サイトID:groupIdカラム
この値がサイトのプライマリキーになります。 
・説明: descriptionカラム
・メンバーシップタイプ:type_カラム
各設定に対応する値は下記のようになります。
公開
制限付き 2
非公開 3
・手動メンバーシップ管理を許可する:manualMembershipカラム
対応する値は
はい 1
いいえ 2
・親サイト:parentGroupIdカラム 
親サイトを指定した場合は親サイトのサイトID(groupIdカラムの値)が入ります。

●ページセクション

・公開ページ、非公開ページ
ページが存在する場合は、公開ページと非公開ページへのリンクが表示されます。
ページが存在しない場合は、サイトテンプレートを指定できるようになっていて、
それで保存すると、サイトテンプレートに従ってページが作成されます。
ページとサイトの関係については、後日詳しくみることにしましょう。

●カテゴリの設定セクション

・タグ
この設定値はAssetEntries_AssetTagsテーブルに登録されます。
入力したタグが生成されて、tagIdを割り当てらます。
サイトに対しては、アセットとしてみた場合のentryIdが割り当てられており、それを使ってタグとの関連情報が登録されます。
AssetEntries_AssetTagsテーブル
+---------------+-------------+------+-------+-----------+-------+
| Field           | Type        | Null | Key   | Default | Extra |
+---------------+-------------+------+-------+-----------+-------+
| companyId | bigint(20) | NO  | MUL | NULL    |          |
| entryId        | bigint(20) | NO  | PRI  | NULL    |          |
| tagId           | bigint(20) | NO  | PRI  | NULL    |          |
+---------------+-------------+------+-------+-----------+-------+
アセットの情報については
AssetEntryテーブルで確認できます。

●サイトURLセクション

・フレンドリURL:friendlyURLカラム
サイト作成時にはサイト名からfriendlyURLは自動生成されますが、
この設定で変更することができます。
・バーチャルホストの公開ページと非公開ページ
この設定値はVirtualHostテーブルに登録されます。
VirtualHostテーブル
+-----------------+------------------+-------+------+-----------+-------+
| Field             | Type              | Null  | Key  | Default | Extra |
+-----------------+------------------+-------+------+-----------+-------+
| mvccVersion | bigint(20)      | NO    |        | 0           |          |
| virtualHostId | bigint(20)       | NO   | PRI  | NULL    |         |
| companyId   | bigint(20)       | YES | MUL | NULL    |         |
| layoutSetId   | bigint(20)       | YES |         | NULL    |         |
| hostname     | varchar(200)  | YES | UNI  | NULL   |          |
+-----------------+------------------+-------+-------+----------+-------+
layoutSetIdカラムの値がサイトの公開ページセットのIDおよび非公開ページセットのIDになっており、
hostnameカラムに設定した値が登録されます。

以下の項目はいずれもtypeSettingsカラムで登録されます。
・ディレクトリのインデックスを有効にする
・このサイトでアセットの自動タグ付けを有効にする
・共有
それぞれの設定方法は次のとおりです。
directoryIndexingEnabled=false   
assetAutoTaggingEnabled=true
sharingEnabled=true 


2.ソーシャルタブ

ソーシャルタブの画面はこのようになっています。

●評価セクション

ここでは、サイトのコンテンツの評価方法を設定できます。
項目とデータベースの設定値との対応は以下の様になっています。
「高評価」:like
「スター(縦方向)」:stacked-stars
「スター」:stars
「評価」:thumbs
それぞれの設定情報は
Group_テーブルのtypeSettingsカラムに以下のようなに登録されます。
com.liferay.blogs.model.BlogsEntry_RatingsType=stars
com.liferay.document.library.kernel.model.DLFileEntry_RatingsType=thumbs
com.liferay.journal.model.JournalArticle_RatingsType=thumbs
com.liferay.knowledge.base.model.KBArticle_RatingsType=stacked-stars
com.liferay.message.boards.model.MBDiscussion_RatingsType=like
com.liferay.wiki.model.WikiPage_RatingsType=thumbs

●コメントセクション

・他ユーザーへのメンションを許可する。
これの設定も、typeSettingsカラムで下記のように登録されます。
mentionsEnabled=true


3.言語タブ

言語タブの画面はこのようになっています。

ここでは、サイトのデフォルト言語と切り替え可能な言語を設定できます。
「デフォルト言語オプションを使用します」のラジオボタンが選択されている場合は、
インスタンス設定の"ローカライズ"で設定されている項目が引き継がれます。
「このサイトでのデフォルトの言語と指定可能な言語を定義してください」にラジオボタンを変更すると
デフォルト言語と選択可能が言語の設定が行えます。
ここの部分の設定情報でデータベースでは、
Group_テーブルのtypeSettingsカラムに登録されます。
まず、ラジオボタンの情報が
inheritLocales=true
のような形で設定されています。
「デフォルト言語オプションを使用します」を選択している場合は true
「このサイトでのデフォルトの言語と指定可能な言語を定義してください」を選択している場合は false
になります。
デフォルトの言語は
languageId=en_US
利用可能な言語は
locales=en_US,nl_NL,ja_JP
のように登録されています。
ただし、この設定情報は「デフォルト言語オプションを使用します」を選択すると
初期設定に戻ってしまうのでラジオボタンを戻したときにまた、一から選択しなおす必要があるので注意してください。


4.詳細設定タブ

詳細設定タブの画面はこのようになっています。

このタブの設定項目は全てtypeSettingsカラムに登録されます。
項目と登録方法を一緒に確認していきましょう。

●デフォルトの関連付けセクション

・サイトロール」
defaultSiteRoleIds=34520
・チーム
defaultTeamIds=37534

●分析セクション

・Google アナリティクスID
googleAnalyticsId=XXXXXX
・Piwik
analytics_piwik=XXXXXXX

●地図セクション

・OpenStreetMap
MAP_PROVIDER_KEY=OpenStreetMap
・Google マップおよび「Google Maps API キー (オプション)」
MAP_PROVIDER_KEY=GoogleMaps
googleMapsAPIKey=XXXXXXXX
ラジオボタンでの設定なので
MAP_PROVIDER_KEYはどちらか一方が登録されます。

●ゴミ箱セクション

・ゴミ箱を有効にする
trashEnabled=true
・ゴミ箱内エントリーの最大保存日数
trashEntriesMaxAge=43200

●コンテンツセクション

・このサイトから子サイトの内容を表示できるようにする。
contentSharingWithChildrenEnabled=-1
値については以下のようになっています。
デフォルト値(有効):-1
有効:3
無効:0

まとめ

今回はサイト設定の項目とデータベースとの対応を確認しました。
サイトの情報は比較的Group_テーブルにまとまって登録されています。
特にtypeSettingsカラムに、サイトに固有のさまざまな設定値が登録されます。
また、一部はAssetEntries_AssetTagsテーブルやVirtualHostテーブルにも登録されているデータがありました。

それではまた、次回は別の設定項目を見ていきたいと思います。




Monday, August 24, 2020

Alfresco SDK 4.1を使って開発環境を構築する

こんにちは。てらしたです。 今回は現時点(2020年8月)での最新のSDKである4.1を使って、Alfrescoをカスタマイズするための開発環境を構築する手順をご紹介します。

以前のSDK 3.xとは、動作確認用のAlfrescoがDockerコンテナとして起動するようになっている点が大きく異なっています。これによって、本番環境でもコンテナを使う場合は、開発環境との環境差異に起因する問題が従来より少なくなることが期待できるかもしれません。

開発環境の構築手順については3.xの時と基本的には同じです。以下のドキュメントに沿って1つずつ手順をご説明していきます。
Getting started with Alfresco SDK 4.1

準備

開発用のプロジェクトを作るためには、JDK11、Maven、DockerおよびDocker Composeのインストール/設定が必要です。

まずJDK11をインストールし、環境変数JAVA_HOMEを適切に設定します。インストールと設定が終わったら以下のコマンドで確認します。

java -version
echo $JAVA_HOME

Mavenをインストールします(バージョンは3.3以上)。こちらも以下のコマンドでバージョンを確認します。

mvn -v

Dockerをインストールします。Docker ComposeがDockerのインストール時に一緒にインストールされていない場合は個別にインストールします。終わったら以下のコマンドで確認します。

docker -v
docker-compose -v

プロジェクトの作成

準備が整ったので、適当なディレクトリに移動し、以下のコマンドを実行してMaven Archetypeからプロジェクトを作成します。

mvn archetype:generate -Dfilter=org.alfresco:

ここからは対話形式で設定していきます。どのarchetypeを使用するか聞かれるので、

  • alfresco-allinone-archetype
  • alfresco-platform-jar-archetype
  • alfresco-share-jar-archetype
の3つ(以下の2, 4, 5)のいずれかを選択します。
Choose archetype:
1: remote -> org.alfresco.maven.archetype:activiti-jar-archetype (DEPRECATED - UNSUPPORTED - EXPERIMENTAL)
2: remote -> org.alfresco.maven.archetype:alfresco-allinone-archetype (Sample multi-module project for All-in-One development on the Alfresco platform. Includes modules for Platform/Repository JAR and Share JAR)
3: remote -> org.alfresco.maven.archetype:alfresco-amp-archetype (Sample project with full support for lifecycle and rapid development of Repository AMPs (Alfresco Module Packages))
4: remote -> org.alfresco.maven.archetype:alfresco-platform-jar-archetype (Sample project with full support for lifecycle and rapid development of Platform/Repository JARs and AMPs (Alfresco Module Packages))
5: remote -> org.alfresco.maven.archetype:alfresco-share-jar-archetype (Share project with full support for lifecycle and rapid development of JARs and AMPs (Alfresco Module Packages))
6: remote -> org.alfresco.maven.archetype:share-amp-archetype (Share project with full support for lifecycle and rapid development of AMPs (Alfresco Module Packages))
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): : 

Alfresco Platformのみカスタマイズする場合は4. alfresco-platform-jar-archetype、Shareのみカスタマイズする場合は5. alfresco-share-jar-archetype、両方の場合は2. alfresco-allinone-archetypeを選べばよいと思います。

次に、どのバージョンを使用するか聞かれるので4.1.0を選択します(デフォルトで選択されているはずなのでEnterを押すだけでOKです)。

Choose org.alfresco.maven.archetype:alfresco-allinone-archetype version: 
1: 2.0.0-beta-1
2: 2.0.0-beta-2
3: 2.0.0-beta-3
4: 2.0.0-beta-4
5: 2.0.0
6: 2.1.0
7: 2.1.1
8: 2.2.0
9: 3.0.0
10: 3.0.1
11: 3.1.0
12: 4.0.0-beta-1
13: 4.0.0
14: 4.1.0
Choose a number: 14:

最後に、groupIdやartifactIdといった情報の入力を求められるので適当に入力します。ここで入力したartifactIdが、プロジェクトのディレクトリ名やビルド時に作成されるJARファイルのファイル名として使用されます。

Define value for property 'groupId': jp.aegif
Define value for property 'artifactId': alfresco-allinone-test
[INFO] Using property: version = 1.0-SNAPSHOT
Define value for property 'package' jp.aegif: : jp.aegif.alfresco

入力内容が合っているか聞かれるので、問題なければYを入力します(何も入力せずEnterでも同じです)。Y以外を入力するとgroupIdの入力からやり直すことができます。archetypeの選択からやり直したい場合はCtrl+Cで終了して最初からやり直せば大丈夫です。

Confirm properties configuration:
groupId: jp.aegif
artifactId: alfresco-allinone-test
version: 1.0-SNAPSHOT
package: jp.aegif.alfresco
 Y: :

「BUILD SUCCESS」と表示されたらプロジェクト作成完了です。

Buildして起動

最初にmvnコマンドを実行したディレクトリにartifactIdと同名のディレクトリ(ここではalfresco-allinone-test)が作成されているはずなのでそのディレクトリに移動します。

cd alfresco-allinone-test

このディレクトリで、LinuxやMacでは

./run.sh build_start

Windowsでは

run.bat build_start

を実行すると、カスタマイズが適用されたAlfresco(厳密に言うとAlfrescoを動かすために必要なコンテナ群)が起動します。

デフォルトではホスト側のポート8080がAlfresco Platform、8180がShareに割り当てられるので、Shareにアクセスするためには http://localhost:8180/share を開く必要がある点にご注意ください。使用するポートを変更したい場合もあると思うので、その方法については下の方でご説明します。

停止したい場合はCtrl+Cでログ出力を中止して、

./run.sh stop

または

 run.bat stop

で停止できます。

run.shやrun.batを見ていただけるとわかるように、build_startやstop以外にもいくつかコマンドが用意されています。PlatformやShareだけを再起動するreload_acsやreload_shareは実際に開発する際に使用頻度が高そうです。

また、作成されたPlatformやShareのプロジェクトは空ではなく、それぞれサンプルの設定ファイル等が入っているので、どこにどういうファイルを置けば変更が反映されるのか確認しやすいようになっています。カスタマイズが思ったように反映されないという時にはサンプルを参考にしてみると解決するかもしれません。

バージョンの変更

Alfrescoのバージョンを201911GAに合わせるには、run.shやrun.batがあるディレクトリのpom.xmlで以下のようにplatformのバージョンを6.2.0-gaに、shareのバージョンを6.2.0に設定してください(デフォルトではplatformが6.2.0-eaになっているはずです)。

<alfresco.platform.version>6.2.0-ga</alfresco.platform.version>
<alfresco.share.version>6.2.0</alfresco.share.version>

後で説明しますと上に書いたポートの変更方法ですが、このpom.xmlの以下の部分を書き換えると変更できます。

<share.port>8180</share.port>
...
<acs.port>8080</acs.port>

pom.xmlを変更したら、以下のコマンドでbuildし直せば完了です(run.batの方は省略)。

  ./run.sh stop
  ./run.sh purge
  ./run.sh build_start

不要なDockerイメージの掃除

最後に注意点として、このSDK4.1ではbuildする度にDockerのimageを作るので、何度もbuildしていると以下のようにdanglingなimageが大量にできてしまいます。これらのimageを使うことはないと思うので定期的に掃除した方が良さそうです。

REPOSITORY                                          TAG                 IMAGE ID            CREATED             SIZE
alfresco-content-services-alfresco-allinone-test    development         3182d8b5ebad        45 minutes ago      1.43GB
alfresco-share-alfresco-allinone-test               development         dc21bb791a51        45 minutes ago      786MB
<none>                                              <none>              51fe77a145c1        49 minutes ago      1.43GB
<none>                                              <none>              6cc266a96034        49 minutes ago      786MB
<none>                                              <none>              82290779e1a0        59 minutes ago      1.43GB
<none>                                              <none>              20aab698f49a        59 minutes ago      786MB
...

以上、SDK4.1を使用した開発環境の作り方をご紹介しました。作成したプロジェクトをEclipseやInteliJ IDEAといったIDEにインポートして開発したい場合は以下のドキュメントを参考に設定していただければと思います。
Setting up your development environment using Eclipse
Setting up your development environment using Intellij IDEA

Thursday, August 20, 2020

CentOS7にApache (httpd)の最新版2.4.43をインストールする(IUSリポジトリURLが変わってて若干はまった話)

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


今回はCentOS7にApache HTTP Server (httpd)の最新版をインストールする方法を備忘代わりに書いておこうと思います。

CentOS7向けのhttpdについては、CentOSのBaseリポジトリで公開されているバージョンが2.4.6と古いため、IUSリポジトリからインストールすることが一般的です。

最記事執筆時点ではIUSリポジトリで公開されているバージョンが2.4.43、Apache公式の最新版は2.4.46です。IUSリポジトリで公開されているよりも新しいバージョンが欲しい場合はソースコードからビルドする必要があります。

インストールされている古いhttpdの削除

2.4.6等の古いhttpdがインストールされている場合はアンインストールしましょう。

まず、起動しているhttpdを停止し、systemdへのサービス登録を解除します。

systemctl stop httpd
systemctl disable httpd.service

次に、httpdをアンインストールします。

yum remove httpd
yum remove httpd-tools

yumリポジトリの追加

必要なソフトウェアを入手するために、yumリポジトリEPELとIUSを追加します。

yum -y install epel-release
vi /etc/yum.repos.d/epel.repo
  ([epel]のenabledを0に変更する)
yum -y install https://repo.ius.io/ius-release-el7.rpm
vi /etc/yum.repos.d/ius.repo
  ([ius]のenabledを0に変更する)

これらのリポジトリをデフォルトで無効にしておくためにenabled=0に変更しています。なお、記事によってはIUSのURLがhttps://centos7.iuscommunity.org/ius-release.rpmとなっていますが、これは古いURLなので追加しようとするとエラーが出て失敗します(比較的最近リポジトリURLが変わったようです)。

依存ライブラリとhttpdのインストール

では必要なソフトウェアをインストールしてきましょう。

yum -y install centos-logos.noarch mailcap openldap-devel expat-devel libdb-devel openssl perl
yum --enablerepo=epel -y install nghttp2 brotli
yum --disablerepo=base,extras,updates --enablerepo=ius -y install httpd httpd-devel mod_ssl

以上で必要なソフトウェアがインストールされました。依存ライブラリが足りないよと言われた場合は適宜インストールしてください。

サービス登録と動作確認

最後にsystemdへのサービス登録を行いhttpdを起動します。

systemctl enable httpd.service
systemctl start httpd

start実行時にエラーが出ず、ブラウザでアクセスして It works! と表示されればインストール成功です!yumでインストールした時の設定ファイルのありかは以下のとおりですので参考にしてください。

  • /etc/httpd/conf/httpd.conf : httpd設定
  • /etc/httpd/conf.d/ssl.conf : httpd設定
  • /etc/logrotate.d/httpd : ログローテーション設定