You are viewing dmoonfire

Why I chose the desert

Ocean Cuddle
I’m in an interesting place when it comes to writing. Sand and Blood is out the door, Ash is going through beta readers, and Bone is winding its way through the writing group. There is a lot of waiting at this point, which means I start having conversations in my head as I mull over questions various friends have asked me.

Let’s start with the biggest one. Why did I set Blood in the desert?

Ged

Three years ago, I had read an interesting article in Slate by Ursula K. Le Guin, one of my literary crushes. One of the biggest points is that Ged is not white but she didn’t make a big deal about it when she wrote it.

Of course, when they made a movie out of it (two actually), they made Ged white and then she had to say something.

It was something I never thought about. I never assigned a race to Ged, he was just a character to me. But, maybe I was assuming he was white because I’m white? I can’t really tell anymore, but I almost wished someone asked me before I read that article.

WisCon

A few months later, I went to my first WisCon. It was an interesting experience, to say the least, but that Slate article came back when I saw all the panels of race and writing. So, as one who enjoys learning new things, I decided to attend a few of them and see if there was something more.

Things changed on the second day as I was sitting in the front row. The panel was about integrating racial characters in stories. One of the earlier topics pointed out that most authors don’t strongly identify the race of their characters. They make an assumption that the characters have the same race as themselves.

Well, that was the point that I realized I had done the same thing. In most of my fantasy novels, I never thought about the races of the characters involved. When I did, I made the assumption they were white because I have twenty meters of books with white people on the covers. My mother’s library has three times that, all with white characters.

The rest of the topics continued without me, but I found an aspect of myself that I didn’t like. I like to think that I create a wide range of characters, from different personalities and ways of speaking. I love the contrast of violence and pacifism, the spectrum of genders, and even power plays. But, in all my writing, I had never considered that race was a spectrum of colors I could use to pain characters.

That convention also pointed out that I don’t have religion in my books either, for much of the same reasons.

Wind, Bear, and Moon

The precursor to Flight of the Scions was a novel called Wind, Bear, and Moon. I had been working on the novel for years but I always felt it was missing a spark, something that would draw readers to the story but also keep my passionate about it.

Some of it came from off-handed comments from beta readers about how the main character was bland and uninteresting (at least it wasn’t Gary Stu). The biggest conflict wasn’t one, it was just a “eh” and moving on.

I was already in the process of changing the story. The biggest change was the setting. I went from a pure fantasy world into Fedran, my steampunk-inspired fantasy world. The contrast of the early Industrial Age and the old magic was a fun one (and I thank Simon R. Green for that idea).

I had also changed the main character’s gender and purpose. A healer named Welf became a girl without magic (who would eventually be known as Kanéko). It was closer, but I still missed the spark.

The panel gave me an idea of how to find it.

Not-White

While WisCon gave me the idea for making Kanéko not-white, it also pointed out that I was probably going to do it wrong. It was a common thread in more than a few conversations I heard. I was male, so I shouldn’t write females. I’m white, so I can’t write blacks. Not everyone agreed but it came up enough that I couldn’t forget it.

That instilled a fear that I was going to be creating a girl in blackface. She would be nothing more than a character with a big sign that say “I’m black!” (This is kind of like saying “I have black friends!”)

I thought about it a lot before I went forward with Kanéko. The biggest drive is that the ideas I got in the panel felt right the more I worked it out in my head. Making her half-desert set up the conflict and tension that I think I needed.

It also meant I was going to do it wrong unless I built the world properly to support it.

I started with the obvious differences, those are the basic things that most people will hang on (easier to be a bigot when your focus is something obvious). I couldn’t get much paler which meant I needed darker skin. And since there isn’t mass transit in the story, darker skin meant more sun because it is a evolutionary defense trait (I still require science in my world-building). Since I already had the world planned as a Pangaea-like super-continent and the center was pretty much all desert, it didn’t take long before I turned the inhospitable desert into a thriving one.

The other reason I picked the desert instead of the already established jungles or tundras because I have almost no fantasy novels set in the desert. I had plenty of the others, but the realization that I had picked characters based on my shelves pushed me away from using other common aspects of fantasy from that same library.

Culture

Knowing that I wanted her as a half-desert girl, I needed something more than a color to build her character. I needed history and culture behind her, otherwise she becomes just a shell, a token character.

It is easy to create a culture that is backwards from society. Unfortunately, I despise those type of stories. Most of the time when television shows images of China, India, or Africa, they pick images of poverty and crowds. On bad days, it’s drought and starving folks. I know there is a lot more than that. Much like people thinking Iowa is backwards, the perception of other countries is usually less than honest.

Fantasy cultures are like that also. The barbarians are always brutal people who live in tents and beat each other with heavy sticks. Extra points for wearing leather and having lots of chest hair.

I didn’t want that. I wanted to establish a culture that was just as civilized as the “other” side. The hard part is that I didn’t have time to create thousands of pages of two cultures to write a novel. So, I sketched up a couple things for the desert in the process of Flight. It was enough to get through that novel and to submit it for publication.

The Wait

While I was waiting for Flight to eventually be rejected, I decided to do some world-building. Just a short, twenty-thousand word novella about the desert. I wanted it be brutal but still civilized, to explore why Kanéko’s father would call them barbarians but then to prove him wrong.

I started with the ideas from Flight (mostly deleted scenes) and expanded on them. The first was the rite of passage since she was going through a similar thing herself. I also added in some obscure articles I remembered from the Boy Scout Manual from thirty years before. A plot built up in my head, blossoming from the twenty thousand words to seventy thousand.

And then I had Sand and Blood.

Finding Depth

Because I focused purely on the Kyōti culture, a lot came out of Blood that will help my other novels:

A conlang named Miwāfu that started as a naming language but actually is almost usable as a language on its own.

A culture that had it’s own way of speaking and behavior. Some of it is based on Japanese but others are just a hodgepodge of ideas I built up over the years.

A political system that meshed against the coastal areas but marched to a different drummer.

An entirely different social structure based on specialized clans working with each other and with other clans instead of the “I can do everything” aspects of the more typical fantasy. This was actual built up on ideas from today’s society; the clans were effectively companies that did one thing well.

A different way of viewing magic that didn’t share the same historical roots as Flight’s. The desert gained their power filtered through spirits instead of each individual coming up with their own connection.

All that because I was terrified of being accused of creating a flat, token character just to throw race into a book. I wanted race because it interested me and it created a spark I wanted to follow. But, it had to be realistic for me which meant I had to create the world to explain it.

More importantly, I do something very similar to every character I’ve created. I love world-building. I love making interesting characters who have conflicts in their lives just as much as I love watching them crawl out of the dark holes that I shove them into.

When I first created Welf, I worked out the politics and history of the coastal area. I worked out the history of magical theory through four iterations to come up with the Crystal Spheres Method which is used by Ronamar and Meris. Somewhere, I have a rough map of the political alliances of his father, how his mother died (she was brought back to life for Kanéko), and even how people go to church (that was a recent addition). I know the toys that Welf played with and created at least two card games (Sand and Ash adds my third game).

Assumptions and Failure

I’m going to assume that I did this wrong, that I may have offended someone by even trying. But, even four novels written since that day at WisCon, it still feels right to me.

Hopefully that explains why I set Sand and Blood in a desert.

Scheduling Delays

Ocean Cuddle
These last few months have been rather stressful, but not things I normally talk about while they are happening. Because of them, however, I have to push the publication of Sand and Ash back a few months since being a “responsible” adult is apparently important at this point in my life.

The Priorities

I have a priority system that I’ve written about since before EDM was born. I left only three things on it: family, work, and writing. The three things comes from a Readers Digest I read sitting in a doctor’s waiting office, but generally it keeps me relatively focused.

The First Child

The longest running problem is that neither me nor SMWM had a will or trust fund. This is one of those things that was on the “we should really do this” list but it kept getting pushed back. Even when EDM (the oldest) was born, it was on the list. And now that BAM (the youngest) is here, it still wasn’t done.

A few months ago, I decided that it was something we couldn’t afford to let go, so I found a lawyer through a friend and went through the process of getting something drawn up.

It was also my first shell-shock when I found that I was billed in six-minute increments. But, now we have a signed will, a strange clause that I’ll write about some day, and everything is squared away. Except for paying the bill.

The Second Child

There is something about us and names. When EDM was born, all but one of the forms had his middle name correct. Social Security, on the other hand, used my first name for his middle name (in all honesty, there is only one letter difference between the two). However, it required us to go back and forth a few times to get it straightened out.

So, when BAM’s birth certificate came in, I saw a typo. Two, actually. They had my middle name wrong and my birth date. Now, these are things that I see no future need for BAM, but I have enough genealogist in my family to know that a few generations later, it would make things difficult to track us down. Also, there is a small chance that I will need it right for BAM. And it is something you can’t do in the middle of a crisis.

It started with just a notary and a lot of photograph but quick escalated into threats from lawyers (at six minute billing intervals) and four rounds with the Iowa Department of Public Health. There was also some talking about needing to get a court order and public filings, but thankfully our lawyers managed to get around that. But even that came back with a typo that I had to call to get fixed.

Last week, we got it all squared away and his certificate is correct.

Except for the lawyers, but once we get over this, we won’t need them for a while.

The Other Business

I won’t go into details, but we also got hit by a large expense over on SMWM’s side of things.

The Accident

Right on the tail end of that, we had a small accident with the car. And, like all car accidents, it pretty much nailed any chance of me using the money to get my book out. Hopefully that will be dealt with in the next week or so. It is a “preferred vendor” which means they are pushing to get it fixed now and we never see the insurance money since it will go directly to them; which is probably a good thing.

The Holidays

Looking at my income forecast, things will ease up right in time for the holidays. Which means I can’t afford to get editing done on a book, nor are the people helping me available during those last sixty days of the year.

The Last Book

Sand and Blood is going slow. I keep seeing people talking about “only” having fifty reviews I’m pretty happy at five but that doesn’t mean I can’t hope for more. I know the reason I don’t have many sales, but they are slowly increasing.

Getting the next book would help the first one, but… I can’t see how that is going to happen.

The Next Book

We have a small budget for business. SMWM has her photography business and I have my writing. The cost for editing and covers comes out of that budget, but priorities says it needs to go for the lawyers and insurance.

Priorities always win.

Because of that, I started getting beta readers to start reading the book and see if I can garner up some of the bigger details like sweeping plots. The feedback is positive, everyone has said that Ash is a far better story than Blood.

Most of the time, I’m very patient. In this case, I can feel myself chomping at the bit because I want it out. It is a fun story, I love reading it, and I can’t wait to see it in my hand. But, I have to wait. It’s the only thing I can do.

The Third Book

Sand and Bone is about half done with the third draft. I’m submitting it to writing group over the next few months. I should have it done by the end of the year which means it will be ready for beta reading in January. If things ease up, I should have it for WisCon. We’ll see.

Regardless, I’m going to push for getting Ash done and printed by WisCon. It is a good deadline, though I probably wouldn’t actually sell any copies there.

The Conclusion

Any two of those things I could have handled with our pad. But four? No, not going to happen.

Overall, I’m glad we did what we did. The legal things needed to be done just as getting the car repaired. It is disappointing, but I’d rather not break the bank in hopes of making it big.

Just keep swimming. — Dori, Finding Nemo

Reorganizing my Git writing repository

Ocean Cuddle
As some of you may know, I use Git to organize my writing. After years of accidentally overwriting a good chapter with an old one or trying to coordinate changes from two separate machines, I got into source control for writing; it worked for programming, why not my novels?

The submodule approach

Well, I’ve had a couple iterations of trying to get the “perfect” Git setup for my writing. Earlier this year, I broke apart the novels into submodules but left the bulk of my writing in the main repository (called stories). This meant I had a sand-and-blood, sand-and-ash, and sand-and-bone repository as submodules in the appropriate location of the stories repo (dmoonfire/fedran, if you are curious).

My reasons came while I was working on Sand and Blood covers. Since I checked in as I went, the size of the repository quickly became too large for my website to handle. I could download up to 50 MiB repo without too much trouble, but when it got into the 900 MiB range, I couldn’t clone the repository anymore.

I had already worked with submodules before, so I thought they would be a perfect thing for the novels. I spent a pair of nights pulling out the five current WIP novels into a submodule, mainly by cloning the repo and using various commands to carve them out. It also took a while because I have a lot of project branches (41 beyond master) which represent every work-in-progress or semi-completed work I’ve done. Pulling out binaries from every branch was a painful process to say the least.

The submodule approach worked out fairly well, but I quickly found out some of its limitations. Because of how Git implements submodules, its inevitably shows up in other branches. It also has additional work.

To give an example. Assume I’m on my sand-and-ash branch and I’m happily working in the dmoonfire/fedran/sand-and-ash directory making changes. When I’m done, I’ve committed them and pushed up.

When I got up a level, to dmoonfire/fedran, I have to do a second commit to commit the submodule’s position in the stories repository. It was a little extra work, but it kept the two isolated.

The real problem came when I switched to the sand-and-blood branch. The directory dmoonfire/fedran/sand-and-ash is still there and pointing to a repoistory (the sand-and-ash one), but I have to tell the sand-and-blood branch about it, otherwise it will show as an untracked file.

My two choices were to either add the dmoonfire/fedran/sand-and-ash directory to the .gitignore file of the sand-and-blood branch. (Okay, there are a lot of filenames in this post, sorry about that.)

The other approach is to add the submodule to the other branches so they didn’t show as changes. Which worked until I made another change to the submodule and then I had to update it on every other branch to reflect the changes.

Isolating covers instead

Last night, I got tired of jumping through the hoops of submodules. I realized the entire reason I wanted to isolate the novels was to handle the covers. So, I decided to make a covers repository instead, put it into the root of the stories working directory and then add it to the .gitignore. This means that the stories repository doesn’t officially know about the covers repository, but I can still reference it via soft links into covers.

The advantage of this approach is all the writing (actual words) are still managed in the same repository. This means when I switch branches, the stuff in sand-and-ash branch (not repo now) goes away until I go back. There isn’t any cruft that drags on between the individual branches that has nothing to do with the current branch.

It isn’t very elegant to have covers separated, but I only need covers when I’m formatting ebooks.

Losing history

One of the side effects of breaking apart the repository and pulling them back together is that I’m losing history data. I kept most of the commit histories intact, but now I can’t really do a graph of total words written over a month or time. Since I can’t tell if anyone actual read my posts when I documented them, I decided to accept that lose.

BFG

I mentioned that splitting apart the repositories was a lot of work. When I combined them back together, I was preparing myself for a lot of work. Then, I found BFG Repo Cleaner. This is a Scala (a language I don’t know) tool that works better than git filter-branch in a lot of ways.

I ended up using BFG to remove most of the cover images from the repository along with the large files. This let me trim the final stories repository from 1.9 GiB to 20 MiB. The covers repository is at a nice 419 MiB, but that is also acceptable since I use it so infrequently.

If you have to remove files, directories, or large objects from your repository, it looks like BFG is something to seriously consider.

Sand and Blood is mostly updated

Ocean Cuddle
In a recent post, I talked about a review I got from Jefferson Smith that pointed out some flaws in Sand and Blood. I’m still a bit humiliated about it, but I’ve just finished what I felt was the only action.

I had it copy edited.

Versioning

I’m really big into semantic versioning. If I was only fixing commas and missing words, the version would have been 1.0.4. However, I made two slight clarifications so the book ended up being version 1.1.0.

The biggest is making it a bit more obvious that Miwāfu names are only accented on the ultimate name. So, the clan is “Shimusògo” but it is “Shimusogo Rutejìmo.” A lot of readers thought I made a mistake by missing the accents, but it’s intentional.

There are some cases where two names are accented in the quotes of this book. If you look at who made the quote, you might notice that the person speaking is not from the desert (judging for the names).

Ebooks

I uploaded the various sites on the 19th of this month. I also found out some interesting things about changes to ebooks. It is really easy to upload changes, but Amazon and Smashwords actually deal with it differently.

After you upload to Amazon, anyone who buys a new book from that point will et the newest version. For those who already bought a copy, there is no automatic notification of the new version nor is there an ability to download the newer version. There are only two things you can do. One, individual purchasers can send an email from Amazon asking for it. Two, you can contact Amazon and tell them there is a change along with some proof. They will decide how significant the changes are and do one of the three things: nothing, silently allow updated, or inform everyone about the change.

Smashwords, on the other hand, just lists every version of the file since the point your reader bought a copy. So, for Smashwords, all you have to do is tell your readers to grab a newer version.

I’m not entirely sure about the other vendors, but those are the two bigger ebook publishers that I use.

Print

Print is harder in a lot of ways. Once I updated the PDF version, I had to order a new copy of the book. Since I once had a completely borked version because of a bad font, I actually order it and wait for it to show up instead instead of just ordering it and immediately approving the proof.

Today, I got the proof in the mail. It looked pretty good so I approved it.

However, there is no easy way to update print copies. That was actually the crux of my problem with these corrections, but I decided I’d replace any old version from someone who asked. Just send me an email at contact@moonfire.us and I can arrange for something.

Letting go

The hardest part about projects is letting go. Obviously, I didn’t do with this one, but I honestly felt that there was enough things wrong to justify fixing it.

Unless there is something critically wrong, I’m not planning on updating this again. I have too much to focus on Sand and Ash and Sand and Bone. I still want to have the entire trilogy done by WisCon.

Creating slippery maps

Ocean Cuddle
Recently, I answered a question about creating an online map of someone’s fantasy world. I mentioned slippery maps which is the generic name for maps like Google Maps or MapQuest where you can drag around the map, zoom into it, and maybe set up bookmarks.

If you just want to look at the results, head over to the website.

Now, a lot of things changed since 2006 when I last created a map. Then, I needed to create some PHP code to manage it and spent better part of a week trying to jam Google Map’s API into something that would work.

Today, things are a lot different and a lot easier to create something that looks good. It also doesn’t require a PHP host or a database to run. But, to answer the question I gave in more detail, this is a short tutorials on how to create a slippery map of a fantasy world.

Zoom Levels and Tiles

Probably the best way to understand slippery maps is to understand zoom levels. The lowest detail, highest area is zoom zero (Z0). This represents the entire world as a single 256 pixel square tile.

A zoom level starts with zero (Z0) which represents the entire world in a single tile.

Each zoom level higher doubles the image size. So Z1 is a 512 pixel square image and Z2 is a 1,024 pixel square image. Google Maps allows up to Z18 which is an image 67,108,864 pixels on a side. At that level, we can see the driveway leading into most houses but the image requires at least 16 petabytes to load into memory at once.

I don’t about you, but I’d love to have a 16 PiB RAM machine, but that isn’t going to happen. Not to mention, you’d have to download all 16 PiB to actually see it.

So, to break it into smaller parts that are easier to download, display, and manage, slippery maps use 256 pixel square tiles. Each of those images are broken down into these consistent-sized tiles which are then downloaded as the library needs it.

Since we aren’t using a full image, we have to know where in the bigger image we need to retrieve these images. And this introduces the coordinate system for slipper maps. The basic coordinate is a (z, x, y) where z is the zoom level. Both x and y are the zero-based index from the upper-left of the image.

Z0 would only have a single image (0, 0, 0). Z1 would have four: (1, 0, 0), (1, 0, 1), (1, 1, 0), and (1, 1, 1). Z2 would have sixteen and so on.

When a slippery map needs to retrieve the image, it maps the coordinate system into a URL of some sort. For example: http://ift.tt/YHsmDb.

The final component of a slippery map is a layer. This can be raster data, such as satellite or a political map. It can also be vector data, such as a map of all streets in a tile. In the above example, the layer is actually creation. There is also creation-geo which is a second raster layer that doesn’t have cities, geomancy, or boundaries on it.

The only limitation on how far you allow zooming or which layers is time. It does take a fair amount of time to create and manage tiles. The higher the acceptable zoom level, the more work and disk space is required to keep those tiles and to make them look good.

Starting points

Because the Javascript can’t create the tiles for me, and I’m not using PHP, I need to pre-render the individual tiles at all the zoom levels I need which will then be uploaded to my website.

For me, the best place to start is with a relatively large map in Mercator project.

I’m not going to use a proper Mercator projected map since I’m going to put my Exalted Map of Creation back online and I already had most of the work done. This is a flat map without projection, so most of the coordinates are hacked to get things to work.

I decided to focus on a zoom level five for the map which requires me to start with a 8,192 pixel square. Fortunately, SVG scales very well so I have a relatively sharp image at that level.

What doesn’t work is that my map of Creation isn’t square. I’m cheating and just putting black bars on the top and bottom, but I highly recommend you use a properly projected map that fills the tile completely.

I do host a full version of the map on my website (there is also z0 through z4, there is also creation-geo for maps without markers). Feel free to download or use that, or even hotlink. It’s there until I run out of bandwidth or something goes wrong.

The next step is to create 256 pixel square tiles from the image and give them a consistent name. Now, the tedious approach is to manually slice out each one and save it to the disk. For the larger map, that can take hours.

I happen to be lazy, I don’t do tedious things like this when I can find a tool to do it for me. Fortunately ImageMagick has all the tools I need. This runs under Windows (you have to double up on the % though for the DOS command prompt) also, for those who don’t use Linux.

$ convert map-z5.png -crop 256x256 -set filename:tile "x%[fx:page.x/256]y%[fx:page.y/256]" +repage +adjoin "z5/%[filename:tile].png"
$

This basically creates 1024 tile images in exalted-map/z5 where the name is xMyN.png where M and N are numbers from 0 to 31. This means that you can get a tile just from the middle by using something like exalted-map/z5/x15y15.png.

Now, if you can’t guess from the above path, I’m putting all the zoom levels above five (four through zero) in the same structure.

$ convert -scale 50% map-z5.png map-z4.png
$ convert map-z4.png -crop 256x256 -set filename:tile "x%[fx:page.x/256]y%[fx:page.y/256]" +repage +adjoin "z4/%[filename:tile].png"
$

This is all in a makefile so I can just type make and have it generate all six zoom levels in a single command. Now, if you have a custom map for a different zoom level, then don’t scale it from the higher level (z5 to z4). I’m only going to have the one for each layer, so I’m just scaling the entire thing from Z5.

Putting it up

Now that I have the tiles at all the zoom levels (Z0 through Z5) generated, I need to put them somewhere that can be accessed via a HTTP request. If you can’t guess, I have a host at http://ift.tt/YHsna8.

The tiles have to have a consistent name for the slippery map to work. I decided to use the pattern:

http://ift.tt/YHsnag

At the moment, I’m allow providing two layers: creation and creation-geo.

The above URL is important for when we hook up a library to our URL, but the important part is that you can go to any image on that map and have it produce the correct results.

Creating the HTML

I decided to use OpenLayers 3 as my Javascript library. This is a pretty solid library, though there are others that can do much of the same functionality.

On the quickstart directions, they have a very basic HTML page that uses OpenLayers 3 and has the basic page. Take that HTML file and throw it up on a website (maybe at the root above the layers).

If you load the page, you should see MapQuest map. But we don’t really want to see that, we want to see our own map. To do that, we change the layer:

layers: [
new ol.layer.Tile({
source: new ol.source.XYZ({
layer: 'creation-geo',
url: 'http://ift.tt/YHsnaj'
})
})
],

Refresh the page and you have a basic slippery map.

Icons and Locations

Getting locations to show up in the map is a bit harder. In OpenLayers 3, there are a lot of ways of doing it and I haven’t quite found a perfect way. But, a “good enough” approach uses KML and a bit of magic.

This is the basic KML file. It just lists points on a map along with their icons. If you follow the icon links, you can find the icon images, they aren’t that impressive (though I did make them in Inkscape).

<kml>
<Document>
<name>Exalted Canon Locations</name>
<description>Created from stephenls map data.</description>
<Folder>
<name>Locations</name>
<description>Locations</description>

<Style id="style-canon-gate">
<IconStyle>
<scale>1.0</scale>
<Icon>
<href>http://ift.tt/1q2lzJu;
</Icon>
</IconStyle>
</Style>
<Style id="style-canon">
<IconStyle>
<scale>1.0</scale>
<Icon>
<href>http://ift.tt/YHsmTE;
</Icon>
</IconStyle>
</Style>

<Folder>
<name>POI</name>
<Placemark>
<name>Imperial Mountain</name>
<styleUrl>#style-canon</styleUrl>
<Point>
<coordinates>-20, 12</coordinates>
</Point>
</Placemark>
</Folder>

<Folder>
<name>Gates</name>
<description>Celestial Gates</description>
<Placemark>
<name>Celestial Gate #10</name>
<styleUrl>#style-canon-gate</styleUrl>
<Point>
<coordinates>22.7673, 8</coordinates>
</Point>
</Placemark>
</Folder>
</Folder>
</Document>
</kml>

I uploaded the KML file to the site under http://ift.tt/1q2ly8l. If you can’t guess, the library needs to download it to use it.

Adding the KML file to the map is pretty easy, you do it as a second layer.

var creationGeography = new ol.layer.Tile({
source: new ol.source.XYZ({
// attributes: Always give credits
url: 'http://ift.tt/YHsnaj'
})
});

var canonLocations = new ol.layer.Vector({
source: new ol.source.KML({
projection: 'EPSG:3857',
url: 'canon.kml'
})
});

var map = new ol.Map({
target: 'map',
layers: [creationGeography, canonLocations],
view: new ol.View({
center: [0, 0],
zoom: 3
})
});

You’ll notice I refactored the geography stuff out into a variable to make it easier to read. I do that a lot as I’m working and puzzling through things.

When you upload and refresh, you’ll see pretty icons for all of the canon locations. The reason I’m using ‘canon’ is because I had a secondary layer called ‘sepia’ for my Sepia Throne campaign. We had a tendency to create new locations, destroy cities, and we also used 108 celestial gates instead of the 56 in the canon world. (The 108 came from the 108 Stars of Destiny.)

Clickable labels

And the final part. It isn’t obvious from the icons which gate it is, so it would be nice if you could click on it and get a bit more information. To do that, we are going to show a bootstrap popup of the KML name, which should be enough.

This needs three parts. The first is to add Bootstrap and jQuery to your webpage. View source at the map to find examples if you don’t know how.

The second is to add a popup element in the map.

<div id="map" class="map">
<div id="popup"></div>
</div>

And finally, a bit more Javascript.

var element = document.getElementById('popup');

var popup = new ol.Overlay({
element: element,
positioning: 'bottom-center',
stopEvent: false
});

map.addOverlay(popup);

// display popup on click
map.on('click', function(evt) {
var feature = map.forEachFeatureAtPixel(evt.pixel,
function(feature, layer) {
return feature;
});

if (feature) {
var geometry = feature.getGeometry();
var coord = geometry.getCoordinates();
popup.setPosition(coord);

$(element).popover('destroy');
$(element).popover({
'placement': 'auto',
'html': true,
'content': feature.get('name').replace(/ /g, '&#160;')
});
$(element).popover('show');
} else {
$(element).popover('destroy');
}

feature = null;
});

Conclusions

There are a few more things I’d like to do, but… it’s good enough for now. If you want to see a full version, check out the source of http://ift.tt/1q2ly8n and http://ift.tt/YHsnan. That should give you a rough idea of how to do it, along with poor comments on what we’re doing.

I don’t like using the KML approach, but I couldn’t easily figure out how to do it via JSON or creating the features manually. For some reason, ol.geom.Point wasn’t working with a ol.Feature and I didn’t know why. This works for now, but if I was going to add the rest of the points, I’d find a cleaner way of doing it.

The main reason I don’t want to use KML is because I want to have a link to a wiki site of some sort, or maybe some additional text. These are things easily done via JSON but not KML.

Sands

Ocean Cuddle
The last three weeks ended up being focused on Rutejìmo series, which is a three book series starting with Sand and Blood, continuing into Sand and Ash, and concluding with Sand and Bone. I started working on this three years ago (Feburary 2012) while waiting for Harper Voyager to look at Flight of the Scions.

My original intent was to write a quick, twenty-thousand word piece to develop a bit of the world that Kanéko lived in (main character of Flight). It ended up being a lot more, mainly because I thought it was a compelling story. It also help solidify my thoughts on R5-D4 Plots.

Sand and Blood

Let’s start with the first book in the series, which I published earlier this year. I got my first serious review of the book by Jefferson Smith. His premise of the reviews is pretty interesting: he gets on a treadmill for forty minutes and reads until he encounters something that breaks him out of immersion. The cool part is that he is very detailed in the flaws that break him out and why. Plus, he is definitely a data fan since he is also charting his reasons every fifty or so books.

The data blog post came out a day before he finally got to mine. I’ll admit, I was nervous as hell. I created the best book I could and kept working on it until I couldn’t see any flaws. And then, kept finding readers until they stopped finding issues.

And I apparently missed a lot of them. This was, to say the least, a humiliating experience because I felt that I had avoided the small print problem is poorly edited pieces. I had a solid story, good characters, and actually paid for editors to work on it.

And he still found them in the first five chapters. And they were painfully obvious once I looked where he highlighted.

If I didn’t make those mistakes, I would have gotten to the forty minute mark.

Now, I’m not really one to wallow in self-misery for long. There were two things I could do, either just ignore it or fix it. Since this is the first book in the series, if I ignored it, it probably would have damned the entire series even if I took more effort to ensure the problems wouldn’t show up in the future.

You can probably guess what I did from that paragraph. I found a copy editor. While I was on vacation last week, she went through and found all of the ones Mr. Smith found plus a bunch more. I’m going to process her edits and put out version 1.1.0 of the book. I won’t change anything structural with the book but going to clean up the little mistakes that I somehow missed… repeatedly.

For those who bought it via Amazon or Smashwords, they’ll be able to get a new version. Amazon will send out an email, Smashwords won’t but I’ll announce when they are uploaded.

For the print, that’s a harder one. This is a point of pride and I made a mistake. So, I’ll replace printed versions of the book at my cost for anyone who wants one. There aren’t many sales, but even if there were, it is the right thing to do.

Now, one good thing that did come out of Mr. Smith’s review is the two kudos. If you look back through his reviews, and he is brutal about his opinions, but he also hasn’t given two kudos on a book that failed before this point. So, I really feel that if I fix these mistakes, I will have something I can be proud of.

I love the cultural richness of the opening scene, in which our stealthy hero is caught trying to steal the ashes of his great-grandfather in a ritualized “prove you are a man” prank. It’s odd, and something I haven’t seen before, but at the same time it feels very real.

Sand and Ash

So, moving on to considerably more cheerful topics. I’m still hoping to get Ash done by the end of the year. After talking to my editor, we’ve come up with a new plan so I have a chance of making this happen. It’s just a matter of juggling a few things, but I have both a development/line and a copy editor lined up to work on it. And at least three beta readers will to give me feedback.

I also commissioned the cover for the book from Dan Howard. If all goes well, it will be of Mikáryo for those who have read the first book. Yeah, Rutejìmo’s favorite terrifying woman has a much larger part in this book.

Now, there is a good chance that the book will only be preorder by the end of the year, but I’m really pushing to have it “done” and lined up for sale come December 31.

Sadly, this means I won’t have it available for ICON this year, which is a bummer. I really wanted to be able to have two books out there. I won’t be selling themselves, but Tyree Campbell of Alban Lake has offered to throw my books on a table. He is an awesome guy and one I’m thankful to have as a friend.

Sand and Bone

Yesterday, I completed the first draft of Sand and Bone. I wasn’t planning on doing this until later in the year, but SMWM gave me two weekends alone to write and I had a choice of either working on Author Intrusion or the novel. I decided that writing was more important and so now I have a draft.

I’m also scheduled to start running it through the writing group over the next few months. If it works out, I’ll have the third draft done by the end of the year also, which would get it ready in time for WisCon.

You never know, it might show up as a reference comment in one of the panels. That would be a cool egoboo.

Something completely different

Ocean Cuddle
It used to be when my birthday came ticking around, I’d ask for some DVDs and a good meal. Now, with my efforts to reduce my weight, a good meal isn’t nearly as appealing as it used to be. And I already have too many DVDs (not to mention, it has become “too common” for most people who buy me gifts).

Now, I ask for time alone. Yeah, it isn’t the “fatherly” thing to do, but I like being able to sit down and just obsess about something for a few days. It gets it out of my system and I don’t spend my normal whining about my priority list (family, work, writing, programming) while I’m honoring said priority list.

This last weekend, SMWM gave me two (it ended up being three) nights to do whatever I wanted.

Since I was working on Author Intrusion, I figured I’d program the entire time away, but as I was driving to meet Shannon Ryan for lunch, I realized it was a perfect time to write Sand and Bone. It would fulfill my drive to write and help ease this feeling of… discomfort I get when I’m working on Author Intrusion (also known as fear, uncertainty, and doubt) and not writing.

Psychic friends

I don’t know how it happens, but when SMWM gives me a weekend alone, people start asking for things. And it has to be the weekend I just go. I don’t even tell them about it, it’s like I give out a psychic wave of “ask Dylan for something!”

In this case, two of the folks in my writing group asked for help with WordPress, Google Groups (apparently it can do shared inboxes really well), and a whole slew of other things. That ended up taking about six hours of my Saturday plus I may have corrupted one of them with Order of the Stick and Nodwick.

Meeting other authors

The other thing that came up was meeting Aaron Bunce, a semi-local writer (he’s about twenty minutes away). He and I got talking on Twitter, but I’m not entirely sure how he found me.

But, he also has a book out recently so we decided to read each other’s effort. It will be fun, but I can’t really get started until next week.

Writing

Despite all of that, I managed to get a good eighteen hours of writing and got twenty-four thousand words written. This put me past the midpoint of the novel which I’ve been sitting on since April. Another week or so (though without the lovely obsession hours) and I’m at a reasonable shot for finishing the first draft by the end of September.

This is a hard novel to write in a lot of ways.

The biggest is that I’ve had this planned for better part of two years. I know all of these scenes and some of them are emotional for me. I don’t know if the words will say that, but I’m hoping that some of the emotions will get down on the page.

I’ve also been thinking about this novel for years. And I found that playing out novels is helpful up to a point, it can hurt my ability to write if I overdo it.

The other reason this is hard is because it is part three of a series. I’m afraid of changing the tone, writing style, or the general feel of what attracted people to the first book (since the second isn’t out yet).

Overall, I’m just getting words down. Not editing, spell-checking, or doing anything other than getting it out. I can clean up a page filled with errors, I can’t do anything with a blank page.

Miwāfu Glyphs Redux - Basic Font

Ocean Cuddle
Fonts can be a scary beast. Like very other technical field, it has its own language and organization. Free programs for creating fonts are… let’s call them difficult to use, but once you get into them, they are very powerful and capable (much like what I’m trying with Author Intrusion).

Parts

This is going to be broken into multiple posts, mainly because there are a few distinct steps. I’ll add links to the entire set as I go, but for now, these are the ones I plan on creating:

Drawing the glyphs

Scanning and cleanup

Creating vector versions

Creating a basic font

Unicode

While there are many different codes for fonts, these days Unicode is pretty much the one and only one to use. Unicode has more than enough code points and the organization to allow for conscripts (constructed scripts).

Unicode provides three areas for private use (creatively called Private Use Area or PUA). The first is E000-F8FF and has 6,400 points (somewhere you can place a glyph). The other two are at F0000-FFFFD and 100000-10FFFD and have 65k points each.

The PUA can be used by a lot of places: alternative characters, Easter eggs, swashes, non-standard ligatures, and conscripts.

ConScript Unicode Registry

The ConScript, or CSUR, is an attempt to organize the various use of conscripts in the private use areas. Basically, it’s an informal “reservation” for a script to avoid someone else using those ranges.

Font creators don’t have to use the the CSUR to figure out the fonts, but I consider it polite not to use one of the reserved ranges for my own private space. Of course, if the script gets popular, it will probably be moved around, but at least I’m not stepping on known toes.

Where to put everything

I’m starting my glyphs at F2000 which is currently not reserved. I need 46 glyphs at this point, though I would normally pad it to 64 characters to handle some of the custom characters that exist in the world (and to give me breathing room).

F2000: MIWĀFU-W

F2001: MIWĀFU-R

F2002: MIWĀFU-M

F2003: MIWĀFU-N

F2004: MIWĀFU-H

F2005: MIWĀFU-F

F2006: MIWĀFU-P

F2007: MIWĀFU-B

F2008: MIWĀFU-S

F2009: MIWĀFU-Z

F200A: MIWĀFU-T

F200B: MIWĀFU-D

F200C: MIWĀFU-K

F200D: MIWĀFU-G

F200E: MIWĀFU-OPEN-QUOTE

F200F: MIWĀFU-CLOSE-QUOTE

F2010: MIWĀFU-OPEN-NESTED-QUOTE

F2011: MIWĀFU-CLOSE-NESTED-QUOTE

F2012: MIWĀFU-OPEN-NUMBER

F2013: MIWĀFU-CLOSE-NUMBER

F2014: MIWĀFU-1

F2015: MIWĀFU-2

F2016: MIWĀFU-3

F2017: MIWĀFU-4

F2018: MIWĀFU-5

F2019: MIWĀFU-6

F201A: MIWĀFU-7

F201B: MIWĀFU-8

F201C: MIWĀFU-9

F201D: MIWĀFU-0

F201E: MIWĀFU-A-INLINE

F201F: MIWĀFU-E-INLINE

F2020: MIWĀFU-I-INLINE

F2021: MIWĀFU-O-INLINE

F2022: MIWĀFU-U-INLINE

F2023: MIWĀFU-RISING-INLINE

F2024: MIWĀFU-FALLING-INLINE

F2025: MIWĀFU-WAVE-INLINE

F2026: MIWĀFU-A-DIACRITIC

F2027: MIWĀFU-E-DIACRITIC

F2028: MIWĀFU-I-DIACRITIC

F2029: MIWĀFU-O-DIACRITIC

F202A: MIWĀFU-U-DIACRITIC

F202B: MIWĀFU-RISING-DIACRITIC

F202C: MIWĀFU-FALLING-DIACRITIC

F202D: MIWĀFU-WAVE-DIACRITIC

F202E: MIWĀFU-Y-INLINE

F202F: MIWĀFU-Y-DIACRITIC

This is somewhat close to how Unicode describes a character. I’m just making it look close to that.

Creating the font

FontForge is a powerful program that doesn’t always work the way you expect it to. The creator ended up making their own widget set because nothing at the time could handle the full Unicode range. But, this also means that it occasionally doesn’t have the polish one would expect out of a standard program. It is easy enough to work with, but it has quirks.

It is also free and the work of love, so frankly, I can’t complain about it.

The first thing to do is start up FontForge and create a new font. This will then give a huge list of boxes with Xs in them. Don’t panic, those are just empty places for glyphs and correspond to Unicode points.

Go into Element / Font Info and populate the first three fields. These can’t have any fancy characters (ANSI only) and the top two can’t have spaces in the names. I use “MF” for “Moonfire” in all my fonts, mainly because of ego.

Creating the slots

Because I’m not starting with a Latin font, I clear out the entire font first. I select Encoding / Remove Unused Slots which removes all the slots. Then, I select Encoding / Add Encoding Slots and create 46, which is the number of glyphs I want.

I haven’t found an easy way of creating and naming a range of fonts easily. So, I go through each one, one glyph at a time.

Populating each slot

Start by naming the slot. This consists of right-clicking the first cell and selecting Glyph Info&#8230;. In the dialog, fill in the first two fields.

In the first one (Glyph Name), we need an identifier field. I’m using the uppercase letter and “.miw” to indicate this is a Miwāfu glyph. Having “.miw” will make it easier to merge this font later with a more complete one.

In Unicode Value, put the hex value with “U+” in the beginning. If you just put “F2000”, FontForge will crash. But “U+F2000” works just fine.

Click “OK” and go back to the glyph list.

Don’t bother saving at this point, FontForge will forget your info until you put an image into the slot.

Double-click on the glyph which will bring up an editor.

Go into Inkscape, select the first glyph and paste it in. This will probably be not the right size. You can scale it inside the program, but that rarely works for me. Instead, I scale the image in Inkscape until I can just paste the glyph into the editor and move it around.

Once I position the glyph, I adjust the right vertical bar to give a small amount of space to the right of the glyph. This is the default spacing between the slots, but it’s kind of a art form to find the right spacing (it can also be easily changed later).

Go ahead and close the editor and save. And do it for the next glyph, and the next…

See you in an hour or so. Don’t forget to save frequently.

Create the font

Once all the glyphs are put into the font, I can create the font. I like OTF format over TTF, but either works. To generate the fonts, we use File / Generate Fonts.

Unless you’ve done this before, are lucky, or know what you are doing, chances are you’ll get an error message like this. I usually do, but most of the time, the problems are fixable. Control-E in the editor is good for finding errors. Moving points around and drawing fixes some of the other problems.

Eventually, you can plug at it and get through all of the errors. Don’t skip them, FontForge is telling you for a reason. Once you finish, you’ll have an OTF or TTF font wherever you saved it.

Testing it out

And since we’re finally at a point of seeing it in a word processor, we can use LibreOffice after installing the font into your system.

And… after all of these posts, I can finally show a couple names from my novels.

In the future

There is a lot here and things to do. I have a basic font, but the diacritics are not working nor is the accent. The next step will be how to get those working in the font and see if I can get the eastern version rendering properly.

I also have to tweak the kerning and spacing between the characters so it looks a bit more even on screen. For example, “Y” should be a bit further down and nestled underneath the vowel.

Well, this is a point where I need to stop for now. I have to work on Author Intrusion for a little bit.

Miwāfu Glyphs Redux - Vectors

Ocean Cuddle
It is very easy to copy SVG images from Inkscape into FontForge. The previous parts of creating a font for Miwāfu was to prepare an image suitable for importing into Inkscape.

Parts

This is going to be broken into multiple posts, mainly because there are a few distinct steps. I’ll add links to the entire set as I go, but for now, these are the ones I plan on creating:

Drawing the glyphs

Scanning and cleanup

Creating vector versions

Creating a basic font

Import the image into Inkscape

Again, this is a relatively simple process. Using the final image from the previous step, we import it into Inkscape as an image. It doesn’t matter if you link or embed, but I usually link to avoid bloating the SVG file.

Tracing the bitmap

Because I cleaned up the image in Gimp, it is easy to turn the raster image into a SVG image. Select the bitmap then choose Trace Bitmap from the menu.

There is a quirk after you click “OK” on this dialog. It works for a few moments and then looks like you have to click OK again. Just close the window.

Cleaning up the images

The resulting item looks just like an image. Just use control and an arrow key to move one out of the way and delete the image behind the vector version. Once you are down to one image, select the traced outline and use Break Apart (Control-K).

The resulting image will have each glyph as a separate image, but all of the loops will be filled in. To fix this, click on the filled-in bowl, then control-click on the outline. Use Subtract (Control-Minus) to remove the bowl from the outline.

Cleaning up individual glyphs

This is the next tedious part of the process. I started by throwing everything on a baseline, just to make it easier to scroll.

Then, starting on the left side, I go through each glyph and clean it up before moving the next. I was going with an easier approach, so I use Simplify Path (Control-L) to remove many of the control points and smooth out the lines. After doing that, I tried to remove other control points (F2 lets you see those) to create a simple glyph.

I took a couple passes going back and forth until I was pretty happy with the results. Then, I reorganized the glyphs again just to make it easier for creating the final arrangement.

After a bit more, I had this for the end of this step:

You may notice that the heights of the individual glyphs varies a lot. I did this for a few reasons, mainly for comprehension. I love Cherokee as a script, but it shows some aspects of being a constructed script. Everything has roughly the same height and it comes off as a block of text. I wanted something more flowing.

The bottom row has two versions because the lower set is the diacritic version (western) and the upper set is the inline (eastern).

In the future

One of the drawbacks of simplify path is that you lose a bit of the sharpness of the image. I would probably go with a different approach if I was creating the font again.

Also, if this was a non-handwriting font, I would be starting in Inkscape (or a C# program). I have an idea for a parametric font, but this “perfect” idea means that I will probably never finish it.

Miwāfu Glyphs Redux - Scanning

Ocean Cuddle
I don’t write out things by hand very often. The little imperfections always annoy me, which is why I’d rather create a font that write it out. That way, I can also use the font on the Fedran website to show characters in their native language.

Parts

This is going to be broken into multiple posts, mainly because there are a few distinct steps. I’ll add links to the entire set as I go, but for now, these are the ones I plan on creating:

Drawing the glyphs

Scanning and cleanup

Creating vector versions

Creating a basic font

Scanning the file

The process of scanning in hand-drawn images is fairly simple one. I have a Canon all-in-one printers/scanner which writes out scanned images as PDF to a SD card. I threw everything into a single PDF and then broke it out into individual PNG files using an overly complicated process.

I should have just scanned each page individually, but it was late and I wanted to go to bed.

Removing blue lines

The first thing I did was open the scanned images into Gimp. I use single window mode (from the Windows menu) because it plays better with my monitor.

The next is to create a white layer and put it below everything. This will let me use Cut instead of fill to remove elements.

After selecting the main layer again, select by color (right-click, Select, By Color…) and set the threshold to 40.0.

With those settings, just click on the blue line and cut (Control-X). Because we put a white layer behind it, it will delete to white instead of transparent.

After doing this a few times, I get a white background image with the glyphs nice and stark on the page.

Sharpen the images

Once I have the guide lines removed, I made the text easier to trace. The first thing is to convert the image into grayscale and back to RGB. This removes any errant blue lines and darkens everything black.

Once that is done, I jack up the contrast to deepen the black even more.

Smooth out the edges

The result is actually good enough for the next step for making a vector version. However, I ended up using the “Oilify” filter to smooth out the edges so the glyphs look reasonable even in Gimp. I like Oilify because it smooths out the rough edges of an image and gives a more newspaper printed appearance to the images.

The final result is a fairly dark glyph that is easily designed to be scanned.

Culling the herd

The final step was to go through all of the duplicated glyphs and find the best one of the lot. This was actually a couple hours of shifting images around, removing the ones that don’t quite fit, and trying to decide the right shapes to use. Once that was done, I had a single image with one of each glyph.

In the future

The blue lines I used were a little too dark, which increased the complexity of removing the trace lines. I would use a lighter shade next time.

I also didn’t need to use the oilify since I was scanning into the next step. The result is that the glyphs got a bit more blurred than needed, plus it distorted the shapes (which was magnified by other things I did later).