Thursday, December 1, 2016

Alfresco勉強会#36 Alfresco 5でカスタムREST APIを作ってみよう

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

2016年11月30日(水)に弊社オフィスで開催された第36回Alfresco勉強会で、「Alfresco 5でカスタムREST APIを作ってみよう」という発表をしました。なお、もう1本の発表は「Google Docs連携の機能のご紹介」というタイトルで、Google Docsを使ってオンライン編集し、保存時にはAlfrescoに直接書き戻す連携方法が紹介されました。

なお、今回一番のトピックは、参加者が14人と過去最高を記録したことかと思います(パチパチ)。参加者が集まるようになって純粋に嬉しい反面、開催スペースが手狭でご不便をおかけしてしまいました。

さて本題ですが、Alfrescoはコア機能のほとんどをREST APIという形で外部から利用可能になっています。Spring Web Scriptsというフレームワークを使って実現しているのですが、そのWeb Scripts自体の簡単な説明と、Web Scriptsを使ったREST APIの追加方法を簡単に紹介しました。



資料でも紹介していますが、以下の3ステップで簡単にREST APIの追加ができます。
  1. 定義ファイル(xml)、ロジック(JavaScriptもしくはJavaで記述)、レスポンス生成用テンプレート(ftl)の3つを作る
  2. 所定の場所に格納する
  3. Web Scriptsをリフレッシュする

想像よりだいぶ簡単にできると思いますので、興味のある方は是非チャレンジしてみてください。
例えば以下のような場合には、必要なロジックを実装したカスタムREST APIを実装するメリットがあると思います。
  • 外部システムと連携したいけど期待される処理が実装されたREST APIが無い
  • 複数のREST APIを順次呼ぶような連携方式になってしまう

というわけで、次回Alfresco勉強会は2017年1月25日(水)になります。興味のある方はconnpass上のイベントから参加登録をお願いします。

また、Alfrescoの基本的な使い方や機能を知りたい、という方向けに「OSSドキュメント管理Alfrescoセミナー :  導入からチームコラボレーションの設定まで」というセミナーを定期開催しています。こちらの方が体系だったAlfrescoの説明を聞けると思いますので、興味がある方は是非お申込みください。

Alfresco勉強会#36 Google Docs連携の機能のご紹介

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

昨日11/30(水)に第36回目のAlfresco勉強会が開催されました。今回もいつもと同様に発表は2つあったんですが、もう一方の発表が開発者向けの技術的な話だったので私の方は手抜バランスを取って軽めのテーマにしました。

Alfrescoはアップロードされたコンテンツを編集するための機能を標準でいくつか実装しているんですが、その中からGoogle Docs連携の機能についてご紹介しました。


コンテンツをGoogleドキュメントで編集して更新するこの機能は「Microsoft Officeでの編集」や「オフライン編集」と違ってブラウザで全て完結するので、例えばMS OfficeがインストールされていないクライアントPCでもインターネットに繋がってさえいればOfficeファイルを編集することができたり、クライアントPCのローカルにファイルを置きたくない場合等、使える場面はいろいろあるのではないかと思います。ただ、Googleドキュメントで編集したファイルをダウンロードしてMS Officeで開いたら体裁が微妙にズレてしまうといった問題は(Alfrescoとは関係ないところで)発生してしまう可能性があるので、用途に合わせてどの編集機能を使うか選んでいただくのがよいと思います。

次回のAlfresco勉強会は1月25日(水)です。勉強会の冒頭でAlfrescoの概要についてさらっと紹介する時間を取っているので、Alfresco全く触ったことないという方でもざっくりとしたイメージは掴めるのではないかと思います。ご興味のある方は以下のリンクから参加登録をお願いします。

第37回 Alfresco勉強会

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

また、勉強会ではカスタマイズ開発や設定方法といった技術的な内容が中心になるのですが、それ以前にAlfrescoとはどのようなソフトウェアなのか、どのように活用できるのかといった内容をご紹介するセミナーも開催しております。ご興味がある方は以下のリンクからお申込みいただければと思います。

OSSドキュメント管理Alfrescoセミナー:導入からチームコラボレーションの設定まで

Tuesday, October 25, 2016

Alfresco勉強会#35 Javascript Console Add-onのご紹介

こんにちは。そうまです。

先月9月28日(水)に、弊社オフィスにて第35回Alfresco勉強会が開催され、そこで「Javascript Consoleのご紹介」という内容で発表させていただきました。

「Javascript Console」はAlfresco Shareの管理画面上で、JavaScript APIへアクセスするスクリプトを作成・実行することを可能にする開発者や管理者向けのAdd-onです。
「Javascript Console」Add-onを利用することで、繰り返し行うことのある定型的な操作をスクリプトで自動化したり、フォルダのルールで実行するスクリプトの作成やデバッグをAlfresco Share上で行えるようになります。
また、内蔵のスクリプトエディタにJavaScript APIを考慮したコード補完機能が付いているので、スクリプトの作成を効率的に行うことができます。

使いこなすと非常に便利なAdd-onですので、Alfrescoの開発や管理をしている方は一度試してみてはいかがでしょうか?



次回のAlfresco勉強会は11月30日(水)です。ここ最近の勉強会では本題に入る前にAlfrescoの概要についてさらっと紹介するようにしているので、Alfresco全く触ったことないという方でもざっくりとしたイメージは掴めるのではないかと思います。ご興味のある方は以下のリンクから参加登録をお願いします。

第36回 Alfresco勉強会

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

Monday, October 3, 2016

Alfresco勉強会#35 AlfrescoのアクティビティフィードをSlackに送るカスタマイズ

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

先週9/28(水)に第35回Alfresco勉強会が開催されました。今回は個人的にやってみたかったカスタマイズとして、AlfrescoのアクティビティフィードをSlackに流すというのを試してみたのでその方法をご紹介しました。Slackに送れることを確認することが第一の目的だったので送る内容のフォーマット等は改善点ということにして後回しにしています。実用化するにはまだまだ改良が必要ですが、こうすれば送れるということがわかっただけでも意味があったと思います。サンプルのソースコードもGithubに置いてあるので興味がある方はぜひ手元で試してみていただければと思います。


次回のAlfresco勉強会は11月30日(水)です。ここ最近の勉強会では本題に入る前にAlfrescoの概要についてさらっと紹介するようにしているので、Alfresco全く触ったことないという方でもざっくりとしたイメージは掴めるのではないかと思います。ご興味のある方は以下のリンクから参加登録をお願いします。

第36回 Alfresco勉強会

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

Wednesday, August 3, 2016

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

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

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

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


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

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

第35回 Alfresco勉強会

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

Monday, August 1, 2016

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

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

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



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

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

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

Thursday, July 21, 2016

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

こんにちは。linzhixingです。

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

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

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

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

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

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

NemakiWare 

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

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

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

fluentd

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

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

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

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

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

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

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

ElasticSearch

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

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

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

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

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

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

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

Kibana

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

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

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

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

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


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

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










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


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

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


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

まとめ

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