2016年1月16日土曜日

Raspberry Pi 2用GPIOオスメス変換アダプタ製作



RPi B+/A+以後はGPIOは40ピンになったので,B用にAdafruitから買ったコブラケーブルが使えなくなってしまいました。理由は26ピン用コネクタの両端がピンヘッダのピン間隔より広いから。「削ればまだ使えるのではないか?」と,いま気づいたけれど,ひとまず今後の課題とします。

それで,40ピンはIDEコネクタなので,画像検索してみるとIDEケーブルを使っている例が多数出てきます。

それもいいのだけれど,考えてみればブレッドボード用リード線のオスメス問題を解決したいだけなので,この方のブログエントリのように,40ピンソケットを向きあわせにはんだ付けすれば,ちと高さがアレだが十分ではないか,ということなんですね。素晴らしい発見だと思いました。

というわけで,秋月の長さを自由に切って使える2列のピンソケットが手元に常備されているので,早速取り組んでみました。実は在庫が足りなかったので,反対側は1列を重ねて,はんだ付けするのでまあいいやというやりかた。

作業は簡単で,老眼その他で目も手も怪しいのだけれど,さくさく作業が進んで,テスタで変なショートしたりずれたりしなかったか,両側にピンヘッダを差し込んで確かめてみても問題なく完了しました。よかった。

それで,このアダプタにピンの名前を印刷した紙を貼る,というアイディアをいただくことにしたのだけれど,控えめに,RPiに取り付けたときに上半分になる部分だけになるようにされていた部分,これは両幅いっぱいにして秋葉あきわさんの御札よろしく「火除け魔除けになって穴も隠れます」(牛ほめ)とするのがよいのではないかと思って,もとのodtに書かれていない,UART, SPI, I2C, PWMなど各ピンの用途を後ろに追加してみました。

スプレッドシートでどうやってぴったりのサイズに印刷できるようにするのかと思ったら,セルの高さが「0.1"」になっておりまして,印刷してみるとたしかに400milでした。幅は適当に「0.75"」にしてみましたが,あててみたらぴったり。素晴らしい。
1番ピン(奇数)側
2番ピン(偶数)側
貼り付けは,事務用のアラビアゴム糊です。一晩置いてみました。

仕上がりには満足しましたが,やっぱり紙なので保護が必要かなあと思い,透明テープを貼ろうとしたら,幅がほぼぴったりでなおびっくり。上の写真は,テープを貼ったので,はみ出したところが少し折れたりしております。ニッパで40ピンに切ったので少し長さが違っていて,カッターで削って揃えようとしたのですが,削りすぎたり足りなかったりで長さが少し違うためです。

GPIO_19に「PWM1」と書いてありますが,これはオーディオ用なんだそうです。「音声出力しないなら使ってもいいんじゃない?」とのこと。PWM2もあるけれど,それは映像用らしく,触るべきではないようです。詳しくは財団のフォーラム記事参照。モーターカー制御の予定があるので,PWMが2つとれればいいなと思って追記したんですが,使えるかどうかはためしていません。
内側はピン名が見づらいことが判明
RPi基板に載せてみました。外側(偶数ピン側)はいいんですが,内側(奇数ピン側)はとても見づらい。どうも失敗だったようです。節穴部分もへこんでしまったし... 何か埋めてからのほうがよかったんですね。パテとか。

ひとまず今回は,I2CやSPIが見えればよいということで納得することにします。いい工夫があったら,どなたかぜひ公開してください。

2016年1月9日土曜日

Raspberry Pi 2にArch Linuxを設定する

最小限の組み込みLinux環境を作るべく,Arch LinuxをRaspberry Pi 2にインストールしたので,そのメモ。

ひとまず起動用に,UHS-1 Class 10の8GBのマイクロSDカードを用意しました。Raspbianと違ってとても小さいのでこんなにいらないのだけれど,年末だったせいか,4GBは全部売り切れだったので,ひとまず最安値で。ブランドは東芝でしたが並行輸入品だそうで。

Raspberry Pi用のArch Linuxは,財団のサイトからは配布されていません。昔はみたような気がするんだけれど,とにかくいまはない。それと,イメージを書けばよいという簡単な話ではなくて,LinuxマシンでSDカードの設定をしていかなくてはいけないので,Linuxマシンが必要です。どのLinuxでもいいので,例えばUbuntuのCD-Rとか作って,CD-R起動の状態で,特にPC等へLinuxをインストールしない状態で作業してもいいんじゃないかと思います(よくわからない)。

手元にはArch Linuxで稼働しているマシンがあったので,作業はそれで行いました。

OS本体は,/rootパーティション以下を.tar.gzした状態で配布されています。また,Pi 2以外(Zeroを含む)とPi 2ではARM Coreの命令セットが違うのですが,別個に作って配布されています。

正直な話,Arch Linuxは他のディストリビューションと違って,Wikiがすべての情報源かつ,OS側に特別なサポートツールがないので,PCでArch Linuxにある程度慣れてからのほうがいいと思います。

というわけで,Wikiはこちら。

Arch Linux: Raspberry Pi

OSは,以下のページにずらっとARM向け各種が並んでいます。

 Arch Linux|ARM Downloads

Raspberry Pi 2はARMv7アーキテクチャということで,下の方に「ArchLinuxARM-rpi-2-latest.tar.gz」というファイルがあると思います。それ以外はARMv6アーキテクチャということで,上の方に「ArchLinuxARM-rpi-latest.tar.gz」というファイルがあると思います。

今回はRi 2用なので,下の方のやつをもってくるわけですが,先にSDカードの準備を含む手順があるので,その説明ページのリンクを示します。
手順はどちらも同じですが,一応Pi 2用に書かれているインストール手順に沿って書いてみます。
  1. SDカードを何らかの手段でLinuxにマウントします。USB接続のカードリーダを使うのが一般的だと思いますが,ノートブック型だとSDカードスロットがあって簡単かもしれません。そのデバイス名を見ておきます。買ってきた状態だと,FAT32でひとつのパーティションになっているはずなので,/dev/sdX1(Xは適当なアルファベット1文字)だけのデバイスに見えるはずです。僕の場合,なぜか/dev/sdg1だったので,以下,それ前提で書きます。
  2. rootになります。sudo -sでいいかな。お好みで。
    1. fdiskでパーティションを自分で切ります。# fdisk /dev/sdg
    2. 試しにpコマンドを入れると,現在のパーティションテーブルが見えると思います。これをメモリ上ですが,いったんクリアします。oコマンド。これでpすると,何もないんだよー的な数行の表示が出ると思います。続けて,nコマンドで/bootパーティション(FAT32フォーマット)を作ります。プライマリなのでpを入力し,1がデフォルト (パーティション番号1ということ)なので,そのままEnterを押してOK。続けてパーティションサイズをきかれるので,「+100M」と入力してEnterします。
    3. このパーティションをFAT32に設定するため,tコマンドを入力して,タイプにはcを入れるらしいです。これは,「W95 FAT32 (LBA)」という型に対応するようです。 心配なら,ここでpコマンドで確認してもいいと思います。
    4. 残りをext4ファイルシステムにするため,nコマンドでパーティションを追加することを指示して,プライマリp,2番目がデフォルトになっていると思うので,このままEnterを押してよいと思います。パーティションサイズは残り全部なので,そのままEnterで確定。この状態でpコマンドで確認してもいいと思います。
    5. 最後にメモリ上のパーティションテーブルを実際のSDカードに書き込みます。wコマンド。途中でわからなくなったら,wするまではSDカードは無事なので,^Cなどで中断して最初からやり直してもOK。
  3. 次に,手でファイルシステムを作ってやります。FAT32は,mkfs.vfatコマンドが必要ですが,Arch Linuxの場合,最初からは入っていません。
    # pacman -S dosfstools
    してやると入ります。
  4. # mkfs.vfat /dev/sdg1
    # mkdir /mnt/boot
    # mount /dev/sdg1 /mnt/boot
    
    パーティションが小さいので,わりとすぐに終わると思います。あと,デバイス名はくれぐれも先に調べたものに合わせてください。それと,Arch Linuxは/mntというディレクトリがあったので,そこにbootとrootを作ることにしました。お使いのLinux環境に合わせて適当に変更してください。/mnt/bootのなかみは空ですが,あとから移してきますので,マウントはしておいてください。
  5. rootパーティションのファイルシステムを作ります。ext4なのでおなじみの通り。
    # mkfs.ext4 /dev/sdg2
    # mkdir /mnt/root
    # mount /dev/sdg2 /mnt/root
    
  6. では,OS本体をもってきて,/root以下に展開します。今回はPi 2なので,そちらのイメージ。それ以外はそれなりに。
    # wget http://archlinuxarm.org/os/ArchLinuxARM-rpi-2-latest.tar.gz
    # bsdtar -xpf ArchLinuxARM-rpi-2-latest.tar.gz -C /mnt/root
    # sync
    
    wgetでとってきていますが,curlじゃなきゃやだとか思う人はcurl使ってください。ドキュメントに書いてあったのを転記しただけです。展開した後安全のためにsyncしていますが,SDカードイメージにそれなりの変更を加えているので,結構待たされます。心配になるかもしれませんが,1分ぐらいのつもりで待ちましょう。
  7. 最後に,/bootパーティションのなかみを/root/boot以下から移します。
    # mv /mnt/root/boot/* /mnt/boot
    
    ここで心配なら,再度syncしてもいいと思います。
  8. 以上でインストールは終わったので,後始末です。
    # cd /
    # umount /mnt/boot /mnt/root
    # rmdir /mnt/boot /mnt/root
    
おつかれさまでした。これで,SDカードのアンマウントも終わったので,カードはLinux PCから抜いて,Raspberry Pi 2に挿しなおしてください。

さて,以下は,Arch Linux ARM起動後の最小限の作業になると思うので, 今回はそこまでメモしておしまいにします。

最初はコンソールで作業しなければいけないので,RPi 2のUSBにキーボード,HDMIディスプレイ,Ethernetケーブルを挿して,電源を投入します。Wi-Fiしかない人は,PC用のArch Linuxのスタートアップマニュアルを参考にしてWi-Fi設定までやってください。

最初に電源を入れると,普通にLinuxの起動シーケンスが進んで,login: まできます。Arch Linux ARMのユーザ名は,Raspberry Pi版かどうかに関係なく共通で,「alarm」です。Arch Linux ARMの大文字の部分だけとってきたんだな,と思えば覚えられると思います。初期パスワードも同じく「alarm」です。

次に,rootの作業をするわけですが,驚くかもしれませんが,sudoが入っていません。よって,最初はsuする必要があります。rootの初期パスワードは「root」です。ログイン名とおんなじ。

気持ち悪いので,sudoを入れて,パスワードを変えたり,「pi」ユーザを作ったりすることにします。
$ su
Password: root
# pacman -S sudo
# vi /etc/sudoers
設定はお好みで。Raspbianに合わせるなら,
%wheel ALL=(ALL) NOPASSWORD: ALL
の行をコメントアウトするんだと思います。書き込み許可がないので,w!で強制書き込みします。

これで,sudoできるようになりましたが,alarmきもちわるいな,と思うので,ユーザ「pi」を作ってwheelグループに入れることにしました。
# useradd -G wheel -m -c "Pi User" pi
# password pi
(raspberryを2回入れる)
ついでなので,alarmはロックしてログインできなくしてしまいます。
# passwd -l alarm
rootのパスワードも変更しておきましょうか。
# passwd root
(お好みで)
 sshは最初から起動しているので,IPアドレスがわかれば,例えばいま作ったpiユーザでsshログインすることはできます。でも,やはりavahiを入れて,ホスト名を広報してもらったほうが使いやすいと思います。
# pacman -S avahi
# systemctl enable avahi-daemon
# systemctl start avahi-daemon
これで,「ホスト名.local」でつながると思います。AvahiはMac OSが採用しているmDNSなので,Windowsマシンからは,iTunes等を入れるなどしてApple Bonjourサービスが起動していないと見えません。

ホスト名は,/etc/hostnameに書かれている内容を起動時に読み込んで設定するので,お好みのホスト名に変更して再起動することで,リモートログインも気持ちよくできるんではないかと思います。初期状態では,「alarmpi」です。

最後に,SSH接続するMacなどの~/.ssh/configに,適当な設定を書いておくなど,通常のSSHクライアント設定をして,ひとまず完了かと思います。

2016年1月6日水曜日

逐次比較型A/Dコンバータの勉強

そもそもA/Dコンバータってどうやってできてるの? ADCデバイスをソフトウェアから使うとき,クロック周波数指定するけどどうして? という疑問から,いまさらながらにしくみを勉強したところ,逐次比較型A/Dコンバータって,上位ビットから順に二分探索で電圧値を求める(LSBは切り捨て)手順だということに気づいた。

説明は,第一種アマチュア無線免許の試験問題解説をされているRadio-GXKさんのサイトの記事がとてもわかりやすい。同時に解説されている二重積分形型についてもわかりやすくて,とてもよかった。

変換トリガとともにサンプルホールドした入力電圧値を,Aref電圧に対して,上位ビット(MSB)から1/2, 1/4, 1/8, ... と,求めるビット数分だけ割っていった電圧を保持するDAC(キャパシタで構成するのが一般的なようだ)を用意しておき,クロックごとに上位ビットから順に比較していき,入力電圧値がDACのそのビットの電圧値より大きければ1,小さければ0をを出力ラッチに入れると同時に,次のサイクルでDACのビット設定にも反映することをLSBまで繰り返す。

つまり,末端,葉の部分で左から0V,右に向かって2のbit数乗(8bitなら2^8=256)刻みでArefまでの値が並ぶ二分木として決定木を作り,根から左なら0,右なら1を選ぶように木をたどることでアナログの電圧値をArefの比でいくつになるのかを二進法で示した値が得られるということ。決定木は「コンピュータサイエンス・アンプラグド」の活動「20の扉」と,その解説が参考になると思う。MSBが根でLSBが葉になるところも解説の図と一致する。

なるほど二分探索ね,と思って検索してみたら,特許にそういう記述をしているものがあった。意外と大学の講義ノートのようなものには見かけないので,ソフトウェア屋さんとハードウエア屋さんの壁みたいなものを感じた次第。アルゴリズミックに動く回路なので,アルゴリズム名で説明すればいいのになあ。

一方,⊿Σ型ADCについては,日本人の発明ということで,ちょっと感動した。Wikipedia参照。PDMになる,というのは感覚的にはわかるがデジタル信号処理の理解が中途半端なので,式を見ていても,はあそうですかとしかならなかった。残念。

それで,ではPDMの結果をマルチビットにする(PCM相当に変換する)デシメーションフィルタってなんだろうと思ったら,⊿Σ変調含めて詳しく書いてあったブログがあった。このへんから入っていくと,すっきりわかるような気がする。decimationで辞書をひくと「サンプリングレートを大幅に下げる」って書いてあるけれど,高い周波数で1bit AD変換しているPDM結果を,適当な量子化ビット数に数えられるだけの間隔(例えば8bitなら,1/256)に落として,その区間における,元の周波数における1の数をカウントするという理解でよいのだろうか。密度の高低を値の大小に変換するわけだから。このページではディジタルローパスフィルタとなってて,検索してみると詳しい解説がいろいろあって,いくつか眺めているうちに,その表現に,ひとまず納得した。加算するので遅延していく(位相が遅れる)というのもアナログと同じ特性。なるほど。

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に構築したライブラリがモバイルアプリから参照でき、ダウンロードして再生することができました。

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

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

2015年11月17日火曜日

SSL LabsでA+評価をもらえるWebのTLS設定

職場で公開している、とあるWebサーバのCA証明書をようやく入手できたので、TLS対応しました。

いまどきはどんな設定するんだろうと思い検索すると、「SSL Labsで検査する」というのがひとつの指標のようです。

よい検査結果を得るためには、というか、これだけサイバー攻撃が激しくなっているいまを生き抜くために、2015年秋現在では最低でも使えるプロトコルはTLSv1以上にするのはもちろんのこと、暗号の組も現時点で弱いことが確定したものは排除しなければならず、さらに最近見つかったDHのlogjam脆弱性にも対応しなければいけません。

まず暗号の組は

Guide to Deploying Deffie-Hellman for TLS

で。とても長くなってますが、そういう時代なんでしょう。

このなかで、dhparam.pemファイル作成については

logjam対策でやったことまとめ

が日本語なのでわかりやすいと思います(といっても、opensslで1行コマンドですが)。

ここまでやって「B評価」。レポートを読むと、セッション関係の設定を改めなければならないようです。Nginxの場合ですが、ssl_session_cacheをきちんと設定するのがよいようです。ここまででひとまず「A評価」。レポートを見ると、「HSTS Preload」という項目が無効らしいことが気になります。

つまり、80番につないできたら443に飛ばす設定をして、HSTS Preloadというらしいですが、httpスキームを入れてもブラウザが80番でなく、443番に勝手につなぎにいく相手を並べたJSONファイルがネット上にあって、それに関連する設定を加えるのと、ブラウザが随時読みに行くそのJSONファイルに登録してもらう作業が必要なようです。

もろもろありますが、「とりあえずNginxならこう書いておけ」という例が

Nginx Configuration for HSTS Preload

というページにありました。ただ、resolverに8.8.8.8と4.4.4.4を設定しているのはやめるべきだと思う。

ひとまずここまでやると、「A+評価」になりました。うれしいです。

SSL LabsさんでA+評価いただきました

とはいえ、ブラウザがHSTS Preloadしないよという行は残りますので、HSTS Preloadファイルへの追加登録依頼をしなければいけないわけですが、それは

HSTS Preloadを導入しよう

というブログエントリにしたがって、Webフォームから入力することになるようです。このとき、www.ではじまるサイトが必要なようですが、当方まだできていないので、これは後日対応しようと思います。