No boom today. Boom tomorrow. There's always a boom tomorrow.

Wednesday, July 25

Geek

Mole Of Moles

Essential reading.

Posted by: Pixy Misa at 07:05 PM | No Comments | Add Comment | Trackbacks (Suck)
Post contains 5 words, total size 1 kb.

Tuesday, July 24

Geek

I Can Hear My Wallet Deflating As I Type

Lord of the Rings Lego.

Posted by: Pixy Misa at 12:35 AM | Comments (1) | Add Comment | Trackbacks (Suck)
Post contains 14 words, total size 1 kb.

Sunday, July 22

Cool

Crea

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:


Posted by: Pixy Misa at 12:07 AM | Comments (5) | Add Comment | Trackbacks (Suck)
Post contains 143 words, total size 2 kb.

Saturday, July 21

Blog

Proves The Rule, I Guess...

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.

Posted by: Pixy Misa at 12:08 AM | Comments (4) | Add Comment | Trackbacks (Suck)
Post contains 79 words, total size 1 kb.

Friday, July 20

World

History's Bloodiest Wars And Who To Blame

A helpful guide.

Rank Name Aggressor Victim How Many
1 World War II Germany, Japan,
sundry others
best forgotten
Everyone else 40 million+
2 An Lushan Rebellion China China 33 million*
3 Mongol Invasions Mongols Everyone else 30 million**
4 Yuan Dynasty Collapse China China 30 million
5 Ming Dynasty China China 25 million
6 Taiping Rebellion China China 20 million
7 World War I Germany,
Austria-Hungary,
Ottoman Empire,
Influenza Virus
Everyone else 15-65 million
8 Tamerlane's Conquests Tamerlane Human decency 15 million
9 Dungan Revolt China China 8 million
10 Russian Revolution Filthy Commies Anastasia,
sound agricultural
policy
5 million


* 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.
*** As reader Ray points out, this number may be slightly exaggerated.

Posted by: Pixy Misa at 01:27 AM | Comments (20) | Add Comment | Trackbacks (Suck)
Post contains 168 words, total size 3 kb.

Wednesday, July 18

Geek

Warlock 1.2: Warlockier

When I reviewed Warlock: 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.

Posted by: Pixy Misa at 11:35 PM | Comments (1) | Add Comment | Trackbacks (Suck)
Post contains 130 words, total size 1 kb.

Anime

My Little Zombie Can't Be This Cute

Sankarea.

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

Anime

Cute Pandemic

A trap in full gothloli costume gazing rapturously up at an industrial rice polisher?  Moyashimon has Returned.
 
/images/Moyashiiii.jpg
Um, yeah.  I dunno.

Posted by: Pixy Misa at 04:55 AM | Comments (3) | Add Comment | Trackbacks (Suck)
Post contains 23 words, total size 1 kb.

Anime

Gender Blender

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

Geek

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.

Anyone there?

Posted by: Pixy Misa at 06:10 PM | Comments (3) | Add Comment | Trackbacks (Suck)
Post contains 39 words, total size 1 kb.

Geek

Androided

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.

Posted by: Pixy Misa at 04:45 PM | Comments (2) | Add Comment | Trackbacks (Suck)
Post contains 142 words, total size 1 kb.

Sunday, July 08

Geek

Speaking In Minx (1.2)

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:

for post in api.posts{count=20} do
  print(post.title, ' | ', post.author.name, '<br/>')
end

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.


REST

Either
http://myblog.mee.nu/api/posts?count=20&fields=title,author.name
or
http://myblog.mee.nu/api/posts/count/20/fields/title,author.name

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 JSON format, 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:

for post in api.posts(count=20):
  print(post.title, ' | ', post.author.name, '<br/>')

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.

api.posts.each({:count => 20}) | post |
  print(post.title, ' | ', post.author.name, '<br/>')
end

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.

Update: Ta-da! Added support for merged writes:

for post in api.posts{count=20} do
  write(post.title, " | ", post.author.name, "<br/>\n")
end

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.

*** And illustrated.

Posted by: Pixy Misa at 03:40 PM | Comments (2) | Add Comment | Trackbacks (Suck)
Post contains 931 words, total size 9 kb.

Saturday, July 07

Cool

Now Is The Time At The Not-Flea When We Dance


(Found in Ace's sidebar.  I recommend that you select 1080p and watch it full screen with the sound up.  This little widget doesn't do it justice.)

Posted by: Pixy Misa at 10:23 AM | Comments (1) | Add Comment | Trackbacks (Suck)
Post contains 36 words, total size 1 kb.

Friday, July 06

Geek

What's Pixy Up To?

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.

    /Images/1.2.InnovaLive.jpg

  • As an alternate editor I've licensed Redactor, which is lighter-weight than Innova but still very capable.

    /Images/1.2.Redactor.jpg

  • 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.

    /Images/1.2.markItUp.jpg

  • For programming in the Minx environment, you can use Ace, which provides you with neat Lua syntax highlighting.

    /Images/1.2.Ace.jpg

  • 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.

    /Images/1.2.Dashboard.jpg

  • It will have lots of new features for managing your content.

    /Images/1.2.DashboardGallery.jpg
    /Images/1.2.DashboardForms.jpg
    /Images/1.2.DashboardCharts.jpg
    /Images/1.2.DashboardMessages.jpg
    /Images/1.2.DashboardTables.jpg
    /Images/1.2.DashboardCalendar.jpg

  • 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.

    /Images/1.2.Highcharts.jpg
    /Images/1.2.Highcharts2.jpg

  • And JWPlayer is available for embedded video.

    /Images/1.2.JWPlayer.jpg

  • Over a thousand new banner images and hundreds of new fonts to make your site semi-unique.

  • Support for other protocols (SMTP, POP, IMAP, NNTP, XMPP, FTP, SFTP) is under development, but will likely ship in a subsequent point release.

  • Experimental support for d3.js and Processing.js.

  • 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.

    /Images/1.2.Effects1.jpg
    /Images/1.2.Effects2.jpg/Images/1.2.SocialStream.jpg/Images/1.2.Accordionza.jpg/Images/1.2.GalleryJack.jpg
    /Images/1.2.Multimedia.jpg
    /Images/1.2.Folio.jpg
    /Images/1.2.Revolution.jpg/Images/1.2.KenBurner.jpg/Images/1.2.Paradigm.jpg

  • Oh, and, for when you really need to turn your text into a swarm of blue neon bees:

    /Images/1.2.NuvuType.jpg

  • Plus: BBCode Editor and Pure Editor Lite, Rama and Before-After sliders,  Social Media Tabs, Showbiz Carousel, Showcase, Hoverall, and Neon Text Effects.
more...

Posted by: Pixy Misa at 11:30 PM | Comments (9) | Add Comment | Trackbacks (Suck)
Post contains 679 words, total size 8 kb.

Cool

Not With A Whimper

If you have to go, you might as well - 

Wait.  No one was hurt, right?  Okay, good.

- might as well go out with a bang.


Admit it, you've all wanted to see that happen.

Posted by: Pixy Misa at 04:27 AM | Comments (1) | Add Comment | Trackbacks (Suck)
Post contains 40 words, total size 1 kb.

Thursday, July 05

Geek

By Night, They Fight Crime

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.
** Okay, before.

Posted by: Pixy Misa at 04:30 PM | Comments (2) | Add Comment | Trackbacks (Suck)
Post contains 118 words, total size 1 kb.

Cool

Turn The Radio Up


Because, that's why.

Posted by: Pixy Misa at 02:00 AM | Comments (1) | Add Comment | Trackbacks (Suck)
Post contains 7 words, total size 1 kb.

Wednesday, July 04

Anime

The Nargun And The Pop Stars

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

Geek

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.

Posted by: Pixy Misa at 10:57 AM | Comments (1) | Add Comment | Trackbacks (Suck)
Post contains 146 words, total size 1 kb.

Monday, July 02

Geek

Good Good Good Splat Good...

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.

Geek

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:
  1. 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.
  2. 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.

<< Page 1 of 1 >>
118kb generated in 0.2302 seconds; 65 queries returned 302 records.
Powered by Minx 1.1.4-pink.