2010年3月20日土曜日

現代メモ理論

どうも、Hyper 鬱ッティング処理が可能なQです、こんちには。

てかメインで使ってるPCが流石に駄目なんじゃないかと思い始めて来た。PenM1.7G、メモリ1.5Gではやはり色々としんどいものがある。まあノートPCなんでHDDの問題とかもあると思うんだけど、ちょっと頑張らせるとすぐに100%になるのはいかがなものか…


1.svn導入

svnなんて書くと本当に現代メモ理論って感じですね(笑)最近まで知らなかったのだが、svn等という超便利なversion管理、ファイル共有ソフトがあるらしい。
これでも一応プラネタリウムとか趣味の関係でそこそこのデータ量を持っているので、PCがお亡くなりになられると結構悲惨。年数回くらいのペースでDVDとかに焼いていたんだけど、ぶっちゃけ

”超”

メンドクサイ。

と言うわけで折角サーバー立ててあるんだし、昨日あたりから導入してみた。

CentOSは特に標準でsvnが入ってるので特にインストール作業は必要ない(仮に無くてもyumで手に入る)。

サーバー側
レポジトリ(ファイルを保存しておく領域)を作る。

mkdir レポジトリ用ディレクトリ
cd レポジトリ用ディレクトリ
svnadmin create ./

これでこのディレクトリはレポジトリとして機能する。



クライアント側
(windowsはTortoiseSVNという便利なGUI環境がある)

既に存在しているレポジトリに参加する場合
まずディレクトリを作る。
windowsではその作ったディレクトリの中でチェックアウトを実行すればOK
Linuxでは作ったディレクトリの中で
svn co svn+ssh://<ユーザー名>@<サーバー名>/<取得したいディレクトリのパス> ./
とすればOK
これでこのディレクトリはレポジトリと同期する。
このレポジトリからクライアントPCに、"同期情報を持ちながら"ファイルを持ってくる作業をチェックアウトという。同期情報を持たず、つまりレポジトリに参加するのではなく単なるダウンロードを行う場合はエクスポートという。(完成版の出力やファイルの二重化を行う場合に使うらしい)

クライアントにあるファイルをレポジトリ化する場合
いくつか方法はあるだろうが僕はこうやった。
まずサーバーに空のレポジトリをつくる。
次にレポジトリ化したいファイルがあるディレクトリに移動し、空のレポジトリに対しチェックアウトを実行する。(ファイルをとりあえずレポジトリに参加させる)
レポジトリ化したいファイルに対し追加を実行する。
(Linuxではsvn add <ファイル名>を実行する。まあ大抵は*なんじゃないかと思う)
最後にサーバーに、ファイルに変更があったとして通知、アップロードする。
(Linux ci *とかでOK。環境変数EDITOR=emacsとかviが事前に作っておく必要あり。エディタファイルが開くので、--この辺から無視--とか書いてある部分の上の業に当該ファイルの情報をカット&ペースト、終了でいける)
このファイルに変更があったとして通知、アップロードする作業をコミットという。同期せず単なるアップロードを行う場合はインポートという。

詳しいことは良く分からんけど、なんか変更を加えたらとりあえずコミットしておけばOK。

(windows)
サーバーと同期するのはやめるときは、同期している最上位のディレクトリで
for /R %i in (.svn) do rd /Q /S "%i"
を実行すると、全ての.svnファイルが削除される。これでOKっぽい。
また、コミットされているファイルを削除したり名前変えたりする場合は、当該のファイルで右クリックしてTortoisSVN⇒削除とかを選ぶ。

(linux)
linuxでは
svn rm ファイル名

いずれも実行した後はコミットを行う。





2.mas
milli-arc-secondの略。星の位置を表す単位の一つでミリ秒角のことらしい。






僕一人
svnで
どうするの?

2010年3月19日金曜日

フラッシュめもリ

どうも、anywhere,anytime、ウッツ!!なQです、こんちには。

たまにXのプログラムを書いていたのだが、Xserverが動いているPCの上でXclient動かすのはXの本質を捉えていないと思い、XserverとXclientを分離して動かしてみた。

なんて書くとちょっとそれっぽいが、なんてことは無い、

自分のLinuxPC⇒SSH⇒サーバーにlogin
サーバー上でxeyesというアレを起動
サーバー⇒x_onnection(TCP)⇒自分のLinuxPC上に表示

しただけ。だけど、思いのほかやってみるとメンドクサかった。
とりあえず、最低限のやるべきこととして、

Xserver側(上記で自分のLinuxPCに相当)で


Xhost + 192.168.xxx.xxx
(192.168.xxx.xxxからのアクセスを受け付ける)

ファイアウォールを切る(TCP,6000番を開けるでもOK)

自分のLinuxはCentOSなので
管理⇒ログイン画面からTCPのコネクションを受け付ける
ようにする。


次にXclient側(上記でサーバーに相当)で


僕はbashなので、
export DISPLAY=192.168.yyy.yyy:0
(要するにXserverが動いているPCのIPアドレス)

でxeyesを実行すればOK。


ついでに
XOpenDisplay("192.168.yyy.yyy:0")
というプログラムでも遠隔でいける。まあ直書きするのはどうかと思うけど(笑)


このスタイルってちょうど20年くらい前の、高性能な演算装置を皆で共用して使っていた時代の使い方そのものなんだよな。この時代には既に、遠隔とか外部から接続とかディスプレイ環境に関するサーバーとクライアントとかが出来ていたってのは驚く。
今はPCスタイルが普通なので何の意味もない。仮想的に計算環境を借りてきた時代じゃなくて、もはや自分のPCを仮想化する時代だし・・・僕のPCはスペック低いので無理だけど。といってもサーバーがAtomD410だから、計算環境を借りる意味すら怪しいのか(笑)

まあちょっとやってみただけですが…





このブログ
もはや只の
メモ帳で

2010年3月15日月曜日

USBめもリ

どうも、ピカピカの鬱年生のQです、こんちには。

今の普通にインストールしたLinuxだと、USBメモリとか殆ど何の問題もなく使えます。しかし、serverみたいにGUIが用意されていないような場合どうしたらいいか知らなかったのでメモろうという魂胆な訳です。

CentOS 5.4
コマンド
dmesg:システムの情報を表示、ここで検出されたUSBの名前とかfile systemを確認
usb-storageほげげのあたりを確認する。
自分の環境では
SCSI device sdb:25600 512-byte hdwr sectors(131MB)
sdb:assuming drive cache:write through sdb:sdb1
と認識されたので、適当なところにディレクトリを作り、
mount -t vfat /dev/sdb1 ./(作成したディレクトリ)

外すときは
umount /dev/sdb1
でアンマウントしてから。

まあ何したいかっていうと古いUSBメモリが余ってたのでしばらくbackupの代わりにしてみようかと。どこまで信用できるか分からんが。

df:ハードディスクとかUSBメモリの容量や使用率を見る。



追記
容量が小さすぎて使い物にならなかった。
vi使うのメンドクセェ…鬱。






数年前
大容量の
メモリかな

2010年3月14日日曜日

Roomemoba

どうも、最近あまり体調が良くないQです、こんちには。

先週は咳&喉の痛みで、今日はなぜか頭痛がする。今はかなり落ち着いたけどまだ若干ふらふらする・・・。ここんとこ色々不調が多いので気を付けないとなぁ。差し当たり無茶してるつもりはないんだけど。


1.hacking roomba
9割がた読み終わった。まあ16章の一部と付録は正直どうでもいいor今更な内容だったのでもう読み終わったとしても問題ないかと。TOEIC400点に満たない僕でも普通に理解できたのでそれなりに平易な英語で書かれていると思う。簡単なレビュー、参考まで。

1章
この本の全体的な概要とRoombaの簡単な説明(本来の機能とか簡単な歴史とか)。この本読むような人はおそらく中古で安いのを探している∧Roombaの簡単な構造とかを知りたいだろうと思うので、ここだけでも読む価値があると思う。

2章
Roomba製造元のiRobotが公開したROI(Roomba Open Interface)の説明。要するにコネクタの各ピンの機能、通信プロトコル、及びRoombaの動作モードについて。マイコンとかでガシガシ遊んでいる人は1章、2章だけ読めば後は読む必要はないかもしれない。以降はこんなのを作ってみよう、使ってみよう系の話なので。

3章
Serial Tetherの製作。PCのRS232CとRoombaを接続する簡単な中継基盤を作る。2章が問題なく理解できる人は、著者が提供しているRoombaCommTestの部分以外は読む価値は無いと思う。逆に初心者の人は抵抗やLEDの簡単な使い方なんかを説明しているので、初めての半田付けくらいの気持ちで読むといいかも。

4章
Serial TetherのBluetooth版の製作。僕は実際これを作った。製作自体はむしろ3章より簡単。BlueSMiRFという装置の使い方が分かる。

5章
モーター部分の分解の様子と、Driveコマンド(実際に動かすコマンド)、およびそれ関連のjavaソースコードの説明。また、Roombaの移動指示をどう計算すればよいかも載っているが、一部間違っているので注意。本家サイトにエラッタ関連のコメントを確認。

6章
センサー部分の説明と使い方、それ関連のjavaソースコードの説明。ここではbumpturn(ぶつかったら方向を変えて進む)とか、角度や距離の検出法なんかも書いてある。

7章
Processingを使った、RoombaViewのプログラミング。平たく言えばRoombaを上から見てどのように動作するかのモーションシミュレータと、操作ボタンを組み合わせたようなプログラム。実際にはソースコードが著者サイトに落ちているので書く必要はない。

8章
同じくProcessingを使ってRoombaに歌わせるプログラミング。songコマンドとかplayコマンドの説明とか。パソコンのキーボードを鍵盤にみなして、Roombaに音を出させるprocessingプログラムが著者サイトにある。

9章
Roombaに絵を書かせるプログラミング。スピログラフがらみの話とかマジックをどうRoombaに取り付けるか、とか。なお後半はちょ、おま!!という展開になっている(笑)こういう行動力は素晴らしいと思う。

10章
Roombaをマウス代わりにしてみたりThereminもどきにしてみたり、目覚まし時計にしてみたり。いずれもprocessingが前提だが、versionが合ってなかったりlibraryが古かったりで本気でやろうと思うと結構面倒くさいと思う。一応Thereminは書いてみたが、むしろprocessingの方ではまった。

11章
RoombaにEthernetを乗せようと言う内容。色々書いてあるが、日本ではXPortが有るのでこっちが重要な内容かな…。XPortの使い方、javaでsocket開いて繋ぐ内容があるので読む価値はあるかも。ちなみに、ここではあくまでEthernet-RS232変換装置、という位置づけ。

12章
11章のwiportバージョン。wiportは素晴らしい製品だと思うが、残念ながら日本でwimicro(wiport+ベース基盤)を手に入れることは出来ない(電波法の関係)。もしwiportを使おうと思うと、自分でベースとなる基盤を作らなければいけない。

13章
RoombaにBasic Stamp、Arduinoを乗せて動かしてみようという話。Basic StampはともかくArduinoはブームなので、これで遊んでみたい人は読んでみると良いかもしれない。Arduinoに限って言うと、bumpturnとbumpturn+moodlight(怪しく光らせて走り回らせよう的な感じ)の作り方が載っている。

14章
15章とともに最も残念になってしまった章。Roombaにlinuxを乗せようという話なのだが、linuxを積んだwireless router等を使っている。これらが、まず販売終了しているのと中古も無い、海外からは変えない(同じく電波法)と言う三重苦。OpenWrtというrouter用linuxのディストリビューションや、それ関係の勉強の章になっちゃってる。非常に悔しいところ。

15章
おそらくこの本の最大の売り所だった章。Roombaにwireless router+webcamを乗せようという話。残念ながらrouterもwebcamも手に入らない。ちゃんと探していないのでもしかしたらどっかに有るかもしれないが…ただそれ関連の簡単な使い方に関する勉強にはなる。僕のようなヘッポコlinux userには以外とありがたい話。

16章+付録
他のなんか乗せてみたの事例紹介と、着せ替え?用のコスチュームの話、と実際にちょっとだけハードに手を加えるような話。付録は、半田付けについて、電気回路について、及びROIの仕様書。まあさすがにこれはいいやって感じなのでちゃんと読んでません。


てな感じ。全体として、「Roombaはファンタスティックで凄いんだ、でもこの部分が…」「Roombaでこんなことできたら楽しいと思わないかい?」的な文体です。ジョークも織り交ぜられており、親しみの持てる内容じゃないかと思います。もし邦訳するなら14章までが価値のあるところかな。邦訳するよりも、この本をベースにして日本で手に入る部品や装置を元にもう少し今風に書き直すってのが良いかも。





2.N330、D410、D510の消費電力、参考まで
D410(SSD:8GB,memory:2GB×1)
起動していない状態 1.5W位
bios画面 18W位
LiveCD(ubuntu),idle 20.5W位

D410(HDD:320GB(7200rpm),memory:2GB×1)
installed centos,idle 23W位

D510(SSD:8GB,memory:2GB×1)
起動していない状態 1.5W位
bios画面 17W位
LiveCD(ubuntu),idle 20.5W位
installed ubuntu,idle 19.0W位

N330(HDD:320GB(7200rpm),memory:2GB×1)
installed centos,idle 32W位

↑結構適当なので注意。あくまで参考。

意外なのがidleだとD510の方がD410よりも消費電力が少ないこと。まじで?つまりD410意味無いじゃん!!というかD410の消費電力に関するレビューが全く見つからないのはどういうこと?まあD410+1000円でD510買えるならD510買うわな、そりゃ。
Atom N世代からD世代で約20%程度の消費電力削減らしいのでまあ妥当なところなんじゃないかと思っている。

今までN330をサーバーに使っていたが、D410のあてが全くなくなってしまったのでそのまま植え替えた(笑)まあどうせ大した負荷は掛からないのと超静かなのが素晴らしい。逆にN330どうすんねんという(笑)しかしD510スゲェな…。てかスペック的に微妙なPCばっかり持ってる漏れ…。





3.D510+SSD+ubuntu9.04について
なんかたまに起動失敗するので、biosでpre-delayという項目を0⇒5にしたら直った。まあ遅いSSD使ってるのでなんとなくその辺の原因かなと思っている。しかし、それでも起動超速い(笑)ヤバイ、SSDはまりそう。


この辺の作業でこのブログが今ままで初めて役に立った(笑)メモは重要じゃよ。







吹雪から
花吹雪なる
想いかな

2010年3月8日月曜日

模様替え

どうも、なんとなくブログの模様替えをしたくなったQです、こんちには。

ついでにアクセスカウンタも付けてみた。こんな糞ボログ誰もみないと思うが。

このソリッドな感じがいいね(笑)。htmlで設定を変えなければならないので、極めて面倒だがその分自由度は高い。といっても僕html全く書けないけど。

2010年3月5日金曜日

電メモ工学第一

どうも、だんだん日記のタイトルがめちゃくちゃになってきたQです、こんちには。

人生は色々あるものです。それは必ずしも良いことではないものです。つまり、プログラムがメンドクサイのである。何がメンドクサイって例のprocessing。言語自体が鋭意開発中?かつ、ライブラリ類もまあちょっと時間が経てばすぐbackward compatibilityが失われていたりするわけです。

知る人ぞ知るあれの中で、roombaを動かす為のプログラムがprocessingで書かれているのだがこれがちょっと古くて今のprocessingやライブラリに合って無いんだよな…。いくつかのプログラムを検索してみたら見つからないのもまあ頷ける。

1.RoombaThereminToo
とりあえずまねして作ってみたが、全く駄目駄目だったので、現在のライブラリの仕様にあわせて書き直してみた。


import krister.Ess.*;
import roombacomm.*;

String roombacommPort = "COMxx";

RoombaCommSerial roombacomm;
AudioChannel mySoundA;
SineWave myWave;
RateShift myRateShift;

int pshift;

void roombacommPortSelected()
{
roombacomm = new RoombaCommSerial();
if( roombacommPort.equals("testdummy") ) return;
println("opening roomba serial port '" +roombacommPort+"'");
if( ! roombacomm.connect( roombacommPort ) ) {
println("oh noes");
}
println("Roomba startup");
roombacomm.startup();
roombacomm.control();
roombacomm.full();
roombacomm.pause(50);
println("Playing some notes");
roombacomm.playNote( 72, 8 );
roombacomm.pause( 200 );
roombacomm.playNote( 72, 10 );
roombacomm.pause( 200 );
}

void roombacommSetup()
{
if( roombacommPort != null ) {
roombacommPortSelected();
return;
}

RoombaComm rc = new RoombaCommSerial();
final String portlist[] = rc.listPorts();
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
String port = (String) javax.swing.JOptionPane.showInputDialog( null,
"Select Roomba Port",
"RoombaThereminToo",
javax.swing.JOptionPane.QUESTION_MESSAGE,
null, portlist, null);
if( port == null ) {
javax.swing.JOptionPane.showMessageDialog(null, "No port chosen, goodbye");
System.exit(1);
}
roombacommPort = port;
roombacommPortSelected();
}
catch (Exception e) {
e.printStackTrace();
}
}
});
}

void setup() {
roombacommSetup();
Ess.start(this);
mySoundA = new AudioChannel();
mySoundA.initChannel(mySoundA.frames(250));
myWave = new SineWave(960,.75);
myWave.generate(mySoundA,0,mySoundA.frames(250));
myRateShift = new RateShift(0);
pshift = 0;
println("start");
}

void parseRoombaSensors(){
if(!roombacomm.cliffLeft()){
pshift++;
}
if(!roombacomm.cliffFrontLeft()){
pshift++;
}
if(!roombacomm.cliffRight()){
pshift--;
}
if(!roombacomm.cliffFrontRight()){
pshift--;
}
if(!roombacomm.wheelDropLeft()){
pshift++;
}
if(!roombacomm.wheelDropRight()){
pshift--;
}

if(!roombacomm.wheelDropLeft() && !roombacomm.wheelDropRight()){
pshift = 0;
mySoundA.stop();
myWave.generate(mySoundA,0,mySoundA.frames(250));
}else if(roombacomm.bump() && mySoundA.state == Ess.STOPPED){
mySoundA.play(Ess.FOREVER);
}
}

void audioChannelLoop(AudioChannel ch){
if(pshift != 0){
myRateShift.percent = Ess.calcShift(0.03*pshift);
myRateShift.filter(mySoundA);
pshift = 0;
}
}

void draw() {
roombacomm.sensors();
parseRoombaSensors();
}

はっきりいって、まともに音出ません。なんか知らんけど最初のうちは動くけど、途中からザーザー言い出すし。で、そもそもrate変更とかする必要ないんじゃね?と思って次のように変えてみた。


2.RoombaThereminToo2
変更点
void setup() {
roombacommSetup();
Ess.start(this);
mySoundA = new AudioChannel();
mySoundA.initChannel(mySoundA.frames(100));
myWave = new SineWave(960,.75);
myWave.generate(mySoundA,0,mySoundA.frames(100));
pshift = 0;
println("start");
}

void audioChannelLoop(AudioChannel ch){
if(pshift != 0){
myWave.frequency += 2*pshift;
myWave.generate(mySoundA);
pshift = 0;
}
}

かなりましになったけど、まだグリッチが入る。おそらく位相が合わないせいとかマシンパワーのせいとかだと思うけど、本質的にprocessingもEssも理解して無いので絶対どっかにバグはある。まあ、そもそもこれを勉強する気は今のところ全く無いのでこんなものでいいや。
//確かに楽な言語ではある。クリティカルな用途じゃなければまあ意外と使い勝手はいいのかも。





3.%gの注意点
printf("%g",i);
とするときに%gにiが代入されるが、iが整数型だとおかしくなる。doubleを使うか、明示的にキャストをする必要がある。





プログラムを書けるようになる、という経過を辿る時、サンプルソースを見るというのは避けられないことだと思う。しかし、サンプルソースはベストなケースで「それを書いた人の環境と時期でしか動くことは保証されていない」と考えるべきだということが良く分かった。ひどい場合はバグだらけなんてこともままある。只おかげで勉強になったりすることもあるんだけど…

あんまり人のソース読んでどうこうっていう経験がないからなぁ…今更なんだよな。





面倒に
感謝されない
理解あり

2010年3月1日月曜日

やさしいメモ論

どうも、最近ニコニコ動画の凄さに気づいてしまったQです、こんちには。

タイトルのネタが段々乏しくなってきましたが、まあ最悪、~~第二とかで逃げれば良いので(笑)

1.スピログラフのイメージ
スピログラフとはちょっと違うけど。
二つの同じ半径のボールが有ったときに、一つのボールを固定して、もう一つのボールを固定されたボールの上を滑り無く転がしたとき、半周分しか転がさないのに、何故か転がした方のボールが一回転する、というのが分からなかった。
でもそれは以下のように考えることで解決できた.











つまり、一回転したように見えるけど、実際は二つのボールがそれぞれ反対方向に半回転分回っているわけですな。そして、固定されているはずのボールを本来の位置に戻すと一回転しているように見えると。






2.Rumer has it the world is held together by duct tape.
最初意味が分からなかった。Rumer has itで「~~という噂だ」という意味だと言うことが分かると…(笑)




3.XRaiseWindow
本来の意味としては、当該のwindowを上に表示させる関数。が、override-redirectがFalseの場合、イベントが通知されるだけで実際には上にならない。この辺の動作は思ったよりも難しいのかも知れない。





4.XDrawString16
2byte文字を書くための関数なのだが、引数に文字数の指定がある。この単位は2byte indexingらしい。明示的に書かれて無いので不明だが。また、普通の1byte文字を放り込んだ場合、byte2に当該の文字が入り、byte1は0x00として扱われる。





5.linuxでCPUの情報をみる。
cat /proc/cpuinfo




6.AtomプロセッサD510
GPU内蔵のDual Atomプロセッサ搭載のマザーボードがintelから出てる。ATX電源の端子が説明書には24pinと接続する的なことが書いてあるが、20pinでも動いた。


そういえば最近プラネタリウムから離れ気味だなぁ…





プラネもね
流石にそろそろ
始めたい