ラベル Mac OS X の投稿を表示しています。 すべての投稿を表示
ラベル Mac OS X の投稿を表示しています。 すべての投稿を表示

2019年4月24日水曜日

Samsung X5 Thunderbolt 3 SSDをAPFSでフォーマットする

Samsung X5はThunderbolt 3接続なのでPCIexpressデバイスとして、システム情報では内蔵のSSDと同じ並びに表示されるが、ディスクユーティリティで選べるフォーマットはHFS+とexFATだけだった。

一方、ベンチマーク記事ではAPFSの数値も出ているので、何がおかしいのかわからなかった。

検索してみたところ、Appleの英文フォーラムに、ディスクユーティリティでGUIDパーティションにすることで自己解決したとあった。説明がわからなかったので他をいくつか読んでみると、スクリーンショット付きの解説があり、解決できた。

How to Format a Drive with GUID for macOS High Sierra, Mojave Installation - the Mac Observer by Jeff Gamet

X5は出荷時状態はexFATでフォーマットされていたが、パーティションテーブルがMBRのようだ。APFSはGPTであることが必要なので、ボリュームでなく、ドライブ全体を選べばパーティションのボタンが有効になり、そこでGUIDを選択すれば、APFSでフォーマットできる、ということらしい。

ドライブ全体を選ぶために、ディスクユーティリティのウインドウ左上の「表示」メニューで、「ボリュームのみの表示」から「すべてのデバイスを表示」に切り替え、現れたドライブ全体を選択するのがポイントだった。デバイス名では、例えばdisk3s1はボリューム、disk3がドライブ全体にあたる。

結果は、とにかく快適のひとことに尽きる。SATA3のSSDをUSB 3.0接続して、ファイルのコピーに45MB/s程度までしか出ない経験をして(カタログ上の数値の上限ではあるが)残念に思ったことがあるが、Thunderbolt 3接続では内蔵SSDと遜色ない反応をしている、と思う。

なお、何も考えずにフォーマットしたので、添付のアプリケーションを消してしまったが、Samsung Portable SSDのダウンロードページから「Activation Software for MacOS」として入手できた。ドライブの暗号化がメイン機能のようだが、ファームウェア更新ができたので、入れておくことにした。Cmd-Qで終了できないしメニューに項目がないのでどうやって終了するのかと思ったが、よく見ると右上に大きなバツが描かれていて、それをクリックする仕様だった。Appleのデザインガイドラインは気にしないらしい。

ちなみに、Thunderbolt Displayを使っている旧Mac mini Mid 2010に、Apple Thunderbolt 3 to Thunderbolt 2 Adapter経由でつないでみたが、認識しなかった。直結すればいいのかもしれないが、よくわからない。

macOSでホームディレクトリを外付けディスクに移動(owner問題の解決)

macOS Mojaveで動いているメインマシンは、Mac mini Mid 2011。最初のIntel Core(Sandy Bridge)な機種。実は昨年、2018年版が出る前にお亡くなりになり、急遽中古で入手したもの(松竹梅の竹から梅へダウングレードしたけれどしかたない)。店によっては2014年モデルも置いていたけれど、予算的に無理だった。

ところがそれも間もなく死亡のサインが現れてきた。経年劣化は避けられない。

そこでやむなく、積立てを崩すことにして、Mac mini 2018の梅モデルを購入。SSDはThunderbolt 3接続のSamsung X5にして補うことにした。500GB×2で運用していたけれど予算上500GBが限界だったので空きが足りず、まず現行のホームディレクトリをUSB 3.0(AkitoのThunderbolt 2 - USB 3.0変換ボックスを使っていたので)の外付けHDDに移すことにした。こうすれば、少なくともホームディレクトリの移行はスムーズになる。

移動にはdittoでコピーすればいいよ、-rsrcForkオプション忘れないでね、という記事は結構見かける(例えばこちらの記事など)。

再起動して同じようにログインできることまでは確認したのだけれど、Finderでフォルダに通行禁止マークがついていることに気がついた。開けないし、では、とchownしても全く変わらない。ls -lすると、owner:groupが_unknown:_unknown。あれ?

別の記事で、Cmd-iして「このボリューム上の所有権を無視」チェックボックスを外してからchownしてね(例えばこちらの記事)、というのがあり、これでようやく解決した。記事が分散している理由がmacOSのバージョン依存なのかどうか、ちょっと調べがつかなかったので、ここに両者をまとめた記事を置くことにした。

Samsung X5をAPFSでフォーマットするにはひと手間かかったのだけれど、日本語の記事が見当たらなったので次のエントリへ続く。

2016年12月14日水曜日

Mac OS Sierradでのボリューム修復

もう5年を超えるMac miniを業務のメインマシンとして使っているのですが、一昨年ドライブをいろいろと交換して、なんとか継続使用中です。

もう新しいマシンを購入できる予算がないので工夫するわけですが、昨夜自宅からつながらないなあと思ったら、起動前の白い画面で固まっておりました。っていうかいつ再起動したんだ。

いちばんつらかったのがTimeMachine用ドライブが認識しなかったことですが、これはDisk UtilityのFirst Aidでなんとかなりました。

一方、別の外付けドライブがFist Aidでどうにもならず、検索したんですが、起動ディスクが認識しないときの古い話で、「single user modeでfsck -fyを繰り返す」というのですが、Sierraにはどちらのオプションもありません。

試行錯誤したところ、
# fsck_hfs -l ファイルシステム名
で、なんとかなりました、とりあえず。「-l」は、マウント中でも強制チェックするためのもののよう。

まだまだ問題が出そうですが、ひとまずこちらへメモ。

2016年8月15日月曜日

FTDI VCPドライバが正常動作しない場合(El Capitan 10.11.6)

Arduino Nanoを最近使っていて、Macでシリアルデバイスが突然消えるので困っていた。

最初は/dev/{cu,tty}.usbserial-xxxxが生えるのだが、ポートを開いたり閉じたりしているといつのまにかデバイスが消えている。kextstatすればFTDIのカーネルモジュールはロードされているし、なにが起きているのかよくわからなかった。

というわけで、Google先生にお伺いを立ててみたところ、我らがParallaxのページに、「バージョン2.2.18と2.3があるが、10.9 (Mavericks)以後は2.3じゃないとだめだよ」ときちんと書いてあった。

いやまさか、最新ドライバに入れ替えたはずだと思ってFTDIのVCPドライバのページを見ると、同じことが書いてあり、El Capitanなら2.3の一択。間違えようがない。

不審に思ってkextstatすると、「com.FTDI.driver.FTDIUSBSerialDriver (2.2.18)」。ああすみません(泣)。

カーネルモジュールなので、kextunloadできるはずだと実行するも、「1 instanceがあるからunloadできないよ」と言われる。さっきまでつないでいたFTDIチップ搭載基板(Modern Device社のUSB BUB初代品)のせいで作られたインスタンスがなにかをつかんでいて消えないんだろう。

やむなく
# rm -rf /System/Library/Extensions/FTDIUSBSerialDriver.kext
を実行して再起動。そして、バージョン2.3を確認してダウンロードし、インストール。基板を接続すると、ちゃんと /dev/{cu,tty}.usbserial-xxxx が生えてきたのでkextstat。無事「com.FTDI.driver.FTDIUSBSerialDriver (2.3)」がおりました。よしよし。

カーネルモジュールちゃんとあるよね、と/System以下を見るも見当たらず、mdfindしたら、/Library/Extensions/FTDIUSBSerialDriver.kextに移動していた。あとからインストールしたものだから、たしかにこちらにあるべきで、いままでは何かの理由で/System以下に置いていたのだろうか、謎。

検索では「Mavericks以後はApple版のFTDIドライバがいるけれど不具合が云々」、というエントリがたくさんヒットしたのだけれど、「ドライバのバージョン間違いしてないか」を確かめることを注意したものが見当たらなかったので、書いておくことにしました。いや、そんな間抜けはいないのかもしれませんが、ここに1名おりまして。

それらの解説では、MavericksではApple版とFTDI版のkext両方がロードされてコンフリクトするようですが、El Capitanでは、FTDI版があればApple版ドライバがロードされることはないようでした。為念。

2015年11月5日木曜日

Mac OS XのKeychainに対応するOpenSSHパッチがGiHubにありました

以前、Mac OS Xのキーチェーンアクセスに対応したOpenSSHのパッチについてのエントリを書きました。

El Capitanになり、入っていたMacPortsの全リコンパイルをなんとか終えてしばらくしてから、port -uv upgrade outdatedしたら、MacPortsのOpenSSHが7.1p1になりました。

Homebrewのほうはどうだろうと思ったら、メンテナンスされているパッチのリポジトリをGitHubで見つけました。

https://github.com/zoltansx/openssh-keychain

Homebrewの場合は、dups/opensshのkegをeditしろとのことで、追加すべきコードを含め、手順がReadme.mdに書かれております。

気になる方は、上記URLを参照してみてはいかがでしょうか。

当方で試してみたところ、無事7.0p1がコンパイルでき、キーチェーンアクセスに保存されたpassphraseを用いてssh接続できました。ありがたや。

2015年11月1日日曜日

Yosemite以後のMac OSでJavaインストールのダイアログを消すにはJDKを入れる

そのまんまですが、El CapitanでJava6を入れないで、やむなくOracle JREを入れたけれど、いつまでもインストールしろとうるさいので調べたら、こんなFAQがOracleにありました。

After I updated to Mac OS X 10.10 (Yosemite), why am I told to install Java after I already installed the latest Java?

回答は、「full JDKを入れろ」でありました。Java SEですね。見つかりにくいですが、たぶんこのへんからたどるとよいのでは。

たしかに、JREだけだと空のディレクトリがあちこちにあって、なんか変だなと思っておりました。環境変数JAVA_HOMEを設定すればjavaコマンドは動きますが、ダイアログはシステムが出しているわけで、ユーザ側の環境変数は関係ないはずで。

それで、Java SE入れて再起動すると、あたりまえですが特に環境変数JAVA_HOMEを設定しなくてもOracle Java 8が動きました。まあ、しのごの考えないで、さっさと再起動するのがいいような気がします。

一方、検索してみると、El Capitanのrootlessを解除してApple Java 6を入れる手順が説明されていますが、気持ちはわかりますがやめたほうがいいんではないかと思う次第。

AppleのJava 6サポートはEl Capitanが最後なんだそうです。Java 6依存のコードは、Oracle Javaの新しいコード(Java 8とか)で警告なくコンパイルできるよう、リファクタリングしなければいけませんね。いろいろめんどくさいですが。

2015年8月17日月曜日

Yosemite 10.10.4とHomebrewのOpenSSH(追記:2015年11月5日)

(追記:2015-11-05 MacPortsの7.1p1対応、Homebrew用の7.1p1向けパッチの存在についてのエントリ書きました)

Mac OS X 10.11 El CapitanのPublic Betaも出てしばらくするのにこういう話で恐縮するわけですが,数日前に半日無駄につぶしたのが残念なので,同じ轍を踏む人がいないよう記しておくことにします。

まずみんなが困っていることが,Mac OS X Yosemite 10.10.4のOpenSSHは6.2p2であり,楕円曲線暗号を用いるECDSA対応がありそう(stringsするとecdsaの語は出てくる)けれど,鍵交換アルゴリズムにECDSA対応が入っていないためHost KeyにECDSAを使ったサイトに接続できないというところでありまして,結局使えない,ということであります。El Capitanは試していないので現状どうなっているのかわかりませんが,Beta 3のユーザがHomebrewしているところをみると,状況はかわっていないのかなと思われるところです(ここの末尾)。

ちなみに,Mac OS Xのsshのありがたいのは,launchdがログイン時に起動するssh-agentがパスフレーズをOSの「キーチェーンアクセス」により自動送信してくれることでありまして,通常ssh-addで明示的にパスフレーズを教えこむような手間を,ログインごとではなく,暗号鍵を作成し,最初に使うとき一回だけで終わらせてくれることにあります。とはいえ,そのコードは本家OpenSSHに反映される様子がなく,MacPortsでメンテナンスされているパッチを使って最新(に近い)OpenSSHを使うということになっておりました。

というわけで,MacPortsを使っている限りは,インストール時に+gsskexを指定することによって,Kerberos 5認証とセットでキーチェーンアクセス対応になるので,ssh-agentが/opt/local/bin以下にあるものを起動するよう,/System/Library/LaunchAgents/org.openbsd.ssh-agent.plist を書き換えて,そのあとログインしなおせばよい,ということでありました。

で,数日前に出た7.0p1に対してMacPortsでは,現状Kerberosはだめということで,キーチェーンアクセス対応パッチも通らない状況であるようです。いずれ誰かが調整してくれるのを待つしかない。

一方,Homebrewは哲学として,OSにあるものを極力使うという方針があり,OpenSSHもhomebrew-dupsをtapしてやらないと入らないようになっておりました。つまり,手順としては(7.0p1対応の現在)

  1. brew tap homebrew/dupes
  2. brew install openssh
以上,ということでして,いっとき存在した「OpenSSL 1.x系にするための--with-brewed-openssl」とか「キーチェーン対応のための--with-keychain-support」などのオプションはすべて外されており,逆に,「LibreSSLを使う--with-libressl」だけが唯一存在するオプションであります。とはいえ,上の手順でopenssl-1.0.2dも同時に入るので,OSの0.9.8zfを使うわけではないようです。

(ちなみにopensslとlibressl混在問題というのがあるらしく,まだ「混ぜるな危険」のようなので,libresslを入れるのは自己責任ということです)

これは要するに,10.10.4のssh使わないならMac OS Xと同等の動きを期待するなということでありまして,一般的なUNIXの流儀で使いなさいね,という判断であります。

かわりに,Funtoo Linux由来らしい,コマンドラインのkeychainというのがssh-agentの面倒をみるらしく,それ使えというコメントがあったり,解説している人もいますが,あんまり幸せになる感じがしませんでした。普通にssh-addしてるほうが安全な気がします。

ただ,Homebrewでキーチェーンアクセス対応しなくちゃやだ,という人は,6.2用に自作Formulaを公開している人もいるので,それをtapしてください。使いかたは,そこのREADME.mdにかかれている通り。入れ替えが終わったら,再起動して数分ほっとくのがよいようです(再起動後,launchdが出すエラーが/var/log/syslogにしばらく出ているけれど,そのうち落ち着くので)。落ち着くとlaunchdがキーチェーン機能つきのssh-agentを自動で起動してくれるようになります。

ただ,README.mdの末尾に書かれているスクリプトはあちこちで孫引きされてますが,全く意味がないので無視してください。

というのは,$(ssh-agent)と変数を参照してますがどこにも定義がないからexecしてもなにも起きないし,shellを落とすときにkillが走るようにtrapつけてますが,ssh-agentはlaunchdが管理しているので,shellには期待している環境変数SSH_AGENT_PIDがありませんから,killしたくても引数が空なのでなにも起きません。実害はないけれど全く無駄な処理が動く分だけ資源の無駄なんではないかと思います。

これに意味があるのはキーチェーンを使わない,つまり自分でssh-agentを立ち上げて,ssh-addで鍵を覚えてもらうときに意味がある記述です。ただ,いつ書かれたものかわからないけれど,いまならもっと簡単に書けます。bash前提にすると,
exec `ssh-agent -s`
function cleanup {
  ssh-agent -k
}
trap cleanup EXIT
が妥当ではないでしょうか。ただこれだとshellの数だけssh-agentが生まれてそれぞれ別のソケットを作るので,ターミナルを複数開くとshellごとにssh-addする形になってうれしくない。それよりは,最初にUNIXソケット決め打ちで-aオプションから指定することにしてそれを共通の環境変数SSH_AGENT_SOCKに持ち,一度起動したら,以後はssh-agentを起動しないほうがいいんではないかと思うところ。複数ユーザがいるなら,ユーザ名をソケット名に入れるのが妥当なんではと思ったり。

GNU screenやtmux使う人で,再接続したときに環境変数失ってssh-agentとお話できないのをごりごりする人がいるようですが,この考え方でスマートに解決できるんではないかとも思いますがどうでしょうか。

2015年6月6日土曜日

Yosemiteに入れてしまったApple Java 6を片付ける方法

Yosemite登場の10.10.0では、なにかと以下のダイアログが出てうるさく、AppleからJava SE 6をダウンロードしてインストールした方もおられると思います。
でも、10.10.3であるいまは、消してしまってもたいてい大丈夫なようです。おさらばしましょう。

Apple Java SE 6を入れた状態は、こうなっているはずです。
$ pkgutil --pkgs |grep -i java
com.apple.pkg.JavaEssentials
com.apple.pkg.JavaForMacOSX107
com.apple.pkg.JavaMDNS
com.apple.pkg.JavaSecurity
com.apple.pkg.JavaTools
ちなみに、Vanillaな(素の)Mac OS X 10.10.3でこれをやると、以下のようになります。
$ pkgutil --pkgs |grep -i java
com.apple.pkg.JavaEssentials
com.apple.pkg.JavaTools
つまり、間の3つを消せばよいということですね。

それで、pkgutilコマンドで削除できればよいのですが、できません。rubyでこのコマンドを書かれた方がいらっしゃるのでありがたく使わせていただくことにします。
$ wget https://raw.githubusercontent.com/niw/profiles/master/bin/rm_pkg_files
$ chmod +x rm_pkg_files
どこか適当にpathの通っているところに置いておくとよいかと思います。

というわけで、消してしまいましょう。ついついbashのfor文を書きたくなりますが、わかりにくくなるのでひとつひとつ順番に。
$ rm_pkg_files com.apple.pkg.JavaForMacOSX107
$ pkgutil --forget com.apple.pkg.JavaForMacOSX107
$ rm_pkg_files com.apple.pkg.JavaMDNS
$ pkgutil --forget com.apple.pkg.JavaMDNS
$ rm_pkg_files com.apple.pkg.JavaSecurity
$ pkgutil --forget com.apple.pkg.JavaSecurity
これでさようなら。pkgutil --forgetで、pkgの一覧から出ないようにするのを忘れないことと、先にforgetしてしまうとrm_pkg_filesは、pkgutil --filesの結果を使うので「消せなくなる」という悲しいことが生じるので、こちらを先に実行するようにしてくださいね。

for文で書くと、どっちがどっちかあまり考えずにワンライナーでやってしまい後悔する(あらためてAppleからダウンロードしてインストールしなおすはめに)ことになりますはい。

Mac OS Xのjavaは環境変数JAVA_HOMEで切り替えられる

Mac OS Xには、最初から/usr/bin以下にJDK 6相当のコマンドがずらりと入っておりまして、なんだこりゃと思うわけですが、なかなか面白い挙動をしたのでご報告。

Javaをインストールしていない状態でこれらを実行すると、例のダイアログが出ますね。
Javaが入っていないと出るいつものダイアログ
それで「詳しい情報...」をクリックするとOracleからダウンロードしてインストールするよう指示されるので、普通の人はそうするんだと思いますが、それでもなお、何かコマンドを実行するとこのダイアログが出てきて混乱するわけです。

そのとき、Apple Java SE 6を入れるとおさまるわけですが、Oracle Java 8はどうやって実行するの? という疑問が残ります。

それで調べてみると、環境変数JAVA_HOMEで実行先を指定するのが正しいようです。そこで、~/.profileあたりに
export JAVA_HOME="/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home"
と書いて
$ . ~/.profile
などとして読むとか、試すだけならいま開いているshellで実行してもよいわけですが、そうするとあら不思議、
$ java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
というわけで、Oracle Java 8が/usr/bin/javaから呼び出されるというわけです。

開発者なら、Oracle JDK 8を入れると思うので、そうすれば、Java 6時代のコマンドapt以外は全部Oracle Java SE 8で置き換えられるのでわりと幸せです。Java 8にしかないコマンドもあるので、/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/binをpathに入れるとかしたくなる人もいるかもしれません。

ちなみに、Oracle JRE 8を入れて環境変数JAVA_HOMEを設定して、JDKにしかないコマンドを実行するとどうなるか。例えばjavacなんかですね。
$ javac
Unable to locate an executable at "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/javac" (-1)
環境変数の先を実行しようとしてコマンドがないのでエラーになる、という動作をします。正しい動作です。

ところが、これに沿っていない困ったコマンドがひとつだけあります。/usr/libexec/java_homeです。
$ /usr/libexec/java_home
Unable to find any JVMs matching version "(null)".
No Java runtime present, try --request to install.
なんと、Apple Java SE 6を探しに行って、ないからインストールせよというわけです。まあ、Appleご謹製のコマンドなんでしょうがないですが、古い時代の、AppleがMac OS版Java公式配布をしていた時代に作られたソフトウェアでは、このコマンドでJavaの存在をチェックしているものがあるかもしれません。やめてもらいたいんですが開発止まってたらだめですね。どうにかならんもんでしょうか。

ついでなので、java_homeコマンドをもう少し深堀りしてみます。
$ /usr/libexec/java_home -h
Usage: java_home [options...]
    Returns the path to a Java home directory from the current user's settings.

Options:
    [-v/--version   ]       Filter Java versions in the "JVMVersion" form 1.X(+ or *).
    [-a/--arch      ]  Filter JVMs matching architecture (i386, x86_64, etc).
    [-d/--datamodel ]     Filter JVMs capable of -d32 or -d64
    [-t/--task      ]          Use the JVM list for a specific task (Applets, WebStart, BundledApp, JNI, or CommandLine)
    [-F/--failfast]                  Fail when filters return no JVMs, do not continue with default.
    [   --exec       ...]   Execute the $JAVA_HOME/bin/ with the remaining arguments.
    [-R/--request]                   Request installation of a Java Runtime if not installed.
    [-X/--xml]                       Print full JVM list and additional data as XML plist.
    [-V/--verbose]                   Print full JVM list with architectures.
    [-h/--help]                      This usage information.
ふむふむ、--execを通してやればよいのかと、環境変数JAVA_HOMEがOracle Java 8を指している状態で試してみます。
$ /usr/libexec/java_home -exec java
Unable to find any JVMs matching version "(null)".
No Java runtime present, try --request to install.
がーん! というか、やっぱりApple Java SE 6があることが前提なようです。

両方入れて、java_homeがうまく切り替えてくれるかは確かめておりませんが、注意喚起の意味でご報告する次第です。「java_homeには罠がある

2015年5月16日土曜日

YosemiteとArduino IDE 1.6.4でStuduinoを使う

Arduino IDE 1.6.4が出ました。そこで、前のエントリと重複しますがStuduino対応にするための手順を書いておきます。

まず、StuduinoはUSB-シリアル変換にProlificのPL-2303TAを使っているので、「PL-2303 Mac OS X Driver Download」のページから最新のデバイスドライバを入手してインストールしてください。

次にArduino IDE 1.6.4ですが、入れてすぐの状態で、一度は起動しておいてください。きちんと確認していないのですが、インストールした状態で(起動せずに)以下の変更を加えたら、なぜだか「Arduino.appは壊れています。ゴミ箱に入れる必要があります。」というダイアログが出てしまいました。逆に、一度でも起動しておけば、以下の変更を加えても大丈夫なようです。

以下、アーテックのライブラリを再度入れてください。Studuino/Studuino.cppに最近変更が入っています。ただし、比較を代入と間違える誤りが、別のところで再現しているので、以下の訂正をしておいたほうがいいと思います。
*** Studuino.cpp.orig 2015-04-07 19:09:40.000000000 +0900
--- Studuino.cpp 2015-05-16 19:29:18.000000000 +0900
***************
*** 813,819 ****
  {
    if(axis == X_AXIS) {
      return bt_result.accX;
!   }else if(axis = Y_AXIS) {
      return bt_result.accY;
    }else {
      return bt_result.accZ;
--- 813,819 ----
  {
    if(axis == X_AXIS) {
      return bt_result.accX;
!   }else if(axis == Y_AXIS) {
      return bt_result.accY;
    }else {
      return bt_result.accZ;
ライブラリの置き場所はお好みで。ご自身のプロジェクトディレクトリのlibraries以下でもよいですし、/Applications/Arduino.app/Contents/Java/libraries 以下でも。

最後にboards.txtの書き換えですが、以前と同様に、以下を末尾に追記する形でよいようです。ファイルの場所は、/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/boards.txt です。
proo.name=Studuino (3.3V, 8 MHz) w/ ATmega168
proo.upload.tool=avrdude
proo.upload.protocol=arduino
proo.upload.maximum_size=15872
proo.upload.speed=115200
proo.bootloader.tool=avrdude
proo.bootloader.low_fuses=0xc6
proo.bootloader.high_fuses=0xdd
proo.bootloader.extended_fuses=0x02
proo.bootloader.path=optiboot
proo.bootloader.file=optiboot_pro_8MHz.hex
proo.bootloader.unlock_bits=0x3F
proo.bootloader.lock_bits=0x0F
proo.build.mcu=atmega168
proo.build.f_cpu=8000000L
proo.build.core=arduino:arduino
proo.build.variant=arduino:standard
proo.build.board=AVR_PROO
他のボードの設定を読むと、1.6.4では新たなプロパティが加えられているようですが、ひとまず以前のまま(これ)で動いています。

2015年4月4日土曜日

YosemiteとArduino IDE 1.6.3でStuduinoを使う

前のエントリを出した翌日にArduino IDE 1.6.3が出たのと、4月1日付けでアーテックのArduino IDE用ライブラリが更新されたので、新たに書き起こします。

ちなみに、「スタディーノとはなにか」は、前のエントリをご参照ください。

Arduino IDE 1.6.3では、ライブラリマネージャとボードマネージャを使う方向が一応完成したようで、1.6.2の混乱した状況は「なかったこと」になっているようです。一応、1.6.2の設定のままでも動くようになっているようですが、将来的にどうなるのかわからないので、思い切って ~/Library/Arduino15 以下は、必要なもののバックアップをとった上でごっそり捨ててしまったほうがよいように思います。

それでArduino IDE 1.6.3を再起動すると、~/Library/Arduino15 以下は以下の内容だけになります。
  • library_index.json
  • package_index.json
まじかよって感じですが、JSONで記述された、それぞれライブラリマネージャとボードマネージャが参照する設定ファイルのようです。

あと、何か設定を変えたりスケッチを編集するなどすると、これまで通りのpreferences.txtもできます。

それで、これらに追記してライブラリマネージャやボードマネージャで対応できるようにすればいいかと思いきや、ボードはArduino IDEのパッケージとして組込みなので、「ボードだけの設定はない」わけです。ライブラリも、アーテックはひとまとめにして提供しているので、簡単に追記というわけにいかない。せめてlibraries以下でないようにしてくれればいいのに。

結局、/Applications/Arduino.app以下が再び整理されて、一通り展開されたものが入っている形に戻ったので、そちらに手を加えればよいことになりました。

まず、boards.txtは、以下のところになりました。アーキテクチャが増えたので、アーキテクチャごとのディレクトリ以下(今回はavr以下)になります。
/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/boards.txt
 このファイルの末尾あたりに以下を追記します。
proo.name=Studuino (3.3V, 8 MHz) w/ ATmega168
proo.upload.tool=avrdude
proo.upload.protocol=arduino
proo.upload.maximum_size=15872
proo.upload.speed=115200
proo.bootloader.tool=avrdude
proo.bootloader.low_fuses=0xc6
proo.bootloader.high_fuses=0xdd
proo.bootloader.extended_fuses=0x02
proo.bootloader.path=optiboot
proo.bootloader.file=optiboot_pro_8MHz.hex
proo.bootloader.unlock_bits=0x3F
proo.bootloader.lock_bits=0x0F
proo.build.mcu=atmega168
proo.build.f_cpu=8000000L
proo.build.core=arduino:arduino
proo.build.variant=arduino:standard
proo.build.board=AVR_PROO
アーテックのライブラリは、新しいセンサ類(Bluetoothシリアル、赤外線リモコン受信器、カラーセンサ、超音波距離センサ、温度センサ、ジャイロ・加速度センサ)のドライバが追加され、APIドキュメントも4月1日付で改訂されています。Webには何のアナウンスもないので、開いてみて初めて気づくという仕様です。

そこで、新しい「Studuinoライブラリセット」(libraries.zip)をアーテックのサイトからダウンロードしてunzipします。すると、libraries以下に、
  • ColorSensor
  • IRremoteForStuduino
  • MMA8653
  • MPU6050
  • Studuino
 の5つのディレクトリができるので、これを
/Applications/Arduino.app/Contents/Java/libraries
以下に移動します。これで完了。もし、以前のライブラリを自分のプロジェクトディレクトリ以下に置いていた方は、そちらを置き換えるか、消しておかないとコンパイラが「ライブラリが複数ある」といってエラーを出しますのでご注意ください。

ついでですが、Studuinoの下のexamplesは消滅したので、Blinkを試すことはできなくなりました。

記憶にあるものと同内容を再現するなら、こうなるかと思います(delay()使っていたのをboard.Timer()に直しました)。
#include"arduino.h"
#include<Arduino.h>
#include<Servo.h>
#include<Wire.h>
#include<MMA8653.h>
#include<MPU6050.h>
#include<ColorSensor.h>
#include<IRremoteForStuduino.h>
#include"Bluetooth.h"
#include"Studuino.h"
Studuino board;
 
void setup() {
  board.InitSensorPort(PORT_A4, PIDLED);
}
 
void loop() {
  board.LED(PORT_A4, ON);
  board.Timer(1000);
  board.LED(PORT_A4, OFF);
  board.Timer(1000);
}
このスケッチをBlinkの名称で保存し、/Applications/Arduino.app/Contents/Java/libraries/Studuino の下にexamplesディレクトリを作成し、そこに移せば「ファイル」→「スケッチの例」 メニューにStuduinoが現れて、以前と同じになります。

2015年3月31日火曜日

YosemiteとArduino IDE 1.6.2でStuduinoを使う(訂正あり)

(追記:2015-04-04 Arduino IDE 1.6.3対応と、アーテックのライブラリ更新について、次のエントリに書きました。以下は参考までにしていただき、新しいほうをご参照ください)



東大阪の学校向け教材メーカー、アーテックのスタディーノ(Studuino)という、Arduinoとモータドライバを一枚にした基板があり、一般向けに秋月共立が取り扱っていることもあり、結構お使いの方がいらっしゃるようで、ブログエントリをたくさん見かけました。

上でショップ名に商品のリンク貼ってるんですが、値段がそうとう違うのは、企業向けと学校向けでボリュームが違うから卸の価格も違うんだろうと。どっちがどっちかは想像にお任せする感じで。

スタディーノはクロック8MHzのATmega168、USB-シリアルにProlificのPL-2303TAを使っていて、モータドライバ(Toshiba TB6552FNG)と大量のピンヘッダやコネクタ分の価格を、CPUのスペックを落としたり安価なUSBデバイスを使うことで補っている雰囲気なのが特徴かと思います。(商品紹介ページ

ピンヘッダが大量にあるのは、通常のピンソケットとは別に、すべてのI/Oに電源ラインがセットになっていて、3ピンソケットのケーブルで入出力デバイスを接続できる設計だからです。カタログを教材販売店からいただいたのですが、以下のモジュールが専用品としてラインナップされていて、プラスチックブロックに入っており、他にキューブ型などいろいろなプラスチックブロックの組み立てでロボット風味の工作ができるように考慮されています。レゴっぽいといえばそうかもしれない、というところです。

ちなみに上からサーボモータまで全部盛りセットは「Robotist Advance」になるので学校関係の方でいろいろ試してみたい方(特に加速度センサが必要な方)におすすめしておきます。「計測と制御キット」のシリーズや「うきうきロボットプログラミング」のセットには加速度センサが入っているものはいまのところないようです。
  • タッチセンサ(押しボタン風味。ストローク5mmぐらい)
  • 圧電スピーカ
  • LED(赤、緑、青、白)
  • 赤外線フォトリフレクタ(Rhom RPR-220
  • フォトトランジスタ(Siemens SH309)
  • 音センサ(ECM+アンプIC、現物がないので未確認)
  • 加速度センサ(Freescale MMA8653FC
  • DCモータ(ギヤードモータ)
  • サーボモータ(いわゆる超小型サイズでトルク3kgらしい)
  • 温度センサ(Microchip MCP9700
  • 赤外線リモコン受信器
  • カラーセンサ(AMS-TOAS TCS3414CS)
  • 超音波距離センサ(HC-SR04)←Parallax Inc. "Ping))"の中華コピーの代表かと
  • ジャイロ・加速度センサー(Invensense MPU-6050
  • Bluetoothシリアル(Robotech RBT-001)―プラスチックブロックなし
  • 技適なしBluetooth 2.0+EDR←...

上記パーツはどれも基板に実装されていて、日圧のPHの4ピンソケットがついてます。実際に使うのは2〜4ピンなわけですが、スタディーノ側が3ピンソケットになったケーブルを使い、4ピンはI2C接続のみなので、3ピン2列のソケットでA4, A5, VCC, GNDに接続することになるわけです。専用ケーブルは一応I/Oラインはグレー、電源は±どちらも黒、になっていて逆刺ししないよう色で区別するようになっているので念のため(僕は最初間違えてから気づきました)。

DCモータ端子も外部電源端子もPHの2ピンです。モータと電源の関係では、モータ用電源とロジックの電源は小さなダイオード通して共通(ロジック側はレギュレータで3.3Vにしている)なので、モータドライバの発熱を心配するほどの使い方は考えられていないと思います。純正電池ケースが単3形(AA)電池3本用なので、アルカリ電池で4.5Vとか二次電池で3.6Vとか、そういう使い方の範囲にとどめて、たくさん電流流したい人はシールドの利用を考えるべきでしょう。また、サーボの電源もモータと共通です。

普通のArduinoと言われるUnoは、クロック16MHzのATmega328、USB-シリアルはATmega8U2というUSBつきの小さなAVRを使ってCDCクラスのデバイスを実装しているので、Mac OS XやLinuxではドライバのインストール不要で勝手にデバイスが生えますが、スタディーノはメーカー製チップを使っているのでメーカーのデバイスドライバが必要です。

前書きが長くなりましたが、そういうわけで、YosemiteとArduino IDE 1.6.2で使うためのメモを書いておこうと思いました。

まず最初にはまるのがデバイスドライバだと思います。Prolificは昔いろいろと苦労させられた方が多いと思いますが、なにかあったら、最新のデバイスドライバを探すことが第一だと思います。その際、末尾の型番がいろいろありますが、スタディーノで使っているのはTAなので、以下のリンクから、TA対応の最新版をダウンロードしてください。アーテックのダウンロードページにあるものは最新とは限らないです。(いま現在掲載されているものでもYosemiteでも動くらしいですが、僕のところではデバイスが生えませんでした。バージョン番号はかわっていませんが、plistの変更があったのかもしれません)
Prolific PL-2303のページ
初めてProlificのドライバを入れる方への注意ですが、Mac OS Xの場合kextなのでkextloadコマンド叩けばいいはずなのに、インストーラはマシンを再起動させます。なんとかならんものか。

アーテック側で用意されている、Scratch 1.4を魔改造(ほめてます)した開発環境にはArduinoのコンパイラとライブラリが入っているので、Scratchでプログラムする分にはこれ以上特に考えなくてもわりとサクサク動いて面白いのですが(ダウンロードページにScratchライセンスとGPLv2ライセンスでソースコード全部が置いてあるので読むと楽しいです)、Arduino IDEを使うには、作業が必要です。

アーテックのページには、Arduino IDE 1.0.5を使う方法が書いてありますが、こちらはAdafruit版やらいろいろ入っているせいかどうも動きがおかしく、これを書いているいま最新の1.6.2で使えるようにしました。

まず、標準のArduino IDEはこのボードを知らないのでboards.txtに追記が必要ですが、1.x(0以外)以後は構成がかわったようで、ユーザのホームディレクトリ側を書き換えればよいようです(「ツール」→「ボード」→「Boards Manager...」というメニューがありますが、使うのは1.6.3以後を待て、のようです)。以下のところにありました。
~/Library/Arduino15/packages/arduino/hardware/avr/1.6.2/boards.txt
で、この末尾にでも、以下の内容を追記します。
proo.name=Studuino (3.3V, 8 MHz) w/ ATmega168
proo.upload.tool=avrdude
proo.upload.protocol=arduino
proo.upload.maximum_size=15872
proo.upload.speed=115200
proo.bootloader.tool=avrdude
proo.bootloader.low_fuses=0xc6
proo.bootloader.high_fuses=0xdd
proo.bootloader.extended_fuses=0x02
proo.bootloader.path=optiboot
proo.bootloader.file=optiboot_pro_8MHz.hex
proo.bootloader.unlock_bits=0x3F
proo.bootloader.lock_bits=0x0F
proo.build.mcu=atmega168
proo.build.f_cpu=8000000L
proo.build.core=arduino:arduino
proo.build.variant=arduino:standard
proo.build.board=AVR_PROO
 アーテックの用意しているboards.txtに加えて、proo.upload.tool=avrdudeを書かないと、「書き込むツールがわからん」と言って転送エラーで止まります。proo.build.board=AVR_PROOについては大阪電気通信大学の兼宗先生からご教示いただきましたが、たしかに他のボードに倣って追記しておいたほうがよさそうです。

そのあと、アーテックのページにある「Studuinoライブラリセット」のzipを展開して、プロジェクトディレクトリ下に作ったlibrariesなり、/Applications/Arduino.app/Contents/Java/libraries 以下なりお好みのところに移動します。これで完了。

サンプルとしてBlinkが用意されているので、「ファイル」→「スケッチの例」→「Studuino」→「Blink」を開いて、コンパイル、書き込みができることを確認してください。このサンプルはA4で点滅するので、A4端子にLEDを接続する必要があることに注意、です。下手にArduinoの経験があるとD13が点滅するんだろうと思ってしまいますが、スタディーノの流儀にしたがい、APIドキュメントにしたがって書かれたスケッチです(そのわりにboard.timer(1000);でなくdelay(1000);なのはなぜだろう、とか思わない大人になりたいです)。

というわけで、ひとまずセットアップについて書いてみました。

2014年11月10日月曜日

MacでownCloud

結論:

  • MacでownCloudは動く。ただしファイル名の扱いに注意(特にフォルダ作成はトラブルが生じうる)
  • MacPortsかHomebrewで入れたPHPとそれをCGIとして呼び出すWebサーバ(SSL証明書が必要)があれば、Webサーバの文書ディレクトリにソースを展開するだけ
  • SQLite3とPHPのsqlite拡張を入れればDBサーバ不要でさらに簡単


Bitcasaの実質値上げで、自分用に置いていたいろいろ自炊データなど1.4TBを引き上げているところなのですが、結局なぜクラウドを借りるかというと、HDDを増設することなく全部のデータを一貫して取り扱いたいわけで、そこに「定額・目安は1TBだけれど超えてもOK」というBitcasaは最適だったわけです。

ところが噂によれば、ペタバイト置くごく少数の客が使うだけで、1TB年額$100という見積りに沿った客がほとんどつかなかったから、1TB制限で年額2万円、それ以上は要お問い合わせという形でバランスとることになったというんですが、例えていうならば、ドリンクバーのみで何日も泊まりこむ客しかいない飲食店のような殺伐とした状態という話で、それではテコ入れやむなしと思った次第です。

ちょうど年度更新の時期で請求に身構えていたところなので、東芝の3TB 3.5" HDDが特価1万円弱の表示品(あとで税込み請求されてがっかり)を購入、ガワも買ってなんだか結構な出費になったものの、引き上げ準備ができて、通信制限と11月15日という期限におびえながら、できるところまでやってみようとしているところです。1.4TBを1ヶ月でダウンロードするのは結構勇気が必要です。アップロードは「次やったら契約解除するかんな」とISPから警告文書を郵送で頂戴したので、まあそのときは秒速4MBぐらいで一日かけて90GBぐらいクラウドにscpしたのでしょうがないんですが。

クラウドドライブのサービスでなにがいいかというと、僕としては、モバイルアプリでファイルの一覧が簡単にみえるところです。あれはもうあったかな、というのがすぐ確認できるところ。WebDAVでもいいけれど、閲覧性は専用アプリが上。GoodReaderとか正論をいう人は置いていきます。

というわけで、ownCloudです。以前、VPS上のFreeBSDで動かそうとして断念した記憶があるのですが、モバイルアプリ含めてトータルに使うとなると、軽く調べた範囲ではこれしかないのかな、という印象でした。

Community Edition」が無償で使えるサーバ側のソースなんですが、ダウンロード時に要件をみると、「Mac OS XはUNICODEの扱いに問題があるのでサポートしない」とあって、困ったな、と検索すると、なんだかバイナリを配布しているところがあって、でもそれ入れてみると勝手にApacheとMySQLを起動しようとしてすでにこのMacではNginxとMySQLが動いているのでエラーになったりして悲しい思いをしたりします。ownCloudのバージョンで、過去にMac OS Xサポートがあった頃があるのかと調べても、以前からサポートされていないし、将来的にやる気もないようです。

で、そのバイナリ配布元の文書を読むと、「うちはソースコードに一切手を入れていないから問題があったら開発元に言え」というわけです。ということは、Community EditionのソースはMacで使える。UNICODEの問題はあるけれど。

UNICODE云々というのは、WindowsからMacの共有フォルダにある日本語ファイル名をみるとすぐわかるわけですが(最近は事情が違うかもしれない)、Mac OS Xでは日本語の濁点、半濁点つきのひらがな、カタカナなどは、親文字に対してそれらとの合字で表現していて(つまり、親文字、合字指定、濁点等の3つで1文字を表す)、濁点や半濁点つきのグリフのコード(ひとつの文字)を指さないという、合理的なんだか不合理なんだかわからない方針で実装されているわけですが、これ奇妙なことに、ターミナルで日本語変換してファイル名入れると、日本語IMから入力する文字コードは正規化されたほう(合字でない、独立したグリフに対するコード)になるので、存在するファイル名とは表現が一致しなくて「File not found」、つまりMac OSのなかでも不整合があったりします。純正IM使ってないのでそっちはファイルシステムとあってるのかもしれないですが。それで、かつてのMacとWindowsのファイル共有の場合のように、合字指定を表すコードを単純に読み飛ばしてしまうと、親文字と濁点がわかれてしまい、半角カナを全角に引き伸ばした感じの間抜けな表示になるわけです。

ownCloudのGitHubリポジトリのissue trackでは、ドイツ語のウムラウトの処理不整合で作成したフォルダが二重に見えたり、クライアントによってはそもそもフォルダ作成さえできないんだそうで、これは合字の扱いと正規化がもたらす不幸と直感するわけです。欧州のそうした文字でも、たしかにUNICODEでは合字でもよいものの、ウムラウトやアクサンなどがついたグリフとコードポイントもあるわけで、事情は日本語と同じだし、欧州全体では結構深刻だな、と思うところです。

当方の目的としては、既存ファイルの一覧がアプリからサクサクと見えればいいので、「データ」が「テ〝ータ」になろうが、別によくって、それならGo!というわけです。(結論を先にいうと、iOSアプリではこうならなかったので、Apple製品で閉じている限りはよさそう)

FreeBSDで苦労した頃はまだ出たてで、いまと構成が違うのかもしれないのと、こちらのスキルもいまと違うのでよくわからないのですが、ひとことでいうと、ownCloudはPHPアプリでしたと。つまり、特にコンパイル等の必要はなく、PHPに必要な拡張があって、SSL証明書つきのWebサーバがあればとても簡単だ、ということでした。

Mac OS X標準のPHPは長いこと使っていないので事情はわかりませんが、MacPortsやHomebrewで入れて運用しているPHPとそれをCGIとして使うWebサーバがあって、SQLite3とPHP-sqlite拡張が入っていれば(他にもgdとかいくつか拡張は必要ですが)、MySQLも使わないでさっくり動きます。

今回動かすまでに苦労したのは、すでに運用しているPHPアプリと証明書を共有するためサブディレクトリにaliasしようとしたら、よくある「FastCGIでPHPファイルのフルパスが間違って渡される(その結果、No input file specifiedの文字だけがブラウザに出る)」というところで、解決を諦めて、PHPアプリの本当のサブディレクトリに置いてしまったところ、ぐらい。正規表現が微妙に働いて、ownCloudから親のアプリに飛ばされることがあるけれど、iOSアプリでファイルを閲覧するには問題がないのでよしとしています。

結局、配布されているソースコードを所定のディレクトリに展開して、あとはWebブラウザから、そのディレクトリを指すURIを開いてやれば、管理者アカウントを作成する画面が開いて、それで設定完了、すぐ使えます。SQLiteのデータベースも小さくて、いい感じです。アップロードはPHPのファイルサイズ制限に引っかかるので(むやみにでかい値を設定すればいいというものでもないし)基本的にはしない前提で、Bitcasaから引き上げた外付けHDD内のデータがあるサブディレクトリをownCloudのアカウント用データフォルダ内にシンボリックリンクしてやると、ほどなくアプリから見えるようになって、目的は達成できました。

書き込みもするなら、シンボリックリンク先もユーザ「_www」で読み書きできないとまずいはずですが、とりあえずファイルの存在をみるだけならなにもしないでもOK(ユーザ「_www」から見えればよい)。

話を簡単にするポイントは、データベースはSQLiteを使うこと。MySQLやPostgresqlも使えるけれど、SQLite拡張をPHPに入れれば、ownCloud初期設定時に無条件でSQLiteを使うのでDBサーバに関する余計な作業がさっくり省略できます。

書くほうはどうするんだという話ですが、アプリで書き込みができるか試していないけれど、英数字のファイル名やフォルダ名なら大丈夫だろうということと、外部HDDへファイルを置くのはモバイルからは考えずに画面共有で普通にMac内の操作するか直接scpするので気にしない方針です。

2014年1月25日土曜日

[RepRap PCB milling] How to compile "pcb2gcode" in Mac OS X Mavericks

My current project is creating the RepRap style PCB milling Machine.

One of my undergraduate student agreed to join this as his final project for the credit of graduation.

He designed the machine part.  Because his good skill on the engineering, it worked fine.  My part is for an electricity and the toolchain as softwares.

For designing the circuit board, I designed my own deliberative  one from Generation 7 v1.4.1, and Printrboard from the reason of availability of some parts in Japan.

This board is currently only a prototype, but when the PCB milling machine will worked, I will design more compact, and stable board that can build with it.

The toolchain is basically following the description of RepRap Wiki page.  But on my Mac, the recommented driver "CNCGcodeController" did not work.  It is a Java application, but I think the reason of the failior would be the serial communication class includes OS native code inside.  If so, the code should be re-written to be portable such as using RXTX serial communication class.

Then I installed "Printrun" on my Mac by following the instruction from source for Mac OS X in the README file.  It worked very fine with my choice of firmware "Teacup".

But due to Teacup firmware only accepts G-Code, and my targeting PCB Layout software "KiCad" does not support exporting G-Code directly for now, I needed to convert exported "Gerber" data into G-Code file.

There are several toolpaths is introduced in the Wiki page, but everything in the page but "pcb2gcode" didn't work or fit for my intention of using KiCad (Jan 10 2014 version) as a PCB design tool on my Mac.

I got the source code of pcb2gcode both from sourceforge and GitHub, but the development of this software looks not a hot recently.  The newest download on the sourceforge is dated 2012-07-02, and the head on the GitHub looks the same.

I had a trial of building with this code, but the code conflicts between recent Xcode 5.x toolchain and the boost.  In order to solve this, by looking at the discussions on StackOverflow, I made the replacing using shared_ptr feature from boost to std class, and port a template definition of dynamic_pointer_cast from boost (it is included in "shared_ptr.hpp").

The put my patch on my GitHub repository: https://github.com/tkamada/pcb2gcode

If there were a fail or something that I misunderstand, please post your issue message to my repository.