aamall

2011年10月03日

AutoCAD LT 2012 for Mac

試用していた AutoCAD 2012 for Mac の試用期限が切れそうなので、米国の Mac App Store から AutoCAD LT for Mac を購入しました。
US App Store では、アカウントは簡単に作れますが、日本のクレジットカードや Paypal での支払いが出来ません。いろいろと調べてみましたが US 版 iTunes Gift Card で支払のが一番簡単そうでした。App Store での AutoCAD LT 2012 for Mac の販売価格は $899.99 なのですが、 ネットで $900 分のUS版 iTunes Gift Card を購入するのに $1,241 もかかってしまいました。自分はすぐに買いたかったのでここから iTunes Card を買いました。注文してから30分ちょいでカードのナンバーが届きました。よく調べればもっと安いショップがあるのかもしれませんが、日本での AutoCAD LT 2012 Windows版は定価 ¥199,500、安売り店でも ¥140,000 以上するようですから、これでも割安なんだと思って自分を納得させています。バリバリ図面を書いて早く元をとらなくちゃ。

肝心の使い勝手はまだあまり使い込んでいないので何とも言えませんが、Parallels + Windows XP / 7 の環境とは比べ物にならないくらいサクサク動くので非常に快適です。MacBook Air 11" にインストールして使っていますがトラックパッドでの移動やズームもスムーズです。BetterTouchTool で TipTap Left / Right に return と ESC を割り当てたら、コマンドの繰り返しやキャンセルが簡単にできるようになってトラックパッドでの操作がマウス以上に使いやすくなりました。ThunderboltディスプレイとMagic Trackpad が快適すぎます。

いまのところ非常に満足していますが、もう少し使い込んだらまたレポートしたいと思います。

knaka01 at 02:26|PermalinkComments(3)TrackBack(0)clip!Mac, iPhone 

2011年09月25日

Mac OS X Lion + Parallels Desktop 6 +AutoCAD LT 2011 その後

前回書いた Mac OS X Lion + Parallels Desktop 6 +AutoCAD LT 2011 での不具合 のその後です。

仮想マシンを作り直しても改善しないので、あれから一ヶ月以上ほったらかしにしていましたが、今日起動してみるとリボンの色が化けてしまう症状は再現しませんでした。原因は不明のままですが不具合は解消しています。

Parallels Desktop 6 のバージョンはBuild 6.0.12094のまま変わっていませんが、OS X Lion は 10.7.1(11B2118)になっていますので、なにかディスプレイのドライバあたりに更新があったのかもしれません。

3週間ほど前から AutoCAD 2012 for Mac の試用版を使っています。英語版ではありますが Parallels で Windows版の AutoCAD LT を使うよりもずっと快適に使えます。Macですから日本語も問題なく使えます。こうなるともうParallelsには戻りたくありません。後一週間ほどで30日の試用期間が終了するのですが $3995 は高価すぎて手が出ません。 米国の App Store では AutoCAD LT for Mac が $899.99 で買えるのですが、残念ながら日本の App Store で販売する予定はないみたいです。
これ買っちゃおうかなぁ。でも買ってすぐ日本語版とか出たらがっかりだよなぁ。でもきっと買っちゃうんだろうなぁ。

追記:ここに「日本での販売、ならびに日本語版の提供の予定はありません」とはっきり書いてありますね。安心して英語版を買うことが出来そうです。
→ オートデスク、Mac OS X Lion 向け AutoCAD 2012 for Mac 製品群を発表


knaka01 at 12:46|PermalinkComments(1)TrackBack(0)clip!

2011年08月12日

Mac OS X Lion + Parallels Desktop 6 + AutoCAD LT 2011 での不具合

新しい MacBook Air 11-inch Mid 2011 が届いたので早速セットアップする。これまで使っていた MacBook Air 11-inch Late 2010 よりもさくさく動くし、SSDも倍の256GBに増えたのでとても快適。

Time Machine のバックアップから移行しようかとも思ったけれど、せっかくまっさらなんだからと必要なアプリだけをインストールしてダイエットをはかることにした。アプリケーションのインストールもApp Storeからならとても簡単だ。

最近はほとんどMacだけで完結するようになってきてるけど、CADだけは Windows で AutoCAD LT を使っている。英語版ならAutoCAD for Macがあるけれどちょっと高価で手が出ない。早くAutoCAD LT のMac版が出ればいいのに。

新しい MacBook Air に Parallels Desktop 6 for Mac の最新版をインストールして、古い MacBook Air から仮想マシンをコピーして AutoCAD LT を起動したところ、リボンのあたりの色が気持ち悪い色に化けてしまっている。リボンの上にマウスカーソルを持っていくと気持ち悪い色がめまぐるしく変化するし、ツールチップの色もおかしい。他のアプリではとくに問題なく表示されている。Parallelsの環境設定や仮想マシンの構成も調べてみたけれど原因不明のまま。古いMacBook Air ではちゃんと問題なく表示されているので仮想マシンには問題はなさそう。

MacBook Air 11-inch, Mid 2011
Mac OS X Lion 10.7 (11A2063) / Darwin 11.0.1
Parallels Desktop 6 for Mac Build 6.0.12094
AutoCAD LT 2011
スクリーンショット 2011-08-12 19.13.54

MacBook Air 11-inch, Late 2010
Mac OS X Lion 10.7 (11A511) / Darwin 11.0.0
Parallels Desktop 6 for Mac Build 6.0.12094
AutoCAD LT 2011
スクリーンショット 2011-08-12 19.14.41

どちらもOS X Lion で違いといえば古い方はSnow Leopardからのアップグレードなのでシステムのバージョンが10.7(11A511)でカーネルが Darwin 11.0.0、新しい方はシステムが10.7(11A2063)でカーネルはDarwin 11.0.1になっています。

早いとこ解決してさくさく図面を描きたいものです。

2010年11月22日

mbet NXP LPC1768

Make: Tokyo Meeting 06 に行ってきました。今回も面白いものでいっぱいでしたが、特に惹かれたのが mbed NXP。ネットワーク接続がとても簡単にできるようです。

早速スイッチサイエンスで mbet NXP LPC1768 と WiiChuckアダプタ、きばん本舗で ☆board Orange、CuBeatSystems で Expansion Board One を購入して温度センサをおまけしてもらいました。

このシステムはブラウザからWeb上の開発環境を使ってアプリケーションを開発します。面白い。ローカルに開発環境をインストールする必要がありません。使い勝手などまだまだな部分はありますが今後の発展が楽しみです。

とりあえず Wii ヌンチャクから読み出したデータを LCD に表示するプログラムを書いてみます。WiiNunchuckReaderを参考にしましたが、それらしい値を表示するけれど、どうも値がリニアに変化しないのが気になります。Z/Cボタンの読み出し方もちょっと変です。
いろいろと調べてみたところ、Wiiのヌンチャクはデータを暗号化(といっても簡単なものですが)しているようで、
x = (X ^ 0x17) + 0x17
のように復号化が必要なようです。一応それらしい値を表示するようにはなりました。
 WiiNunchuck

【追記】どうやら加速度センサの値を読み取るところで Bit0 と Bit1 が入れ替わっていたようなので修正しておきました。
 WiiNunchuck

次はおまけにもらった温度センサを使って、部屋の温度を Twitter に書き込んでみたいと思います。Expansion Board One は ☆board Orange と接続するピンソケットがないので、部品が届くまではしばらくお預けです。

knaka01 at 12:20|PermalinkComments(0)TrackBack(0)clip!工作 

2010年11月17日

Cocoa-Python with Xcode 3.2

Objective-C ってのにどうしても馴染むことができなくて Cocoa-Python に逃げようと思ったら、Xcode 3.2 以降 Cocoa-Python のテンプレートは Xcode に含まれなくなったようです。

ここ(PyObjC development with Xcode 3.2)を参考にして Cocoa-Python のテンプレートを作成し、Xcode で Python アプリを動かすことができたので手順をメモしておきます。

1.ローカルドライブに ~/Library/Application Support/Developer/Shared/Xcode/ というフォルダがなければ作っておきます。

2.ファインダの「移動」ー「サーバーへ接続...」から http://svn.red-bean.com/pyobjc/trunk/pyobjc/pyobjc-xcode/ にゲストで接続します。

3.red-beanサーバーから File Templates フォルダをローカルの Xcode フォルダにコピーします。

4.red-beanサーバーから Project Templates フォルダをデスクトップにコピーします。

5.ターミナルを起動し、デスクトップの Project Templates フォルダへ移動して、以下のコマンドを実行してテンプレートをビルドします。

$ cd ~/Desktop/Project\ Templates/

$ mkdir -p ~/Library/Application\ Support/Developer/Shared/Xcode/Project? Templates/Cocoa-Python/

$ ./project-tool.py -k -v --template Cocoa-Python\ Application/CocoaApp.xcodeproj/TemplateInfo.plist Cocoa-Python\ Application ~/Library/Application?? Support/Developer/Shared/Xcode/Project\ Templates/Cocoa-Python/Cocoa-Python\ Application

$ ./project-tool.py -k -v --template Cocoa-Python\ Document-based\ Application/CocoaDocApp.xcodeproj/TemplateInfo.plist Cocoa-Python\ Document-based\ Application/ ~/Library/Application\ Support/Developer/Shared/Xcode/Project\ Templates/Cocoa-Python/Cocoa-Python\ Document-based\ Application

./project-tool.py -k -v --template Cocoa-Python\ Core\ Data\ Application/CocoaApp.xcodeproj/TemplateInfo.plist Cocoa-Python\ Core\ Data\ Application/ ~/Library/Application\ Support/Developer/Shared/Xcode/Project\ Templates/Cocoa-Python/Cocoa-Python\ Core\ Data\ Application

./project-tool.py -k -v --template Cocoa-Python\ Core\ Data\ Document-based\ Application/CocoaDocApp.xcodeproj/TemplateInfo.plist Cocoa-Python\ Core\ Data\ Document-based\ Application/ ~/Library/Application\ Support/Developer/Shared/Xcode/Project\ Templates/Cocoa-Python/Cocoa-Python\ Core\ Data\ Document-based\ Application

これで ~/Library/Application\ Support/Developer/Shared/Xcode/Project\ Templates/Cocoa-Python/ に4つのテンプレートが出来上がるはずですが、自分がやったときには python-twitter のファイル /opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/python_twitter-0.6-py2.6.egg-info/*.txt の読み取りアクセス権が無くてエラーが発生し、スクリプトが中断してしまったので、このディレクトリで
$ sudo chmod 644 *.txt
を実行しました。MacPorts で python-twitter をインストールしていなければ関係ないのかもしれません。

最後に Xcode からこのテンプレートを使えるようにリンクを張っておきます。
$ cd /Library/Application\ Support/Developer/Shared/Xcode/Project\ Templates
$ sudo ln -s /Users/knaka/Library/Application\ Support/Developer/Shared/Xcode/Project\ Templates/Cocoa-Python Cocoa-Python


Python は MacPorts でインストールしたものを使用しています。インストール済みの Python 関連パッケージは以下の通り。

python27
python_select
py26-twitter
py26-tweepy
py26-pyobjc-cocoa
py27-pyobjc-cocoa

knaka01 at 01:05|PermalinkComments(0)TrackBack(0)clip!Mac, iPhone 

2010年07月20日

ScanSnap S1500M

3ヶ月ぶりの更新かな。

身の回りの紙をどうにかしたくて ScanSnap S1500M を買いました。あとで必要になるかも知れないと捨てられずに手元に置いてある書類等をすべてデジタルデータにして、原本はすべて処分してしまおうという考えです。

手始めにテーブルの上に散らばっていた名刺やはがきをスキャンしてみます。評判通りの使い勝手に大満足です。

スキャンしたデータはすべて Evernote で管理します。Evernote は2年近く前から Mac と Windows でメモを共有するのに使ってきました。完全に Mac に移行したいまでは Mac、iPhone、iPad でのデータの同期に便利に使っています。ScanSnap と Evernote は非常に相性が良くて、数十枚の名刺をボタン一発であっという間に Evernote に読み込んでくれます。読み込み済みの名刺や書類はゴミ箱へ直行。Evernote の検索機能であとから探すのも簡単です。

調子に乗ってどんどん読み込んでいたら無料会員の1ヶ月の制限 40M を簡単に超えてしまったので、Evernoteプレミアムへアップグレードしました。年間 $45 で毎月 500M まで使えます。これだけの容量があれば本棚に入りきらない本や雑誌もすべてスキャンして処分できるかも知れません。データを iPad で持ち歩けばいつでもどこでも好きな本が読めます。

気分良くスキャンを続けていると Evernote の同期が失敗しているとのメッセージボックスが。どうやら Evernote のサーバーがコケちゃってるみたいです。

お金払ったとたんにこれって何だかなぁ。



knaka01 at 20:01|PermalinkComments(0)TrackBack(0)clip!

2010年04月20日

メールサーバでまたハマる

今日は OSX Server でメールサーバを立ち上げました。意外と順調にできましたが最後にまたハマってしまいました。

メールサーバが起動してLAN内のクライアントからメールを送ってみると、LAN内のメール送受信は全く問題ありませんでした。次に @nifty のアカウントに宛ててメールを送ってみます。これも上手くいきました。最後に @nifty から OSX Server 宛てにメールを送ってみると、これが上手くいきません。携帯から送ったメールも届きません。

ポートマッピングの設定などをいろいろと調べていてふとログを見ると携帯からのメールが届いていました。15分ほど遅れて届いたようです。@nifty からのメールはまだ届いていません。そのうち @nifty からのメールも届きました。35分の遅れです。外部からの受信メールだけが遅れて届くようです。

いろいろと調べた結果、これはスパムメールのフィルタによるものらしいということがわかりました。怪しい相手からのメールはいったん拒否して、再送されたものを受け取るという仕組みのようです。学習が進めば解決するようでもありますが、いつまで待てばいいのかわからないし、これじゃ使い物にならないので whitelist というものを設定することにします。

/etc/mail/spamassin/local.cf の最後に
whitelist_from *docomo.ne.jp
whitelist_from *nifty.ne.jp
を書き込みました。こうすると whitelist_from で指定した文字列にマッチした相手からのメールはスパム扱いされずにすぐに受信してくれるようです。

この辺のことはこちらを参考にさせてもらいました → メールの受信にタイムラグがあります。

再度 @nifty と DoCoMo の携帯からメールを送信してみたところ、今度はちゃんと受信したようです。

knaka01 at 22:17|PermalinkComments(0)TrackBack(0)clip!Mac, iPhone 

2010年04月19日

Mac OSX Server の設定にハマる

Mac mini Server を購入しました。先週の木曜日にポチッとして翌日には届きました。以来、毎晩設定に明け暮れています。

サーバーアシスタントを使ってセットアップするのですが、何ヶ所かハマったところがあったので、メモしておきます。

「ネットワーク名」画面で、プライマリDNS名とコンピュータ名を入力するのですが、プライマリDNS名には例として myserver.example.com とあるのをまねて、ns.domein.net というように入力しました。ここで入力した名前がなぜかDNSのゾーン名の初期値として使われるようで、これでハマりました。この場合ゾーン名は domain.net. が正解ですね。

こちらが参考になりました → DNS で正引き名前解決が出来ない

その後、再インストールを繰り返し、プライマリDNS名を domain.net にすることで上記の件は解決しましたが、今度は Open Directory の設定で役割をマスターに変更しようとするとこれがうまくいきません。
またまたハマりましたが、こちら<OS X ServerのOpen Directoryでのドメイン名絡み・・>を参考にして何とかできました。

プライマリDNS名には ns.domein.net のようにサーバー名も含めておいて、DNSの設定のところでゾーン名(ns.domain.net.)を domain.net. というように修正するのが正解のようです。こうすると Open Directory の設定で怒られません。

ここまでくるのに6回ほどインストールをやり直しました。その度に1時間弱かかります。
再インストールするときにはディスクユーティリティでディスクをすべて消去してからやり直したほうが短い時間で済むようです。どうもすでにインストール済みのディスクに再インストールするときはファイルの比較かなんかをやるようで、コピーに倍くらいの時間がかかってしまいます。

knaka01 at 21:37|PermalinkComments(0)TrackBack(0)clip!Mac, iPhone 

2010年04月15日

MacPorts で nano をインストール

crontab を編集しようとしたら vi が立ち上がりました。vi も使えないわけではないけれど、たまにしか使わないので使い始めはいつもちょっととまどってしまいます。なので標準のエディタを nano に変更することにしました。

~/.bashrc に
export EDITOR=nano
を書き加えます。

Snow Leopard 標準の /usr/bin/nano は
knaka ~$ nano -V
 GNU nano version 2.0.6 (compiled 11:42:28, May 18 2009)
 Email: nano@nano-editor.org Web: http://www.nano-editor.org/
 Compiled options: --disable-nls --enable-color --enable-extra --enable-multibuffer --enable-nanorc
ということでUTF8 サポートが ON になっていないので日本語が化けます。この機会に MacPorts で別のをインストールしてしまいましょう。
$ port search nano
nano @2.2.3 (editors)
    Nano's ANOther editor - enhanced free Pico Clone
$ sudo port install nano
$ which nano
/opt/local/bin/nano
$ nano -V
 GNU nano version 2.2.3 (compiled 05:25:27, Apr 15 2010)
 (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
 2008, 2009 Free Software Foundation, Inc.
 Email: nano@nano-editor.org Web: http://www.nano-editor.org/
 Compiled options: --disable-wrapping-as-root --enable-color --enable-extra --enable-multibuffer --enable-nanorc --enable-utf8
こんどはちゃんと --enable-utf8 になっています。

設定ファイルのサンプルが /opt/local/share/doc/nano/nanorc.sample に用意されていますので、これを ~/.nanorc にコピーしてお好みで設定します。set nowrap は必ず指定しておきましょう。

knaka01 at 05:43|Permalinkclip!Mac, iPhone 

wget-1.9 をインストール

Snow Leopard には wget が標準装備されていないので gnu からソースをもらってインストールしたので、その手順をメモっておきます。
$ sudo mkdir /usr/local/src
$ cd /usr/local/src
$ sudo curl -O http://ftp.gnu.org/pub/gnu/wget/wget-1.9.tar.gz
$ sudo tar zxvf wget-1.9.tar.gz
$ cd wget-1.9
$ sudo ./configure
$ sudo make
$ sudo make install

やっぱり wget があると便利です。

knaka01 at 00:25|PermalinkComments(0)TrackBack(0)clip!Mac, iPhone 

2010年04月13日

Forbidden 403 Error 解決

subversion.conf で AuthzSVNAccessFile を有効にすると Forbidden 403 のエラーが発生する件の解決策が見つかりました。

<Location /svn> にスラッシュを付加して <Location /svn/> とします。こうすると http://localhost/svn/ という URL でリポジトリのリストが得られます。ただし http://localhost/svn と最後のスラッシュを省いた URL だとエラーになります。"File does not exist: /Library/WebServer/Documents/svn" だそうです。

上の件も解決策が見つかりました。
httpd.conf に以下の3行を追加します。
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
RewriteEngine on
RewriteRule ^(/svn)$ $1/ [R]
最初の1行はすでに httpd.conf にある場合は必要ありません。
こうすると、/svn へのアクセスを /svn/ にリダイレクトするので先のエラーは解消されます。
これで完璧です。めでたしめでたし。

参考
 → SVNListParentPath
 → Re: SVNListParentPath
 → Re: SVNListParentPath

元の記事
 → Subversion + AuthzSVNAccessFile = Forbidden 403 Error

knaka01 at 11:05|PermalinkComments(0)TrackBack(0)clip!Mac, iPhone 

Subversion + AuthzSVNAccessFile = Forbidden 403 Error

Subversion + Apache の設定の続きです。

パスによるアクセス制御を行うために mod_authz_svn を試してみました。まずはじめに subversion.conf を以下のように変更します。
<Location /svn>
    DAV svn
    SVNParentPath /var/svn/repos
    SVNListParentPath on
    AuthType Basic
    AuthName "Subversion"
    AuthUserFile /var/svn/passwd
    Require valid-user
    AuthzSVNAccessFile /var/svn/svnaccess
</Location>

アクセス制御ファイル /var/svn/svnaccess を作って以下の内容を書き込みます。
[groups]
group1 = user1, user2
group2 = user3, user4, user5

[/]
* = r

[project1:/]
@group1 = rw
@group2 = r
* =

[project2:/]
@group1 = r
@group2 = rw
* =
アパッチを再起動して http://localhost/svn にアクセスしてみると 403 Forbbidn とエラーになります。Apache のログは "The URI does not contain the name of a repository." となっています。原因がわからずにずいぶんと悩みましたが、http://localhost/svn/project1 と http://localhost/svn/project2 は問題なく表示できるし、アクセス制御もうまくいっているようなので、どうやらペアレントパス /svn の表示がおかしいだけのようです。"SVNListParentPath on" が正しく機能していないのでしょうか。

検索してみると同様の事例を何件か見つけることができました。ずいぶん前から知られていた不具合のようですが、有効な回避方法を見つけることはできませんでした。

リポジトリの一覧を表示できれば、どんなリポジトリが存在するのかをあらかじめ知っておく必要がなくなって便利なのに…残念です。

いまのところ自分しか使わないのだから、キメ細かなアクセス制御はあきらめて一覧表示を優先するほうが良さそうです。どんなリポジトリを作ったかをいつまでも覚えておけるとは思えないので。

【追記】
解決策が見つかりました → Forbidden 403 Error 解決

knaka01 at 00:03|PermalinkComments(0)TrackBack(0)clip!Mac, iPhone 

2010年04月12日

Subversion + Apatche

いま作っているプログラムでバージョン管理の必要が出てきたので MacBook Pro で Subversion を動かしてみました。

Mac OS X Snow Leopard にはデフォルトで Subversion と Apache がインストールされているので、ちょっと設定してやるだけで簡単に使えるようになっています。その手順を覚え書きにまとめておこうと思います。最近物忘れが激しいので…。


とりあえずそれぞれのバージョンをチェックしてみると結構新しいのがはいっていました。
knaka ~$ apachectl -V
Server version: Apache/2.2.14 (Unix)
Server built: Feb 10 2010 22:22:39

   < … 略 … >

knaka ~$ svn --version
svn, version 1.6.5 (r38866)
compiled Oct 16 2009, 02:54:10

   < … 略 … >

knaka ~$ svnadmin --version
svnadmin, version 1.6.5 (r38866)
compiled Oct 16 2009, 02:54:10

   < … 略 … >

まずは /etc/apache2/httpd.conf に次の1行を書き加えます。
LoadModule dav_svn_module libexec/apache2/mod_dav_svn.so
書き加える場所はどこでもいいけれど、LoadModule … というのがたくさん並んでる直後あたりにしとくのがいいかも。

つぎに、/etc/apache2/other/subversion.conf というファイルを作って以下の内容を書き込みます。
<Location /svn>
    DAV svn
    SVNParentPath /var/svn/repos
    SVNListParentPath on
    AuthType Basic
    AuthName "Subversion"
    AuthUserFile /var/svn/passwd
    Require valid-user
</Location>
ここにファイルをおいておくと httpd.conf を読み込むときに勝手にインクルードしてくれるんだそうな。

リポジトリ用のディレクトリを作ります。
knaka ~$ sudo mkdir /var/svn
knaka ~$ sudo mkdir /var/svn/repos

いま作ったディレクトリにパスワードファイルを作ってアクセス権を変更します。
knaka ~$ cd /var/svn
knaka svn$ sudo htpasswd -c passwd knaka
New password: *****
Re-type new password: *****
Adding password for user knaka
knaka svn$ sudo chmod 600 passwd
2行目の knaka は追加するユーザー名です。パスワードを2回聞いてくるので入力します。

リポジトリを作って所有者をWebサーバーに変更します。
knaka svn$ sudo svnadmin create --fs-type fsfs /var/svn/repos/project1
knaka svn$ sudo svnadmin create --fs-type fsfs /var/svn/repos/project2
knaka svn$ sudo chown -R www:www /var/svn
これで設定は完了。

システム環境設定の「共有」を開いて「Web共有」をチェックすれば Apache が起動します。
あとはブラウザから http://localhost/svn を開けばリポジトリのリストが表示されます。



knaka01 at 21:49|PermalinkComments(0)TrackBack(0)clip!Mac, iPhone 

2010年04月06日

LED Cube プログラム

最近ここを訪ねてくる人はほとんどが 4x4x4 LED Cube の件Time Capsule の電源が壊れた件、それと Time Capsle のコンデンサ交換修理の件を検索してくる人ばかり。

今更って感じもするけれど、プログラムリストを表示できるようになったので、以前アップできなかった LED Cube を点灯させるプログラム(スケッチ)を載せておくことにする。

#include <Metro.h>

#define CUBESIZE 4
#define PLANESIZE CUBESIZE*CUBESIZE
#define PLANETIME 800

#define ON 1
#define OFF 0
#define XOR -1
#define CW 0
#define CCW 1

#include "WProgram.h"
void CubeClear(boolean val);
void CubeRandom(char mode, unsigned int DisplayTime);
void CubeRotate(char mode, char dir, unsigned int DisplayTime);
void CubeSweep(char mode, unsigned int DisplayTime);
void CubeDisplay(unsigned int DisplayTime);
void setup();
void loop();
byte PatternRotate[][CUBESIZE] = {
  {B1000,
  B0100,
  B0010,
  B0001},
  {B0100,
  B0100,
  B0010,
  B0010},
  {B0010,
  B0010,
  B0100,
  B0100},
  {B0001,
  B0010,
  B0100,
  B1000},
  {B0000,
  B0011,
  B1100,
  B0000},
  {B0000,
  B1100,
  B0011,
  B0000}
};


byte PatternSweep[][CUBESIZE] = {
  {B1000,
  B1000,
  B1000,
  B1000},
  {B0100,
  B0100,
  B0100,
  B0100},
  {B0010,
  B0010,
  B0010,
  B0010},
  {B0001,
  B0001,
  B0001,
  B0001},
  {B0010,
  B0010,
  B0010,
  B0010},
  {B0100,
  B0100,
  B0100,
  B0100}
};


//
// Metro
//
Metro Display = Metro(10000);

// Pin Asign
int DataPin = 2;
int ClockPin = 3;
int LatchPin = 4;
int CathodePin[] = {5, 6, 7, 8};
//int AudioPin = 0; // Audio input

byte CubeBuf[CUBESIZE][CUBESIZE];

//
void CubeClear(boolean val) {
  int i, j;
  for (i = 0; i < CUBESIZE; ++i) {
  for (j = 0; j < CUBESIZE; ++j) {
  CubeBuf[i][j] = val ? B1111 : B0000;
  }
  }
}


void CubeRandom(char mode, unsigned int DisplayTime) {
  int plane, row, col;
  plane = random(CUBESIZE);
  row = random(CUBESIZE);
  col = random(CUBESIZE);
  if (mode == ON) {
  CubeBuf[plane][row] |= (B0001 << col);
  } else if (mode == OFF) {
  CubeBuf[plane][row] &= ~(B0001 << col);
  } else {
  CubeBuf[plane][row] ^= (B0001 << col);
  }
  CubeDisplay(DisplayTime);
}


void CubeRotate(char mode, char dir, unsigned int DisplayTime) {
  // mode : -1, 0, 1
// dir : CW, CCW
int plane, row, index, offset;
  static int phase = 0;
 
  index = phase;
  offset = mode;
  for (plane = 0; plane < CUBESIZE; plane++) {
  for (row = 0; row < CUBESIZE; row++) {
  index += plane * offset;
  if (index < 0) {
  index += (sizeof PatternRotate / sizeof PatternRotate[0]);
  } else if (index >= (sizeof PatternRotate / sizeof PatternRotate[0])) {
  index -= (sizeof PatternRotate / sizeof PatternRotate[0]);
  }
  CubeBuf[plane][row] = PatternRotate[index][row];
  }
  }
  if (dir == CW) {
  phase++;
  if (phase >= (sizeof PatternRotate / sizeof PatternRotate[0])) {
  phase = 0;
  }
  } else {
  phase--;
  if (phase < 0) {
  phase = (sizeof PatternRotate / sizeof PatternRotate[0]);
  }
  }
  CubeDisplay(DisplayTime);
}


void CubeSweep(char mode, unsigned int DisplayTime) {
  // mode : -1, 0, 1
int plane, row, index, offset;
  static int phase = 0;
 
  index = phase;
  offset = mode;
  for (plane = 0; plane < CUBESIZE; plane++) {
  for (row = 0; row < CUBESIZE; row++) {
  index += plane * offset;
  if (index < 0) {
  index += (sizeof PatternRotate / sizeof PatternRotate[0]);
  } else if (index >= (sizeof PatternRotate / sizeof PatternRotate[0])) {
  index -= (sizeof PatternRotate / sizeof PatternRotate[0]);
  }
  CubeBuf[plane][row] = PatternSweep[index][row];
  }
  }
  phase++;
  if (phase >= (sizeof PatternRotate / sizeof PatternRotate[0])) {
  phase = 0;
  }
  CubeDisplay(DisplayTime);
}
 
 
//
void CubeDisplay(unsigned int DisplayTime) {
  int plane, row, mask;
  unsigned long EndTime;
 
  EndTime = millis() + DisplayTime;
  while (millis() < EndTime) {
  for (plane = 0; plane < CUBESIZE; plane++) {
  digitalWrite(LatchPin, LOW);
  for (row = 0; row < CUBESIZE; row++) {
  for (mask = 1 << CUBESIZE - 1; mask > 0; mask >>= 1) {
  digitalWrite(DataPin, CubeBuf[plane][row] & mask ? HIGH : LOW);
  digitalWrite(ClockPin, HIGH);
  digitalWrite(ClockPin, LOW);
  }
  }
  digitalWrite(LatchPin, HIGH);
 
  // turn current plane on
digitalWrite(CathodePin[plane], HIGH);
  delayMicroseconds(PLANETIME);
  digitalWrite(CathodePin[plane], LOW);
  }
  } // while <EndTime
}


//
//
void setup() {
  int i;
 
  pinMode(DataPin, OUTPUT);
  pinMode(ClockPin, OUTPUT);
  pinMode(LatchPin, OUTPUT);
  for(i = 0; i < CUBESIZE; i++) {
  pinMode(CathodePin[i], OUTPUT);
  }
 
  randomSeed(analogRead(5));
  CubeClear(0);
  Display.reset();
}


//
//
void loop() {
  Display.interval(5000);
  while (!Display.check()) {
  CubeRandom(ON, 15);
  }

  Display.interval(5000);
  while (!Display.check()) {
  CubeRandom(XOR, 8);
  }
 
  Display.interval(3000);
  while (!Display.check()) {
  CubeRandom(OFF, 5);
  }
 
  Display.interval(5000);
  while (!Display.check()) {
  CubeRotate(0, CW, 50);
  }

  Display.interval(5000);
  while (!Display.check()) {
  CubeRotate(0, CCW, 50);
  }
 
  Display.interval(5000);
  while (!Display.check()) {
  CubeSweep(0, 100);
  }
 
  Display.interval(5000);
  while (!Display.check()) {
  CubeSweep(1, 100);
  }

  Display.interval(3000);
  while (!Display.check()) {
  CubeRandom(OFF, 5);
  }
}


int main(void)
{
  init();

  setup();
 
  for (;;)
  loop();
 
  return 0;
}

なんかまだインデントがおかしいみたいだけど、今夜はもう寝る。

元の記事(回路図と動画あり)はこちら → LED Cube

ライブラリ Metroここからダウンロードしましょう。

knaka01 at 01:58|Permalinkclip!工作 | HTML

ブログへプログラムリストを表示する方法

以前からブログにプログラムのソースリストを載せたいと思っていたけれど、長いファイルをだらだら表示するのも何だかなぁ…ってんでそのまま放置していました。スクロールさせる方法が解らなかったので。

昨日 Emacs の設定ファイルを載せるためにいろいろ調べて、なんとなくうまくいったようなので、備忘録としてジタバタと試した結果をまとめておきます。

まずブログの css ファイルに以下の設定を書き込んでおきます。
  p.plist{
    height:20em;  /* 高さ */
    overflow:auto; /* はみ出すときはスクロール */
    padding:10px;  /* 枠の内側の余白 */
    margin:10px;  /* 枠の周囲の余白 */
    text-align:left; /* 左寄せ */
    color:#dcdcdc;  /* 文字の色 */
    background-color:#000000; /* 背景の色 */
    border-style:solid; /* 枠のスタイル */
    border-width:1px;  /* 枠の太さ*/
    border-color:#d0d0d0; /* 枠の色 */
  }
20行分の高さを確保してそれを超える内容があればスクロールバーを表示する設定です。高さ色や枠などはお好みで。

自分の Emacs の設定だと下の写真のように予約語などのキーワードが色別に見やすく表示されます。みんなそうしてると思うけど…。
スクリーンショット(2010-04-06 0.12.44)
ブログに載せるときにもこんな風に表示したい。

なので、まずは対象となるファイルを Emacs に読み込みます。
これを face2html で HTML に変換します。
M-x face2html RET n
と入力すれば Emacs での表示を反映した HTML の変換結果が得られます。

HTML は行頭の空白文字を無視するらしく、このままだとインデントが乱れてしまうので、対策として行頭の半角スペースを &nbsp; に置換することにします。
M-<
M-x replace-regexp RET ^[ ] RET &nbsp; RET
でOKです。本当は face2html.el を修正してこの中でやっちゃうのがいいんだけれど、何しろ lisp が解らないので…。

あとはこの置換結果をすべてコピー&ペーストして <p class="plist"> と </p> で囲みます。
<p class="plist">
  表示内容をここに貼り付ける
</p>
ってなかんじになります。

knaka01 at 00:27|PermalinkComments(0)TrackBack(0)clip!emacs | HTML