Firestoreのセキュリティルールのこと

バックエンドをFirebaseでSPAのシステムを作る場合、データを守る砦はデータベース(今回はFirestore)のセキュリティルールです。
Authenticationのログイン情報とFirestore上のユーザー情報を紐付けし権限によりドキュメントへのアクセスを制限するなど、適切な設定しなければなりません。

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

これは「ログインしているユーザーはフルアクセス」という最低限設定しておくべきルールです。開発中はお世話になりました。
しかし最終的にはもっとこまかく制限をかける必要がありますから、それを前提にデータ構造を設計しておいたほうが良いです。

例として今回作ったシステムのデータ構造とセキュリティルールの一部について解説します。

この投稿の続きを読む »

Facebooktwitterlinkedintumblrmail

Nuxt.js 悩み解決の小ネタ集

ここ1ヶ月程Nuxt.js + FirebaseでSPAのシステムを作っていました。

短期構築がご要望でリアルタイム性が求められる内容。Firebaseに向いていると判断、提案したところ技術構成は自由にやらせていただけることになりました。
別件で一昨年末あたりからずっとバックエンドはLaravel、フロントエンドは素のVue.js + Vuex + Vue Routerで開発やってるんですが、PWA化したほうがよさそうだったこともあってNuxt.js(以降Nuxt)使ってみようかなってことで採用。

Nuxt、便利ですね。特にプラグインとミドルウェアが素敵!

Firebase(今回使用したのはAuthentication、Firestore、Hosting、Functions)との相性もバッチリでした。

ですが初めてということもありいろいろと悩んだりもするわけで…
それらをどう解決したか?の小ネタ集です(というか今回の落とし所、かな)

この投稿の続きを読む »

Facebooktwitterlinkedintumblrmail

Nuxt.jsのbuild時にconsole.logを削除する

小ネタ集を書いていて分けておいたほうがよさそうだと思ったヤツ、その2。

nuxt buildでproductionビルドするときにconsole.logが削除されると良くないです?
良いですよね?なのでminifyを行うモジュールにはそういう機能が載っているようです。

Nuxt.jsのproduction時にconsole.logを削除する – くらげになりたい。

との情報を見つけました。ありがたい!

ですが、デフォルトのterser-webpack-pluginではなくuglifyjs-webpack-pluginに差し替えて実現されているとのこと。
この情報をもとに調査・実験をすすめたところterserのままでも可能でしたのでnuxt.config.jsのbuildの該当箇所を提示します(“nuxt”: “^2.4.0”)

この投稿の続きを読む »

Facebooktwitterlinkedintumblrmail

Vuexのモジュールから他のモジュールのメソッドを呼ぶには

muraveです。ごぶさたしております。

Nuxt.jsとかVue.jsの小ネタをまとめて書こうと思ったのですが、これは分けておいたほうがいいかな?と思ったので先に書いておきます。

Vuexのモジュールによる名前空間は処理を分割管理するのに便利です。

モジュール | Vuex

ですが、他のモジュールのメソッド(action, mutation)を呼ぶことができない(と思っていた)ので、不便に感じつつルートであるindex.jsに共通処理を集めたりなどしていました。が、先日、呼び出し方法に気づきました。

この投稿の続きを読む »

Facebooktwitterlinkedintumblrmail

ESP32でディープラーニング

先日作った熱画像をリアルタイムで見れるシステムを改造し、ディープラーニングしてみました。
ジャンケンの3つのジェスチャーを、赤外線アレイモジュールからの入力データをもとに推論します。
ジャンケンの画像データを使いディープラーニングする、というアイデアは雑誌Interface1月号の記事のまねをさせていただきました。他にもいろいろと参考にさせていただきました。
なお、雑誌Interface1月号の記事ではソニーのSPRESENSEボード、および通常のカメラボードを使って行っています。

ディープラーニングのツールとしてNeural Network Console(NNC)のクラウドを使い学習させました。
学習済みモデルをNNPファイルとしてダウンロードし、NNPファイルをC言語ファイルに変換後、ESP32に組み込みました。
【2019/02/04 追記】NNP以外にNNB(Cランタイムフォーマット)でもESP32に組み込むことができることを確認しましたので、それも追記しました。

この投稿の続きを読む »

Facebooktwitterlinkedintumblrmail

赤外線アレイセンサー「MLX90640」をESP32につないでWebSocketしてみました

MLX90640搭載の赤外線アレイモジュールをESP32につないで熱画像データを取得、それをWebSocketを使いブラウザから熱画像をリアルタイムで見れるようにしました。

MLX90640は32 x 24のセンサーを搭載し、I2CでESP32と通信を行うことができます。

この投稿の続きを読む »

Facebooktwitterlinkedintumblrmail

再帰的問い合わせで、複数点間の経路的な使い方

少しだけ時間が出来たので、以前使おうか迷っていたPostgreSQLのWITH RECURSIVEを使って複数点間の移動経路と距離を求めるようなSQLを作ってみました。
※使おうと思ってた箇所は、計算Costが問題になりそうだったので、結局group化する列を追加して対応しましたが。

この投稿の続きを読む »

Facebooktwitterlinkedintumblrmail

High Sierra にアップグレードしててヤラレる

muraveです。

開発機のリプレースを考えていたのですが、今のマシンを延命することにしました。
ディスクの残容量がカツカツでちょくちょくディスクフルになるのを除けばあまり不満ないなって。

樹脂部品がヤラレてワレたりとかはありますが。

そこで覚悟を決めてEl Capitanで止めてたOSのアップグレード、SSDの載せ替えを行ったのですがHigh Sierraさんに2点程かなりヤラレましたのでメモを残しておきます。

この投稿の続きを読む »

Facebooktwitterlinkedintumblrmail

Google ColabでGPU使用時に異常終了する問題

ディープラーニングの開発環境に、Google Colaboratoryを使用しています。
その一番の理由は、GPU(Tesla K80 GPU)が使える、ということです。
Macbook proのCPUにやらせるよりも、10倍は早いです。

しかし何かの拍子に以下のようなエラーが出て、トレーニング中に止まってしまう問題が発生しました。

ネットで調べたところ、
https://github.com/googlecolab/colabtools/issues/156

他のpythonプロセスが動作してるのが問題らしいです。
以下のような感じで、他のpythonプロセスをキルしたら、正常に動作するようになりました。

!ps aux
!kill -9 <pid>
Facebooktwitterlinkedintumblrmail

LibreOffice Online デモサーバを構築してみた。

Nextcloud との連携編

前回の記事で、loolwsdのインストール・起動までを取り上げましたが、loolwsd単体では、実用性がほぼありません。
そこで、今回は、loolwsdのUIとなるべきフロントエンドとなるNextcloudのインストールと連携を取り上げます。

Nextcloud のインストール

http、PHPの必要モジュール等のインストール

まずはhttpdと必要なモジュールなどをインストールします。

[lool@scw-6b31f8 ~]$ sudo yum install httpd mod_ssl
[lool@scw-6b31f8 ~]$ sudo yum install --enablerepo=epel,webtatic mod_php72w php72w-mbstring php72w-common php72w-mysqlnd php72w-gd php72w-xml php72w-pdo

/etc/httpd/conf/httpd.confの設定

/etc/httpd/conf/httpd.confを編集し、初期設定を行います。
今回は差分を掲載しておきます。

[lool@scw-6b31f8 ~]$ diff -urw /etc/httpd/conf/httpd.conf.orig /etc/httpd/conf/httpd.conf
--- /etc/httpd/conf/httpd.conf.orig     2018-04-11 05:27:26.000000000 +0900
+++ /etc/httpd/conf/httpd.conf  2018-05-28 17:49:27.559577372 +0900
@@ -94,6 +94,15 @@
 #
 #ServerName www.example.com:80

+ServerTokens Prod
+Header unset X-Powered-By
+Header append X-Frame-Options SAMEORIGIN
+Header set X-XSS-Protetion "1; mode=block"
+Header set X-Content-Type-Options nosniff
+RequestHeader unset Proxy
+TraceEnable Off
+ServerSignature Off
+
 #
 # Deny access to the entirety of your server's filesystem. You must
 # explicitly permit access to web content directories in other
@@ -141,14 +150,16 @@
     # http://httpd.apache.org/docs/2.4/mod/core.html#options
     # for more information.
     #
-    Options Indexes FollowSymLinks
+    #Options Indexes FollowSymLinks
+    Options FollowSymLinks

     #
     # AllowOverride controls what directives may be placed in .htaccess files.
     # It can be "All", "None", or any combination of the keywords:
     #   Options FileInfo AuthConfig Limit
     #
-    AllowOverride None
+    #AllowOverride None
+    AllowOverride All

     #
     # Controls who can get stuff from this server.

バーチャルホストの設定

nextcloud,libre,loolの3ホストを利用します。libre,loolに関しては、同一サーバ内で構築する場合は不要かもしれません。(未検証)
今回のデモサーバを構築する前に検証用として構築していたサーバの構成が、Nextcloudサーバとloolwsdサーバが別サーバである
環境であった為、3ホストでの構成となってます。

Nextcloud <->libre(Proxy)<->lool

libreサーバはProxyとして入っています。
Nextcloud内のLibreOfficeとの連携アプリ「Collabora Online」がhttps接続のみしか受け付けない仕様となっていたので、
https(ポート443番)で受けて、loolサーバのポート番号9980番へ中継するという形です。
libreサーバを設けず、loolサーバのポート443番で受けて、loolサーバか、もしくはlocalhostの9980へ中継するという構成の方が妥当かもしれません。さらに言うならば…loolに関しては…loolwsdサーバそのものが通信相手なので、certbotでSSL証明書を更新し続けるためのダミーだったりします。
が、今回は…3ホスト構成という事で…(LB構成を意識したのはナイショです。)

Nextcloudのバーチャルホスト設定

<VirtualHost *:443>
    Servername nextcloud.lancardcom.xyz
    DirectoryIndex index.html index.php
    DocumentRoot /var/www/nextcloud/
    SSLEngine on
    SSLProtocol all -SSLv2 -SSLv3
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
    SSLCertificateFile /etc/letsencrypt/live/nextcloud.lancardcom.xyz/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/nextcloud.lancardcom.xyz/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/nextcloud.lancardcom.xyz/chain.pem
    Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"

    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    CustomLog       "|/usr/sbin/rotatelogs /var/log/httpd/nextcloud/ssl_access_log_%Y%m%d 86400 540" combined
    ErrorLog        /var/log/httpd/nextcloud/ssl_error_log
    <Directory "/var/www/nextcloud/">
        AllowOverride All
        Options FollowSymLinks
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    Servername nextcloud.lancardcom.xyz
    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
    DirectoryIndex index.html index.php
    DocumentRoot /var/www/nextcloud/

    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    CustomLog       "|/usr/sbin/rotatelogs /var/log/httpd/nextcloud/access_log_%Y%m%d 86400 540" combined
    ErrorLog        /var/log/httpd/nextcloud/error_log
    <Directory "/var/www/nextcloud/">
        AllowOverride All
        Options FollowSymLinks
    </Directory>
</VirtualHost>

libreのバーチャルホスト設定

<VirtualHost *:443>
    Servername libre.lancardcom.xyz
    DirectoryIndex index.html index.php
    DocumentRoot /var/www/libre/
    SSLEngine on
    SSLProtocol all -SSLv2 -SSLv3
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
    SSLCertificateFile /etc/letsencrypt/live/libre.lancardcom.xyz/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/libre.lancardcom.xyz/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/libre.lancardcom.xyz/chain.pem
    SSLHonorCipherOrder on

    # Encoded slashes need to be allowed
    AllowEncodedSlashes NoDecode

    # Container uses a unique non-signed certificate
    SSLProxyEngine On
    SSLProxyVerify None
    SSLProxyCheckPeerCN Off
    SSLProxyCheckPeerName Off

    # keep the host
    ProxyPreserveHost On

    # static html, js, images, etc. served from loolwsd
    # loleaflet is the client part of LibreOffice Online
    ProxyPass           /loleaflet https://lool.lancardcom.xyz:9980/loleaflet retry=0
    ProxyPassReverse    /loleaflet https://lool.lancardcom.xyz:9980/loleaflet

    # WOPI discovery URL
    ProxyPass           /hosting/discovery https://lool.lancardcom.xyz:9980/hosting/discovery retry=0
    ProxyPassReverse    /hosting/discovery https://lool.lancardcom.xyz:9980/hosting/discovery

    # Main websocket
    ProxyPassMatch      "lool/(.*)/ws$" wss://lool.lancardcom.xyz:9980/lool/$1/ws nocanon

    # Admin Console websocket
    ProxyPass           /lool/adminws wss://lool.lancardcom.xyz:9980/lool/adminws

    # Download as, Fullscreen prezentation and Image upload operations
    ProxyPass           /lool https://lool.lancardcom.xyz:9980/lool
    ProxyPassReverse    /lool https://lool.lancardcom.xyz:9980/lool


    Loglevel debug
    CustomLog       "|/usr/sbin/rotatelogs /var/log/httpd/libre/ssl_access_log_%Y%m%d 86400 540" combined
    ErrorLog        /var/log/httpd/libre/ssl_error_log

    #Header always set Content-Security-Policy "default-src 'none'"

    <Directory "/var/www/libre/">
        AllowOverride All
        Options FollowSymLinks
    </Directory>
</VirtualHost>
                                                                                                                        <VirtualHost *:80>
    Servername libre.lancardcom.xyz
    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
    DirectoryIndex index.html index.php
    DocumentRoot /var/www/libre/
    CustomLog       "|/usr/sbin/rotatelogs /var/log/httpd/libre/access_log_%Y%m%d 86400 540" combined

    <Directory "/var/www/libre/">
       AllowOverride All
       Options FollowSymLinks
    </Directory>
</VirtualHost>

loolのバーチャルホスト設定

このバーチャルホストはLet’s EncryptでSSL証明書を取るためのダミーだったりします。
オレオレ証明書で起動した際、Nextcloudとの連携時に不具合が出た為、正規のSSL証明書で運用する事になりました。

<VirtualHost *:80>
    Servername lool.lancardcom.xyz
    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
    DirectoryIndex index.html index.php
    DocumentRoot /var/www/lool/
    CustomLog       "|/usr/sbin/rotatelogs /var/log/httpd/lool/access_log_%Y%m%d 86400 540" combined
    ErrorLog        /var/log/httpd/lool/error_log
    <Directory "/var/www/lool/">
       AllowOverride All
       Options FollowSymLinks
    </Directory>
</VirtualHost>

loolwsd 側の設定

連携時に必要なloolwsd側の設定です。
online/loolwsd.xmlにて設定します。
今回は差分を掲載しておきます。
設定の要はSSL証明書の格納場所と通信許可ホストとWOPIホストの設定です。

--- loolwsd.xml.orig    2018-06-04 09:59:41.709736164 +0900
+++ loolwsd.xml 2018-06-07 10:49:16.111249275 +0900
@@ -3,7 +3,7 @@
     <!-- Note: 'default' attributes are used to document a setting's default value as well as to use as fallback. -->
     <!-- Note: When adding a new entry, a default must be set in WSD in case the entry is missing upon deployment. -->

-    <allowed_languages desc="List of supported languages on this instance." default="de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru">de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru</allowed_languages>
+    <allowed_languages desc="List of supported languages on this instance." default="de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru">ja de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru</allowed_languages>

     <tile_cache_path desc="Path to a directory where to keep the tile cache." type="path" relative="false" default="/usr/local/var/cache/loolwsd"></tile_cache_path>
     <sys_template_path desc="Path to a template tree with shared libraries etc to be used as source for chroot jails for child processes." type="path" relative="true" default="systemplate"></sys_template_path>
@@ -39,7 +39,7 @@
         <color type="bool">true</color>
         <level type="string" desc="Can be 0-8, or none (turns off logging), fatal, critical, error, warning, notice, information, debug, trace" default="trace">trace</level>
         <file enable="true">
-            <property name="path" desc="Log file path.">/tmp/loolwsd.log</property>
+            <property name="path" desc="Log file path.">/opt/lool/loolwsd.log</property>
             <property name="rotation" desc="Log file rotation strategy. See Poco FileChannel.">never</property>
             <property name="archive" desc="Append either timestamp or number to the archived log filename.">timestamp</property>
             <property name="compress" desc="Enable/disable log file compression.">true</property>
@@ -65,16 +65,19 @@
     <net desc="Network settings">
       <proto type="string" default="all" desc="Protocol to use IPv4, IPv6 or all for both">all</proto>
       <post_allow desc="Allow/deny client IP address for POST(REST)." allow="true">
-        <host desc="Regex pattern of ip address to allow.">192\.168\.[0-9]{1,3}\.[0-9]{1,3}</host>
+        <host desc="Regex pattern of ip address to allow.">localhost</host>
+        <host desc="Regex pattern of ip address to allow.">nextcloud.lancardcom.xyz</host>
+        <host desc="Regex pattern of ip address to allow.">libre.lancardcom.xyz</host>
+        <host desc="Regex pattern of ip address to allow.">lool.lancardcom.xyz</host>
       </post_allow>
     </net>

     <ssl desc="SSL settings">
         <enable type="bool" default="true">true</enable>
         <termination desc="Connection via proxy where loolwsd acts as working via https, but actually uses http." type="bool" default="true">false</termination>
-        <cert_file_path desc="Path to the cert file" relative="false">/etc/loolwsd/cert.pem</cert_file_path>
-        <key_file_path desc="Path to the key file" relative="false">/etc/loolwsd/key.pem</key_file_path>
-        <ca_file_path desc="Path to the ca file" relative="false">/etc/loolwsd/ca-chain.cert.pem</ca_file_path>
+        <cert_file_path desc="Path to the cert file" relative="false">/etc/letsencrypt/live/lool.lancardcom.xyz/cert.pem</cert_file_path>
+        <key_file_path desc="Path to the key file" relative="false">/etc/letsencrypt/live/lool.lancardcom.xyz/privkey.pem</key_file_path>
+        <ca_file_path desc="Path to the ca file" relative="false">/etc/letsencrypt/live/lool.lancardcom.xyz/chain.pem</ca_file_path>
         <cipher_list desc="List of OpenSSL ciphers to accept" default="ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"></cipher_list>
         <hpkp desc="Enable HTTP Public key pinning" enable="false" report_only="false">
             <max_age desc="HPKP's max-age directive - time in seconds browser should remember the pins" enable="true">1000</max_age>
@@ -94,6 +97,9 @@
         <filesystem allow="false" />
         <wopi desc="Allow/deny wopi storage. Mutually exclusive with webdav." allow="true">
             <host desc="Regex pattern of hostname to allow or deny." allow="true">localhost</host>
+            <host desc="Regex pattern of hostname to allow or deny." allow="true">nextcloud.lancardcom.xyz</host>
+            <host desc="Regex pattern of hostname to allow or deny." allow="true">libre.lancardcom.xyz</host>
+            <host desc="Regex pattern of hostname to allow or deny." allow="true">lool.lancardcom.xyz</host>
             <host desc="Regex pattern of hostname to allow or deny." allow="true">10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}</host>
             <host desc="Regex pattern of hostname to allow or deny." allow="true">172\.1[6789]\.[0-9]{1,3}\.[0-9]{1,3}</host>
             <host desc="Regex pattern of hostname to allow or deny." allow="true">172\.2[0-9]\.[0-9]{1,3}\.[0-9]{1,3}</host>

httpd、loolwsdサービスの再起動

httpdとloolwsdを再起動して、これまでの設定を有効化します。
エラーが出る場合は、設定の見直しや必要なディレクトリやパーミッションの設定など調整してください。
例)構築中に実際にあったエラー原因
* ログ用のディレクトリを未作成、もしくはオーナー、パーミッションの設定間違い
* SSL証明書のディレクトリのパーミッション設定(700でroot以外読めなかった)
* ドキュメントルートのディレクトリを未作成
* 単純なconfファイルのタイポ

Nextcloudのインストール

ここまで長かったですが…やっとNextcloud本体のインストールです。
まぁ、ソースダウンロードして、ドキュメントルートにおいて、あとは、WebUIの指示に従ってインストールするだけなので、ほぼこれまでの準備が肝だったり。あ…Nextcloud用のDBの準備忘れてました。

Nextcloud用DBの作成

[root@scw-6b31f8 ~]# mysql -u root -p
Enter password:
elcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE データベース名;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON データベース名.* TO ユーザ名@localhost IDENTIFIED BY 'パスワード' ;
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> FLUSH PRIVILEGES ;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> QUIT
Bye

Nextcloudのソースのダウンロードと配置

[lool@scw-6b31f8 Archives]$ wget https://download.nextcloud.com/server/releases/nextcloud-13.0.2.zip
[lool@scw-6b31f8 Archives]$ unzip nextcloud-13.0.2.zip
[lool@scw-6b31f8 Archives]$ sudo cp -rp nextcloud/* /var/www/nextcloud/
[lool@scw-6b31f8 Archives]$ sudo chown -R apache. /var/www/nextcloud
[lool@scw-6b31f8 Archives]$ sudo systemctl restart httpd

後は、ブラウザで、Nextcloud用に設定したURLを開いて、画面の指示に従ってインストールを完了させます。
もしWebUIでのインストールがわからない…という方は…ドキュメントを読み直してください。
(すみません。画像貼るのが面倒なので手抜きさせてください。)
こちらのサイトなどを参照していただけると丁寧に解説されてます。
CentOS7にNextcloudインストール | server-memo.net
CentOS 7 : NextCloud インストール : Server World

Nexcloud側の連携設定

最後に、NexcloudのWebUI上の「アプリ」から「Collabora Online」を有効にします。
すると、「設定」の左サイドメニューに「Collabora Online」の項目が表示されますので、そこで、loolwsdサーバを指定します。
今回の場合は…Proxyであるlibreを指定するので、「https://」から始まるアドレスを入力して「適用」をクリックして完了です。
おそらくここまでの記事で設定を進めてこれた方であれば、見ればわかるので、スクリーンショットなど付けた説明は割愛させていただきます。
(さらにリンクを貼るのも手抜きさせてください。)

最後に構築後、操作してみた感じ

実際に、操作してみた感じですが、やはり…入力、変換等は通信ラグ等により、もっさり感がぬぐえません。まだ完全にLibreOfficeの全機能に対応してはいない為、メニューにはあるのに機能しない部分もちらほらありました。loolwsdのログを見て気が付いたのですが、なぜかUTC表示からローカル時刻への変更ができません。
上記の現象と同一の原因だと思われますがCalc(表計算)のNOW()関数などの結果もUTCで表示される為、その辺が難点になるかと思われます。
やはり…Microsoft Office365やGoogleAppsなどの大手商用サービスと比較すると、ユーザビリティに一歩劣る感は否めませんでした。

ただし…
– どうしてもデータをクラウド上に置けない。オンプレミスである必要がある。
->(社内規定などによるセキュリティ上の制限がある。)
– 内部での共有のみで、外部とのドキュメント等のやり取りをほぼ行わない。
->(MicrosoftのWard、Excelファイル等と互換はありますが、それほど互換性は高くないです。)
– ライセンスにコストをかけたくない
->(オープンソースなので構築コスト・保守コスト以外はかかりません。)
と言った場合には最適のソリューションではないでしょうか。

Facebooktwitterlinkedintumblrmail