04.30.2005 13:08

Mars rover stuck for a bit

Opportunity Mars Rover Stuck in Sand

Researchers Drill Historic Hole In Atlantic Ocean Floor

Tiger has ACL's! Wonder if that will work with network mounted volumes? I still want AFS for group projects.

View the earth from satellites - not a real image. Just a synthetic view from it's location.

Posted by Kurt | Permalink

04.29.2005 16:38

Fink is ready for 10.4

I can't say that I helped out at all with this nor have I tested any of my packages. The core guys on the fink team ROCK! The Fink and Tiger announcement.
  Fink is ready for OS X 10.4! There are several ways you can update:
  A binary installer will be available within a few weeks, for
  binary-only users. For users of the stable tree, we recommend that
  you delete your current fink with sudo rm -Rf /sw and then
  "bootstrap" an installation of fink-0.23.9 using
  fink-0.23.9.tar.gz. After running bootstrap.sh in that directory,
  you'll need to run "fink selfupdate". For users of the unstable
  tree, you may be able to upgrade just by installing fink-0.24.5. Be
  sure to reinstall this fink package ("fink reinstall fink") after
  upgrading to 10.4.
It will be a while before I get anywhere near tiger. But I can't wait.

Posted by Kurt | Permalink

04.28.2005 20:11

Lots of mac links

With 10.4 coming out tomorrow, there are lots of mac links going by. I'm not really reading any of this now. But they look interesting!

AuthomatorWorld - Mac Scripting

aimsniff for debugging aim robots.

Practical Common lisp. cdr, cdr, cdr, garbage collect.

Posted by Kurt | Permalink

04.28.2005 15:42

Perl Cookbook in Python

Perl Cookbook in Python by the PLEAC Project.

Take a look at PLEAC - Programming Language Examples Alike Cookbook. I have never heard of the Merd language before. From their list, here is what I have programmed in before (no statement as to my skill level):
  perl, python, ada, tcl, ocaml (grr), java, commonlisp, 
  c++, php, nasm.
Too many languages. How do you choose a language? Me, it comes from being force to try some of them, but I Dan Christian and I both found python interesting at about the same time. How the heck did I decide to go for python? All I can remember is that Tcl was getting very frustrating for Marsokhod developement back in 96/97, so we knew we needed something better.

Posted by Kurt | Permalink

04.28.2005 12:24

artechnica 21 page review of OSX 10.4

I don't have time to read this, but it looks like a serious review of OSX 10.4: Mac OS X 10.4 Tiger - By John Siracusa

Posted by Kurt | Permalink

04.28.2005 10:40

Copy of movie and go to jail for 3 years

New law cracks down on P2P pirates. This is getting out of control. Three years for one illegal movie copy even with no downloads.
  This bill is necessary to ensure that all those involved in the
  production of a film, from the director to the set carpenter, are
  not cheated."
The "set carpenter"!?!?!?! You have to be kidding. That guy gets paid no matter what and he does not make any royalties. We need IP (copyright&patent) reform with a brain. Not this JUNK.

04.28.2005 06:03

link - python parsing and...

Wow! A nice rainy day in San Diego.

Using python re for lexical analysis.

Python indenting with stack frame - not like I understand how this one works, but very cool!

Posted by Kurt | Permalink

04.27.2005 18:08

Aqsis - REYES Renderman renderer

Another thing to add to fink:
Aqsis is a high quality, photorealistic, 3D rendering solution. It
complies with the Renderman interface standard defined by Pixar.


Aqsis comprises a command line rendering tool, a tool for compiling shaders in the RSL language, a tool for preparing textures for optimal use, and various developer libraries to enable integration with third party tools.
iPod diagnostic

Posted by Kurt | Permalink

04.27.2005 16:48

Mac laptop issues

I spoke too soon about all my laptop rough edges going away. Yesterday I had the power shut off again where I had to unplug and plug back into the wall. This morning I had a runaway updatedb that had sort filling up my hard disk by dumping files in /var/tmp. And now wireless went down for no good reason again. Maybe I should switch for Airport Express from the Linksys 54G. So now I get to reboot. Doh!

Posted by Kurt | Permalink

04.27.2005 16:10

Making an xcore photo description file

I am going back through my older data generating xpd (xcore description files) so that I can put photos next to some of my new measurements for TTN136B. Here are some notes on how I am currently making these files. This is not the best way, but it works for now.

This is for piston core 2 from TTN136b (a.k.a. ttn136b-2p or 02PC)

I start by using the ImageMagick program identify. Identify gives the size of the image so that we can setup the coordinate frame in the next step.
  identify 02pcArchivesBW.jpg 
  02pcArchivesBW.jpg JPEG 1935x2874 PseudoClass 256c 1.1mb 0.420u 0:01
I then subtract one from the width and hight. Those go into a Makefile entry for processing these images as the WIDTH2 and HEIGHT2
WIDTH2  := 1934 # 1935
HEIGHT2 := 2873 # 2874
designate-points-2: 2p.pgm designate-instructions
	g3data -scroll -coords 0 ${HEIGHT2} ${WIDTH2} 0 $< -scale 1

02pcArchivesBW.jpg:
	wget http://schwehr.org/TTN136B/Data/CorePhotos/02pcArchivesBW.jpg
2p.pgm: 02pcArchivesBW.jpg
	convert 02pcArchivesBW.jpg 2p.pgm
2p-gray-total.png: 2p.pgm 2p.xpd
	processCore $< 2p.xpd 2p-gray
	convert 2p-gray-total.pgm 2p-gray-total.png
	open -a /Applications/Adobe\ Photoshop\ CS/Adobe\ Photoshop\ CS.app 2p-gray-total.png
The next step is to run make desinate-points-2. This starts g3data with a pre-defined coordinate frame for the image. Go through and click first on the top right corner of all the n*10 cm ticks (0,10,...,140,150) for the left ruler and then the right ruler. Make sure to go from 0..150 in order. Then for each section click on the four corners starting with the bottom left and going counter clockwise. Leave out the empty liner or edges unless you really want them to be a part of your core photo.



Warning, try not to make too many mistakes. Erasing points has a tendency to crash g3data later on when saving. I have not found time to track down this bug.

When done selecting points, select Export point data. Clock on "Export data file file" and enter 2-g3data.dat. Then press the Print button. Strange, but does the trick. Here is what the data file looks like when I did it:
348  293
350  443
350  593
351  743
352  893
353  1044
352  1193
352  1343
351  1493
351  1643
350  1793
348  1943
346  2095
344  2245
343  2396
340  2545
1736  285
1736  434
1736  583
1736  732
1737  881
1738  1031
1739  1180
1741  1330
1743  1479
1744  1630
1746  1780
1747  1930
1749  2080
1750  2229
1752  2379
1754  2526
383  1241
531  1237
537  304
388  303
624  2484
779  2485
773  287
620  288
861  2519
1014  2520
1006  280
856  278
1103  2573
1255  2575
1255  286
1102  285
1301  554
1457  553
1455  286
1300  290
1300  2353
1456  2354
1460  605
1307  602
1536  2402
1692  2402
1675  288
1523  287
Now use my little python script to create an xpd file that processCore needs:
  ./xpd_from_g3data.py 2-g3data.dat 2p.xpd
After adding ls -l, md5, and identify comments to the end, here is what 2p.xpd looks like:
#XCore-v1.0 -*- shell-script -*-
# Core Description File - coordinates in the image.
# Kurt Schwehr
# ./xpd_from_g3data.py
# File format:
#   SecNum llx lly lrx lry urx ury ulx uly
#   MISSING SecNum LengthCM



###################################################################### SECTIONS # Always missing section 0. No such thing MISSING 0 -1 1 383 1241 531 1237 537 304 388 303 2 624 2484 779 2485 773 287 620 288 3 861 2519 1014 2520 1006 280 856 278 4 1103 2573 1255 2575 1255 286 1102 285 5 1301 554 1457 553 1455 286 1300 290 6 1300 2353 1456 2354 1460 605 1307 602 7 1536 2402 1692 2402 1675 288 1523 287 END SECTIONS

###################################################################### LEFT SCALE 0 348 293 10 350 443 20 350 593 30 351 743 40 352 893 50 353 1044 60 352 1193 70 352 1343 80 351 1493 90 351 1643 100 350 1793 110 348 1943 120 346 2095 130 344 2245 140 343 2396 150 340 2545 END LEFT SCALE

###################################################################### RIGHT SCALE 0 1736 285 10 1736 434 20 1736 583 30 1736 732 40 1737 881 50 1738 1031 60 1739 1180 70 1741 1330 80 1743 1479 90 1744 1630 100 1746 1780 110 1747 1930 120 1749 2080 130 1750 2229 140 1752 2379 150 1754 2526 END RIGHT SCALE

# ls-l: 1139788 Feb 10 2003 02pcArchivesBW.jpg # MD5 (02pcArchivesBW.jpg) = 3e3f174b175c6443d7409ed05d7ba8eb # identify: 02pcArchivesBW.jpg JPEG 1935x2874 PseudoClass 256c 1.1mb 0.430u 0:01 # wget http://schwehr.org/TTN136B/Data/CorePhotos/02pcArchivesBW.jpg
Use the makefile to fire off processCore:
  make 2p-gray-total.png


processCore 2p.pgm 2p.xpd 2p-gray P5 255 Found Missing: MISSING 0 -1 cm/pix l,r: 0.066607 0.0669322

PROCESSING ---------- Doing Section 0 Doing Section 1 Doing Section 2 Doing Section 3 Doing Section 4 Doing Section 5 Doing Section 6 Doing Section 7 ToAveFile: pixelsPerCMLeft = 0.066607 Length of core in pixels: 11793 Length of core in cm: 785.497 numSections: 8 convert 2p-gray-total.pgm 2p-gray-total.png open -a /Applications/Adobe\ Photoshop\ CS/Adobe\ Photoshop\ CS.app 2p-gray-total.png
That last line should open the new png image in Photoshop for you to look at.

For completeness, here is the python script that takes the clicks and converts them into an xpd file. Not the most exciting program, nor is the documentation any good, but python makes this easy to do!
#!/usr/bin/env python


""" Take all the points from g3data clicking on the left ruler, right ruler, and sections to produce an xpd file.

This is for TTN136B Nov 6-11th 2001.

$Id: xpd_from_g3data.py,v 1.2 2005/04/27 23:40:40 schwehr Exp $

Copyright (C) 2005 Kurt Schwehr. GPL "
""

__author__ = "Kurt Schwehr"

import sys

def readRuler(file): ruler=[] count = 0 for line in file: if '#' == line[0]: continue # skip comments x,y = line.split() x = int(float(x)) y = int(float(y)) ruler.append((count,x,y)) count += 10 if count > 150: break # All done return ruler

def readSections(file): """ Does not handle missing sections """ sections=[] secCount=1 # Never have a section 0... how very non-cs like pointCount=0 # which point for the current section points=[] for line in file: if '#' == line[0]: continue # skip comments x,y= line.split() x = int(float(x)) y = int(float(y)) points.append((x,y)) pointCount += 1 if pointCount==4: # Add the end of one section, so save it sections.append((secCount,points)) secCount += 1 pointCount=0 points=[] if 0!=len(points): print "ERROR: expecting an even multiple of 4 for sections" print len(points) print sections print points sys.exit("I give up") return sections

def writeSections(file,sections): out.write("\n######################################################################\n") out.write("SECTIONS\n") out.write("# Always missing section 0. No such thing\n") out.write("MISSING 0 -1\n") for sec in sections: print "SEC = ",sec out.write(str(sec[0])) for point in sec[1]: out.write(" "+str(point[0])+" "+str(point[1])) out.write("\n") out.write("END SECTIONS\n")

def writeScale(file,scaleStr,scale): out.write("\n######################################################################\n") out.write(scaleStr+" SCALE\n") for items in scale: print items out.write(str(items[0])+" "+str(items[1])+" "+str(items[2])+"\n") out.write("END "+scaleStr+" SCALE\n")

if __name__ == "__main__": file = open(sys.argv[1]) left = readRuler(file) right = readRuler(file) print len(left),left,"\n\n" print len(right),right assert(16==len(left)) assert(16==len(right))

sections = readSections(file) print "\nsections",sections,"\n\n"

out = open(sys.argv[2],"w") out.write("#XCore-v1.0 -*- shell-script -*-\n") out.write("# Core Description File - coordinates in the image.\n") out.write("# " +__author__+ "\n") out.write("# " +__file__+"\n") out.write("# File format:\n") out.write("# SecNum llx lly lrx lry urx ury ulx uly\n") out.write("# MISSING SecNum LengthCM\n") out.write("\n")

writeSections(out,sections) writeScale(out,"LEFT",left) writeScale(out,"RIGHT",right)

Posted by Kurt | Permalink

04.27.2005 13:52

The Planets class at UCSD

I went to my 2nd planets class the year to see how it is going and hear about Venus. The class is looking great. Catherine and Bridget are doing a fantastic job. I really wanted to see the Interactive Technologies remotes work and I got my wish. They seemed to work really well. This is a class I would have killed for as an undergrad.

How well do you know python part 5. Took me a minute, but wow. That could really frustrate a programmer with mysterous hangs.

More twisted stuff for when I get time

Weird perched rock on Mars.

NASA goes to sf.net. Now how about putting Viz and the Stereopipeline there? Java PathFinder - press release
  Java Pathfinder was used to detect inconsistencies in the executive
  software for the K9 Rover at NASA Ames," Korsmeyer said. The K9
  rover is a six-wheeled, solar-powered rover developed jointly at
  NASA Ames and NASA's Jet Propulsion Laboratory (JPL), Pasadena,
  Calif.
Eek. Java on K9? I like that better than lisp.

Posted by Kurt | Permalink

04.27.2005 09:56

Fink for OSX 10.4

I am just now seeing the 10.4-transitional fink tree comming down through CVS. I will be avoiding 10.4 until after AGU. So it will be late June that I try this stuff out and I need to find a machine that I can mess with that is not my laptop or server.

Posted by Kurt | Permalink

04.27.2005 07:31

Gulf of Mexico low oxygen zone

'Dead Zone' Area In Gulf Could Be Increasing, Researchers Say

A tutorial for Quixote which is a python Web application framework.

Posted by Kurt | Permalink

04.26.2005 15:02

Dr. Bonnie Becker

I went to Bonnie Becker's thesis defense this morning. She did a great job. As a non-biologist, I felt like I understood the issues and techniques of tracking the southern California muscle population. That is really neat that you can track the source of the juvenile planktonic form by the trace elements in the juvenile shell embedded in the base of the adult shell.

Leonardo is another python based weblog/wiki type thing. I saw this back when looking for something to suggest to Lisa.

Unix trick of the day: GNU grep has a recursive option that I did not know about.
       -r, --recursive
              Read all files under each directory, recursively; this is equiv-
              alent to the -d recurse option.
peterbe has a little python script to help with grep by nicely showing the context. Or you can just do grep -Hn -A4. Not as pretty, but similiar results. Probably want a slightly different option than -A, but that is the one I remember off the top of my head.

Sparkplotting - small graphs designed to be inlined with text. Kinda cool examples.

Toggling Safari's inline handling of PDFs...
  defaults write com.apple.Safari WebKitOmitPDFSupport -bool YES
  defaults write com.apple.Safari WebKitOmitPDFSupport -bool NO
I don't seem to have this key on my account...
  defaults read com.apple.Safari WebKitOmitPDFSupport -bool
  The domain/default pair of (com.apple.Safari, WebKitOmitPDFSupport) does not exist
Remove certain entries from the Apple menu

Ted Blackman's company: Common Point

Posted by Kurt | Permalink

04.26.2005 08:51

Qilex - A simulator of robots

Qilex is a robot simulator that is built on Coin.

Posted by Kurt | Permalink

04.25.2005 21:33

misc links

San Diego's Mayor Dick Murphy resigned today. He will be out mid July.

New linksys BIOS for WRT54G

Integrating Twisted reactor with IPython - I should really learn twisted and ipython sometime in the future.

A Brief Look at ModPython - use mod_python instead of mod_perl.

Adding switch to python

Open Robotics Peripheral Platform - ORPP

Posted by Kurt | Permalink

04.25.2005 06:41

ivtools (not the ps/xfig drawing prog)

Peciva (fiv dot vutbr dot cz) has done a port of Open Inventor Tools. I don't have the time right now to look through it, but it would be great to have the old SGI tools working again.

vAddVP, ivcat, ivfix, ivinfo, ivnorm, ivperf, ivview, longToInt32, ivvrml

Posted by Kurt | Permalink

04.24.2005 20:04

Interesting articles in Geology

Hopefully these links work!

Here are a couple interesting articles (to me at least) from the latest Geology:
  • Kent et al - 60 k.y. record of extension across the western boundary of the Basin and Range province: Estimate of slip rates from offset shoreline terraces and a catastrophic slide beneath Lake Tahoe. Driscol and Mayer are also on this one.
  • Parnel et al - Thermal alteration of organic matter in an impact crater and the duration of postimpact heating. Pascal Lee is on this one.
  • Levi et alPaleomagnetism-based limits on earthquake magnitudes in northwestern metropolitan Los Angeles, California, USA
Marine Geology:
  • Novosel Reduced magnetization produced by increased methane flux at a gas hydrate vent
EPSL
  • Yu and Gee - Spinel in Martian meteorite SaU 008: implications for Martian magnetism

Posted by Kurt | Permalink

04.24.2005 19:09


Posted by Kurt | Permalink

04.24.2005 15:14

xcore.py pydoc

I just uploaded the pydoc files for the pythonic xcore code. I have the BPSIO-04 data working with this new python module.

Posted by Kurt | Permalink

04.24.2005 10:34

Inheritance in python, Space Shuttle flash website

My general idea now is to put all the OpenInventor ASCII basics into the GenIV class. Then for each application domain, authors can subclass GenIV and provide additional high level constructs. For me right now, I am creating the GenXCore subclass for sediment cores. I will then have things for marking regions in the core, making texturemapped rectangles for core photos, etc. If someone wants to do some other domain, say ships, houses, multibeam terrains, etc., then that would be great!

Here is the code for just the bare minimum system. I have not done inheritance/subclassing design before in python. It is way simpler than with C++. The only thing I am missing is the destructor. I do not use that often in C++, it can occasionally pay off big. In C++ the main (and unexciting) use for destructors is deleting new'ed data structures, but in python, the garbage collector (gc) or some similiar type mechanism is taking care of memory for us.

This is pretty long, but I think it makes a nice simple use of inheritance to add and isolate functionality. It might bite me in the long run, but I like it so far.
#!/usr/bin/env python
"""
CORE Utilities for generating OpenInventor ASCII files
Copyright (C) 2005  Kurt Schwehr.  GPL Version 2
"""


import os # os.remove() import sys # sys.exit() import string import platform # system information like mac_ver() import datetime # for date.today()

red = [1,0,0]

class GenIV: """ Class that handles generating OpenInventor 2.1/Coin ASCII geometry files. The class tracks indenation for you and provides helpers for both low level and high level constructs.

Most methods for this class emit IV geometry into the open file handle. "
"" def __init__(self,filename="tmp.iv"): self.ivFile = open(filename,"w") self.indentChar=' ' # Could also set this to '\t' self.indentLevel=0

def header(self): """ Write an OpenInventor header """ self.write("#Inventor V2.1 ascii\n") self.write("# Date: "+str(datetime.date.today())) self.write("# PWD: "+os.getcwd()) self.write("# os: "+str(os.uname()[0])) self.write("# osver: "+str(os.uname()[2])) self.write("# OSX ver: "+platform.mac_ver()[0]) self.write("")

def indent(self,numlevels=1): self.indentLevel += numlevels

def unindent(self,numlevels=1): self.indentLevel -= numlevels if numlevels < 0: numlevels = 0

def write(self,string="\n",newline=True): """ Write a string to the open IV file. Appends a newline unless you tell it not to do that. Handles indenting in the process. """ pad="" for i in range(self.indentLevel): pad += self.indentChar self.ivFile.write(pad) if newline: outString = string + "\n" else: outString = string self.ivFile.write(outString)

def comment(self,string="#"): self.write("# "+string)

def beginSeparator(self,comment=None): """Begin a separator block and increase indentation""" if comment: self.write("Separator { ",newline=False) self.comment(comment) else: self.write("Separator {") self.indent()

def endSeparator(self,comment=None): """End the last separator and unindent""" self.unindent() if comment: self.write("} ",newline=False) self.comment("End Separator: "+comment) else: self.write("} # End Separator")



def baseColor(self, color): """ Write a basecolor node color - [r,g,b] list or tuple - red, green, blue must be in the range of [0..1] """ s=" " r=0; g=1; b=2 self.write("BaseColor {rgb ["+str(color[r])+s+str(color[g])+s+str(color[b])+"]}")

###################################################################### class GenXCore(GenIV): """Create XCore Open Inventor ascii geometry files""" def __init__(self,filename="tmp.iv"): GenIV.__init__(self,filename) self.header() def markRegions(self,layerList,width=10, color=red): """ layerlist - list of range tuples to be marked e.g. [(74,76),(82,84),(104,105), (120,120.5) ] """ self.beginSeparator("markRegions") self.baseColor(color) for layer in layerList: top = str(layer[0]); bot = str(layer[1]) self.write("Coordinate3 { point [ -"+str(width/2)+" 0 -"+str(top)+", "+str(width/2)+" 0.0 -"+str(top)+",") self.write(" -"+str(width/2)+" 0 -"+str(bot)+", "+str(width/2)+" 0.0 -"+str(bot)+" ] }") self.write("") self.write("IndexedFaceSet { coordIndex [ 2, 1, 0, -1, 2, 3, 1, -1 ]}") self.endSeparator("markRegions")

###################################################################### if __name__ == '__main__': iv1 = GenIV("1.iv") iv1.header() iv1.indent() iv1.comment("indent1") iv1.indent() iv1.comment("indent2") iv1.unindent(2) iv1.comment("hello") iv1.beginSeparator() iv1.comment("in sep") iv1.endSeparator()

xc1 = GenXCore("3.iv") xc1.markRegions([(1,10),(150,200)])
NASA has gone cheese ball. Flash web site: NASA's Return to Flight. How about designing something new that has some potential and is not so darn expensive. Maybe aiming for simple and redundant would be better? This looks like NASA is too hard to try to look "cool." The space shuttles and space station are amazing accomplishments, but they are a big drag on space exploration. Then again, it is clear that space is not a US priority since we just hit $300 billion for invading Afghanistan and Iraq and killed 1500 soldiers so far since 2001. In the same time, NASA spent something like $60 billion and lost 7 people.

Posted by Kurt | Permalink

04.24.2005 07:20

Amaretto

Amaretto is one of those things that I have seen and used quite a few times, bu t I never stopped to think about what is it until waiting in line of the Little Italy pizza place behind the deli/grocery store. So I asked Google: define:Amaretto
  • A liqueur with a distinct flavor of almonds, though it's often made with apricot pit kernels.
  • A liqueur with the flavor of almonds (although it is often made from the kernels of apricot pits).

Posted by Kurt | Permalink

04.23.2005 19:37

NASA Shuttle, OSX menu bar items

From the Mom news wire: From bad to worse? NASA in culture conflict since Columbia:
  • "Everything is about return to flight and nothing is about return to right ... return to the right culture," says Dr. Jon Clark, a NASA neurologist who lost his astronaut-wife aboard Columbia.
  • "NASA is making solid progress," notes the behavioral science company hired to improve the space agency's culture.
  • "We haven't really changed the way we're doing business and making decisions, so we're headed down the same road we've been on," says former space shuttle commander James Wetherbee, who quit NASA out of frustration in January.
  • "We've made great strides. Now, it is one of those things that you never reach perfection and you've got to continue to work on every day," says deputy shuttle program manager Wayne Hale, who perhaps more than anybody at NASA has confronted its long-lived, deep-rooted culture.
And for something more fun than continued troubles at NASA: super OS X menubar items

www.command-tab.com seems like an interesting blog for Mac OSX (and Xbox if I had one and had time to play with it).

Posted by Kurt | Permalink

04.23.2005 08:32

python xcore

Yesterday I used the first python version of xcore to show data to Neal. It works ok, but is pretty rough. The goal was to pound out the code as quickly as possible. The biggest annoyances were lots calls to open/close and handling indenting. I spent about half an hour reworking things into a class that hid those issues and I think this will pay off very quickly.

I had hoped to be able to do something like Schmidt did with grabbing semaphores in a scope. He had it so that in ACE/Tao, to grab a lock, you created a GrabLock instance and passed the lock handle. Then when you left that scope, the GrabLock destructor would free the lock. I was a great idea for OpenInventor group objects like switches, group, and separator nodes. In C++ that would go something like this:
	lots of code
	...
	{
	  AddSeparator sep(ivfile)
	  add lots of stuff to ivfile
	} // Here sep gets destroyed and the destructor closes the sep
Alas, python is not conducive to lots of random scoping, so this is not so useful. Here is my GenIV class so far. It only makes headers and comments so far. But you can see that it is easy to tweak the indent character(s).
#!/usr/bin/env python
"""
Utilities for generating OpenInventor ASCII files
$Id: xcore.py,v 1.6 2005/04/23 14:58:23 schwehr Exp schwehr $
COPYRIGHT:  Copyright (C) 2005  Kurt Schwehr.  GPL Version 2
"""


import os # os.remove() import sys # sys.exit() import platform # system information like mac_ver() import datetime # for date.today()

red = [1,0,0] green = [0,1,0] blue = [0,0,1]

__author__ = "Kurt Schwehr" __revision__ = "$Id: xcore.py,v 1.6 2005/04/23 14:58:23 schwehr Exp schwehr $"

class GenIV: """ Class that handles generating OpenInventor 2.1/Coin ASCII geometry files. The class tracks indenation for you and provides helpers for both low level and high level constructs.

Most methods for this class emit IV geometry into the open file handle. "
"" indentChar=' ' # Could also set this to '\t' indentLevel=0 def __init__(self,filename="tmp.iv"): self.ivFile = open(filename,"w") def header(self): """ Write an OpenInventor header """ self.ivFile.write("#Inventor V2.1 ascii\n\n") self.ivFile.write("# Created by: "+__file__+"\n") self.ivFile.write("# Author: "+__author__+"\n") self.ivFile.write("# Revision: "+__revision__+"\n") self.ivFile.write("# Date: "+str(datetime.date.today())+"\n") self.ivFile.write("# PWD: "+os.getcwd()+"\n") self.ivFile.write("# os: "+str(os.uname()[0])+"\n") self.ivFile.write("# host: "+str(os.uname()[1])+"\n") self.ivFile.write("# osver: "+str(os.uname()[2])+"\n") self.ivFile.write("# kernel: "+str(os.uname()[3])+"\n") self.ivFile.write("# arch: "+str(os.uname()[4])+"\n") self.ivFile.write("# OSX ver: "+platform.mac_ver()[0]+"\n") self.ivFile.write("\n") def indent(self,numlevels=1): self.indentLevel += numlevels def unindent(self,numlevels=1): self.indentLevel -= numlevels if numlevels < 0: numlevels = 0 def write(self,string="\n"): """Write a string to the open IV file""" pad="" for i in range(self.indentLevel): pad += self.indentChar self.ivFile.write(pad) self.ivFile.write(string) def comment(self,string="#"): self.write("# "+string+"\n") ###################################################################### if __name__ == '__main__': iv1 = GenIV("1.iv") iv1.header() iv1.comment("hello") iv1.indent() iv1.comment("indent1") iv1.indent() iv1.comment("indent2") iv1.unindent(2) iv1.comment("hello")
When I run ./xcore.py && cat 1.iv here is what I get:
  #Inventor V2.1 ascii


# Created by: ./tmp.py # Author: Kurt Schwehr # Revision: $Id: xcore.py,v 1.6 2005/04/23 14:58:23 schwehr Exp schwehr $ # Date: 2005-04-23 # PWD: /Users/schwehr/projects/xcore/doc/BPSIO-04/iv-new # os: Darwin # host: CatBoxII # osver: 7.9.0 # kernel: Darwin Kernel Version 7.9.0: Wed Mar 30 20:11:17 PST 2005; root:xnu/xnu-517.12.7.obj~1/RELEASE_PPC # arch: Power Macintosh # OSX ver: 10.3.9

# hello # indent1 # indent2 # hello

Posted by Kurt | Permalink

04.22.2005 18:49

unittest for sqlite database

Just a quick note first. The problem of my laptop randomly loosing power from the charger has gone away. When this happened, it was not the connector to the laptop. I had to unplug it from the wall and then plug it back in. Then it would go back to using wall power. I am not sure when this stopped happing. Probably a couple months ago. Maybe it was 10.3.8?

Here is my very simple unittest that checks my sqlite database. Not much to it so far. It definitely needs more consistency checks. I did find my bug. I had a bad entry in the section number for a core in the section table. It was just one letter to fix, once I knew where it was!
#!/usr/bin/env python


import unittest import ttn136b import sqlite # for DepthLookup

class Ttn136bTests(unittest.TestCase): """ Test the TTN136B sqlite database """ def setUp(self): """ Prep the database and lookup table for the tests in this group""" self.cx = sqlite.connect (ttn136b.dbFileName); self.cu = self.cx.cursor() self.depthLookup = ttn136b.DepthLookup(self.cx) def testSectionOne(self): """ Check the simplest cases for samples that are in the first section """ self.cu.execute("SELECT depth FROM ams WHERE samplename='ttn136b-2ta-s1-003';") self.assertEqual(3,(self.cu.fetchone())['depth']) def testSectionOneDepthLookup(self): """ Check the simplest cases for samples that are in the first section """ self.assertEqual(3,self.depthLookup.lookup("ttn136b-2ta-s1-003"))

if __name__ == '__main__': print "Starting to test the data base" unittest.main()

Posted by Kurt | Permalink

04.22.2005 14:45

debugging python

Doh. I found a couple buglets in my python code today. I figured it is time to write some more test cases into my database handler. Here are some useful notes.

First, I have never tried the python debugger before. pdb is in some ways very like gdb, but embedding commands to the debugger caught me off guard. Once this code drops into the debugger, gdb like commands work.
#!/usr/bin/env python
# epdb1.py -- experiment with the Python debugger, pdb
import pdb
a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
final = a + b + c
print final
Then just type python epdb1.py. Then I use n for next, p for print, l for list, and c for continue.
> /Users/schwehr/Desktop/epdb1.py(6)?()
-> b = "bbb"
(Pdb) n
> /Users/schwehr/Desktop/epdb1.py(7)?()
-> c = "ccc"
(Pdb) print b
bbb
(Pdb) l
  2     # epdb1.py -- experiment with the Python debugger, pdb
  3     import pdb
  4     a = "aaa"
  5     pdb.set_trace()
  6     b = "bbb"
  7  -> c = "ccc"
  8     final = a + b + c
  9     print final
[EOF]
(Pdb) c
aaabbbccc
Pretty easy, but using pdf.set_trace() is a little strange to me. Is there an equivalent in C/C++?

Here is the pdb tutorial where I got this from: Test-Driven Development in Python. There is a follow on More Test-Driven Development in Python

There also looks to be some good info here at the Agile Testing Blog. There is coverage of all sorts of tools including unittest, doctest, pytest, FitNesse, and lots of other stuff that is totally new to me.

What I really want now is to figure out how to connect to the database before all the tests get run. Otherwise every single test will have to connect, create a cursor, do the test, and finally nuke the cursor and the connection.

Found it! setUp and tearDown handle pre and post testing needs. From the python documentation: 5.3.1 Basic example

Posted by Kurt | Permalink

04.22.2005 07:30

TTN136B - sampling 2TA S1 and S2

This week, I sampled the two archive halves of TTN136B-2TA. Here are the photos from sampling.
  2005Apr18-TA-S1
  2005Apr18-TA-S2

Posted by Kurt | Permalink

04.21.2005 17:52

gcc-4.0, xcore goes pythonic

GCC-4.0 was released yesterday. As always, I am sure this is both good and bad. New features and faster code, but it will be a while before OSX/Darwin catch up, I'm sure. I am sure that the Tree-SSA work will make a huge improvement to optimization work. Wish I could say that I helped out... but of I haven't ever had the privilege of sending a bug report or patch in. GCC is very impressive. I wish my compiler class had looked at least a little at GCC instead of doing Module-2, which have not seen before or after taking Ulman's class.

Changes!

Today's project has been getting the BPSIO-2004/Santa Barbara data into OpenInventor. Rewriting xcore in python is going super fast. What took me 2 weeks in 2002, got done in a couple hours today with python. So much easier to parse simple files and not having to worry about STL makes life super easy. Add to that pysqlite and it is development at light speed.

Posted by Kurt | Permalink

04.21.2005 17:48

python doctest

Just yesterday, I noticed python's doctest module and realized what a really excellent idea it is. It is the perfect compliment to pyunit. The idea is that you put examples with answers in your module's doc strings. doctest then goes in, finds these examples, and verifies that they work as advertized. Here is a super small example to get started with that I call dc1.py:
#!/usr/bin/env python


def square(x): """ >>> square(2) 4 """ return x*x

def _test(): import doctest doctest.testmod()

if __name__ == "__main__": _test()
Then run it like this:
  chmod +x dc1.py
  ./dc1.py -v
The -v is for verbose mode. Here is what verbose mode should give you showing that everything is all happy:
  Trying:
      square(2)
  Expecting:
      4
  ok
  2 items had no tests:
      __main__
      __main__._test
  1 items passed all tests:
     1 tests in __main__.square
  1 tests in 3 items.
  1 passed and 0 failed.
  Test passed.
To learn more read on here

Posted by Kurt | Permalink

04.21.2005 10:21

Troubles with Flo the 2G magnetometer

First, a fun tips and tricks article on Safari features

Yesterday afternoon, I walked into the paleomag lab to find Jason, Jeff, and Lisa discussing how to deal with a problem with Flo the 2G magnetometer. Here is the story from when I came in to the situation at about 1:30.

The story up to this point is that Jason did the usual yearly absorbers (is that the right word?) change out for Flo yesterday morning. This is not easy, but it also is not super hard. It is awkward working in behind the old white shelves to get the helium coolant loop lines off. The pumps and absorbers are between the outer wall and the shield room wall through the door that goes nowhere. Before my time, Jeff and Lisa had replaced the flex lines with copper tubing when trying to debug a mysterious problem (I think this was around 96 or 97). The copper tubing is twisted up in a crazy pattern to get it to the right ports. This put a lot of pressure on the connector for Flo's pump which was on the bottom of the rack of three. After Jason did the change out of the adsorber, there was a leak that dumped the pressure from 250 PSI to 40 PSI and may have let air into the cold head that is at the other end of all this. The cold head goes into flow and is a piston that removes heat from inside the dewar vacuum chamber. The problem is that this system gets down to 20 Kelvin, so any air that gets in will bring in water that will freeze solid when it gets that cold, thereby seizing the piston.

The for of us, plus Josh began debugging the system. We used a tank of 99.999% grade helium (they have been using research grade helium for the last couple years for this system) to test the lines and then to blow out what ever was in them with a puffer valve. All of the lines seemed fine, holding their pressure. Then we brought the whole compressor into the main lab room and tested it. It seemed to behave okay with the only problem being the pressure gage on the unit is really dirty and acts sticky. Someone had to sit on the until for the gage to move and match the gage on the manifold.

We when ripped out most of the white shelves to get better access into the system. We tossed the old Bubba compressor that was on the top shelf and put the current Flo compressor on the top instead of the bottom. That should make it easier to work on!

We then flipped the crazy tangle of copper tubing upside down and used the roof rail to suspend it all. We then carefully bent the tubing so that the connectors were not under stress. This was a little scary since we were using our hands and not a pipe bender. But, none of the copper tubing collapsed.

We then hooked the one line of the compressor to the cold head (which one??? This is where it gets confusing!). We blew more helium through the system and out a puffer on the opposite connector of the cold head. We ran the compressor without the return side hooked up (is that right?) with the helium tank supplying the compressor. It made a nasty freight train noise. We shut it off, bled the system and tried again. The nasty noise gradually went away.

Then we hooked the whole thing up to give it a run. We were at a static pressure of 250 on the compressor. When it was turned on, I saw the pressure jump up (dial to the right about 40 degrees) to what I think was 300 PSI (not sure about this) and there was a loud pop from the cold head. I was looking at the compressor gage and not in the room at the time, but I heard the pop. We shut the whole thing off. Total time running was about 10 seconds.

Then I wondered if we had things hooked up backwards. We think it was indeed backwards. The labeling is very confusing and tracing the copper tubes through all the loops is a little crazy. We switched the system and triple checked the lines.

Then we turned it on and got no nasty bang. We could here the motor running in the cold head, but I don't think the piston was moving. It did not have the same set of noises as I remember.

At this point, the helium bleed indicator on the side of the wood cabinet was at 80 (I think?). We left the system running and I went off to measure on the kappabridge.

Hopefully all of the above is accurate. That is all from memory.

Oh, I was finally able to get my new Garbage CD from the post office. It sucks when about 1000 people all have their mail stolen from their apartment mailboxes all at the same time. The postal people get really cranky and obstinate. I am just about to put the CD on and see what I think.

Emacs question... M-# is calc? What is that?

Posted by Kurt | Permalink

04.21.2005 08:54

python metaclasses, iblog, ynp bacteria, matplotlib

Lisa mentioned the idea iBlog for blogging since MovableType seems like it really sucks. I'll be sticking with nanoblogger, but if you don't mind laying out $20, iBlog looks pretty slick. This is the first time that I have seen costs for software that were listed in US Dollars and Indian Rupees.

I though geourl.org would be cooler. Turns out you have to tell their server where your site is.

Neat story on osnews that I should read when I get more time (when is that?): A Brief Tutorial on Reverse Engineering OS X. This is an article by a guy who created Desktop Manager, so he has to figure out how the API works and changes for talking to the Aqua CoreGraphics framework.

There was an new bacteria discovered in Norris Geyser basin in the last 2 years: Extreme life discovery in Yellowstone bodes well for astrobiologists

I should also read this blog entry on Python metaclasses more carefully. I have never really noticed stuff on metaclasses before. Being able to control how classes evaluate (not just instances) could be handy.

An interesing article on matplotlib. Looks like it can do some stuff that pygnuplot has trouble with (especially pie charts).

Posted by Kurt | Permalink

04.20.2005 09:26

AppleJack - mac repair tool

This article talks about AppleJack, which might be a good utility to fix an unhappy mac.

Another NASA story. Ths one about the Demonstration of Autonomous Rendezvous Technology (DART) spacecraft: On Orbit Anomaly Ends DART Mission Early

Antarctic news: B15A ran into the Drygalski Ice Tongue

Posted by Kurt | Permalink

04.19.2005 09:28

Possible cracked machine running 10.3.9

It is possible that one of our computers around here was cracked (thankfully not one of mine). I didn't find out about this until it was shipped off to the bookstore to be fixed so I was not able to do a tripwire md5 sum type analysis, nmap port scan, and a process table dump. Here are the symptoms that I heard about:
   Stopped web serving
   Able to ping but not log in remotely
   When you log in locally, it would give the background image and
     that was it.
I don't know if it would have been possible to get in via single user mode, but that is what I would have tried. This could be either a hack or possibly just some file corruption. Not enough info to know which. One suspect is that this machine was running MovableType which seems like a pretty buggy and rough program. It ends up adding a lot of CGI programs and that may be how someone got in. If it was a hack, then whoever did it was pretty clumsy to mess up a machine that way. Maybe a botched rootkit attempt?

Posted by Kurt | Permalink

04.18.2005 13:39

Python doc trick

I need to try out this decorator trick to making args appear in the __doc__ string with python:
  Decorator for automatic inclusion of function definition in __doc__
I really need to figure out a better solution of python documentation. pydoc does not handle arguments and returns as nicely as doxygen.

Posted by Kurt | Permalink

04.18.2005 08:22

Safari Blog

Dave Hayatt is a developer on the Safari team. You might want to check out his weblog for insite into Safari development.

I hear that the SUID and SGID bits for scripts in OSX 10.3.9 have been disabled. Compiled programs with these bits still work, so never fear... sudo still works. Are there any critical scripts for osx that need these bits? I don't know of any right now.

Posted by Kurt | Permalink

04.17.2005 14:30

10.3.9 wireless and Apollo 13

Anyone else having wireless troubles with 10.3.9? Every couple hours today I loose the ability to see my basestation or any of my neighbors. A reboot solves this, but that is NOT fun. The syslog does not say much:
Apr 17 14:08:22 localhost kernel: AirPort:  Link DOWN 
Apr 17 14:08:22 localhost configd[89]: AppleTalk shutdown
Apr 17 14:08:22 localhost configd[89]: AppleTalk shutdown complete
Apr 17 14:08:26 localhost configd[89]: posting notification com.apple.system.config.network_change
Apr 17 14:08:26 localhost mach_init[2]: Server 0 in bootstrap d03 uid 0: "/usr/sbin/lookupd": exited as a result of signal 1 [pid 490]
Apr 17 14:09:57 localhost kernel: AirPort:  Link DOWN (out-of-range)


A nice link from slashdot about the Apollo 13 troubles in IEEE Spectrum: Apollo 13, We Have a Solution by Stephen Cass.
  Rather than hurried improvisation, saving the crew of Apollo 13 took
  years of preparation.

Posted by Kurt | Permalink

04.15.2005 18:54

OSX 10.3.9

Right now I am downloading 10.3.9. One thing about Apple that I don't like is that it is hard to get a good quality changelog for these things. I know they do not want to overload the average user with details, but how about a link for us developer folks? I'd like to know about things like changes in apache, bind, python, gcc, etc.

Also of interest is the impending release of gcc 4.0. GCC 4.0 RC1 Available

Here is a funny quote from winsupersite:

  Contrary to Apple's hyperbolic claims of "200 new features," Mac OS
  X 10.4 Tiger includes, in my opinion, only two major new features,
  Spotlight and Dashboard, and both were clearly influenced by other
  existing products and services. In this section, we'll examine both
  of these major new features.


Ummm... adding 64 bit to an OS is not the equivalent to a service pack. Wait! Is it 2005 or 2006? I remember when we got a row of Dec Aphla's in Sweet Hall at Stanford in about 1994/5 (I can't remember exactly when). Those machines were 64bit... althrough they did spend all day swapping even when no one was logged in. Still, I can't believe it has taken consumer OSes 10 years to catch up to Linux and Ultix from the middle of last decade.

Oh drat. It looks like I have to buy a new version of quicktime pro for Tiger. And it sounds like no iMovie, iPhoto, iTunes... you have to be kidding!
  Contrary to a popular misconception, Mac OS X 10.4 "Tiger" does not
  include Apple's vaunted iLife '05 applications--iMovie, iPhoto,
  iDVD, iTunes, and Garage Band--nor does it include the iWork '05
  productivity applications, which include Pages (a weird word
  processing/page publishing hybrid) and Keynote (a presentation
  package). Tiger also does not include the AppleWorks productivity
  suite, an aging set of applications that is somewhat similar to
  Microsoft Works. You do get most of these applications--but not the
  iWork suite--when you purchase a new Macintosh, however.

Posted by Kurt | Permalink

04.15.2005 03:54

IODP MOHO Attempt

I did not realize Donna Blackman is a Co-I on the MOHO IODP leg:

Scientists Aboard Drilling Vessel Recover Rocks From Earth's Crust Far Below Seafloor

Posted by Kurt | Permalink

04.14.2005 14:50

Pivy

Arg. Another cool sounding project that I would like to try out and maybe add to fink. pivy is a python binding for Coin. Back at NASA Ames, Laurent and I really wanted to do this, but we ended up with Viz instead.

Posted by Kurt | Permalink

04.14.2005 09:31

Directory of Open Access Journals

Check out the Directory of Open Access Journals. There are a lot of journals that I never heard of, but there are some useful ones in there.

Posted by Kurt | Permalink

04.13.2005 20:56

MS Remote Desktop Connection for Mac

Microsoft has a Remote Desctop Connection Client for Mac. Not that I have any PC's that I would want to connect to, but it's there if I should need it.

There is a new version of Coin 2.4.0 out.

Posted by Kurt | Permalink

04.13.2005 16:13

netsaint is nagios

I always forget the new name for NetSaint: Nagios. This is a great tool for monitoring systems. Here is an ONLamp article on monitoring a raid array. I really wish we had this for our SGI raid arrays. I guess that is what we get for using proprietary systems. Too bad Nagios is not in fink. Alex had this setup at etool and is was fantastic. The UCSD Chemistry folks us it too.

Posted by Kurt | Permalink

04.13.2005 10:12

Processing xray photos continued

Now that I am back from being out sick, here is the continuation of processing xray photos. This is a quick run through of assembling the photos and adjusting them so you can actually see some details. This assumes that you are comfortable with working with Photoshop CS layers.

The first step is to use the plastic pegs to line up the xray plates. Each plate is a layer. Use the ruler tool (under the eye dropper) to measure out the 10cm distance between two pegs. Drag the ruler down to the bottom peg of a section. Then pull a guide down from the ruler to mark where the next peg will be. Then select the layer for the plate below the current plate. Use the "Move Tool" to drag the lower plate into place. This process will look something like this screenshot:



Once you have placed all the plate sections into place, you will have what looks like a continuous core. Use the core liner sides to match up the left-right position. Now zoom all the way out so you can see the while core. Then select just the vertical extent actually used by your core image with the Retangular Marquee Tool and use Image->Crop function to reduce the size of the image. A large image will use more memory and go slower, so you want the smallest possible, but make sure to leave space on the left for scratch space that will be used later. Here is a image of cropping to the core's extent.



Next, we want the whole core image in one layer. This will delete unused overlay area and save more memory. In the layer pallet (F7), left click the arrow in the top right of the pane. Then select "Flatten Image"



Now give yourself a working layer of this image. You will keep one behind as a backup/original and one in front that gets your level adjustments. In the layer panel, drag the background down to the new layer icon (looks like a turning page) and drop the layer on this icon to copy the layer.



Now you get to actually start looking at the imagry in a way that you can see core features. Core each block of the core, select the region inside of the pegs and do an "Auto Levels". If you leave out the pegs, this usually does a good job of giving a quick look.



Here are the results I get from the auto leveling of a plate.



You can see that this does not give the best results for the whole area. It is often useful to level just a small area by hand. Select a region on that background/backup layer with the Rectangular Marquee Tool. Copy it (Apple-C) and then paste it into a new layer (Apple-V). Drag this layer up the layer panel to the top. Then use the Move Tool to place the image directly to the left of it's position. Now select the inside of this region with the Marquee Tool and use Image->Adjustments->Levels to tweak it by hand.



You should now see the Levels pane with a histogram of the pixel values.



Grab the outer two dark sliders right below the histogram and pull them in to the main part of the histogram. Also make sure that the Preview checkbox is activated. Then try moving the gray center slider to the right to see if you can see more in the preview. Your preview should look something like this.



When you select OK, Photoshop will rerender your adjust region in full display resolution and you will see more. So try this a few times if the preview does not look so hot. The final may be much better.

The above is what I do before going through and describing the xradiogram of the core in my note file. I then greate notes something like this:
  1ga-s2-069 xray ; Contact/boundary
  1ga-s2-108 xray ; Contact/boundary
  1ga-s2-113 xray ; Laminations from here down
  1ga-s2-122 xray ; Center of a less dense zone


1gw-s2-000 photo ; Begin deformation from endcap 1gw-s2-004 photo ; End deformation from endcap 1gw-s2-014 photo ; Faint transition to a smoother surface 1gw-s2-023 photo ; Very faint contact

Posted by Kurt | Permalink

04.13.2005 08:05

MusicPublisher

When you want to listen to something like a lecture series once and probably never again, you probably don't want to add it to iTunes. I have all sorts of things like this lurking around in my iTunes library and they make party shuffle very annoying. MusicPublisher looks like a nice solution. It publishes a folder via the DAAP protocol. I have not tried this, but it looks good. Plus the other has written a number of other interesting Mac OSX apps like SSH Tunnel manager.

Info on tweaking the Wifi list of routers... not tested! And I could not find any of my normal access points that I use.
  If you check out com.apple.airport.plist in your user's
  Library/Preferences folder, you can see which AirPorts you are
  selected to automatically associate with, and add and remove them as
  necessary.
  ...
  others are stored in:


/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist

They are stored in a hard-to-access serialized format, so you can use this software to open that file and modify it.

binary: http://gizmolabs.org/~andrew/WifiEraser.zip src: http://gizmolabs.org/~andrew/WifiEraser-src.zip

probably best to save a backup of that file just in case.
Today the RIAA is supposed to sue a whole bunch of UCSD people. Anyone know who is getting nailed? I don't fileshare, but it is always scary that they might target the wrong people by accident. How do they prove that person X was really who was filesharing? What if someone was sharing through an open access point? It is not illegial to have an open access point, right?

Posted by Kurt | Permalink

04.06.2005 11:09

Nomad is still going

Wow. I did not realize that the CMU Nomad is still going. I am sure that it must be rather different than when I worked on in 1997.
Researchers Deploy Robot On Frozen Lake In Preparation For Antarctic Expedition

Posted by Kurt | Permalink

04.05.2005 14:25

Photoshopping a digital xray

Here are some quick notes about processing the digital xrays to bring out the features. The auto levels and auto contrast work a bit, but it is better to use the levels feature as you have a bit more control. What you really want is to use
    Image->Adjustments->Levels
This will present a histogram of your 16 bit grayscale image. There are usually large dead zones on the left and right, so pull the out sliders into those edges to get a better look. Most of my xrays are two humped camels. The hump on the left is the frame background, so drag the outer sliders to just the large right hump and your xray should start showing a lot more in the way of features. Then try dragging all three around a bit to see what give you the best results.

Posted by Kurt | Permalink

04.03.2005 19:44

Get your flu shot

I can now give testimony to getting your flu shot. This flu sucks. I got to spend 6 hours in the ER with this one and got my first IV. Not much fun.

So go get your flu shot if you haven't already.

Posted by Kurt | Permalink

04.01.2005 09:56

BeautifulSoup

BeautifulSoup sounds like a very handy python tool to do html screen scraping type stuff. Too bad it is not in fink.

Posted by Kurt | Permalink