Top.Mail.Ru
? ?

The End

I'm tired of LiveJournal, for a variety of reasons. Blogging should be fun, and with LJ it's just not fun.

So, I'm bailing.

I've thrown up a static blog based on Blogofile and using Disqus for comments. The design is a work-in-progress that I intend to apply to veekun proper someday.

The newfangled thing has an RSS feed, so you can still follow me with any feed reader. (I'm also trying to keep posts in one of a small handful of broad categories, which also have individual feeds, for people who only care about specific types of things I write.) Or, if you're really really attached to LJ, you can friend eevee_rss—but I'd rather you not use LJ for comments, as I won't see them!

This may or may not get me to write more, and it may or may not get people to read me more. We'll see. Suggestions welcome, as always. 8)

〜さようなら〜

Eevee has gained 1657 experience points!

*fwoosh* *do-do-do-doo!*

I'm a bit late this year, sorry. Mel and her husband just moved in. To our house. Like, permanently. Yes.

I haven't been updating LJ much in general because I'm trying to set up a self-hosted blog engine I actually like, and that's hard, and I'm lazy. I just don't enjoy writing on LiveJournal, but I do enjoy writing, and I really want a little environment that will encourage me to do it more.

Anyway, yearly highlights:

- Learned and played M:tG some. Marl brought a truckload of cards, so we may get back into this.

- Built a fake Pokémon GTS server, which may or may not still actually work.

- Invested in the stock market. Didn't lose money.

- Acquired delicious drugs that make me slightly more capable of doing anything.

- Furnished my room and the office better! Which I am now almost regretting as I had to jam a room and a half's worth of furniture into one room to make space for Mel.

- Bought a car!

- veekun got some marked improvements; near-parity with the old site, Gen IV about finished, Gen V getting there, i18n support started.

- Took Japanese a bit more seriously; took the JLPT N5 and probably passed.

- Cracked FA. Got floof up and running in the aftermath.

- Visited parents for the first time in ages. Later forged a truce with them.

- Managed to invent+get a more design-oriented position at work, which is awesome.

- Wrote some real, accepted patches for Whoosh (pure-Python fulltext indexing library), Firefox, and Bugzilla.

Not bad.

Tags:

EEVEE, save 60% on New Item!

To my considerable horror, I discovered I can't easily filter my inbox down to email-from-real-people. I wanted to find an email when the best I could remember was "it's from a person", and figured this would be easy, because I only get so much email from people. Alas.

My inbox had 12,000 emails before I set about solving this problem. I split out of it:
- 1000 financial emails: bank statements and receipts from buying stuff
- 3500 triggered, personal emails: my servers' crons, linode alerts, twitter followings
- 400 mailing list emails
- 1000 community junk emails: generally "something happened on this forum, click here to see what it actually was"
- 900 emails that just said "FA Error"
- and 1500 promotional offers.

Needless to say, I've unsubscribed from a whole bunch of nearly-spam assholes. I hadn't ever really faced just how many people snag my email and use it as an excuse to advertise crap to me as frequently as they can.

The worst offender by far was Amazon, who sent 600 of those 1500 spam newsletters. This does not include legit email from Amazon, like receipts; this is purely sales and suggested items. Jesus christ.

I'm now down under 4000 and will probably cut it down more. I wrote some sieve rules to keep this stuff out of my inbox in the future. I feel so cleansed.

Rogueish

I like NetHack. I'm not very good at it, honestly, but I've played it a lot and generally enjoy myself.

Naturally, I thus consider myself qualified to bitch about it.

I started a stub of my own roguelike, entitled "raidne", with the hopes of building what I wish NetHack were. Perhaps a worthy goal, or perhaps that ship has long since sailed—guess I'll find out. Anyway, it's a good idea to collect my thoughts before I get very far, so here goes.

(Disclaimer: I've only played a few other roguelikes, so for all I know I'm retreading ground here.)


Stats

I actually really like Fallout's SPECIAL system: Strength, Perception, Endurance, Charisma, Intelligence, Agility, Luck. It avoids some problems that gnaw at me with most other stat systems:
- More a UI thing, but absolutely everything else in Fallout starts out derived from these stats. Health, resistance to stuff, a lot of skills, etc. And the game tells you the formulae for each of these, so you don't have to guess.
- A whole lot of games have both wisdom and intelligence. I always thought this was really silly, and the division is arbitrary at best.
- 18/** str is ridiculous. That has got to go.
- I like Luck being a real stat. I also like Luck actually having a real effect on everything you do, so that max Luck is just as obviously helpful as max Strength.

I've also been told I should use the GURPS system, but it strikes me as a little... simple.

I don't know what could be done with Charisma. It works in Fallout, where there are huge conversation trees for half the people in the world, but roguelikes don't exactly have a lot of NPCs to charm. What else could it be used for?

I'm also torn on whether stats should be trainable like they are in NetHack, or a nearly-fixed constant like they are in Fallout. With the former, your starting stats barely matter and you'll end the game with everything maxed (for your race) anyway. With the latter, choice of gear may become far more interesting, but you might also want a fleshed-out secondary layer of skills (or whatever) that can be improved. That's probably a bit much for a roguelike.


Interface

Menus are great.

Your inventory should be sortable and probably show the symbol for everything you pick up, but more importantly, pressing a letter should give you a submenu of commands you can do with that item. Eat, quaff, drop, zap, throw, loot, bop, twist, alchemize, whatever. These can exist as separate commands too, if necessary, but this stuff should be ~discoverable~. (Even the NetHack GUIs are kinda bad at this.)

Also there oughta be an equipment "menu". No differentiation between accessories and armor, christ.

The mouse should be useful, because goddamn, it's 2010. Clicking could give a short menu of fast-travel/look/help/etc, or shift-clicking could be always-fast-travel, or whatever.

I want the arrow keys to work, but this presents the problem of how to do diagonal movement. I could use home/end/pgup/pgdn, as they're in the right places on the numpad, but I wanted to use pgup/pgdn for scrolling back through messages. :V

Plan B: Use shift-pgup/pgdn for scrolling through messages, and then I can use pgup/pgdn in menus without hiding the message pane. Hm. Might work.

Generally I don't want the interface to be part of the difficulty of the game. That's lame. Applying wands breaks them and probably kills you? Really?


Gameplay

I don't have a big plan for a style of game I want to build, specifically. But games like Crawl and ADOM seem to have gone much further down the RPG route, which I don't like so much; a lot of what I enjoy in NetHack is that it's clever and resourceful and makes you be the same. There are a lot of in-jokes, items with strange uses, obscure solutions to problems, and so forth. Building your stats is something that just sort of happens along the way.

I just have a thing for inventory-focused games in general. Ever play the bad 90s Amazon point-and-click game? The whole game basically came down to combining junk you picked up in creative ways to get past problems. I like that; it's obviously built into the game, but it still feels like an original solution to an open-ended problem.

So it seems I want a game focused around items. Items items items. Items are great. If nothing else, a wider variety of items would avoid the NetHack One True Ascension Kit problem, which turns the game into a boring grind. It'd also make the early game more interesting, which is good for those people (*ahem*) who tend to die around the middle and are sick of seeing nothing but iron shoes and dwarven helms. There are a lot of items in NetHack that are cool but so rare that I almost never see them, and when I do they tend to be of such specific use that they don't help me out of the dire situation around the next corner.


Discovery

The core of NetHack is identifying items, yes yes, I know.

I always felt that the game is remarkably inconsistent about what it actually lets you know. You can see your exact attributes, but not your own Luck (or even whether it's good/bad). You can gauge how much you get hit for, but not how much damage you do. You know exactly what turn it is, but not whether your prayer timeout is up.

Worst of all, the most interesting things the game tells you are mentioned once and forever forgotten. Enlightenment will tell you all of your resistances, but you have to resort to writing them down if you want to remember them—but if you're doing that, you hardly need enlightenment. Probing will tell you the maximum health a creature type has, but again, you have to jot that down if you ever want to use that information again. Not that it'll do much good unless you also do the math to figure out how much damage you're doing!

I don't want memorizing wikihack to be a prerequisite. I want a game that avoids this problem by building up its own internal reference guide, as you play, preserved and improved across games. Once I find out that kobolds are poisonous, I should have that information available forever. Consider it a guidebook passed down through the generations.


In closing

Gehennom is stupid and really boring.

Also please tell me of interesting things other roguelikes do so I can rip them off if this ever gets off the ground.

Vacation, day 3

I woke up a few times overnight and was finally dragged out of bed at the inhumane hour of 8 so our new windows could be installed. Also, we got new windows. Triple-paned and etched glass and generally gorgeous, especially compared to the single-pane aluminum garbage we had before.


Anyway, with my desktop unavailable for several hours due to men in overalls climbing all over my desk, I set about finally restoring rukushio (my netbook/laptop/something) to working order. I'd previously tried a few times to install Debian on it, with little success. The attempts were thus:
1. Got a working system, except the X it used got stuck in an endless loop of setting my screen resolution, deciding it didn't support the resolution it just set, and setting my screen resolution. So the screen flickered every four seconds, and the thing was unusable 2/3 of the time. Not a good start.
2. Got a working system, with no bootloader—GRUB, GRUB2, and LILO all mysteriously failed to install.
3. Got a working system, with a bootloader. But no GUI. And no wifi drivers. And no ethernet drivers. I don't even know how this happened. Christ.
So, inspired by magical's lofty praise and lured by the promise of a permanently bleeding edge, I decided to try out Arch Linux.

Let me preface this by saying: Do not use Arch Linux. If you want to know why I say that, the statement stands. If you want to argue with me, then nevermind; use what you want.

What a pain in the ass. To be fair to Arch, I was for some reason under the impression that installing an operating system shouldn't actually require reading the manual, unless it's stage1 Gentoo (where you started with a blank system and had to format drives, copy a skeleton system, chroot, compile your own compiler, and go from there). After a failed attempt that I blame entirely on unetbootin, I got my hands on an Arch system.

It also had no GUI. Okay, well, no problem.

It also had no wireless drivers. Okayyy.

It also had no dhclient, and doesn't autodetect DHCP when you plug it into a network. Fabulous. Luckily there's dhcpcd which I'd temporarily forgotten about, and the interface "remembered" it was DHCP after that. So I sat next to our media center with some stolen cat5, installed elinks, and got to reading some instructions.

The Beginners' Guide walked me through manually choosing and installing the following:
- X.
- An X video driver.
- X mouse/keyboard drivers.
- GNOME.
- The thing that actually starts GNOME. I'd tried installing the "gnome" group of packages before reading the guide, and found out that this neither installs X (which actually draws pretty graphics on the screen) nor gdm (which effectively starts GNOME, and without which GNOME is useless). This is like installing World of Warcraft and getting everything but wow.exe. What on Earth.
- Wireless drivers. (I already knew which, thankfully, after some runaround with Ubuntu before there were drivers for my card in the kernel.)
- Wireless firmware.
- wireless_tools, which contained the iwconfig I'd been desperately looking for.
- ALSA, the sound system, which I don't think actually works yet.
And that's sort of fine and dandy, I guess, except for the package manager, which is also impossible to use without reading installation instructions.

First, the package manager (pacman) comes with a mirror list by default. Except the mirror list has every mirror commented out by default, and pacman itself isn't quite forthcoming that this is the case. So you have to figure this out, find the mirror list, and arbitrarily pick some mirrors to enable.

Now you go to actually use the thing. Here's the manpage. Notice how (a) there are damn switches instead of subcommands, and (b) none of them are named anything remotely similar to "install". To install software you actually use -S, short for "synchronize", which I guess synchronizes the state of your software with the state of some server. I can't think of a less helpful but still technically correct word to use here.

Well whatever let's type pacman -S qt. That'll install QT, right? Whoops, no, that'll actually do absolutely nothing, even though I copied that line directly from the manpage. Can you guess what the problem is?

No, really, go read the manpage. I'll wait.

...

That's right! The first time you use pacman, you have to also use the -y flag, which somehow means "refresh", which actually downloads the list of packages. Without it, pacman doesn't think any (well, many) packages exist at all. (To be fair this is somewhat like apt's "update" command, but I don't know what apt does if you try to install something without doing an "update" first, because this situation has never happened to me or even crossed my mind as a thing that can happen.)

BUT, all told, the idea is pretty cool and executed reasonably well. I'd gotten the impression that Arch's target audience was "people who use Linux because they like and know Linux", so I'm a wee bit annoyed that a decent knowledge of Linux is actually of little help for getting a working Arch desktop. Still, everything really is as transparent as they say it is.

My biggest disappointment so far is that there's not even a third-party binary build of Firefox 4 available. I have to compile it myself? Really? We can't do PPAs?

So that was my day until noon...


After that I finally defeated my long-time nemesis, floof commenting. It now works as beautifully as I'd wanted it to, and hopefully a co-conspirator will give it a thumbs up at some point—we're trying to do this whole code review thing. I may give floof a break for a day or two, too, so I can work on these other things that have been collecting dust.


I fixed veekun's page caching woes once and for all (I think!), by combining memcached and zlib. I only pushed the fix an hour ago, but I've completely stopped getting timeout error emails, which is fantastic. This problem has been haunting me for ages and I really hope it's over with now argh.


I went over the listening part of the last JLPT practice test I took, with answer key in hand, trying to make sense of it. Some of it is better, but an alarming amount is not, no matter how many times I listen. The worst part about this is definitely not being able to copy/paste into a dictionary, or even know if I'm mishearing a word. I'm not done with this yet, and I have a bunch of Japanese Pokémon episodes to try listening to for practice, but I'm a wee bit concerned about how well I'll do on the real test.


And, last but not least, mel has begun Every Single Pokémon 2, and is taking sponsorships for individual Pokémon to help pay for the absurd amount of time it'll take. (I wrote the little tracker app and have been paranoid all day that it'll break and screw up money for everyone, but it seems fine so far, hooray.)

HERE IS AN AD

BUY DRAWING OF POKEMONS

Vacation, day 1/2

I blew the last of my time off, starting yesterday and running through next Friday. That's twelve days with no obligations. Let's see what I can get done.

Today is day two.


Day 1
So uh after that whole buying-furniture thing however long ago, my room ended up in a transitional state of disarray which ended up being not as temporary as I'd intended. So I half-fixed that; emptied some boxes (why do I still have boxes? I've lived here a year and a half) and washed ye sheets.

Started on new Anki decks; JLPT4 vocab and JLPT4 kanji. I need to do some 120 new cards, total, every day for two weeks, to cover them all. Which shouldn't be too bad, I hope, because I should know most of them already.

Finally found a solution I like to a floof problem that's been haunting me, revolving around cleanly going backwards along a relationship from several tables to one blah blah blah.

Started rewriting dywypi, my adorable little IRC bot. He runs atop supybot, which is creaky and bad, so I intend to start over and make my own pluggable bot library based on Twisted. We'll see how this goes.

Squashed a handful of veekun bugs. Found a solution I liked to the massive caching problem I'm having at the moment argh.


Day 2
Fuckin nothing. Slept until noon. Got a haircut. Forgot about flashcards. Half-implemented my floof inspiration from yesterday. That's about all. Goddamn.


Off to set my alarm for like 9; I would really rather not have an entire vacation's worth of 12-hour days.

Infinite resources

Remember driver's ed? I barely do. I don't remember how far before a railroad crossing I'm supposed to stop, or how far away from an intersection I have to be to change lanes. Probably the only thing I took away from it, the one mantra repeated over and over, is to slow down.

Raining? Slow down. Low on gas? Slow down. Bumpy road? Slow down. Every single problem can be solved—or at least mitigated considerably—by slowing down. And hidden behind this golden rule of driving is the shared secret that teenagers prefer to go really fast, so the instructors need to use every excuse they've got to combat that. If a seventeen-year-old only goes the speed limit driving downhill in a hailstorm during an earthquake, that's a small victory.

In that spirit, here's the solution to every software engineering problem:

Use more names.

We like to pretend names are a finite resource—that there are only so many of them, and if we go overboard we might run out, and our keyboards deliver us a painful electric shock every time we invent a new one.

It's surprising how often someone comes into #python to ask about anonymous functions. That is, instead of this:

def foo():
    print "hello"


they want to do this:

foo = def():
    print "hello"


Except presumably the function is going in a list, or being passed to another function, or whatever.

Well, Python can't do that, for various valid reasons. So the solution is to just make the function with a name, then use the name however you want. But coming from languages with anonymous functions, we don't want to do that. It requires like a whole 'nother line of code! And worst of all, it wastes a name!

But, well, no. It doesn't. And your code will probably end up a little easier to read if you just use a name. And if you need to do this a lot, you should be doing something else* anyway, and you'd still have to use a name.

Possibly the most common #python question is how to do type-checking correctly, for the purposes of making a function that accepts three different types of parameters. The usual response is to just make three functions, or a function with three different named parameters, or whatever. This requires more names, though, and so the questioner will often object, even though the type-checking approach is necessarily far hairier to implement/use/document.

(Not to say that type-checking is ALWAYS bad; plenty of libraries do some subtle type-checking that works quite well. But library authors are clever, and if you have to ask how to do it, then you are not clever enough.)

(The problem with magic is that, as soon as someone realizes it's there, it becomes a gigantic pain in the ass. Magic can only be perfect or awful; there is no middle ground.)

A similar problem crops up with databases (built by people who are not DBAs). Programmers really hate to create tables. We just hate it. It's an entire new table, man. That's got to be some kind of drain on the global table allotment pool, or whatever.

And so you see lots and lots of schemas that have tables with several different types of data mashed together in odd ways, and it's obvious to almost anyone that it was done to avoid a join somewhere. And these things grow continually hairier, either because you can no longer join to these tables normally and are forced to keep adding to them, or because the same people are making the same decisions.

But relational databases are designed to have lots of tables; it's even in the name. The solution to every weird database problem I've encountered has usually been "add a new table". We often act as though this should be an absolute last resort, actively working against the design of the system in the name of some misplaced desire for minimalism.


I suspect programmers have a broken sense of "complexity" in the first place. I've seen enough rookies who want to know how to pick a variable name based on user input, e.g. I enter "cow" and you do something with the variable animal_cow. We have data structures for this sort of thing, man. Yet I bet every single one of us has had that moment, even if just once, where we think: this problem isn't really complicated enough to need that extra structure, is it?

Resist your neuroses; go forth and name.



* Try this on for size:

>>> funcs = []
>>> @funcs.append
... def foo():
...     print "hello"
...
>>> funcs
[<function foo at 0x7fd4e3bb7500>]
>>> funcs[0]()
hello

Tags:

Streak broken

I skipped Saturday, because I was working on something cool that was intended to take the place of a blog post. And then I didn't finish it, and have barely touched it today. Oops. Maybe tomorrow.

Poly

For those somehow not yet aware, I'm dating Mel (aka PurpleKecleon), and have been for some two and a half years. She is also married, and has been for about the same amount of time.

Mutual friends of ours still occasionally "discover" this, and are surprised. That's to be expected; I know it's an unusual situation, and I secretly enjoy being inherently surprising anyway. What I don't really appreciate is the inevitable question, which almost everyone asks:

Does [the husband] know?

Please take a moment to consider what you're very, very strongly implying here.

I made a thousand bucks!
You didn't rob a bank, did you?


Hey so I just had sex with my girlfriend.
Oh, did you rape her?


You are double-checking that I'm not facilitating cheating. Even beyond that, you're double-checking that I'm not also announcing it publicly, giving it a legitimate relationship label, and putting the burden on you to keep my dark secret. I can't think of any other possible way to interpret this question; what else could a "no" mean?

I've visited Mel quite a few times. She's visited me. The three of us have gone on trips together. Is the expectation of monoamory so strong that my being some kind of relationship-destroying mastermind is a more likely explanation than this being exactly what I say it is?

I always get asked followups like "do you have sex", too. What the hell else would I mean by "girlfriend"? I wanted to give a ridiculously exaggerated example alternative here, but I can't, because I really don't know any other interpretation.

Can we just come out and ask is this what it sounds like, rather than playing process of elimination with the wildest alternatives first? The world needs far less double-take questions.

I'm not so easily offended, but man, having good friends ask condemning questions is quite a kick in the gut.

Digital ownership

But not in the way you think.

I haven't spoken in a while about my core idea for floof, and it's sort of gelled a bit, so I want to try to express it again. It's not about anything technological, really; nor is it just about categorization (though that's always awesome).

What I really want to do is strip out all the contrived areas of private control that plague sites like DA.

Wait, that sounds bad! Hang on, give me a minute here.


You know wikis? The main attraction is the articles. They're publicly-editable, yes, but ultimately they're only each put together by a fixed set of people. Sometimes, only a few people. Sometimes, just one guy.

Every article has a talk page, where people can talk about issues with the article, and occasionally stray a bit and talk about the content of the article itself.

But here's the thing: nobody would ever claim that the talk page is owned by the people who worked on the article. That's ridiculous. The talk page is public space. If you make a scene on the talk page, you're making a public spectacle of yourself, and inflicting it on absolutely anyone who comes by.


Forums are much the same. Some people may lay claim to big threads they created and upkeep, but they don't own those threads or generally have any power over them. If someone's being a douchebag, he's being a douchebag to the entire forums, not to the particular thread, and he's punished appropriately. Or, should be, whatever.


Now consider deviantArt.

User X posts some art. User Y comes along and comments on it.

Not only does X have the power to remove Y's comment—thereby preventing the entire general public from also seeing that comment—but X has the power to prevent Y from ever commenting again in the future.

Worse, say X comments on something user Z owns. In the case of dA, the block leaks across, and Y cannot reply to X's comment. So now this power has infected Z's space, as well.

This all seems silly. These are art galleries, are they not? Do brick-and-mortar art galleries have the artist standing next to his/her work with a tranq gun, ready to silence any commentary they don't like?


And so the most radical thing I want to do is thus, which I'm not sure has ever been done before on a community-ish site.

No blocking.

If you have irreconcilable differences with someone, you can instead push a button and ignore that person. Comment threads started by that user will vanish entirely. His/her art won't show up anywhere. Nothing an ignored user does will trigger a notification to you or otherwise be visible in any way, ever.

Rationale:
1. Ultimately, the comments aren't yours. The art is, of course! But the comments are just the input of passers-by. This isn't your blog or Facebook; it's a shared art collection. Having a complicated system of prohibitions around who can talk about the art just strikes me as fundamentally backwards.
2. If some guy is inflicting enough distress on the site, then he should be banned. (Possibly temporarily. Possibly not.)
3. Your judgement is not necessarily perfect or even very good. Maybe you have an itchy trigger finger. Maybe the guy was having a bad day. Maybe you're an asshole, who knows. Let your viewers gauge for themselves whether they want to see what this person has to say.
4. Blocking doesn't make you less mad; it just stops you from getting more mad. You can still see the existing comments, and you can still stumble across the person elsewhere. It'll scab something over, but you're free to keep picking at it.
5. The absolute most reliable way I've ever seen to defuse an internet argument is to stop replying. Blocking is a slap in the face to the other party, which breeds resentment and bitterness that I do not need on my amazing website. Ignoring (and subsequently going quiet) lets the whole thing fade away.
6. Whose blocklist should take precedence in the case of e.g. collaborations? Ignore circumvents that problem entirely.
7. USENET did it, and just look where they are now!


Of course, there would also not be comment deletion. And to compensate for the shift in "ownership", I'd think people should be held far more accountable for what they say in public. You shouldn't need to be a prick to 200 different people before attracting administrative attention.


Crazy? Brilliant? Vociferous?! Let me know!

Tags:

Latest Month

February 2011
S M T W T F S
  12345
6789101112
13141516171819
20212223242526
2728     

Eevee's endeavors

RSS

RSS Atom

Comments

Powered by LiveJournal.com
Designed by Lilia Ahner