- While certainly many details on this site will be relevant to any variety of Apple 16, some may not, so it’s important to highlight the boat I’m building:
+ While certainly many details on this site will be relevant to any
+variety of Apple 16, some may not, so it’s important to highlight the
+boat I’m building:
- 4 plank per side “Apple AHL” as it’s described in some of Tom’s pages, rather than the 5 plank “Swedish Apple” (or the gaff cutter – which doesn’t describe the hull, but rather what goes above!). The 5 plank Apple requires 6 sheets of ply for planks, rather than 4 sheets for the 4 plank Apple: given that the marine ply I’m using (Occume) is tropical hardwood, minimizing it is a no brainer (I’m sure I would use off-cuts in the 5 plank version). I was also just amazed by the way that Tom nested the planks into the sheets, and how that turned into such a beautiful 3D shape – often the planks would be less than an inch from each other in multiple places.
+ 4 plank per side “Apple AHL” as it’s described in some of Tom’s
+pages, rather than the 5 plank “Swedish Apple” (or the gaff cutter –
+which doesn’t describe the hull, but rather what goes above!). The 5
+plank Apple requires 6 sheets of ply for planks, rather than 4 sheets
+for the 4 plank Apple: given that the marine ply I’m using (Occume) is
+tropical hardwood, minimizing it is a no brainer (I’m sure I would use
+off-cuts in the 5 plank version). I was also just amazed by the way that
+Tom nested the planks into the sheets, and how that turned into such a
+beautiful 3D shape – often the planks would be less than an inch from
+each other in multiple places.
- Single (large) rig, with a small mizzen. This is shown in the picture above. The plans account for a larger mizzen “light-air” rig, and corresponding multiple daggerboard positions – something I did not want to deal with!
+ Single (large) rig, with a small mizzen. This is shown in the
+picture above. The plans account for a larger mizzen “light-air” rig,
+and corresponding multiple daggerboard positions – something I did not
+want to deal with!
- Pivoting centerboard, rather than a daggerboard. The design in the plans calls for a long daggerboard case to accommodate the two rig options, so the centerboard case doesn’t actually take up more room in the boat. While it isn’t in the plan set (or at least, wasn’t when I bought them), when I asked Tom about a centerboard he sent me CAD drawings he had made based on old sketches (for two different options), so I didn’t actually have to do any designing: his design, conveniently, had the same slot size in the hull.
+ Pivoting centerboard, rather than a daggerboard. The design in the
+plans calls for a long daggerboard case to accommodate the two rig
+options, so the centerboard case doesn’t actually take up more room in
+the boat. While it isn’t in the plan set (or at least, wasn’t when I
+bought them), when I asked Tom about a centerboard he sent me CAD
+drawings he had made based on old sketches (for two different options),
+so I didn’t actually have to do any designing: his design, conveniently,
+had the same slot size in the hull.
- An enclosed rear tank seat (technically, two rear tanks, with an open channel for the mizzen step to drain), enclosed bow tank, open rear side seats and mid-ship thwart, but no seats forward of the middle of the boat. Related to this—
+ An enclosed rear tank seat (technically, two rear tanks, with an
+open channel for the mizzen step to drain), enclosed bow tank, open rear
+side seats and mid-ship thwart, but no seats forward of the middle of
+the boat. Related to this—
- Floorboards! Sitting on the floor of the boat seems nice for children and dogs, both of which I have – especially forward of the middle thwart, the hull starts to get steep, so sitting without thwarts requires floorboards. Also, that way you don’t have to sit in bilge water!
+ Floorboards! Sitting on the floor of the boat seems nice for
+children and dogs, both of which I have – especially forward of the
+middle thwart, the hull starts to get steep, so sitting without thwarts
+requires floorboards. Also, that way you don’t have to sit in bilge
+water!
- The mast partner is a slight deviation: I’m using the mast gate used by Iain Oughtred, as it allows the mast to be stepped by first placing the butt is the step and then lifting up the mast (the back of the mast partner is open). As a result of this change, I did deviate a bit in the bow, as I made the mast partner be part of one continuous king-plank, rather than one of the plywood options that are in the plans.
+ The mast partner is a slight deviation: I’m using the mast gate used
+by Iain Oughtred, as it allows the mast to be stepped by first placing
+the butt is the step and then lifting up the mast (the back of the mast
+partner is open). As a result of this change, I did deviate a bit in the
+bow, as I made the mast partner be part of one continuous king-plank,
+rather than one of the plywood options that are in the plans.
- For the tiller, rather than the curved one that goes around the mizzen mast, I’m going to put in a Norwegian-style push-pull tiller. This seems easier, and should allow more room for seating further back in the boat.
+ For the tiller, rather than the curved one that goes around the
+mizzen mast, I’m going to put in a Norwegian-style push-pull tiller.
+This seems easier, and should allow more room for seating further back
+in the boat.
@@ -86,10 +122,16 @@
- Plywood: 6 sheets 2500mm x 1225mm (8ft x 4ft “metric”) 6mm thick.
+ Plywood: 6 sheets 2500mm x 1225mm (8ft x 4ft “metric”) 6mm
+thick.
- Solid wood: 16ft (should have 17ft!) for gunwales, in & out. 6 strips 20mmx20mm. Quarter knees, breast hook, and king plank mahogany. 25mm x 25mm douglas fir for centercase support, and lots of 20mm x 20mm stringers (I had a disasterous attempt to use way to brittle douglas fir for gunwales, so had plenty of this stuff), white oak for floors, ipe for floorboards.
+ Solid wood: 16ft (should have 17ft!) for gunwales, in & out. 6
+strips 20mmx20mm. Quarter knees, breast hook, and king plank mahogany.
+25mm x 25mm douglas fir for centercase support, and lots of 20mm x 20mm
+stringers (I had a disasterous attempt to use way to brittle douglas fir
+for gunwales, so had plenty of this stuff), white oak for floors, ipe
+for floorboards.
Epoxy (to be updated as I go along): 6G (not all used yet)
diff --git a/_site/apple/building.html b/_site/apple/building.html
index 93e4698..1968753 100644
--- a/_site/apple/building.html
+++ b/_site/apple/building.html
@@ -4,7 +4,8 @@
- dbp.io :: Apple 16 – unofficial website – building
+ dbp.io :: Apple 16 – unofficial
+website – building
@@ -33,7 +34,8 @@
- Apple 16 – unofficial website – building
+ Apple 16 – unofficial
+website – building
- Thus far, my build has taken the following approximate amounts of time for the various sections, described in the above sections. As I complete more parts of the boat, I’ll add more sections. The sections above took the following amounts of time.
+ Thus far, my build has taken the following approximate amounts of
+time for the various sections, described in the above sections. As I
+complete more parts of the boat, I’ll add more sections. The sections
+above took the following amounts of time.
@@ -193,14 +199,26 @@
Tools
- There are countless tools that you might use in a project like this, but a few that I don’t think are avoidable (i.e., if you don’t have access to, you should borrow / buy):
+ There are countless tools that you might use in a project like this,
+but a few that I don’t think are avoidable (i.e., if you don’t have
+access to, you should borrow / buy):
@@ -213,7 +231,14 @@
Table Saw
- For the gunwales and stringers, there really isn’t any other good option (cutting 20mm x 20mm in a 17ft piece is well beyond my ability with a circular saw). Perhaps a nice bandsaw could do it, but I’d be surprised if you had a band saw and not a table saw! Also, if you are going to do a birdsmouth hollow mast, while you can cut the birdsmouth with a router table (assuming you can get ahold of the strips without a table saw…), the table saw makes it really easy (assuming you are doing an 8 sided, 45 degree angle one).
+ For the gunwales and stringers, there really isn’t any other good
+option (cutting 20mm x 20mm in a 17ft piece is well beyond my ability
+with a circular saw). Perhaps a nice bandsaw could do it, but I’d be
+surprised if you had a band saw and not a table saw! Also, if you are
+going to do a birdsmouth hollow mast, while you can cut the birdsmouth
+with a router table (assuming you can get ahold of the strips without a
+table saw…), the table saw makes it really easy (assuming you are doing
+an 8 sided, 45 degree angle one).
@@ -221,7 +246,11 @@
Curved rasp
- For cutting the rake into the steps and mizzen partner, if nothing else, I don’t think any other tool really can work. It’s also useful in trimming things like the breasthook, quarter knees, hatch holes, etc. In theory, sand paper and a dowel could substitute but only if you are very patient.
+ For cutting the rake into the steps and mizzen partner, if nothing
+else, I don’t think any other tool really can work. It’s also useful in
+trimming things like the breasthook, quarter knees, hatch holes, etc. In
+theory, sand paper and a dowel could substitute but only if you are very
+patient.
@@ -229,7 +258,10 @@
Jig Saw
- I did not use this to cut out panels (I think a small circular saw worked better, cutting more smooth curves), but for cutting out the bulkhead profiles, cutting out hatch holes, and any number of other places where cutting curves was necessary.
+ I did not use this to cut out panels (I think a small
+circular saw worked better, cutting more smooth curves), but for cutting
+out the bulkhead profiles, cutting out hatch holes, and any number of
+other places where cutting curves was necessary.
@@ -237,7 +269,13 @@
Keyhole Saw
- For when you are cutting something out with the Jig Saw, but you end up in a place where the body of the Jig Saw prevents it from cutting further. Duckworks sells a nice one. Obviously, the smaller your Jig Saw and the further in advance you plan (i.e., the less things you are cutting once they are epoxied onto the boat), the less you will need this, but I’d be surprised if it never comes up!
+ For when you are cutting something out with the Jig Saw, but you end
+up in a place where the body of the Jig Saw prevents it from cutting
+further. Duckworks sells a nice
+one. Obviously, the smaller your Jig Saw and the further in advance
+you plan (i.e., the less things you are cutting once they are epoxied
+onto the boat), the less you will need this, but I’d be surprised if it
+never comes up!
@@ -245,7 +283,9 @@
Carbide Scraper
- If you can avoid the need for this, bravo; but for the rest of us, that miss epoxy drips, this, plus possibly a heat gun (not necessary but for the heavy duty drips, makes it easier), is really helpful.
+ If you can avoid the need for this, bravo; but for the rest of us,
+that miss epoxy drips, this, plus possibly a heat gun (not necessary but
+for the heavy duty drips, makes it easier), is really helpful.
@@ -253,7 +293,10 @@
Hand plane
- A small block plane is all that’s needed, but it should be a good one. You might be able to get away without one (I built a previous boat using power sanders where planes were called for), but it’ll be a pain.
+ A small block plane is all that’s needed, but it should be a good
+one. You might be able to get away without one (I built a previous boat
+using power sanders where planes were called for), but it’ll be a
+pain.
@@ -261,7 +304,8 @@
Random orbital sander
- Not only is there so much sanding to do to clean up epoxy, but between coats of paint, etc.
+ Not only is there so much sanding to do to clean up epoxy, but
+between coats of paint, etc.
@@ -269,7 +313,11 @@
Clamps. Lots!
- You’ll need the most when doing the gunwales, where cheap spring clamps (the bigger 2” ones) will mostly work, though once you are doing the last layer, they won’t quite fit, so having at least 15 or more regular clamps will be critical. If you were starting from scratch, 6” or 8” F clamps would probably be the most useful for the build.
+ You’ll need the most when doing the gunwales, where cheap spring
+clamps (the bigger 2” ones) will mostly work, though once you are doing
+the last layer, they won’t quite fit, so having at least 15 or more
+regular clamps will be critical. If you were starting from scratch, 6”
+or 8” F clamps would probably be the most useful for the build.
@@ -277,7 +325,8 @@
- And then, the tools that certainly aren’t irreplaceable, but that I use all the time.
+ And then, the tools that certainly aren’t irreplaceable, but
+that I use all the time.
@@ -290,7 +339,13 @@
Shinto Rasp
- Probably the most common thing I used this for was knocking off epoxy drips, by using it almost as a sander; at the right angle, it doesn’t scrape the wood at all. I also used the tip for cutting chamfers where the router couldn’t reach (holding the tip with one hand, the body with another, and running it along at the right angle). And then of course if you need to take off a lot of wood, it’s pretty effective, but can do some damage.
+ Probably the most common thing I used this for was knocking off
+epoxy drips, by using it almost as a sander; at the right angle, it
+doesn’t scrape the wood at all. I also used the tip for cutting chamfers
+where the router couldn’t reach (holding the tip with one hand, the body
+with another, and running it along at the right angle). And then of
+course if you need to take off a lot of wood, it’s pretty effective, but
+can do some damage.
@@ -298,7 +353,17 @@
Bandsaw
- Unsurprising, given the place this typically holds in boat building shops. It’s totally unnecessary, as I think I resawed exactly one piece of wood for the boat, and thus all of the cuts that I made could have been made with either the table saw, jig saw, or hand saw, but at the same time, I used it more than all the rest of those combined. Given that nothing in the boat is square, being able to cut at arbitrary angles, into corners, quickly, (relatively) safely, is incredibly useful. I would often free cut and either it was in places where it didn’t matter (the joint would be filleted, so small gaps would disappear), or I would cut outside the line and fine tune it with a plane anyway.
+ Unsurprising, given the place this typically holds in boat building
+shops. It’s totally unnecessary, as I think I resawed exactly one piece
+of wood for the boat, and thus all of the cuts that I made could have
+been made with either the table saw, jig saw, or hand saw, but at the
+same time, I used it more than all the rest of those combined. Given
+that nothing in the boat is square, being able to cut at arbitrary
+angles, into corners, quickly, (relatively) safely, is incredibly
+useful. I would often free cut and either it was in places where it
+didn’t matter (the joint would be filleted, so small gaps would
+disappear), or I would cut outside the line and fine tune it with a
+plane anyway.
@@ -306,7 +371,14 @@
Oscillating multi-tool
- I mostly use this as a small power sander that can get into places that a normal 5” random orbital can’t, but the surprising use was actually the flush cutting, which I’ve used exclusively to un-epoxy things that I accidentally glued together. Unlike using heat, this doesn’t harm any epoxy underneath (like when I didn’t anticipate epoxy running down the centerline and gluing a random panel that was laying on it, and I was able to cut it off without damaging the glass tape). A more careful craftsperson may never need this, but that I am not.
+ I mostly use this as a small power sander that can get into places
+that a normal 5” random orbital can’t, but the surprising use was
+actually the flush cutting, which I’ve used exclusively to un-epoxy
+things that I accidentally glued together. Unlike using heat, this
+doesn’t harm any epoxy underneath (like when I didn’t anticipate epoxy
+running down the centerline and gluing a random panel that was laying on
+it, and I was able to cut it off without damaging the glass tape). A
+more careful craftsperson may never need this, but that I am not.
@@ -317,7 +389,10 @@
Build Thread
- As I went along, I documented what I was doing and questions I had. It’s a lot less organized than this page, but in case you are curious: Build Thread with Photos
+ As I went along, I documented what I was doing and questions I had.
+It’s a lot less organized than this page, but in case you are curious:
+Build
+Thread with Photos
diff --git a/_site/apple/building/bowtank.html b/_site/apple/building/bowtank.html
index f3b6d9b..ea4f98d 100644
--- a/_site/apple/building/bowtank.html
+++ b/_site/apple/building/bowtank.html
@@ -4,7 +4,8 @@
- dbp.io :: Apple 16 – unofficial website – building
+ dbp.io :: Apple 16 – unofficial
+website – building
@@ -33,7 +34,8 @@
- Apple 16 – unofficial website – building
+ Apple 16 – unofficial
+website – building
- My version of the bow tank deviated pretty significantly from the plans, as I used a different style mast partner and as a result (and also, to save on plywood), used a lot more solid timber inside the tank. I have the tank top ending at the bulkhead, partly because the square of plywood that I had set aside for this based on suggestion from Tom (500mm x 1100mm) was (I think) for just up until the bulkhead. I’m not actually sure if this is what the short/long foredeck refers to, but given my mast gate is a single piece of hardwood that is supported at multiple places going all the way to the stem, I don’t think that losing the couple inches of ply will have any impact! Obviously in the case of the partner from the plans, it might be more important to have the ply support of the longer foredeck.
+ My version of the bow tank deviated pretty significantly from the
+plans, as I used a different style mast partner and as a result (and
+also, to save on plywood), used a lot more solid timber inside the tank.
+I have the tank top ending at the bulkhead, partly because the square of
+plywood that I had set aside for this based on suggestion from Tom
+(500mm x 1100mm) was (I think) for just up until the bulkhead. I’m not
+actually sure if this is what the short/long foredeck refers to, but
+given my mast gate is a single piece of hardwood that is supported at
+multiple places going all the way to the stem, I don’t think that losing
+the couple inches of ply will have any impact! Obviously in the case of
+the partner from the plans, it might be more important to have the ply
+support of the longer foredeck.
- Photos of building sequence, with notes
+ Photos of building
+sequence, with notes
diff --git a/_site/apple/building/centercase.html b/_site/apple/building/centercase.html
index 1c0843e..67e45f3 100644
--- a/_site/apple/building/centercase.html
+++ b/_site/apple/building/centercase.html
@@ -4,7 +4,8 @@
- dbp.io :: Apple 16 – unofficial website – building
+ dbp.io :: Apple 16 – unofficial
+website – building
@@ -33,7 +34,8 @@
- Apple 16 – unofficial website – building
+ Apple 16 – unofficial
+website – building
- Important Notes (!!! READ THESE EVEN IF YOU IGNORE THE REST !!!)
+ Important
+Notes (!!! READ THESE EVEN IF YOU IGNORE THE REST !!!)
- As mentioned in the Boat section, not only am I putting in a pivoting centerboard (with design provided by Tom), but I’m using the removable centerboard design popular in Francois Vivier’s boats, where there is a slot in the side of the case where a pin that protrudes from the side of the board comes out.
+ As mentioned in the Boat section, not
+only am I putting in a pivoting centerboard (with design provided by
+Tom), but I’m using the removable centerboard design popular in Francois
+Vivier’s boats, where there is a slot in the side of the case where a
+pin that protrudes from the side of the board comes out.
- Photos of building sequence, with notes
+ Photos of building
+sequence, with notes
diff --git a/_site/apple/building/gunwales.html b/_site/apple/building/gunwales.html
index a3b186d..4cff58f 100644
--- a/_site/apple/building/gunwales.html
+++ b/_site/apple/building/gunwales.html
@@ -4,7 +4,8 @@
- dbp.io :: Apple 16 – unofficial website – building
+ dbp.io :: Apple 16 – unofficial
+website – building
@@ -33,7 +34,8 @@
- Apple 16 – unofficial website – building
+ Apple 16 – unofficial
+website – building
- The gunwales are pretty easy – my time estimate should be high, as I had a bit of a disaster with the first wood I was trying to use kept breaking.
+ The gunwales are pretty easy – my time estimate should be high, as I
+had a bit of a disaster with the first wood I was trying to use kept
+breaking.
- Important Notes (!!! READ THESE EVEN IF YOU IGNORE THE REST !!!)
+ Important
+Notes (!!! READ THESE EVEN IF YOU IGNORE THE REST !!!)
- Be sure the wood you have bends well, as there is a compound curve near bulkhead 10 that kept breaking the first wood I tried to use (or just steam it).
+ Be sure the wood you have bends well, as there is a compound curve
+near bulkhead 10 that kept breaking the first wood I tried to use (or
+just steam it).
- Photos of building sequence, with notes
+ Photos of building
+sequence, with notes
diff --git a/_site/apple/building/hull.html b/_site/apple/building/hull.html
index c346103..8c7c92c 100644
--- a/_site/apple/building/hull.html
+++ b/_site/apple/building/hull.html
@@ -4,7 +4,8 @@
- dbp.io :: Apple 16 – unofficial website – building
+ dbp.io :: Apple 16 – unofficial
+website – building
@@ -33,7 +34,8 @@
- Apple 16 – unofficial website – building
+ Apple 16 – unofficial
+website – building
- Building the hull is pretty straightforward – while it certainly takes some time, once you get the strakes cut out, it goes together very quickly.
+ Building the hull is pretty straightforward – while it certainly
+takes some time, once you get the strakes cut out, it goes together very
+quickly.
- Important Notes (!!! READ THESE EVEN IF YOU IGNORE THE REST !!!)
+ Important
+Notes (!!! READ THESE EVEN IF YOU IGNORE THE REST !!!)
- The offsets where you are marking the points for the strakes are the station marks, which will be used to key the bulkheads, etc. That’s why they are at sometimes odd not-quite even numbers.
+ The offsets where you are marking the points for the strakes are
+the station marks, which will be used to key the bulkheads, etc. That’s
+why they are at sometimes odd not-quite even numbers.
- It is mentioned in the plans, but it is super important (and I missed it!): mark vertical lines connecting each pair of station points.
+ It is mentioned in the plans, but it is super important (and I
+missed it!): mark vertical lines connecting each pair of station
+points.
- If, like me, you marked on one set of scarfed sheets and then cut through both at once, this means you need to flip one set of strakes over (once you’ve marked the edge on the bottom strakes) and draw the lines on the opposite site as you were marking points on the top (otherwise you’ll have the inside on one side and the outside of the other). This will be critical when you are wiring in the bulkheads, but is also useful just in aligning the panels together.
+ If, like me, you marked on one set of scarfed sheets and then cut
+through both at once, this means you need to flip one set of strakes
+over (once you’ve marked the edge on the bottom strakes) and draw the
+lines on the opposite site as you were marking points on the
+top (otherwise you’ll have the inside on one side and the outside of the
+other). This will be critical when you are wiring in the bulkheads, but
+is also useful just in aligning the panels together.
- If you don’t need to move the hull while you are doing the glass between the stitches, there is no need to tack with fast epoxy or hot glue. This advice is in the case that you are building in a single car garage (amazing that it can be done) where work can only be done on one side. Otherwise, if you can level and stabilize the boat once it is wired and then do all of the 50mm tape between the wires without disturbing the boat, you can skip that.
+ If you don’t need to move the hull while you are doing the glass
+between the stitches, there is no need to tack with fast epoxy or hot
+glue. This advice is in the case that you are building in a single car
+garage (amazing that it can be done) where work can only be done on one
+side. Otherwise, if you can level and stabilize the boat once it is
+wired and then do all of the 50mm tape between the wires without
+disturbing the boat, you can skip that.
- Photos of building sequence, with notes
+ Photos of building
+sequence, with notes
- At this point, sequentially, you will do the Gunwales, before flipping the boat, but I organized the time for the Hull to include all of the glass taping, which happens over the course of two more flips.
+ At this point, sequentially, you will do the Gunwales, before flipping the
+boat, but I organized the time for the Hull to include all of the glass
+taping, which happens over the course of two more flips.
- Again, while working on the outer seams, it makes sense to do the Outer stem. Technically, it could probably be deferred to later, but this is the order Tom suggests, and I don’t see any reason not to. This is also when he suggested to install the centercase (cutting the slot from the top and bringing the case up from underneath), glassing the hull, and putting on the skeg, but I did defer all of those things.
+ Again, while working on the outer seams, it makes sense to do the Outer stem. Technically, it could
+probably be deferred to later, but this is the order Tom suggests, and I
+don’t see any reason not to. This is also when he suggested to install
+the centercase (cutting the slot from the top and bringing the case up
+from underneath), glassing the hull, and putting on the skeg, but I
+did defer all of those things.
- At this point, the hull is quite strong – it’ll obviously get stronger from knees, thwarts, tanks, floors, etc, and I haven’t felt confident getting into it (but also have been able to reach from the side for everything I’ve needed). Also, as additional (unintentional) confirmation: before building support cradles onto my saw horses, I accidentally dropped the back of the boat off onto the concrete floor (so, about an 18” drop). There was no damage anywhere, which is good!
+ At this point, the hull is quite strong – it’ll obviously get
+stronger from knees, thwarts, tanks, floors, etc, and I haven’t felt
+confident getting into it (but also have been able to reach from the
+side for everything I’ve needed). Also, as additional (unintentional)
+confirmation: before building support cradles onto my saw horses, I
+accidentally dropped the back of the boat off onto the concrete floor
+(so, about an 18” drop). There was no damage anywhere, which is
+good!
diff --git a/_site/apple/building/hullfinish.html b/_site/apple/building/hullfinish.html
index 788e6d0..b07fff7 100644
--- a/_site/apple/building/hullfinish.html
+++ b/_site/apple/building/hullfinish.html
@@ -4,7 +4,8 @@
- dbp.io :: Apple 16 – unofficial website – building
+ dbp.io :: Apple 16 – unofficial
+website – building
@@ -33,7 +34,8 @@
- Apple 16 – unofficial website – building
+ Apple 16 – unofficial
+website – building
- Important Notes (!!! READ THESE EVEN IF YOU IGNORE THE REST !!!)
+ Important
+Notes (!!! READ THESE EVEN IF YOU IGNORE THE REST !!!)
- The designer mentions you could have a single continuous keel running all the way front to back. I didn’t do that, but regretted it once trying to use this on trailer rollers. I’m planning on replacing the rollers with a single plank, which will eliminate the problem (essentially, the discontinuous pieces of keel bump up and down over the rollers), but if you aren’t, I’d aim to avoid the problem by having the forward keel connect to that on either side of the centercase, and have that in turn connect to the skeg.
+ The designer mentions you could have a single continuous keel
+running all the way front to back. I didn’t do that, but regretted it
+once trying to use this on trailer rollers. I’m planning on replacing
+the rollers with a single plank, which will eliminate the problem
+(essentially, the discontinuous pieces of keel bump up and down over the
+rollers), but if you aren’t, I’d aim to avoid the problem by having the
+forward keel connect to that on either side of the centercase, and have
+that in turn connect to the skeg.
- Photos of building sequence, with notes
+ Photos of building
+sequence, with notes
@@ -153,28 +177,42 @@
diff --git a/_site/apple/building/innerfinish.html b/_site/apple/building/innerfinish.html
index a94d424..a1808ab 100644
--- a/_site/apple/building/innerfinish.html
+++ b/_site/apple/building/innerfinish.html
@@ -4,7 +4,8 @@
- dbp.io :: Apple 16 – unofficial website – building
+ dbp.io :: Apple 16 – unofficial
+website – building
@@ -33,7 +34,8 @@
- Apple 16 – unofficial website – building
+ Apple 16 – unofficial
+website – building
- Important Notes (!!! READ THESE EVEN IF YOU IGNORE THE REST !!!)
+ Important
+Notes (!!! READ THESE EVEN IF YOU IGNORE THE REST !!!)
- Honestly, there wasn’t much to be done here – obviously, if you want a perfect finish, do the work before you start painting (i.e., keep working on fairing, etc).
+ Honestly, there wasn’t much to be done here – obviously, if you want
+a perfect finish, do the work before you start painting (i.e.,
+keep working on fairing, etc).
- Photos of building sequence, with notes
+ Photos of building
+sequence, with notes
diff --git a/_site/apple/building/spars.html b/_site/apple/building/spars.html
index b38a93f..303cfc6 100644
--- a/_site/apple/building/spars.html
+++ b/_site/apple/building/spars.html
@@ -4,7 +4,8 @@
- dbp.io :: Apple 16 – unofficial website – building
+ dbp.io :: Apple 16 – unofficial
+website – building
@@ -33,7 +34,8 @@
- Apple 16 – unofficial website – building
+ Apple 16 – unofficial
+website – building
- Important Notes (!!! READ THESE EVEN IF YOU IGNORE THE REST !!!)
+ Important
+Notes (!!! READ THESE EVEN IF YOU IGNORE THE REST !!!)
- For simplicity, I made everything solid except the mast, which is birdsmouth, and as the biggest spar, seemed to be what would benefit most from being lighter. Since they used less wood, and thus the higher price was less traumatic, I made everything but the main mast out of sitka spruce (the main mast was douglas fir).
+ For simplicity, I made everything solid except the mast,
+which is birdsmouth, and as the biggest spar, seemed to be what would
+benefit most from being lighter. Since they used less wood, and thus the
+higher price was less traumatic, I made everything but the main mast out
+of sitka spruce (the main mast was douglas fir).
- Photos of building sequence, with notes
+ Photos of building
+sequence, with notes
diff --git a/_site/apple/building/stem.html b/_site/apple/building/stem.html
index 777e03d..cafcc9f 100644
--- a/_site/apple/building/stem.html
+++ b/_site/apple/building/stem.html
@@ -4,7 +4,8 @@
- dbp.io :: Apple 16 – unofficial website – building
+ dbp.io :: Apple 16 – unofficial
+website – building
@@ -33,7 +34,8 @@
- Apple 16 – unofficial website – building
+ Apple 16 – unofficial
+website – building
- This is a pretty short part of the process, but the breasthook is one of the most visible parts of the boat!
+ This is a pretty short part of the process, but the breasthook is one
+of the most visible parts of the boat!
- Important Notes (!!! READ THESE EVEN IF YOU IGNORE THE REST !!!)
+ Important
+Notes (!!! READ THESE EVEN IF YOU IGNORE THE REST !!!)
- If you want to have a chamfered lower section of the stem (to cut through the water better), figure out that shape before you glue the wood on the boat: I tried a chamfer and it looked quite bad, so ended up laminating back on strips of khaya to build back to something big enough that I could trim to a square stem.
+ If you want to have a chamfered lower section of the stem (to cut
+through the water better), figure out that shape before you glue the
+wood on the boat: I tried a chamfer and it looked quite bad, so ended up
+laminating back on strips of khaya to build back to something big enough
+that I could trim to a square stem.
- Photos of building sequence, with notes
+ Photos of building
+sequence, with notes
diff --git a/_site/apple/building/sterntank.html b/_site/apple/building/sterntank.html
index 003d7b0..de19602 100644
--- a/_site/apple/building/sterntank.html
+++ b/_site/apple/building/sterntank.html
@@ -4,7 +4,8 @@
- dbp.io :: Apple 16 – unofficial website – building
+ dbp.io :: Apple 16 – unofficial
+website – building
@@ -33,7 +34,8 @@
- Apple 16 – unofficial website – building
+ Apple 16 – unofficial
+website – building
- Important Notes (!!! READ THESE EVEN IF YOU IGNORE THE REST !!!)
+ Important
+Notes (!!! READ THESE EVEN IF YOU IGNORE THE REST !!!)
- You (probably) need to install the rudder post before gluing in the mizzen partner, assuming you want to screw in from the inside in addition to gluing on the outside (as is suggested by the designer). The design for the rear tank I used keeps this area accessible, in theory, but it is a lot harder to get to once the partner (and then tank top) is on.
+ You (probably) need to install the rudder post before gluing in the
+mizzen partner, assuming you want to screw in from the inside in
+addition to gluing on the outside (as is suggested by the designer). The
+design for the rear tank I used keeps this area accessible, in theory,
+but it is a lot harder to get to once the partner (and then
+tank top) is on.
- Photos of building sequence, with notes
+ Photos of building
+sequence, with notes
diff --git a/_site/apple/building/thwarts.html b/_site/apple/building/thwarts.html
index fd96dcc..d00582b 100644
--- a/_site/apple/building/thwarts.html
+++ b/_site/apple/building/thwarts.html
@@ -4,7 +4,8 @@
- dbp.io :: Apple 16 – unofficial website – building
+ dbp.io :: Apple 16 – unofficial
+website – building
@@ -33,7 +34,8 @@
- Apple 16 – unofficial website – building
+ Apple 16 – unofficial
+website – building
- Important Notes (!!! READ THESE EVEN IF YOU IGNORE THE REST !!!)
+ Important
+Notes (!!! READ THESE EVEN IF YOU IGNORE THE REST !!!)
- If I could go back and order more plywood, I probably would make the rear seats into tanks. With the framing and knees, it was probably as much work or more, and what I have is probably not as strong, doesn’t have as much flotation, etc. The only upside is that I have rollers, but they inflate, so the deflated ones could be stored inside the tanks, along with other stuff!
+ If I could go back and order more plywood, I probably would make the
+rear seats into tanks. With the framing and knees, it was probably as
+much work or more, and what I have is probably not as strong, doesn’t
+have as much flotation, etc. The only upside is that I have rollers, but
+they inflate, so the deflated ones could be stored inside the
+tanks, along with other stuff!
- Photos of building sequence, with notes
+ Photos of building
+sequence, with notes
- Apple 16 – unofficial website – comparison
+ Apple 16 – unofficial
+website – comparison
@@ -56,52 +58,150 @@
Comparison with other boats
- There are many plywood boats suitable for home builders in the ~15-16ft range, roughly 5ft beam, a couple hundred pounds, good performance as sailboats, decent as rowboats. It’s a particularly compelling size, as pretty much any plywood sailboat boat that can fit more than one person will be longer than 8 feet, and once you are scarfing a sheet of plywood (and have gone above what could go on the roof of a car or bed of a pickup), you might as well push to the edge of what two sheets of plywood gets you. The similar light weight of all these boats reflects their overall cost and complexity: a 200lb boat and a 500lb boat, even if they are the same length, are going to be very different in terms of difficulty of building and cost, as at this weight almost no boats have built in ballast and thus all of the weight are actual structural elements. That means if you want to compare similar boats, length and beam will give you an idea of carrying capacity (to first approximation), and weight will give you an idea of cost/complexity (to first approximation).
+ There are many plywood boats suitable for home builders in the
+~15-16ft range, roughly 5ft beam, a couple hundred pounds, good
+performance as sailboats, decent as rowboats. It’s a particularly
+compelling size, as pretty much any plywood sailboat boat that can fit
+more than one person will be longer than 8 feet, and once you are
+scarfing a sheet of plywood (and have gone above what could go on the
+roof of a car or bed of a pickup), you might as well push to the edge of
+what two sheets of plywood gets you. The similar light weight of all
+these boats reflects their overall cost and complexity: a 200lb boat and
+a 500lb boat, even if they are the same length, are going to be very
+different in terms of difficulty of building and cost, as at this weight
+almost no boats have built in ballast and thus all of the weight are
+actual structural elements. That means if you want to compare
+similar boats, length and beam will give you an idea of
+carrying capacity (to first approximation), and weight will give you an
+idea of cost/complexity (to first approximation).
- All of the boats on this page are in a roughly similar design space as the Apple 16: 15ft-16ft long, about 5ft wide (beam), and somewhere between 130lbs to 250lbs (actual weights will vary wildly, as choice of materials makes a huge difference; I found this out when I built a supposedly 65lb boat that weighs 120lbs by replacing the 4mm ply with 6mm and using 29lb per sheet lumberyard ply instead of 12lb 4mm occume and 18lb 6mm occume).
+ All of the boats on this page are in a roughly similar design space
+as the Apple 16: 15ft-16ft long, about 5ft wide (beam), and somewhere
+between 130lbs to 250lbs (actual weights will vary wildly, as choice of
+materials makes a huge difference; I found this out when I built a
+supposedly 65lb boat that weighs 120lbs by replacing the 4mm ply with
+6mm and using 29lb per sheet lumberyard ply instead of 12lb 4mm occume
+and 18lb 6mm occume).
- A few are particularly popular, and this page compares the Apple 16 with them, highlighting advantages, in particular, why I ended up building it!
+ A few are particularly popular, and this page compares the Apple 16
+with them, highlighting advantages, in particular, why I ended up
+building it!
- Goat Island Skiffby Michael Storer
+ Goat Island
+Skiffby Michael Storer
- Storer’s most popular boat, the GIS is 15’6”, 5’ beam, 125+lbs, with a 105ft lug sail, though Clint Chase has a lug-yawl option for it.
+ Storer’s most popular boat, the GIS is 15’6”, 5’ beam, 125+lbs, with
+a 105ft lug sail, though Clint Chase has a lug-yawl
+option for it.
- In a lot of ways, this boat seems incredibly similar, though it is certainly easier to build (the hull is a flat bottom panel, two sides, and a transom), and it’s very highly recommended. Also, Storer’s plans are generally very good, and the GIS is probably the best of them, given that the plans have had the most eyes on them! The downside is that it seems to be a boat designed for dinghy sailors, in that it is a bit unstable! The light weight, combined with the narrow front means that capsizing it is certainly a risk, and there doesn’t seem to be much to do about it aside from be an experienced sailor! (Note: since originally writing this, I’ve seen some people experiment with water tank ballast beneath the center seat – which may make things a bit more stable!)
+ In a lot of ways, this boat seems incredibly similar, though it is
+certainly easier to build (the hull is a flat bottom panel, two sides,
+and a transom), and it’s very highly recommended. Also, Storer’s plans
+are generally very good, and the GIS is probably the best of them, given
+that the plans have had the most eyes on them! The downside is that it
+seems to be a boat designed for dinghy sailors, in that it is a bit
+unstable! The light weight, combined with the narrow front means that
+capsizing it is certainly a risk, and there doesn’t seem to be much to
+do about it aside from be an experienced sailor! (Note: since originally
+writing this, I’ve seen some people experiment with water tank ballast
+beneath the center seat – which may make things a bit more stable!)
- While obviously any light dinghy will capsize, since the Apple 16 doesn’t have a flat bottom, it can more easily / happily have ballast put in (water tanks, or more easily, heavy material like metal or sand), which will make it much more stable. This might make it less exciting to sail, but much better when out with family, or in heavier weather – and with removable ballast, it’s easy to switch. Ballasting is a lot less of an option in a flat bottom boat like the GIS, because to really work it should switch from side to side on each tack (obviously, the sailors serve as ballast, but that requires skill). Aside from the easier build and more straightforward plans (there is essentially one GIS – modifications do exist, but are pretty rare and minor), another advantage the GIS has is the flat transom makes mounting a motor more straightforward – no complicated mount needed to account for the 30 degree raked transom on the Apple 16.
+ While obviously any light dinghy will capsize, since the Apple 16
+doesn’t have a flat bottom, it can more easily / happily have ballast
+put in (water tanks, or more easily, heavy material like metal or sand),
+which will make it much more stable. This might make it less exciting to
+sail, but much better when out with family, or in heavier weather – and
+with removable ballast, it’s easy to switch. Ballasting is a lot less of
+an option in a flat bottom boat like the GIS, because to really work it
+should switch from side to side on each tack (obviously, the
+sailors serve as ballast, but that requires skill). Aside from
+the easier build and more straightforward plans (there is essentially
+one GIS – modifications do exist, but are pretty rare and
+minor), another advantage the GIS has is the flat transom makes mounting
+a motor more straightforward – no complicated mount needed to account
+for the 30 degree raked transom on the Apple 16.
- Phoenix IIIby Ross Lillistone
+ Phoenix III
+by Ross Lillistone
- A narrower boat at 4’9”, and a little shorter at 15’1.5”, and in general, it is quite a bit smaller, given the area ahead of the mast is inaccessible and the side decks, while making it more seaworthy, also cut into space. At least one sailor experienced with it (and indeed, who thinks it is great) said that it is really comfortably a two person boat. On the flip side, it is probably a much better row boat! It is reported to be quite stable, but is still quite light (spec’ed at 132lbs), and with 104sqft (for the sloop), it moves along!
+ A narrower boat at 4’9”, and a little shorter at 15’1.5”, and in
+general, it is quite a bit smaller, given the area ahead of the mast is
+inaccessible and the side decks, while making it more seaworthy, also
+cut into space. At least one sailor experienced with it (and indeed, who
+thinks it is great) said that it is really comfortably a two person
+boat. On the flip side, it is probably a much better row boat! It is
+reported to be quite stable, but is still quite light (spec’ed at
+132lbs), and with 104sqft (for the sloop), it moves along!
- Building wise, it is more complex, given the glued lapstrake, but that’s easily avoided by building the similarly designed stitch and glue First Mate.
+ Building wise, it is more complex, given the glued lapstrake, but
+that’s easily avoided by building the similarly designed stitch and glue
+First Mate.
- In terms of comparison with the Apple, I think the main difference is that for a similar (though, 8.5” isn’t nothing!) length, and probably similar building process, the Apple 16 is a lot more boat: whether that is actually relevant is of course, a personal decision, but being able to take out three other people comfortably was important to me, and all the other constraints (total cost, space it would take up in garage, difficulty to transport it) seemed pretty similar to me. But, I say that as someone who considers rowing a necessary way to get around when there isn’t enough wind, rather than something that I go out to do!
+ In terms of comparison with the Apple, I think the main difference is
+that for a similar (though, 8.5” isn’t nothing!) length, and probably
+similar building process, the Apple 16 is a lot more boat: whether that
+is actually relevant is of course, a personal decision, but being able
+to take out three other people comfortably was important to me, and all
+the other constraints (total cost, space it would take up in garage,
+difficulty to transport it) seemed pretty similar to me. But, I say that
+as someone who considers rowing a necessary way to get around when there
+isn’t enough wind, rather than something that I go out to do!
- Argie 15by Dudley Dix
+ Argie 15by Dudley
+Dix
- This is perhaps the closest boat to the Apple 16 – partly because the design brief was very similar. While with the Apple 16, Tom was trying to figure out the biggest boat that could be built in a single car garage, he ended up determining that it should come out of 6 sheets of plywood. With the Argie 15, Dudley wanted to build the biggest boat possible out of 6 sheets of plywood. The Argie 15 is a little shorter (15’5”) and a little wider (6’0”). The pluses are that it is designed as a 3-in-1, so fitting a motor is straightforward (indeed, it can be used solely as a motor boat), and it’s also designed to make it easy to sleep on the floor (if that is important to you). And it is clearly a well-tested design by a good designer. Finally, it can be gotten in kit form in many places (in the US, the kits are cut by CLC, though sold by Dudley). So there is a lot going for it! What tips me over to the Apple 16 is partly the rig: while people have put different rigs on the Argie 15, a stayed bermuda sloop is what it is intended to be, and I prefer unstayed lug rigs and like the idea (though have not sailed!) of lug yawls. The spars in the Apple 16 fit in the hull without needing to be in multiple pieces. Finally, there are pure aesthetics: the Argie 15 is certainly a pretty boat, but the plumb bow of the Apple 16 grabbed me.
+ This is perhaps the closest boat to the Apple 16 – partly because the
+design brief was very similar. While with the Apple 16, Tom was trying
+to figure out the biggest boat that could be built in a single car
+garage, he ended up determining that it should come out of 6 sheets of
+plywood. With the Argie 15, Dudley wanted to build the biggest boat
+possible out of 6 sheets of plywood. The Argie 15 is a little shorter
+(15’5”) and a little wider (6’0”). The pluses are that it is designed as
+a 3-in-1, so fitting a motor is straightforward (indeed, it can be used
+solely as a motor boat), and it’s also designed to make it easy to sleep
+on the floor (if that is important to you). And it is clearly a
+well-tested design by a good designer. Finally, it can be gotten in kit
+form in many places (in the US, the kits are cut by CLC, though sold by
+Dudley). So there is a lot going for it! What tips me over to
+the Apple 16 is partly the rig: while people have put different rigs on
+the Argie 15, a stayed bermuda sloop is what it is intended to be, and I
+prefer unstayed lug rigs and like the idea (though have not sailed!) of
+lug yawls. The spars in the Apple 16 fit in the hull without needing to
+be in multiple pieces. Finally, there are pure aesthetics: the Argie 15
+is certainly a pretty boat, but the plumb bow of the Apple 16 grabbed
+me.
- This is a much newer design that any of the other boats on this list (which are all, as far as I know, from the mid-early 90s or before). At 15’6” and 5’2” beam, 235lbs, it is very similar in specs to the Apple 16. Appearance wise, the lapstrake upper strakes certainly give a different look, and the fact that it can be built from a kit may be appealing to some (but, the cost was prohibitive to me; it would have increased the total cost of the build by at least a factor of two). The downside, of course, is that it is quite a new design, and while Clint is certainly a designer who has put a ton of time into this boat, it hasn’t been tested in the way that others on this list have.
+ This is a much newer design that any of the other boats on this list
+(which are all, as far as I know, from the mid-early 90s or before). At
+15’6” and 5’2” beam, 235lbs, it is very similar in specs to the Apple
+16. Appearance wise, the lapstrake upper strakes certainly give a
+different look, and the fact that it can be built from a kit may be
+appealing to some (but, the cost was prohibitive to me; it would have
+increased the total cost of the build by at least a factor of two). The
+downside, of course, is that it is quite a new design, and while Clint
+is certainly a designer who has put a ton of time into this boat, it
+hasn’t been tested in the way that others on this list have.
- Have another boat you have compared with? Share it with dbp@dbpmail.net
+ Have
+another boat you have compared with? Share it with dbp@dbpmail.net
- The Apple 16 is a 15ft 10in lug-yawl designed by Tom Dunderdale of Campion Boats. The official webpage has quite a bit of information about the Apple 16, but it’s sometimes hard to follow (particularly, there are many links that are not styled as links! And other links that are only images…).
+ The Apple 16 is a 15ft 10in lug-yawl designed by Tom Dunderdale of Campion Boats. The official webpage
+has quite a bit of information about the Apple 16, but it’s sometimes
+hard to follow (particularly, there are many links that are not styled
+as links! And other links that are only images…).
- To buy plans, email Tom: td@campionboats.co.uk, you can find the current plan prices here: http://www.campionboats.co.uk/prices.html. Tom is very responsive over email, so getting the plans is very easy (note the three options: the plain Apple 16, as described on this website, is the Apple AHL there; the Apple 16 plan set is the regular Apple includes plans for the gaff cutter, and the Swedish Apple has more planks).
+ To buy plans, email Tom: td@campionboats.co.uk, you can
+find the current plan prices here: http://www.campionboats.co.uk/prices.html.
+Tom is very responsive over email, so getting the plans is very easy
+(note the three options: the plain Apple 16, as described on this
+website, is the Apple AHL there; the Apple 16 plan set is the regular
+Apple includes plans for the gaff cutter, and the Swedish Apple has more
+planks).
Why This Site
- The Apple 16 is an amazing design, but for various reasons it seems to be less popular than other boats that fit into the same category (general length, weight, etc), even while it seems to have many advantages (described in Comparison section). But, one problem with building a less popular boat is that there are less community resources, and it’s harder to understand, before building, what is going to be involved – hopefully this site, including a detailed log of my own process, which should give at least rough time estimates (everyone works at different paces, has different standards, tools, etc), should help!
+ The Apple 16 is an amazing design, but for various
+reasons it seems to be less popular than other boats that fit into the
+same category (general length, weight, etc), even while it seems to have
+many advantages (described in Comparison section). But, one problem
+with building a less popular boat is that there are less community
+resources, and it’s harder to understand, before building, what is going
+to be involved – hopefully this site, including a detailed log of my own
+process, which should give at least rough time estimates (everyone works
+at different paces, has different standards, tools, etc), should
+help!
- Also, while Tom is incredibly responsive, the plans themselves can be somewhat overwhelming once you get past the hull (where the step-by-step instructions stop) – the issue is that the boat has had tons of different options added over time (water ballast, 3/4 decking, floorboards, side tanks, etc, etc), and these all overlap in various ways in the plan sheets. This does mean, if you want to customize thing, you can often find guidance in the plans (and if not, Tom is incredibly helpful), but it can be intimidating. So another goal of this site is to show how to interpret the plans into a single boat: the one that I’m building, so that if you want to build a similar one, hopefully you have to do less pondering than I did. I will also include all of the communication that I have had with Tom (clarifying details, etc), but of course the plans themselves you will get from him.
+ Also, while Tom is incredibly responsive, the plans themselves can be
+somewhat overwhelming once you get past the hull (where the step-by-step
+instructions stop) – the issue is that the boat has had tons of
+different options added over time (water ballast, 3/4 decking,
+floorboards, side tanks, etc, etc), and these all overlap in various
+ways in the plan sheets. This does mean, if you want to customize thing,
+you can often find guidance in the plans (and if not, Tom is incredibly
+helpful), but it can be intimidating. So another goal of this site is to
+show how to interpret the plans into a single boat: the one that I’m
+building, so that if you want to build a similar one, hopefully you have
+to do less pondering than I did. I will also include all of the
+communication that I have had with Tom (clarifying details, etc), but of
+course the plans themselves you will get from him.
- Not a single build, but photos from building section of Apple site
+ Not
+a single build, but photos
+from building section of Apple site
- These give various shots of various different builds (many from the beginning are the AHL, then there are many of the decked cutter).
+ These give various shots of various different builds (many from the
+beginning are the AHL, then there are many of the decked cutter).
Jamie Duff, Apple 16 Cutter
@@ -70,7 +73,8 @@
- Matt Bowser, Swedish Apple with totally custom interior
+ Matt
+Bowser, Swedish Apple with totally custom interior
@@ -84,39 +88,49 @@
- Swiss person on Reddit, Swedish Apple (not much info)
+ Swiss person
+on Reddit, Swedish Apple (not much info)
- And then it seems to have dropped off (Glassing was posted, as of this writing, 6 months ago).
+ And then it seems to have dropped off (Glassing was posted, as of
+this writing, 6 months ago).
- Know of another documented Apple 16 build? Send me info at dbp@dbpmail.net
+ Know
+of another documented Apple 16 build? Send me info at dbp@dbpmail.net
- KaTeX is a fast, easy-to-use JavaScript library for TeX math rendering on the web.
+ KaTeX is a fast, easy-to-use JavaScript library for TeX math
+rendering on the web.
- Fast: KaTeX renders its math synchronously and doesn’t need to reflow the page. See how it compares to a competitor in this speed test.
+ Fast: KaTeX renders its math synchronously and
+doesn’t need to reflow the page. See how it compares to a competitor in
+this
+speed test.
- Print quality: KaTeX’s layout is based on Donald Knuth’s TeX, the gold standard for math typesetting.
+ Print quality: KaTeX’s layout is based on Donald
+Knuth’s TeX, the gold standard for math typesetting.
- Self contained: KaTeX has no dependencies and can easily be bundled with your website resources.
+ Self contained: KaTeX has no dependencies and can
+easily be bundled with your website resources.
- Server side rendering: KaTeX produces the same output regardless of browser or environment, so you can pre-render expressions using Node.js and send them as plain HTML.
+ Server side rendering: KaTeX produces the same
+output regardless of browser or environment, so you can pre-render
+expressions using Node.js and send them as plain HTML.
- KaTeX is compatible with all major browsers, including Chrome, Safari, Firefox, Opera, Edge, and IE 11.
+ KaTeX is compatible with all major browsers, including Chrome,
+Safari, Firefox, Opera, Edge, and IE 11.
<!DOCTYPE html><!-- KaTeX requires the use of the HTML5 doctype. Without it, KaTeX may not render properly -->
-<html>
-<head>
-<linkrel="stylesheet"href="https://cdn.jsdelivr.net/npm/katex@0.13.0/dist/katex.min.css"integrity="sha384-t5CR+zwDAROtph0PXGte6ia8heboACF9R5l/DiY+WZ3P2lxNgvJkQk5n7GPvLMYw"crossorigin="anonymous">
+<html>
+<head>
+<linkrel="stylesheet"href="https://cdn.jsdelivr.net/npm/katex@0.13.0/dist/katex.min.css"integrity="sha384-t5CR+zwDAROtph0PXGte6ia8heboACF9R5l/DiY+WZ3P2lxNgvJkQk5n7GPvLMYw"crossorigin="anonymous"><!-- The loading of KaTeX is deferred to speed up page rendering -->
-<scriptdefersrc="https://cdn.jsdelivr.net/npm/katex@0.13.0/dist/katex.min.js"integrity="sha384-FaFLTlohFghEIZkw6VGwmf9ISTubWAVYW8tG8+w2LAIftJEULZABrF9PPFv+tVkH"crossorigin="anonymous"></script>
+<scriptdefersrc="https://cdn.jsdelivr.net/npm/katex@0.13.0/dist/katex.min.js"integrity="sha384-FaFLTlohFghEIZkw6VGwmf9ISTubWAVYW8tG8+w2LAIftJEULZABrF9PPFv+tVkH"crossorigin="anonymous"></script><!-- To automatically render math in text elements, include the auto-render extension: -->
-<scriptdefersrc="https://cdn.jsdelivr.net/npm/katex@0.13.0/dist/contrib/auto-render.min.js"integrity="sha384-bHBqxz8fokvgoJ/sc17HODNxa42TlaEhB+w8ZJXTc2nZf1VgEaFZeZvT4Mznfz0v"crossorigin="anonymous"
- onload="renderMathInElement(document.body);"></script>
-</head>
+<scriptdefersrc="https://cdn.jsdelivr.net/npm/katex@0.13.0/dist/contrib/auto-render.min.js"integrity="sha384-bHBqxz8fokvgoJ/sc17HODNxa42TlaEhB+w8ZJXTc2nZf1VgEaFZeZvT4Mznfz0v"crossorigin="anonymous"
+ onload="renderMathInElement(document.body);"></script>
+</head> ...
-</html>
For details on how to configure auto-render extension, refer to the documentation.
@@ -89,7 +102,8 @@
API
- Call katex.render to render a TeX expression directly into a DOM element. For example:
+ Call katex.render to render a TeX expression directly
+into a DOM element. For example:
- Call katex.renderToString to generate an HTML string of the rendered math, e.g., for server-side rendering. For example:
+ Call katex.renderToString to generate an HTML string of
+the rendered math, e.g., for server-side rendering. For example:
var html = katex.renderToString("c = \\pm\\sqrt{a^2 + b^2}", {
@@ -106,16 +121,24 @@
// '<span class="katex">...</span>'
- Make sure to include the CSS and font files in both cases. If you are doing all rendering on the server, there is no need to include the JavaScript on the client.
+ Make sure to include the CSS and font files in both cases. If you are
+doing all rendering on the server, there is no need to include the
+JavaScript on the client.
- The examples above use the throwOnError: false option, which renders invalid inputs as the TeX source code in red (by default), with the error message as hover text. For other available options, see the API documentation, options documentation, and handling errors documentation.
+ The examples above use the throwOnError: false option,
+which renders invalid inputs as the TeX source code in red (by default),
+with the error message as hover text. For other available options, see
+the API documentation, options documentation,
+and handling errors
+documentation.
- KaTeX is a fast, easy-to-use JavaScript library for TeX math rendering on the web.
+ KaTeX is a fast, easy-to-use JavaScript library for TeX math
+rendering on the web.
- Fast: KaTeX renders its math synchronously and doesn’t need to reflow the page. See how it compares to a competitor in this speed test.
+ Fast: KaTeX renders its math synchronously and
+doesn’t need to reflow the page. See how it compares to a competitor in
+this
+speed test.
- Print quality: KaTeX’s layout is based on Donald Knuth’s TeX, the gold standard for math typesetting.
+ Print quality: KaTeX’s layout is based on Donald
+Knuth’s TeX, the gold standard for math typesetting.
- Self contained: KaTeX has no dependencies and can easily be bundled with your website resources.
+ Self contained: KaTeX has no dependencies and can
+easily be bundled with your website resources.
- Server side rendering: KaTeX produces the same output regardless of browser or environment, so you can pre-render expressions using Node.js and send them as plain HTML.
+ Server side rendering: KaTeX produces the same
+output regardless of browser or environment, so you can pre-render
+expressions using Node.js and send them as plain HTML.
- KaTeX is compatible with all major browsers, including Chrome, Safari, Firefox, Opera, Edge, and IE 11.
+ KaTeX is compatible with all major browsers, including Chrome,
+Safari, Firefox, Opera, Edge, and IE 11.
<!DOCTYPE html><!-- KaTeX requires the use of the HTML5 doctype. Without it, KaTeX may not render properly -->
-<html>
-<head>
-<linkrel="stylesheet"href="https://cdn.jsdelivr.net/npm/katex@0.13.0/dist/katex.min.css"integrity="sha384-t5CR+zwDAROtph0PXGte6ia8heboACF9R5l/DiY+WZ3P2lxNgvJkQk5n7GPvLMYw"crossorigin="anonymous">
+<html>
+<head>
+<linkrel="stylesheet"href="https://cdn.jsdelivr.net/npm/katex@0.13.0/dist/katex.min.css"integrity="sha384-t5CR+zwDAROtph0PXGte6ia8heboACF9R5l/DiY+WZ3P2lxNgvJkQk5n7GPvLMYw"crossorigin="anonymous"><!-- The loading of KaTeX is deferred to speed up page rendering -->
-<scriptdefersrc="https://cdn.jsdelivr.net/npm/katex@0.13.0/dist/katex.min.js"integrity="sha384-FaFLTlohFghEIZkw6VGwmf9ISTubWAVYW8tG8+w2LAIftJEULZABrF9PPFv+tVkH"crossorigin="anonymous"></script>
+<scriptdefersrc="https://cdn.jsdelivr.net/npm/katex@0.13.0/dist/katex.min.js"integrity="sha384-FaFLTlohFghEIZkw6VGwmf9ISTubWAVYW8tG8+w2LAIftJEULZABrF9PPFv+tVkH"crossorigin="anonymous"></script><!-- To automatically render math in text elements, include the auto-render extension: -->
-<scriptdefersrc="https://cdn.jsdelivr.net/npm/katex@0.13.0/dist/contrib/auto-render.min.js"integrity="sha384-bHBqxz8fokvgoJ/sc17HODNxa42TlaEhB+w8ZJXTc2nZf1VgEaFZeZvT4Mznfz0v"crossorigin="anonymous"
- onload="renderMathInElement(document.body);"></script>
-</head>
+<scriptdefersrc="https://cdn.jsdelivr.net/npm/katex@0.13.0/dist/contrib/auto-render.min.js"integrity="sha384-bHBqxz8fokvgoJ/sc17HODNxa42TlaEhB+w8ZJXTc2nZf1VgEaFZeZvT4Mznfz0v"crossorigin="anonymous"
+ onload="renderMathInElement(document.body);"></script>
+</head> ...
-</html>
For details on how to configure auto-render extension, refer to the documentation.
@@ -89,7 +102,8 @@
API
- Call katex.render to render a TeX expression directly into a DOM element. For example:
+ Call katex.render to render a TeX expression directly
+into a DOM element. For example:
- Call katex.renderToString to generate an HTML string of the rendered math, e.g., for server-side rendering. For example:
+ Call katex.renderToString to generate an HTML string of
+the rendered math, e.g., for server-side rendering. For example:
var html = katex.renderToString("c = \\pm\\sqrt{a^2 + b^2}", {
@@ -106,16 +121,24 @@
// '<span class="katex">...</span>'
- Make sure to include the CSS and font files in both cases. If you are doing all rendering on the server, there is no need to include the JavaScript on the client.
+ Make sure to include the CSS and font files in both cases. If you are
+doing all rendering on the server, there is no need to include the
+JavaScript on the client.
- The examples above use the throwOnError: false option, which renders invalid inputs as the TeX source code in red (by default), with the error message as hover text. For other available options, see the API documentation, options documentation, and handling errors documentation.
+ The examples above use the throwOnError: false option,
+which renders invalid inputs as the TeX source code in red (by default),
+with the error message as hover text. For other available options, see
+the API documentation, options documentation,
+and handling errors
+documentation.
- There wasn’t much information out there about this build, even though it seems like a lot of people have made them. In particular, I had no idea how long I should expect it to take (and I underestimated how long it would take – the only number I saw was 10 days, which perhaps a professional, or someone with a helper, could do, but not me!). So this page is an attempt to give more information that might be useful to someone taking on this project. In the end, with every step, including a bunch of time spent stripping off poorly adhered paint and repainting (probably around 15hrs lost), to a rigged boat ready to launch, it took 150.75 hours. As a total amateur.
-
-
- Also, the plans are pretty detailed, but they aren’t perfect – there are places where they are incomplete, or misleading (e.g., they suggest gluing in the mast step at two different places in the plans – I chose the first one arbitrarily! Even worse, the rudder box instructions say, counter to the pictures, you should glue the framing on after gluing the box together. But if you do that, it’s impossible to drill a countersunk hole on the inside of the rudderbox. So the proposed assembly instructions are essentially impossible) So read everything and try to understand how things fit together – it’s not a matter of just following the instructions in order. However, I am confident that they include enough information that a complete novice (like me) can end up with a boat, but it probably won’t match what is describe exactly, because I don’t think what is describe is actually consistent. Somewhat frustrating, especially given how much love people give to the plan author (as an engineering spec, at least the type I would expect from my entirely different background as a software engineering, I would give it a C-).
-
-
- Another unclear part is when you should be epoxying things! In the appendix, the author says that they strongly prefer coating surfaces at the point that they are getting glued to other things, but then the instructions (and images) don’t seem to do that. Some surfaces really should be done that way, because then they will become in internal places, but others may be better to wait (I realize now, perhaps the inside of sealed compartments need not have been coated at all! Assuming no leaks, they should never see water, and it would have saved time and weight to not coat them). I ended up coating most everything (on both sides) before assembly, somewhat ignoring the advice that places where pieces will later get attached should get masked off (confusingly, one of the main sources of information, aside from the plans, is this site: http://www.bitingmidge.com/boats/ozracer/building/oneminute.html, which suggests pre-coating the entire plywood panels. This might have actually been a much better plan, but clearly contradicts the idea that you shouldn’t pre-coat areas that will get glued. It’s also probably somewhat wasteful, as even scrap parts get coated, and it may make things harder to cut, as epoxy makes the wood a lot stronger). I then sanded the panels before they got glued to other parts, and hopefully it’s all strong enough!
+ There wasn’t much information out there about this build, even though
+it seems like a lot of people have made them. In particular, I had no
+idea how long I should expect it to take (and I underestimated how long
+it would take – the only number I saw was 10 days, which perhaps a
+professional, or someone with a helper, could do, but not me!). So this
+page is an attempt to give more information that might be useful to
+someone taking on this project. In the end, with every step, including a
+bunch of time spent stripping off poorly adhered paint and repainting
+(probably around 15hrs lost), to a rigged boat ready to launch, it took
+150.75 hours. As a total amateur.
+
+
+ Also, the plans are pretty detailed, but they aren’t perfect – there
+are places where they are incomplete, or misleading (e.g., they suggest
+gluing in the mast step at two different places in the plans – I chose
+the first one arbitrarily! Even worse, the rudder box instructions say,
+counter to the pictures, you should glue the framing on after
+gluing the box together. But if you do that, it’s impossible to drill a
+countersunk hole on the inside of the rudderbox. So the
+proposed assembly instructions are essentially impossible) So read
+everything and try to understand how things fit together – it’s not a
+matter of just following the instructions in order. However, I am
+confident that they include enough information that a complete novice
+(like me) can end up with a boat, but it probably won’t match what is
+describe exactly, because I don’t think what is describe is actually
+consistent. Somewhat frustrating, especially given how much love people
+give to the plan author (as an engineering spec, at least the type I
+would expect from my entirely different background as a software
+engineering, I would give it a C-).
+
+
+ Another unclear part is when you should be epoxying things! In the
+appendix, the author says that they strongly prefer coating surfaces at
+the point that they are getting glued to other things, but then the
+instructions (and images) don’t seem to do that. Some surfaces really
+should be done that way, because then they will become in internal
+places, but others may be better to wait (I realize now, perhaps the
+inside of sealed compartments need not have been coated at all! Assuming
+no leaks, they should never see water, and it would have saved time and
+weight to not coat them). I ended up coating most everything (on both
+sides) before assembly, somewhat ignoring the advice that places where
+pieces will later get attached should get masked off (confusingly, one
+of the main sources of information, aside from the plans, is this site:
+http://www.bitingmidge.com/boats/ozracer/building/oneminute.html,
+which suggests pre-coating the entire plywood panels. This
+might have actually been a much better plan, but clearly contradicts the
+idea that you shouldn’t pre-coat areas that will get glued. It’s also
+probably somewhat wasteful, as even scrap parts get coated, and it may
+make things harder to cut, as epoxy makes the wood a lot stronger). I
+then sanded the panels before they got glued to other parts, and
+hopefully it’s all strong enough!
- Tools Used (in order of frequency):
+ Tools Used (in order of
+frequency):
@@ -60,7 +106,8 @@
Router
- Table saw – to rip lumber to the right dimensions (done all at once the first day, as I didn’t own one when I started this)
+ Table saw – to rip lumber to the right dimensions (done all at once
+the first day, as I didn’t own one when I started this)
Hand plane
@@ -73,7 +120,18 @@
- Note: I ended up not using the hand plane for any of the initial steps, even though the plans had you using it all the time. The one I bought was crappy and the sharpening guide I bought didn’t fit it, so sharpening was hard. So I used the jig saw / belt sander for most things (cutting down to close, using sander for the rest), and for narrowing the mast pieces which I used the router. For making the foils, however, I ended up using the hand plane for the leading edge. For the trailing edge, I used an electric hand plane, but to get the curve on the leading edge, even the not great hand plane worked much better, with a sander used to clean it up. And then for rounding the yard and shaping the oars, I used it, crappy as it was (lots of tear-out cleaned up by sanding), a LOT.
+ Note: I ended up not using the hand plane for any of the initial
+steps, even though the plans had you using it all the time. The one I
+bought was crappy and the sharpening guide I bought didn’t fit it, so
+sharpening was hard. So I used the jig saw / belt sander for most things
+(cutting down to close, using sander for the rest), and for narrowing
+the mast pieces which I used the router. For making the foils, however,
+I ended up using the hand plane for the leading edge. For the trailing
+edge, I used an electric hand plane, but to get the curve on the leading
+edge, even the not great hand plane worked much better, with a sander
+used to clean it up. And then for rounding the yard and shaping the
+oars, I used it, crappy as it was (lots of tear-out cleaned up by
+sanding), a LOT.
Cost
@@ -110,7 +168,9 @@
Duckworks
- Fiberglass tape, cloth, wood flour, sail tape, thread, rigging hardware, 3 gallons of marinepoxy, two 6” deck plates (and over $50 shipping!)
+ Fiberglass tape, cloth, wood flour, sail tape, thread, rigging
+hardware, 3 gallons of marinepoxy, two 6” deck plates (and over $50
+shipping!)
@@ -132,7 +192,8 @@
Amazon
- Topside marine primer, paint (white & red), non-stick additive
+ Topside marine primer, paint (white & red), non-stick
+additive
- Plastic drop cloth, disposable gloves, sand paper (belt & discs), rollers (pant & adhesive), brushes, tack cloth, silicone glue, etc. Some of these weren’t used up.
+ Plastic drop cloth, disposable gloves, sand paper (belt &
+discs), rollers (pant & adhesive), brushes, tack cloth, silicone
+glue, etc. Some of these weren’t used up.
- This was quite a bit more than I was expecting (which, based on things I had read, made me think it’d be about $500). Part of that is probably that I got marine paint, which is expensive, vs. regular outdoor house paint (which probably would have been fine, and probably would have saved ~$80), but also not thinking about all the disposable stuff (brushes, rollers, drop cloths, gloves) which, on it’s own isn’t expensive, but adds up. Finally, the rigging stuff, deck hatches, and rudder hardware is not cheap ($51 for rope & blocks, $35 for rudder stuff, $20 for two 6” hatches)! Those things account for about $300, which combined with probably paying more for lumber than strictly necessary (I got high quality 5/4ths stuff for the foils, which was not cheap, and I probably could have just gotten more 2x4s and ripped them. The plywood was just under $100, and there really wasn’t that much other lumber necessary) and a lot of miscellaneous things (like $8.65 for seam tape for the sail, $5 for high quality thread, etc) account for the “extra”.
+ This was quite a bit more than I was expecting (which, based on
+things I had read, made me think it’d be about $500). Part of that is
+probably that I got marine paint, which is expensive, vs. regular
+outdoor house paint (which probably would have been fine, and probably
+would have saved ~$80), but also not thinking about all the disposable
+stuff (brushes, rollers, drop cloths, gloves) which, on it’s own isn’t
+expensive, but adds up. Finally, the rigging stuff, deck hatches, and
+rudder hardware is not cheap ($51 for rope & blocks, $35 for rudder
+stuff, $20 for two 6” hatches)! Those things account for about $300,
+which combined with probably paying more for lumber than strictly
+necessary (I got high quality 5/4ths stuff for the foils, which was not
+cheap, and I probably could have just gotten more 2x4s and ripped them.
+The plywood was just under $100, and there really wasn’t that much other
+lumber necessary) and a lot of miscellaneous things (like $8.65 for seam
+tape for the sail, $5 for high quality thread, etc) account for the
+“extra”.
Extra cost
- The initial paint job I did both didn’t come out well (I think it was way too hot when I painted it, especially the top, which I did outside in the sun!), and I realized that the color on top really didn’t look right. So I decided to scrape/sand off the paint and repaint it. Since this was turning into a much longer term project, I decided to spend more time researching and decided to paint it with old-school marine paint from the local shop Kirby paints (which has been operating continuously since 1846). It’s a bit more expensive than the original stuff I got, but the colors are a lot nicer. Getting a couple quarts, plus thinner, and some brushes was about another $100.
+ The initial paint job I did both didn’t come out well (I think it was
+way too hot when I painted it, especially the top, which I did outside
+in the sun!), and I realized that the color on top really didn’t look
+right. So I decided to scrape/sand off the paint and repaint it. Since
+this was turning into a much longer term project, I decided to spend
+more time researching and decided to paint it with old-school marine
+paint from the local shop Kirby paints (which has been operating
+continuously since 1846). It’s a bit more expensive than the original
+stuff I got, but the colors are a lot nicer. Getting a couple quarts,
+plus thinner, and some brushes was about another $100.
- 2017/8/1 (6.5h) 10:30am-5pm cutting first side, various rectangular
+ 2017/8/1 (6.5h) 10:30am-5pm cutting first side,
+various rectangular
- 2017/8/2 (7h) 9:30am-2pm finish cutting main pieces, start sanding sides to be identical 4pm-6:30pm finish sides, cut out front bulkhead
+ 2017/8/2 (7h) 9:30am-2pm finish cutting main
+pieces, start sanding sides to be identical 4pm-6:30pm finish sides, cut
+out front bulkhead
- 2017/8/3 (8h) 10am-6pm epoxy and attach frames to bulkheads and sides
+ 2017/8/3 (8h) 10am-6pm epoxy and attach frames to
+bulkheads and sides
- 2017/8/4 (5.5h) 11:30am-5pm epoxying reverse sides, building & epoxying inside of leeboard case
+ 2017/8/4 (5.5h) 11:30am-5pm epoxying reverse sides,
+building & epoxying inside of leeboard case
- 2017/8/6 (2h) 1:45pm-3:45 sand sides/bulkheads, glue together
+ 2017/8/6 (2h) 1:45pm-3:45 sand sides/bulkheads,
+glue together
- 2017/8/7 (7.75h) 8:30am-4:15pm mast partner and step
+ 2017/8/7 (7.75h) 8:30am-4:15pm mast partner and
+step
- 2017/8/8 (7h) 11:30am-6:30pm put in leecase and put on bottom
+ 2017/8/8 (7h) 11:30am-6:30pm put in leecase and put
+on bottom
- 2018/5/25 (1.75hr) 8:30am-10:15am, 2pm-5pm cut leeboard holes, sand whole boat, sand next to leeboard, prep for glassing, three coats of epoxy on leeboard edge glass, epoxy on various wood, finish scraping and redo fillets that were bad, measure and cut sail
+ 2018/5/25 (1.75hr) 8:30am-10:15am, 2pm-5pm cut
+leeboard holes, sand whole boat, sand next to leeboard, prep for
+glassing, three coats of epoxy on leeboard edge glass, epoxy on various
+wood, finish scraping and redo fillets that were bad, measure and cut
+sail
- 2018/5/26 (6hr) 10am-12pm, 1pm-2pm, 3pm-6pm another coat on leeboard edge, fill gap between case and hull, cut patches for sail, tape on sail patches,
+ 2018/5/26 (6hr) 10am-12pm, 1pm-2pm, 3pm-6pm another
+coat on leeboard edge, fill gap between case and hull, cut patches for
+sail, tape on sail patches,
- 2018/5/27 (3.75hr) 9:30am-12pm, 12:45pm-2pm trim overhanging side tank benches, sewing sewing sewing finally finishing entire sail, adding grommets to sail
+ 2018/5/27 (3.75hr) 9:30am-12pm, 12:45pm-2pm trim
+overhanging side tank benches, sewing sewing sewing finally finishing
+entire sail, adding grommets to sail
- 2018/7/18 (1hr) 7pm-8pm plane foil blank to 19mm (as my centerboard case is only 22mm! Oops!)
+ 2018/7/18 (1hr) 7pm-8pm plane foil blank to 19mm
+(as my centerboard case is only 22mm! Oops!)
- 2018/8/5 (0.75hr) 5:45-6:30 scrape / sand off old paint
+ 2018/8/5 (0.75hr) 5:45-6:30 scrape / sand off old
+paint
2018/8/6 (0.5hr) 8:45-9:15 scrape old paint
- 2018/8/8 (1hr) 5:30-6:30 scrape paint, rip 1x4 in half for yard
+ 2018/8/8 (1hr) 5:30-6:30 scrape paint, rip 1x4 in
+half for yard
- 2018/8/9 (3.25hr) 5-6pm, 7pm-9:15pm cut glass for foils and glass tips of foils, finish scraping / sanding bottom, scrape floor
+ 2018/8/9 (3.25hr) 5-6pm, 7pm-9:15pm cut glass for
+foils and glass tips of foils, finish scraping / sanding bottom, scrape
+floor
- 2018/8/10 (3.5hr) 9:45am-11:15am, 3-4:30, 6:15-6:45 another fill on foil tips, install handles, glass and epoxy mast, add bow eye
+ 2018/8/10 (3.5hr) 9:45am-11:15am, 3-4:30, 6:15-6:45
+another fill on foil tips, install handles, glass and epoxy mast, add
+bow eye
- 2018/8/11 (1.25hr) 12-1, 8:15-8:30 sand foil tips, glass w first coat epoxy one side, second coat epoxy mast, second epoxy on foils, third on mast
+ 2018/8/11 (1.25hr) 12-1, 8:15-8:30 sand foil tips,
+glass w first coat epoxy one side, second coat epoxy mast, second epoxy
+on foils, third on mast
- 2018/8/12 (0.5hr) 2:30-2:45, 5:15-5:30 third touch up coat on foils, glue yard pieces together
+ 2018/8/12 (0.5hr) 2:30-2:45, 5:15-5:30 third touch
+up coat on foils, glue yard pieces together
- 2018/8/13 (1hr) 8:15am-8:45am, 6:00pm-6:30pm, sand centerboard, cut glass, start sanding mast, first coat other side foils
+ 2018/8/13 (1hr) 8:15am-8:45am, 6:00pm-6:30pm, sand
+centerboard, cut glass, start sanding mast, first coat other side
+foils
- 2018/8/14 (1.5hr) 9am-10:30am finish sanding hull, second coat of epoxy on foils
+ 2018/8/14 (1.5hr) 9am-10:30am finish sanding hull,
+second coat of epoxy on foils
- 2018/8/15 (2.5hr) 6am-8:30am paint bottom of boat
+ 2018/8/15 (2.5hr) 6am-8:30am paint bottom of
+boat
- 2018/8/28 (2.75hr) 8am-8:45am, 5:45pm-7:00pm, 7:30-8:15pm finish shaping oats and first coat of 50% dilute varnish, glue rudder together, drill holes in spars, fit mast to boat
+ 2018/8/28 (2.75hr) 8am-8:45am, 5:45pm-7:00pm,
+7:30-8:15pm finish shaping oats and first coat of 50% dilute varnish,
+glue rudder together, drill holes in spars, fit mast to boat
- 2018/8/30 (3.25hr) 8:45am-10am, 6:45pm-8:45pm install padlocks, deckeye, glue together rudderbox w framing and tiller, tie sail to spars, cut bottom of mast, epoxy rudder&box, mast partner, mast bottom, test hull for leaks, build rowing seat
+ 2018/8/30 (3.25hr) 8:45am-10am, 6:45pm-8:45pm
+install padlocks, deckeye, glue together rudderbox w framing and tiller,
+tie sail to spars, cut bottom of mast, epoxy rudder&box, mast
+partner, mast bottom, test hull for leaks, build rowing seat
- 2018/8/31 (2hr) 8:45am-9am, 7pm-8:45pm epoxy mast partner, mast bottom, rudder box, patch leak on outside, work on installing rudder hardware
+ 2018/8/31 (2hr) 8:45am-9am, 7pm-8:45pm epoxy mast
+partner, mast bottom, rudder box, patch leak on outside, work on
+installing rudder hardware
- 2018/9/1 (1.75hr) 2:15pm-3:00pm, 4:30pm-5:30pm finish rudder hardware, work on rigging
+ 2018/9/1 (1.75hr) 2:15pm-3:00pm, 4:30pm-5:30pm
+finish rudder hardware, work on rigging
- Getting all the lumber, post stripping it with a table saw my dad had. Without access to a table saw and someone who knows how to use it, I don’t think this project would be possible – the dimensions of lumber needed are not things that are available standard. And, even if they were, they would probably be so much more expensive. For example, I got 12” wide pine planks that were then ripped to get the 3/4” by 3/4” strips, the 3/4” by 1 3/4”, etc.
+ Getting all the lumber, post
+stripping it with a table saw my dad had. Without access to a table saw
+and someone who knows how to use it, I don’t think this project would be
+possible – the dimensions of lumber needed are not things that
+are available standard. And, even if they were, they would probably be
+so much more expensive. For example, I got 12” wide pine planks that
+were then ripped to get the 3/4” by 3/4” strips, the 3/4” by 1 3/4”,
+etc.
- Marking side panels (first mistake is present in this photo – third and possibly fourth clamp are not in the right place, and the flexible wood batten was so flexible that I was able to make the shape. The bottom is supposed to be a smooth curve! All other panels marked to match this one, replicating the mistake.)
+ Marking side panels (first
+mistake is present in this photo – third and possibly fourth clamp are
+not in the right place, and the flexible wood batten was so flexible
+that I was able to make the shape. The bottom is supposed to be a smooth
+curve! All other panels marked to match this one, replicating the
+mistake.)
@@ -415,7 +579,9 @@
- Sanding all side panels to be identical. This was supposed to be done with a plane, but I couldn’t get that to work. The sander worked though!
+ Sanding all side panels to be
+identical. This was supposed to be done with a plane, but I couldn’t get
+that to work. The sander worked though!
- Boat is 3D! No bottom yet though.
+ Boat is 3D! No bottom yet
+though.
- After long and hard day, added mast step / partner, epoxied bottom and with help of dad (this would not have been possible alone, as we had to wrench it into shape and then put in screws to hold it), attached bottom (involving a bit of work to get the boat square, and then a lot more work to get the bottom to attach to the sides due to the mistake shaping the bottom; had to add more trim and screw through the bottom to get it to pull up to side panels.)
+ After long and hard day, added
+mast step / partner, epoxied bottom and with help of dad (this
+would not have been possible alone, as we had to wrench it into shape
+and then put in screws to hold it), attached bottom (involving
+a bit of work to get the boat square, and then a lot more work to get
+the bottom to attach to the sides due to the mistake shaping the bottom;
+had to add more trim and screw through the bottom to get it to pull up
+to side panels.)
@@ -451,11 +628,16 @@
- Adding fiberglass tape to seams, epoxying bottom of boat.
+ Adding fiberglass tape to
+seams, epoxying bottom of boat.
- Scarfing mast pieces together and cutting to length. (Though, not pictured here I narrowed them with a router, and messed up the narrowest part, so I think I’m going to switch to a lug sail which requires shorter masts, and thus I can cut off the mistake!)
+ Scarfing mast pieces together
+and cutting to length. (Though, not pictured here I narrowed them with a
+router, and messed up the narrowest part, so I think I’m going to switch
+to a lug sail which requires shorter masts, and thus I can cut off the
+mistake!)
@@ -463,11 +645,15 @@
- Painted & flipped the boat (it’s gotten heavy! Problem with getting plywood from a local lumberyard is that thinnest they had was 1/4”, and I’m sure it’s not the lightest stuff!)
+ Painted & flipped the boat
+(it’s gotten heavy! Problem with getting plywood from a local lumberyard
+is that thinnest they had was 1/4”, and I’m sure it’s not the lightest
+stuff!)
- Moved outside to paint top.
+ Moved outside to paint
+top.
@@ -479,27 +665,50 @@
- Some really crappy paddles made out of scrap ply, extra 3/4” square with some epoxy added and fiberglass tape wrapped around handle (though I was lazy and only did a single coat of epoxy, so fiberglass tape is still very present. It also hadn’t fully dried when we took it out the next day, so I wrapped duct tape around the handle and halfway down the shaft, so it wouldn’t feel sticky!)
+ Some really crappy paddles
+made out of scrap ply, extra 3/4” square with some epoxy added and
+fiberglass tape wrapped around handle (though I was lazy and only did a
+single coat of epoxy, so fiberglass tape is still very present. It also
+hadn’t fully dried when we took it out the next day, so I wrapped duct
+tape around the handle and halfway down the shaft, so it wouldn’t feel
+sticky!)
- Testing the hull out. Found a minor leak in the left side tank (I hadn’t cut the leeboard slot yet, so it wasn’t that). It ended up being at the end.
+ Testing the hull out. Found a
+minor leak in the left side tank (I hadn’t cut the leeboard slot yet, so
+it wasn’t that). It ended up being at the end.
- Cut top of leeboard slot, and added fiberglass along edge.
+ Cut top of leeboard slot, and
+added fiberglass along edge.
- Cut bottom of leeboard slot. I noticed what looked like slight gaps at some points around the leeboard case. I’m not sure if they go all the way through to the tank, but I added some thickened epoxy. I’ll have to test the watertightness by dumping water into the tank and see if any comes out!
+ Cut bottom of leeboard slot. I
+noticed what looked like slight gaps at some points around the leeboard
+case. I’m not sure if they go all the way through to the tank, but I
+added some thickened epoxy. I’ll have to test the watertightness by
+dumping water into the tank and see if any comes out!
- Sewing the sail. This took a long time and a lot of sewing! But the result seemed to come out pretty well, modulo some mistakes (i.e., the tall reinforcing panel that runs most of the way through this photo should have gone higher so the curve at the top hit the top edge of the sail a bit higher than it did).
+ Sewing the sail. This took a
+long time and a lot of sewing! But the result seemed to come
+out pretty well, modulo some mistakes (i.e., the tall reinforcing panel
+that runs most of the way through this photo should have gone higher so
+the curve at the top hit the top edge of the sail a bit higher than it
+did).
- Planing foils. This would have been much easier if my hand plane was better, but I made do by using it on the leading edge (just for the actual curve, which had very narrow shavings that it did better on) and the electric hand planer on the rest, and on the trailing edge. They probably aren’t perfect, but they look pretty good!
+ Planing foils. This would have
+been much easier if my hand plane was better, but I made do by using it
+on the leading edge (just for the actual curve, which had very narrow
+shavings that it did better on) and the electric hand planer on the
+rest, and on the trailing edge. They probably aren’t perfect, but they
+look pretty good!
- I’ve recently started working with Snap, the Haskell web framework, (http://snapframework.com), and one reason (among many) for my reason to switch from Ocsigen, a web framework written in OCaml (which I’ve written posts about before) was the desire to more flexibly handle ajax based websites. While it seems good in some ways, I eventually decided that Ocsigen’s emphasis on declaring services as having certain types (ie, a fragment of a page, a whole page, a redirect, etc) is in some ways at odds with the way the web works.
-
-
- After starting to work in Haskell again, and with the Snap team authored templating system Heist, I immediately began looking for ways to work with ajax content more flexibly than I had been doing before. Inspired by the work of Facebook on Primer (provided to the world at https://gist.github.com/376039 ), which is their base-line system for dynamic content - basically, event listeners waiting for onclick events on links that have a special attribute that says it should perform an ajax request, and event listeners for onsubmit events on forms that have a special attribute that indicates the forms should be serialized and submitted asynchronously. But even more interesting than that (to me) was the other half of their system (not, I believe, public, and regardless, written in PHP), which is that the server side response decides what client side div’s it should replace.
-
-
- At first that sounds a little dirty - it basically entails mixing (conceptually) server code and client code. But then it allows a different sort of methodology - that even with client side modifications, it is the server that ultimately has all control - including what to replace on the client. This is a fascinating idea, because clientside code is notoriously limited be being written in javascript (or with javascript libraries), and thinking about having to maintain clientside and serverside code seems to be a much dirtier solution than having the server, in short, control the client.
-
-
- Taking this idea, and bringing it into the world of Heist, which is (in my opinion) a fantastic templating system (more info at http://snapframework.com/docs/tutorials/heist ), ended up being quite straightforward, as Heist lends itself to the idea of extending the syntax of html, much like the facebook primer system did.
-
-
- At first I thought that there should be haskell code that would specify things like “replaceDivsWithSplices …” where div’s would be identified and corresponding splices (things that can be inserted into heist templates) would replace them, and then “replaceDivsWithTemplates”, etc, but the whole solution seemed a little off.
-
-
- And then I realized that the entire idea could be summed up with a single tag: “div-async”. The idea would be, this would be a special div that could foreseeably be replaced by an asychronous response. A template would have many divs that were marked this way, which in a non-async response would do nothing special, but when an async response came back, all div-async’s would replace corresponding tags on the page.
-
-
- The only things that remained were the two tags to start the async requests, which I named “a-async” and “form-async”, and a little javascript to make the moving parts work together. And so, heist-async was born. (for the impatient, the code exists at https://github.com/dbp/heist-async , and while I am using this code currently and it seems to work, it could change significantly as things are worked out)
-
-
- The basics of how this works should be obvious, but I can illustrate a basic example. On a page you have an announcements box. You want the user to be able to click a button and have the announcements box reload without reloading the whole page (new announcements may have occurred). So you have a page template that looks like this:
+ I’ve recently started working with Snap, the Haskell web framework,
+(http://snapframework.com), and one reason (among many) for my reason to
+switch from Ocsigen, a web framework written in OCaml (which I’ve
+written posts about before) was the desire to more flexibly handle ajax
+based websites. While it seems good in some ways, I eventually decided
+that Ocsigen’s emphasis on declaring services as having certain types
+(ie, a fragment of a page, a whole page, a redirect, etc) is in some
+ways at odds with the way the web works.
+
+
+ After starting to work in Haskell again, and with the Snap team
+authored templating system Heist, I immediately began looking for ways
+to work with ajax content more flexibly than I had been doing before.
+Inspired by the work of Facebook on Primer (provided to the world at
+https://gist.github.com/376039 ), which is their base-line system for
+dynamic content - basically, event listeners waiting for onclick events
+on links that have a special attribute that says it should perform an
+ajax request, and event listeners for onsubmit events on forms that have
+a special attribute that indicates the forms should be serialized and
+submitted asynchronously. But even more interesting than that (to me)
+was the other half of their system (not, I believe, public, and
+regardless, written in PHP), which is that the server side response
+decides what client side div’s it should replace.
+
+
+ At first that sounds a little dirty - it basically entails mixing
+(conceptually) server code and client code. But then it allows a
+different sort of methodology - that even with client side
+modifications, it is the server that ultimately has all control -
+including what to replace on the client. This is a fascinating idea,
+because clientside code is notoriously limited be being written in
+javascript (or with javascript libraries), and thinking about having to
+maintain clientside and serverside code seems to be a much dirtier
+solution than having the server, in short, control the client.
+
+
+ Taking this idea, and bringing it into the world of Heist, which is
+(in my opinion) a fantastic templating system (more info at
+http://snapframework.com/docs/tutorials/heist ), ended up being quite
+straightforward, as Heist lends itself to the idea of extending the
+syntax of html, much like the facebook primer system did.
+
+
+ At first I thought that there should be haskell code that would
+specify things like “replaceDivsWithSplices …” where div’s would be
+identified and corresponding splices (things that can be inserted into
+heist templates) would replace them, and then
+“replaceDivsWithTemplates”, etc, but the whole solution seemed a little
+off.
+
+
+ And then I realized that the entire idea could be summed up with a
+single tag: “div-async”. The idea would be, this would be a special div
+that could foreseeably be replaced by an asychronous response. A
+template would have many divs that were marked this way, which in a
+non-async response would do nothing special, but when an async response
+came back, all div-async’s would replace corresponding tags on the
+page.
+
+
+ The only things that remained were the two tags to start the async
+requests, which I named “a-async” and “form-async”, and a little
+javascript to make the moving parts work together. And so, heist-async
+was born. (for the impatient, the code exists at
+https://github.com/dbp/heist-async , and while I am using this code
+currently and it seems to work, it could change significantly as things
+are worked out)
+
+
+ The basics of how this works should be obvious, but I can illustrate
+a basic example. On a page you have an announcements box. You want the
+user to be able to click a button and have the announcements box reload
+without reloading the whole page (new announcements may have occurred).
+So you have a page template that looks like this:
- Now to glue this together, all you need to do is serve the original page (with the proper splice set so that the
+ Now to glue this together, all you need to do is serve the original
+page (with the proper splice set so that the
- tag actually works), and, at the /recent_announcements url, you just serve the announcements template. Since it is the exact same template, it obviously has the same identifier for the div-async (which is just the attribute “name”), and will therefore replace the current anouncements box with the recently loaded one.
+ tag
+actually works), and, at the /recent_announcements url, you just serve
+the announcements template. Since it is the exact same template, it
+obviously has the same identifier for the div-async (which is just the
+attribute “name”), and will therefore replace the current anouncements
+box with the recently loaded one.
- Now that is pretty cool - what it means is that you can have one set of templating code, and the only change you need to do is separate any parts you want to be able to load asynchronously into separate templates, and make sure there is a div-async wrapper around it. (NOTE: since I didn’t mention it before, it might be helpful to now - div-async is just a regular div, so you can set all the regular things, like id, class, etc. Also feel free to take existing div’s and just add -async and set a name).
+ Now that is pretty cool - what it means is that you can have one set
+of templating code, and the only change you need to do is separate any
+parts you want to be able to load asynchronously into separate
+templates, and make sure there is a div-async wrapper around it. (NOTE:
+since I didn’t mention it before, it might be helpful to now - div-async
+is just a regular div, so you can set all the regular things, like id,
+class, etc. Also feel free to take existing div’s and just add -async
+and set a name).
- At this point, I was pretty happy with this, and thought it was working pretty well, but of course the real world is much more complicated, and not everything is so simple - sometimes a single asynchronous request should mean a lot of different things on a page should change. In this case, it is possible that the simple template inheritance will not work, but with the addition of a template that is just for the response, that includes all the templates that should be updated, it seems to work pretty well. An example of one of these could be:
+ At this point, I was pretty happy with this, and thought it was
+working pretty well, but of course the real world is much more
+complicated, and not everything is so simple - sometimes a single
+asynchronous request should mean a lot of different things on a page
+should change. In this case, it is possible that the simple template
+inheritance will not work, but with the addition of a template that is
+just for the response, that includes all the templates that should be
+updated, it seems to work pretty well. An example of one of these could
+be:
- In this case, there is still no duplication of formatting code, all that exists now is an explicit list of all the parts of the page that should be replaced by a given request.
+ In this case, there is still no duplication of formatting code, all
+that exists now is an explicit list of all the parts of the page that
+should be replaced by a given request.
Other common things; to hide an element, sending back:
- Should work. You could also put some empty placeholder div’s like that on a page, and later replace them with ones with actual content.
+ Should work. You could also put some empty placeholder div’s like
+that on a page, and later replace them with ones with actual
+content.
- What I noticed about this is that it makes dynamic page changes very explicit in the templates, which I think is a very good thing - and certainly makes it easier to reason about page changes.
+ What I noticed about this is that it makes dynamic page changes very
+explicit in the templates, which I think is a very good thing - and
+certainly makes it easier to reason about page changes.
- Getting to this point, I started using this to implement a bunch of parts of a new site I’m working on, and I was happily impressed by how it all seemed to be working. Using this, it seems like ajax can be thought of as just an aspect of the templating system - describe what should be replaced, and it will be, without ever having to worry about the clientside code (which is 12k of lightweight libraries and 60 significant lines of code of custom javascript. The 60 lines should easily be able to be translated to depend on common javascript libraries like jQuery, I just didn’t want to make that a requirement).
+ Getting to this point, I started using this to implement a bunch of
+parts of a new site I’m working on, and I was happily impressed by how
+it all seemed to be working. Using this, it seems like ajax can be
+thought of as just an aspect of the templating system - describe what
+should be replaced, and it will be, without ever having to worry about
+the clientside code (which is 12k of lightweight libraries and 60
+significant lines of code of custom javascript. The 60 lines should
+easily be able to be translated to depend on common javascript libraries
+like jQuery, I just didn’t want to make that a requirement).
- I’m interested in feedback on the library, and ways that it can be improved. It is still very early software (a week ago, it did not exist), but it is something that I’ve found very powerful, and I’m kind of interested in where it can be taken / what people think about it.
+ I’m interested in feedback on the library, and ways that it can be
+improved. It is still very early software (a week ago, it did not
+exist), but it is something that I’ve found very powerful, and I’m kind
+of interested in where it can be taken / what people think about it.
- Mercury tidbits - dependent types and file io
+ Mercury tidbits -
+dependent types and file io
- Note: this was originally posted as two separate parts, 1 week apart, and has been compressed for posterity
+ Note: this was originally posted as two separate parts, 1 week
+apart, and has been compressed for posterity
- I just started learning a functional/logic language called Mercury, which has features that make it feel (at least to my initial impressions) like a mix between Prolog and Haskell. It has all the features that make it a viable Prolog, but it also adds static typing (with full type inference) and purity (all side effects are dealt with by passing around the state of the world). Since I recently was interested in learning Prolog, but had no desire to give up static typing or purity, Mercury seemed like a neat thing to learn.
+ I just started learning a functional/logic language called Mercury, which has features
+that make it feel (at least to my initial impressions) like a mix
+between Prolog and Haskell. It has all the features that make it a
+viable Prolog, but it also adds static typing (with full type inference)
+and purity (all side effects are dealt with by passing around the state
+of the world). Since I recently was interested in learning Prolog, but
+had no desire to give up static typing or purity, Mercury seemed like a
+neat thing to learn.
- While it is not very well known, the language has been around for over 15 years, and has a high quality self-hosting compiler.
+ While it is not very well known, the language has been around for
+over 15 years, and has a high quality self-hosting compiler.
- Getting to play around with logic/declarative programming is interesting (and indeed the main reason why I’m interested in learning it), but what seems even more interesting with Mercury is how they have incorporated typing to the logic programming (which, unless I’m mistaken, is a new thing). As a tiny code example:
+ Getting to play around with logic/declarative programming is
+interesting (and indeed the main reason why I’m interested in learning
+it), but what seems even more interesting with Mercury is how they have
+incorporated typing to the logic programming (which, unless I’m
+mistaken, is a new thing). As a tiny code example:
:- pred head(list(T), T).
:- mode head(in, out) is semidet.
:- mode head(in(non_empty_list), out) is det.
head(Xs, X) :- Xs = [X | _].
- The first line says that this is a predicate (logic statement) that has two parts, the first is a list of some type T (it is polymorphic), the second is an item of type T.
+ The first line says that this is a predicate (logic statement) that
+has two parts, the first is a list of some type T (it is polymorphic),
+the second is an item of type T.
- The fourth line should be familiar to a prolog programmer, but briefly, the right side says that Xs is defined as X cons’d to an unnamed element. head can be seen as defining a relationship between Xs and X, where the specifics are that Xs is a list that has as it’s first element X.
+ The fourth line should be familiar to a prolog programmer, but
+briefly, the right side says that Xs is defined as X cons’d to an
+unnamed element. head can be seen as defining a
+relationship between Xs and X, where the specifics are that Xs is a list
+that has as it’s first element X.
- Now with regular prolog, only the fourth line would be necessary, and that definition allows some interesting generalization. Because head([1,2,3],Y) will bind Y to 1, while head([1,2,3],1) will be true (or some truthy value), and if head(X,Y) were used in a set of other statements, together they would only yield a result if X (wherever it was bound, or unified, to a value) had as it’s first value Y, whatever Y was.
+ Now with regular prolog, only the fourth line would be necessary, and
+that definition allows some interesting generalization. Because
+head([1,2,3],Y) will bind Y to 1,
+while head([1,2,3],1) will be true (or some truthy value),
+and if head(X,Y) were used in a set of other statements,
+together they would only yield a result if X (wherever it was bound, or
+unified, to a value) had as it’s first value Y, whatever Y was.
- Since Mercury is statically typed, it adds what it calls modes to predicates, which specify whether a certain argument (that’s probably not the right word!) is going to be given, or whether it is going to be figured out by the predicate. The other thing it has is specifications about whether the predicate is deterministic. There are a couple options, but the two that are relevant to this example are det, which means fully deterministic, for every input there is exactly one output, and semidet, which means for some inputs there is an output, for others there is not (ie, the unification fails). These allow the compiler to do really interesting things, like tell you if you are not covering all of the possible cases if you declare something as det (whereas the same code, as semidet, would not cause any errors).
+ Since Mercury is statically typed, it adds what it calls modes to
+predicates, which specify whether a certain argument (that’s probably
+not the right word!) is going to be given, or whether it is going to be
+figured out by the predicate. The other thing it has is specifications
+about whether the predicate is deterministic. There are a couple
+options, but the two that are relevant to this example are
+det, which means fully deterministic, for every input there
+is exactly one output, and semidet, which means for some
+inputs there is an output, for others there is not (ie, the unification
+fails). These allow the compiler to do really interesting things, like
+tell you if you are not covering all of the possible cases if you
+declare something as det (whereas the same code, as
+semidet, would not cause any errors).
- What is fascinating about this predicate head is that it has two modes defined, one being the obvious head that we know from Haskell etc:
+ What is fascinating about this predicate head is that it has two
+modes defined, one being the obvious head that we know from Haskell
+etc:
:- mode head(in, out) is semidet.
- Which states that the first argument is the input (the list) and the second is the output (the element), and it is semidet because for an empty list it will fail. The next is more interesting:
+ Which states that the first argument is the input (the list) and the
+second is the output (the element), and it is semidet
+because for an empty list it will fail. The next is more
+interesting:
:- mode head(in(non_empty_list), out) is det.
- This says for an input that is a non_empty_list (defined in the standard libraries, and included below), the second argument is the output, and this is det, ie fully deterministic. What this basically means is that failure is incorporated into the type system, because something that is semidet can fail, but something that is det cannot (neat!). Now the standard modes are defined (something like):
+ This says for an input that is a non_empty_list (defined in the
+standard libraries, and included below), the second argument is the
+output, and this is det, ie fully deterministic. What this
+basically means is that failure is incorporated into the type system,
+because something that is semidet can fail, but something
+that is det cannot (neat!). Now the standard modes are
+defined (something like):
:- mode in == (ground >> ground).
:- mode out == (free >> ground).
- Ground is a something that is bound, and the >> is showing what is happening before and after the unification (the analog to function application). So something of mode in will be bound before and after, whereas something of mode out will not be bound before (that’s what free means) and it will be bound afterwards. That’s pretty straightforward.
+ Ground is a something that is bound, and the >> is
+showing what is happening before and after the unification (the analog
+to function application). So something of mode in will be
+bound before and after, whereas something of mode out will
+not be bound before (that’s what free means) and it will be
+bound afterwards. That’s pretty straightforward.
- What get’s more interesting is something like non_empty_list, where inst stands for instantiation state, ie one of various states that a variable can be in (with ground and free being the most obvious ones):
+ What get’s more interesting is something like
+non_empty_list, where inst stands for
+instantiation state, ie one of various states that a variable can be in
+(with ground and free being the most obvious ones):
- What this means is that a non_empty_list is defined as one that has a ground element cons’d to another ground element. (I don’t know the syntax well enough to explain what bound means in this context, but it seems straightforward). What this should allow you to do is write programs that operate on things like non-empty-lists, and have the compiler check to make sure you are never using an empty list where you shouldn’t. Pretty cool!
+ What this means is that a non_empty_list is defined as
+one that has a ground element cons’d to another ground element. (I don’t
+know the syntax well enough to explain what bound means in
+this context, but it seems straightforward). What this should allow you
+to do is write programs that operate on things like non-empty-lists, and
+have the compiler check to make sure you are never using an empty list
+where you shouldn’t. Pretty cool!
- Obviously you can write data types in Haskell that also do not allow an empty list, like:
+ Obviously you can write data types in Haskell that also do not allow
+an empty list, like:
data NonEmptyList a = NonEmptyList a [a]
- And could build functions to convert between them and normal lists, but the fact that it is so easy to build this kind of type checking on top of existing types with Mercury is really fascinating.
+ And could build functions to convert between them and normal lists,
+but the fact that it is so easy to build this kind of type checking on
+top of existing types with Mercury is really fascinating.
- This is (obviously) just scratching the surface of Mercury (and the reason all of this stuff actually works is probably more due to the theoretical underpinnings of logic programming than anything else), but seeing the definition of head gave me enough of an ‘aha!’ moment that it seemed worth sharing.
+ This is (obviously) just scratching the surface of Mercury (and the
+reason all of this stuff actually works is probably more due to the
+theoretical underpinnings of logic programming than anything else), but
+seeing the definition of head gave me enough of an ‘aha!’
+moment that it seemed worth sharing.
- If any of this piqued your interest, all of it comes out of the (wonderful) tutorial provided at the Mercury Project Documentation page. If there are any inaccuracies (which there probably are!) send them to daniel@dbpatterson.com.
+ If any of this piqued your interest, all of it comes out of the
+(wonderful) tutorial provided at the Mercury
+Project Documentation page. If there are any inaccuracies (which
+there probably are!) send them to daniel@dbpatterson.com.
Note: this is the beginning of the second post
- The language that I’ve been learning recently is a pure (ie, side-effect free) logic/functional language named Mercury. There is a wonderful tutorial (PDF) available, which explains the basics, but beyond that, the primary documentation is the language reference (which is well written, but reasonably dense) and Mercury’s standard library reference (which is autogenerated and includes types and source comments, nothing else).
+ The language that I’ve been learning recently is a pure (ie,
+side-effect free) logic/functional language named Mercury. There is a
+wonderful tutorial
+(PDF) available, which explains the basics, but beyond that, the
+primary documentation is the language
+reference (which is well written, but reasonably dense) and
+Mercury’s standard
+library reference (which is autogenerated and includes types and
+source comments, nothing else).
- Doing I/O in a pure language is a bit of a conundrum - Haskell solved this by forcing all I/O into a special monad that keeps track of sequencing (and has a mythical state of the world that it changes each time it does something, so as not to violate referential transparency). Mercury has a simpler (though equivalent) approach - every predicate that does IO must take an world state and must give back a new world state. Old world states can not be re-used (Mercury’s mode system keep track of that), and so the state of the world is manually threaded throughout the program. A simple example would be:
+ Doing I/O in a pure language is a bit of a conundrum - Haskell solved
+this by forcing all I/O into a special monad that keeps track of
+sequencing (and has a mythical state of the world that it changes each
+time it does something, so as not to violate referential transparency).
+Mercury has a simpler (though equivalent) approach - every predicate
+that does IO must take an world state and must give back a new world
+state. Old world states can not be re-used (Mercury’s mode system keep
+track of that), and so the state of the world is manually threaded
+throughout the program. A simple example would be:
- Where the first function consumes the IO_0 state and produces IO_1 (while printing “Hello World!”) and the second function consumes IO_1 and produces IO_final (while printing a newline character).
+ Where the first function consumes the IO_0 state and
+produces IO_1 (while printing “Hello World!”) and the
+second function consumes IO_1 and produces
+IO_final (while printing a newline character).
- Of course, manually threading those could become pretty tedious, so they have a shorthand, where the same code above could be written as:
+ Of course, manually threading those could become pretty tedious, so
+they have a shorthand, where the same code above could be written
+as:
- This is just syntax sugar, and can work with any parameters that are dealt with in the same way (and naming it IO for io state is just convention). It definitely makes dealing with I/O more pleasant.
+ This is just syntax sugar, and can work with any parameters that are
+dealt with in the same way (and naming it IO for io state is just
+convention). It definitely makes dealing with I/O more pleasant.
- The task that I set was to figure out how to read in a file. This is not covered in the tutorial, and I thought it would be a simple matter of looking through the library reference for the io library. One of the first predicates looks promising:
+ The task that I set was to figure out how to read in a file. This is
+not covered in the tutorial, and I thought it would be a simple matter
+of looking through the library reference for the io
+library. One of the first predicates looks promising:
:- pred io.read_file(io.maybe_partial_res(list(char))::out,
io::di,
io::uo) is det.
- But on second thought, something seems to be missing. The second and third parameters are the world states (the type is io, the mode di stands for destructive-input, meaning the variable cannot be used again, uo means unique output, which means that no other variable in the program can have that value), and the first one is going to be the contents of the file itself. But where is the file name?
+ But on second thought, something seems to be missing. The second and
+third parameters are the world states (the type is io, the mode di
+stands for destructive-input, meaning the variable cannot be used again,
+uo means unique output, which means that no other variable in the
+program can have that value), and the first one is going to be the
+contents of the file itself. But where is the file name?
The comment provides the necessary pointer:
@@ -127,7 +232,9 @@
% Reads all the characters from the current input stream until
% eof or error.
- Hmm. So all of these functions operate on whatever the current input stream is. How do we set that? io.set_input_stream looks pretty good:
+ Hmm. So all of these functions operate on whatever the current input
+stream is. How do we set that? io.set_input_stream looks
+pretty good:
% io.set_input_stream(NewStream, OldStream, !IO):
% Changes the current input stream to the stream specified.
@@ -137,7 +244,10 @@
io.input_stream::out,
io::di, io::uo) is det.
- But even better is io.see, which will try to open a file and if successful, will set it to the current stream (the alternative is to use io.open_input and then io.set_input_stream):
+ But even better is io.see, which will try to open a file
+and if successful, will set it to the current stream (the alternative is
+to use io.open_input and then
+io.set_input_stream):
% io.see(File, Result, !IO).
% Attempts to open a file for input, and if successful,
@@ -146,7 +256,10 @@
%
:- pred io.see(string::in, io.res::out, io::di, io::uo) is det.
- With that in mind, let’s go ahead and implement a predicate to read files (much like I was expecting to find in the standard library, and what I put into a module of similar utilities I’ve started, titled, in tribute to Haskell, prelude):
+ With that in mind, let’s go ahead and implement a predicate to read
+files (much like I was expecting to find in the standard library, and
+what I put into a module of similar utilities I’ve started, titled, in
+tribute to Haskell, prelude):
:- pred prelude.read_file(string::in,
maybe(string)::out,
@@ -168,16 +281,38 @@
Contents = no
).
- To walk through what this code is doing, the type says that this is a predicate that does I/O (that’s what the last two arguments are for), that it takes in a string (the path) and give out a maybe(string), and that this whole thing is deterministic (ie, it always succeeds, which is accomplished by wrapping the failure into the return type: either yes(value) or no).
-
-
- The first line tries to open the file at the path and bind it as the current input stream. I then pattern match on the results of that - if it failed, just bind Contents (the return value) to no. Otherwise, we try to read the contents out of the file and then close the file and set the input stream to the default one again (that is what the predicate io.seen does). Similarly we handle (well, really don’t handle, at least not well) reading the file failing. If it succeeds, we set the return type to the contents of the file.
-
-
- What is interesting about this code is that while it is written in the form of logical statements, it feels very much like the way one does I/O in Haskell - probably a bit of that is my own bias (as a Haskell programmer, I am likely to write everything like I would write Haskell code, kind of how my python code always ends up with lambda’s and maps in it), but it also is probably a function of the fact that doing I/O in a statically type pure language is going to always be pretty similar - lots of dealing with error conditions, and not much else!
-
-
- Anyhow, this was just a tiny bit of code, but it is a predicate that is immediately useful, especially when trying to use Mercury for random scripting tasks (what I often do with new languages, regardless of their reputed ability for scripting).
+ To walk through what this code is doing, the type says that this is a
+predicate that does I/O (that’s what the last two arguments are for),
+that it takes in a string (the path) and give out a maybe(string), and
+that this whole thing is deterministic (ie, it always succeeds, which is
+accomplished by wrapping the failure into the return type: either
+yes(value) or no).
+
+
+ The first line tries to open the file at the path and bind it as the
+current input stream. I then pattern match on the results of that - if
+it failed, just bind Contents (the return value) to no. Otherwise, we
+try to read the contents out of the file and then close the file and set
+the input stream to the default one again (that is what the predicate
+io.seen does). Similarly we handle (well, really don’t handle, at least
+not well) reading the file failing. If it succeeds, we set the return
+type to the contents of the file.
+
+
+ What is interesting about this code is that while it is written in
+the form of logical statements, it feels very much like the way one does
+I/O in Haskell - probably a bit of that is my own bias (as a Haskell
+programmer, I am likely to write everything like I would write Haskell
+code, kind of how my python code always ends up with lambda’s and maps
+in it), but it also is probably a function of the fact that doing I/O in
+a statically type pure language is going to always be pretty similar -
+lots of dealing with error conditions, and not much else!
+
+
+ Anyhow, this was just a tiny bit of code, but it is a predicate that
+is immediately useful, especially when trying to use Mercury for random
+scripting tasks (what I often do with new languages, regardless of their
+reputed ability for scripting).