1
I spend enough on little plastic models of orks as it is!
Saw these in Honolulu. Looked nice enough, and you could probably do a pretty cool Moria, but LOTR is fundamentally an outdoors story, and Lego's never been as good at modeling that stuff as it is modeling buildings.
Posted by: Avatar_exADV at Tuesday, July 24 2012 03:54 AM (GJQTS)
To fill the void left by the unexpected and tragic death of Terraria:
Important bit:
To give us this modding flexibility, the game's content scripts are Python code, which is a scripting language that can handle real game logic. We've exposed the entire game engine to Python, which means that new content can make meaningful and unique changes to gameplay. The base game content is also a mod itself, so it is fully accessible to anyone who wants to view and modify it.
Yay! Though I would have been happy with Lua.
Ten bucks to pre-order the game. If it turns out anything like Terraria, it will eat your life be perhaps the best ten bucks you've ever spent.
And while you're at it, there's also Star Command, already available for on its way to iWidgets and Androids, now coming to PC and Mac:
Star Command? I remember a SF/space turn-based RPG game by SSI from 1989 using the same name. Tactical party battles, ship-to-ship combat, exploration, quests, stealing and selling stuff, against pirates, insects, and robots. Oh yeah, the game had its own version of the Pan-Galactic Gargleblaster, which was actually very useful.
Good times. Good times.
Then we had a mid 90's made-for-TV movie featuring space cadets, space combat, and Morgan Fairchild, but that is a story for another time.
C.T.
Posted by: cxt217 at Sunday, July 22 2012 09:42 AM (71fWP)
2
You're right (on the SSI game). Somehow I never played that, even though it was available on the Amiga.
Posted by: Pixy Misa at Sunday, July 22 2012 02:53 PM (PiXy!)
3
Crea's graphics look kinda bland compared to Terraria and the like. What do you think of Starbound?
Posted by: RickC at Wednesday, July 25 2012 10:40 AM (WQ6Vb)
4
Some of the artwork for Crea is great, but the sprite artwork and animations definitely need some more work done. It looks like they're pretty early in the development cycle so far. You can see that Star Command uses similar levels of detail but is much more fluid and expressive.
Starbound looks awesome. If they had a Kickstarter drive I'd be all over it.
Posted by: Pixy Misa at Wednesday, July 25 2012 02:53 PM (PiXy!)
If you want comments on your site, post something wrong.
Anyway, to those who haven't visited before: Welcome, and yes, I know that WWI was basically a family feud among Queen Victoria's grandchildren, and that The Molotov-Ribbentrop Pact would be a good name for a rock band.
Ancient Chinese history I'm less reliable on, so if you want to take up a discussion of the Yellow Turban Rebellion in my comments, go right ahead.
Wikipedia says the Yellow Turban Rebellion was: "agrarian crisis, in which famine forced many farmers and former military settlers in the north to seek employment in the south, where large landowners exploited the labor surplus to amass large fortunes." Seems as though nothing changes over the centuries as we see nowaday with current worldwide droughts.
Thanks for putting this rebellion out cause I had never heard about it. Might also want to read A Time To Stand ( booksbyoliver.com ) cause it's more current today as people continue to fight tyranny. I recommend it.
Posted by: OhioRiver at Saturday, July 21 2012 01:16 AM (kWhze)
3
Steven - no problem, I don't mind people correcting me as long as the point is (a) salient, (b) reasonably polite, and (c) hasn't been made twelve times already.
OhioRiver - as my 8th grade history teacher liked to say, Those who do not study history are going to be back in my class again next year.
Posted by: Pixy Misa at Saturday, July 21 2012 01:33 AM (PiXy!)
* This single 8th century civil war is estimated to have killed 15% of the population of the entire planet.*** ** The mongols, by contrast, only wiped out about 10% of the people in the world. Even WWI and the Spanish Flu together couldn't break into double digits.
It's interesting how often China is on that chart.
But when it comes to WWI, it isn't really fair to designate Germany, Austria and the Ottomans as the aggressors. Everyone was champing at the bit looking forward to that war, pretty much.
Posted by: Steven Den Beste at Friday, July 20 2012 03:14 AM (+rSRq)
2
Yeah, WWI was pretty much a suicide pact. I could add a causes column and file that one under stupidity.
Posted by: Pixy Misa at Friday, July 20 2012 11:25 AM (PiXy!)
3
China's going to show up a lot on that list because it was unified long ago, because it's bigger in absolute terms than just about anyone, and because until recently, it was a Malthusian test case - it had so many people that almost all its labor had to go into low-intensity agriculture just to feed everyone, and significant disruptions in agriculture (which is among the side effects of war, heh!) were enough to cause widespread starvation.
Posted by: Avatar_exADV at Friday, July 20 2012 12:39 PM (pWQz4)
4
Yeah, listing the axis as the aggressors in wwi is blatant entente bias. France was itching for a fight after being humiliated by Germany in 1870 and was as big an aggressor as any.
Posted by: Jason at Friday, July 20 2012 12:56 PM (6VB4r)
5
Ditto on WW I. One of my old history professors described it this way: imagine a crowded room with everyone having a noose around their neck, and the guy next to him holding it.
And then somebody decided to give his rope a good, hard yank...
The war could have been stopped in 1915, but Wilson, rather than T.R. got elected (he went 3rd party). I believe (since he was instrumental in stopping the Russo-Japanese War) he could have brokered a peace... maybe.
It's one of history's significant 'what ifs'. Much mayhem and negative change resulted from that useless, bloody war.
The rise of communism not the least of it.
Posted by: CPT. Charles at Friday, July 20 2012 01:00 PM (1GunI)
6
And yet, it was the Germans and Austrians that ended up actually starting the war.
Posted by: Chris at Friday, July 20 2012 01:22 PM (j6QBF)
7
I doubt the An Lushan Rebellion caused that many deaths. Yes the census fell massively but most of those people simply left their homes and removed themselves from the census. Many many of them moved into what is now the more populous parts of China but back then were the thinly settled and barbaric lands. Once you were off the census you didn't have to pay taxes and taxes went up astronomically during the civil war.
Posted by: Ray at Friday, July 20 2012 01:59 PM (7v5dF)
8
Ray - Good point on the An Lushan Rebellion. Not only was there massive disruption and displacement of the civilian population, but the census post-rebellion covered a smaller area. It seems implausible that two-thirds of the population actually died, as the census numbers would suggest, though clearly there was massive loss of life.
Posted by: Pixy Misa at Friday, July 20 2012 02:26 PM (PiXy!)
9
@6
No they didn't. Russia did when she mobilized her army...which Keizer wilhelm begged the tsar not to do btw.
Posted by: Jason at Friday, July 20 2012 04:17 PM (6VB4r)
10
As has been pointed out, the person who put this list together needs to take a history lesson. Let's follow the sequence of events. Serb extremists murder the Arch Duke Ferdinand-Austria wants retribution-Russia supports Serbs and mobilizes Army against Austro-Hungary. Germany did not want war but the Russian mobilization on her borders and the byzantine layers of treaties led to the morass. You might also like to know that the King of England, the Kaiser and the Tsar were all 1st cousins. Now let's look at the end of WWI and it's impact on WWII. The treaty of Versailles was demeaning and destructive leading to German resentment-main instigators-The French. In addition, who was the other participant in the Non-
agression pact of 1939 and helped slice up Poland- Why it's the peace-loving Joe Stalin (who also invaded Finland). This table is simple and stupid and shows why there should be a test to allow people to vote. Obama with his understanding of Economics, History, Natural Sciences and Geography would flunk.
Posted by: Vincent Walker at Friday, July 20 2012 10:08 PM (F8nGw)
1. The observation about world leaders being related is interesting, but had no effect on the arms race that preceeded WWI or the war itself. They still contended for possessions in Africa, and they still built battleships designed to fight each other.
2. The Versailles treaty was a scapegoat for the instability of Germany, which lost big in a war it entered. Mentioning the treaty is convenient. Hitler certainly thought so. What is inconvenient were the loans and aid given to Germany. Germany went from being a number of principalities to an empire with a Kaiser to a Weimar Republic to a reich in less than 70 years. That may have also been a factor. Funny how no one wants to mention that. And it was fending off communist uprisings and privation stemming from WWI and the blockade.
3. Were the interlocking treaties a major factor? Yes. But then, Britain and France had treaties with Czechoslovakia in 1938. Ask the Czechs how valuable they were. Germany could have stayed home in WWI. Instead, they launched a pre-planned offensive on two fronts.
Posted by: Blue Hen at Friday, July 20 2012 11:19 PM (6rX0K)
12
Vincent - In other words, Queen Victoria caused WWI?
Oh, and if you think a post labelled "History's Bloodiest Wars And Who To Blame: A helpful guide." and listing the Influenza Virus as an aggressor in WWI should be taken seriously - then you flunk grade school reading comprehension.
Posted by: Pixy Misa at Friday, July 20 2012 11:53 PM (PiXy!)
13
Pixy Misa - You are a flaming fool - as usual - George V was King of England 1910. Get your facts straight asshole. Victoria was dead.
By the way - I didn't say they started WWI - reread if you can understand anything beyond 4 letter words. It is indeed ironic that 3 first cousins were heads of state of the major players of WWI.
Posted by: Vincent Walker at Saturday, July 21 2012 02:58 AM (F8nGw)
14
The Thirty Years' War might desreve a special mention, even though the large number of deaths (estimated at 8 million, give or take a few) occurred over a relatively long period. The war devastated the populations of several central European countries.
Posted by: JP at Saturday, July 21 2012 04:45 AM (m8wSv)
15
Actually, George V, Wilhelm II and Nicholas II were not all first cousins to each other. George and Wilhelm were first cousins (George's father and Wilhelm's mother were siblings and children of Queen Victoria). George and Nicholas were first cousins (their mothers were sisters and daughters of King Christian IX of Denmark). Nicholas and Wilhelm were NOT first cousins - they were actually 3rd cousins through a common descent from Paul I of Russia. However, Wilhelm was first cousin to Nicholas' wife Alexandra, as Alix's mother was another daughter of Queen Victoria.
Posted by: Alia at Saturday, July 21 2012 07:55 AM (2mJE0)
16
Pixy: Vincent - In other words, Queen Victoria caused WWI?
Vinny: Pixy Misa - You are a flaming fool - as usual - George V was King of England 1910.
Winner: Pixy Misa.
Posted by: Wonderduck at Saturday, July 21 2012 11:42 AM (8KjSa)
Unless you close this comment thread, it's going to keep accumulating pedantic nitpicking forever. Five years from now someone will run into it (via the magic of Google) and point out some unimportant detail that you got wrong or didn't include.
I still get letters about USS Clueless, eight years after I stopped writing it.
Posted by: Steven Den Beste at Saturday, July 21 2012 09:36 PM (+rSRq)
When I reviewedWarlock: Master of the Arcane a few weeks ago, I noted that while technically sound, it lacked a lot of the features of the classic Master of Magic and ended up with gameplay that seemed somewhat shallow in comparison.
A couple of the features I missed most were heroes and artifacts - Warlock had no unique units or magic items, although with a bit of work you could buff up your elite troops to near-hero level.
I say had advisedly, because the free 1.2 update introduces both heroes and artifacts, as well as better diplomacy and a host of small added features, bugfixes, and tweaks. I'll give it a try when I have some time and report back on how the game has progressed.
I have been thinking about getting the game since it is part of the Steam summer sale. Based on your review, I do not have high expectations going in, but at least it will be something to cover the post MOM-drought.
C.T.
Posted by: cxt217 at Sunday, July 22 2012 09:45 AM (71fWP)
What? No, I mean seriously, what? Spectacularly uneven show, a mishmash of romantic comedy, slapstick comedy, drama, tragedy, horror, harem, and fanservice. While it pulls off most of the individual elements pretty well, the whole is about as cohesive as a sack full of angry raccoons.
And worse, while it's clear that no-one involved had any idea where the story was headed, the events within the story are tiresomely predictable.
On the balance, I rate it two little zombie kitties out of four.
My usual sources, THAT and Sea Slugs, didn't touch this one, but Random Curiosity provided full (and warning, spoiler-laden) coverage.
Posted by: Pixy Misa at
10:19 PM
| No Comments
| Add Comment
| Trackbacks (Suck)
Post contains 111 words, total size 1 kb.
Sunday, July 15
Cute Pandemic
A trap in full gothloli costume gazing rapturously up at an industrial rice polisher? Moyashimon has Returned.
Kokoro Connect. This is the one that looks just like K-On! only with boys* as opposed to Tari Tari, the one that sounds just like K-On! only not with boys.
First episode was pretty good. If it continues this way, as a character-driven series circling around the McGuffin, it could be a standout, because the characters are generally quite engaging.
Music and animation are decent enough, if unremarkable. The character designs are fine, as are the voices, particularly Miyuki Sawashiro as Inaba. (She played Celty in Durarara!! and the landlady in Hidamari, so it's another unexpected but oddly perfect voice in the line of last season's girl-shaped space bee.)
So I'll be watching this one - assuming I don't end up dead again, which is not a given.
Now, when does Moyashimon Chronic start? Huh, Miyuki has a role in that too. Wait, it's already on? Why does no-one tell me these things?!
Episode 2 Update: Huh. It did an Immelman Turn when I was expecting it to zig. Interesting, though.
* Some.**
** Sometimes.***
*** Probably.
Posted by: Pixy Misa at
04:07 AM
| No Comments
| Add Comment
| Trackbacks (Suck)
Post contains 179 words, total size 2 kb.
Friday, July 13
Say Hello, Hororo!
Ooh, sandwichies!
Um, Hororo?
Heeelp!
Hororo is our new Sydney-based VPS, which I've just deployed to host the alpha test of Minx 1.2. Or she will be, once I extract her from my lunch.
Posted by: Steven Den Beste at Saturday, July 14 2012 04:49 AM (+rSRq)
2
Virtual private server. I don't know why it has "private" in it, it's just a virtual server.
I got one here in Sydney because that makes it much quicker to do updates than in the US (20ms ping time vs. 200ms) - and right now I'm doing lots of updates. Didn't cost that much more either - $30/month here against about $20 for something equivalent in the US.
Posted by: Pixy Misa at Saturday, July 14 2012 05:30 AM (PiXy!)
3
There are snacks? Nobody said there'd be snacks!
Posted by: Wonderduck at Saturday, July 14 2012 02:41 PM (PHdMw)
I'm still looking at buying myself a Samsung Galaxy Note, but I want to see first if it's shipping here with Ice Cream Sandwich instead of Gingerbread.*
And I'm probably going to buy an iPad without a nameTM pretty soon; I wasn't that impressed by the earlier models but the new screen is very, very nice.
But I've started out cheap and simple, with a Nexus 7.
Oh, and an OUYA, which is basically a Nexus 7 without the screen, but with HDMI and a gamepad instead.
At $99, even if it never gets many games ported to it, it's still a tiny shiny quad-core Linux box with 1GB of RAM.
* Hmm. Rumours have a new Jelly-Beaned four-cylinder Note due next month. But then I have to wait for it to reach Australia again, which took several months last time.
1
As soon as those sub-$100 android boxes-on-a-stick get a little better (eg a couple gigs of ram and dual or quad-core cpus, and yes I know that will up the price) I'm going to pick up a couple. (You know, the ones the size of a flash drive, come with a uSD slot, a USB port or two, and HDMI out.)
Posted by: RickC at Saturday, July 14 2012 09:42 AM (WQ6Vb)
2
The Pandaboard ES ($169) and ODROID-X ($129) are getting there. Give it 6-12 months for specs to go up and prices to come down, depending on just how much CPU and RAM you need.
The next-gen ARM Cortex A-15 looks like it will be a second breakthrough part. The current A-9 has given us really zippy smartphones and tablets, and the A-15 is expected to deliver twice the speed per core and optionally twice as many cores. At that point it will be good enough for low-end desktops and small servers.
Posted by: Pixy Misa at Saturday, July 14 2012 04:04 PM (PiXy!)
I mentioned in my previous post that Minx 1.2 has involved a major overhaul of the templating system, so that it now provides multiple methods for accessing your data. You may have missed this, because that post was mostly user interface port, so here's how that works, using a single example: Show me the title and author of the last 20 posts published on my blog.
Meta
Meta is the template language you know and love, and so far has been the main interface for anything you wanted to do. It's a good thing it makes this easy!
[posts count=20]
[post.title] | [post.author.name]<br/>
[/posts]
By default the [posts] method lists your posts in descending date order (i.e. most recent first), and hides anything unpublished, so you don't need to specify any options for that.
Lua
Lua is the scripting language and main template engine in Minx 1.2. You can fall back to a 1.1-style interpreted template if you really need to (and there is one semantic difference between old and new templates that might make this necessary for perfect compatibility), but by default, templates are compiled from Meta into Lua when you create them, and from Lua to native machine code when they run.
This is what that template would look like* in Lua:
The one trick there is that the posts function is called with curly brackets {} to pass it a table, instead of round brackets () for a regular parameter list. That's syntactic sugar in Lua; you could also write it as
for post in api.posts({count=20}) do
From Lua you simply print or write your content, and it is directed to the user's web browser. Even if you've never done much programming, it's pretty easy to get started.
In fact, you could leave out the fields list and it would give you everything, but this way there's less data to download and parse, which is good for everyone.
The second format displays the function of an API you're already using without being aware of it: URL selectors. Your blog archives, where you specify http://mysite.mee.nu/archive/2012/5 to get posts from May 2012: That's an URL selector. There's no actual archive folder; it's all handled dynamically. URL selectors have been greatly extended in 1.2, with a couple of dozen new parameters for filtering, searching, and sorting content.
These calls will return the data in JSONformat, rather than the exact layout produced by the various templates. This will be addressed in a future release with plugin formatters, but for now, JSON rules.**
Python
This is the way I code to the new API, and I plan to make this available on an experimental basis in 1.2.
There are two ways to use the Python API: As a wrapper around the REST API, or as Python modules for inclusion in standalone Minx installs. (You can't install your own Python modules in the core mee.nu system, for obvious reasons, but I plan to offer virtual Minxes for those who'd like to develop applications in this way.)
The Python API is essentially identical either way, and very similar to Lua:
Technically, Python doesn't require the brackets on print yet, but it will in the future, and they make the code more similar to Lua, so it's a good idea to include them.
Ruby
This is under development; it seems to work, but I'm not sure yet whether it will be robust enough for release in 1.2. As with Python, it will be available as a wrapper for the REST API, and also for direct modules using RubyPython.
Ruby code is a little different to Python or Lua, partly because it has a more thoroughly generalised object model. But it's not hard once you get used to it.
As with Python, the brackets on print are optional.
The advantage of Ruby is that it allows Ruby programmers to work with a familiar language and familiar libraries while building on the Minx framework - and integrating with Ruby also allows Minx access to Ruby libraries that don't have direct Python equivalents.
Anyway, that's a very quick rundown on the new APIs in 1.2; the full API reference, when it lands, will run to several thousand pages. I'm not typing all of that, though! It's automatically generated using Sphinx from the data model and its documentation, so that every method is documented for every version of the API, and every example is equivalent on each API as well.
The tutorials and user guide will be mostly hand-crafted*** but the new reference will automatically document absolutely everything.
* Right now, what the compiler produces is this:
for post in api.posts{count=20} do
write(post.title)
write(" | ")
write(post.author.name)
write("<br/>\n")
end
Which is correct (and neatly indented) but a bit mechanical. But most users won't ever look at that code, so for now I'm happy with correctness; idiomaticness can follow.
I need to add some more intelligence there to keep long sections of text readable, but it certainly works nicely for short examples.
** I'm so glad that XML APIs are a dying breed. They were an improvement on some of the binary APIs I had to work with in the bad old days, but still horrible in their own way.
I'm preparing for the release of Minx 1.2. There will be a big post up on mee.nu closer to the launch date, but for my faithful followers, here's a quicky:
The database is moving from MySQL to MongoDB plus ElasticSearch. This means we'll be switching from a conventional fixed-column database to a partially free-form document model for both the database and the search engine.
The core Minx engine is being rewritten in an API-centric model. The API will be available via RESTful HTTP, via URL selection strings, from Lua for user code, and from Python and Ruby for development code.
Non-core functions are being moved from Python code to user-accessible Lua scripts using LuaJIT. Custom scripts can be triggered by both template tags and BBCode tags.
Templates can be interpreted (as present) or compiled down to a sequence of equivalent Lua API calls. This is then compiled down to machine code at runtime. In other words, we're moving from an interpreted language on top of an interpeted language (the Meta template language written in Python) to pure native code.
Layout is moving to Twitter Bootstrap. It doesn't make CSS go away, but it does a good job of beating it into submission.
The primary editor is being upgraded to Innova Live Editor. I have a source code license for the editor, plus the plugins for photo insert, photo retouch, video insert, drawing, and CSS buttons.
As an alternate editor I've licensed Redactor, which is lighter-weight than Innova but still very capable.
If you prefer working directly with markup, Minx 1.2 supports not just HTML and BBCode, but also Textile and Markdown, and I'm integrating the markItUp! editor to make it all easy.
For programming in the Minx environment, you can use Ace, which provides you with neat Lua syntax highlighting.
The dashboard will be getting a significant upgrade. I'm testing a very powerful Bootstrap-compatible admin theme called Utopia, and adapting it to work with the Minx API.
It will have lots of new features for managing your content.
You'll be able to use all those features on your blogs as well. It also comes with a fifth option for your editing needs, CLEditor. I prefer Innova or Redactor, but it's already been integrated with the rest of the dashboard, so including it is less effort than removing it.
For all your graphing and charting needs (within the admin panel, and on your site if you're into that sort of thing), I've licensed Highcharts.
Image processing templates - apply Python Imaging Library and ImageMagick filters on your images on demand.
Pull in content from Twitter, Facebook, Google+, Delicious, Stumbleupon, Pinterest, Youtube, Vimeo, Flickr, last.fm, Deviantart, and Tumblr to fill up that dusty sidebar.
And... Tired. Here's some pics. More later.
Oh, and, for when you really need to turn your text into a swarm of blue neon bees:
Plus: BBCode Editor and Pure Editor Lite, Rama and Before-After sliders, Social Media Tabs, Showbiz Carousel, Showcase, Hoverall, and Neon Text Effects.
Posted by: Pete Zaitcev at Saturday, July 07 2012 09:50 AM (5OBKC)
2
I'm tempted to just call it 1.1.4.1 and release it without prior notice, given that it's been cooking for nearly four years.
It's changed direction a couple of times because quite a few of the things I'm using now simply didn't exist four years ago. Even two years ago there were no really solid alternatives to SQL for the database, and I was working on my own scripting language because support for Lua and JavaScript in Python just wasn't there. ElasticSearch, which is now the obvious choice for this sort of application, only appeared in 2010 too.
The whole thing has been terribly delayed because I've been working endless overtime at my day job. But that extra income meant that I could splash out on neat stuff like the editors, the control panel, and all the jQuery plugins. (I've only listed about half of them so far...) And a shiny new server or two as well. So there's some upside, at least.
Posted by: Pixy Misa at Saturday, July 07 2012 10:08 AM (PiXy!)
3
My jaw dropped. Then I wondered if the four of us still on mu.nu will be able to use this/
Posted by: Wonderduck at Sunday, July 08 2012 01:35 AM (ifb6Y)
Posted by: Pixy Misa at Sunday, July 08 2012 03:10 AM (PiXy!)
5
Heck, I can barely use any of what we've already got (how do you set up categores? What do the publishing statuses besides Publish and Draft do, and will one of them let me preview a post before I make it live?) But if the new editors don't home the browser window after I paste, I'll be happy.
Posted by: Mauser at Monday, July 09 2012 12:47 PM (cZPoz)
6
You can set up categories as folders with a type of "Category".
But yes, a big part of this will be a more intuitive (and better-documented) dashboard.
Posted by: Pixy Misa at Monday, July 09 2012 02:11 PM (PiXy!)
7
I suppose this may be finally the time for me to put together a Meenuvia client that I meant to do a long time ago, using the promised RESTful API. Back when I started thinking about it, the only portable platform was iPhone, which did not interest me at all. Now we have a legion of Droid devices.
Posted by: Pete Zaitcev at Wednesday, July 11 2012 02:48 AM (dON//)
8
I'm going to bring up a test instance on a VPS soon; I'm happy to give you an API key so that you can try things out.
Posted by: Pixy Misa at Wednesday, July 11 2012 07:01 AM (PiXy!)
9
Do keep us up-to-date. I am about to start another blog, this one commercially inspired, and will consider alternatives to WordPress.
So I have this idea for a TV drama series about a group of techies - possibly network engineers, but I'm thinking in terms of compiler writers - who come together at night to fight crime. Or supernatural horrors from another dimension, same thing.
They would, of course, be called the Token Angels.
Because this would be the best theme song ever.*
Start it at about 0:20 and finish at 1:45 and you have just about the length for an anime opening (typically 90 seconds).
* After** the themes from Problem Child and Linden Hill by the Electric Ant Orchestra, available on their album Winter Collection from Cinnamon Tree Records.
For a rock, that thing has a wicked sense of humour.
Natsuiro Kiseki.
(THAT, which has a talent for this, titled the show Magical Rock Trolls Four Girls.)
Posted by: Pixy Misa at
09:06 PM
| No Comments
| Add Comment
| Trackbacks (Suck)
Post contains 34 words, total size 1 kb.
Tuesday, July 03
Peppered And Salted
Two more NASes arrived at Pixy Labs today - Pepper v2 and Salt v2, a couple of LaCie 5Big v2 units like Sugar but minus the marbles-in-a-tumble-dryer Hitachi drives. Minus any drives at all, in fact, which makes them a heck of a lot cheaper, $399 each vs. about $1700 for the 10TB Sugar back in 2010.
Once they're loaded up with disks (and I have 8 1TB disks lying around, and 12 2TB disks waiting to be built into PCs), they're replace Pepper and Salt v1, my old Acer Easystores. These will be - depending on what disks I decide to put into them - 5, 10, or 15TB each, replacing the 4TB Salt and 2.5TB Pepper.
Once I've built Shana and Lina as well, I'll have, hmm, 40 to 48TB of available disk, all of it RAID-5. That'll do, I think.
MySQL, good. Redis, good. MongoDB, good (since 1.8, anyway). Riak, good. CouchDB, good. ElasticSearch, very nice. Neo4j... If I want the ability to run backups, costs as much as my entire operating budget. So, no Neo4j for you!
Kyoto Tycoon, good....
Posted by: Pixy Misa at
05:21 PM
| No Comments
| Add Comment
| Trackbacks (Suck)
Post contains 46 words, total size 1 kb.
Aha Moment
What I needed all along was an autovivifying dict/object composite class with virtual leaf methods. You see, where I got stuck (apart from working out how to autovivify in Python, but there are now several recipes around the 'net for that) was on the current implementation of lazy methods. That was a big improvement over the original eager methods, but it still requires the closures to be bound when the subtree is attached, and it means that the parents of the lazy methods can't be accessed in object or nested dict notation, only via dotted keys. But if I make the leaf methods virtual, then (a) they don't need to be bound at all, making the trees smaller and the code faster, and (b) there is no space collision on the parent node, because it's now the leaf, and thus has identical semantics under all three access methods.
What this means to you is that the next version of Minx will run twice as fast. What this means to me is that writing the code just became much less fiddly - the tags you see in your templates now map directly to code objects. (And in the next version, will automatically map to database fields as well.)
Update: Hmm. Still not perfect. The catch now is that that (a) there are inconsistencies between the dotted key accessor and the direct accessors, and (b) you have to munge virtual method calls when accessing them directly.
So, example:
[comment.text] in a Minx template returns the marked-up content of the comment, i.e. BBCode parsed, smilies interpolated, HTML sanitised and so on.
If you want the raw text data (to write a blog exporter, for example) you can use [comment.text.raw].
But in the database interface, and in the back-end code, comment.text needs to refer to the raw data.
That's what the new method does, but that means that it smart and context-sensitive rather than consistent. [comment.text] is not the same as comment.text. But that's okay on the Python side (or Ruby, but I'm not going to mention Ruby yet), because (a) only I see that stuff, and (b) it's exactly what I want for writing the core code.
Where this gets weird is in the Lua API, where tags.comment.text matches the internal (Python) value of comment.text rather than the template tag [comment.text]. So what I need to do there is tweak the data structure so that instead of returning the raw data when called from Lua, it returns a wrapped object with the default text (what you get from the template tag) as its string representation.
With that, (a) naive Lua templates will work: If I say content = content .. tags.comment.text* it will append the processed comment text to the HTML page just like [comment.text]; (b) methods will work, so tags.comment.text.raw will return the same value as [comment.text.raw]; and there will be near zero overhead in creating the tag arrays; the wrapper class will only do its work for fields that are referenced in the Lua script.
Two minor catches, still:
If you need to treat the wrapped Python strings as Lua strings (tags.comment.text will be wrapped; tags.comment.text.raw won't), i.e. there's no automatic coercion taking place, you'll need to dereference the wrapper to make the automatic conversion happen; that will be something like tags.comment.text.string. If you're just spitting it out as part of the web page, though, no need to do that.
For Python (and Ruby, but I'm not mentioning Ruby yet) core code, the leaf objects are native data types, so you can't do tags.comment.text.raw in Python the way you can in Lua. Well, you could do that from Ruby, which allows for insane degrees of monkeypatching, but I don't think I want to go there. But I can munge it to allow tags.comment.text_raw to do the same thing (the . notation forces an attribute lookup on text that I can't overload, but _ is just part of the attribute name and I can do whatever I like). And in non-core code (if you're writing trusted native templates in Python or R... Python) you can request the tags structure in magic mode, which will deliver it with the same semantics as in the template language and Lua.
I think that's good enough.
* Actually, real Lua template code would look more like:
for comment in post.comments
print(comment.text, "<br/>")
end
Posted by: Pixy Misa at
01:35 AM
| No Comments
| Add Comment
| Trackbacks (Suck)
Post contains 727 words, total size 6 kb.