2015年12月28日月曜日

温湿度気圧センサBMP280 Breakout基板について

BoschのBMP280温湿度気圧センサを使う例がいくつか紹介されていますが,試してみていくつかはまったのでメモ。

使用したのは,スイッチサイエンスさんオリジナルの「BMP280搭載 温湿度・気圧センサモジュール」であります。基板が青いので一瞬Adafruitかな?と思ってしまったのですが,Adafruitのは3.3Vレギュレータがついていて,あとピン配置も異なります。

配線ですが,使わないピンがないことに注意することが大事です。7ピンすべて,どこかにつなぐこと。具体的には,I2Cの場合,ピンを手前にしたときの並びで「SDO」を解放のまま使われている例が見られますが,これは「I2Cアドレスの選択ビット」になるので,必ずプルアップもしくはプルダウンしないと,I2Cアドレスがふらふらと変化して,変な値をランダムに出すことになります。
  • I2Cの場合,SDOはプルダウンで0x76,プルアップで0x77です。開放のままにしていると,両方のアドレスをふらふらします。
  • 右端のVioとVcoreの両方を3.3Vに接続しましょう。スイッチサイエンスのページではジャンパでつながっていると書かれていますが,手元の基板はそうなっていなくて,チップが動作しませんでした。
  • プルアップ抵抗は入れましょう。Raspberry Pi内蔵プルアップ抵抗があるからいいやと思っても,測定値がちゃんと得られていないように見えます。
それで,Arduino IDEからAdafruitのBMP280対応コードを入れると思いますが,内部でAdafruit_Sensor.hを読んでいて,これはライブラリ管理には登録されていないので,GitHubからZIPをダウンロードして,ZIPファイルからインストールする必要があります。

Raspberry Piの場合はPythonで試すと思いますが,python-smbusをパッケージマネージャ等から入れてから,Adafruit_Python_BMP280を入れることになると思います。GitHubのREADME.mdの記述通りにいろいろ入れようとすると,Python2.6が入ったりします。たぶん記述が古いので,python-smbusだけでよいはず。

あと,Adafruit_BMP280_Example.pyのなかでは,I2Cアドレスとして0x77が書かれているので,SDOピンをプルアップに変更するか,コードを0x76に書き換えるなどして,合わせる必要があります。エラーがどっと出るときは,アドレスが合わずにデバイスが見つかっていないときです。

設定ビットでは,オーバーサンプリング数やIIRフィルタの設定などします。スイッチサイエンスさんの説明がわかりやすいです。ただ,キャリブレーションの値の読み出しと計算については特に書かれていませんが,Boschのデータシートを見ると,出荷前にチップ内部のNVRAMに値が記録されているそうです。えらく大層な計算をしますが,精度を得るには必要なので,書かれている通りに補正計算ルーチンを使いましょう(もしくは使う言語に応じて移植しましょう)。固定小数点で計算する場合と浮動小数点計算する場合がありますが,精度が高々0.2%,湿度はもっと悪いのでどちらを使っても実用上の違いはないと思います。

それと,データシートを読まないと気づかないですが,湿度を得るまでのレイテンシは1秒かかります。1秒間隔で値を読みだすのはちとつらいと思います。

取り急ぎ,ご報告まで。

2015年12月17日木曜日

ownCloud 8で外部HDDをマウントして見せる別の方法

Another Solution for the Last Entry: Using Official Setting

There is another solution for mounting any folders out of data directory of ownCloud 8.

Please read carefully the document: Configuring External Storage (doc.owncloud.org)

Disclaimer:  The developer insists this "external storage support" is only for "Enterprise Edition".  This is only a report of my trial on open source edition of ownCloud 8.2.1.  I don't assure any occasions on you by following this procedure.

I tried by starting from writing configuration file because screen shots on the document looks not only for "Enterprise Edition".  But another document regarding to the GUI settings includes a "Enterprise Edition" logo in a screenshot.

After several trials, I could operate GUI screen even on the open source edition, but I don't describe the way for it.  One reason is a due diligence, but anyway I could not have yet making it clear how I reached at that point. 

Procedure with writing configuration file is following.  This is only a shortcut of the original document.
  1. Enable "External storage support" app.  One way is using Web GUI, another way is using ${owncloud}/occ command as described in the document.  Both works fine.  But before doing it, you might be better checking if your system already have "smbclient" command (from Samba3 package, etc) and PHP-FTP extension.  Either of these are missing, ownCloud shows warning messages on the admin screen.
  2. Compose "data/mount.json" file with a text editor.  My setting was like following:
{
  "user": {
    "tkamada": {
      "\/$user\/files\/Musics": {
        "class": "\\OC\\Files\\Storage\\Local",
        "options":  { "datadir": "\/Volumes\/HDD\/Musics" },
        "priority": 150
      }
    }
  }
}
The property "\/$user\/files\/foo" is a mount point of user's (in this case, "tkamada") ownCloud data folder, and the value of the other property "datadir" in "options" property is a real local directory path that you want to show.  In this case, it is an external drive mounted on the Mac as "/Volumes/HDD", which have a subfolder "Musics".

After saving your configuration file,  Reload the screen of ownCloud's Web app (or mobile app), Then you will see the "Musics" folder aligned with original "Documents" and "Photos" folders.

The GUI might be available right after procedure 1: activating external storage app,  Go "admin" screen, and try put "/" letter at the setting placeholder of external storage.  If you are lucky, you could choose one of supported external storages with selection menu.


前のエントリで書いたシンボリックリンクの方法以外に、外部フォルダその他各種ファイル共有をマウントする方法について書かれたドキュメントを発見しました。

「外部ストレージ」サポートはエンタープライズ版のみ、という目次になっていますが、読んでみるとGUI設定に関する説明のみであって(画面がオープンソース版と異なる)、手で設定ファイルを書く場合の文書は別のところにありました。試してみると、オープンソース版でもこの機能は動くようです。

また、運が良ければGUIからの設定も可能なようですが、どちらの場合も、管理画面(個人設定画面ではない)で作業をした場合のようです。不用意に個人設定をいじると設定が消滅し、最初からやりなおしになることがあるようです。

先に、設定ファイルを手書きする場合を述べますが、「外部ストレージ」サポートで、依存するものが足りずに管理画面に警告が出る状態の場合は、のちの設定で、この機能が停止に陥る場合があるようなので、smbclientコマンド(Samba3パッケージなど)とPHPのFTP拡張が入っていることを確認しておいたほうが無難かと思います。

設定ファイルを書くまでの手順はドキュメント「Configuring external storage (Configuration File)」にありますが、今回はローカルにあるディレクトリをマウントする場合に限って書いておきます。SMBやGoogle Drive, Dropbox等の設定は、ドキュメントに沿ってください。

以下、やってみた手順です。
  1. Web画面左上のアプリ追加「+」ボタンから、「無効なアプリ」にある、「External storage support」を「有効にする」ボタンを押します。このあとWebのホーム画面に戻ると、「ファイル」画面の左下に「外部ストレージ」が追加されます。これをクリックすると、「個人設定で追加できます」と言われますが、画面右上の自分のユーザ名メニューから「個人」を選んでいき、設定画面に追加された「外部ストレージ」GUIは、どこをクリックしても何も操作できませんでした。何度か試してみて、個人設定にいきなり入るのは避けたほうがよいようなので、ひとまず「クリックしない」方向で作業を進めるのがよいと思います。
  2. 次に、データ置き場である「data」フォルダの直下に、「mount.json」設定ファイルを作ります。名前の通り、JSON形式で記述します。例えば、/Volumes/HDD/Musics という外部HDD以下の音楽ライブラリを、"Musics"という名前で並べたければ、data/mount.jsonファイルの内容として、以下のように書くことになります。
{
  "user": {
    "tkamada": {
      "\/$user\/files\/Musics": {
        "class": "\\OC\\Files\\Storage\\Local",
        "options":  { "datadir": "\/Volumes\/HDD\/Musics" },
        "priority": 150
      }
    }
  }
}
トップレベルには、「group」「user」「特定ユーザ名(登録した人)」を書くことができるようです。それぞれ、登録したグループ、ユーザ、個別ユーザ、という意味に対応します。

今回は、「user」の下に自分のユーザ名を置くことにしました。

「user」セカンドレベルには、「all」あるいは特定ユーザ名を置くことができるようです。そこで、自分のユーザ名である"tkamada"を置きました。

その下は、外部ストレージの種類によって書き方がそれぞれあるようです。ローカルの場合は、まず、ownCloud側で見せたい場所をプロパティにして、その値として、マウント元の設定を書いていくようです。

"\/$user\/files"は、ownCloudの自分のホームディレクトリです。よって、"\/$user\/files\/Musics"と書けば、ホームディレクトリ直下のMusicsフォルダとして見せる、ということになります。

以下、値として3つのプロパティを持つオブジェクトを書くことになります。

"class": "\\OC\\Files\\Storage\\Local",

は、ローカルの場合の決め打ちです。PHPのクラス階層に相当するようです。

"options": { "datadir": "マウント元のフルパス" },

ですが、ローカルの場合、オプションは"datadir"のみということです。ここに、PHPのフルパスでマウント元を書きます。Windowsの場合、ドライブ名がどうなるか知らないので、PHPの仕様にしたがって書いてみてください。

"priority": 150

は、マウントの優先度を決める値とのことで、デフォルトは100で、大きいほど優先度が高くなるそうです。今回はよくわからないので、ドキュメントのサンプル値のままにしておきました。

以上で、Web画面を再読み込みすれば、設定が反映されてホーム画面に外部ストレージがマウントされている様子がわかると思います。ただし、内容が反映されるのは、データベースにすべてのファイルが登録されてからになるので、マウント元のライブラリが大きい(ファイルがたくさんある)場合は、しばらくかかります。

この先については条件を追い込んでいないのですが、管理画面に入ると、「外部ストレージ」という項目が追加されていて、GUI操作ができるようです。ひとまず、そのすぐ下にある「ユーザの外部ストレージを有効にする」のチェックを入れておくとよさそうです。この状態でGUIに設定を入力すれば、「mount.json」にも新しい設定内容が反映されるようです。

ひとまず以上ですが、これはただ、「やってみたらできた」というだけでして、無保証です。開発側の主張は「外部ストレージサポートはエンタープライズ版のみ」ということなので、読まれて試されるとしても、営業妨害にならないよう穏便に進められるのがよいと思います。

2015年12月14日月曜日

OwnCloud 8でシンボリックリンクを有効にする方法

Simple Solution:

Comment out lines 343-345 in ${owncloud}/3rdparty/league/flysystem/src/Adapter/Local.php
that check if the file is link or not.  Please see following Japanese description part if you want to see what is the code regarding to.

Then, you will re-activate the function for following symbolic link within your local data folder in ownCloud 8.2.1.

Only those three lines are the part for blocking traversal of {sym,hard}links in current implementation.


やってみたらできたのでご報告。

OwnCloud 7までは、利用者の共有領域からシンボリックリンクで外部ディスクのフォルダやファイルを指してもデータベースに登録できたのですが、OwnCloudでは「禁止」となりました。

参照:ownCloud Does Not Follow Symlinks (ownCloud 8.0 Release Note)
ownCloud’s file scanner does not follow symlinks, which could lead to infinite loops. To avoid this do not use soft or hard links in your ownCloud data directory.
シンボリックリンクは適当に張っていくと無意識にループを作ってしまうことがあり、そんな状態のファイルシステムをたどってデータベースにファイル登録する作業をかけるとまずいという意図はよくわかります。でもそれはそれで使い勝手がよろしくない。

検索してみるといくつか質問があり、公式フォーラムでは、逆にライブラリ本体をownCloudの管理下に置いて、他のアプリ用に通常の場所からシンボリックリンク張って使ってますよという話が出ていたりするわけです。

しかし、外付けの大容量HDDに整理したライブラリがあるのに、そこにownCloud本体を置いて、data/${ユーザ名}/files以下に移動するというのもどうなのかと思って調べてみました。ちなみに、この場合はWebサーバ側の設定で外付けHDDに置いたownCloudをrootに設定するとか、Webサーバから見える適当な場所にシンボリックリンクを貼るとかすることになります。

それで、ownCloud 8では外部のクラウドと連携してownCloud側でまとめるようなアプリの実現に、PHPライブラリのLeague\Flysystemを最初から内蔵することで対応しておりました。Amazon S3, Dropbox, SFTP, WebDAV, Azureなど数多くの外部サービスをローカルファイルと同様のAPIでアクセスする設計であります。なんか、既存のDropBox, AWS, Google Drive, SMB対応とかぶってるような気がしないでもないですが、徐々に統合されていくのでしょうか。

FlysystemにおけるローカルファイルのモジュールはLOCALでありまして、ドキュメントに「ルートからのパスの一貫性を破壊するからリンクはサポートしない」ということが宣言されており、結局それをownCloud 8が引き継いでいるのが、シンボリックリンク非対応の真相でありました。逆に、ownCloud側の${owncloud}/lib/private/files/storage/local.phpではリンクの場合リンク先のパスを調べ直す処理が残っていて、ownCloudが積極的にリンクを排除することを現状ではやっていないようです。

ownCloud同梱のFlysystemでは、

${owncloud}/3rdparty/league/flysystem/src/Adapter/Local.php

がLOCALファイルシステムの実装でして、343〜345行目あたり、normalizeFileInfo(SplFileInfo $file)メソッドの先頭の、
if ($file->isLink()) {
    throw NotSupportedException::forLink($file);
}
の3行が該当部分という、わりとあっさりな結論。このforLink()メソッドはただエラーメッセージを含む例外オブジェクトを返すだけの簡単な処理であります。びっくり。

この状態でownCloud 8.2.1を初期設定からやり直すと、あらびっくり、シンボリックリンク追跡機能が復活です。しっかり、外付けHDDに構築したライブラリがモバイルアプリから参照でき、ダウンロードして再生することができました。

あんまりにもあんまりなので、遠からず、しっかりリンクを排除するよう改善されると思いますが、検索でいろいろ質問が出る割には簡単な話だったので、ご報告する次第です。

いや、これはあれですか、公然の秘密ってやつなんでしょうか。だとしたら野暮な話でありました。