A Database By Any Other Name…

I’ve created a LuaJIT ffi interface to SQLite.

A couple years back I played around with SQLite as a quick and dirty database.  In that particular case, I was actually translating data from large formats of data (gigabytes), and putting them into a form that was more relational, and easy to deal with.

Now I have need for a quick and dirty database that is capable of dealing with SQL Commands, in-memory.  So, I looked at SQLite again.  The advantages are that it’s ubiquitous, available on every platform known to man.  If push comes to shove, it can be recompiled, fairly easily, because there is a nice ‘amalgamation’ file, which is all the source for the thing in a single ANSI C file.

At any rate, this is not the only Lua interface to SQLite.  In fact, there have probably been about 10 of them over the past few years.  Each of them has its benefits and weaknesses.  So, why not create another one?  There is this one for sqlite3 and ffi:  lsqlite3-ffi

lsqlite3-ffi is one of the few Lua interfaces to sqlite3 which is specifically for LuaJIT.  It presents a good model for interacting with the database.

I take a slightly different approach to things, but not dramatically different.

The way I went about it was to look at the operations I perform, and think about how I wanted to type them with the least amount of keystrokes.  Here is the sequence of events needed to: Create a in-memory database, create a table, insert some values, select all those values, using an interator in a for loop:

-- Establish a database connection to an in memory database
local dbconn,err = sqlite3_conn.Open(":memory:");

-- Create a table in the 'main' database
local tbl, rc, errormsg = dbconn:CreateTable("People", "First, Middle, Last");

-- A simple function to report errors
-- This will hault the program if there
-- is an error
-- Use this when you consider an error to
-- be an exception
-- But really, it's just to test things out
function dbcheck(rc, errormsg)
	if rc ~=  SQLITE_OK then
		print("Error Code: ", rc)
		error(errormsg)
	end

	return rc, errormsg
end

-- Insert some rows into the table
dbcheck(tbl:InsertValues("'Bill', 'Albert', 'Gates'"));
dbcheck(tbl:InsertValues("'Larry', 'Devon', 'Ellison'"));
dbcheck(tbl:InsertValues("'Steve', 'Jahangir', 'Jobs'"));
dbcheck(tbl:InsertValues("'Jack', '', 'Sprat'"));
dbcheck(tbl:InsertValues("'Marry', '', 'Lamb'"));
dbcheck(tbl:InsertValues("'Peter', '', 'Piper'"));

-- Using prepared statements, do the same connect again
stmt, rc = dbconn:Prepare("SELECT * from People");

-- A simple utility routine to print out the values of a row
function printRow(row)
  local cols = #row;
  for i,value in ipairs(row) do
    io.write(value);
    if i < cols then
      io.write(',');
    end
  end
  io.write('\n');
end

-- Using the Results() iterator to return individual
-- rows as Lua tables.
for row in stmt:Results() do
    printRow(row);
end

-- Finish off the statement
stmt:Finish();

-- Close the database connection
dbconn:Close();

So, it’s a slightly different flavor from those which have gone before, but not dramatically so. There are a couple of gems in the way the myriad constants for SQLite are defined. You can fairly easily determine if you want them as an enum, const int, whithin a ffi.cdef, or use the default, taking them as Lua number values, which is the easiest to use in my opinion.

Having the power of a relational database in memory, with zero install, and a fairly small footprint, is a useful thing in certain situations. For me, it’s just gotten a little bit easier to deal with.


LJIT2Http_Parser – All the world’s a http stream

It’s no joke that Node.js has taken the world by storm.  Rightfully so.  It makes web programming just that much easier for some reason.  But what about Apache, and IIS, which have dominated this domain for the past decade, and then some?  Well, I guess there’s nothing like the changing technological landscape to change what’s in vogue.

In roughly 2000, Microsoft introduced the CLR, and ASP.net to the world.  One of the biggest claims to fame at the time was that your server pages would be “compiled” if you wrote them in one of the many .net languages.  At the time this was a big deal, and quite a boost/advantage over other forms of web server programming.  Given advances in both processor speed, and language development, this particular advantage has been eroded over time.  At that time, XML was intended to be the one “to rule them all”…

Then along came JavaScript on the server side.  More importantly perhaps, came JSON.  JSON is a data format that is almost a direct representation of javascript objects.  Unlike XML, it’s easily readable, and especially easily parseable if you so happen to be using javascript to do your programming.  Since javascript is now the lingua franca on the client side, it makes sense to exchange data using JSON.  Similarly, since the advent of things like the V8 javascript engine, it makes sense to use javascript on the server side as well.  Given that there’s javascript on both ends of the pipe, it makes sense to have a server side that totally embraces that language, and thus node.js makes a lot of sense.

At the core of node.js, there’s some low level http handling going on.  Oddly enough, this core is written in pure unadulterated C.  One of the key pieces of this core is the http_parser.  This bit of code is responsible for receiving the various requests off the wire, parsing them, and telling your service about headers, body, date/time, and the like.  The nitty gritty of dealing with the http protocol.  As a bonus, it has a nice little URL parser to boot.

Of course I’d want to be able to access the same from Lua, so I created a quick and dirty http_parser binding.  Although most users of node.js seem to be Linux users, I wanted to use it from Windows, so I provided a quick compile of the http_parser, so there’s a .dll as well, that is meant specifically for Windows consumption.

The http parser code is a couple thousand lines of code.  This might be considered ‘huge’ by the standards typically used to measure a lua codebase, but really it’s rather tiny for what it does.  One of the greatest design choices the designers made was to not do any allocations at runtime.  Everything is buffer based.  That is, you hand it a buffer to parser, and you give it pointers to functions to be called when various parsing events occur.  What your callback functions are handed are pointer offsets and lengths into the original buffer.  This works out just fine because any string manipulation code worth its salt these days can deal with a pointer and length just fine.  No need for null terminators and the like.  As such, this is about as lean as http parsing can become, at least in terms of resource allocation.  The core of the routine is a couple of state machines that deal with all the odd funky corner cases that are in the http protocol.

Doing the LuaJIT binding is an interesting exercise in subsumption.  The first stab at it, I just had to make the relevant API calls accessible, and there are only a handful of them.  Taking the next step, three of the functions are simply returning string values for enums.  Well, since I have to replicate those enums on the Lua side, I took it one step further, and represent them in a table form, which makes it easy to lookup values, and print out corresponding names.  Thus, the three functions can be fully supported on the Lua side, and the C code can be ignored.

the http_parser code has a typical pattern, which I like very much.  The core calls take some pointer to a structure, which is maintained by the API itself.

void http_parser_init(http_parser *parser, enum http_parser_type type);

In this case, a pointer to the http_parser structure is being passed around. This is good for the Lua side, because I can easily turn the http_parser structure into a meta type, which allows me to group the various related methods, and program it in a more object oriented way:

local lib = ffi.load("http_parser")


http_parser = nil
http_parser_mt = {
  __index = {
    new = function()
      local parser = ffi.cast("struct http_parser *", ffi.new("char *",ffi.sizeof("struct http_parser")))
      return parser;
    end;

    init = function(self, parser_type)
      -- brief sanity check
      if parser_type  HTTP_BOTH then return end

      lib.http_parser_init(self, parser_type);
    end;

    execute = function(self, settings, data, len)
      return lib.http_parser_execute(self,settings,data,len);
    end;

    pause = function(self, paused)
      lib.http_parser_pause(self, paused);
    end;

    should_keep_alive = function(self)
      return lib.http_should_keep_alive(self);
    end
  };
}
http_parser = ffi.metatype("struct http_parser", http_parser_mt);

With this in hand, typical usage becomes:

parser = http_parser().new()
parser:init(HTTP_REQUEST)

-- create a http_settings object similarly, and set callbacks
-- then...
parser:execute(settings, buf, buflen)

I can go one step further and absorb the settings into the http_parser itself, so that callbacks are registered directly on the parser object, rather than through a separate settings object, at least from the perspective of the programmer.

It’s always a tossup when doing object oriented programming. Are you doing it for the purity of the thing, for maintainability, or because it truly is the appropriate model for the task. In this case, I do it because it simplifies my mental model of what the parser is, and what it does. It just seems natural to me. Of course, in javascript, the node.js code does a similar thing.

There’s another thing going on here though. At 500 lines, the interop code is becoming as big as the original library code. The only part of the library that is not essentially replicated in the interop code is the state machine handling. That’s just two primary routines, one for the URL parsing, and one for the http parsing in general. And what’s so magical about these two routines? Nothing horribly special. They are basically parsers, and as such, they do a lot of examining of characters in fairly involved case/if/then/else statements, with some bit twiddling and logical anding and oring thrown in to boot. Well, ok, LuaJIT should be just as good for that sort of thing as any shouldn’t it be? The bit twiddling can easily be handled using bitops, although things might look a little clunky. The pointer handling can clearly be dealt with, as witnessed by my previous musings on serialization. So, if this bit of code can be rewritten in LuaJIT directly, should it be? Would there be any benefit?

The benefit of having a pure LuaJIT implementation of a high speed http_parser are interesting to contemplate. As it is, LuaJIT makes for an excellent extension mechanism to almost any programming task. As I see it, the benefit of having Lua as an embedded add-on vs JavaScript is obvious. But, to be direct, the Lua runtime is tiny in comparison to any JavaScript engine I’ve encountered. It was designed from the beginning to be embeddable. Having a Lua native http parsing capability, that is easily embeddable into any application just means that given a decent sockets library, any application can easily become a REST driven application, for example. Not just web services, but any application. That means the likes of the Microsoft Calculator could suddenly gain a REST interface. Wouldn’t that be fun?

At any rate, it’s just speculation. Those case statements are daunting, suggesting a nightmare of deeply nested if/then/else statements. Or could it all be easily represented with some LPEG, or simply by clever usage of some tables? Who knows, such thoughts are above my pay grade.


HeadsUp – A new Release

Trundling along, minding my own business, making the world safe for doing some graphics…

I have created a new package called “HeadsUp”.  It is the 2D portion of the BanateCAD package.  Programming within HeadsUp is very similar to programming in the “Processing” environment, but it’s all in Lua instead of Java of course.

You can find the download here: HeadsUp

Within the package, you will find many examples to play with.  HeadsUp is named such because the relation to 3D graphics is that you can create a “Heads Up Display” if you will.  You can easily create static images, or you can create dynamic animations as it has an integral animation clock.  You load a .lua program, click the “Start” menu, and see what happens.

The other day, I went to the grocery store and got the groceries packed in a paper bag.  On the back of the bag was this interesting chart about the growing seasons of various fruits and vegetables.

I looked at that and thought: “How hard would that be to replicate using HeadsUp?”

So, I set out to replicate the graph.  Along the way, I discovered a few things.  I cleaned up some of the text rendering, found a bug in setting the fill color, and made better text alignment.  The basics of line, rectangle, and text rendering are obviously there, as well as the ellipse, and line thickness.  It was also an experiment in data representation.  For the raw data such as the various growing seasons per food item, should I represent it as a CSV file, an XML, JSON?  The easiest, since I am using Lua, was to simply represent it as a Lua table.  That way, there’s no conversion from one type/schema system to another.  Also, I think the lua version of the data is just as easily readable as XML or JSON, so it could easily act as the exchange format as well.

This is all goodness.  The other thing I rediscovered is that laying things out by hand is a real pain.  I did use algorithms to do the layout, but I could go further.  Doing layout in a more declarative way is much simpler.  Of course we know this from decades of UI design, and the growth of HTML.  I have the rudiments of layout, but it’s not used in any serious way as yet.

Another little  bit that got worked on was the mouse interaction.  There is a new mouse event thing, that gets passed around the system.  Nothing special if you’re not programming down at that level, but there nonetheless.

This is an image of the mouse tracking test program.  Basically, you move the mouse around on the screen, and the position is displayed in the center there.  A nice cross-hairs will follow your mouse around, just so you can see it tracking correctly.  That’s a bit nice because under your program’s control, you can simply turn off the system’s cursor, and create your own cursor to be whatever graphic you feel like rendering.

One more thing I discovered when doing this little bit was that the mouse tracking system does not have to be as complex or rigid as I was going to make it.  I have been borrowing some code from a UI framework I did in C#.  What I have typically done in the past is to make a core “Graphics” object, which any graphic would descend from in a class hierarchy.  This graphic object would take care of hierarchy, grouping, mouse tracking, keyboard tracking, transform, style, etc.

Programming in Lua, I find there’s a much simpler way.  For rendering, any ‘object’ simply implements the “Render(graphPort)” method.  The object is handed the graph port, and it does whatever rendering it wants to do.  It does not have to be in any class hierarchy.  If the developer wants hierarchy, they can simply add what they want.

Similarly, for mouse tracking, an object can register itself with the system saying “yes, I participate in mouse and keyboard interactions”.  This is kind of an observer/observed pattern.  Again, you don’t have to subclass, just implement the “MouseActivity()” method.  You’ll be handed the mouse activity object, and you can do whatever you want from there.

Of course, if you want to change the behavior of the system, that’s fairly straightforward.  You have the source code, so you can do what you like.  Or you could inject some functors here and there, and make small compact compatible changes.

I always have the goal of reducing the code size.  Smaller is definitely better.  In this case, I’ve managed to stay within my 256K budget, including code for the examples.  So, it can only get smaller from here.

At any rate, a new toy to play with.


Banate CAD Lurches towards 2011 finish line

It has not been a quiet week in Lake Bellevue…

There is a New Release of Banate CAD, which can be found here: Banate CAD

What we have here, is NOT a failure to communicate, but rather the ability to communicate using multiple mechanisms.

But, those squggly circular lines don’t look anything like what I’d be doing with a 3D CAD program meant for modeling things to be printed…

Well, one of the core tenets of Banate CAD is that hard things are doable, and easy things are easy.  Processing is a programming environment that has gained a tremendous amount of popularity over the years.  In particular, it has made it relatively easy for graphics artists to create amazing display installations which include audio, video, animations, and graphics in general.  It has been able to achieve this because it pulls together all the little bits and pieces necessary to do such things, and presents them in a relatively easy fashion that anyone with a high school education (or not) can understand and utilize.

What does this have to do with 3D printing?  Well, I think the state of tools for 3D modeling are similar to what Processing came into oh so many years ago.  There are quite a lot of capable tools, which experts can utilize to create amazing things.  But, more average designers such as myself, find it extremely hard to get up that learning curve.  I want all that power, but I don’t want to spend the 10,000 hours necessary to gain the expertise.

Also, I want to do animations:

What’s this?  It’s just one of the many animations that are typical in Processing.  A point on a circle makes what kind of motion when tracked over time?  A sine/cosine wave of course!  It’s easy to see.

Now, what if I have a cool idea for a new 3D printer, and I want to visualize the mechanics of the thing actually working?  What package do I need for that?  Well, you can pay thousands of dollars and get an all singing/dancing CAD program, which can probably simulate a fighter jet in a wind tunnel, or you could use Banate CAD.

The current release of Banate CAD has the ability to animate things.  It’s fairly straight forward.  You load up your design, and implement an object that has a “update()” method on it.  That method will get called every clock “Tick()”, and you do whatever it is you want to do in terms up updating your geometry.  Separate, the “Render()” method will be called, and you’ll see nifty animation.

This is a fun thing to do with metaballs, as seeing them interact and undulate in an animation is some great fun.  Kind of like watching those lava lamps of old.  And of course, things that are solids in your scene are printable.

So, there are actually two “Programs” in the package now.

BanateCAD.wlua – The standard 3D Banate CAD program

ProcessingShell.wlua – A Program that feels very similar to the Processing program

As the animation system is a bit finicky, the best way to run things is to actually bring up the Lua development environment (perhaps SciTE), and run from there.  That way you can easily stop a runaway program.

All of the examples that are in the package should work correctly, without breaking things.

There are quite a few other features in this package as well, in various states of repair.  There is in fact CSG support

At the moment, it is challenged.  It only works with a sphere and cylinder, not with all the other shapes in Banate CAD in general.  It will get there though, and be a lot simpler than what’s there now, but, since the code is a live working thing, it’s there, even though it is incomplete.  Wear a seat belt if you try it out.

And so it goes.  Where is it going?  First of all, 3D modeling.  That gives a lot of options for visualizing stuff that is in fact 3D, not just 3D models though.  Then, add the 2D support, like in Processing, and you begin to get a very interesting system.

At some point, a .fab file will contain the information for both the 3D model itself, as well as the interface description so the user can input parameters to the design before printing, if they so choose.  In order to make that a reality, the design files need to be able to put up a UI, that includes classic text, buttons, sliders, and deal with keyboard and mouse events.  That’s how these two things fit together.

In the meanwhile, being able to learn a new system by leveraging books about other similar systems makes for a broad reach.  For example, I picked up a few books on Processing, and just try to go through the examples.  When I come across a feature Banate CAD does not currently support, I just add it, and improve the system overall.

And there you have it.  Another week, another release.

I will be going on holiday in a couple of days, but there will surely be a release to ring in the new year.


Documentation Begins

Although there are numerous examples of how to use things in Banate CAD, I have started to add some documentation to these pages.  It can be found in the site header, or you can go directly to this link: Banate CAD Documentation

At the moment it’s not much more than a list of functions with their parameter names, but that will certainly get fleshed out over time.

This preliminary documentation is of the “Reference Material” variety.  I will begin to add some more of the “User Manual” style over time.


Banate CAD Second Release

There is a new consolidated package available here: Banate CAD 20111128

I wonder if a weekly distribution is a realistic thing to expect?

Banate CAD is maintained “Live” on GitHub, so changes that are going on in the code are reflected in GitHub fairly regularly. But, since it is live, things like the Examples get out of sync regularly as well. I am updating the Examples weekly to match the current state of the software for that week. When I bring the two in sync, I package it up in a convenient .zip and make it available for download.

This past week saw quite a lot of change in Banate CAD. Primarily, after the first release, I have been focused on reducing the amount of code that’s in the package. At the end of the day, I want the codesize to remain within about 256K. If it remains within that budget, then I have something that could possibly be hosted on a microcontroller, or other small compute devices. So far, on disk size is 133K, so I still have some room to add more functions.

One big form of reduction for this past week was further simplification and reuse of the core BiParametric object. It can be used to do anything from produce a sphere, to a Bezier surface. I also introduced the concept of “Sampler”, which is essentially just a function that you can ask “for this parametric position, what’s your value?”.

The MoonShot picture above is the epitomy of using these samplers. I use a sampler for the offsets of vertices, to do height mapping, and I use the same exact sampler to determine the color on a per facet basis. That makes for some very convenient reuse. It also demonstrates how easily samplers can be combined into super samplers.

Another usage of a functor has to do with the Torus object. The base torus on its own will only generate a circular profile. But, you can hand it a functor which will determine the outline of that profile. In this case, I’ve used the SuperEllipse formula to give shape to the profile. In this way, you can pretty much select any cross section profile you like. The core of the Torus routine remains the same, go around a ‘circle’. At some point, even that part will become a functor, and you’ll be able to generate very strange torii indeed.

As Banate CAD is meant to do ‘CAD’, I finally worked on getting the export to .stl function working properly.  Now, most models, if they are solids, can actually be exported.  The cheat at the moment is that they will always export to a file with the name “file.stl”.  There’s no reason for this other than I need to change file handling to be more robust in general, so I didn’t bother to make any attempt to improve it at the moment.  At the moment, although the .stl files will work, they certainly benefit from going through a tool like MeshLab to clean them up and remove bits and pieces, depending on the model.  Mainly removing duplicate vertices, and triangles of zero area, like at the poles of a sphere.

So, there you have it.  One week’s worth of work, and a whole bunch of new functionality.


Introducing BanateCAD

Hum Banate – We Make

Introducing BanateCAD.  I have spent the past year playing with OpenScad, doing 3D modeling, learning how to make interesting things to print on my printer.

Although I’ve been able to do a great many things with OpenScad, I finally came to the point where it made more sense for me to create my own 3D modeling package, rather than living within the constraints of OpenScad.

Banate CAD is the beginning of my effort to create what I will term as a 3D visualization and modeling package.  At the moment, it possesses many of the primitives that I have created in OpenScad over the past year, from cubic surfaces, to blobs.  I’ve thrown in some extras like being able to specify colors using Crayola color names.

There is NO CSG at the moment.  CSG operations will be great, and I will probably add them over time.  I want to implement the CSG operations as native Lua code, not simply bind to an existing library.  In that way, more of the codebase will be transferable to other platforms, without having to worry about porting monsterous libraries that I know nothing about.

Banate CAD is written completely in Lua.  I use the IUP library, and LuaGL.  As long as these two packages are available in your Lua distribution, it should work on your platform.  At the moment, it’s “Windows Only”, simply because I use the LuaForWindows package, and I haven’t tested with anything else.  I do have a Mac, and I’ll try it out there, and work out whatever differences may exist.

In creating Banate CAD, I am hoping to accelerate the advancement of this genre of CAD tools.  It is freely and easily modified/improved by anyone who has some basic Lua coding skills.  There should be a few people from the “World of Warcraft” universe who can apply some skills to making this better.

I do provide some basics, like being able to turn a triangle mesh into an OpenScad polyhedron().  That might make it relatively easy to move between environments.

So, there you have it.  On the one year anniversary of my first upload to Thingiverse, I am putting out a “Thing” that I think might be useful to some people.

 


Dreaming in 3D

What’s this then?  Is that a screen moch up or what?

It was roughly Thanksgiving of last year when I uploaded my first designs to Thingiverse.  Actually it was slightly before that I think.  At any rate, I’ve now spent a year doing design, almost exclusively with OpenScad.  I’ve talked numerous times with people about the greatness and constraints of that particular system.  At one point, my daughter said to me; “Why don’t you just build your own?”

Knowing what I know now, these are the features I’d like to have in my text based CAD program:

  • Ability to read and write multiple file formats (particularly AMF)
  • Using materials and textures during rendering
  • Have built-ins for things like curves and varying swept surfaces
  • Have the full expressive power of a modern scripting language
  • Be embeddable in printing devices
  • Have the ability to easily extend the basic framework of the program
  • Have some advanced features, such as those found in MeshLab, etc
  • Have user definable color schemes

These are just a few of my most favorite things.  Additionally, I’d like to be able to have the thing connect to a number of printers, so that “Print”, just works.

And lest I forget, the most important “feature” of all, my mother has to be able to use it!  What?  She’s not a programmer, nor a designer!!  How the heck is that possible?  Well, it is a dream after all.

Who knows.  Anniversaries are times when magical things happen…


Contemplating Publishing

I have been using OpenScad for roughly a year now.  It’s been a great experience, and I’ve learned a lot about the program, and the limitations of my own design skills.  I have written a lot about using OpenScad, and where its strengths and limitations are, at least relative to my own design skills.

I recently asked a question on the OpenScad mailing list: Does anyone know of an effort to write a book on OpenScad?

The response thus far has been ‘the wiki book is THE book’.

So, I am contemplating the following, as I have before: Is there room/desire for a printed book on how to use OpenScad?

I had asked this question some time back in a different forum, and the recommendation at that time was “go ahead and start writing chapters, and put them on your blog”.

This is what I will start doing.  I believe there is room for some structured walk throughs of some nuances of OpenScad.  I will put some form around my various OpenScad musings and put them up here.  My intention is to not just cover what can already be found in the user’s manual, but taking a modeler’s approach.  Basically, show a picture of a thing, then deconstruct how that thing can be created with OpenScad, showing interesting techniques, and explaining various OpenScad functions along the way.  Similar to some of the screen casts and other tutorials I’ve seen, but probably getting into deeper detail.

Now, if only I can figure out how to put ‘code’ into my WordPress posts.  I will be able to do the following:


difference()
{
cube(10);
cylinder(r=3, h=25, center=true);
}

And it will show up with a pretty background, and line numbers.  That’s quite an incentive to improve my WordPress skills.


Brick and Mortar

Good News!!

At least the start of a new adventure…  I am creating a new brick and mortar shop in Bellevue Washington!  The general idea of the shop is to be a ‘destination retail’ outlet.  That is, rather than be driven by foot traffic in a downtown mall, it is a place you will want to go to specifically.

Why?  The general idea is that as a geek, I’m always on the hunt for that perfect blend of electronics, books, consumables, and whatnot, all available at my finger tips, on demand.  I myself wanted a great place to find all the things I like playing with under one roof.  Not having it readily available in my neighborhood, I’ve decided to create it.

What?  The primary focus of the shop is all things personal fabrication.  As such, I will be carrying bits an pieces to make machines (motors, servos, steel rods, ball bearings, screws, etc), as well as all the consumables that are used once you have a machine, like plastic of course.  In addition to the basics for machine creation, I will actually be carrying some pre-made kits and polished products such as the Up! printer (in time), and all the bits and pieces for creating Prusa Mendels and the like.

When?  The shop has just been leased last week, and a bunch of junk has been moved in.  It will take about a month before it is in retail shop shape, including internet access, and the innevitable coffee machine.  It will also take that long to get some basic inventory into the place, and of course web site presence.

How?  You will be able to make purchases online, like most retailers have on offer these days.  Those purchases will either be deliverable through UPS etc, or you’ll be able to come down to the shop and pick things up directly.  As it’s a small venture to start, we will not have traditional 9-5 hours, but we’ll definitely be open evenings and weekends!

What Else?  As it is a space, we will hold regular seminars related to personal fabrication and 3D printing.  That’s a bit of an educational component just to keep people up on the latest and greatest changes that are rapidly rolling out.  For example, has anyone seen and played with an Ultimaker?  Want to compare that to an Up! printer, with 3 different sources of plastic filament?  Come on down and check it out.

Summary:  A new brick and mortar shop specifically for the personal fabrication crowd in the Seattle area.  Opening by Thanksgiving.  Plenty of all the things that geeks like you love to look at and play with.

Needless to say, more news later, but starting to talk about it now is exciting for me.


Follow

Get every new post delivered to your Inbox.

Join 70 other followers