windowsにvagrantを入れてみた
vagrantはコンソールから仮想マシンを操作するためのソフト。
Chefというソフトと連携して、仮想マシンに追加でソフトをインストールすることもできる。
これを使えば、同じ環境の仮想マシンをぽこぽこ作れるわけです。
で、これをWindowsに入れようと思ったわけですが、最新版を入れると仮想マシンの起動でエラーを吐いて上手く動かない。
C:/Ruby193/lib/ruby/gems/1.9.1/gems/virtualbox-0.9.2/lib/virtualbox/com/implemen ter/mscom.rb:61:in `method_missing': (in OLE method `ImportMachines': ) (WIN32OL ERuntimeError) OLE error code:0 in <Unknown> <No Description> HRESULT error code:0x80020005 Type mismatch. from C:/Ruby193/lib/ruby/gems/1.9.1/gems/virtualbox-0.9.2/lib/virtualbox /com/implementer/mscom.rb:61:in `call_function'
と、言う訳でこれの解決方法のメモ。
結論から言うとバージョン選びが重要。最新バージョンは動きません。(2012/1/15現在)
以下のバージョンで動作を確認。
- ruby 1.9.3p0
- vagrant 0.7.8
- Virtual Box 4.0.16
まずはRuby。これは最新バージョンでも動くと思う。
今回はRubyInstaller for Windowsを使った。DevKitなるものがあとで必要となるので、Development Kit - GitHubを参照して、これも入れておく。
vagrantはRubyのライブラリ。gemを使ってインストールする。そのままインストールすると最新バージョンをインストールされてしまうので、次のようにする。
gem install vagrant -v 0.7.8
VirualBoxはDownload_Old_Builds - VirtualBoxから4.0系列を落としてきてインストール。
GUIのインストーラに従って、OKボタンを連打していけばOK。
最新版で上手く動かないのはvagrantのバグらしく、次期バージョンではこの問題は修正されるらしい(#420: Broken after upgrading to VirtualBox 4.1.0 & Vagrant 0.9 on Windows XP - Issues - mitchellh/vagrant - GitHub)。
それまでちょっと古いので我慢。詳しい使い方は、また今度。勉強したらまたメモします。
PythonとSAXでXMLを扱う
XMLを扱いたくなったのでメモメモ。
XMLを扱うためのAPIとして、DOM(Document Object Model)を構築する方法と、SAX(Simple API for XML)ってのを使う方法がある。
どちらもW3Cで標準化されているAPIだから、Pythonに限らず、いろんな言語で同じようにXMLを扱うことができる。
HTML上のJavaScriptなんかを触ってると、DOMはよく出てくるね。
DOMとSAXの違いは、DOMはメモリ上にXMLのデータを全部取り込んでから処理をするのに対して、SAXはデータを読み込んだら逐次処理していく点。
DOMは、XMLの構造をツリー構造として扱うことができるから、いろいろ高度なことができる。
ただ、メモリ上に全てのデータを展開するから、メモリを食うし、重い。
SAXは、XMLのタグの出現を「イベント」として扱うAPI。
読み込んだデータをメモリ上にとっておかないから、非常に軽い。
ただし、後からXMLの構造をいじったりするのは苦手。
今回扱いたいデータはWikipediaのダンプデータ(Wikipedia:データベースダウンロード - Wikipedia)。
pages-articles.xml.bz2を解凍すると6GB程度になる。これを全部メモリ上に読み込むのは大変なので、SAXを使って見ることにする。
基本は以下のソース
import xml.sax import xml.sax.handler import sys class Handler(xml.sax.handler.ContentHandler): def startElement(self, name, attrs): print "Start: " + name def endElement(self, name): print "End: " + name def characters(self, content): print "character:" + content return def main(): parser = xml.sax.make_parser() parser.setContentHandler(Handler()) parser.parse(sys.stdin) return if __name__=="__main__": main()
Handlerのメソッドとして、開始タグを見つけた場合、終了タグを見つけた場合、その他の文字を見つけた場合の処理を書いておく。
nameにタグ名、attrsに属性(辞書と同じように扱える)が入っているので適宜処理。
XMLには名前空間の考え方があって、あるXMLデータに別のXMLデータを埋め込むことが簡単にできる。
(例えば、HTML文章にSVG文章を埋め込んだり、SVG文章やXHTML文章にクリエーティブコモンズのライセンスをXML形式で埋め込むとか)
import xml.sax import xml.sax.handler import sys class Handler(xml.sax.handler.ContentHandler): def startElementNS(self, name, qname, attrs): print "Start:", name, qname def endElementNS(self, name, qname): print "End:", name, qname def characters(self, content): print "character:" + content return def main(): parser = xml.sax.make_parser() parser.setContentHandler(Handler()) parser.setFeature(xml.sax.handler.feature_namespaces, True) parser.parse(sys.stdin) return if __name__=="__main__": main()
こうすると、nameが(名前空間,タグ名)という形式になる。attrのキーも(名前空間,属性名)になる。
shogo82148/svg2css @ GitHubを作るのにもSAXを使用中。はじめは「簡単な置換だからSAXでいけるだろー」ってSAXで作ったら、参照が必要になって、結局DOMっぽい物を作っているというね・・・。
沖縄高専から公式コメント
昨日の書いた記事「磁力の引力と斥力で発電(?)する装置」を簡略・効率化してみたよで取り上げた沖縄高専:磁石の力で発電 エコエンジン研究へ(毎日新聞, 琉球新報の記事は削除されてしまったようです)という記事に対して、沖縄高専から公式にコメントが出ました。
平成23年11月26日付琉球新報掲載記事「磁石の力で発電 エコエンジン研究へ」に関する本校コメント
発表に至った経緯を要約すると
ということです。あの記事は記者の勝手な解釈によるもので本学は関係ない、とでもいいたいような書き方です。
まあ、沖縄高専が、勝手に記事にされた、と言いたくなるのもわかります。『平成23年11月25日(金)に開催された本校主催「沖縄高専フォーラム」内にて、本校教員がこの件に関して、琉球新報の記者に取材を受けた』とあって、記事が公開されたのは11月26日(土)の朝刊。前年度の開催が午後から(今年の案内が見当たらないのはなんでだろう?)ってことを考えると、取材から記事公開まで、半日もなかったはず。フォーラムの直後で、金曜日で翌日はお休みって状況で、高専側が琉球新報に記事の確認を求めるのは無理でしょう。この点は、記事を推敲する時間を十分に取らず、取材対象の了解を得ないまま記事を掲載してしまった琉球新報に完全に非があると思います。
だた、あの発明はどう見てもエネルギーを生み出す永久機関を意図したものです。この発明についての特許である特開2011-239676の題名は『マグネット式エコエンジン』。「エンジン」という単語が入っている時点で動力源、つまり運動エネルギー源としての利用を想定しているのは明らかです。また、本文中には『動力を得る』という単語が何度も使われているのに加え、『本発明に係るピストンエンジンは、特に自動車や船舶、工場等の原動機、自家発電用の発電機、さらには原子力発電に代わる代替原動機として有効である。』などと書いてあります。「発電機」なんていう単語が出てます。明らかに「発電」という用途を想定しているわけです。
もちろん、この特許文章に沖縄高専が関わっているかどうかはわかりません。出願人に書かれているのは発案者の社長だけです。高専が関わっていたら、何かしら関係者の名前が入っているんじゃないですかね。でも、特許作成に高専が関わったかはともかく、少なくとも高専側はこの特許文章を読んでいると思うんですよね。とすると、これが動力源た発電機としての用途を想定していることを知っていたわけで、これは『摩擦抵抗を緩和する等の補助的な効果が見られればとの意図による技術相談』と言えるんですかね?
沖縄高専が特許文章作成に関わったか/関わっていないか、沖縄高専が特許文章の内容を知っていたか/知らなかったのか、ってところは僕の憶測です。実際のところは直接高専に聞いてみるしか無いでしょう。でも、これ以上追求したところで、言った言わないの水掛け論になりそうです。なんだか政治家のやり取りを見ているようで気持ち悪いですね。
と、言うことで、これ以上の憶測でものをいうのはやめておきましょう。沖縄高専があれを永久機関として捉えていたのかってのは関係ないんです。単に程度の問題で、あれが「摩擦抵抗を緩和するかも」って考察している時点で、高専バカにされても仕方ないと思います。
結局問題なのは
- 報道機関が提供する情報の質が低下している
- なんで「裏」を取ろうとしないんですかね?
- 「教授」って名前が付けば、コメントもらうの誰でもいいと思ってるんですか?
- その「教授」さんが断らないのも問題
- 学生を教える立場である教員の科学リテラシーの低下
- こんな物理学の初歩中の初歩もできないの?
これらの問題は前々から言われていることですが、どうしたら解決できるんですかね?正直僕の手には余る問題なので、後々ゆっくりと考えることにしましょう。
とりあえず、未だ学生を続ける僕としては、沖縄高専の学生さんがこんな不毛な卒業研究をしなくて済みそうなので満足です。
追記:
僕以外にもこの件について色々書いている方が
沖縄高専と琉球物産貿易連合の「マグネット式エコエンジン(永久機関)」の検証と,沖縄高専のコメントの矛盾について
元となった琉球新報の記事や特許文章が引用されています。こちらも見てみるといいでしょう。
また、はてなブックマークなどでコメントをくださった方も多くいるようで。その中に「新報が記事にしてなかったらどうなっていたのだろうねと思うと…。」と言うのがありました。確かにこの記事がなければ、そのまま卒研になっていたかと思うと恐ろしいですね。そういう意味では、それを防ぐことができた本件は非常にラッキーなことだったんだと思います。沖縄高専には再発を恐れてクローズドにならないで欲しいですね。本当の意味での再発防止は、学会にどんどん出るとか、論文をバリバリ書くとか、いろんな取材を受けるとか、どんどん外に出ていくことです。そして、周りから「こんなの本当にできるの?」って叩かれることなんです。(本来は学生が学内で教員に叩かれるべきものであって、教員が学外の学生に叩かれるとか最悪の展開なわけですが)
さて、いろいろ書いていたらなんだかちょっと言い過ぎたかなって気もしてきたので、好意的な解釈もしてみましょうか。ひょっとすると、沖縄高専に持ちかけられたのは、「磁気による動力伝達はできるのか」という技術相談だったのかもしれません。磁気による動力伝達というアイデア自体はいい線行ってると思います。機械的な接触はどうしても摩擦が発生し、部品が摩耗します。磁気を使えば非接触で動力を伝えることができるため、摩耗せず、メンテナスが不要な機械を作ることができます。このアイデアはすでに実用化されており、株式会社プロスパインさんでは、歯車の歯を磁石に置き換えた「磁気歯車」や、軸と軸をつなぐ「磁気カップリング」を作っています。
本件の磁気による動力伝達機構は、よくよく見てみると、カムと同じ働きをしています。磁気の力を使って、非接触で回転運動を直線運動に変えることのできるいわば「磁気カム」ですね。先ほど紹介したプロスパインの製品ラインナップを見ても「磁気カム」は扱っていないようです。やった!これは、すごい発明かもしれない!
と、思ってググってみると、「磁気を用いたカム装置」とか「磁気浮上・吸着カム」とかいう特許が出てきました。……もうあるじゃん。「磁気浮上・吸着カム」の出願人は「ソニー株式会社」ですか。ほう…こんなことしてたんですね…。あと、おもちゃにも使われている例がありました。
どちらの特許も、審査請求がなかったため取り消しになっているようです(特許は出願されただけじゃ有効にならなくて、3年以内に審査してもらわないといけないらしいです)。なんで審査しなかったんでしょうね?審査されていない以上、上記特許は特許としては無効なわけですが、「磁気カム」というアイデアが過去にあったということは間違いないようです。ここから先は調べていませんが、誰かが研究していてもおかしくなさそう。件の助教授はもちろん調べて、研究されてなさそうだ、ってことを確認したんですよね?僕信じていんですよね?
磁力の引力と斥力で発電(?)する装置」を簡略・効率化してみたよ
SlideShareに初アップロードしてみました。
磁力の引力と斥力で発電(?)する装置」を簡略・効率化してみたよ - Slide Share -
磁石の力で発電 エコエンジン研究へという記事を見て作ったものです。以前、球体循環装置とかいう発電装置が出た時に『「重力と浮力で発電する装置」の簡略・効率化』というスライドを見て、似たようなもの作れないかと@jun_oyaと議論して作りました。球体循環装置はピンポン玉の動きで水が移動していることを巧妙にカモフラージュした水力発電でした。ただ、今回のエコエンジンなるものは、記事や特許文章をどう解釈しても永久機関をつくろうとしているとしか思えない。どうやって永久機関では無いことを証明するか、というところが苦労しました。スライドでは説明しきれなかった部分をここで書いておきます。
まず、マグネット式エコエンジンの機構説明の部分。記事にはなかったモーターをつけちゃったんですが、特開2011-239676で公開されているマグネット式エコエンジンの特許文章を見ると、「マグネット式エンジンが始動していない時には、図示しない電気モーターがベルト11を通して、永久磁石2が取り付けられた基盤1を回転させることにより、初動のエネルギーを得る。」とあります。バッチリモーターって書いてありますね。特許文章を見ても、その後エネルギーの供給がどこから行われるのかを書いた文章は見当たりません。
この文章の中で参考文献として「特開平5-22894号 クリーンエンジン」「特開平5-312142号 マグネットエンジン」「特開2002-27734号 電動エンジン」「特開2007-74806号 ピストンエンジン」というようなすごく怪しげなタイトルの特許が挙げられています。4つともエンジンのピストンをソレノイドに置き換えれば電気でエンジンを回せるのではないかという内容です。なぜわざわざ直線運動を作ってから回転運動にするのか、なぜ直接電気を回転運動に変換する方法を考えないのか、っていうか回転運動を得たいならモータでいいじゃないか、と色々突っ込むところはあるのですが、まだ外部からエネルギー供給があるだけ実現できそうな気がします。これらの特許に関して「コイルの通電の制御のため、複雑な構造になる」からダメだなどとかいてありますが、電気屋さんをなめてもらっては困ります。例えば、車のエンジンでは、ローターの位置を見ながら点火プラグを制御するということをやっています。同じ事を機械で頑張ることもできますが、電気的にやったほうが簡単に効率がいいものが作れるんです。直流ブラシレスモータなんかもそうですね。こちらはローターの位置によってコイルに流す電流を制御しています。ほら、「コイルの通電の制御」できてるじゃないですか。磁石の極の切り替えを機械でやろうとしたほうがよっぽど複雑です。機械と電気の住み分けをもっと考えましょう。
さて、オリジナルのアイデアを簡略化することによって、「結局〇〇じゃん!」っていうことをやりたかったわけですが、磁石を外すのが一番難しかった。スライドでは、力が釣り合うから磁石の意味無いよね、って言うことにしてます。ベルトを外したのはこの説明をする際に力のやり取りが見やすくなるかなと思ったから。しかし、厳密にはこの説明は間違いです。実際には磁石の位置とかクランクの長さなどの違いによって、円盤は回転します。作用・反作用で発生する「力」は厳密に等しいですが、「モーメント」はそうでないということですね。モーメントが発生してしまう以上、スライドの説明は完全に間違いなのですが、分かりやすさを考慮して省略しています。
なぜ、モーメントが発生するのに、エネルギーを発生することができないか。ガウス加速器みたいなものを見ると、なんだか磁力ですごいエネルギーが得られそうな気がするんですよね。確かに一瞬だけを見るとエネルギーを取り出せています。ただ、トータルで見ると結局なにもとりだせないんです。これをスライドで、簡潔に、わかりやすく説明するのは無理だ、と判断して省略しました。
たぶん重力とのアナロジーを考えるとわかりやすいと思います。高いところから低いところへ物体を落とすと、その物体は加速し、運動エネルギーが得られます。さて、このエネルギーはどこから来たのでしょう?重力から得られた?いいえ、違います。高いところと低いところの「位置エネルギー」の差が、運動エネルギーになったのです。運動エネルギーと位置エネルギーの和は力学的エネルギーと言って、これは他のエネルギーに変換しない限り保存されます(中学校でならったよね?)。この位置エネルギーという概念は重力だけではなく、磁力でも使えます。
この機械がやっていることは、磁力で振り子を作っているだけなんですよ。振り子っていうのは、確かに一瞬を見れば、運動エネルギーを取り出せるように見える。だけど、せっかくできた運動エネルギーは、円盤が回転すると、再び位置エネルギーに戻っちゃんですね。結局運動エネルギーは始めに与えたもの以上は得られないわけです。
それにしても、こともあろうに高専の教官がこんなものにお墨付きを与えるなんて。
高専出身者として恥ずかしい・・・
最後に
あのスライドによって、来年あれを卒業研究にするなどという恐ろしい事態を回避できることを祈っています。
追記:
沖縄高専から公式なコメントが出たので、それについて考察してみた http://shogo82148.hatenablog.com/entry/2011/12/01/002319
スーパーpre記法のテスト
ここHatena Blogもシンタックスハイライトに対応しているらしいです。
http://blog.hatena.ne.jp/-/feedback/13208692334729889835
だけど、C++のソースコードをスーパーpre記法で載せたらシンタックスハイライトされなかった・・・orz
言語依存なのかな?と思い、他の言語ではどうなのかテストテスト。
C言語
#include <stdio.h> int main(void) { printf("Hello World!!\n"); return 0; }
C++
#include <iostream> using namespace std; int main(void) { cout << "Hello World!!" << endl; return 0; }
C#
class HelloWorldApp { static void Main() { System.Console.WriteLine("Hello World!!"); } }
Python
print "Hello World!!"
Perl
print "Hello World!!\n";
Java
public class Hello{ public static void main(String[] args){ System.out.println("Hello World!!"); } }
PHP
<?php echo 'Hello World';
TeX
\documentclass{jarticle} \begin{document} Hello World!! \end{document}
Ruby
puts "Hello World!!"
Javascript
window.alert('Hello World!!');
Lua
print "Hello World!!"
Go
package main import "fmt" func main() { fmt.Print("Hello, World!\n") }
Groovy
print 'Hello World!!'
Haskell
main = interact $ const "Hello World!!\n"
HTML
<html><body><p> Hello World!! </p></body></html>
Dart
main() { print('Hello World!!'); }
結果
とりあえず、自分が使いそうな分だけ書いてみた。
結果PerlとJavascriptとCSSはシンタックスハイライトされるけど、他はされない(2011/11/24現在)。
追記
はてダで使えた言語にすべて対応した模様です。(http://staff.hatenablog.com/entry/2012/05/24/161948)
古い記事も再編集して公開するとシンタックスハイライトされるみたい。
boost::asioでUDP/IP通信
C++でUDP/IP通信をやろう!
って思って、 http://www.geekpage.jp/programming/winsock/udp.php とか
http://www.geekpage.jp/programming/linux-network/udp.php とか
を見ながらシステムコールを実装してたんだけど、よく調べてみたらboostでもUDP/IPあつかえるじゃないか!
そういうことで簡単なメモ
まずは受信
#include <iostream> #include <boost/array.hpp> #include <boost/asio.hpp> using boost::asio::ip::udp; int main(int argc, char* argv) { try { boost::asio::io_service io_service; udp::socket socket(io_service, udp::endpoint(udp::v4(), 12345)); boost::array<char,2048> recv_buf; udp::endpoint remote_endpoint; boost::system::error_code error; size_t len = socket.receive_from(boost::asio::buffer(recv_buf), remote_endpoint, 0, error); std::cout.write(recv_buf.data(), len); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } }
次に送信
#include <iostream> #include <boost/array.hpp> #include <boost/asio.hpp> using boost::asio::ip::udp; int main(int argc, char* argv) { try { boost::asio::io_service io_service; udp::resolver resolver(io_service); udp::resolver::query query(udp::v4(), "localhost", "12345"); udp::endpoint receiver_endpoint = *resolver.resolve(query); udp::socket socket(io_service); socket.open(udp::v4()); std::string str = "HELLO"; socket.send_to(boost::asio::buffer(str), receiver_endpoint); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } }
非同期もできる。
#include <iostream> #include <boost/array.hpp> #include <boost/asio.hpp> using boost::asio::ip::udp; boost::array<char,2048> recv_buf; void receive(const boost::system::error_code&, std::size_t len) { std::cout.write(recv_buf.data(), len); } int main(int argc, char* argv) { try { boost::asio::io_service io_service; udp::socket socket(io_service, udp::endpoint(udp::v4(), 12345)); udp::endpoint remote_endpoint; boost::system::error_code error; socket.async_receive_from( boost::asio::buffer(recv_buf), remote_endpoint, &receive); io_service.run(); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } }
これでマルチプラットフォームで動かせるってすごいね。
asioはシリアルポートにも対応しているみたい。知らずにAPI直接叩いて自作してたよ・・・後でこっちも試してみる。
参考: http://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio.html
ところで、新しいブログ、スーパーpre記法には対応してないのかな。シンタックスハイライトできてないよ!
WYSIWYGなエディタが搭載されたというのに、ソースコード載せられないし、結局今までのはてな記法を使っている。
何とかして!
追記:
はてなブログのフィードバックを見るとスーパーpre記法のシンタックスハイライトには対応済みとなっている。
はてなダイアリーで全く同じ文章を投稿すると正しく表示されるから、記法を間違えたわけじゃないよな・・・。
http://d.hatena.ne.jp/shogo82148/20111123/1322062761
こちらの記事は書き込みテスト用ということで、本記事に対してコメントがある場合は上のリンクにお願いします。
boost::asioでUDP/IP通信
って思って、 http://www.geekpage.jp/programming/winsock/udp.php とか
http://www.geekpage.jp/programming/linux-network/udp.php とか
を見ながらシステムコールを実装してたんだけど、よく調べてみたらboostでもUDP/IPあつかえるじゃないか!
そういうことで簡単なメモ
まずは受信
#include <iostream> #include <boost/array.hpp> #include <boost/asio.hpp> using boost::asio::ip::udp; int main(int argc, char* argv) { try { boost::asio::io_service io_service; udp::socket socket(io_service, udp::endpoint(udp::v4(), 12345)); boost::array<char,2048> recv_buf; udp::endpoint remote_endpoint; boost::system::error_code error; size_t len = socket.receive_from(boost::asio::buffer(recv_buf), remote_endpoint, 0, error); std::cout.write(recv_buf.data(), len); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } }
次に送信
#include <iostream> #include <boost/array.hpp> #include <boost/asio.hpp> using boost::asio::ip::udp; int main(int argc, char* argv) { try { boost::asio::io_service io_service; udp::resolver resolver(io_service); udp::resolver::query query(udp::v4(), "localhost", "12345"); udp::endpoint receiver_endpoint = *resolver.resolve(query); udp::socket socket(io_service); socket.open(udp::v4()); std::string str = "HELLO"; socket.send_to(boost::asio::buffer(str), receiver_endpoint); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } }
非同期もできる。
#include <iostream> #include <boost/array.hpp> #include <boost/asio.hpp> using boost::asio::ip::udp; boost::array<char,2048> recv_buf; void receive(const boost::system::error_code&, std::size_t len) { std::cout.write(recv_buf.data(), len); } int main(int argc, char* argv) { try { boost::asio::io_service io_service; udp::socket socket(io_service, udp::endpoint(udp::v4(), 12345)); udp::endpoint remote_endpoint; boost::system::error_code error; socket.async_receive_from( boost::asio::buffer(recv_buf), remote_endpoint, &receive); io_service.run(); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } }
これでマルチプラットフォームで動かせるってすごいね。
asioはシリアルポートにも対応しているみたい。知らずにAPI直接叩いて自作してたよ・・・後でこっちも試してみる。
参考: http://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio.html