| Upcoming iPhone apps |
Thu, 2008Jul10 09:10:52 PDT
in Mac by kamikaze
|
|
Over the next weekend, I should be able to get two more iPhone utilities packaged up and out.
- A programmer's RPN calculator, with base 10 and 16, a full set of binary operations, basic trig operations, history, and memory, and more coming. I was worried Apple would stomp on me with their Calculator's sideways "scientific" mode, but it turns out to not have RPN, and anyway, they don't have the functions I and other programmers need.
- An RPG dice roller.
Then I can get back to work on my big iPhone RPG. Stay tuned! |
| iPhone App Store is up! Castles is released! |
Thu, 2008Jul10 07:37:13 PDT
in Mac by kamikaze
|
|
The iPhone App Store is open now, and my first game for the iPhone is out:
(direct link to the app store)
However, the categorization still leaves a lot to be desired, since only 15 games show up in the App Store tool (but 199 Entertainment items!?), and Castles isn't one of them!
Anyway, I'm still really excited! Come buy Castles! It's an insanely addictive little wargame. |
| Yahoo Spam, I mean, Mail |
Sat, 2008Jul05 10:49:21 PDT
in Web by kamikaze
|
|
I wanted to sign up for Uli Kusterer's mac-gui-dev mailing list.
I have an old Yahoo!® account, but I plan to get rid of it because it's a giant spam bucket. So I make a new one. Here begins my tale of woe.
I pick my standard trashcan account for the "alternate address", and go immediately to the marketing page and turn OFF all the dozen+ junk mail lists Yahoo!® sign you up for when you create an account.
I join the group, that works fine. Now I try to add a new list-collecting address at one of my sites as another alternate address. And the form just silently fails. Nothing happens.
I submit a problem report, and frankly at this point I don't expect anything to happen, I expect they'll just ignore it and continue fucking up like the bunch of yahoos that they are at Yahoo!®.
So for now, I need to use Yahoo!®'s mail reader. When I get into the web-email client, I don't see my inbox. First, I get assaulted with a bunch of modal dialogs pointing out the features I didn't ask for, didn't want, and have fuck-all to do with my email. Underneath them is a page full of ads and news links and every damn thing except email. There's no way to turn this off and go straight to the inbox.
Then when I manage to fight my way to the inbox, I get assaulted by a giant red blinking "YOU ARE ALREADY A WINNER" circa-1996 banner ad. Who the fuck is stupid enough to click on one of those? Are they just trawling for lonely, confused old pensioners and stealing their money? Yahoo!® helps con artists steal money from your gramma. This is a fact.
Every single step of this process is filled with hate. I'm not going to be favorably inclined to anyone stupid enough to advertise there, I'm going to despise them and buy from their competitor. Almost every part of the site is hideous and bad.
I'm clearly spoiled by Google's nearly perfect Zen design. It's mellow, simple. Plain text, no garish colors, no blinking, no image ads. They focus on the content you want, with some other stuff off to the side you can look at if you want. Even the customized, art-themed iGoogle page is an order of magnitude simpler than the Yahoo home page, and it's entirely optional.
Yahoo!® is no damn good at anything. They betray their customers to the Chinese dictatorship to be imprisoned and tortured, they spam and infect PCs with viruses, and they can't even get something as simple as webmail right. Yahoo!®, please die. |
| Firefox 3 gives us the Evil Eye |
Thu, 2008Jun19 14:41:31 PDT
in Web by kamikaze
|
|
The Firefox 3 release is out, and... it's awful. I suppose Linux and Windows users don't notice this, they probably think it's great, because they have no taste. To a Mac user, it's repulsive and dysfunctional.
- I will give them this: it's a proper DMG without an installer, just drag the Firefox.app into your Applications folder, or wherever you want it. This concludes the positive items of this "review".
- Even launching FF3 sucks: FF icon appears and bounces, then vanishes from the Dock, then a new FF icon appears and bounces, and after a second bounce it comes up. Ah. Upon further experimentation, it seems that if you switch between FF versions, it does this. Since I'm a web developer by day, I'm going to be going through this a lot. HATE.
- The obvious first thing about the window is the
"Evil Eye" back/forward buttons, which are just creepy. Make it stop leering at me! HATE.
- Unlike a real Mac app, right-clicking on these buttons doesn't give you the customize toolar menu. It just does nothing, if you don't have a history. Clicking on other buttons does work. HATE. When you find the customize panel, you can use small icons, and the buttons look less insane.
- Dragging the gray gradient "metal" parts of the interface on any modern Mac app will drag the entire window. This works in all of Apple's apps, and most 3rd-party Mac apps. It's a free behavior in metal apps created with Xcode. However, this isn't a real Mac app, it's an empty window painted entirely by Firefox. So dragging the window around doesn't work when you expect it to. It has a smoothed single menu bar/toolbar look, but only the Apple-controlled menu bar actually lets you drag. HATE.
- Right-clicking on text to look something up in Dictionary or Spotlight doesn't work right. None of my Services menu options work; in particular, I use BBEdit's "New Window with Selection" and Mail's "Send Selection" items several times an hour. These features don't work, because Mozilla aren't using the real Mac text components, and didn't bother to finish the OS integration. HATE.
- In Safari, Cmd-1 through Cmd-9 activate the first 9 toolbar bookmarks, presumably the ones you use the most. I use that constantly (I have them labelled 1 gmail, 2 Twitter, 3 GNews, etc.)... There's no equivalent in Firefox. HATE.
- The form controls are grossly broken and wrong on the Mac. They look like crap, and don't behave like real Mac controls. HATE.
- I don't even want to get too far into performance. On a Flash-heavy, JS-heavy site, FF is currently using 97% CPU, Safari 37%. Both around 120MB RAM. Haven't done any long-term performance/memory testing, but I would expect Safari to continue being massively faster while using less CPU power. Speed isn't just in a number-cruncher's interest, it's a key part of making an app responsive. Every new release of Apple software is faster than the previous, while every new release of Mozilla software is slower. HATE.
- [update 2008-06-20] Dragging a bookmark out of the bookmark bar doesn't destroy it in a puff of smoke, like dragging things out of the Dock, or Safari's bookmark bar, or any toolbar in Mac OS X. HATE.
The whole thing is typical of everything Mozilla does. Left to themselves, they make ugly, unusable trash. If the users complain enough (like about not matching the Leopard light bg/dark fg theme), they can copy how something looks, but they're utterly incompetent at copying how it works, and the only user testing they do is with autistic Linux nerds. We already knew this, of course. Look at Bugzilla, and you'll quickly discover that user experience is job 65535.
Sadly, I have to test my work on Firefox before release, though I use Safari for most of my work. I would never survive using Firefox as my real browser now.
I wasn't this negative about previous versions. I used to LIKE Firefox. It was probably just as bad as the current version, but that was before Safari showed us how a browser could not suck. |
| Planet Stories |
Wed, 2008Jun04 17:29:06 PDT
in Roleplaying by kamikaze
|
|
Yesterday morning, I ordered everything Paizo's Planet Stories had that I didn't (I've long since read every Michael Moorcock and Robert E. Howard story). They arrived this morning (DAMN fast shipping, but of course we're in the same city):
- Gary Gygax: Anubis Murders, Samarkand Solution
- C.L. Moore: Black God's Kiss, Northwest of Earth
- Henry Kuttner: Elak of Atlantis
- Leigh Brackett: Secret of Sinharat
Yeah, some good old-fashioned swords & sorcery (and swords & planet) stories!
The upcoming Planet Stories novels look great, too, and publisher Erik Mona has a great list of pulp authors he wants to add. |
| Swords and Sorcery |
Thu, 2008May01 05:36:24 PDT
in Roleplaying by kamikaze
|
|
I've been working on my new tabletop RPG, both for use as a real tabletop game, and as the background and game system for my iPhone game. The plan is for the story to begin on the iPhone, and then provide a jumping-off point for tabletop play. I also have some online gaming tools I've been working on to make it easier for gaming groups to play even if far apart. Think of it as a whole party of webcam players from Full Frontal Nerdity.
The game's name is Torchbearer, implying both the lowly henchman who creeps along behind the hero holding a torch so the hero can fight something terrible in the dark, and Prometheus, carrying fire down from the gods to humanity and paying terribly for his mercy and heroism.
(if you're reading this in a feed, click More for the rest of the post)
The RPG is based on swords & sorcery, the good stuff: Edgar Rice Burroughs, Robert E. Howard, Fritz Leiber, Michael Moorcock, Clark Ashton Smith, and Karl Edward Wagner. Civilizations fat with wealth, but corrupted from inside by serpent-men and cultists to dark and terrible gods. Barbarian cultures, primitive and brutal but honorable. Horrific monsters lurking in every tomb, dark wood, and dark temple. Priests sacrificing virgins as their minions chant, and heroes cutting them down like wheat with their insane, soul-drinking intelligent magical swords...
As for setting, I'm adapting early Imperial Rome, the Mediterranean, and the barbarian lands surrounding civilization. Historical accuracy will be almost totally ignored, and where it makes for a better setting there'll be about 5 centuries of history crammed together, but the flavor of the period will be kept. I really don't get why everyone uses medieval Europe OVER and OVER and OVER. Rome has cities and merchants and strange unexplored lands full of barbarians and monsters, the Mediterranean is, as Odysseus/Aeneas found out, a lot more difficult to sail than you'd think. I recently started reading the Robert Fagles translation of The Aeneid, and it's damned good. David Drake wrote a great series of fantasy/science fiction stories set in Rome, which make use of both the mysteries of the ancient world and the politics of Rome. And of course, the greatest Greco-Roman mythology movie ever, The Clash of the Titans, animated by Ray Harryhausen.
The Roman Empire has some serious virtues for gaming. The frontier is vast and unexplored. The center of the Empire has all the civilization you could want, as do the cities in most provinces, but there's room for a hero to follow his own path. There's real diversity when you travel, since every province was allowed to maintain its own laws and religions, and religion was syncretic, pantheistic, and tolerant (except of Christians, of course, who were quite rightly fed to lions). Once you leave the Empire, things get really weird and different.
What it's not is D&D. Dungeons & Dragons, and all the computer RPGs based so very blatantly on it, are not swords & sorcery. Real swords & sorcery ultimately requires three elements:
- Swords. The solution to a problem is almost always to chop its head off; finding the right person or thing to kill may require some quick thinking and perception to find, but strength and brutality are the answer. Careful planning, organization, these are anathema in S&S. If you waste your time on planning and preparation and sitting around healing, the evil high priest will sacrifice the pretty virgin and end the world. Battle is disorganized, chaotic, and a single sword strike can kill anyone, if you can reach them. Defenses and fatigue and escape options are worn down in a fight, not hit points.
D&D is about planning and organization, with mono-skilled people who fill precise party roles that have to be managed like a corporate office. Combat is just an accounting exercise in whittling the enemy's hit points down to zero before yours; in MMORPGs like EverQuest and World of Warcraft, people compute "DPS": Damage Per Second. Healing is a matter of sitting around forever, waiting to heal, or expending centrally-managed resources. At least the MMOs add some special maneuvers and chained attacks for combat, but D&D combat is just "Roll d20. Compare to a target number. Roll dice for damage. Accountant marks down remaining HP budget. Repeat." I may die of boredom.
- Sorcery. The opposition uses dark and terrible magics. Sorcerers may well have some direct-attack spells, but most of the magic is ritualistic, takes hours to perform, and can be disrupted at the last minute. Powerful magic is incomprehensible to an honest barbarian mind. Magic is not reliable, and does not follow strict rules.
In D&D, magic is mechanical and soulless. You have to choose exactly which spells you'll use ahead of time (a magic system copied from Jack Vance's humorous parodies of swords & sorcery... it's meant to be preposterous and stupid, and yet 30 years of D&D players have taken it seriously!). Magic always works, exactly the same way every time. The spells are rigidly specified all the way up through Wish. A wish, in literature and movies ever since 1001 Nights the most free-form, random event possible, has been reduced to a legal exercise in D&D.
- Mystery. The hero of a swords & sorcery story may never understand what really happened, what the monster was or where it came from. Even the reader is left unsettled, unsure of the foundations of the world.
Dungeons & Dragons has no mysteries. Everything is statted out in the rules, down to the last hit point, treasure type, and "% in lair" chance. Magic items are just a more exclusive catalog than the equipment section, the "Sky Mall" and "Sharper Image" of their world. There is no existential horror. There is no chance of anything beyond the scope of the rules happening. It's just routine. Another Orc guarding a chest. Another Owlbear. Another Gelatinous Cube. Troll? Get out the acid and a torch. Pass me another sheet of graph paper, I need to map this section of the dungeon in 10'x10' squares. They have sucked the mystery dry and left a lifeless husk.
The original D&D introduction is fantastic, but so very ironic considering how bureaucratic, mechanical, and wargamey the later editions became, and how few gamers these days have even read the authors named:
These rules are strictly fantasy. Those wargamers who lack imagination, those who don't care for Burroughs' Martian adventures where John Carter is groping through black pits, who feel no thrill upon reading Howard's Conan saga, who do not enjoy the de Camp & Pratt fantasies or Fritz Leiber's Fafhrd and the Gray Mouser pitting their swords against evil sorceries will not be likely to find DUNGEONS AND DRAGONS to their taste. But those whose imaginations know no bounds will find that these rules are the answer to their prayers. With this last bit of advice we invite you to read on and enjoy a "world" where the fantastic is fact and magic really works!
-E. Gary Gygax, 1 November 1973
As far as rules go, obviously, I think there's a lot wrong with AD&D. D&D 3.0/3.5/OGL/D20 still has everything that was wrong with AD&D, plus it's a bookkeeping nightmare. D&D 4.0 looks to be a catastrophic mess, more collectible card game or minis game than an RPG at all.
I do have some respect for the Holmes edition of Dungeons & Dragons. This is what I learned with, back in 1978, and on recent re-reading, it holds up well as a role-playing game, and as a swords & sorcery game, better than any later edition. The white box is too disorganized and has the flaws of being the first attempt ever to codify role-playing into rules, and the Tom Moldvay Basic/Expert/Companion/Master/Immortal D&D series was too polished and abstracted and dumbed down for children, almost more of a boardgame than an RPG.
John Eric Holmes (also the author of Mahars of Pellucidar, an excellent E.R. Burroughs sequel) put together a D&D that was easy to learn and play, loose and mysterious enough that you weren't trapped in an accounting or research hell, and actually approaches swords & sorcery. Many of the flaws of D&D are irrelevant in it. Because it only covers levels 1-3, and advancement is BRUTALLY slow (one level every 6-12 long sessions, probably 20 shorter "adults with jobs" sessions), you don't ever have gigantic stacks of hit points to wear down, and a hero can at best take 2-3 sword thrusts instead of 1. Mages are not artillery, clerics are not endless healing machines. High-level spells and magic items beyond the basics provided would be left up to the Dungeon Master's discretion. While it does have the dry bestiary problem, statting up all the monsters to high levels, most of them are so powerful that you cannot ever fight them head-on without an army. The sample adventure is surprisingly good, and ties into Holmes' Dragon Magazine short stories and his fantasy novel, "Maze of Peril".
There are people around who play this edition as if it was a complete game, sometimes augmented to level 9 by a "supplement" built from other editions (see Retro Roleplaying).
That's not to say it's without flaws. It has the idiotic Vancian magic system, which combines with low levels to make mages useless. Mages should be less powerful than swordsmen, but not crippled as they are in this D&D; 1-3 spells at most, and they're done, useless in combat and without any other skills. At least clerics can turn undead and fight once they've expended their meagre set of spells. The slow, bordering on non-existent, advancement means that all you are, all you ever will be, is what you are now. Equipment thus becomes disproportionately important. The very low stat bonuses in it do discourage min-maxing, but they also mean that almost everyone with the same class is identical in ability. It has rigid classes, and very few of them, so there aren't any real choices. Fighting Man, Thief, Cleric, Magic-User. That's it. Dwarfs and Halflings can only be Fighting Men or Thieves, Elves can only be multi-classed Fighting Men/Magic-Users. Apparently the gods don't like demi-humans enough to let them be Clerics.
Even if I put aside my disdain for the Tolkien setting elements, and the decades of terrible TSR fantasy "novels", there's no way I could ever actually play this again. Still, it's interesting, and looks fun aside from some problems, in a way that few later Dungeons & Dragons products ever have been.
So. Torchbearer's game design so far is very simple, and unlike my previous indie games, deliberately uses D&D-isms where they make sense, but still throws them out where they don't. I'm hoping to make it easy to convert D&D adventures over, and the conversion system will be as much about changing the tone to swords & sorcery and correct Roman citizenship as about changing the mechanics.
The stats are similar to D&D, and yet adjusted to distribute their value more evenly. The one time D&D ever tried to change its stats was with the addition of Comeliness, which just made Charisma even more useless. Torchbearer's stats are: Strength, Health (just a shorter name), Agility (as it represents physical coordination more than manual dexterity), Intellect (as much perception and education as intelligence), Willpower (no relation to Wisdom; Willpower enables resistance to magic and aids in survival), and Presence (used by priests, and made significantly more useful than D&D's "dump stat" Charisma). These are all 3-18 scores, rarely going up to 19 (or 20 for gods and godlike monsters), but they can be improved in play. Modifiers are significant in the game, but any decent stat will get a bonus, so I'm hoping a fair set of 3d6 rolls remains fun.
The races aren't Tolkienesque (no Elves/Dwarfs/Halflings! Ever!), they're Roman: Civilized Men, Barbarians, several kinds of Nymphs, Centaurs, Satyrs, and more. I've found some interesting ways to differentiate the races and balance them.
Torchbearer is skill-based; there are no classes, and anyone can develop any skill as well as anyone else (subject to stat differences). In most skill-based games, there are dozens of skills and it takes forever to allocate points among them. Not so here. There are currently 9 skills: Armor, Artifact, Athletics, Burglary, Lore, Magic, Melee, Missile, Prayer. I might have a couple more by the time I'm done, but these are pretty near complete already. By mixing your skill selections, you get very different character types. If you want a thief who can fight well, focus on Melee and Burglary; if you want a wizard, Magic and Lore; if you want a wizard-thief, Magic and Burglary. You won't get many skill points per level, but every skill rank really matters, it's not just a small chance of success upgrade.
It is level-based, both for compatibility and because I do find that levels help the Judge balance encounters, and force a smoother distribution of power, rather than a character focusing on ONE skill at the expense of all others. Experience can be earned by fighting, but also by exploration, social advancement, magic, role-playing, puzzle-solving, and so on; a totally peaceful campaign should be possible, though certainly that's not the main-line choice.
Combat will be rather different from other games. A deck of cards is used to give the player choices in duelling strategy. Miniatures and a battle map are NOT to be used; foes may occupy different range bands, and advance or retreat along them, but are presumed to be very mobile throughout the area during a fight. Damage, too, is very different and more dangerous than in most other games. While not "everyone dies in every fight" lethal, it is considerably more dangerous regardless of level than an accounting game like D&D. Warriors win by intimidation, trickery, quick strikes, and defenses, NOT by being able to absorb dozens of blows before falling. Watch the swordfight in The Princess Bride. How many hits does anyone take?
Magic is unreliable, but spells can be shaped in many different ways, rather than having a laundry list of specific effects. Monsters use a construction and/or randomization system, so there will never be a "standard bestiary".
When complete, the game will be available as a low-priced PDF from an online store, and I may be able to set up print-on-demand. This won't happen for some time; I expect to get the iPhone game out this summer, and the tabletop game will follow it, possibly coinciding with the online tools.
|
| iPhone vs. the Mobile World |
Mon, 2008Apr28 16:14:25 PDT
in Mac by kamikaze
|
|
I've made some good progress on my iPhone game, and I've been thinking about how it compares to previous mobile platforms.
I've done mobile development with C on Palm, Java on a couple of J2ME devices, and now Objective-C/Cocoa on iPhone.
Mobile development is about limitations. Mobile devices have incredibly limited memory, often 64K RAM (yes, kilobytes, just like the Atari 800, Apple ][, and Commodeodor-64 (sorry, old habits die hard). They have incredibly limited CPU power; rarely more than 100MHz CPUs, often not even true 32-bit CPUs. The screen size itself isn't that bad; I was quite happy on my 320x192 (monochrome) or 160x192 (4-color) Atari 800. But that was on a 15+" TV screen, not a 2" phone LCD.
The iPhone's specs are significantly higher than those: a 300MHz CPU, 64MB user application space, and nigh-unlimited storage in a real filesystem (albeit a sandboxed filesystem), as well as real SQLlite databases. The screen is relatively huge: 320x480, with 256K colors, and 160DPI (nearly print quality). I'm not particularly enamored of the on-screen keyboard, or lack of a stylus for precision touch, but it's still a good device.
PalmOS was kind of awful even back in the '90s. 16-bit memory space, paging data in and out, a totally weird and alien non-file-based filesystem, and a flaky set of tools (anyone who liked CodeWarrior was insane). Every OS release broke most of the apps, often in data-destroying ways. Not a happy place. But the GUI was fantastically easy to program for, and the devices just worked right. If only Palm hadn't gone into a coma for the last decade, they could still be #1.
J2ME is actually kind of okay. Java's GUI support is pretty lame, but the language is nearly as efficient as native code, especially in the form used by mobiles. If you don't make gigantic trees of objects, and pay attention to memory use, you can make interesting stuff in 64K or 128K. The problem is that almost every phone is slightly incompatibility with the standard.
Android has some chance of doing well with their approach, which is to use Java to compile to "native" code (actually an intermediate bytecode that gets compiled to native later), and provide common APIs which hopefully will be implemented the same way everywhere. Hope. That's the word, because there's no real Android phones yet, and the demos have not shown attractive work. Android's OS is pretty weird, and pretty awkward to use. A lot depends on whether any of the phone vendors can do something attractive and useful with it, and they don't have a good track record of making pleasant devices.
A few people have suggested using Python, Ruby, .NET, and other scripting languages on mobile, which is so ludicrous I can hardly believe my eyes when I see it. I'm a gigantic fan of using Python for system scripting, but its speed and memory consumption are abominable, there are few GUI libraries worth using on any platform, and none appropriate to a mobile device. Python's a totally inappropriate choice for mobile. Ruby's performance is significantly worse than Python's. .NET is tied to Wince devices, which are one of the worst failures ever in the mobile space.
So compared to all that, the iPhone's been the only one that isn't awful. It does require learning Objective-C and Cocoa, which are daunting to the uninitiated, but any halfway-competent Mac developer can learn the Touch API quickly. |
| Shell + Whitespace = FAIL |
Sat, 2008Apr26 15:33:45 PDT
in Software by kamikaze
|
|
The old Unix and MS-DOS filesystems expected that all filenames would consist only of letters (lowercase on Unix, uppercase on MS-DOS), underscores, dashes, periods, and digits (everything else was dangerous SOMEWHERE). So you could get away with tools requiring space-delimited filenames. This is still enshrined in the way we encode URLs: http://example.com/Hey, check this out!.txt becomes http://example.com/Hey%2C%20check%20this%20out%21.txt Ugh.
Nobody uses such a limited set of characters in their filenames anymore, except hardcore Linux nerds. So when they have to interact with real files, named with spaces and parens and all sorts of punctuation, it's a catastrophe. The Unix shells are, essentially, useless for dealing with this world.
If you want to rename all files in subdirs, you could try using find:
find . -name "*.foo" -exec mv {} `basename {} .foo`.bar
This fails when you hit spaces. Try interpolating quotes... And names containing quotes fail. It's an unsolvable problem. You can pipe it through 'xargs' and 'read' and try to put it together, but it'll never be more than a spit-and-baling-wire solution.
The sane solution is to use a real language to process the files, like Python. changeExt.py is an example of this:
#!/usr/bin/env python
import os, sys
where = sys.argv[1]
fromext = sys.argv[2]
if not fromext.startswith("."): fromext = "."+fromext
toext = sys.argv[3]
if not toext.startswith("."): toext = "."+toext
for (root, subdirs, names) in os.walk(where):
for name in [x for x in names if x.endswith(fromext)]:
newname = name[0:-len(fromext)] + toext
print os.path.join(root, name), "->", newname
os.rename(os.path.join(root, name), os.path.join(root, newname))
There's more boilerplate to set it up, but it's correct, and can be easily modified for a different task, or generalized to call any function with eval. |
| Don Knuth is Wrong, Alas |
Sat, 2008Apr26 12:41:53 PDT
in Software by kamikaze
|
|
InformIT interview with Donald E. Knuth
I'm astounded, disappointed, and frankly repelled by much of what he says. This is almost tragic: I pretty much learned my serious computer science skills from Don Knuth's The Art of Computer Programming. They're extraordinarily difficult books to read and work through, but they're very rewarding in teaching algorithm design and optimization. The beta versions of the new editions have been interesting, and the MMIX virtual machine was much more relevant to modern hardware. So imagine my surprise here:
Knuth:
the idea of immediate compilation and "unit tests" appeals to me only rarely, when I’m feeling my way in a totally unknown environment and need feedback about what works and what doesn’t. Otherwise, lots of time is wasted on activities that I simply never need to perform or even think about. Nothing needs to be "mocked up."
I'm not entirely a test-first, test-driven developer. Graphics and interaction make up most of my code, which isn't productive to unit test (QA testing, later, yes). But by and large, and especially when building any algorithm and back-end logic, the tests are the proof that I've actually done what I thought, that there are no typos, and that it runs in something less than geological time.
While some smaller segments of algorithms can be proven mathematically, most code cannot, and the larger interactions absolutely cannot. So you're left with testing the edge cases and most common cases. Unit testing is the only way to isolate those tests from the rest of your app; QA testing just shows that the app looks correct, unit tests show that each part is still working correctly.
Knuth:
Still, I hate to duck your questions even though I also hate to offend other people’s sensibilities—given that software methodology has always been akin to religion. With the caveat that there’s no reason anybody should care about the opinions of a computer scientist/mathematician like me regarding software development, let me just say that almost everything I’ve ever heard associated with the term "extreme programming" sounds like exactly the wrong way to go...with one exception. The exception is the idea of working in teams and reading each other’s code. That idea is crucial, and it might even mask out all the terrible aspects of extreme programming that alarm me.
I also must confess to a strong bias against the fashion for reusable code. To me, "re-editable code" is much, much better than an untouchable black box or toolkit. I could go on and on about this. If you’re totally convinced that reusable code is wonderful, I probably won’t be able to sway you anyway, but you’ll never convince me that reusable code isn’t mostly a menace.
Yow. Extreme Programming's main practices are just good software engineering practices (GSEP hereafter) pushed to the logical conclusion. Unit testing is GSEP, so all code where practical is written test-first, then implemented. Code review is GSEP, so all code is written in pairs, constantly reviewed. Regular check-in to source control is GSEP, so code is only written in short sessions and committed. If you can't check in, you throw it out and try again at a smaller task. Regularly integrating all code in the repository is GSEP, so you set up a build machine to immediately get all checked-in code, build it, and run the unit tests, with a prominent alert if the repository has broken code, and nobody does any more checkins until the build is fixed.
These are all provably 100% improvements in software engineering. The name "extreme programming" might be a bit silly, but it's actually the most serious set of practices I know of. For a single developer, some of them can slide without harm, and some teams might consider them to be more overhead than they're comfortable with, but they're as real as gravity, the heliocentric model of the solar system, and evolution. These are facts. It is nonsensical and religious to dispute them. I'm really appalled.
The notion that reusable code is a menace, that libraries of well-tested, carefully-designed tools do not lift you up and make you more powerful, is so alien and dysfunctional I don't know how to even communicate with that.
And now for the real horrorshow:
Knuth:
I might as well flame a bit about my personal unhappiness with the current trend toward multicore architecture. To me, it looks more or less like the hardware designers have run out of ideas, and that they’re trying to pass the blame for the future demise of Moore’s Law to the software writers by giving us machines that work faster only on a few key benchmarks! I won’t be surprised at all if the whole multithreading idea turns out to be a flop, worse than the "Titanium" approach that was supposed to be so terrific—until it turned out that the wished-for compilers were basically impossible to write.
Let me put it this way: During the past 50 years, I’ve written well over a thousand programs, many of which have substantial size. I can’t think of even five of those programs that would have been enhanced noticeably by parallelism or multithreading. Surely, for example, multiple processors are no help to TeX.[1]
How many programmers do you know who are enthusiastic about these promised machines of the future? I hear almost nothing but grief from software people, although the hardware folks in our department assure me that I’m wrong.
Actually, most of the good programmers are pretty enthusiastic about multithreading. If you perform a long operation in response to a user event, a single-threaded application will block (and on the Mac, give you the spinning beach ball of death: ). A multithreaded application can respond to the event, fire off a task to work on it, and return to the user; this is a gigantic leap forward in usability.
The OS/2 user interface guidelines required that you react to an event within 0.1 seconds. Not surprisingly, OS/2 had fantastically good threading support for its time. Threading is hard with most older languages and APIs, but modern languages and frameworks make it approachable: Java has had quite good threading and tools for years, ever since Doug Lea's Concurrent Programming in Java, now the java.util.concurrent libraries. Objective-C/Cocoa has NSOperation. Functional languages are better at multithreading, like Haskell, Scala, and Dylan, and these languages are growing in popularity. One of the few major problems with Python is that the "Global Interpreter Lock" prevents true multithreading, which cripples its long-term performance. Python was never meant to be a fast language, but every generation of chips is going to make it fall exponentially further behind until the GIL is removed.
Knuth:
I know that important applications for parallelism exist—rendering graphics, breaking codes, scanning images, simulating physical and biological processes, etc. But all these applications require dedicated code and special-purpose techniques, which will need to be changed substantially every few years.
Even if I knew enough about such methods to write about them in TAOCP, my time would be largely wasted, because soon there would be little reason for anybody to read those parts. (Similarly, when I prepare the third edition of Volume 3 I plan to rip out much of the material about how to sort on magnetic tapes. That stuff was once one of the hottest topics in the whole software field, but now it largely wastes paper when the book is printed.)
The machine I use today has dual processors. I get to use them both only when I’m running two independent jobs at the same time; that’s nice, but it happens only a few minutes every week. If I had four processors, or eight, or more, I still wouldn’t be any better off, considering the kind of work I do—even though I’m using my computer almost every day during most of the day. So why should I be so happy about the future that hardware vendors promise? They think a magic bullet will come along to make multicores speed up my kind of work; I think it’s a pipe dream. (No—that’s the wrong metaphor! "Pipelines" actually work for me, but threads don’t. Maybe the word I want is "bubble.")
This is entirely backwards. The kind of work Knuth is doing is reaching irrelevancy, because it depends on having a single super-fast monolithic computing core, like an old-fashioned mainframe. But we don't have those anymore. We have a network or cloud of computing systems, and we push work out to a bunch of them, collect results when they get done, and make them fault-tolerant. SETI@home is impossible on a monolithic computer, but a cloud of cheap, simple computers is chewing away on it all the time.
This isn't the future of computing, it's the present. Single-processor systems are archaic, and cannot scale much further. We can get almost infinite scaling by parallelism, following the model of the best computers around: the human brain. There is no core CPU in the brain, it's just a bunch of tiny, almost useless processor nodes chatting with their neighbors along weighted connections.
Knuth:
I currently use Ubuntu Linux, on a standalone laptop—it has no Internet connection. I occasionally carry flash memory drives between this machine and the Macs that I use for network surfing and graphics; but I trust my family jewels only to Linux.
[...]
From the opposite point of view, I do grant that web browsing probably will get better with multicores. I’ve been talking about my technical work, however, not recreation.
This is perhaps the most weird and alien part. The Web is not "recreation" only; it sure can be, like any other medium, but it was designed for publishing scientific papers, and it's primary uses are news and business; and, sure, communications and porn and games, so it's really covering all of human life. Like most technical people, I now spend most of my day on the Web, or using Web-related services like Twitter.
I apologize in advance for the following unpleasant comparison with Professor Knuth (who, while obviously out of touch now, has produced good work in the past), but I must note that Filthy Communist Richard Stallman does not have Internet access or surf the Web. Is this just generational? I can't think of a lot of older computer scientists online; maybe our culture scares them and they're unable to filter the entertainment parts from the business parts? Vint Cerf is still adapting and surviving in the real world. Maybe it's just 50 years of insular University life that makes you fear change and reality. |
| Firefox: This update will make you angrier online. |
Wed, 2008Apr23 12:37:58 PDT
in Web by kamikaze
|
|
Yet again, Firefox silently installs a new update.
There's an option in Preferences, under Advanced, under Update, past the "Beware of Leopard" sign, to "Ask me what I want to do", or "Automatically download and install the update".
Guess which one the "open organization" that opposes pre-checked boxes in updaters uses? Yeah, it pre-checks updates to everything, and automatically installs them.
Mozilla Corporation, congratulations. YOU SUCK. |
| Apple's Software Update for Windows iTunes and Safari |
Sun, 2008Apr20 11:28:38 PDT
in Web by kamikaze
|
|
You know, I used to like Firefox. That was a long time ago, though.
As The Angry Drunk (a fine and decent bloke indeed) says:
Again, the take home message here is that Windows users are so fucking confused by a checkbox that they can’t be trusted with the horrible responsibility of installing a browser.
Dear Mozilla Corporation:
When Firefox stops insisting that it be the default browser;
When Firefox stops updating every damn day;
When Firefox stops auto-installing the USELESS PARASITIC SHIT-TICK CRASH REPORTER! FUCKING DIE DIE DIE YOU AWFUL CLINGY PIECE OF SHIT!, er, Crash Reporter;
When you are not just a whiny shill for Mozilla Corporation, scared that you're going to lose your millions of dollars of Google funding;
Then you will have a leg to stand on to whine about Apple installers.
Go blow yourself. |
| Ted Neward Goes Back to Vietnam |
Wed, 2008Apr16 10:55:11 PDT
in Software by kamikaze
|
|
Internet Blowhard Ted Neward has done yet another of his pompous "technology X is like Vietnam! Or Auschwitz! It's BAD, man!" rants. I wouldn't even waste my time, but... this is wrong far beyond his usual levels of narcissistic ignorance.
The short version, if you ignore his masturbation at the altar of Microsoft, and his characterization of software engineers as superstitious cargo-cultists who are incapable of rationally evaluating technologies (clearly, he looks in the mirror too much), is that Domain-Specific Languages and Functional Programming, because they're "popular" this year, are just an instinctive reaction, and there's probably nothing to them.
Domain-Specific Languages, aka Little Languages, have been around and heavily used for nearly 40 years on Unix, and to some extent before that. They're not some newfangled solution to a temporary pain, they're a long-term, well-proven strategy for making your expression be as close as possible to the domain space, rather than trying to force-fit a domain into your language-du-jour. And yes, I say that as someone who's written at least 20 DSLs in the last 20 years, and made customers very happy with them.
Functional programming is over 50 years old (Lisp is semantically an extremely powerful language, it's just syntactically unreadable; most other FPs are much more readable). For the tasks it's well-suited for, it's extremely useful; for some other tasks, especially interaction, it's not. Very few people would claim it's a silver bullet for all tasks, but only a fool rejects it entirely where it solves a problem better.
Ted Neward is that fool.
[I would have merely posted this as a comment on his blog, but his comment form wasn't working. I expect that Neward wrote it himself, since it's in ASPX.] |
| History Meme: the Shell is History |
Wed, 2008Apr16 07:02:37 PDT
in Mac by kamikaze
|
|
There's a history meme going around the blogotubes, where you run the Unix command:
history|awk '{a[$2]++ } END{for(i in a){print a[i] " " i}}'|sort -rn|head
This reports the top 10 most-used commands in your shell history. Which, for heavy shell users, is pretty revealing about their work habits.
But... I barely use the shell at all anymore. I have always auto-wiped my history when I log out (You: "Mark, are you paranoid?" Me: "Why do you want to know? Who are you working for?"), so I can't show stats, but all I ever run from shell now is "open" (opens a file/folder in Finder, and mostly I use Spotlight instead now), sometimes "touch" or "mkdir -p", because creating empty files and chains of folders is easier that way; maybe I should write an AppleScript app to do those tasks.
From 1988 to 2003-ish, I was a Unix nerd, I lived almost entirely in the shell. Vim was the only editor I needed, ant my only build environment, and I would touch the mouse only if I was web-surfing or using a paint program (actually, I mostly used Opera with keyboard controls).
I now see that that was archaic and extremely limited. It's easier to use good graphical tools (which excludes anything on Linux or Windows), and BBEdit, Eclipse, Xcode, Preview, and the Finder (even as flawed as it is) blow away all the simplistic tools I was using. If I need to glue several things together, I have AppleScript; all Unix shells can do is combine in/out pipes of plain text from programs that have no user interaction, while AppleScript gives you real data structures and the ability to control a running application.
I don't need the primitive "stone knives and bearskins" environment of a shell that much anymore. |
| Non-Blocking User Interface |
Sun, 2008Apr13 19:57:36 PDT
in Mac by kamikaze
|
|
Spent the weekend working on my Secret Mac OS X Game (as opposed to my Secret iPhone Game, which is further along but I can't make more progress until Apple sends me a developer key), and I came to a little choice in user interface design that made me appreciate how the Mac is different from other platforms.
In this game, you can edit sprites by selecting them, and a dialog comes up, you change its properties, and put it away.
In Java or any other GUI I've used in the last 25+ years of writing graphical apps, I would make a modal dialog that blocked the main thread until it was disposed of, with a bunch of fields, and nothing would change until the user clicked OK. At that point, the object is changed, and you go back. This is easy to write in either AWT or Swing; it might be 10 lines of code, where the alternative would be many hundreds of lines.
At first I started to do that here. But it felt wrong. It didn't feel like how any other Mac app works.
So now, I save the old values before presenting the editor, and let you change values immediately, and there's a Cancel button to revert to the old values. If you just select something else or close the editor panel, your values are saved. It just removes that one step of hitting OK, but it makes an enormous difference to feeling like it's easy to edit a sprite. And it turns out in Cocoa that that's not noticeably harder to code than the obtrusive Java-like way. |
| Fitna |
Sat, 2008Mar29 05:37:17 PDT
in Religion by kamikaze
|
|
Watch Fitna, by Geert Wilders. It's just 15 minutes of quotes from the Quran, footage of Muslims preaching their hatred, and the evil consequences.
LiveLeaks has removed their copy of the film after receiving death threats from Muslims. Google and YouTube, so far, have had more courage.
This is a response, of sorts, to Submission, by Theo van Gogh and Ayaan Hirsi Ali. For the "crime" of making this film, Muslims murdered van Gogh, and have driven Ali into hiding. The note left on van Gogh's mutilated body threatened to destroy Hirsi Ali, Holland, and America (apparently our "Great Satan" powers extend to making Dutch people make movies...)
There's a joke I wish I could laugh at, but I can't, because it's true:
"Islam is a religion of peace, and we will torture and murder anyone who says it isn't!"
This isn't just Islam, it's all religions. Islam is just the most pernicious one today.
I have nothing but contempt for the notion of invisible sky pixies. Anyone who believes in that nonsense is delusional, but so long as they remain harmless I don't really care if they talk to imaginary friends. But religions, especially cults that worship death like Christianity and Islam, are another matter. When a religion claims you will somehow survive death and be given a happy eternal existence for bringing death to others (whether it's called "Jihad" or "Crusade"), and causes people to systematically carry out a program of hate and terror, killing everyone who happened to be listed in a book dictated by an illiterate drunkard and schizophrenic in the dark ages, they are the enemies of civilization, and of all life.
For over 15 centuries, Christianity was the enemy of civilization, torturing and murdering people for having a slightly different theology, or saying that the Earth orbits the Sun, or women wearing pants, or floating in water. It was not until the split and infighting between Catholicism and Protestants weakened both that science and reason were able to get some peace and quiet, and drag the civilized world out of mud and shit into modern prosperity. Even now, it's a creepy sensation to have to live among Christians. There is no apology possible for being a "former" mass murderer; sane, civilized people try to put it aside and get along, but the fact is, we're living next to a half-neutered death cult that was in its time every bit as horrible as Islam is today.
But Christianity was limited in range and destructive power by the technology of the time. Muslims are unfortunately able to ride on the coattails of scientific progress, and hypocritically and blasphemously use modern technology while attacking the sane people who created it. It is a dangerous death cult because we have foolishly given them money and weapons to attack our enemies, or because they had the good luck to live in a desert shithole that has oil under it, and now they've turned these weapons against civilization.
We survived Christianity only because they left their total foaming-at-the-mouth psychopath stage before they could get AK-47s, grenades, and nuclear weapons. Muslims are still in that total foaming-at-the-mouth psychopath stage, and unfortunately won't stay home, pray to Mecca, murder each other over an inheritance question from 13 centuries ago, and leave us alone for the additional 5 centuries or so they need to deteriorate into a harmless, neutered death cult.
Most Muslims who live in the U.S. have at least learned to behave legally; they're no happier with our hedonistic and irreligious lifestyle than we are with their misogyny, homophobia, and religious intolerance, but they mind their own business and we mind ours, and pretend not to care. But Naveed Haq showed that even in Seattle, as far from their jihad as you can get, the psychopaths will still pop up and murder anyone, even defenseless pregnant women.
So. There's no way for Islam to fade away before doing more harm. Ignoring it doesn't work, because they intend to conquer the world and kill or convert everyone who is not Muslim. There's no possibility of "peace" with that ideology. The only thing you can do is to expose it, mock it, try to cure people of it, and where necessary defend yourself. They are surrounded, weak, largely impoverished, and low-tech except for what they can steal or buy from us. The only weapons they have are threats and madness. Shutting up because they make threats gives them power over you, and allows them to perpetuate their madness.
The site Faith Freedom says:
Islam can't be reformed, but it can be eradicated. It can't be molded, but it can be smashed. It is rigid, but brittle. That is why Muslims can't tolerate criticism of it. To eradicate Islam, all we have to do is tell the truth. It's that simple. This was not possible before, but with the help of the Internet, it is now. The insanity of this creed is so glaringly obvious, it boggles the mind. All it takes to see that is to read the Qur'an.
The truth about Islam is out. It's here on this site. With truth and reason alone we can demolish this tall tower of lies. If you help spread the truth we can bring this house of cards down sooner than anyone can imagine. With truth, the decent Muslims will leave Islam and with each Muslim who leaves, we gain a new soldier in our fight against terrorism. We are growing exponentially. The days of Islam are numbered and better days are ahead. Many of us will see that day. Meanwhile, we may have to go through dreadful times. A storm is approaching. It will wipe out Islam, but it will also destroy millions of lives in its path. We can avoid this Armageddon if we stop lying. Islam is not a religion of peace. It is evil. It is a dangerous cult of death and terror. The proof is here. Let us tell the truth. Save lives, not lies. All that is necessary for evil to triumph is for good people to do nothing. Do something and save the world. To become a soldier in this army of light, all you have to do is face the truth. This site exists to help. Help spread the truth. Let it reach the world. It will do its work.
|
| Twatting about on Twitter |
Sun, 2008Mar23 17:20:30 PDT
in Web by kamikaze
|
|
I am now mdhughes on Twitter, twatting/tweeting/twooting/twittering away about technical stuff.
I'm still convinced it has a ludicrously bad infrastructure, thanks to Ruby's speed and memory problems, but to get SMS interaction, it's that or Facebook (bah), and I plan to use it at WWDC'08, when it will probably go down like a $10 tranny whore instead of actually working. |
| Cocoa APIs Which Inexplicably Do Not Exist |
Thu, 2008Mar13 08:10:12 PDT
in Cocoa by kamikaze
|
|
There's no method on NSString for trimming whitespace... So I hacked up this, which appears to work for my use cases, but I'm not sure I'm doing sane things with UTF-8.
+ (NSString *)trim:(NSString *)s {
NSInteger len = [s length];
if (len == 0) {
return s;
}
const char *data = [s UTF8String];
NSInteger start;
for (start = 0; start < len && data[start] <= 32; ++start) {
// just advance
}
NSInteger end;
for (end = len - 1; end > start && data[end] <= 32; --end) {
// just advance
}
return [s substringWithRange:NSMakeRange(start, end - start + 1)];
}
[update 2008-06-17:]
It does exist, it's just... well, inexplicable:
[@" foo " stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
My trim: is shorter and faster, but at least there is a "standard" way to do it. |
| On Being a Snob |
Sun, 2008Mar09 19:51:39 PDT
in Mac by kamikaze
|
|
I'm a Snob, and proud of it. This isn't caused by my infatuation with the Mac and iTouch (yes, I'm studying the iPhone SDK now, more on that later). My infatuation with the Mac, and all the rest of my snobbery, is caused by my devotion to certain ideals, and my contempt for both stupidity and aristocracy.
(If you're reading this in a newsreader, click "More" for the rest of the post.)
In response to a study that found Mac users are snobs, MacWorld Video asked Mac users if they're snobs, and of course the answer is "yes". I especially liked the exchange:
- "Would you consider yourself a snob?"
- "I think that I'm right. <sotto voce>That's a yes.</sotto voce>"
The Mac OS X dictionary defines "snob" (I just typed the word, right-clicked on it, and clicked "Look up in Dictionary"; why, doesn't your OS do that?) as:
snob |snäb|
noun
a person with an exaggerated respect for high social position or wealth who seeks to associate with social superiors and dislikes people or activities regarded as lower-class.
• [with adj. ] a person who believes that their tastes in a particular area are superior to those of other people : a musical snob. [emphasis mine]
DERIVATIVES
snobbery |-bərē| |ˈsnɑb(ə)ri| noun ( pl. -beries)
snobbism |-ˌbizəm| noun
snobby |ˈsnɑbi| adjective ( -bier |ˈsnɑbiər|, -biest |ˈsnɑbi1st|).
ORIGIN late 18th cent. (originally dialect in the sense [cobbler] ): of unknown origin; early senses conveyed a notion of ‘lower status or rank,’ later denoting a person seeking to imitate those of superior social standing or wealth. Folk etymology connects the word with Latin sine nobilitate ‘without nobility’ but the earliest recorded sense has no connection with this.
The origin hints at, but doesn't fully explain, what's really happening with this word, and with the ideal that drives me and other snobs to use the Mac. In a very real sense, snobbery is democracy.
Before the 20th Century, English culture (and by extension, American culture) was deeply stratified between social classes, with the lower classes considered essentially subhuman, the trade classes as human but inferior, and of course the upper classes were born to rule, automatically superior because they were descended from people who were descended from people who had killed a lot of people and seized power many centuries before. The economy was based primarily on land ownership and farming, with the "aristocratic" classes owning all land, collecting an unreasonably large portion of all produce as "taxes", and killing anyone who disagreed with this system or wanted to take some of their land. Every aristocrat is descended from generations of mass murderers.
By the 18th Century, this was starting to break down a bit, as manufactured goods became more important, the cities grew larger, and the trade classes gained wealth, and with wealth came political influence.
- Aside: Democracy and Revolution
- The American Revolution wasn't just a tax revolt in the British Colonies, it was a social movement being driven by this economic change, and by philosophers and politicians recognizing that there was something to this "democracy" idea the Greeks came up with so long ago. 18th Century America had the unique advantages of being well-educated, isolated, and self-sufficient, which allowed a relatively bloodless post-war Revolution, with many of the former English aristocrats giving up their titles to become honest American citizens.
The French Revolution followed, with equal idealism ("Liberté, Égalité, Fraternité"), but was ruthlessly opposed by mass-murdering aristocrats in France and Britain, leading to the need for "the Terror" (eliminating the local aristocracy and the Roman Catholic priesthood who supported them), and ultimately the aristocratic forces of Europe defeated the French Republic and ended democracy on that continent.
So now we come to the "Snobs", originally a slang term for shoemakers ("cobblers"). Upwardly mobile craftsmen came into wealth, and began to develop good taste, and held in disdain other members of the lower and trade classes who were not upwardly mobile. I refer to these non-mobile lower classes as "Plebeians":
plebeian |pliˈbēən|
noun
(in ancient Rome) a commoner.
• a member of the lower social classes.
adjective
of or belonging to the commoners of ancient Rome.
• of or belonging to the lower social classes.
• lacking in refinement : he is a man of plebeian tastes. [emphasis mine]
ORIGIN mid 16th cent.: from Latin plebeius (from plebs, pleb- ‘the common people’ ) + -an .
There are three reactions possible to Snobs living well and ignoring social class restrictions:
- The aristocrats see it as a threat; as a direct attack on their position and their property, and they have in the past murdered millions of people for lesser offenses.
- Plebeians have been taught by the aristocrats to "know their place", and intellectual curiosity and wondering if things could be better are conditioned and beaten out of them in churches and public schools. To them, people are born to a specific social class, and anyone "living above their social class" is breaking the rules they live by. This is an anti-democratic philosophy. This is not just monarchy or dictatorship, it's also the ideology of communism, of 1984's Big Brother.
- If you think, as a free man would, that all people are born equal, and only a person's own talent, dedication, and personal choices matter, then you are probably going to be a Snob, try to enjoy the good things in life, and encourage others to do the same. "Life, Liberty, and the Pursuit of Happiness" are the inalienable rights of mankind.
- Aside: Aristocracy in America
- In American culture, there are no real aristocrats; there are stupid rich people like Paris Hilton or Michael Jackson or Donald Trump, who think they're entitled to bad behavior because of wealth, but they do eventually discover that they're just citizens like everyone else. Paris bawling her eyes out on national TV because she had to do time for drinking and driving was one of the most uplifting and heroically American sights ever broadcast.
That said, the Republicans, ironically contrary to the name and origins of the their party, have been trying hard to create a new aristocracy. If they can:
- make the lower classes infinitely poorer than the wealthy by convincing them to elect politicians who "share their values" but make their constituents poorer,
- disenfranchise poor people, especially poor black people, by imprisoning them,
- scare people into keeping most legal immigration low so they can keep using illegal immigrants as slave labor with the threat of deportation,
- keep outsourcing and the number of H1-B visas high so desperate workers from third-world countries can be used at cut-rate prices to prevent young Americans from getting jobs in high-skill industries, and then ship the third-worlders back without giving them citizenship/voting rights,
- scare people into giving up their rights and not doing anything unapproved-of,
- destroy journalism and destroy education to eliminate an informed public entirely,
then they can create a new Dark Age with themselves on top, and no possibility of revolt.
I can state it no clearer than this: The Republicans are an evil cult, who seek the destruction of democracy and the enslavement of mankind. There is no other possible interpretation of their behavior.
So, back to snobbery, that leaves only two classes, which are self-created. If you think about the consequences of your choices and choose to live well, you're a Snob. If you don't choose, or choose poorly, you're a Plebeian.
| Plebeians... |
Snobs... |
Buy what they're told to buy, do what they're told to do, say what they're told to say, and create nothing but pablum, because they can imagine nothing and fear reprisal.
"Forget about trying to write under that kind of dread. Writing under family-friendly corporate constraints is a necessary but curious clusterfuck in the best conditions. Sometimes it's like reaching deep within your soul and pulling out a basket of kittens, then quietly drowning it in a river. A man's gotta eat, though, and I never griped about the paycheck. That was my choice, and I made it every day."
-Jeff Simmermon, in the ironically-deleted post Drowning Kittens In A River Full Of Cash
|
Buy what they want to buy, do what they want to do, say what they want to say, and create what they want, and don't care if you like it or not.
"If you want my advice, Peter, you've made a mistake already. By asking me. By asking anyone. Never ask people. Not about your work. Don't you know what you want? How can you stand it, not to know?"
-Ayn Rand, "The Fountainhead"
|
| Claim that everything is pretty much the same, always has been, and if anything was better then everyone would already be using it.
|
Recognize that some things are actually better than others, and some ways of living are better than other ways of living; they're better for you, better for the environment, and make the world a better place.
|
| Deny that global warming is a danger, because it would inconvenience them if it were true. They might have to change something in their lifestyle, maybe even quit shitting where they live. The Republican cult's dogma is that this is all a local trend. I'm not sure what they get out of humanity's extinction, since dead slaves can't work very hard.
|
Pay attention to what the evidence says, and adjust their behavior based on facts, whether it's convenient or not.
It is not a coincidence that Nobel Peace Prize winner, former Vice President, and shoulda-been-President Al Gore is on the Apple board.
|
| Drink crappy lager because it's cheap and convenient, and don't even know or care that it's diabetic horse piss.
|
Drink proper ale, because it tastes good.
"Magic? I'll show you magic in the clink of glasses in a toast, in the settling of a pint from silt to black, in the voice that rises as it tells its tale... in a hundred smiles that bubble into laughter, and shut the golden door against the cold."
-Garth Ennis, "Hellblazer: Damnation's Flame"
|
| Drink drip or percolated or instant (eeeeew) coffee that's been sitting on heat burning all day, because they don't know or care that it tastes like mud. They don't know or care that the beans were acquired by gangs beating peasant workers until they picked enough beans, then paying them almost nothing, which is why the beans are so cheap.
|
Drink espresso, high-quality fresh-ground coffee, or lattes, because they taste good. Snobs prefer to buy Fair Trade coffee beans. $4/cup is a small price to pay for something good.
|
| Drive Ford cars and pickups, because they're cheap, even though they're garbage. They drive through rush-hour traffic, making it even worse and wasting their time and everyone else's, then park at parking meters because it's convenient, and then have to go outside and feed the meter every half hour, and panic whenever a parking maid comes around, like cockroaches scurrying from the light.
|
Drive good cars, use a shared car system, or don't even drive, because they already live in the city and don't want to pollute any further or drive in traffic.
|
| Buy non-iPod media players, because they're cheap. Usually not Zunes, because only MS employees buy shit-brown and puke-green Zunes. |
Buy iPods. They just work, beautifully and easily. You will pry my 80GB iPod Video or 16GB iTouch out of my hands only when Apple makes something even better (a 64GB iPhone with 3G or WiMax network would do it for me). |
| Buy PCs from Dell or assemble some beige thing from random parts that may or may not work together. It comes pre-infected with Windows, and within 30 minutes after going online, Windows has helpfully infected them with all of the other 100,000 viruses and spyware on the 'Net, and are sending out spam to every mailbox in the world. The drivers don't work, or conflict with each other. It crashes, a lot.
Plebeians don't know or care, because it's cheap, and almost everyone at work is using Windows, except that one weird guy using a Mac. So that must just be how things are.
|
Buy Macs. They just work. They're beautiful. The hardware and software is actually designed intelligently, and it all works together. The cost is actually a bit less than a PC with equal hardware specs when you consider anti-virus software, maintenance, and resale value, but that's really irrelevant to a Snob. Paying more up front for quality is worth it.
It's different from what "the masses" use, but it's good to Think Different.
|
| The "GNU" and "Linux" people don't fit in either category. On the one hand, they defy convention and use what they like. They're making a value judgement. On the other hand, they live in squalid, archaic X11, have to edit config files and recompile the kernel to make the tiniest things work, and often just have to live without modern conveniences and media because their OS doesn't support it. So they're not making reasonable value judgements.
In the Dark Ages, they would have been the crazy people who went off to be hermits in the mountains. Did you know that Richard Stallman doesn't even use the WWW? No fooling. That's not thinking different, that's religious self-flagellation.
|
| Use MS "Internet Explorer", because it's on the computer already, and they don't know any better. Never mind that it breaks every web standard in every way, or that technologically it's 10+ years behind the competition, or that its use causes rectal cancer (just kidding... I only wish people who make IE-only web sites got rectal cancer from it).
|
Use Safari or Firefox or Opera, because they're beautiful (Safari obviously more so than the others), follow the web standards, and are developing new technologies like HTML5.
The future happens on these browsers.
|
| Users can't do any real scripting or automation of their system. Ooh, batch files, it's like it's still 1981!
A Plebeian who needs to solve a problem does it by hand, click, type, click, type, doing rote mechanical labor. Or they call Windows support (which is to Windows what "alcohol support", "cancer support", and "drug support" groups are to other kinds of self-abuse).
|
Users quickly learn that they can use Automator and share Automator actions, and AppleScript for more advanced work.
A Snob who needs to solve a problem can solve it; the tools are available, and the intelligence to find those tools and learn how to use them. The friendly neighborhood Apple Store has classes about any conceivable subject.
|
| Codemonkeys use toys like .NET (MS's broken, non-portable clone of Java) and Visual Basic. They actively rebel against using any other language, and yet immediately copy any useful library from other languages (nhibernate, nant, nunit, etc...).
They're considered mentally retarded by software engineers, and earn half the salary. No kidding.
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
-Professor Edsger W. Dijkstra, How do we tell truths that might hurt?
|
Software engineers use professional languages, like
Python,
Java, or
Objective-C/Cocoa, and often experiment with new languages, like
Groovy,
Scala,
Ruby,
Haskell,
Caml, and so on.
"A language that doesn't affect the way you think about programming, is not worth knowing."
-Alan Perlis
Learning new things is good for your brain, and new programming languages can teach you new ways to think about problems in any language. You cannot learn these new things by remaining in a .NET rut and hoping they will get ported.
Ask a software engineer to work in .NET, and he'll react as if you called him a motherfucker and a Republican. You'll be lucky to escape with just a beating.
|
Yes, I'm proud to be a snob. |
| Mr IEBlogger, TEAR DOWN THIS WALL! |
Mon, 2008Mar03 23:18:37 PST
in Web by kamikaze
|
|
Apparently the angry mob of web developers armed with pitchforks and torches have convinced Microsoft to behave like adults for once in their sorry lives.
While it doesn't say anything good about the morons developing IE that they tried this in the first place, at least someone in MS recognized that they don't live in isolation from the real world anymore.
And someday, maybe they'll figure out how to support application/xhtml+xml and proper XHTML content, just like real browsers! |
| Cocoa APIs That Suck Goat Ass |
Mon, 2008Feb25 19:08:45 PST
in Cocoa by kamikaze
|
|
To make a list of integers in Java, you type:
List<Integer> data = Arrays.asList( new Integer[] { 1, 2, 3, 4, } );
Ugly syntax wrapped around it, but all the data is pretty clean. Easy enough.
In Python, you type:
data = [ 1, 2, 3, 4, ]
Suck on that, Java. Javascript, Groovy, and most newer languages are also easy like that.
In Objective-C, you write... Parents, please remove your children from the room, they shouldn't look upon this, lest their face melt off:
NSArray *data = [NSArray arrayWithObjects:[NSNumber numberWithInteger:1],
[NSNumber numberWithInteger:2],
[NSNumber numberWithInteger:3],
[NSNumber numberWithInteger:4],
nil];
Yeah, you wouldn't want INTEGERS to be usable as objects, would you? So I screwed around with varargs a bit, came up with this. Use it and be happy:
+ (NSMutableArray *)arrayWithSize:(NSInteger)count integers:(NSInteger)arg, ... {
NSMutableArray *array = [NSMutableArray arrayWithCapacity:count];
if (count > 0) {
// first arg not part of varargs
[array addObject:[NSNumber numberWithInteger:arg]];
va_list arglist;
va_start(arglist, arg);
NSInteger item;
NSInteger i;
for (i = 1; i < count; ++i) {
item = va_arg(arglist, NSInteger);
[array addObject:[NSNumber numberWithInteger:item]];
}
va_end(arglist);
}
return array;
}
Then you can invoke it like:
[DataUtil arrayWithSize:4 integers:1, 2, 3, 4];
(Yes, I know you can add methods to classes with categories in Obj-C, so I could add that to NSArray instead of to my own utilities class. I find that hard to follow. Go ahead and make your code confusing if you like.) |
|
Links:
+-My Software Gallery
+-Twitter/mdhughes
+- iPhone Games:
+-Castles: Turn-based wargame for the iPhone!
+- Computer Games:
+-Perilar: Adventures in the Dragon Kingdoms.
+-Hephaestus: Computer RPG construction kit.
+-GameScroll: Simple interactive fiction authoring.
+-Aiee!: "An Interactive Environment Engine" text adventure system.
+-Umbra: Post-apocalpytic computer RPG.
+- Utilities:
+-JICB: Portable ICB client written in Java.
+-ThoughtPad: A tiny note-taking utility.
+-
+-My Bloglines Feeds
Site Pages:
+-Audio
+-Blank page
+-Camera
+-Cyberpunk
+-Game Design
+-Hacker
+-Java
+-NetRexx
+-Python
+-Hello Kitty
+-Quotes
+-Religion
+-RPG
+-The Bomb
+-DUDE
+-G.P.A.
+-Phobos
+-SIX WORD RPG!
+-Weapons
+-What's Wrong With AD&D?
+-Text
+-H.Beam Piper
+-Snow Crash
+-Universal Search
+-Video
+-Videogames
+-Virus Warning
Blog Topics:
+-News
+-Cocoa
+-Mac
+-Media
+-Personal
+-Religion
+-Roleplaying
+-Science
+-SecondLife
+-Society
+-Software
+-Toys
+-Web
Blog Archive:
Upcoming iPhone apps in Mac on Thu, 2008Jul10 09:10:52 PDT iPhone App Store is up! Castles is released! in Mac on Thu, 2008Jul10 07:37:13 PDT Yahoo Spam, I mean, Mail in Web on Sat, 2008Jul05 10:49:21 PDT Firefox 3 gives us the Evil Eye in Web on Thu, 2008Jun19 14:41:31 PDT Planet Stories in Roleplaying on Wed, 2008Jun04 17:29:06 PDT Swords and Sorcery in Roleplaying on Thu, 2008May01 05:36:24 PDT iPhone vs. the Mobile World in Mac on Mon, 2008Apr28 16:14:25 PDT Shell + Whitespace = FAIL in Software on Sat, 2008Apr26 15:33:45 PDT Don Knuth is Wrong, Alas in Software on Sat, 2008Apr26 12:41:53 PDT Firefox: This update will make you angrier online. in Web on Wed, 2008Apr23 12:37:58 PDT Apple's Software Update for Windows iTunes and Safari in Web on Sun, 2008Apr20 11:28:38 PDT Ted Neward Goes Back to Vietnam in Software on Wed, 2008Apr16 10:55:11 PDT History Meme: the Shell is History in Mac on Wed, 2008Apr16 07:02:37 PDT Non-Blocking User Interface in Mac on Sun, 2008Apr13 19:57:36 PDT Fitna in Religion on Sat, 2008Mar29 05:37:17 PDT Twatting about on Twitter in Web on Sun, 2008Mar23 17:20:30 PDT Cocoa APIs Which Inexplicably Do Not Exist in Cocoa on Thu, 2008Mar13 08:10:12 PDT On Being a Snob in Mac on Sun, 2008Mar09 19:51:39 PDT Mr IEBlogger, TEAR DOWN THIS WALL! in Web on Mon, 2008Mar03 23:18:37 PST Cocoa APIs That Suck Goat Ass in Cocoa on Mon, 2008Feb25 19:08:45 PST New Cocoa APIs That Saved My Life (at least a few hours of it) in Cocoa on Sat, 2008Feb23 05:56:30 PST Night 2 of the MacBook Air Era in Mac on Mon, 2008Feb18 23:56:30 PST Day 2 of the MacBook Air Era in Mac on Mon, 2008Feb18 14:29:53 PST meta http-equiv="X-UA-Compatible" content="IE=a rotting corpse" in Web on Wed, 2008Jan23 17:57:01 PST Cloverfield Should be Lost in Media on Mon, 2008Jan21 10:10:43 PST MacBook Air in Mac on Wed, 2008Jan16 11:47:50 PST Twitter Collapses in the Face of Apple and Other Natural Disasters in Software on Tue, 2008Jan15 16:11:14 PST Ruby Riding the Rails as a Filthy Hobo in Software on Mon, 2008Jan07 08:00:00 PST Rob Enderle Drinks Too Much Eggnog in Media on Sun, 2007Dec30 00:02:21 PST Java 6 for Mac OS X Leopard! in Mac on Wed, 2007Dec19 18:08:48 PST Human Engineering in Software on Fri, 2007Dec07 09:10:11 PST Throw More Kindling on the Fire in Toys on Thu, 2007Nov22 04:11:10 PST Amazon's Kindling, or, "Burn Before Reading" in Toys on Wed, 2007Nov21 14:35:39 PST User Interface Design in Software on Mon, 2007Nov12 20:07:15 PST "Avast ye! Do ye want to be my friend?", or, "The Lonely Pirate" in Roleplaying on Sun, 2007Nov11 19:20:19 PST Skype Sucks on Leopard in Mac on Mon, 2007Nov05 08:25:30 PST iChat Screen Sharing in Mac on Thu, 2007Nov01 15:08:10 PDT John Siracusa has a few things to say about Leopard... in Mac on Tue, 2007Oct30 13:27:30 PDT Mark Has a Leopard in Mac on Tue, 2007Oct30 13:12:06 PDT A Short Conversation While Waiting for the Mothership in Mac on Thu, 2007Oct25 13:39:53 PDT Cocoa logging in Cocoa on Sat, 2007Sep01 16:06:11 PDT The GNUtards Must Be Crazy in Software on Mon, 2007Aug06 02:06:29 PDT The NetBeans Masochism Tango in Software on Fri, 2007Jul20 19:37:35 PDT Stuck in the IDEA Quagmire in Software on Fri, 2007Jul13 10:24:21 PDT Trying IDEA out of desperation in Software on Wed, 2007Jul11 19:38:40 PDT An Eclipse by any other name would be as dark. in Software on Wed, 2007Jul11 19:34:26 PDT All these worlds are yours except Europa. Attempt no landings there. in Software on Wed, 2007Jul11 14:45:27 PDT Karl Fant Reconsidered in Software on Sun, 2007Jul08 07:21:25 PDT Live Earth in Media on Sat, 2007Jul07 02:30:11 PDT Hephaestus 3 Wish List in Software on Mon, 2007Jul02 09:55:10 PDT Software Gallery in Software on Mon, 2007Jul02 09:50:04 PDT Safari for Windows in Web on Mon, 2007Jun18 15:02:04 PDT WWDC 2007, Part 2 in Mac on Sun, 2007Jun17 13:45:48 PDT WWDC 2007, Part 1 in Mac on Sat, 2007Jun16 22:15:34 PDT Review: Dario Argento's Opera in Media on Wed, 2007Jun06 11:45:05 PDT Java Code Style in Software on Wed, 2007Jun06 10:38:49 PDT Checked Exceptions in Java in Software on Fri, 2007Jun01 13:37:15 PDT Very Special Episode of Studio 60 in Media on Fri, 2007Jun01 01:15:01 PDT RSS feed in Web on Mon, 2007May28 19:27:24 PDT The Vicious Cycle of Game Development in Software on Mon, 2007May28 00:49:21 PDT NULL, nil, None in Cocoa on Sun, 2007May27 09:37:34 PDT Chaucerian fraud Jerry Falwell is dead and rotting in the ground. in Religion on Thu, 2007May17 17:11:13 PDT Grindhouse Movie Reviews: Vanishing Point, Dirty Mary Crazy Larry in Media on Mon, 2007May14 02:42:34 PDT 7 Habits Of Effective Text Editing 2.0 in Software on Fri, 2007May04 10:44:58 PDT Hephaestus 3 is Coming in Software on Wed, 2007May02 09:55:10 PDT Giant Stack of Grindhouse, and Theatre Etiquette in Media on Fri, 2007Apr27 15:23:22 PDT The Grindhouse Brain in Media on Wed, 2007Apr18 11:48:39 PDT Grindhouse Review in Media on Mon, 2007Apr16 09:55:28 PDT The God Delusion in Science on Fri, 2007Mar16 18:52:45 PDT Disable Gimp splash screen in Mac on Sun, 2007Mar04 10:18:57 PST Closures in Groovy and Java in Software on Thu, 2007Feb15 11:33:12 PST ed is the standard editor! in Software on Wed, 2007Jan31 11:13:19 PST Music to Love Your Mac To in Mac on Mon, 2007Jan29 19:22:43 PST Seattle Slogans in Society on Wed, 2006Oct25 09:15:34 PDT Review: The Prestige in Media on Tue, 2006Oct24 14:09:18 PDT Charles Darwin Online in Science on Thu, 2006Oct19 11:04:30 PDT The Futility of Mixing Binary Liquid Explosives in the Airplane Bathroom in Society on Thu, 2006Aug24 11:58:40 PDT People Also Buy Lottery Tickets in Society on Thu, 2006Aug17 09:45:19 PDT More Sun Lies About NetBeans in Software on Wed, 2006Aug02 15:22:01 PDT GameScroll 0.7.1 in Software on Sat, 2006Jul29 18:31:04 PDT Mac to Linux? Are you mad? in Mac on Thu, 2006Jul27 11:15:09 PDT Intelligent DeSign in Toys on Fri, 2006Jul14 09:34:36 PDT markdamonhughes.com in Software on Mon, 2006Jun05 19:29:53 PDT About Book Reviews in Media on Sun, 2006Jun04 18:57:37 PDT Book Review: "JPod", by Douglas Coupland in Media on Sun, 2006Jun04 18:20:20 PDT iPhoto Annoys Me in Mac on Sun, 2006Jun04 11:24:11 PDT Book Reviews: iLounge Free iPod Book 2.0, Vernor Vinge's "Rainbows End" in Media on Sat, 2006Jun03 14:25:51 PDT The Smoking Ban or Lack Thereof in Society on Thu, 2006Jun01 08:38:59 PDT Tim O'Reilly Does Not Apologize in Web on Wed, 2006May31 01:42:53 PDT Isn't Bracing Truth Better Than False Hope? in Science on Tue, 2006May30 12:00:42 PDT A Man Walks Into a Bar With a Duck... in Personal on Mon, 2006May29 23:12:05 PDT s/Mark Hughes/Mark Damon Hughes/g in Personal on Sat, 2006May27 02:55:46 PDT O'Reilly(TM) 2.0(TM) Annoyances(TM) in Web on Fri, 2006May26 23:36:58 PDT Web 2.0 (tm) is over, Tim O'Reilly commits corporate seppuku. in Web on Fri, 2006May26 23:20:45 PDT What's Your Anti-Virus? in Mac on Fri, 2006May26 00:56:30 PDT iDroid in Toys on Tue, 2006May23 16:16:04 PDT About This Blog in Personal on Fri, 2006May19 17:17:48 PDT Animal Crossing: Wild World in Toys on Tue, 2006May16 13:59:38 PDT Socially Acceptable Gamers in Roleplaying on Mon, 2006May15 02:30:14 PDT Political Scum Come To Gaming in Toys on Sat, 2006May13 17:20:22 PDT Nintendo Wii in Toys on Sat, 2006Apr29 23:41:13 PDT The Past Sucked in Society on Wed, 2006Apr26 14:52:52 PDT Please Help Save Palladium from Going Under in Roleplaying on Mon, 2006Apr24 04:09:39 PDT Zombie Jesus Day in Religion on Sun, 2006Apr16 21:30:07 PDT The Day I Killed Angel and Buffy in Roleplaying on Sun, 2006Apr16 20:12:00 PDT Comedy Central vs. South Park in Media on Sat, 2006Apr15 01:56:54 PDT What I'm Reading (Future division) in Media on Mon, 2006Apr03 13:26:44 PDT What I'm Reading (Technical division) in Software on Mon, 2006Apr03 12:12:41 PDT Atom vs. RSS 2.0 Ultimate Cage Deathmatch in Thunderdome! in Software on Wed, 2006Mar29 01:02:35 PST What's that horrible stench? Java 5.0 Generics! in Software on Fri, 2006Mar24 12:46:55 PST Shiny LEGO Robots in Toys on Sun, 2006Mar19 14:44:03 PST The Daily Show on iTunes in Mac on Wed, 2006Mar15 08:46:09 PST Walter Cronkite in Society on Tue, 2006Mar14 12:02:34 PST Utility.py 1.1 in Software on Mon, 2006Mar06 11:24:32 PST Perilar 0.4 in Software on Mon, 2006Feb27 00:05:02 PST President's Day in Society on Mon, 2006Feb20 14:45:18 PST Why Are You Uninstalling NetBeans? in Software on Tue, 2006Feb14 15:32:56 PST V.D. in Society on Tue, 2006Feb14 00:16:46 PST ThoughtPad 0.2 in Software on Fri, 2006Feb10 08:26:50 PST My Debugging Prowess is Mighty! in Software on Mon, 2006Feb06 17:10:04 PST Progamming Language Winners, Losers, and Farm Animals in Software on Tue, 2006Jan31 05:07:06 PST Poetic Justice in Mac on Mon, 2006Jan23 21:50:18 PST iTunes Video Store in Mac on Mon, 2006Jan23 07:33:54 PST Why Are TV Shows Not Listed in iPod's TV Shows? in Mac on Mon, 2006Jan23 07:10:19 PST
|