
[{"content":"","externalUrl":"https://technicat.github.io/","permalink":"/about/old/pages/","section":"About","summary":"","title":"Github Pages","type":"about"},{"content":"Old versions of this website, starting from a search-only page during the first dot-com boom, to a hand-coded site of links, to sites generated by Forrest and Drupal, a Crafty template, to Jekyll on Github Pages, and now this site using Hugo and Blowfish.\n","externalUrl":null,"permalink":"/about/old/","section":"About","summary":"Old versions of this website, starting from a search-only page during the first dot-com boom, to a hand-coded site of links, to sites generated by Forrest and Drupal, a Crafty template, to Jekyll on Github Pages, and now this site using Hugo and Blowfish.\n","title":"Old Sites","type":"about"},{"content":"","externalUrl":"https://crafty.technicat.com/","permalink":"/about/old/crafty/","section":"About","summary":"","title":"Crafty","type":"about"},{"content":"","externalUrl":"https://learnunity.fugugames.com/","permalink":"/books/learnunity4/webplayer/","section":"Books","summary":"","title":"Webplayer","type":"books"},{"content":" ","externalUrl":null,"permalink":"/books/learnunity4/screenshots/","section":"Books","summary":"Screenshots of the game","title":"Screenshots","type":"books"},{"content":"The preface and closing sections of each chapter are provided here as permitted by the Apress author agreement regarding promotional excerpts. The full book rights are supposed to revert back to me when the book goes out of print, but even though it\u0026rsquo;s obsolete (as is the second edition) that\u0026rsquo;s not going to happen as long as print-on-demand online orders are available, so aspiring authors, something to watch out for!\n","externalUrl":null,"permalink":"/books/learnunity4/chapters/","section":"Books","summary":"Preface and closing sections","title":"Chapters","type":"books"},{"content":"","externalUrl":"https://github.com/technicat/learnunity/releases","permalink":"/books/learnunity4/github/","section":"Books","summary":"","title":"Code","type":"books"},{"content":"Chess is as elaborate a waste of human intelligence as you can find outside of an advertising agency.\nI often hear and sometimes use sports analogies used for software development and project management (scrum, anyone?). But I think perhaps chess is a better match — I’ve often gaped at a project decision and thought to myself, anyone who played chess wouldn’t have done that!\nLook Ahead # One of my peeves — in television and film, the winner of a chess game always announces “Checkmate!” to the other player’s surprise. In reality, that only happens when at least one player is so completely inexperienced or incompetent that they can’t see the blindingly obvious. A chess game doesn’t consist of two players bungling around at random until someone stumbles into a checkmate. Any strategy involves looking ahead at least a few moves, and any minimally decent player is capable of seeing immediate threats. Strong players can plan ahead several moves, and expert players can tell if a subtle weakness in position guarantees their eventual loss. In any case, chess players resign once they recognize the game is lost.\nIn fact, any decent chess program is based on planning — the further the program can look ahead, the stronger its performance.\nIt’s amazing how often a project is started without anyone figuring out the steps to get there — the team stumbles ahead one move at a time until it’s inescapably obvious that the project is late or infeasible.\nKeep Cool # Chess isn’t poker, but it pays to keep your composure. I played one opening so badly I lost my queen almost immediately, but my nonchalance seemed to convince my opponent that it was an intentional sacrifice, and eventually he crumbled. That was on the Iowa high school circuit, but while still in high school I entered a professional tournament where my adult opponent was so angrily surprised to find himself in a losing position that he just started moving my pieces to demonstrate he knew how I had the game won, then toppled his king. And I had no idea I was winning.\nManage Your Time # So you need to plan ahead, but you also need to balance that against managing your time. In tournament chess play, you have a fixed amount of time to play a certain number of moves. Thus your schedule is flexible, sort of. If you dawdle through the beginning of the game, you’ll be pressed to move your pieces quickly later without much time to think about them. Experienced players are familiar with a standard set of opening moves and typically zip through those quickly and can allocate more minutes to the more complex positions later in the game.\nI remember one chess game in which I squandered so much time, pondering one move that I had to move immediately, speed-chess style, for all the remaining moves. I managed to eke out a draw, but only because I knew exactly what moves to make without allowing any time for thought and any room for error. I’ve had quite a few software releases like that, too, where we dawdled, indecisively went down different paths, and in the end pulled mandatory all-nighters to hit a (in some cases immoveable) release date. In some cases, you could say the result was a draw. In other cases, our chess clock ran out. I remember working on one investor party demo even after the party had started — by the time we were ready to show it, everyone had finished their drinks and left.\nPlan for the Worst # Another TV cliche — a person walks over to someone’s in-progress chess game, takes a look and moves a piece, announcing “Checkmate!” Again, this never happens. Unlikely as it is for a player not to see himself losing in the next move, it is even more unlikely that the other player can’t see the mate in one, either. It’s like a prize fighter not seeing his opponent drop his guard. Chess players plan their strategies assuming their opponents will make the best possible moves they can see. In fact, that’s how chess programs are implemented.\nIn a project, you don’t have to assume that the worst will happen, but you should plan for it. It’s called risk management. You can’t open yourself to the worst case and then forget about it. This is why you have insurance, this is why you don’t blow your life savings in Vegas.\nDo Your Research # A player at a tournament in Des Moines offered to show me his can’t-lose opening. After I decimated him in a few moves, he said, wait, I’ve got another one. Again, a losing proposition. If there was such a thing as a guaranteed winning opening, the game would be no more interesting than tic-tac-toe. There’s a reason for all those encyclopedic compendiums of chess openings and endings — a lot of chess experts over the years have tried them out and done the research, and there’s no reason to try to relearn all that chess lore from scratch yourself by losing a lot of games for the next fifty years.\nThis is a common affliction in software engineering, too, sometimes referred to as the not-invented-here syndrome, but it’s really worse — it’s just making stuff up and thinking it works. Like the can’t-lose chess opening, I’ve many a cobbled-up “algorithm” that just works for one or a few contrived cases and will break under real usage. There are decades worth of algorithms created in academia and industry, and research on complexity that can let you know what’s practically solvable and what’s not (calculating all the possible outcomes in a fifty-move chess game is an example of not). So there’s no excuse not to start with prior work, and you won’t embarrass yourself later.\nKeep Your Ego in Check # I’ve been on a couple of high school chess teams where the person who thought he was best assigned himself the lead position, and then got skunked in tournament play. Once this occurred even after a holding an internal competition to sort out the rankings — I won, but the seniors couldn’t believe that a sophomore was their best player, so they discarded the results.\nThis happens a lot in software, too. Everyone wants to be the CTO, software architect, or at the very least, lead programmer. But, obviously, not everyone is qualified.\nKnow Your Pieces # Chess players should recognize a relative valuation of their pieces: pawns the least valued, followed by knights and bishops, then rooks, the queen, and of course the king is critical. But more advanced players take in account the special capabilities and limitations of each piece. Pawns can only threaten two squares but can be extremely valuable when in position to queen. Bishops have range but are limited to either black or white squares — if you just have a bishop in your endgame, there’s not much you can do. Knights can leap over obstructions but have limited mobility on the edges of the board (“knights on the rim are grim”).\nI’ve seen plenty of projects where people were placed in positions where they were ineffective — middle management positions without enough authority, technical lead positions without enough expertise…\nThe Sacrifice # I hesitate to bring up the chess sacrifice, but there’s a pretty obvious analogy — burnout! In chess, overeagerness to sacrifice leaves you undermanned and losing. In crunch time projects, if the crunches arrive too early, not everyone is going to stick around ‘til the end, or even stay effective if they do. And in chess, every game starts with a fresh set of pieces. Not necessarily so in software projects.\nLose Gracefully # You wouldn’t think that chess is a violent game, but I’ve seen a few players angrily swipe all the pieces off the board after losing. Management likes to say, “Failure is not an option.” Which sounds great when you’re winning, but once you’ve lost, you have to decide how you’re going to behave. Blame everyone in sight but yourself? Or give everyone credit for playing a good game, and move on to the next one.\nIf the outlook is grim or uncertain, you need to emanate confidence and competence. If you’ve recognized the game is lost, acknowledge it gracefully and move on to the next game.\n","externalUrl":null,"permalink":"/books/techsoft/chessmoves/","section":"Books","summary":"Chess is as elaborate a waste of human intelligence as you can find outside of an advertising agency.\nI often hear and sometimes use sports analogies used for software development and project management (scrum, anyone?). But I think perhaps chess is a better match — I’ve often gaped at a project decision and thought to myself, anyone who played chess wouldn’t have done that!\n","title":"Chess Moves: Avoid Getting Checkmated in Your Project","type":"books"},{"content":"I have people skills; I am good at dealing with people. Can’t you understand that? What the hell is wrong with you people?\nKnow Your Stuff # The saying goes, those who can’t do, teach. The same could be said of management. (And those who can’t manage, consult? But let’s leave that for another essay…) In any case, I’ve often complained long and bitterly about software project management, and a coworker once responded, “Phil, you’re always right”. I don’t know if he was serious, but in the spirit of that encouraging or sarcastic endorsement, here are my recommended practices for managing software projects.\nIn many cases, “project manager” is a Microsoft Project manager whose apparent sole responsibility is to maintain a Gantt chart. (Sometimes even that is too advanced — I’ve sat in meetings watching people fumble with an Excel spreadsheet) But there’s got to be more to project management, or any idiot could do it.\nKnow the Technology # The best way to gain the respect of your engineering staff is to understand the technology they’re using. This isn’t the same as thinking you understand. A little knowledge is a dangerous thing, especially the latest knowledge gleaned from buzzword-laden articles in business magazines.\nAt an early stage on one large application running in Lisp, I mentioned to my boss that I thought garbage collection was causing some performance problems. From then on, every time he saw a slowdown, he’d ponder, “hmm, looks like garbage collection.” As a manager, it’s unlikely that you know more about everything than everyone on your team, even if you’re the chief high tech mucky muck of your organization. So take the opportunity to learn from your people.\nI have a friend who graduated with a PhD from a well-regarded computer science department and yet was treated to an impromptu lecture on computer simulation from his company’s president, who had lesser engineering credentials from over a decade ago. Not surprisingly, my friend was rather offended. Worse is when your lack of expertise causes you to miss problems in the project design and execution.\nAs a technical lead on supply chain management software, I correctly chose XML (these were the early days of XML) as a platform-neutral format for our fab scheduling system, but didn’t learn enough about XML until after the project was delivered to realize that we didn’t do a very good job of sticking to XML (e.g. no DTD). Too bad — this was back when XML was pretty new stuff, so if I’d really known what I was doing, maybe I could have defined an industry standard format for semiconductor fab automation. Master Your Domain # Even if you don’t know much about the engineering aspects of your project, you’ll have value and get some respect if you know the application domain.\nRepresenting a computer graphics software company, I visited one of our tool vendors and gave them an impromptu demo with the intent of getting them excited about supporting our product. Unfortunately, I couldn’t figure out what more to do after creating a cube and making it spin. Should have rehearsed, I guess. Knowledge of your application domain is important in designing a useful product, supporting your customers, and avoiding embarrassment.\nKnow Management # You should also be familiar with the state of the art in software project management.\nIf there’s one classic textbook on software engineering, it’s Fred Brook’s The Mythical Man Month, and if there’s one classic software engineering principle anyone remembers from that book, it’s the rule that adding more engineers to a late project just slows it down. I don’t know if anyone I’ve ever worked for has read that book, but I have been on more than one project where panicked management piled on additional staff.\nOf course, software engineering is just as trend-filled as other engineering fields (TQA, Six Sigma, ISO 9000…), and over-hyping is the rule, but you can’t intelligently discuss practices and choose among them and apply them without reading up on them first. And if you don’t know management stuff, what do you bring to the table — charisma? You’re just an engineer who’s not doing any engineering.\nGood Management is Risk Management # The most crucial aspect of project management is risk management. Every decision made in a project should be weighed against how much risk it adds to the delay or failure of the project.\nIf I Had a Nickel…. # I’ve often joked that every feature request should be accompanied by a dollar, but I betcha if managers had to whip out their own billfold and pull out a dollar for those “important” requests, the feature set would shrink dramatically.\nI was working on a submarine simulator that, up to that point only had navigation controls. When our manager said he wanted to fire a torpedo for tomorrow’s demo, we hastily improvised a reasonable facsimile. Encouraged by that, the manager innocently asked ten minutes before the demo whether he could fire a cruise missile. One of my coworkers grabbed him and pulled him out of the room before I could say anything. There is no free lunch — everything has a cost, but it’s usually felt by the poor slob who ends up working the weekend rather than the person in management or marketing who belatedly said “we really need this”.\nScotty Doesn’t Work Here # I blame Star Trek. Aliens are always humanoid and speak English, and the offworld females find Kirk irresistable — no one believes that’s the stuff of reality. But the last fifteen minutes of every episode where Scotty or Geordi jury-rigs an engineering solution based on a never-tested hypothesis, and it always works just in time to avert disaster.\nI knew I was in a Star Trek moment on a military distributed interactive simulation project (basically a big multiplayer video game) when the project manager actually referred to me as “Geordi”. Sitting in front of a mock submarine console, wearing submarine coveralls while the PR cameras rolled and Navy VIP’s watched, I pushed the “start simulation” button that would connect us with the entire wide-area networked simulation and watched the system core dump as it got flooded with packets from the rest of the exercise. The project manager calmly informed everyone that we had “technical difficulties” and to “stand down” while I tried not to puke. I fixed the problem in the standard episode final fifteen minutes by deciding we didn’t really care what anyone else was doing and turning off our system’s data read from the outside world. This project had the all the makings of a disaster — I cooled my heels for two months waiting for a security clearance, the networking hardware was two months late (it was a seven month project with a hard deadline), the laboratory had no experience on this type of project, and one of the three engineers working on the project didn’t do anything (but amazingly kept repeating “I’ll have it done tomorrow” for months). And then I spent the last month of the project working while flu-ridden. Our participation in the exercise was hailed as a success (evident when all the senior managers who had kept a healthy distance away suddenly showed up), but I don’t think I could physically take any more successes like that.\nIn real life, the Starship Enterprise would blow up every time — the episode-saving idea would be faulty, or Scotty (or Geordi or whoever, depending on which series you watch) is out sick, the warp core isn’t performing up to spec, Jean-Luc didn’t get the memo, etc. Depending on programmer heroics to pull you through the crunch time, and even worse, building such a crunch time into the schedule, is a recipe for disaster. It’s fun to remember the successes, but the result is usually failure.\nGet That Fresh and Clean Feeling # Make sure you build the product regularly and from scratch. A common practice is to do this as an automated nightly build. If you don’t do it, then you never know if you can really do it.\nA group developing software for use with the Hubble Space Telescope decided to rebuild the currently-deployed version a a reference for our research in designing the next version. But the previous build had been made years ago, and there had been enough VMS Fortran compiler changes that the old software didn’t compile anymore. If we actually had to fix a bug in the old software anytime in the past few years, we would have been out of luck. It’s no exaggeration to say that the fate of your company could depend on the ability to make a clean build. One tool vendor I used to work with went Chapter 11 and at least one rescue acquisition failed because they couldn’t demonstrate a successful clean build from the source code.\nHaving a regular automated build proves that you have a functioning build procedure set down in a script, not dependent on some sequence of magical incantations resident in one build engineer’s head.\nLet the Code Set # I’ve never seen a code freeze really frozen to my satisfaction — there’s always temptation to keep adding “just one more thing” until the final deadline. But instituting a freeze is better than coding pell-mell until the end, a sure recipe for a broken release.\nGame development is particularly notorious for crunch times, which poses greater risk as the projects get more complex. I was on one project where the last level was scheduled to be completed just before the game was to go “gold”. Given my own stand was that asset creation had to be completed a month before the the release date, management did it’s best to reassure me “it’ll be all right”, and indeed we did just complete it on time. I found out later that the level export performed on the day of the disc burn was missing key optimizations, so the game probably would be running at least twice as fast if we hadn’t cut it so close. The point is not to completely stop development, it’s to slow it down in a deliberate manner to mitigate risk. It’s really more a code “gel” than a code freeze. The alpha milestone should mark the feature freeze point — any feature that is not functional yet should not go in. Once the beta milestone is reached, every potential bug fix should be evaluated according to its benefits and risks.\nCode isn’t the only thing that should be frozen near the end of a project. The development environment should be stable, tool, i.e. you should have a tool freeze. New compilers, libraries and runtime engines can introduce new bugs.\nKnow Your Demo # Risk management is not just important for releases and milestone deliveries. Even demos should not be taken for granted. One company president kept bringing in bigwigs from the parent corporation for impromptu demos of an in-development product, even after I asked him to at least give me a couple of hours notice so I could make sure to have the code running. Eventually, he strolled in, tried to run the product, crashed it and helplessly tried to restart it with the VIP watching and me studiously ignoring the proceedings. I almost felt guilty.\nStay On Target # Emerson not withstanding, inconsistency is a dangerous thing when exhibited by management.\nUnmix Your Messages # Corporate vision statements tend to be vague to the point of uselessness, but it is important to be clear about what’s important and to be consistent about it.\nThe Electronic Entertainment Expo (E3) is the big party event of the game industry, and thus, everyone in the industry expects to go every year. I know of one game company president who was unhappy with the progress of their game and told everyone they wouldn’t have the usual company days off to attend. Then she changed her mind and was upset when one of the senior staff elected not to attend, anyway. So for future reference, is it important to attend E3 or not?\nUse the Rhythm Method # Ideally, a project should run like it’s on autopilot. Everyone by default should know what to do every day (if you have to have a meeting every morning to tell people what to do, then certainly this is not the case). When you’re running a marathon, you don’t have to tell your feet to take every step — it’s muscle memory.\nFor example, builds ideally should be automated and run overnight, with the results emailed to everyone on the team. On one game project, I manually ran the build every morning and prepared it for QA, with only a handful of hiccups for an entire year, but still toward the end of the project people kept asking me if there was going to be a new build that day. So the last couple of months I ended up manually emailing build notices every morning. I would have saved myself some grief if I had figured out how to automate the process earlier in the development cycle. That might have helped me avoid the problem of management asking me for new builds at various points during the day, which was not only annoying (imagine asking for a paycheck whenever you felt you needed one), but kept me from doing other work.\nStick with the Plan # If you have a reasonable plan, stay with it. It’s hard enough to get everyone on the same page in the first place. Tweaking your plan or worse yet, changing directions in midstream, will impose some overhead and delay from the “context switch” and lower confidence in the project.\nShortly after I joined a video game project, my group was diverted from their planned tasks to throw together a demo disc. This was not surprisingly a messy patchwork process, but once it was nearly complete, management changed their minds and put us back on the original schedule, albeit one month behind. The demo disc was resuscitated a few months later, but by then it was old code nearly impossible to debug. There are times when a plan is failing and changes are necessary to have any chance of completing the project. But in those cases, you should be able to identify clearly the points of failure and be able to justify that the next plan avoids those problems, and more importantly, avoids the pitfalls in reasoning that led to the first plan. Otherwise, there is no reason to believe that at some point during execution of the new plan that you won’t change your mind again.\nStop Pulling the Fire Alarm # Left to their own devices, management will often manufacture emergencies. Sometimes it’s a conspiracy — one CEO will call a vendor CEO to complain and demand instant action. Or maybe Star Trek was on TV the other night, and the company president wants to be like Captain Picard (“Make it so!”). In either case, after raising some dust and getting some crunch time work, the bosses feel mightily pleased with themselves.\nBut an emergency indicates a failure in planning, and repeated emergencies will cause your staff to either leave or treat the emergencies as a joke (chances are you’ll have both results — your more motivated staffers will leave and the less active ones will stay). Scheduled crunch times will have the same negative effects and add high risk to your project — if the crunch time is not as productive as expected, what are you going to do then? Double-crunch time? Try to understand — a smooth project is a successful project.\nYou’re the Boss # You’re the boss, so there’s no reason to pretend you aren’t.\nDon’t Ask, Don’t Tell # It’s not a democracy, so there’s no point in soliciting input that you don’t really want it.\nI worked for one manager who would ask everyone for their opinions and then get mad when someone disagreed with her. The only rationale I could see is that she would selectively bring up those cases when someone agreed with her to buttress her decisions later. But it would have saved a lot of time and argument if she had just made the decisions she was going to make anyway. Of course, you shouldn’t ignore good input from employees — just don’t ask for an opinion if you don’t want it. The most useless area to ask about is your own performance. It’s like asking “Do these jeans make me look fat?”\nWhen I worked on the Hubble Space Telescope, I got into a dispute with a project lead who had made changes to my code when I was on vacation. He was unable to tell me exactly what those changes were, so I refused to integrate them. Offended, he asked me, “Don’t you trust me to make those changes?” Now, why did he have to ask that? Stop Whining # Yes, being the boss is hard. But no one cares.\nOne of my more narcissistic bosses practiced management by self-pity: “I never would have started this company if I’d known how hard this is.” “Do you want to trade places?” “I know your point of view, but you don’t know mine.” “I kept all my promises and everyone else broke theirs.” Believe me, it gets old after a few months, not to mention several years. This person even expected her employees to feel sorry for her whenever she terminated one of them. Everyone is guilty to of some rationalization and self-delusion, but people who actually want to boss others around tend to be guiltier than most. (Hint: if you spend a lot of time thinking about how you’re a good guy, you’re probably not) One abrasive company president often complained to me how she’d be treated differently if she was a man. A departing employee confirmed that, remarking “if she was a guy I would have punched her by now”.\nI enjoy working with managers who frankly discuss problems, but there’s a difference between entertaining gripes and whining self-pity. If being in charge is really so unpleasant, quit and do something useful. If you feel unappreciated, tell it to your therapist. And if you’re really narcissistic — well, you probably don’t realize this section is about you.\nPick Something # Real leadership involves making the tough decisions. If you can’t make those decisions, then, as I rather bluntly told a manager once — what do we need you for? The first choices to make are in prioritizing, and everything has to be prioritized — features, bug fixes, delivery dates, customers, hiring, buying equipment, and so on.\nAt one company where I was maintaining a Unix application while porting it to Windows, the president of the company told me the number one priority was to get the PC product out. When I asked him what about the Unix product, he thought a bit and said, “that’s the highest priority, too”. Thanks a lot, that’s really useful! Understandably, managers like to keep their options open. Sometimes this manifests as a refusal to make decisions early in the project, or a convenient amnesia regarding past decisions later in the project (you know this is going to happen when decisions are not written down). This strategy is as rewarding as setting up your retirement account just before your retire.\nLead By Example # No matter how well-written the employee handbook or how well-produced the corporate video, it is management behavior that sets the tone of the corporate culture. “Do as I say, not as I do” works great if you’re satisifed with a mediocre organization or if you rule by fear. But if you want a high-quality group and you’re not Stalin, you have to lead by example:\nBe Realistic # The biggest management disease is wishful thinking.\nOne Vader-like CEO intoned to me “This is the last time. You just have to take my word for it”, when one of our helpful integration engineers insisted we had to deliver new features immediately after an official release. That assurance was as convincing as “this is my last drink”. And it turned out to be just as valid. Do the right thing now.\nBe Responsible # If there’s one common skill among managers, it’s self-promotion. And self-preservation (well, that’s two, but they come as a package).\nWhen I worked on one defense simulation project that looked doomed, I noticed the head of the department stayed a healthy distance away from the lab, for several months. But just a week before the deadline, when it looked like we were actually going to pull this project off, he showed up in the lab glowing with enthusiasm and optimism. If you expect your people to put themselves on the line, you have to stick you neck out a little, too. One of my more annoying bosses liked to go around telling people “I’m holding you responsible” but whined “Now everyone’s going to blame me” whenever she screwed up.\nEveryone makes mistakes. At least if you ‘fess up, you’ll have the respect of your employees, and maybe, just maybe, they’ll take responsibility for their work, too. It may not be the best corporate politics, and maybe you’ll have to adjust your self image, but it’s good leadership.\nI worked for one director of engineering who readily admitted her mistakes although she could easily have blamed all problems on our dysfunctional software development group. When a rogue engineer pushed ahead with his own release (and his own agenda, to curry favor with the client) independently of the rest of the project, creating more work and more grief for everyone else, this director admitted almost immediately that it was a bad decision on her part to let him do it. On another project where it turned out there was an embarassing flaw in the demo release — the director of software could easily have blamed a number of parties, ranging from employees to vendors, but he simply stated that it was a collective failure, we had to focus on a solution and fix the process to avoid similar problems in the future.\nIf you make it clear you’ve learned from experience, maybe everyone else will. They’ll follow you with more confidence, instead of fatalism. And if you accept responsibility for mistakes matter-of-factly, instead of in some torturous sequence of denial and blame, then maybe everyone else will do the same and get on with the real work.\nOne of my bosses seemed to expect a Nobel Prize every time she admitted to a mistake. Months later, it would be the subject of lore — “Remember I took responsibility for that? Remember?” I’ve seen some leadership advice saying you should never apologize. I don’t really agree with that, but an insincere apology is worse than none at all.\nOne of my favorites pseudo-apologies: “It’s my fault for hiring that person.” A feeble show of responsibility while directing the blame at someone else.\nBe Professional # Professionalism is underrated. Companies sometimes brag about how much fun they have and how they’re one big happy family, but parties can only last so long, and how many families actually want to work together?\nI had one boss who liked to admonish her employees to “please be professional”. Which is one of the more annoying things one can say, like “don’t be an ass”. It was also an ironic thing to say, since her management repertoire included whining, yelling, foot-stomping, tossing items on employee’s desks and terminating conversations by abruptly turning around and leaving. You shouldn’t have to like all your coworkers to have a decent job. (That would really limit your options) As with politeness, professionalism can make bad situations tolerable and make good situations last longer.\nThe aforementioned employer told me she didn’t care if departing employees had resentful feelings about their jobs, and then in the same conversation she wondered how to keep ex-employees from spreading a bad reputation for her company. Apparently, she didn’t see the link. Typically, even inept and slimy employers will be smooth when easing employees out the door. “Glad to have you, sorry it didn’t work out.”\nBe Fair # Don’t be fooled by seeing all those warm bodies in the cubicles staying late in the day — they’re not necessarily working (the Internet is a wonderful thing), and there’s sure to be a stampede for the exit once the boss’s car leaves the parking lot.\nBut employees might conscientiously put in the effort if they see that effort from you.\nOn one tightly-scheduled porting project, I was responsible for the bulk of the code and consequently spent the first few months working eighty-hours weeks. I didn’t get much assistance from outside the group, but I was greatly appreciative when the other members witnessed my long hours and offered to help in any way they could. In particular, if you expect people to go above and beyond the call of duty and give up their personal time, you’d better show you’re willing to make the same sacrifice.\nI’ve been on more than one project where the manager, just before going to the gym, would tell everyone to stay late at work. One manager asked me to wait for her in the office after hours until her aerobics class finished — upon return she ignored me another half hour until I finally asked what she wanted to talk about. “I just wanted to tell you you’re doing a good job.” Wow, that was worth skipping dinner. The message — my time is more important than yours. Now get back to work.\n","externalUrl":null,"permalink":"/books/techsoft/managementsorry/","section":"Books","summary":"I have people skills; I am good at dealing with people. Can’t you understand that? What the hell is wrong with you people?\nKnow Your Stuff # The saying goes, those who can’t do, teach. The same could be said of management. (And those who can’t manage, consult? But let’s leave that for another essay…) In any case, I’ve often complained long and bitterly about software project management, and a coworker once responded, “Phil, you’re always right”. I don’t know if he was serious, but in the spirit of that encouraging or sarcastic endorsement, here are my recommended practices for managing software projects.\n","title":"Management Means Never Having to Say You’re Sorry","type":"books"},{"content":" Final Words # Now I’ve come to the end, and hopefully you’re ready and excited to start making your own Unity iOS apps. If there\u0026rsquo;s one lesson that I hope you can take from this book, it\u0026rsquo;s that you can start with something simple and keep building on it until it turns into something interesting. Don\u0026rsquo;t be one of those people who want to start with a massively-multiplayer online (MMO) game as a first project!\nRemember to keep learning and participate in the Unity community, both contributing and asking for help on the Unity forum and on the Unity Answers site, and don\u0026rsquo;t forget to check the Unity wiki. It\u0026rsquo;s fine to promote your work to the community (there is a Showcase topic in the Unity forum) and ask others to spread the word, but remember to return the favor!\nAbove all, have fun. Any other reward is a bonus!\n","externalUrl":null,"permalink":"/books/learnunity4/chapters/chapter17/","section":"Books","summary":"Final Words # Now I’ve come to the end, and hopefully you’re ready and excited to start making your own Unity iOS apps. If there’s one lesson that I hope you can take from this book, it’s that you can start with something simple and keep building on it until it turns into something interesting. Don’t be one of those people who want to start with a massively-multiplayer online (MMO) game as a first project!\n","title":"Where to Go from Here?","type":"books"},{"content":"IT is getting harder every year, due to the march of technology, increasing spam, and more nefarious security attacks. But there are some basic principles in taking care of your organization’s IT needs, whether it’s a one-person shop or a huge corporation. Trust, then Verify\nBackups are like insurance policies — you don’t realize how much you need them until you really need them. It’s not enough to have a backup system — you need to have assurance that it will save you when you need it to.\n-An owner of a small game development company assured me that all important data was backed up periodically. It turned out this didn’t include our source code. Even after this was rectified, the backup tapes were never verified, and a server crash lost a month’s worth of work just before E3 (the big trade show).\nComplacency isn’t limited to small companies. When I worked at a large research institution that operated the Hubble Space Telescope, the army of college students running nightly backups looked reassuring until one of my coworkers lost a file and found the backup was unreadable.\nIt’s not enough to just make the backups. If you don’t periodically verify that you can restore from the backups, there’s not much point. In a similar vein, keep your backups offsite. If your office is ransacked or goes up in flames, the backups won’t help if they happen to be sitting in the same room.\nThis was my first practical on-the-job lesson. An experienced, high-level engineer was brought on to my project to help get things organized, and the first thing he did was shop for a fireproof safe and offsite storage space.\nRegular backups are considered standard IT procedure, yet paranoid programmers like myself often feel it necessary to make their own backups just in case. At one small company, I was so distrustful of the backups (rightfully so — we eventually had a server crash just before a trade show and the backup tapes were unreadable), that I bought my own backup drives and media. But you don’t want to rely on your staff to protect your data and in general you don’t want them taking company data home (at least not just for backups). So do it right yourself.\nBe Redundant # Management is often reluctant to spend a lot of money on hardware, especially given the inevitable obsolescence. But the cost of hardware pales in comparison to the salaries of programmers sitting idle because their workstation died and there’s no immediate replacement, or the cost of a project delay due to a wait for critical equipment.\nFortunately for me, in recent years I’ve been on projects where lack of hardware and software was not an issue. But the early part of my career was spent in large corporations and government projects where you had to jump through hoops to get the resources you needed to complete a project.\nI remember one military project where I was directed to order a new hard drive as “laboratory equipment” since we had more funds in that budget. The on-site naval representative responsible for vetting all such expenditures didn’t seem to agree that was the correct categorization, but rather than immediately denying the request, he responded with requests for increasingly more information — what laboratory? what experiments will the hardware be invoved in? submit a wiring diagram of the lab indicating how the hard drive will be connected! You also want redundant knowledge.\nThe first startup I joined that really felt like a startup had no dedicated IT person. My office space was a spot on the floor and we all set up our own computers. My manager was surprised when he saw me swapping tapes while the regular backup guy was on vacation, but really, neither skipping backups or denying vacations are good options.\nAt another startup that wasn’t quite as well funded, the air conditioning was off on weekends and evenings, including in the server room. It’s a good thing I was shown how to restart the server — on summer weekends our IT person would call the office and say the server was apparently down, could someone reboot? Make sure your IT person can go on vacation without the company grinding to a halt.\nHave a Plan # Just as with software development, and for that matter, any other functional department of a business, there should be a long-term IT plan. Solely reacting to near-term needs will make transitions to future operations inconvenient, if not impractical. Think about how many users you will have to support, security and application needs, and future services that will have to be supported, and how much it will all cost.\nI was on a game project that had an excellent infrastructure consisting of cutting-edge third-party and custom development tools and a large, responsive IT staff. But just as things were getting busy and more development staff was added to get the project done on time, we got bogged down using the asset management tool — the number of licenses available were inadequate to keep everyone working simultaneously, and it took several weeks to acquire new licenses. One tool that makes a difference between a run-of-the mill IT group and a top-notch group is a ticket system.\nI spent a good portion of my early career hanging out in IT offices and server rooms. Not just because I enjoyed their company and the air conditioning, but it seemed to be the best way to make sure they wouldn’t forget my requests. When dealing with IT groups that employed ticket systems, in the worst case I could call up and refer to the ticket — in the best case, I had immediate responses over email and sometimes an immediate visit at my desk.\nKnow the Applications # It amazes me that IT often doesn’t know the first thing about the applications it installs. Admittedly, I often can barely use the programs I develop, but still, I can at least launch them and invoke rudimentary operations. On the other hand, I’ve seen IT personnel unable to run the programs even to verify their successful installation.\nAt one game development company where we had contract IT support, we had an ill-timed switch of our logins to new domain-based accounts over the weekend. Not only was this without advance notice, leaving people wondering on Monday why their original accounts were not functional (in particular, email, so there would have no point in notifying everyone by email after the fact), but many of the applications installed in the original accounts did not function in the new accounts. This fiasco occurred because the IT contractor was familiar with everyday-use applications like Microsoft Office and was apparently confident those packages were transitioned correctly, but was completely unaware that as software developers, we used quite a few other programs that were critical to our business, like compilers. And apparently the person managing our outsourced IT failed to consider that, too.\nThe same IT contractor also went the extra mile to install virus-scanning software on all our machines and enabled them, again without telling anyone. And again, this is a good idea for normal computer usage, but many software code generation tools are documented not to play well with virus scanners. Moreover, with dependencies and interactions (read, bugs) with different drivers, multimedia capabilities (e.g. versions of DirectX) and operating system versions and patches, it is important for IT to track issues with the critical applications used by developers.\nKnow the Business # IT procedures have to be in sync with the company’s business. Practices adequate for maintaining regular 9–5 businesses may not be compatible with software development houses, Internet operations, or financial institutions.\nThe aforementioned switch to domain-based accounts at a game development company not only went badly, but took place during the final crunch time stretch for that particular game. Remarkably, this happened again a year later at the same company with the same contractor — a new router was installed, once again without notifying anyone in advance, and worse yet, this was the morning of a business day, and once again during crunch time development. Considering that the employees were asked to put in extra hours in the evenings and weekends, this was really unforgivable. When involved in packaging products, IT needs to know the application requirements and how to manage configuration changes.\nAnother game company I worked at developed arcade games running on stock PC hardware. Our testers discovered a graphics glitch just as some new machines were being packaged for delivery overseas, and upon investigation it turned out that our hardware vendor had stopped offering our the graphics card used in our configuration, so our PC configuration people had started ordering a different card without considering that our game might not run correctly with it. And in some cases, particularly web-based services, IT is on the front lines with the customer and should be acquainted with customer needs and expectations as much as anyone else in the company.\nOne of my favorite projects was a wireless web browser and gateway for handheld devices. But for a consumer service that was supposed to run 24/7, we ran it haphazardly. After some heated discussions with my managers about adding features in before the launch date, I discovered our IT manager had already launched the service at his own initiative, with little fanfare. And when we moved our office upstares for more space and a nice view of the San Francisco Bay, the gateway machines were moved in the late afternoon with no advance notice to customers or even staff. Any Friday afternoon commuters who wanted to browse the web on their train ride was out of luck. It’s not just small startup companies that get this wrong. I’m amazed in this era of Web 2.0 how badly prominent web sites are run.\nI was an avid review writer on Epinions until I lost several reviews-in-progress on Sunday afternoons — that is when when they scheduled their site maintenance update. Even Google showed some amateurish site management — I delayed setting up my Adsense account for a week because the password-retrieval page was down. The worst case I’ve seen of a site-that-should-know-better was the local Time-Warner cable broadband signup page. For at least a week the page stated it was down while an update was in progress, and for a while after that, it displayed the startup Apache server test page. If there was a truly competitive broadband market, imagine how much business they could have lost?\nKnow the Rules # Like HR, IT is part of every employee’s tenure from day one. The rules don’t just involve proper IT ticketing procedures. These days, every employee, and thus every IT practictioner should know the legal requirements and corporate policies governing privacy and proper use of the IT infrastructure.\nI worked for one delightful employer who went into muckraking mode whenever an employee left or was terminated — she would scour the former employee’s hard drive and announce to everyone she found porn and lascivious email. Eureka! Employees should know what expectations of privacy they have, who owns the data on the computer they’re using, and what activities, e.g. porn-surfing, are restricted. (Although a friend of mine pointed out that some occupations are so thankless, Internet porn should be considered a job perk)\nManagement should also know, or be informed, if they’re clueless, what lines they can’t cross.\nIn one of her more vindictive moods, the aforementioned employer floated the idea of breaking into a former employee’s Yahoo webmail account, apparently assuming that was fair game if that account was accessed from work. It’s not. And you can’t depend on the company legal department for expertise.\nWhile wrangling over a contract with a large video game company, I complained to their legal department that one of their clauses made no sense — it stated that any licensed components that I built into a deliverable would have to be sublicensed by me to them without restriction. This indicated ignorace of how software is constructed (e.g. just building an installer typically incorporates installer code from the installer vendor) and how software licensing works (or even what the word “license” means). Ever read one of those interminable EULA’s? Communicate the Policy # Defining proper and improper employee behavior is always a tricky business, and computers in the workplace make it even more so.\nTerminating an employee is often a messy scene involving weeping, yelling, begging or all of the above. But sometimes what happens afterwards the employee leaves the premises for the last time is worse. People descend on that person’s computer and discover porn, evidence of freelance work, and even sometimes root through email (one of my employers read an ex-coworker’s email to his girlfriend)\nYou could argue that employees shouldn’t make any personal use of office computers and anything they leave is fair game for employers who have to protect their interests. You could argue that it is in poor taste and unethical for employers to gratuitously root through all the leavings. Either way, make the rules clear — that’s what employee handbooks are for.\nYou Can’t Take It With You # The IT relationship with an employee doesn’t end with his departure.\nOne of my employers laid off several employees in a Friday afternoon massacre, notifying them at 5pm. One said he didn’t have time to clear out his office and would have to return later to do that, including retrieving information from his computer. As this obviously was not a trust-filled working environment, the employer worried that this newly-disgruntled newly-ex employee might do some damage on the network. My suggestion: as a regular practice, as soon as an employee is terminated, back up that computer, save a snapshot of the final state on CD, DVD or whatever for easy access later, and take the computer out of service. Taking snapshots of departing employees’ hard drives is also a good practice for less cynical reasons. If the engineering team has to call up the employee and say “Hey, where is that documentation?” or “Did you forget to check in that last bug fix?” you’re not out of luck.\n","externalUrl":null,"permalink":"/books/techsoft/backitup/","section":"Books","summary":"IT is getting harder every year, due to the march of technology, increasing spam, and more nefarious security attacks. But there are some basic principles in taking care of your organization’s IT needs, whether it’s a one-person shop or a huge corporation. Trust, then Verify\n","title":"Back it Up: Safe IT Practices","type":"books"},{"content":" Explore Further # I began this chapter by citing the perils of optimizing too early, at the risk of complicating things before you even got something working. But you should keep your performance target in mind from the very beginning of development. Start simple (the Unity documentation recommends rendering no more than 40,000 vertices on the iPhone 3GS), get something working, optimize enough to meet your performance target, continue adding content and functionality, and stop and optimize every time the game’s performance falls below your target. And remember to profile and optimize the bottlenecks. It will do you no good to optimize something that’s taking 10% of your frametime and leave alone something else that’s taking 50%.\nUnity Manual # In the Unity Manual, the section “Getting Started with iOS Development” has several pages on “Optimizing Performance in iOS,” covering the “Player Settings” we adjusted to optimize builds, description of the built-in profiler, and optimizing the build size.\nThe “Advanced” section documents the Profiler available with Unity Pro and also the offline optimization features mentioned: lightmapping and occlusion culling. The “Advanced” section includes many other pages related to optimization: “Optimizing Graphics Performance,” “Reducing File Size,” “Automatic Memory Management” (garbage collection), and “Shadows” (in particular, “Shadow Performance”). The pages on “Asset Bundles” and “Loading Resources” explain how assets can be downloaded and brought into a scene on demand, which is a technique that can be used to manage the installed app size.\nReference Manual # The Reference Manual describes all the Components and Assets we optimized. Among those Components, we tweaked the Camera frustum and visibility mask, also adjusted the culling mask and distance for the Light in addition to disabling its shadow, minimized the number of shadow casters and receivers per MeshFilter, simplified the shaders for each MeshRenderer, and replaced a MeshCollider with a Box Collider. We looked over the Import Settings for the various Asset types referenced by the Components: Texture2D, AudioClip, Mesh, and Animation. The Reference Manual also documents the Settings Managers we customized, including the Quality Settings, Physics Manager, Time Manager, and Audio Manager. We also used the GUIText Component, sibling of the GUITexture we use for a splash screen, for our frame rate display.\nScripting Reference # The “Scripting Overview” section of the Scripting Reference has a Performance Optimization page with some tips on how to write faster scripts. The one new function we learned in this chapter is the static function Combine in the StaticBatchingUtility class (Combine is the only function in that class), which we called to batch a hierarchy of GameObjects at runtime. The one new variable we learned in this chapter is the useGUILayout variable in the MonoBehaviour class, which when set to true provides a performance increase by telling the UnityGUI system that the current OnGUI callback will not be performing any automatic layout using the GUILayout functions.\nThe Settings Managers all have corresponding classes so that their settings can be queried and set with scripts. Because all of the Settings Managers except Render Settings are active for the entire game and not per scene, script access allows us to adjust settings for each scene. For example, we might define a Quality Level for each scene and add a script to each scene that loads the appropriate Quality Level. The classes corresponding to the Settings Managers discussed in this chapter include Quality Settings, Audio Settings, Physics, and Time.\nWe also used the Time class, evaluating its timeScale and deltaTime variables and setting the text variable of a GUIText for our rudimentary frame rate display.\nAsset Store # The Asset Store lists a few profiling systems (search for “profiler”) and some object pooling systems (search for “pool”), such as PoolManager, Smart Pool and Pooling Manager. That last one, from DFT Games, is free.\nOn the Web # The Unity wiki at http://wiki.unity3d.com/ has some performance tips under its “Tips, Tricks and Tools” section and several performance-related scripts. In particular, the “FramesPerSecond” page lists several frame-rate display scripts more sophisticated than the one we created in this chapter (for example, they calculate the frame rate from a series of frames for a steadier display).\nThe Umbra occlusion culling system is developed by Umbra Software. The Beast lightmapping system is an Autodesk product. Books\nI\u0026rsquo;ve mentioned Real-Time Rendering a couple of times, already, but it\u0026rsquo;s really really relevant to the graphics optimizations in this chapter. Just the treatment on mipmapping is a good read.\n","externalUrl":null,"permalink":"/books/learnunity4/chapters/chapter16/","section":"Books","summary":"Explore Further # I began this chapter by citing the perils of optimizing too early, at the risk of complicating things before you even got something working. But you should keep your performance target in mind from the very beginning of development. Start simple (the Unity documentation recommends rendering no more than 40,000 vertices on the iPhone 3GS), get something working, optimize enough to meet your performance target, continue adding content and functionality, and stop and optimize every time the game’s performance falls below your target. And remember to profile and optimize the bottlenecks. It will do you no good to optimize something that’s taking 10% of your frametime and leave alone something else that’s taking 50%.\n","title":"Optimization","type":"books"},{"content":" Contents, Clarifications, and Corrections # Page numbers correspond to the print version. Links are provided to the online Unity documentation cited in the Explore Further sections.\nAbout the Author # page xxi: Snow Crash should be italicized. And that\u0026rsquo;s by Neal Stephenson, by the way (The Diamond Age is also highly recommended). Introduction # Explore Further\nBeginning 3D Game Development with Unity Unity 3.x Game Development Essentials Game Development for iOS with Unity3D A full list of Unity books is available at Games from Scratch\nChapter 1 - Getting Started # Download and install Unity, activate the license, report bugs, get help.\npage 3: \u0026ldquo;OSX installer package\u0026rdquo; should read \u0026ldquo;OS X installer package\u0026rdquo; page 5: \u0026ldquo;Script Reference\u0026rdquo; should read \u0026ldquo;Scripting Reference\u0026rdquo; page 5: \u0026ldquo;Scripts.unityPackage\u0026rdquo; is one word page 7: Starting with Unity 4.2, he free version of Unity now includes Unity iOS Basic (and Unity Android Basic) page 13: \u0026ldquo;The 3D game engines are very complicated\u0026rdquo; should read \u0026ldquo;3D game engines are very complicated\u0026rdquo; Chapter 2 - A Unity Tour # Use the Angry Bots demo to explore the Unity Editor.\npage 25: \u0026ldquo;go ahead and buildl an OS X app\u0026rdquo; should read \u0026ldquo;go ahead and build an OS X app\u0026rdquo;\npage 58: \u0026ldquo;Console\u0026rdquo; and \u0026ldquo;Console view\u0026rdquo; should read \u0026ldquo;Console View\u0026rdquo; (for consistency, we include \u0026ldquo;View\u0026rdquo; in the view name and capitalize as in the Unity documentation - think \u0026ldquo;Eiffel Tower\u0026rdquo; vs. \u0026ldquo;Eiffel tower\u0026rdquo;)\npage 58: \u0026ldquo;a script calls a Log.LogError\u0026rdquo; should read \u0026ldquo;a script calls Debug.LogError\u0026rdquo;\npage 58: Starting with Unity 4.1, filtering of Console View messages is controlled by the three buttons at the top right of the view. Tip: make sure that error messages are not filtered.\npage 60: Starting with Unity 4.2, YAML support (the Force Text option in Editor Settings) is availble in Unity Basic\npage 60: Starting with Unity 4.2, the Editor has integrated Perforce support and an API for supporting other version control systems.\nExplore Further\nUnity Manual Unity Basics Learning the Interface Chapter 3 - Making a Scene # Create a new Unity scene, add primitive models, textures, lighting, and camera movement. Import assets from Standard Assets, the Unity Asset Store, and the file system. This chapter uses the Free ArtskillZ Texture Pack 01 from ArtskillZ..\npage 63: \u0026ldquo;Assets that were installed with Unity in the previous chapter\u0026rdquo; should read \u0026ldquo;Assets that were installed with Unity in Chapter 1 page 67: \u0026ldquo;Script Reference\u0026rdquo; should read \u0026ldquo;Scripting Reference\u0026rdquo; page 109: \u0026ldquo;Building a Scene\u0026rdquo; should read \u0026ldquo;Building Scenes\u0026rdquo; Explore Further\nUnity Manual Creating Scenes Building Scenes Asset Import and Creation Creating Gameplay Chapter 4 - Making it Move: Scripting the Cube # Create a script (JavaScript), spin the cube, make prefabs, edit and debug scripts with MonoDevelop. Also demonstrate tween animation with iTween from Pixel Placement.\nExplore Further\nScripting Reference Runtime Classes Chapter 5 - Let\u0026rsquo;s Dance! Animation and Sound # Import a dancing skeleton and music, select and loop the animation and music, add shadows and particle effects. This chapter uses the Skeletons Pack from bisaniyehocam and General Music Set from Gianmarco Leone.\npage 164 - Starting with Unity 4.2, dynamic shadows are available in the free version of Unity, but only hard shadows with directional lights, so if you\u0026rsquo;re running Unity free, select Directional for the type of the light and Hard Shadows for the shadow type. Explore Further\nUnity Manual\nAsset Import and Creation\nAudio Files\nCreating Gameplay\nAsset Store\nJukebox Free\nChapter 6 - Let\u0026rsquo;s Roll! Physics and Controls # Create the beginnings of a bowling game. Make a ball and floor, add colliders and rigidbodies for collision detection and collision reaction, respectively. Uses Eighteen Free Substances from Allegorithmic.\npage 211 - AddTorque, AddRelativeTorque, AddExplosionForce, AddForceAtPosition should be formatted like the other function names/pages (i.e., in quotes). Explore Further\nScripting Reference MonoBehaviour MonoBehaviour.OnCollisionEnter MonoBehaviour.OnCollisionStay MonoBehaviour.OnCollisionExit Rigidbody Rigidbody.AddForce Rigidbody.AddRelativeForce Rigidbody.AddTorque Rigidbody.AddRelativeTorque Rigidbody.AddExplosionForce Rigidbody.AddForceAtPosition Input Input.GetAxis Chapter 7 - Let\u0026rsquo;s Bowl! Advanced Physics # Add bowling pins using primitive models and models from the Asset Store. Construct compound colliders. Add sound effects triggered by collision callbacks. Uses the Free SFX Package from Bleep Blop Audio and Barrel from Universal Image.\nExplore Further\nScripting Reference Object.Instantiate MonoBehaviour.Awake Rigidbody Chapter 8 - Let\u0026rsquo;s Play! Scripting the Game # Implement the bowling game rules with a finite state machine using coroutines.\npage 281: The link to the Blue Mars wiki, \u0026ldquo;http://create.bluemars.com\u0026rdquo;, should read \u0026ldquo;http://create.bluemars.com/wiki\" Explore Further\nScripting Reference Coroutines and Yield Coroutine WaitForSeconds YieldInstruction Chapter 9 - The Game GUI # Implement a scoreboard and pause menu with UnityGUI. Demonstrates Necromancer GUI from Ironbound Studios.\nExplore Further\nScripting Reference GUILayout GUI.Button GUI.Label GUISkin GUIStyle Application.Quit AudioListener QualitySettings SystemInfo Asset Store EZGUI NGUI Another one I forgot to mention:\nGUIKit001 Chapter 10 - Using Unity iOS # Return to Angry Bots to get familiar with Unity iOS. Switch the build target to iOS, customize Player Settings, test in the Editor with Unity Remote, build to Xcode and test in the iOS Simulator.\nProblems introduced with Xcode 5 (hopefully temporary):\nBuild and Run in the Unity Editor fails to start Xcode 5. Workaround: start Xcode manually first, or double-click the xcodeproj file to bring up Xcode 5 manually, then click the Run/Play button. Chapter 11 - Building For Real: Hardware Testing and App Submission # Set up devices, provisioning profiles and app descriptions on the Provisioning Portal and iTunes Connect. Build Angry Bots for test devices and for submission to the App Store.\nXcode no longer displays provisioning profiiles, and it is no longer necessary (or possible) to install development provisioning profiles on test devices via the Xcode Organizer. The profile is autmatically installed if necessary when running/installing the app.\nProblems introduced with Xcode 5 (hopefully temporary):\nIn Xcode 5, Archive may complain there is no matching provisioning profile for the test device. Workaround: detach the test device before invoking Archive. Chapter 12 - Presentation: Icons and Splash Screens # Resume work on the bowling game. Automatically scale the GUI for different screen sizes. Incorporate initial and secondary splash screens.\nIt should be noted the Fugu Games splash screen and the Fugu icon (also used as a texture in Chapter 3) are based on the Fugu Games logo designed by Shane Nakamura.\npage 390: The x and y values specifying the normalized screen coordinates of the GUITexture are entered in the Transform Component\u0026rsquo;s position. Explore Further\nScripting Reference\nGUIUtility\nGUI.matrix\nMatrix4x4\nMatrix4x4.TRS\nWaitForSeconds\nTime\nTime.time\nTime.realTimeSinceStartup\nApplication.LoadLevel\nApplication.LoadLevelAsync\nHandheld\nHandheld.PlayFullScreenMovie\nHandheld.StartActivityIndicator\nHandheld.StopActivityIndicator\nIOSActivityIndicatorStyle\nObject.Destroy\nObject.DontDestroyOnLoad\nAsset Store\nTransitions Manager\nBooks\nReal-Time Rendering Tapworthy Chapter 13 - Device Input # Implement touchscreen input for the bowling game, detect shakes with the accelerometer, display video textures with the webcam.\n(page 407) Starting with Unity 4.5, the Camera far property has been renamed farClipPlane. Explore Further\nScripting Reference Input WebCamTexture iOS Developer Library Event Handling Guide Camera Progrmaming Topics for iOS AV Foundation Programming Guide Asset Store Finger Gestures Prime31 plugins Chapter 14 - Game Center: Leaderboards and Achievements # Set up Game Center leaderboards and achievements in iTunes Connect. Submit high scores and achievements and activate iOS5-style achievement banners with scripts.\nExplore Further\nScripting Reference Social GameCenterPlatform Chapter 15 - iAd: Banner and Interstitial Ads # Set up iAd in iTunes Connect. Add a banner ad and intersitiai ad to the bowling game with scripts.\npage 443: In \u0026ldquo;The while loop calls yield\u0026rdquo;, \u0026ldquo;yield\u0026rdquo; should be formatted as inline code page 443: \u0026ldquo;the ad will immediately display by with a call to\u0026rdquo; should read \u0026ldquo;the ad will immediately display with a call to\u0026rdquo; page 443: \u0026ldquo;which will show up as check boxes\u0026rdquo; should read \u0026ldquo;which will show up as checkboxes\u0026rdquo; page 447: \u0026ldquo;the static variable of iPhone.generation\u0026rdquo; should read \u0026ldquo;the static variable iPhone.generation\u0026rdquo; Apple has since discontinued iAd, so there is no longer a scripting interface. There are other ad services with Unity script interfaces, including Unity\u0026rsquo;s own Unity Ads.\nChapter 16 - Optimization # Optimize for quality, space and speed (just not all at once). Use the Editor and built-in profilers.\npage 474: \u0026ldquo;Inspector view\u0026rdquo; should read \u0026ldquo;Inspector View\u0026rdquo; page 496: \u0026ldquo;Player Settings\u0026rdquo; should not be quoted (not a reference to a Unity Manual page) page 496 \u0026ldquo;Automatic Memory Management\u0026rdquo; should read \u0026ldquo;Understanding Automatic Memory Management\u0026rdquo; Explore Further\nUnity Manual\nGetting Started with iOS Development\nOptimizing Performance in iOS\nOptimizing Graphics Performance\nReducing File Size\nUnderstanding Automatic Memory Management\nShadows in Unity\nAsset Bundles (Pro Only)\nLoading Resources at Runtime\nReference Manual\nCamera\nMeshFilter\nMeshRenderer\nBoxCollider\nTexture2D\nAudioClip\nMesh\nQualitySettings\nPhysicsManager\nTimeManager\nAudioManager\nGUIText\nGUITexture\nScripting Reference\nPerformance Optimization\nStaticBatchingUtility.Combine\nMonoBehaviour.useGUILayout\nChapter 17 - Where to Go from Here? # Miscellaneous topics: C# and Editor scripts, plugins, customizing script execution order, promoting your apps, more monetization.\npage 512: \u0026ldquo;Storekit\u0026rdquo; should read \u0026ldquo;StoreKit\u0026rdquo; as in the Prime31 documentation (or \u0026ldquo;Store Kit\u0026rdquo; as in the Apple documentation) page 513: \u0026ldquo;not available on Android either\u0026rdquo; should just read \u0026ldquo;not available on Android\u0026rdquo; page 513: There should be a paragraph break after \u0026ldquo;Twitter, by the way, is another great way to interact with other Unity developers, on a more personal level.\u0026rdquo; page 513: Of course, the UNITY_IPHONE preprocessor definition is not active when the build target is Android. Use UNITY_ANDROID instead (or in addition). Unlike iOS, Android apps conventionally have a Quit button and Android devices have a Back button that is recognized by Unity as the Escape key. The GitHub project for this chapter includes those Android-specific changes in the pause menu. Backing up the assertion that the code in this book works on Android, the Learn Unity app is available on Google Play and the Amazon Appstore, and for the Nook and the Nabi tablets. Back Cover # \u0026ldquo;Three-dimensional games\u0026rdquo; should read \u0026ldquo;3D games\u0026rdquo; (no one says \u0026ldquo;three-dimensional glasses\u0026rdquo; or \u0026ldquo;three-dimensional movies\u0026rdquo;) Ebooks # All Versions # Many of the quoted titles in the Explore Further sections should be links to online documentation (for the Scripting Reference pages, try searching for those terms in the Scripting Reference search box). iBook # No problems that I can see.\nKindle # Figure links don\u0026rsquo;t always work. There is a second Kindle edition with a publication date of August 4. I don\u0026rsquo;t know what\u0026rsquo;s different about it except it\u0026rsquo;s been reported that the full table of contents (not the Contents at a Glance) has broken links. Nook # URL\u0026rsquo;s display with markup and are not active as links (you can check the sample to see if it\u0026rsquo;s been fixed. ","externalUrl":null,"permalink":"/books/learnunity4/corrections/corrections/","section":"Books","summary":"Typos, bad formatting, and stuff that’s no longer true.","title":"Corrections","type":"books"},{"content":" Explore Further # This chapter has been the shortest by far, and that’s a good thing. It means our game is functionally complete and that adding ads is really simple. Even the setup on iTunes Connect wasn\u0026rsquo;t bad! In practice, though, you may need to put some thought into where and when to place ads, especially interstitial ads, and the earlier in the design process that takes place, the better.\nScripting Reference # We managed to do a lot with just a little code in this chapter. Only two classes were required to make use of iAds: ADBannerView and ADInterstitialAd, and in a typical app you would only use one of those classes (having both banner ads and interstitial ads is a bit much!). The pages for both of those classes have script examples.\nThe iPhone class contains anything that is specific to iOS (much of what used to be iOS-specific is now also applicable to Android and is now in the Handheld class). For example, we check the static variable iPhone.generation to find out if we’re running on an iPad. It\u0026rsquo;s worth checking the page on the iPhoneGeneration enum to see the set of iOS hardware recognized by Unity.\niOS Developer Library # The Unity ADBannerView and ADInterstitialAd classes correspond to same-named classes in Objective-C. The iAd Programming Guide in the iOS Developer Library describes those classes and provides a lot of details on how to effectively deploy banner and interstitial ads.\nAsset Store # iAd isn’t your only in-app advertising option. Once you start releasing apps, you will probably start receiving e-mails from numerous account managers at various mobile ad vendors. In fact, iAd originated as a product of Quattro Wireless before Apple acquired that company to gain its advertising product. Third-party ad vendors typically have their own iOS SDK and thus require a Unity plugin to access that SDK. Some of these SDKs are available on the Asset Store under the Services category, including PlayHaven and Inneractive.\nOutside the Asset Store # As with their Game Center plugin, Prime31 Studios offered an iAd plugin before Unity introduced their iAd scripting support. Prime31 offers plugins for many other advertising services, including AdMob, AdWhirl, MobClix, and many more, available at http://prime31.com/.\nKiip provides an interesting twist on ads. A Kiip-enabled app features coupons that resemble banner ads but are presented like achievements.\n","externalUrl":null,"permalink":"/books/learnunity4/chapters/chapter15/","section":"Books","summary":"Explore Further # This chapter has been the shortest by far, and that’s a good thing. It means our game is functionally complete and that adding ads is really simple. Even the setup on iTunes Connect wasn’t bad! In practice, though, you may need to put some thought into where and when to place ads, especially interstitial ads, and the earlier in the design process that takes place, the better.\n","title":"iAd: Banner Ads and Interstitial Ads","type":"books"},{"content":" Explore Further # This has been one of the more efficient scripting chapters. With just a few lines of code, our game is now connecting to the Game Center, submitting achievements and scores, and displaying the achievements and the leaderboard from the pause menu!\nThe bulk of the work was spent in the Game Center setup on iTunes Connect. Even there, designing the leaderboard and set of achievements for a bowling game is straightforward, since the rules and traditions are so well-defined. Chances are, if you design a new game, you\u0026rsquo;ll have to put some thought into what leaderboards and achievements you want in your game, and you should probably think about that early in the design process.\nScripting Reference # This chapter used the Social class almost exclusively to access the Game Center features used in this chapter. The Scripting Reference page for that class explains its role in encapsulating access to Game Center and potentially other social gaming platforms (although for now, Game Center is the only one).\nWe made do with the minimum set of functions required to report scores and achievements and display the results: accessing Social.localUser to connect to Game Center, calling Social.ReportProgress and Social.ReportScore to submit achievements and scores, respectively, and calling Social.ShowAchievementsUI and Social.ShowLeaderboardUI to bring up the Game Center display for the player’s achievements and game’s leaderboards. The documentation for the Social class lists several other functions that allow finer-grained control, for example, to retrieve information from Game Center to populate a custom leaderboard display.\nWe bypassed Social and accessed the GameCenterPlatform class directly to invoke its showDefaultAchievementsCompletionBanner function, enabling iOS 5-style achievement banners. The page for the GameCenterPlatform class explains what namespace it’s in and includes some notes on the Game Center Sandbox.\niOS Developer Library # The Game Center chapter of the iTunes Connect Developer Guide is the definitive source on setting up achievements and leaderboards. The Guide is available within the iOS Developer Library](http://developer.apple.com/library/ios) or in the Xcode Organizer.\nThe inner workings of the Game Center are explained in the Game Center Programming Guide in the iOS Developer Library, under the Networking and Internet topic. The portion of the Game Center that can be integrated into apps, as opposed to the server portion operated by Apple, is actually called Game Kit and also features support for networked multiplayer gaming.\nAsset Store # Game Center isn’t the only social gaming platform available for iOS. Many have come and gone (OpenFeint, Agon Online), but there are still some other options. Under its Services category, the Asset Store offers plug-ins for PlayHaven and Swarm, both offering leaderboards, achievements, and other social gaming features. Another Game Center plugin, from Hippo Games, is listed under Scripting/Integration.\nBefore Unity had built-in Game Center support, Prime31 Studios provided a Game Center plugin, which is still available at http://prime31.com/ (but not on the Asset Store) and is an option for developers who need some features not provided by Unity. For example, the Prime31 plugin includes a function for issuing achievement challenges (a feature of iOS 6). Prime31 also offers a Game Kit plugin for multiplayer gaming support that is on the Asset Store.\n","externalUrl":null,"permalink":"/books/learnunity4/chapters/chapter14/","section":"Books","summary":"Explore Further # This has been one of the more efficient scripting chapters. With just a few lines of code, our game is now connecting to the Game Center, submitting achievements and scores, and displaying the achievements and the leaderboard from the pause menu!\n","title":"Game Center: Leaderboards and Achievements","type":"books"},{"content":"I wrote these tips on the contracting lifestyle at the five-year mark, so some details are out of date.\nEvery contractor working on the Death Star knew what he was getting into\nKnow What You’re Getting Into # Back in the early nineties, I had dinner in Boston with an operating systems engineer who worked on a contract six months a year and spent the other half of the year at his cabin in Maine. I thought that sounded like a pretty good lifestyle, and these days I can tell people are similarly intrigued when they ask me about my consulting business. It sounds appealing — be your own boss, make your own hours, pick your own projects, and get paid more than you made as a salary. But don’t be misled by the fancy-sounding title “consultant”. Sometimes it means just working on a contract basis, and sometimes it’s a euphemism for being in-between jobs.\nIn fact, as a consultant, I earn less on average than I did from a salary, there are long gaps between paying projects (when I first began telling people I was an independent consultant, I felt like I was lying), and some years I qualify for the low-income discount from the utility companies. But I have time for my own projects between contracts, I find the nitty-gritty of running my own business interesting and educational, and (perhaps this is my imagination) I receive more courteous and professional treatment as a contractor and consultant than I did as an employee.\nSo if this lifestyle still sounds appealing, read on…\nGet Ready # Consulting can be very unsteady work, so you shouldn’t rely on it as a living if you don’t have a good cash reserve. In general, I’ve heard that you should have six months of living expenses saved up in case of unemployment. For a consultant, I think you should have at least a year’s reserve.\nWhen I first started relying entirely on consulting work for income, I figured that I had six months of living expenses in reserve. Six months later, I realized I was right on schedule.\nIf you had employer-sponsored health insurance, be sure to continue that coverage under COBRA until it expires or you have found other insurance. Under federal law, you’re entitled to health insurance as long as you’ve taken full advantage of COBRA, but if you neglect to sign up or you discontinue the coverage early, you could be out of luck — insurers are not then required to grant you a new policy. Companies with real HR departments usually know what they’re doing, but some small companies play fast and loose with the rules, so don’t can’t assume they’ll do the right thing.\nI’ve been in a couple of startups that didn’t seem aware of their health care obligations — one completely ignored my queries about signing up for COBRA, and after the decision period expired I received a letter from the insurer stating that I was no longer eligible. At the other, the owner expressed surprise when I pointed out that California extends COBRA rules to small companies via CalCOBRA, and then gave me a waiver to sign ignoring the allowable decision period.\nIt’s unfortunate that the U.S. health care system relies on employers to provide affordable health insurance, but given that, it’s important for you to understand the laws that are there for your protection and to take advantage of them.\nGet Paid # Always get paid. With money. You may get offered equity, royalties or the reward of an experience, but take those in account only after discussing cash compensation.\nI was offered a tiny equity stake and no cash to consult for a startup. A year later, the founders asked everyone for the stock certificates back so they could dissolve the company.\nIf the client is certain about making money off the project, he should put his money where his mouth is and pay you now. And if the prospects are more dubious, he should definitely pay you. Either way, there’s no reason you should take the risk.\nIn some cases, a client will try to renegotiate terms after the fact. In the worst cases, like an old apartment roommate of mine who just assumed I would cover his rent, I’ve had a few clients who expected me to continue working on their projects even when they stopped paying me.\nA game publisher that hired me to evaluate builds from one of their developers terminated the contract, then a month later sent me a new build to evaluate. When I asked if this meant they wanted to restart the contract, the reply was: “Oh, we thought you could just look at it.” But at least they paid. When I informed another client that our contract period was up, they said, “now this is the transition period”, expecting me to supply free support while they dithered around with the contract renewal. The worst transgressor in my experience was a game developer who hired me to help finish the “first-playable” build of a game and told me that that it would absolutely be delivered in five weeks or “there wouldn’t be a company anymore.” After six weeks, when I asked if they wanted me to continue, the reply was “it’s entirely up to you.” Apparently there was an implicit “but we won’t pay”, since the invoice I submitted a few weeks later was met with the classic denial-blame-bargaining phases of weaseling out of a bill. Ironically, that developer had a history of threatening and suing any publishers who tried the same trick on them.\nYou shouldn’t have to do this, but be crystal clear that you expect to be paid. Avoid deadbeats. Check your network — few companies have pristine reputations, but some are repeat offenders, to the point where they effectively have bad credit and contractors won’t deal with them. Don’t take “…because of our financial situation…” for an excuse. (I did on one occasion just so I wouldn’t have to listen to any more whining, but righteousness is expensive) If they can’t pay their debts, they should declare bankruptcy. Any client that wants to be treated as a charity should reincorporate as one.\nWait ‘til the Check Clears # As a teenager in Iowa, a bus driver noticed I’d tried to get on with a few cents short of full fare and gave me a succinct lecture: “if you don’t have enough, just tell me.” I wish he could set some of my clients straight. In my experience, most clients do pay up, but when they’re having trouble coming up with the money, they don’t tell me what’s really going on.\nFor eight months I had no problem submitting invoices to a particular client until one day the accounts guy who’d processed of all my previous invoices asked “Do you have authorization for this?”. The next time I tried to submit an invoice, that guy was gone and another person directed me to drop the invoice off in a nearby office — an empty office. It was no surprise when I inquired about it six weeks later that they had no record of it. But that was better than the company whose office flunky took my invoice and then went to Taiwan for a long vacation. Or the company who told me they couldn’t complete the check because “the girl who does that is manning the switchboard right now”. I mean, really.\nWhen you start getting “the dog ate my homework” excuse, it’s time to wrap it up. And don’t spend any of that money until the check clears.\nDon’t Sell Yourself Short # As a rule, a contract rate should be higher than a salaried rate. Prospective clients that act surprised at that are either disingenuous or not too bright. Remember, the client isn’t providing you employee benefits such as health insurance and training, paying your employment tax, or paying you severance when the contract is terminated (unless you have negotiated it). You have to cover your own insurance costs, pay a fifteen percent self-employment tax in addition to regular income tax, keep yourself up-to-date and marketable, oftentimes provide your own equipment and facilities, and cover your living expenses in the periods between contracts.\nAvailability of contracts is largely a matter of timing. When business is good, that means you’ll have to turn down some projects while you’re occupied with others. Taking a low-paying contract may mean you’ll passing up a higher-paying contract in the meantime — you’re paying an “opportunity cost”.\nDuring just one year, I missed out on at least three potential contracts because I was busy on others. In one case, I passed on a one-month full-rate job that would have paid twice more in total than the lower-rate two-month project that had my attention at the time. There were some other considerations on the lower-paying project that hopefully made it worthwhile, but it’s hard not to feel regret when you’ve traded off that much income.\nLonger-term contracts don’t necessarily justify lower rates. A contractor friend of mine told me when I started out that companies can terminate a contract at any time, and you just have to factor that into your price. And indeed I’ve found that to be true — most clients will have no compunction about terminating a contract if the funding falls through, or if they think they can get someone cheaper to do it.\nOne client pouted that it wouldn’t make sense for her if I didn’t stay on project for the duration, expected to be another year or so. The entire project was cancelled a few weeks later, and I didn’t even get paid for all of that. I have to say, that didn’t make sense for me.\nIt’s unfortunate that some clients will stoop to haggling like car salesmen (“I’m writing down a number….”).\nI had one client who not only bargained down my rate (“that’s more than I make!”, he exclaimed), but also wanted payments tied to milestones, ostensibly as as formality. And every couple of weeks, they had just one more favor to ask, until, by the second contract renewal, they were cramming as many listed but unspecified deliverables as they could into the schedule on a weekly basis without even making payments for each deliverable, and trying to sneak in unpaid “transition” periods of work between contract renewals.\nIf a client acts cheap before the contract even starts, it’s just going to get worse. Phrases to watch out for: “We’re on a budget”, “This should be easy”, and, my favorite: “I would do it myself, but I don’t have time.” Avoid these projects — it’s not worth the aggravation.\nMake Your Reputation # Every project you get is a potential link to your next one. One executive-level consultant told me he used to try marketing himself aggressively, handing out business cards at networking parties, etc, but all of his work came out of his existing network. This has been true in my case, too — all of my contract work (and many of my salaried jobs) have come through referrals.\nSo it is important to maintain and enhance your reputation on each project. This includes getting quality work done, and managing expectations.\nI’ve heard complaints from clients about having to throw away work performed by previous contractors just because no one could understand their code. And I’ve heard of contractors who will actually offer one rate to do a quick and dirty job, and a higher rate to do clean code with good documentation. That shouldn’t be a choice — do the job right and be honest about how much it will cost and how long it will take, even if it’s not what the client wants to hear.\nBesides good work, you also want a reputation for billing fairly and not trying to milk each project. I’ve seen contractors bill the maximum allowable hours no matter how much they actually work, and contractors who try to extract every little perk and expense reimbursement, down to free sodas and per diems. This makes contract negotatiation harder for everyone. Forget the small stuff — it’s the big payment that counts, and if you have a reputation for billing fairly, it’s easier to maintain a higher rate.\nAnd most of all, don’t make the person who referred you regret the decision.\nOne programmer I introduced to a game developer embarrassed me by being overly inquisitive and pushing aggressively for a demo. Another artist I introduced to a potential client kept probing me for inside information while negotiating a contract. (and meanwhile the client was doing the same. What a headache) I’ll never refer those guys again — too much damn trouble.\nIf employment is like a marriage (or at least a steady relationship), then contract work is like prostitution. And I don’t mean that in a bad way.\nI worked with one contractor who emailed the whole company calling for everyone to strike in support of better conditions for the office cleaning people. Well-intentioned, but I doubt even the cleaning staff was going to rally around him.\nThe most important thing in the contract relationship is that you get paid. As a mercenary, you can offer friendly suggestions about how your clients run their businesses, but it’s their business.\nPut the “Contract” in “Contractor” # My least favorite part of contract work is the contract itself. The conventional wisdom is “Get it in writing”. If someone is going to cheat you, they’re not going to let a piece of paper stop them, but it doesn’t hurt to have something that you can fall back on in the event of legal recourse, and even for “handshake” agreements, people can have different memories of even the basic terms, so you want to get that written down in some form.\nTypically, the client will present you with a contract put together by the client’s attorneys, who are solely representing the client’s interests. It’s up to you to protect your interests. So don’t get bullied into accepting any terms that make you uncomfortable.\nStatements you should ignore:\n“This contract is intended to protect your interests.” Bah! The company’s attorneys are bound to represent their clients’ interests, and that does not include you. Go ahead and ask the company’s lawyers if they are representing your interests.\n“No one has complained about this before.” That’s probably not true, and if it is, it means they didn’t read it carefully or bother to have their own lawyer look at it.\n“I have to protect my company’s interests.” So what? You have to protect yours. Lifelong servitude and your first-born child would be in your client’s interests, but that doesn’t make it reasonable.\nSometimes it’s hard to get a clause removed just by asking, so one tactic I’ve taken is to make sure the clause goes both ways. After all, the contract is between two business entities, so it should be fairly symmetric.\nWhen faced with a non-poaching clause that stated if I “encouraged” any of their employees or contractors to leave the company within a year of the contract’s duration, the penalty would be $100,000 or a year’s salary of the employee, I asked that the clause apply both ways (hey, I could use $100k!). The clause was conspicuously absent in the next draft of the contract.\nJust because the contract was put together by an attorney doesn’t mean that it’s worth the paper it’s printed on. As with doctors and automobile mechanics, it’s easy to assume lawyers know what they’re talking about. But sometimes they do, and sometimes they don’t.\nAn in-house counsel for VC-funded startup assured me that the indemnification clause in my contract had nothing to do with financial liability. When I insisted that “indemnify” meant “to pay”, she looked it up in her pocket dictionary and had to agree. But I guess she hadn’t authored that clause — I later found a word-for-word copy of the contract on a sample-contract web site.\nAnother piece of conventional wisdom is to have your own attorney look at your contract. But attorneys are expensive. In general, I don’t bother with an attorney if the contract looks straightforward, especially if the contract is small. If there’s anything that is not clear to you, you should definitely have an attorney look it over (or walk away if the contract pay is too small to warrant the contract hassle and legal fees). But as before, keep in mind that not all attorneys are created equal:\nAn attorney I picked out of the yellow pages (I was in a hurry) to review a game development contract gave me pause when he referred to “newfangled” video games. He did provide some useful information and corrected mispellings in the contract (I am constantly amazed how someone charging $300 an hour to put together a contract doesn’t bother to run a spell-checker on it). But I would have felt more secure with someone that had knowledge of the industry.\nIf you get an attorney, find one who is capable and knowledgable in your industry. And pass the name on to me!\nKeep Busy # In between projects, you may be inclined to panic. If you do, you’re probably not cut out for this business. Downtime is an opportunity to catch up on things that may be neglected while you’re busy on paying work.\nYou can keep yourself up to date by attending technical presentations, conferences and trade shows. It’s an opportunity to see the latest products and technologies, and perhaps investigate new areas in which you can work.\nI like to go out of town for an industry show after wrapping up a big project — usually the more stressful the project, the farther I like to travel. It’s a nice opportunity to unwind, get away from the computer for a few days, and see what I’ve been missing the last several months. I usually look for shows with free expo passes rather than pay for a full conference registration (not for any good reason besides being cheap). Watch out for spam, though. I’ve been unsubscribing from CMP missives for years, now.\nYou can participate in technical discussion groups. It’s an opportunity to toss around ideas, identify people you might want to work with (particularly in local area groups), and help out people who might help you someday.\nI’ve kept up with the many interesting developments in Java and Java-based projects by following the local (Orange County and Los Angeles) Java User Group mail lists. I don’t particularly like sitting in meetings, so I eschew the regularly-scheduled presentations, but the discussions are often illuminating, and they keep me informed of the latest promising tools. I even brought in one group member as a co-contractor on a project.\nYou can contribute to open source projects. It’s an opportunity to communicate with some excellent developers around the world, research open source tools that you may find useful, and give back to the community.\nDuring my first time off, I made some fixes to JFOR, an XSL/FO-to-RTF converter, so I could use it to generate Word-readable versions of my resume from an XML Format. Since then, I’ve decided recruiters and HR people should know how to read and cut-and-paste from PDF, so I don’t use JFOR, anymore, but I’m gratified to see once in a while an acknowledgment of my contributions from the JFOR list.\nWith all of these activities, the idea is to improve your capabilities and marketability, expand your network and establish some street cred, and enjoy yourself in the meantime!\n","externalUrl":null,"permalink":"/books/techsoft/havecontract/","section":"Books","summary":"I wrote these tips on the contracting lifestyle at the five-year mark, so some details are out of date.\nEvery contractor working on the Death Star knew what he was getting into\n","title":"Have Contract, Will Travel","type":"books"},{"content":" Game Data # Publisher: Technicat, LLC (Fugu Games)\nRelease Date: July 2009 (App Store) and May 2011 (Google Play)\nNumber of Developers: 1 (not counting all the original HyperBowl developers)\nNumber of Contractors: 0\nLength of Project: 6 years (and counting)\nDevelopment Hardware: A succession of MacBook Pros and iOS devices, Android devices, 1 PC.\nDevelopment Software: Unity Android and iOS Pro. SVN, git, mercurial. GIMP. Visual Studio. FBX SDK. GarageBand, iMovie. Aquamacs.\nProject Size: Approximately 70,000 lines of C# and Javascript (some from plugins)\nIntroduction # After looking at the Game Developer/Gamasutra-style postmortem of a GameCube title I worked on back in 2002, it occurred to me it’s about time I wrote another one. I’ve been holding off on a postmortem for my Unity version of HyperBowl, a 3D bowling game in which you bowl through various fantasy worlds (ancient Rome, the deck of a rocking ship, the streets of San Francisco…), until I achieved Flappy Bird success, but maybe I shouldn’t hold my breath. I’ve been working on it for six years, now — I wouldn’t go so far as to say it’s a labor of love, but at least a work of mild fondness. So here’s what happened.\nWhat Went Right # Keeping Bridges Unburnt # This version of HyperBowl came about because I worked on the original HyperBowl, developed by Hyper Entertainment and first deployed as an attraction game at the Sony Metreon in San Francisco. I only worked at Hyper Entertainment for the first few months of 2001 but kept in touch with the Director of Development there, Aaron Pulkka (now running his own show at Rabbx). Around the time Unity announced their upcoming iPhone support, I mentioned to Aaron that I thought that would be a good way to get HyperBowl running on the iPhone. He agreed and suggested I just ask the owners of Hyper, and whaddya know, they said sure, they’re not actively developing it anymore, so why not. And thus they granted me a license to develop it for the web, Mac/PC, mobile and the Wii (basically everything that Unity supported at the time).\nUsing Unity # Unity was the right choice for the game engine. In a way, Unity chose HyperBowl, as I started using Unity in 2007 because it ran on a Mac and had a webplayer and I happened to meet Joachim Ante at WWDC. I only thought of porting HyperBowl to the iPhone a couple of years later when I heard the plans for Unity iPhone support and immediately thought how the screen aspect ratio of the iPhone was a good match for the tall projection screen of the original attraction game (nowadays, you can still find some of the attraction HyperBowls still running in venues like Dave and Busters with upended flat screen TVs replacing the original screens).\nSo using Unity was the expedient choice and default choice, but it turned out to be a good choice. I didn’t realize at the time it would be as popular as it is today (I believe this was before they made the Indie version free) and this was before Unity Android. The multi-platform support is a huge advantage. Even though my focus is mobile, I’ve also made Mac, Windows, webplayer, Flash, and Mac widget versions of HyperBowl, and the only major code difference is the between the touchscreen and mouse-driven control code.\nI could have eschewed middleware altogether, but I had enough trouble just resuscitating the code enough for the asset conversion, much less port it to multiple new platforms. And I would have had to implement or do without a lot of goodies that we take for granted in modern game engines, like bump map shaders and dynamic shadows.\nGetting the Source Code # In addition to the license, Hyper Entertainment provided the original source assets, including the audio, textures, models and also the source code for both the arcade and Windows versions of the game. And not just the files, but the original development PCs, one with the arcade version and one with the Windows version, so I was able to compare them and choose one as a starting point.\nThe first thing I did after booting up the PCs, even before connecting to the Internet, was copy everything I could find onto DVDs and my own computers, then committing everything to version control. This was fortuitous, as I next made the mistake of connecting one PC to the Internet, and instead of something momentous like the Forbin Project, it bogged down downloading a gazillion Windows Updates and ultimately suffered a hard disk crash. The other PC eventually just crashed on its own.\nExporting to FBX # After a few unsuccessful attempts at running the original assets to Unity’s accepted file formats through various converters (and enduring one vendor’s “I am the super guru of 3D conversion software”), I decided I might as well export the data directly from the game and that Unity’s preferred model format really was FBX. When I tried converting the game assets to OBJ format, for example, those files wouldn’t import successfully into Unity, and then when I tried the OBJ converter included in the FBX SDK and got the same result, I figured Unity is just using those same converters to FBX under the hood, so might as well just skip the middleman.\nSo I got the old code to build just well enough, with a few generations newer Visual Studio and stubbed out calls to old middleware, to the point where I could launch the game and load the lanes (equivalent to levels). That’s was good enough to integrate the FBX SDK and and have the game immediately write FBX files for each lane (level) on startup (and startup was about the only thing it could do).\nIn retrospect, this was by far the better approach, and not just because the other approach wasn’t working. If I had been able to convert all the original model files, I would have had to manually import them into Unity and then manually reconstruct the scene hierarchy for each lane, or write some Unity Editor scripts to perform the reconstruction. With each lane as a single FBX file exported from the game, I just had a handful of FBX files to import and no piecing together with Unity was necessary.\n=== Prototyping an App\nWhile I was trying to figure out how to convert the original HyperBowl assets, in order to test my idea for the bowling controls, I created a no frills bowling app, called Fugu Bowl (in the mode of Ford cars, I preface my other app names with Fugu, under the Fugu Games label. It’s a long story that involves watching the Food Network late at night).\nThe control I had in mind, swiping the screen to roll the ball (although with Unity’s game engine, PhysX, it works better to push the ball rather than apply a torque), is intended to emulate the trackball-like operation of the original bowling ball controller. In fact, the arcade version essentially had a trackball, whereas the original attraction game featured a real bowling ball that required you to put some weight into it.\nI thought the result worked pretty well, and the app was surprisingly popular, despite consisting only of a monochromatic ball, capsules for pins, a plane for the bowling lane, and no bowling game rules beyond playing kids boos and cheers for gutters, spares and strikes. This was probably largely due to introducing the app in the early days of the App Store. It was my first app (another reason to release a simple app, first — figure out all those App Store submission intricacies), but it does pain me a little bit that my first app is still my most downloaded app.\nFans on Facebook # Of course I did the social media thing: twitter, google+, youtube…but the most successful platform has been the HyperBowl Facebook group. Currently it has a bit over 800 “fans”, but more important than the quantity, some of them are loyal, supportive, enthusiastic fans who provide suggestions, requests, bug reports, and even localization (got some help on Chinese and French). Showing the benefit of a licensed title, many of the Facebook fans enjoyed the original attraction or Windows version of the game.\nQuick tip: you can set up your Facebook page to automatically share posts to a twitter feed. This hopefully will new users to both your game and the Facebook page and saves you the trouble of manually posting the same news on two different social platforms.\nIndie Is In # The first reviews, among all my apps, included a lot of negative reviews. And by negative, I mean snarky, condescending and amazingly prone to affront by a cheap or free app. That’s pretty rare, now, and I don’t think it’s because my apps improved. The biggest difference, I believe, is that indie is in. People sympathize with the single developer or small studio and recognize there are limited resources, and even if they don’t like the product, they appreciate the effort. Even now, a harsh criticism can turn into a supportive message if I respond, hey, I’m the only one working on this.\nThat’s from the peanut gallery. The other source of snobbery is from the I’m-a-gamedev-pro-and-this-isn’t-AAA crowd. I’ve seen comments like this in gamedev forums, too, but when that game designer who’s used to working in a studio has to come crawling back for simple help in scripting, the attitude changes. By now, enough game developers have gone from salaried work to budding iPhone game developers (and then often back to salaried work — there really should be a rotational system where we can swap places), AAA elitism seems to have dissipated.\nWhat Went Wrong # Exporting to FBX # Converting the original game assets to FBX was definitely the way to go, but it wasn’t fun. When people say they dream of becoming game programmers (people do say that, right?) I’m sure they’re not talking about becoming toolchain programmers. Amazingly, I could not recognize a single line of HyperBowl code I wrote that long ago, even though there are portions I’m sure I must have written (I was not one of the original HyperBowl programmers, but I put in some optimizations and updates to work with newer graphics hardware). But whoever wrote it, that code was generally clean — it’s not hard to traverse the scene and gather all the model and texture info.\nThe part I didn’t like was working with the FBX SDK. Contrary to popular belief, FBX is not a file format. Sure, it has a file format, but it’s deliberately undocumented — they tell you not to mess with trying to read/write the file yourself, but instead do everything through the SDK, which changes whenever (when FBX is called an “industry standard”, that just means Autodesk, kind of like the Borg was industry standard). So I had to make sure I was writing a version of the FBX mystery meat that Unity could read, since it was running on the previous version of the SDK, and that involved some weird string matching in the writer initialization (as I recall, there’s no way to say “I just want that one”).\nThe irony is that the game files I was converting to FBX were actually in a proprietary, but obsolete, format that had the same model as FBX — undocumented format, always use the SDK. Because the vendor will always be around, right?\nLosing the Source Code # Not to fear, I didn’t lose the source code! At least, not the original source code. And I’ve got all the Unity projects also hosted offset in version control. No, the stuff I lost was the jury-rigged FBX export I wedged into the original game. I probably wasn’t careful about saving it because I figured I’d never need to run it again. In fact, I was so sick of repeatedly exporting to FBX, importing into Unity, realizing something was off then tweaking and repeating the export, that I left some details up to manual fixes inside Unity.\nFor example, the texture coordinates were coming out flipped from the way Unity was interpreting them so all the textures were displayed upside down. That’s something I should have fixed in the exporter, but I had reached the point where I couldn’t stand it anymore and just manually adjusted them within the Unity Editor. But that means I’d have to do it every time I reexported. However, one PC crash and a few years later, when I thought about adding some optimizations to the export (e.g. the camera is always facing one direction as you bowl, so every static backfacing poly in the scene could be removed) I was faced with the prospect of reimplementing the whole thing. So that’s it, as long as Unity can read FBX files from 2007, the pipeline is closed.\nToo Little Marketing # I think the HyperBowl Facebook page looks good and has a decent number of followers, and I’m doing OK in general on twitter (though that’s not HyperBowl-specific). But my other attempts at marketing have been at best sporadic. Theoretically, I’m willing to put spend on marketing when I have the time and income, but that’s like saying I’ll do it when I’m unemployed yet making money.\nWhen I’m between paying gigs, I do at least put more effort into marketing, and I think it does make a difference in sales. Putting out promo codes, frequent updates (which is a way of getting more promo codes), Facebook posts, localization (China sales are up), contacting reviewers and bloggers, that all seems to help, although with the market getting more and more crowded, everything makes less and less of a difference. To be honest, my all-time revenue graph is more or less bell shaped, with the peak occurring a couple of Christmases ago.\nA note about piracy. For a while, someone was cracking my iOS app within hours of every update. I find that obnoxious, and contrary to what some piracy defenders say, it didn’t seem to help sales. But it didn’t seem to hurt sales, either. On the other hand, in the past few months the number of cracked Android APKs have proliferated (not just download sites but also activations, dutifully tracked by Unity Analytics), and during the same period my Google Play sales have dropped dramatically. Probably unrelated, but hmm…\nToo Little Monetization # When I started making apps, I didn’t really consider incorporating ads, partly because there wasn’t a convenient way to try out an ad service without writing your own Unity plugin, and partly because I don’t like seeing ads, myself. So for every app, I charged or left it free. But one day I saw that prime31 had introduced an iAd plugin, so I tried it out on my trustworthy testbed app, Fugu Bowl, just so I would know how to set up iAds. Several months later, I checked my ad revenue and realized I was making some money. “Ads for everyone!” I proclaimed.\nUnity now includes API access to iAds, so the prime31 plugin is not necessary (I keep it around as a fallback just in case — for a while, the early Unity iAd implementation was not as polished as the prime31 plugin). The generalized Unity ad API doesn’t include AdMob or anything else on Android, so there I’m still using a prime31 plugin. I might try Unity Ads at some point, or Chartboost (I’ve received some developer recommendations), or maybe I’ll drag myself onto the freemium bandwagon and implement in-app purchases. (“IAP for everyone” I will proclaim)\nToo Much Monetization # By too much monetization, I don’t mean too much money. I wish. Rather, one of my few real regrets is wasting time trying out various mobile ad networks just because someone emailed me. First of all, it’s just annoying that the account rep always want you to set up a skype chat instead of just providing a documented SDK. And then it’s laborious explaining to the rep later, slowly, that the reason you’re no longer using it is that it earns a pittance or it doesn’t work the way you want (or at all).\nI realize I may not be getting the best revenue from my current ad networks (iAd and AdMob) but my current setup is convenient and reliable, and the time spent switching back and forth between other ad networks and plugins is better spent trying to attain Flappy Bird numbers.\nToo Little # This may seem like just a technical detail, but after importing all the lanes, I discovered all of the geometry was smaller than expected by a factor of 100, assuming one distance unit in Unity should represent one meter (and it does, if you go by the default physics settings, lighting distances, camera scripts and so on). At first I went with my usual theory, that the artists screwed up the original source assets, and I went about adjusting the physics parameters, lighting and culling distances, camera scripts and so on. After all, theoretically it’s unitless and arbitrary, so this should work. What could go wrong?\nWell, physics went wrong. The game was playable and looked right, the pins fell at more or less the right speed, but they didn’t always fall — sometimes they just kind of tilted. There was other weird stuff, all probably due to numerical precision issues. Or maybe I just did something wrong. But finally, I realized that Unity has an import scale factor that defaults to 0.01 so that it just works with the conventional use of centimeters in Maya, and when I reimported everything with no scaling and set all the other values back the way they were, Earth physics was back (I always wanted to add a moon gravity lane, though).\nLessons Learned # This just goes to show that you can learn a lot about a game engine with small projects, and that’s probably the best way to start, but to really learn a game engine (and game development, for that matter), you need to create a large project that exercises a lot of features all together. In fact, I was invited by Apress a couple of years ago to write a Unity iOS book, and my first inclination was to make a whole bunch of small examples that demonstrated different features (touch input, accelerometer…) But trying to plan out the structure of the book, I ended up making another simple bowling game (sort of a Fugu Bowl with HyperBowl aspirations) so you can see how it all comes together.\nThe cross-platform support of Unity is still paying off. And I’m still paying for it — those Pro licenses for each platform does add up — but if I had tried a straight port of the original HyperBowl code, I’d probably still be just working on the iOS version. And while I didn’t get sidetracked into Blackberry or Windows Phone, a Wii U version may be on the horizon this year…stay tuned.\n","externalUrl":null,"permalink":"/books/techsoft/hyperbowl/","section":"Books","summary":"Game Data # Publisher: Technicat, LLC (Fugu Games)\nRelease Date: July 2009 (App Store) and May 2011 (Google Play)\n","title":"HyperBowl on the Small Screen","type":"books"},{"content":"As a software engineer, you might want any number of things out of your job - a steady paycheck, the opportunity to work on interesting projects, a springboard to the next better job, or maybe you just like hanging out with other programmers. But by \u0026ldquo;effective\u0026rdquo;, I mean the ability to complete projects in a timely manner with the expected quality. After working on dozens of software releases, I believe the following practices will bring you there, and while they may involve sticking your neck out, I\u0026rsquo;d like to think they will also advance your professional reputation, career longevity, and personal satisfaction.\nUnderstand Your Requirements # The first step in becoming an effective programmer is to ensure that you are spending your time wisely. And there is no greater waste of time than in working on something that is not useful or never shipped.\nBuild Early # Get a demonstrable system working as early as possible. This means establishing the interface first, whether it\u0026rsquo;s an API or user interface, and stubbing the encapsulated functionality as necessary. This allows your \u0026ldquo;customers\u0026rdquo; to check it out, by exercising the user interface or writing code to the API, and any inconsistencies or omissions in the initial spec can be detected early. Chances are, you will notice problems or potential improvements even before releasing this first deliverable.\nThere is a classical school of thought that believes if you design everything up front, then all you have to do is write the code and you\u0026rsquo;re done. That works great if you\u0026rsquo;ve done the exact same project before. Otherwise, it\u0026rsquo;s more likely you\u0026rsquo;ll run into a point where you\u0026rsquo;re just guessing or operating on questionable assumptions.\nUpon joining an early-stage wireless internet startup, I found myself in two months of design meetings for a wireless portal and gateway due to launch in six months. Eventually we got tired of meeting and finally started coding. Within two weeks, my part of the project had no resemblance to the original design, and the first wireless connection test two months later revealed a fundamental misunderstanding of the wireless protocol. This is not to say that design is unnecessary. But after a certain point, design is just speculation. Design should be validated with implementation, and better to do that early and continuously than late and, well, too late.\nEven if the original design is sufficient, once you have something you can tweak, you can improve upon it. Hardware products (who designed this VCR?), buildings, and large-scale software projects suffer from interfaces that were frozen in \u0026ldquo;preproduction\u0026rdquo;, but with software, you have an opportunity early in the project to refine your understanding of the requirements and produce a suitable interface. But it must be done early.\nGetting something ready early is also good for your occupational well-being. Your boss will appreciate seeing evidence that something is actually getting done and having something available to demo. On the other hand, a drawn out period with nothing to show is a recipe for anxious management.\nDeliver Often # Once you have something working, don\u0026rsquo;t just leave it as a \u0026ldquo;proof of concept\u0026rdquo;. Let people play with it, see their reactions, and let this guide and prioritize your development. There is no substitute for watching how people use your software. Customer questionnaires and focus studies might provide some useful input but run the risk of transferring feature and design decisions from the developer to the customer.\nIn particular get the software into the hands of the QA staff as soon as possible and feed them regular builds, preferably at scheduled intervals. Having them test automated daily builds is ideal, but even a weekly build is pretty good. This will help them feel involved in the full life-cycle of the project and they should be best-trained at identifying and reporting problems. The highest priority should be given to issues that prevent them from using the product, e.g. crashes or dead-end paths - you want them to cover as much as possible as soon as possible and get a feel for the whole product so design issues can be identified early.\nAt a small 3D graphics software vendor, I was put in charge of porting the flagship product from SGI workstations to Windows NT. After six months, the port was so incomplete and crash-prone that I was reluctant to give the first \u0026ldquo;alpha\u0026rdquo; build our test group. Fortunately, the QA manager insisted, and the resulting bombardment of bug reports forced me to immediately focus on the problems that prevented the testers from exercising the application in any meaningful way. Left to my own devices, I would have worked on what seemed to be the harder and more important core 3D issues, and probably delayed too long on seemingly mundane issues like the user interface, load-save functionality, and compatibility with all the varieties of consumer hardware we were planning to support. Programmers often don\u0026rsquo;t want to release code to testers early - they don\u0026rsquo;t want to hear about a bunch of bugs they already know about, and quite possibly the testers don\u0026rsquo;t want to test something that barely works. But it\u0026rsquo;s the testers\u0026rsquo; job to find these problems and programmers need to realize bug reports are a good thing, if they arrive early enough.\nKeep It Real # Keep your software running in as close to a shipping state as possible. You never know when you\u0026rsquo;ll have to demo the system, send out an evaluation copy, or even deliver (\u0026ldquo;OK, time to wrap things up!\u0026rdquo;)\nUse Real Data # If you just test with sample data, that big iceberg of real data out there is going to sink your program.\nOne of the leading semiconductor fabs evaluated a supply chain management product I was working on. After crunching out a milestone delivery to them, we got word back that the first batch of data they fed it from their own operations was still processing - for two days. I sympathized with the lead programmer, who had to dig down and emergency-optimized everything he could for two weeks with both management and client breathing down his neck. I\u0026rsquo;m just glad it wasn\u0026rsquo;t me on the line. Use Real Builds # Remember the development build on your machine is not the real build.\nOn a game development project where I worked on the user interface, I got intermittent reports from QA that some colors were not correct. Eventually, I realized the problem only showed up in release builds and another programmer used the special console debugging hardware to track down the bug. Which turned out to be a silly mistake I\u0026rsquo;d made two months previous, failing to specify an initial color value in a few cases. The debug build always selected a specific default value, while the release build optimized that away and the result was less determinate. If I\u0026rsquo;d made a point of running the release build frequently, I would have spotted my mistake immediately, instead of losing it in the sands of time. Merge Often # Don\u0026rsquo;t procrastinate on merging your code with the main code base - the longer you wait, the harder it gets.\nI worked with a programmer who \u0026ldquo;couldn\u0026rsquo;t be bothered with\u0026rdquo; all the new code and data changes that showed up in the repository every day. And certainly, daily merges did take up some time for all the other programmers, and this programmer was able to run some impressive standalone demos with a snapshot of the code and data. But every time we had a milestone delivery, it took days to get the isolated code reattached to the current codebase again, sometimes compromising the milestone delivery and risking the funding for the entire project. Keeping your code out of the official build means that programmers cannot evaluate your code and testers cannot spot bugs early. Maybe you don\u0026rsquo;t want people picking on your code or bugs, but it\u0026rsquo;s better to identify those issues early than later - suck it up.\nUnderstand Your Code # Life is full of wonderful mysteries, but your code is not the place for them. You don\u0026rsquo;t have to know how your car works - if the engine starts making strange noises, you drop it off the mechanic. When it comes to your code, if you don\u0026rsquo;t understand how it works, or doesn\u0026rsquo;t work, no one will.\nCode with Style # My childhood piano teacher once commented to me, \u0026ldquo;Your sister has a good sense of timing, and your brother has a good feel of the keyboard.\u0026rdquo; Then he paused. \u0026ldquo;You, uh, you work hard.\u0026rdquo;\nProgramming is one of those things that a lot of people are more or less competent at, but some in particular have a flair for it. I\u0026rsquo;m a lousy piano player despite years of lessons, and I\u0026rsquo;m a mediocre basketball player although I enjoy playing it immensely. But I do like to think I have a flair for programming and writing. And not surprisingly, I think good programming is like good writing. Both prose and code are textual, have grammar, syntax, spelling and semantics and spelling. For most coders and writers, this is enough, but the best writers and coders have an esthetic and their work features structure and style that can often be identified with the author.\nMany Windows programmers wonder why grumpy old Unix/Mac/Amiga/Lisp programmers rail against Win32/MFC/.NET, but if all the API\u0026rsquo;s you\u0026rsquo;ve seen are from Microsoft, you probably don\u0026rsquo;t know there\u0026rsquo;s anything better.\nPerhaps not everyone is capable of writing stylish code - I\u0026rsquo;ve heard it said that good object-oriented programmers, in particular, are born and not made. But like fine music, wine, and literature, you can learn to appreciate good code.\nCut-and-Paste # The opposite of stylish programming is cut-and-paste. Grab some code from somewhere that is supposed to do something like what you want, tweak it until it sort of works, stir, repeat, and voila, you have the software equivalent of mystery meat.\nA few months after leaving one company, a former coworker emailed me a single function consisting of ten pages of cut-and-paste code and asked why it wasn\u0026rsquo;t working. I could have very well asked why it should work at all. If you can\u0026rsquo;t explain how your own code is supposed to work, how can you expect anyone to help you with it? (He has since moved on to a management position at Microsoft) I\u0026rsquo;ve even had trouble diagnosing my own code that was cut-and-pasted from sample code. It\u0026rsquo;s a reasonable way to start new code, but you can\u0026rsquo;t just leave it alone when it seems to work - you have to go back and make sure you understand it line by line and clean it up for your own purposes.\nKeep it Clean # The key to keeping your house/condo/apartment clean is to spend a little time cleaning it every day, or at least every week. If you wait until your abode is an unsightly mess, it\u0026rsquo;s just too much damn trouble to clean it all up and you end up just doing a halfhearted job. Or your hire a cleaning service.\nAssuming you don\u0026rsquo;t have the luxury of hiring someone to come in and clean up your code every week, you should periodically inspect your code, sweep up accumulated hard-coded numbers, outdated comments, misleading function names, or you\u0026rsquo;ll inevitably end up with uninhabitable code that\u0026rsquo;s embarrassing to show anyone else. And if you\u0026rsquo;re not embarrassed, well, you should be.\nOne programmer I supervised kept reporting to me that her code was \u0026ldquo;done\u0026rdquo;. This is what management normally likes to hear, but it drives me crazy. Code is never done - you have to debug it, maintain it, evolve it until it\u0026rsquo;s put out to pasture. Questions? Comments? # Some like to think of programming as a craft. Others, engineering. More often than not, it\u0026rsquo;s archaeology. You dig through sediments of code and wonder what purpose all these strange artifacts served. Do future generations a favor and leave some clues.\nI asked the aforementioned engineer whose code was \u0026ldquo;done\u0026rdquo; to add comments. The result, a function named GetData was prefaced by the comment \u0026ldquo;Gets data.\u0026rdquo; That\u0026rsquo;s not just useless - it\u0026rsquo;s insulting. What data? (factory automation schedules) In what format? (a proprietary XML format) From where? (an in-house server, using TCP/IP) Not to mention little details like what happens when the server is unavailable or the transmission is broken. Document your code as if someone else might have to take it over at any moment and know what to do with it. That person might actually be you - how often have you had to revisit your own code and thought to yourself, what was I trying to do here?\nOn a contract with a previous employer, I was asked to look over a piece of code that no one else had time to attend to. At first, I thought it was a mess and didn\u0026rsquo;t know what was going on in there. Then I gradually figured out what the code was doing, and I grudgingly admitted the code wasn\u0026rsquo;t too bad. And then I eventually realized that I had written the code two years ago. Note to self: need more comments. With that in mind, annotate your code as you write it, instead of waiting for a convenient cleanup phase in \u0026ldquo;post\u0026rdquo; - annotating as you code can even clarify your thoughts while you\u0026rsquo;re programming. You can be your own pair-programming buddy.\nAs a bonus, these days you can generate nice HTML or otherwise-formatted documentation from source code comments, using javadoc, doxygen, whatever. Ideally, the doc-generation is part of your nightly build and available via your intranet.\nFull Warning # Ignore compiler and runtime warnings at your own peril. They are called \u0026ldquo;warnings\u0026rdquo; for a reason.\nI shipped one Unix-based application that had a problem linking some functions successfully - we worked around it by relinking those functions at runtime. When we performed a clean rebuild six months later for the next release, it was revealed that we had turned off linker warnings which would have alerted us of a known linker bug. In our defense, we had swept the linker problems under the carpet at the Unix vendor\u0026rsquo;s suggestion, (thanks, SGI!) but it turned out we could get the link to work just by reordering our libraries. Crank up the warning levels on your compilers, sprinkle your code with assertions, and log the build and test-time warnings. Better yet, include a count of those warnings in your build metrics so you know if you\u0026rsquo;re dealing with them or letting them accumulate.\nOptimal Programming # Code with Purpose # On the other extreme from cut-and-pasters are those who change code just to make it look prettier (at least to them). While it\u0026rsquo;s laudable to have a programming esthetic, it\u0026rsquo;s a waste of time (and a useless risk) to change code just so it looks better to you. It\u0026rsquo;s aggressively annoying to go through and change code that other people have written just so it looks better to you.\nA fastidious coworker of mine went through our codebase and removed all the expletives. Probably no one would have complained if he had just cleaned up the code written by the entry level employees, but the expletives belonged to the technical lead of our group who was also one of the few distinguished Fellows at the company. Do No Harm # \u0026ldquo;Refactoring\u0026rdquo; is all the rage, now, but programmers often take it to mean any code cleanup or redesign. The trick is in reorganizing code for the better without breaking anything. If you break existing functionality in the name of progress, you\u0026rsquo;re sending one of two messages: 1) your time is more important than everyone else\u0026rsquo;s, or 2) you\u0026rsquo;re incapable of touching code without breaking it.\nI had one particularly contentious coworker who decided to reimplement the parser in our system but left the code in an unbuildable state by everyone else. I asked him to revert his changes and then found the code was buildable but not runnable - asked about it, he replied that he removed the parser entirely \u0026ldquo;per your request\u0026rdquo;. Not a team player. Keeping the code functioning takes some patience and extra work - you have to be diligent about regression-testing your work and chances are you\u0026rsquo;ll need to keep old code and interfaces around for a while as you migrate functionality to your new code. But for everyone to work with the same codebase, that\u0026rsquo;s what you have to do.\nFind the Bottleneck # People always talk about \u0026ldquo;optimization\u0026rdquo;, but that isn\u0026rsquo;t really a correct word. We\u0026rsquo;re rarely shooting for the optimum - instead, we make improvements and tradeoffs to achieve good-enough performance.\nI was asked in a phone interview with Google how I would search for a number in an array of ordered numbers. Obviously, the questioner was asking for a CS 101 answer - binary search. But in real life, I would probably do the \u0026ldquo;wrong\u0026rdquo; thing - search the array from beginning to end. There\u0026rsquo;s no point in taking twice the time to write twice as much code that has to be maintained and debugged if the application performance is good enough, and in particular if that piece of code is not the bottleneck in the application. (And I seriously doubt you\u0026rsquo;d have that data laid out linearly in a fixed array like that if it was the bottleneck) If you do need to optimize for speed or space in you application, attacking anything other than the bottleneck is a waste of time.\nManage Thyself # You probably have a lot of complaints about your boss being a lousy manager, and you\u0026rsquo;re probably right. So you have to be your own manager. Even if you have a decent boss, he\u0026rsquo;s not going to stand behind you telling you what to type and how fast (although I\u0026rsquo;m sure many would like to).\nAre We There, Yet? # Programmers are notoriously inadequate at providing useful schedule estimates. I think this is a bad rap, since management, left to their own devices, often make even worse predictions, and unwelcome news from engineers is often ignored. (A common theme in any engineering disaster). But still, awareness of the schedule is critical to actually getting the project done on time.\nOn one commercial software project, some of my coworkers were blissfully unaware of the product release date - one inquired whether it had been released already, another was surprised to find it was going out in a few days. The worst, and most common, schedule estimate that a programmer can give is \u0026ldquo;it should just take a couple of days\u0026rdquo;. Every time I hear that, even from my own mouth, I wince.\nThe president of a graphics software company really wanted support for VRML (at the time it was the Next Big Thing) included in the product we were releasing in two months. He probably figured (correctly) that I would resist starting a new feature, so he went to another engineer and got the answer he wanted: \u0026ldquo;a couple of days\u0026rdquo;. Two days later, I told the president we-just-wasted-two-days-of-his-time-and-mine-while-there-are-two-hundred-high-priority-bugs-to-fix, which he found to be a persuasive argument. (postscript: VRML didn\u0026rsquo;t exactly take off like gangbusters) And then there are programmers who are unable to come up with time estimates at all. But there\u0026rsquo;s no need to get thrown off by the fuzzy nature of the request - it is an estimate after all, and in fact you should avoid using formulas. If you\u0026rsquo;re an experienced engineer, you know how long comparable tasks have taken you before, and if you\u0026rsquo;re not experienced, you can ask someone who is.\n-s A smart friend of mine who was often assigned to developing experimental prototypes asked me, \u0026ldquo;how can you schedule research\u0026rdquo;. I think it was a rhetorical question, but even pure researchers have schedules. Someone is paying them and expects results, even if it\u0026rsquo;s a number of demos or published papers in a certain timespan. And if you really don\u0026rsquo;t have the foggiest idea how long something will take, then you\u0026rsquo;re the wrong person for the task.\nSometimes programmers are reluctant to commit to a schedule because they\u0026rsquo;re afraid of the accountability. It is true, in this imperfect world, managers will try to bargain you down on schedules, political factions may saddle you with tough or unrealistic schedules in the hopes that you will fail, and it is a sadly common story that after you commit to a schedule, you don\u0026rsquo;t get everything you need.\nI had one boss who after asking for an estimated completion time would say, \u0026ldquo;do you promise?\u0026rdquo; But ask for a commitment on the required hardware and other dependencies, and it was \u0026ldquo;I\u0026rsquo;ll try.\u0026rdquo; All I can say is, stick to your guns and give a realistic prediction. Any concessions should be based on pragmatic tradeoffs between features and resources. Be clear about the assumptions, dependencies and resources on which the schedule is based, and get it written down somewhere so you can jog defective memories later.\nPlan Your Progress # You wouldn\u0026rsquo;t just hop into your car before deciding where you want to go, right? And probably you have a route in mind before you start driving, too. Similarly, before you sit down at our computer, you should know what you want to accomplish that day and have some idea how.\nDistractions will come up day-to-day, so you won\u0026rsquo;t always be able to accomplish what you want. And contrary to those who treat software engineering groups as vending machines (they would probably shake us vigorously if they could) some tasks take more than a day. So think about what you want to accomplish by Friday, and if you do, then you can enjoy the weekend that much more.\nContinuous Education # A corporate soccer team member once asked me, as we were lacing up our cleats, \u0026ldquo;what\u0026rsquo;s the secret to C programming?\u0026rdquo; If there was such a secret, I\u0026rsquo;d be hawking it on late night TV along with ab machines and how to get rich in real estate. Sorry, there\u0026rsquo;s no shortcut - you have to learn and practice and make some mistakes. And you don\u0026rsquo;t necessarily have to rely on corporate training or going back to school - there are plenty of (inter)national and local professional groups, books, and of course, the Internet.\nIt\u0026rsquo;s Science # It\u0026rsquo;s called \u0026ldquo;computer science\u0026rdquo; for a reason. It\u0026rsquo;s easy (maybe too easy) for anyone to to start programming, without a formal computer science education. In particular, those from other engineering and science disciplines can pick up programming quickly and make a good living. But to effectively tackle non-trivial tasks, you need to know the inherent capabilities and limitations of software and recognize prior work, so you don\u0026rsquo;t waste time reinventing the wheel, badly. You don\u0026rsquo;t have to know everything under the sun, but you should have at least a cursory familiarity with many areas and be prepared to do some additional research as necessary.\nFor example, anyone who creates a new file format should know something about compilers. I don\u0026rsquo;t mean all the code-generation optimizations like loop unrolling, but the basic issues and various phases of compilation and most of all the importance of specifying the tokenization and grammar. Nowadays, most people by default will use XML, and that\u0026rsquo;s a good thing, but before then it was typical to cobble up some text format, point to some generated sample files as documentation, and then everyone else who wrote another parser would cobble something up that would read in some files but not all. In the problematic cases then you could point fingers either way - either the reader is bad or the writer is bad. Whichever product is more popular wins.\nOne of my pet peeves with the 3D graphics industry is the plethora of ill-defined file formats. When I implemented an OBJ file parser for a 3D content creation product, each exporting product that I tested against generated markedly different files, using different whitespace and newline conventions, for example. In refreshing contrast, a coworker of mine fresh out of school designed a new game interchange format using a grammar and lexer specification. (These days, it\u0026rsquo;s not much of an issue anymore - most new graphics file formats seem to be based on XML.) And if anything differentiates programmers who can just put together simple scripts and user interfaces and those who can tackle real problems, it\u0026rsquo;s an understanding of computational complexity, i.e. how algorithms scale with the size of the problem. Every programmer should know basic complexity terminology and have a general knowledge of the complexity of common problems.\nMy first job was in computer-aided semiconductor design, which has a lot scalability issues, including some NP-complete (essentially intractable) problems. But some of the engineers would run around excitedly saying \u0026ldquo;it\u0026rsquo;s the traveling salesman problem!\u0026rdquo; every time they saw a problem that couldn\u0026rsquo;t be solved in linear time, and in other cases we boasted of \u0026ldquo;linear-time\u0026rdquo; algorithms which probably meant linear-time most-of-the-time. Or some of the time. Free Beer, Free Speech, Free Software # OK, there\u0026rsquo;s no free beer, but this is a good time to be a programmer (well, recession and outsourcing controversy notwithstanding) - just about everything you need is on the Internet tutorials, discussion lists, and free software. All you need is the hardware and a broadband connection.\nR-E-S-P-E-C-T # One requirement for being an effective software engineer is to be taken seriously. You need to have the respect of your peers and managers, at least for your technical capabilities, to have control over your own work and influence over others.\nThere is Such a Thing as a Stupid Question # Really, there are lots of stupid questions. Asking intelligent questions that enhance others\u0026rsquo; respect for you is a professional skill. A good question that exposes unresolved issues tells people that you know your stuff and you\u0026rsquo;re sharp enough to catch all the implications. Asking for clarification about a specification shows you know how to find and read the spec and your ability to detect ambiguities.\nIf you don\u0026rsquo;t get any answers to your question, chances are there\u0026rsquo;s something wrong with the question, so don\u0026rsquo;t just repeat it. Ask the question differently, with more specifics, or more background. If you\u0026rsquo;ve been on the other end of a technical support line or even just spent time on discussion lists answering newbie questions, you\u0026rsquo;ll appreciate the consideration.\nI pride myself on cultivating good relations with developer support staff by submitting elaborate bug reports and precise questions. But I do remember one lapse where I tossed out something along the lines of \u0026ldquo;What\u0026rsquo;s the deal with that issue that came up several weeks ago?\u0026rdquo; You can imagine the prickly response - \u0026ldquo;What do you mean by what\u0026rsquo;s the deal, and what issue are you talking about?\u0026rdquo; It doesn\u0026rsquo;t pay to be rude, especially if you\u0026rsquo;re essentially asking for free tutoring or consulting on a discussion list. Even if you\u0026rsquo;re asking under the auspices of a support contract, irritating your support contact isn\u0026rsquo;t going to help you in the long term.\nI used to take pains to explain to belligerent newbies why their questions didn\u0026rsquo;t make sense or what they were fundamentally doing wrong. Now, the bozo filter kicks in quickly - one \u0026ldquo;All I want to know is\u0026hellip;.\u0026rdquo;, and they\u0026rsquo;re ignored. Let everyone know that you read the documentation and googled the subject. Besides avoiding the inevitable \u0026ldquo;RTFM\u0026rdquo; and \u0026ldquo;Google is your friend\u0026rdquo; responses, this shows you\u0026rsquo;ve done your homework and those who want to be of assistance don\u0026rsquo;t have to search through the same resources. If you do expect them to search through those resources for you, then you\u0026rsquo;re saying your time is more important than theirs, and you are just one more perpetrator of the \u0026ldquo;tragedy of the commons\u0026rdquo;.\nThere is Such a Thing as a Stupid Answer # If you\u0026rsquo;re going to act like you know what you\u0026rsquo;re talking about, you really better know what you\u0026rsquo;re talking about. Engineers sometimes communicate more to show off their own knowledge rather than to inform (although, if you can do both, kudos to you). This is often inflicted in employment interviews, under the guise of \u0026ldquo;finding out how you think\u0026rdquo; the candidate is asked inane puzzle questions. This can backfire, though, if the candidate has any self respect.\nOne CTO interviewed me over the phone by asking me to sketch out the resulting stack frame from a C++ compilation and then report the result back to him verbally. We went through it step by step and every time I gave him a correct answer he asked me to give a wrong answer instead so we could go over why that choice wouldn\u0026rsquo;t work. I couldn\u0026rsquo;t tell if we were trying to demonstrate how smart I was or how smart he was. There\u0026rsquo;s also the blame game. As an engineer, you can\u0026rsquo;t rely on your money and looks - all you\u0026rsquo;ve got is your credibility. So if you make a mistake - \u0026lsquo;fess up.\nI had the privilege of working with a senior engineer who was never wrong. When his Java code was crashing on multiprocessor systems, it was Sun\u0026rsquo;s bug. When I took over the code and pointed out the UI code was not supposed to run in multiple threads, he insisted there was only one thread. When I listed the seven threads (that I could find) in the code, he agreed I shouldn\u0026rsquo;t have all those threads and I\u0026rsquo;d better fix it. He programmed in that fashion too - he didn\u0026rsquo;t fix any bugs, he just covered them up with more code. Finally, a bit of time-saving advice: Don\u0026rsquo;t get dragged into stupid arguments. Stupidity is contagious.\n","externalUrl":null,"permalink":"/books/techsoft/sevenhabits/","section":"Books","summary":"As a software engineer, you might want any number of things out of your job - a steady paycheck, the opportunity to work on interesting projects, a springboard to the next better job, or maybe you just like hanging out with other programmers. But by “effective”, I mean the ability to complete projects in a timely manner with the expected quality. After working on dozens of software releases, I believe the following practices will bring you there, and while they may involve sticking your neck out, I’d like to think they will also advance your professional reputation, career longevity, and personal satisfaction.\n","title":"Seven Habits of Highly Effective Programmers","type":"books"},{"content":"The definition of insanity is doing the same thing over and over and expecting different results\nKnowledge # Know Thyself # Self-awareness isn’t a common trait among self-styled entrepeneurs, but a little introspection (not to be confused with self-absorption) can save you a lot of trouble.\nI’ve seen drama queens who had to be the center of attention (regaling employees with personal stories for hours at a time) and seemed to get bored if there wasn’t a big fight or emergency going on. And I’ve seen control freaks micromanage all aspects of their businesses (to the point of giving employees pop quizzes and approving individual secretarial office supply purchases). Which is fine — passive, unambitious people need jobs, too, and there’s plenty of room for small companies specializing in services and small projects. But micromanagement doesn’t scale, talented employees don’t like to be treated like children, and a large company has to run like a machine, not a series of bar fights. So when these companies succumbed to grand ambitions of growth and innovation, the result wasn’t pretty.\nChanging your personality is as likely as changing your shoe size. So pick a company that fits.\nKnow What You’ll Do # The glamorous stories about startups include tales of persistence, passion and nights spent on the office couch. But that isn’t always necessary if you just want to be your own boss.\nFrom experience, I know I can maintain a comfortable lifestyle working on one or two contracts from referrals every year and take it easy between contracts. And I know other self-employed developers who play a lot of golf, spend a lot of quality time with their families, and don’t work weekends.\nBut that’s not going to scale into anything big or popular. Be realistic about how much your ambitions will match your own follow-through.\nI know of one outfit that put a customer forum on their web site and didn’t monitor it for weeks at a time. After seeing it filled with spam and customer complaints of neglect (“treated like a two-dollar whore” was one phrase), they took it down. Another startup asked me to introduce them to high-level game industry contacts to sell their product, but never got around to that little detail of creating the product.\nYou should also be aware of what you’re willing to do. And what you’re not willing to do.\nKnow What You Want # Besides knowing who you are, know what you’re really trying to achieve. There’s the mission statement you put in your business plan to impress VC’s, and then there is your real mission. Whether it be getting rich, getting famous, showing your dad you really amounted to something, or getting even with all those people who did you wrong at your last job, you should know, as they say in acting classes, “what’s your motivation?”\nI was recruited by the president of a game development company who told me she wanted to make a “great” game. But she spent more time talking about famous and rich personalities in the industry than about notable game designers or learning about game design. After lots of schmoozing and mediocre development with junior designers who had to clock in like Walmart employees, the result was, mediocre. And no one got rich and famous.\nIf you know what you can do and what you want to do, maybe your method will match your ambition.\nKnow What You Know # It’s also important for the company as a whole to stick with what you know. It’s hard enough to set up a company, find good people, and raise money. Having to learn an unfamiliar domain and gain connections and credibility in that domain will make success nearly impossible.\nThese days, a lot of people want to be Steve Jobs. I was brought into one successful software company that was taken over by a group who had made their fortunes in sales and services, and in short order they managed to run it into the ground. Status meetings consisted of “when can I sell this?” The delivery process amounted to “you’re giving me a build today.” A process perhaps fit for a burger joint (“you want fries with that build?”), but not for software development.\nA significant successful project requires all kinds of people — and chances are, you’re not all kinds of people. If you’re a technology guy and not a deal-maker, you need to bring in or partner with people who can bring in the deals. If you’re a company builder and investment getter and not a technology guy, you probably shouldn’t be architecting a new software product. Figure out the critical functions that should be your focus, and do no harm in the other areas.\nExperience # Learn From It # It’s easy to Monday morning quarterback a failed startup. I’ve often heard the query “What were they thinking?”, but sometimes this is not really a fair question. The reasoning may have seemed sound at the time — certainly if someone provided funding, then the idea must not have been an obviously terrible one.\nThe first startup I joined had a pretty reasonable-sounding plan: sell a full-featured 3D graphics content creation system to game developers, based largely on technical suitability and underpricing the twenty-thousand dollar per unit competing products. Who would’ve known that Autodesk would soon enter the market with a vastly cheaper product and established presence in the game market? I didn’t.\nBeware the entrepreneur who only knows (or remembers) success and thinks he has the Midas touch. success with a startup is largely the luck of the draw. Failure, on the other hand, is not a bad thing — you can learn from failure. But some entrepreneurs are repeat offenders.\nI worked for one CTO who exhibited many admirable traits, including loyalty — but to a fault. I was a beneficiary (and much appreciated it), but one of his golden boys returned the favor by alienating the rest of the staff and prompting several senior engineers to leave. (I was promoted quickly in that job) The attrition problem was eventually “solved” by putting the programmer in charge of another group, essentially transferring the problem and giving him a promotion to boot. After the startup was ignominiously absorbed into an acquiring company and quietly extinguished, the CTO chose to start another company with, guess who?\nShow me someone who’s running a startup, and I’ll show you someone with an overabundance of self-confidence and/or someone who’s tired of working for other people. Either way, recognition of past mistakes (unless they’re made by others) is often not part of the package. But if you’re going to go through the school of hard knocks, you might as well learn something.\nUse It # Especially in a startup, you need to take advantage of your staff’s existing expertise. Surprisingly, small companies can be as clueless as large ones at recognizing individual assets.\nDespite mentioning repeatedly that I’d worked on military visual simulation projects, the computer graphics company I joined never bothered to consult me when they tried to get into that market. For a big corporation, that’s somewhat understandable (although such a corporation should have the resources to set up an employee database to check for in-house talent). For a startup in which budgeting and time-to-market is crucial, there’s no excuse — just send email to your staff. How hard is that?\nI spent interminably painful weekly meetings in another startup in which the CEO would raptly listen to the CTO expound on topics he knew nothing about. I’m certain better answers about machine vision and image processing, for example, could have been obtained from the engineer who did his PhD in machine vision. Given that I’d just left a wireless Internet company, it would have made sense to ask me about wireless devices and operating web servers. (They almost tried to invent their own secure communciation with web servers, not realizing there is a standard used for e-commerce).\nEven if you stick to your core competence, you’re going to run into unfamiliar customers and application domains. Before running blindly into them, query your staff — “Does anyone know anything about this/them?”\nFocus # Be Cheap # There used to be a saying that Silicon Valley high-tech startups would decline once they moved into new glamorous digs. That saying referred to high-profile companies like Silicon Graphics, but I’ve seen this happen even in early-stage startups.\nWhen I joined a San Francisco wireless internet startup that had just received its Series A financing, they had just moved out of one of the founders’ homes and into a moderate-sized office in the Financial District. In three months, they took a long-term lease on half of the top floor (where I had an amazing view of the bay), started purchasing expensive office furniture, and hired three administrative assistants, for a staff totalling no more than twenty. When the next series of financing looked less inevitable, the COO had to clamp down on spending and we ended up with twenty dollar utility tables as desks, to complement our eight-hundred dollar chairs.\nThe next startup I joined was based in artsy Venice, CA. So of course the office upgrade involved a complete redesign by an architect involving curved walls and all attached desks and counters had to have matching custom curves. A Fung-Shui consultant then walked around advising how to maximize the good fortune of the space. To no avail, as there were layoffs within a month after the work was finished.\nDon’t spend money that you don’t already have.\nBut Not Too Cheap # On the other hand, don’t pinch pennies at the expense of getting things done. Starting with people.\nI was offered a bit of sweat equity to take part in a startup but bailed out quickly when I learned everyone else also had a day job. Thus is turned into a fun activity in which participants could play the startup game and brainstorm cool business ideas, instead of an urgent mission. If the founders had paid a full-time contractor they could have had a prototype running in a month instead of blowing at least that much over the course of a year with nothing to show at the end.\nAnd there’s no point in investing in people if you’re not going to give them the tools to get the job done right, and on time.\nOne company president who was ready to hire more engineers to accelerate my project but unwilling to buy more computers. While he wheedled our partners to loan us machines, I had to tussle with the documentation and training groups over the existing workstations.\nThe saying goes, time is money, but in a startup, money buys you time. Don’t waste it.\nStart with One Thing # I’ve never seen a startup that tried to begin with several products at once succeed. You can be GE later, but start with one project.\nOne startup that I consulted for was so optimistic they rented manufacturing space and purchased booth space at CES before they had connected a single wire or written a single line of code. They could have implemented a prototype within a few months just using stock PC hardware, but instead got distracted by different ideas, ranging from robots and educational software to digital content distribution. In the end, they had nothing to show. Another startup that I helped get running also had eyes too big for our stomach. We started developing two rather ambitious computer products and didn’t completely follow through on either.\nAnd Finish It # The easy part of a startup is the starting part. Finishing something is the hardest part. Being the idea guy is fun (consulting is great work if you can get it), but developing, debugging and polishing a product, and then deploying, supporting and maintaining it, is painstaking work that requires tenacity and discipline.\nAt the computer graphics startup I helped form, I don’t know if we could have sold anything, but certainly we could have had a usable product if I’d bothered to implement file save/export capability. As it was, I left it a demo, and one of the few, and regrettable cases, where I can’t point to a finished product. And when we abandoned development, testers who wanted to use our product, couldn’t.\nSo whatever product or service you decide to start out with, get it done before you move onto something else. You need to prove to yourself and to everyone else that you can execute.\nLook Ahead # Growing Pains # My favorite time to join a startup is when they still have less then ten people — at that time, everyone is still focussed on just getting something going and seeing how it turns out. Once the company headcount reaches fifteen, diverging agendas involving turf issues, managerial rivalries, and career ambitions rear their ugly heads.\nMy first job at a startup was chaotic but fun until the headcount reached about twenty — then it seemed everyone had a management title and turf to protect (including me). That was also my first management position, and I was surprised to find that dealing with the engineers in my group was the easy part — dealing with all the other managers was the hard part.\nPlan ahead of time how you’re going to handle the personality conflicts, communication issues, and different requirements of a larger and more normal workforce.\nKeep It Clean # It’s all too common to see stories of malfeasance in large, publicly-traded corporations, and the natural reaction is — how could that happen in a professionally-run company? And why would wealthy executives take the risk of bending the rules here and there?\nWell, that kind of stuff happens all the time in small companies — it just doesn’t get the same headline publicity, unless you watch The People’s Court. Big companies were once small companies, and big-time executives caught with their hands in the cookie jar used to be small-time players looking for an angle.\nBackdating? Clients routinely take their time putting together contracts and then expect me to backdate them. One former employer contacted me years after I left and asked me to sign and backdate an employment agreement to satisfy a potential acquirer. Stock pumping or fake articles using false identities on the Internet? I found a rave review of a mediocre game that I helped develop at a small game company — it was obvious from the crude writing style that it was written by the company president. Tax evasion? Ummm…no comment.\nA lawyer for one of my startups asked us if we wanted to do things “clean” or “dirty” — that shouldn’t even be an option! Don’t get started with bad habits — if you’re considering something that would get you in trouble in a larger company, just don’t do it.\nAnd it’s not just a matter of staying out of jail. A dicey reputation is a lot easier to pick up than to get rid of. Whenever I have a prospective client or vendor, I ask around — sometimes the answer is “run the other way”. And the way you conduct business will become ingrained in your company — that can come back to haunt you.\nOne marketing guy reminded me of the pathological liar character on Saturday Night Live. He prevaricated like other people breath. He told me he was an RAF jet fighter pilot. He informed another coworker that he held a patent for a particular printer technology. He said he needed time off because his wife was pregnant (not). And then he skipped to a direct competitor.\nNo one wants to deal with a company that can’t even trust its own employees.\nHave an Exit Strategy # As in war and casinos, you should have an exit strategy. Are you aiming to cash out via an IPO or acquisition by another company? Do you plan to run this company indefinitely? What are you going to do if the current product or strategy doesn’t work out or if you fail to bring in enough revenue or financing? Change strategy? Declare bankruptcy? You should have a Plan B whether it involves cashing out on top or cutting your losses.\n","externalUrl":null,"permalink":"/books/techsoft/startup/","section":"Books","summary":"The definition of insanity is doing the same thing over and over and expecting different results\nKnowledge # Know Thyself # Self-awareness isn’t a common trait among self-styled entrepeneurs, but a little introspection (not to be confused with self-absorption) can save you a lot of trouble.\n","title":"Startup Without Falling Down","type":"books"},{"content":" Game Data # Publisher: Crave Entertainment and Vivendi Universal\nRelease Date: November 2002 (US) and March 2003 (Europe)\nNumber of Developers: 15\nNumber of Contractors: 2\nLength of Project: 15 months (plus 4 months for European SKU)\nDevelopment Hardware: 1.5GHz PC’s with GeForce 3 video cards running Windows 2000. GameCube devkits, test consoles and disc burners.\nDevelopment Software: Microsoft Visual C++, SN Systems ProDG, Havok, 3D Studio Max, Adobe Photoshop, Adobe Premiere, CoolEdit, cvs.\nProject Size: 360,000 lines of source code. 900MB of compiled data.\nIntroduction # Papaya Studio’s Whirl Tour was released on the Nintendo GameCube and Sony Playstation 2 platforms in November 2002 and March 2003, for North America and Europe, respectively. The game, published by Crave Entertainment and Vivendi Universal, combines a story-based adventure with Tony Hawk style extreme sports play on scooters. Although Whirl Tour is a multi-platform title and the merging of genres poses intriguing game design questions, this article focuses solely on the GameCube development. We started work on the GameCube in July 2001, a few months after the Whirl Tour prototype was completed and running on a PC. Crave received milestone deliveries every two months — the first one involving a GameCube build took place in January 2002. We delivered a build to Nintendo of America (NOA) the following April for concept review, and Crave demoed the game at E3 in May. That summer, Crave forwarded our beta release as a presubmission build to NOA lot check, the group responsible for verifying compliance with Nintendo guidelines. The final submission was approved in September 2002 for the North American release. Over the next few months, under the aegis of Vivendi Universal, we undertook localization for the European release of Whirl Tour, which was submitted to Nintendo of Europe (NOE) and approved in January 2003.\nWhat Went Right # 1. Development Tools # When we started GameCube development, five months before the console showed up on retail shelves, development hardware was scarce and software tools were still under development. But we minimized the impact of this problem by getting started with Nintendo’s software based emulator and obtaining the tools as early as possible and in sufficient quantities.\nThe GameCube emulator provides API-level emulation on a PC. Our team was already working with a PC reference implementation of the game using Visual C++, so while we waited for devkits (programmer version of GameCube hardware that contains twice the usual memory and loads data from the developer’s PC instead of disc), we incorporated code that called the emulated video, graphics, disc and controller API’s. In six weeks, we had a pseudo-GameCube version of our title running, albeit at 5fps.\nWe applied some optimizations to get the game running up to a slightly less painful 10fps, but there was always a nagging suspicion that time spent optimizing with emulator wouldn’t result in anything useful on the real hardware. It was a relief when the first devkit arrived, two months after we started work with the emulator, but it took three months to really get the game built with the compiler (SN Systems ProDG) and running on the hardware. We had to wait for a GameCube port of the physics middleware, and we needed to update our offline data preprocessor to convert the little-endian data produced on the PC into big-endian data readable by the GameCube CPU (a custom PowerPC called Gekko).\nAlthough we had to wait for a port of the physics middleware, it was still important that we received the devkits as soon as we did. Aside from the endian issue, there were a number of subtle differences between the emulator and actual hardware that had to be resolved, including differences between the Visual C++ and ProDG compilers. Likewise, we reaped benefits from obtaining the test consoles and disc-writer as soon as they became available. They arrived shortly before our first schedule GameCube milestone, so we were able to make that delivery to Crave on a test disc instead of a bunch of development files for a devkit.\nBesides getting all the tools as early as possible, we obtained redundant quantities of each. The extra units saved time and provided peace of mind. For example, we ran 24-hour-plus smoke tests concurrently on multiple test consoles — when one console occasionally reported a fatal error and the others didn’t, we concluded it was a hardware problem and didn’t lose sleep over it (while were were losing sleep over other things). And when we had to return devkits for repairs (video card damage) and upgrades (PAL support), we could send back one unit at a time without stalling development. We also ordered hundreds of blank test discs in anticipation of daily burns and crunch time. The last thing we wanted was to miss a deadline for lack of discs.\n2. Developer Support # We were fortunate in receiving thorougly good support from all our licensors and vendors — Havok for our physics middleware, SN Systems for our compiler and IDE, and Nintendo Software Developer Support Group (SDSG) for just about everything else. SDSG resources got us started on a lot of code. Our preliminary implementation of dynamic shadows, using shadow volumes, was guided by an SDSG white paper and refined based on ideas exchanged in the developer newsgroups. The final shadow implementation used shadow maps and was initially based on one of the SDK demos. For a screen snapshot function, we reused the source from a utility posted on the SDSG web site.\nAccess to SDSG was helpful throughout the project but proved especially so during the submission period. Our US submissions were rejected twice by Nintendo lot check, and our publishers wanted fast turnaround for each resubmission. Email and phone queries to SDSG resulted in quick clarification of guideline items and evaluation of proposed solutions. This enabled us to get the first resubmission out in less than a week and the second resubmission out in one day. Combined with lot check turnaround of a few days for each submission, the total time from first submission to final approval was just under a month.\nThe delay in getting a port of the physics middleware could have been serious, but a few weeks after we got our devkits, Havok sent us a linkable library that allowed us to complete a build. When it became apparent that we needed endian-conversion for our collision surfaces, they quickly sent us a run-time solution, and eventually a preprocessor solution that we integrated into our offline data converter. The GameCube port was basically complete in five months and we received incremental updates throughout the rest of the project.\nWe opted for SN Systems ProDG over Metrowerks Codewarrior because we were already using ProDG for the PS2. This minimized compiler differences between the two platforms (we already had differences in code acceptance between Visual C++ and ProDG), but meant starting out with a beta compiler. The few bugs we encountered were addressed quickly by SN Systems support, and the official compiler release was ready a few months before the first GameCube milestone. After that, patches and upgrades were readily available on the SN Systems support site, and they had quick responses to questions sent via email or posted to the gamecube.snsystems newsgroup on the SDSG site.\n3. GameCube Architecture # Another reason we got the game running quickly on the GameCube is the friendliness of the architecture. The graphics hardware (Flipper) supports multiple dynamic lights, multitexturing, mipmapping, blending, and fog, so most of our basic renderer features were easy to implement (though optimization required some work — see What Went Wrong). The GameCube combines a unified memory architecture (UMA) with fast 1T-SRAM, allowing flexibility in managing textures and the video framebuffer.\nThe hardware features a generous 16MB of auxiliary RAM (ARAM). We used half of the ARAM for sound effects — given more time, we would have used the remaining ARAM to increase the fidelity of our sound samples. For songtracks, we used the hardware streaming direct from disc. The disc is small and fast, so we never had a problem with load times. The disc capacity is lower than a standard DVD, but at 1.5GB, it was plenty for our 900MB of data.\n4. Memory Management # Although fast, the GameCube main memory (MRAM) is limited in size (24MB) compared to the PS2 (32MB). We stayed within the memory limitation by agressively keeping on top of that issue. By running on the test consoles as soon as possible, we forced ourselves to reach the 24MB target early, within the first six months of the schedule. The UMA meant the video framebuffer occupied MRAM. Since PAL resolution is higher than NTSC, we sized the framebuffer for PAL in all builds to ensure we wouldn’t have memory problems later. We configured all of the devkits to use only 24MB, so the programmers would know immediately if any level didn’t fit. Testers went through all levels in each daily build and in their email report listed any levels that didn’t load.\nFlipper supports S3 texture compression, so we compressed as many textures as possible. Any such textures that didn’t look good after compression were reworked. This considerably reduced memory usage (and as a side effect improved performance and load time) and didn’t seem to degrade the visual quality noticeably. After E3, new assets pushed us over the memory limit, so we turned mipmap generation off until we had more space and a more selective procedure for mipmapping.\n5. Testing # We made a point of testing early and often. Starting about a month before the first GameCube milestone, we released daily builds on test discs for our QA group. The builds were created from the latest code and data checked into cvs. Our testers issued a daily test report noting new bugs, verifying fixes, and listing minimum single-player and multi-player frame rates for each level (the build included an on-screen fps display).\nCrave provided us with a tester from their staff who worked on-site with us and tested our daily build. At first, we sent our Friday build every week to the rest of their QA group, but in the last two months before submission we Fedex’ed them our builds, daily. We also set up remote access to their bug database and used that as our sole bug reporting and resolution mechanism. Since changes to the database would show up on the client GUI instantly, we would be alerted to the new bugs as they arrived and could investigate and update the database entry immediately with comments or requests for closure.\nThe Crave QA group provided valuable console testing expertise, including experience with a recent GameCube title, and were familiar with the Nintendo developer guidelines. Soon after they started testing Whirl Tour, their GameCube bug database contained about 200 entries, many of them memory card and disc error handling issues that would have been flagged by lot check at submission. By the end of the project, we had around 700 bugs logged and resolved for Whirl Tour GameCube.\n6. Schedule # Originally, we estimated the GameCube development of Whirl Tour would trail the PS2 by one to three months, for reasons including the expected delay for hardware and middleware and less in-house familiarity with the newer GameCube platform versus the PS2. But that meant we would at least partially miss the critical holiday retail season. When it appeared that we could deliver our first GameCube milestone on disc, it made sense to synchronize the GameCube schedule with that of the PS2. This allowed us to target September for our North American submission, which would allow the game to arrive on the retail shelves in November. And it greatly simplified our overall project schedule, since we didn’t have to track different milestones on each platform.\nThe decision to sync the schedules was consistent with our approach of top-down milestone-driven scheduling. Instead of building the schedule bottom-up by summing up low-level tasks, a method which accumulates error over time, we built the schedule top-down, placing the most importance on critical deadlines like E3 and the target submission date, followed by our milestone commitments to the publishers, and then juggling tasks to accomodate those dates. Adhering to the big-picture deadlines proved even more important later in the project, when Papaya was gearing up for the next project — any delay in this title would have just propagated to the next.\nThe schedule was tracked with Microsoft Project. Milestones were marked as such using the milestone task annotation in Project, and features required for each milestone were listed as subtasks, down to a granularity of no less than one week per task. We marked only real dependencies between tasks, no artificial links to force a nice-looking sequence, and we let Project calculate the expected dates. When a task was completed, we filled in the date for the finished task and let Project recalculate the dates for the remaining tasks. Thus we used the schedule not so much as a micro-management and task-scheduling tool than as a schedule feasibility tracker and early warning system.\nWe had weekly team meetings that initially involved only the leads and proceeded in a go-around-the-table-and-report fashion. Eventually, the format changed to include all team members and followed an announced agenda. This resulted in more focused and shorter meetings, sometimes lasting only fifteen or twenty minutes and rarely lasting more than an hour. Minutes were distributed by email afterwards. The meeting time was also minimized by requiring each team member to send a company-wide status report every Friday on his area of the project.\nWhat Went Wrong # 1. Performance # The biggest disappointment was our failure to achieve our original performance target of 60fps for all levels in single-player mode. We did achieve the desired 30fps for multiplayer mode in all levels, but for single-player mode we could only maintain a consistent 60fps in two-thirds of the levels. The remaining levels alternated between 30fps and 60fps, so we had to lock them to the lower frame rate to keep the visuals smooth.\nWe made a mistake in not achieving and maintaining the target frame rate early. We started with a consistent 30fps in our first GameCube milestone, and the code performance improved all the way through the project. We planned on achieving 30fps for the first milestone and reaching 60fps by E3. The fact that we only had a few levels running at 60fps by E3 should have been a wake-up call, but we succumbed to wishful thinking and hoped that further optimization techniques would get us to our goal. We did improve code performance by about 50 percent between E3 and submission, but with more NPC’s, water effects, particle effects, dynamic shadows, and so on, we just kept pace with the additional assets. In the end, we still left a third of the levels below target in single-player mode.\nIt became apparent, too late, that many of our optimization techniques did not improve the worst-case performance in our problematic levels. If we had recognized this earlier, we may have been able to restructure the levels to exhibit more balanced performance. There were some architecture-specific optimizations that we did not fully explore, but again, we ran out of time.\n2. Submission (and Resubmission) # The NOA submission was rejected twice before approval. That isn’t a particularly bad showing, but there was a lot of pressure to get each resubmission out quickly, and it wasn’t fun. We cut it close in terms of getting the release out in time for the holiday retail season, so it would have been more comfortable if we could have knocked it down to one or two submissions.\nThe most persistent problem areas that kept showing up on our lot check submission reports included memory card error handling and on-screen depictions of controller buttons. We could have gotten a pass on the button graphics, but we updated the button graphics several times anyway in hopes of making them more acceptable to lot check. The memory card issues for the most part were not negotiable — there are comprehensive guidelines involving error-handling flow and messages. These are not very exciting features to implement, but they are required, and we should have tried to get that stuff done earlier.\nOur programmers and testers were not familiar with the GameCube submission issues, and as a result, we were overly reliant on Crave’s QA team to identify the problems. Once Crave started testing the game, we basically had two months to rewrite our memory card, disc error, and reset-handling code, while simultaneously adding our shadow code, performance optimizations, and trying to fix all other bugs before submission. This was complicated by a couple of attempts in the last few weeks to advance the submission, which, in retrospect, now seems unrealistic.\nWe should have educated ourselves on the submission issues much earlier by reading up on the guidelines and examining other games, and we should have scheduled completion of all the guideline requirements by our beta release early summer. Crave sent the beta to lot check, but we didn’t receive the results until two weeks before the final submission. The presubmission report from lot check was useful, but would have been more so if we had tracked it down earlier, and if didn’t have so many violations (too many to fix in one pass).\nWe complicated the memory card situation by attempting to share much of the framework with the PS2. We delayed much of the GameCube-specific implementation until the PS2 code was nearly done, so most of the work was completed in the last three months before submission. The code sharing seemed convenient initially, but there were significant differences between memory card guidelines for the two platforms. The resulting error-checking and error-handling flow was somewhat atypical for a GameCube title, requiring clarification among the QA groups, lot check, and programmers. After hasty code mangling during the resubmissions to accomodate QA and lot check objections, the shared code was a mess. It seems obvious now that we should have completely separated the memory card code for the two platforms.\n3. Manual Builds # Although we had a daily build, it was not automated. We performed the build on a developer station using the ProDG/Visual Studio envronment. This allowed us to make quick fixes before releasing the build to QA, but it was not the type of clean and reproducible build that good configuration management practices mandate. An overnight batch build would have saved time (each build took anywhere from 30 minutes to three hours, depending on fixit attempts), been reproducible, and, if we set it up properly, automatically logged and emailed build results.\nMoreover, an automatic build could have helped to establish a sense of regularity and process. The team members were never sure when the next build would be available, so eventually we had to send email every day announcing the build. Aside from the testers, most of our team members were still overly reliant on the PC version on the game and there was a slightly disruptive tendency to go straight to the programmers instead of checking the latest official build. And the fact that the build took place manually and not at any designated regular time made it too tempting to request new builds at increasing and irregular intervals, particularly during crunch times.\nWe had our data converter running every night by the end of the project, allowing us to check the latest art and sound effects changes. But the data build did not include processing of songtrack and FVM data, which were provided by external sources as WAV and AVI files requiring lengthy (hours to do a whole set) conversion to GameCube-specific compressed streaming formats. The FMV conversion was particularly involved, as we required versions for NTSC and PAL, and we had to extract the audio, resample and merge it back in to the converted FMV files. Unfortunately, the songtrack and FMV sources arrived fairly late in our schedule, so we were processing iterations of this data well past our attempted one-month data freeze before submission.\n4. Wanted: Tool Programmer # We could have used a tool programmer. Our data converter was augmented by several different programmers in an ad-hoc manner, so new features were not consistently implemented with all the target platforms in mind. For example, although mipmapping and texture compression were technically multi-platform features, the code ended up in an “ngc-utils” file, and triangle-strip generation and texture palettization ended up in PS2-only code. A dedicated tool programmer could have developed the converter with more of a big-picture approach and taken some of the load off the other programmers, particularly the console programmers and lead programmer. A dedicated tool programmer could also have addressed the artists requests for previewing tools, which we just didn’t have time to work on.\n5. Lengthy Localization # The localization process for the European release took a lot longer than expected. Crave’s QA group was regularly testing our PAL builds well before the NOA submission, so we expected to have a submission to NOE ready as soon as we had the text translations. The game engine modifications turned out to involve new texture fonts for the extended character set, additional character selections for text entry screens, resized GUI elements so longer European words would fit, and proper synchronization of the in-game language with the console ROM language setting. The code changes took a while, but a greater delay was incurred by an initial one-month wait for the first set of translations from Vivendi, then several iterations with Vivendi’s QA group to fix translations, typos, and text trailing off screen. We made our submission to NOE three months after the NOA submission, and then it took an additional three weeks for NOE to reject the first submission and approve the second.\n6. A Mild Case of Featuritis? # We didn’t completely meet our performance targets, and we had a crunch time involving a flurry of fixes and resubmissions. So any work that didn’t result in obviously necessary functionality warrants reevaluation:\nAudio Effects # We had audio reverb and delay effects on our requirements checklist, but they were used in only one area in the game. It was gratifying to say we used the audio effects hardware on the GameCube, but it made our audio code layer significantly more complex and took several weeks to get it right. Compounding this, we were worried about the audio DSP dropping voices when oversubscribed, so after E3 we rewrote the system to handle this eventuality. But the rewrite took two to three weeks, the resulting code was messier, and once we had all the sounds in the game, the built-in GameCube metering hardware indicated that we were only using twenty five percent of the DSP cycles in the worst case.\nScreen Capture # We had a publisher requested for a screen snapshot function, which we implemented shortly after the first GameCube milestone. It worked only on a devkit and was used by our testers for their bug reports. But it’s unlikely that it was used by anyone else, internally or externally. Submission releases were not supposed to include debug code, so we ended up removing the screen snapshot code before the presubmission. All in all, we spent five months maintaining that feature.\nVideo Modes # Nintendo recommended but did not require support for progressive scan. We implemented it, but neither we nor our publisher’s QA group had progressive scan monitors, so we relied on informal testing off-site using personal equipment. Our progressive scan support was noted by some reviewers, but there was a cost in coding, testing, and added risk to the submission, as Nintendo has guidelines on proper implementation of progressive scan.\nSimilarly, Nintendo recommended but did not require support for 60Hz mode in PAL releases. The number of users who can take advantage of this feature is probably higher than with progressive scan, and this feature was testable in-house and by the publisher’s QA group, so it is a more justifiable feature But again, there was a development and QA cost, code complexity to handle both 50Hz and 60Hz modes, e.g. in selecting the appropriate FMV to play, and additional localization required for text displayed when switching modes.\nShadows # We implemented detailed dynamic shadows for player characters and enemy bosses. If we had limited the detailed shadows to just the player characters and used blob shadows for the bosses, at least two more of the levels would have run at 60fps instead of 30fps. It wouldn’t have looked as good, but would have been no worse than many high-profile games that have recently appeared. We used higher-resolution shadow maps for the player characters, while allowing the boss shadows to have a more jagged appearance. The hi-res maps looked good, but the effect was subtle, and there may have been a performance penalty. Late in the project, we combined the shadow map blending with a location-based shadow value so the dynamic shadows would blend with pre-shadowed areas. Yet again, this looked good, but the effect was subtler still, and it was risky to make such a change right around submission.\n7. IT # Our server crashed right around E3, and although we had an automatic tape backup running every night, it turned out the data was unrecoverable. Fortunately, we had local copies of the working data distributed around the office, and we had performed periodic manual backups on DVD. It took a while to piece together all our code and assets, and some of the work done just before E3 was lost. It could have been worse, but we did pay a the price for failing to ensure the integrity of our backup system.\nAfter the server crash, we spent the next several months upgrading our IT infrastructure. This didn’t distract too much from the ongoing development work, but we could have done a better job of minimizing disruptions by communicating and coordinating the IT plans. For example, switching from local accounts to domain-based accounts made some development tools unusable until some Windows registry values were updated. Even then, we were unable to upgrade our ProDG installation, which meant we were unable to upgrade the Nintendo SDK. And we had to use the original local account for our disk burns. We could have attempted to diagnose the problems or at worst perform a complete reinstallation, but with crunch time starting and the submission deadline looming, we really didn’t want to take the time. This might have been avoided if we had discussed the IT planning in our weekly meetings and coordinated some upgrade tests and fallback policies.\nLessons Learned # This article focused on the GameCube development of Whirl Tour, but most of these issues are applicable to console development in general. As a console developer, many things are outside of your control, so control what you can. Get the development tools as soon as possible, and get more than enough. Make full use of developer support. Achieve memory and performance targets early and maintain them. Establish daily automated builds and testing early. Take care of the requirements before working on bonus features. Schedule around the really important milestones and then stick with the schedule. Do early and multiple presubmissions if possible. Plan for a few resubmissions in the end — allow a month. And localization will take longer than you think.\n","externalUrl":null,"permalink":"/books/techsoft/whirltour/","section":"Books","summary":"Game Data # Publisher: Crave Entertainment and Vivendi Universal\nRelease Date: November 2002 (US) and March 2003 (Europe)\n","title":"Taking a Whirl Tour on the GameCube","type":"books"},{"content":"This book is available on:\nAmazon (print and kindle book) Apress (print, pdf, epub and mobi) Alpha purchasers should download the latest, final Barnes and Noble (nook book) Goodreads (links to online bookstores) Google Books (links to online bookstores) iBookstore (iBook) Indigo (Canada) and Kobo Langton Info (UK) Powell\u0026rsquo;s Springer Link ","externalUrl":null,"permalink":"/books/learnunity4/available/","section":"Books","summary":"Where to find this book","title":"Availability","type":"books"},{"content":" Explore Further # All in all, it didn\u0026rsquo;t take much work (compared to the packaging effort in the previous chapter) to implement touchscreen input for the bowling game, although in practice you\u0026rsquo;ll spend a lot of time testing and adjusting controls for a game to get it just right. In any case, with the shake-to-pause feature, the functional port of the bowling game is complete. In other words, the iOS version game is now playable!\nAnd despite the fact there isn’t a real use for the device camera in this game, we did activate it using Unity’s WebCamTexture class to render a video texture on the bowling ball. Gimmicky, but game development is very much about learning! Especially in iOS, there\u0026rsquo;s an opportunity to play around with a lot of different control schemes and input sensors.\nScripting Reference # Almost all the Unity features introduced in this chapter are members of the Input class. In fact, the Scripting Reference documentation on Input includes an overview of the iOS input features.\nAfter reading the overview of the Input class, you should read the pages for each of the functions used in this chapter, in particular Input.GetTouch (and the associated Touch struct), which has code samples showing how to loop through all the Touch events in each frame, and Input.acceleration, which has code samples showing how to check acceleration values in every frame.\nOne thing to keep in mind, the accelerometer can generate multiple values per frame. For most cases, it should be sufficient to just sample Input.accelerometer once per frame, but if finer-grained sampling is required, you can access the variables Input.accelerationEventCount and Input.accelerationEvents to obtain all acceleration events.\nThe Input class provides access to other iOS sensors. The static variables Input.gyro, Input.compass and Input.location return data from the gyroscope, compass and location services, respectively. In addition to the pages documenting those variables, you should check out the pages on the classes of those variables: Gyroscope, Compass and LocationServices classes. The documentation is sparse, but you can find code samples in the individual class functions. The static variable Input.compensateSensors controls whether the accelerometer, gyroscope and compass data are adjusted for the screen orientation.\nBesides testing object selection, raycasting is used a lot in games and graphics, so you should familiarize yourself with the page on Physics.Raycast, which has several code examples. For example, in HyperBowl, I use raycasting to keep the Main Camera from dipping below the ground and to set the initial positions of GameObjects to rest just on top of the ground. In both cases, I raycast down from the GameObject position toward the ground and check the resulting distance.Finally, we covered the use of the WebCamTexture class. The page on WebCamTexture has a lot of stuff, but click the links to its Play, Stop, and Pause functions (the functions you’d most commonly use) to find code samples on each of those pages. Also check out the link to the WebCamTexture constructor. That page lists a variety of constructors that allow you to customize the texture size for different resolutions.\niOS Developer Library # It’s a good idea to read the iOS Reference Library in addition to, or even before, reading the Unity Script Reference, so you’ll know what iOS capabilities are available to be exposed through Unity and how Unity classes and functions map to their iOS counterparts.\nYou can view the iOS Reference Library, no login required, at http://developer.apple.com/library or from the Xcode Organizer, and from there select the Guides tab and browse the guides, in particular the following:\nThe “Event Handling Guide” provides an overview of touch events, which relate to Unity’s Input.GetTouch and the Touch class, and motion events, which relate to Input.acceleration and the other Input accelerometer variables.\nThe guide “Camera Programming Topics for iOS” describes the UIImagePickerController class used by the Prime31 Etcetera plug-ins.\nThe “AV Foundation Programming Guide” describes the video capture functions most likely used for the WebCamTexture class in Unity.\nAsset Store # The Unity Input class gives us access to basic touch information, but it doesn’t provide access to the iOS Gesture Recognizers, which detect higher level “gestures,” such as swiping and pinching. The Asset Store comes to the rescue again, offering third-party packages that provide high-level gesture detection. I use the Finger Gestures package, which has a nice callback system for detecting and handling various gestures.\nFor example, in HyperBowl I wanted the pause menu to come up when the player pinches the screen (two fingers on the screen coming together). With the Finger Gestures package, it just involves adding a callback for the gesture in the pause menu script:\nfunction OnGesturePinchEnd(pos1:Vector2,pos2:Vector2) { PauseGame(); }\nand then a line in the Start or Awake function that adds the callback to the FingerGestures callback list for that gesture:\nFingerGestures.OnPinchEnd += OnGesturePinchEnd;\nUnity doesn’t provide script access to everything available in iOS, and that’s where plugins come in. The Unity plugin system allows you to add new script functions that access “native” code. So, generally speaking, if you can code something in C, C++, or Objective-C, you can make a Unity plugin for it. For example, in the Unity Asset Store, you’ll find there are plug-ins built around mobile ad SDKs and plugins for accessing iOS features.\nPlugins are installed in the Assets/Plugins folder, which, as we mentioned before, is a good place to store scripts that have to be loaded before any other scripts. They also often require manual integration steps in Xcode, like adding entries to the Info.plist file or installing additional code libraries (preventing Build and Run from Unity—you have to Build, modify the Xcode project, then Run from Xcode). And then there’s always the risk that multiple plugins installed in the same Unity project will have conflicts.\nThat’s why I like to use the plug-ins provided by Prime31 Studios at http://prime31.com/unity. They provide a large variety of plugins that can coexist in the same Unity project, and all Xcode modifications are performed by a Unity postprocessor script, so Build and Run from Unity will still work and no messing around in Xcode is required.\nFor example, the Prime31 Etcetera plugin, available on the Asset Store, has a bunch of assorted features, including access to the iOS Photos gallery and the device camera, with one function call, like this:\nEtceteraBinding.promptForPhoto(1.0);\nThe screenshot in Figure 13-8 shows the resulting prompt in my Fugu Maze app (where I use the photo chooser to allow players to customize the maze wall texture). If you want to try it out, download Fugu Maze Free from the App Store or one of the free HyperBowl lanes (I use the photo chooser to customize the bowling ball texture).\nFigure 13-8. The Prime31 Etcetera plug-in photo chooser on an iPad\nAnother Prime31 plugin that makes available additional device input is the iCade plugin (only available on the Prime31 web site). The iCade is a retro-style arcade cabinet that provides joystick input to iOS devices through a Bluetooth connection. The iCade essentially pretends it’s a Bluetooth keyboard, so any code using the iCade plugin is similar to the code for keyboard controls. If we added code for iCade controls to the CalcForce function of our bowling ball code, it would look something like the snippet in Listing 13-10 (this sample is actually taken from HyperBowl).\nListing 13-10. iCade Additions to CalcForce Using the Prime31 iCade Plug-In\nvar yinput:float = 0; if (iCadeBinding.state.JoystickUp) yinput = 1; if (iCadeBinding.state.JoystickDown) yinput = -1; var xinput:float = 0; if (iCadeBinding.state.JoystickLeft) xinput = 1; if (iCadeBinding.state.JoystickRight) xinput = -1; var deltatime:float = Time.deltaTime; forcey += iCadePowery*yinput/deltatime; forcex += iCadePowerx*xinput/deltatime; Just as if we’re checking if four different keys were pressed, we’re checking if the joystick is moved in any of four directions. The joysticks aren’t any more sensitive than that.\n","externalUrl":null,"permalink":"/books/learnunity4/chapters/chapter13/","section":"Books","summary":"Explore Further # All in all, it didn’t take much work (compared to the packaging effort in the previous chapter) to implement touchscreen input for the bowling game, although in practice you’ll spend a lot of time testing and adjusting controls for a game to get it just right. In any case, with the shake-to-pause feature, the functional port of the bowling game is complete. In other words, the iOS version game is now playable!\n","title":"Device Input","type":"books"},{"content":"I wrote this before the iPhone came out, so my praise for Apple would be somewhat diminished now.\nIt’s a Unix system! I know this!\nYou Have to Care # Anyone can create a decent user interface. Designing reasonable user interfaces is not rocket science. It’s not even computer science. I know there are plenty of researchers dedicated to the study of effective user interfaces and their design, but bad user interfaces occur not due to lack of training in cognitive science — bad user interfaces happen because people don’t try.\nIf you pay me a visit at my condo complex, it might take you a while to find my name on the phone number list pasted by the entry intercom. It’s not listed alphabetically by name — instead, it’s sorted by the three-digit phone code. So if you knew my phone number already, you could look it up easily! One might suspect that the staff at our condo management company was just sticking to an unfriendly but logical system, but there are a few names, including mine, tacked on at the end of the list in seemingly random order. Those names happened to be the ones the management staff forgot to include the first time around.\nNow, it’s not like the names are engraved in stone. The page was obviously printed with a word processor. It’s not that hard to move the text cursor when you’re typing, and it’s not hard (I hope) to alphabetize, especially when the list includes less than twenty numbers. This is just another case of someone not caring enough to do a good job or think about how to do a good job.\nDesigning a good user interface isn’t always easy, but anyone can identify a bad one. We deal with interfaces all the time, from web sites to ATM machines to microwave ovens, and we have an idea what interfaces we like and which ones we don’t. Even those of a contrary nature who delight in presenting puzzles, or those of an apathetic nature who just don’t care, still have strong opinions on the interfaces they have to deal with.\nThat said, not everyone is suited to design an interface for everyone else. For example, programmers who like command-line interfaces and don’t see the point of windowed desktops are probably not going to make very good GUI’s. But it’s a bad rap to attribute bad user interfaces as the work engineers who design products only engineers can use. Forget that left-brain/right-brain folderol. Code API’s, whether internal or external, are a form of user interface — good ones are a delight to use and bad ones are painful to use, causing errors, delay and aggravation. (If you don’t like Microsoft GUI’s, try looking at their API’s) And a “creative” graphic designer might design something that would look great in a Powerpoint presentation but completely mystify users.\nThe best interfaces appear in labors of love that the creators want to take home with them. The worst products are those implemented with just enough effort to satisfy checklists from the marketing department.\nBe Consistent # The most important rule in user interface design is consistency. Just as drivers rely on consistent conventions with the shape and content or road signs, the user can’t navigate the application effectively if it involves constant trial and error.\nI see this problem in various Windows applications (and Windows itself), when many, but not all, operations on an item are available from a right-click menu, and some are only available from one of the menubar menus. This results in time wasted when the desired function is not immediately found, and an obviously less trustworthy user interface model.\nA common inconsistency in computer and video games is the lack of consistency between options in the front end (at the beginning of the game) and those provided by the in-game menu. For example, if audio settings are available in-game, why should you have to exit to the front end menu to change video?\nIt’s better for the interface to be awkward in a consistent manner than to be inconsistently intuitive in some areas and different in others.\nThe Windows recycle bin is a great safety feature (although not an original idea, of course). To really delete a file you have to delete and then really delete by emptying the trash bin. On the other hand, as I discovered to my chagrin on one project, the same delete from a network-shared disk is only a one step process.\nMicrosoft is an easy target, but Apple isn’t guiltless, either.\nI was one of the original adoring Mac fans, but the insistence (was it Steve Jobs?) on a one-button mouse was misguided. Since the resulting hack — double-clicking — was copied blindly by Microsoft along with everything else, I have spent hours explaining with torturous logic to my condo neighbors (they figured out I was a computer guy) why they’re supposed to double-click on desktop icons but single-click buttons and web links, and forget control-click, shift-click, option-click or (Mac) command-click. And watch out for those laptop touchpads that turn lingering thumbs into double-clicks or mouse drags! Even the MacOSX desktop can’t make up it’s mind — double-click opens files in the Finder, on the Desktop and in chooser dialogs, but the Dock and the System Preferences respond to single-clicks. More than once I’ve accidently changed my screen resolution by double-clicking the Display applet (the first click opens it, the second chooses an annoyingly low resolution setting)\nInconsistencies in API design slow down programmers and are sometimes downright dangerous.\nI recently helped a client resuscitate a legacy Windows 98 product and get it running on Windows XP. Tracking down some odd artifacts in the GUI, I was horrified to discover that all of the MFC classes took an attribute mask in the same parameter position except one, and the previous engineers on the product hadn’t noticed the exceptional case because the bits they passed as the wrong argument just miraculously happened to work — seven years ago.\nMake It Clear # Clarity seems like an obvious goal in user interface design, yet how many programs allow you to sit down and just get started?\nI thought after the whole hanging chad business that the new electronic voting systems would at least have simple user interfaces. And the ones I’ve encountered at my local polling location do have a very simple controller — a clickable track dial for moving the cursor aound the screen and selecting answers. However, the system allows you to position the cursor anywhere on the screen, including the question fields, so it’s not clear what you’re supposed to select, and if you do select a field that’s not selectable, well, nothing happens.\nAPI’s also can suffer from tack-on-itis.\nIf you program with the Microsoft Win32 API, you have to remember to use the newer versions of some functions that are simply extended with an “Ex” suffix and additional arguments, e.g. CreateWindowEx instead of CreateWindow. Try using Win32 without constantly referring to the documentation. Just try it.\nMake It Easy # The one and only time I tried to order from a certain MacDonald’s near Johns Hopkins University in Baltimore, the cashier responded “We don’t have any right now.” After trying a couple of other items, she finally informed me that they weren’t serving lunch, yet. But as I ordered a McMuffin the minute hand advanced from 10:59 to 11 AM and the cashier duly informed me that breakfast was no longer being served.\nUser interfaces can be bureacratic, too. Some force you to jump through a specific sequence of hoops, and sometimes you have to start all over if you get one thing wrong. Voice mail is pretty much designed to do this. But often this results from implementors taking the least-effort approach and just tacking on functionality.\nHigh-end 3D content creation systems tend to have feature-rich interfaces — I worked on one that just chained together sequences of generic popups because that was the easiest way to program it. To use a texture, bring up a file chooser to select the image file, a color chooser for each of several shading options, and popup numeric entry dialog for each numeric option. Contrast this with the Macintosh control panel (old or new) — everything in one dialog.\nPut the related options together on one dialog, and don’t make the user leave until done. And think about whether you even really need a dialog.\nIn Windows Explorer, you have to right click on a drive icon and select the Properties dialog to see how much space is available. In the Macintosh Finder, it’s always displayed at the bottom of the window.\nJumping through hoops on a desktop application is annoying enough, but on web sites it’s excruciating.\nI’ve found travel planning on the American Airlines reservation web site terribly annoying if I’m trying browse. Type in your travel start and return dates, hit Submit, and if you don’t find something you like, you have to start all over. If you don’t “Search by Fare”, the resulting list of flights doesn’t show the respective fare, and you have to choose a flight and proceed to the reservation to see how much it’ll cost.\nThe sites for other airlines (Jet Blue and Southwest, for example) allow you to conveniently browse forward and backward a day at time to compare flights. Morever, they immediately show results for surrounding days so there’s a good chance you’ll see all the options you want.\nObviously, it should be obvious what to do. If you have to explain it, there’s room for improvement.\nBut Not Too Easy # On the other hand, there are some functions that you don’t want to make too accessible.\nI worked on one rather large and flakey application that had a “Reset” button prominently displayed on the user interface. Users would click on that button as if it was an accelerator pedal anytime the application seemed unresponsive, i.e. anytime the user became impatient. The reset function was useful, but should have had either a confirmation step or been an option within a menu. As it was, I suspect the reset probably interrupted more operations than it recovered, and it surely made debugging more difficult. Emergency and safety features, like fire extinguishers or the emergency break in your car, should be obvious in function but inconvenient enough to prevent accidental use. But in keeping users out of trouble, don’t be patronizing.\nI worked on a chart display that had all kinds of unnecessary “features” that tried to avoid displaying anything that was not deemed presentable. For example, if the user zoomed out enough (using a scale slider) so that smaller items on the chart did not fully encolose their text labels, then those items simply disappeared from the chart. This was a bad solution to a non-existent problem — it’s easy enough to zoom back in if the display is offending the user’s esthetic sensibilities, and magically omitting data risks confusing or, worse, misleading the user. Don’t presume to tell users what they want to do or see. Just give them the tools to do it.\nThe Customer Is Always Wrong # Well, not really. But if customers really knew what they wanted, they could start their own company.\nI worked on a computer graphics tool that featured a somewhat atypical menu system — rather than go to a menu bar or an ever-present vertical list of all the menu options on the side of the screen (common among our high-end competitors), our users would shift-click inside our 3D modelling window to get a popup with cascading menus. When we took a survey among potential customers, they said they wanted a vertical side menu. Of course we implemented the side menu, but that was a lot slower for professional users who don’t want to drag the mouse across the screen every time they need select a new operation or mode, so we had another mouse click warp the mouse the side menu — the type of design decision that only makes sense in the context of a previous bad decision. And then of course the heavily populated side menu didn’t fit on the screen when we ported the product from the high-end Silicon Graphics workstations to Windows NT machines. And guess what — anyone who actually bought and used the product for serious work used the original menus.\nIf it’s as easy as just asking customers or your salespeople, then hire them to do your job. Relying on user surveys, focus groups, marketing checklists and the like is a cop out. There’s no substitute for observation, analysis and innovation. And you don’t need huge resources to get it done.\nI spent one project listenting to a user interface programmer complain that we needed user testing. Meanwhile, he was oblivious or dismissive of every stumble, inconvenience and point of confusion encountered by the testers and project manager when trying out the product.\nYou don’t need to make user testing a big formal deal. Just do it. Watch, listen, learn. The Computer Is Always Right\nUser interface specialists often ridicule programmers for presenting a user-interface that models what the program is really doing instead of a simpler user model. But they are at best half-right. Hiding complexity is usually a good thing, but presenting a user model that does not match the the application’s internal model is a recipe for trouble.\nWhen I was a user-interface programmer for a large video game project, the game designers came to me with all kinds of game features that they just assumed involved cosmetic tweaks to the HUD, since they just considered how those features would look. More often than not, they involved fundamental changes to the game engine. If the application model is too difficult to use, or just plain wrong, then that’s what needs to be fixed.\nIt’s Not Just a Pretty Face # User interfaces are getting better looking all the time, but looks aren’t everything.\nI once worked for a neat freak who went around the office at night arbitrarily tossing anything she found on desktops into drawers. One book went missing for months. Worse, she instructed her lackeys to wire up the computers so it was nice and tidy, and utterly inconvenient. The test staff had to move desks in order to switch test equipment, and I spent an afternoon testing video game memory functions by repeatedly crouching and blindly reaching behind a box under the desk, because gosh, it would have looked too ugly to have those slots facing forward! Good looks make a good first impression, but that’s all you’re getting if the interface is painful to use and everything is hard to find.\nI worked for one manager who had a minor in visual arts and insisted on designing the user interface himself, mainly by drawing pictures. That’s not bad in itself, and the pictures looked nice, but he seemed to expect that to be the whole process. There was no description of the user flow, not much thought to consistency, user model, or grouping controls by function rather than appearance. And despite this being a Mac app, no reference (or reading) or the Apple Human Interface Guidelines, which is the industry gold standard. Artistic skill is useful (I’m afraid I can’t design an icon to save my life), but user interface design is about analysis, empathy, and diligent research. It may not be rocket science, but it is engineering.\nIt’s Not Just the Application # User interface design is about user experience, and the application interface is just one part of that.\nApple gets it right. Buying my Macbook Pro at the Apple Store was like buying a luxury car. I spent some time gazing at it in the showroom (the Apple Store), purchased it in a few minutes from an Apple Store rep who immediately retrieved it from the back and handed it to me, carred it out in a nifty box with handle, carefully unfolded the quality cloth that wrapped the laptop, and zipped through the setup process. And now, passersby at Starbucks often comment how cool my laptop looks.\nContrast this with my previous computer purchases. Every time I bought a computer from Fry’s, it turned out they gave me a previously-returned box (in the case of a Powerbook, the registration had been partially filled out and the MacOS install was only halfway complete — as it consisted of a dozen floppy disks, I guess the previous purchaser got tired of swapping floppies). Best Buy aggressively pushed an extended care warranty on me, left me in line for fifteen minutes to complete the purchase, and somehow I got billed by Microsoft for their Internet service (I wasn’t the only one — I discovered years later that I missed out on a class action lawsuit). At CompUSA I watched a sales associate hunt-and-peck an old terminal for fifteen minutes so he could print out the paperwork on an equally old dot-matrix printer. Not quite as bad as the buying experiences for both my Toyotas (nice cars, slimy salesmen), but I don’t have to upgrade my car every couple of years.\nIt doesn’t matter how well you design your application if the user is turned off before even using the product. Whenever possible, I start all of my projects in designing the installer. And don’t forget support — all of that goodwill engendered by smooth installation and a nice interface can be cancelled out by one lousy call center.\nIt’s Not Just For Computers # While it’s easy to complain about the state of computer user interfaces, and it’s all warranted, at least there are plenty of people complaining about it. If only that much attention was paid to everyday things.\nTake my bills (please). Like GUI’s, they keep getting glitzier, as my phone and utility providers proudly announce their “new look”. But I still have bills that are folded and creased just far enough that when I detach the tear-out stub to include with the check, they don’t fit in their envelopes without folding them down a quarter inch. My utility bill doesn’t list the account number on the stub, so I’ll detach it, fill in the balance paid, start writing the check, and realize I have to go back to the other half to find the account number. My doctor’s bill is worse — it doesn’t even show the balance due on the stub. And while the main part of the bill shows the balance (of course), it only lists account changes in the month the bill was issued — any other charges made since my last visit to the doctor are included in the balance but will never, ever be listed anywhere! My question, why bother listing any charges at all?\n","externalUrl":null,"permalink":"/books/techsoft/itstheuserinterface/","section":"Books","summary":"I wrote this before the iPhone came out, so my praise for Apple would be somewhat diminished now.\nIt’s a Unix system! I know this!\nYou Have to Care # Anyone can create a decent user interface. Designing reasonable user interfaces is not rocket science. It’s not even computer science. I know there are plenty of researchers dedicated to the study of effective user interfaces and their design, but bad user interfaces occur not due to lack of training in cognitive science — bad user interfaces happen because people don’t try.\n","title":"It’s the User Interface, Stupid","type":"books"},{"content":"This essay is somewhat dated, as you can see by the section on NTSC/PAL\nOnce you can remove no more, you are done.\nGetting Started # My first piece of advice to anyone contemplating a game development project — don’t. (Well, at least not until you know what you’re getting into.) But if you go ahead, anyway, here are some tips beginning with staffing:\nDispassionate Gamers # Game job postings typically list “a passion for gaming” as a prerequisite (along with its partner, “willing to put in extra hours”). Other industries don’t do this — you don’t see ads requiring “a passion for factory automation software” or “a passion for working on banking systems”. Anyway, a devotion to games doesn’t necessarily translate to productivity and work ethic.\nMost of the game developers I’ve worked with were avid gamers but many, including one of the best gamers I’ve ever met, didn’t apply the same concentration and motivation to their work. I’ve seen plenty of work with obvious defects, even an FMV with a two-second blank gap, either due to inattention or laziness (one artist even told me his video package could not reexport his FMV in AVI format, until I stated that was the only format I could process for our target console — then he promptly reexported it).\nI’ll take professionalism over passion any day. If you need to hire janitorial staff, you’re not going to look for some crazy nut who has a passion for toilets — you want responsible people who take pride in doing their job.\nMost of the best game artists I’ve worked with were only moderately interested in gaming — they were artists first and their results far surpassed those of mediocre artists with high gaming skills. They were conscientious enough to play-test their work during development but once the games were released, typically never touched them again.\nNow, game design is one area where presumably an absorption in games would be really useful. But even there, you’ll find the best game designers are who have the intellectual breadth and analytical ability to figure out what makes a game fun and to move beyond knockoffs of existing games.\nOne designer who was an extremely good skateboarder and skateboard game player decided to differentiate his game from all the Tony Hawk clones by removing the fun parts, resulting in an obvious knockoff that was unplayable.\nA common entry route to game development is via QA groups, and I think that is a good one — testing is a good introduction to the game development process without getting in the critical path, and anyone who can’t develop the patience and analytical abilities for that role is probably going to do a worse job in a production position.\nTo put a final point on this, if a passion for gaming is so important for game development, why are so many non-gamers in high-level decision-making positions on game projects? Many, if not most, of the high-level producers I’ve met are mediocre gamers at best, and it gets worse as you go up the corporate ladder.\nI know of one game prototype that had all kinds of pizzazz thrown in at the producer’s request, and then the whole thing had to be scaled down at the last minute so the demo wouldn’t confuse the executives who had final approval. (Of course, the producers should have known this)\nProgrammers are from Mars, Artists are from Venus # The production pipeline is always the bottleneck, so you need people who not only work well, but work well in the context of a production.\nEven some experienced and talented game artists do not work well in game development teams. Just throwing assets over the wall and assuming the programmers will fix it wastes time and engenders hostility from the programming team. The more difficult artists I’ve met were stubborn to the point of belligerence and considered the rest of the game team as staff supporting (or limiting) their artistic accomplishments.\nSome phrases that have lost their novelty — “I didn’t change anything”, “It’s broken — fix it!”, “That’s how it works in 3D Studio Max”.\nAnd while programmers often grouse with justification that artists aren’t feeding suitable data into the production pipeline, it is incumbent upon them to provide the proper guidance, in the form of clear documentation and explanation.\nProgrammers often don’t like to commit to numbers early, but artists and game designers need reliable asset budgets to do their job within the proper constraints, just as programmers need to know the hardware and delivery constraints. If artists and designers actually ask for budgets and guidance on how to optimize assets, then by all means accomodate them.\nThe Producers # Producers can be useful, if they’re not puffed up by the term “producer”. They’re the only the part of the production pipeline that doesn’t actually produce anything (except those producers who produce funding — they get to be called “executive producers”). A better term would be “facilitator”.\nIn the worst case, a producer will just cause more work for everyone else. The last thing a game project needs is a high-maintenance producer.\nI was once plagued by a throng of producers who would hold daily status meetings, carry around lists of tasks and ask everyone to update the number of hours remaining per task on the lists (none of which matched), and stroll around asking, “So…what are you working on?” After may of the producers were laid off due to tightened funding, the project ran more smoothly.\nBut a knowledgable producer who is focused on keeping things running smoothly is indispensable.\nI was vastly relieved that a survivor of the aforementioned layoff was an assistant producer who did a fantastic job of keeping on top of things. Every time I needed clarification on a game feature, he had the answer, knew where to get it, or could make a reasonable call on the spot. In any case, I had an answer within minutes. And he was the guy who ordered all the late-night meals.\nAt least producers in development shops have an idea what it actually takes to make a game. Producers who’ve only worked for publishers are less knowledgable and more self-important.\nOne stupid publisher trick: planting a producer at a developer’s office during crunch time to make sure they’re all working late into the night. When I showed one of these producers, who was camped out in my office during one of these crunches, the set of game design, production and business books on my shelf, he commented his boss had recommended he read some of them. And then he kicked me out of my office so he could have it to himself.\nThink Inside the Box # “Think outside the box” is an oft-misused mantra. Questioning your underlying assumptions brings about innovation. Just making stuff up is a waste of time.\nIn high school, I joined other students who wanted to pad their college applications by competing in a statewide brainstorming competition, where we attempted to outdo each other in constructing the most fantastic scenarios possible. Odds favored those who most lost touch with reality.\nWhat separates game artists and programmers from their brethren in other fields is the ability to create for resource-constrained platforms.\nScreen Size # Take into account the screen size. For PC games, you have to decide how many standard PC monitor resolutions, refresh rates, color depths, and full-screen vs. windowed modes you’re going to support, and be sure to test the game with those settings. Even with console games, you may have more than one setting to worry about. If your game will be in both the US and Europe, then you need to handle both NTSC and PAL, which have different screen resolutions, with corresponding aspect ratios and memory requirements, and different refresh rates, which may affect any game behavior dependent on per-frame computation. And there are other modes like EURGB60, M-PAL, 480p (progressive scan) and multiple levels of HDTV.\nPreprocess Everything # Data created by game artists and designers eventually gets converted into formats usable on the target platforms. PC game engines often defer this conversion until runtime for convenience, but for consoles, where memory is comparatively limited, loading from disc is slower, and the main CPU may be relatively underpowered, it is important to have as much data preparation and optimization done offline as possible. Even for PC games, while developers may be lulled by the latest and greatest in PC hardware, there is still a customer base with configurations a few years old, and if they were budget PC’s then, imagine how limited they are now.\nGet Lots of Hardware # Game development schedules are always tight, and even expensive hardware is cheap compared to personnel cost and the cost of missing a milestone and having your project cancelled, or missing the holiday retail season and losing out on those sales. Cutting-edge hardware, especially console development kits, is notoriously fragile, so you want to have extra units on hand if and when the hardware fails.\nAlmost every time I’ve worked on a console game, the game development hardware malfunctioned at some point and had to be sent back to the console maker for repair. In each case, the turnaround time was no more than two weeks, but two weeks on a crunch time project with monthly milestone deliverables is crucial. Fortunately, the developers always had on hand an extra kit that could be repurposed from less critical tasks.\nAnother reason to have redundant development hardware is to identify bugs that are due to glitchy hardware versus those present in your game.\nNear the end of one console project, I ran into crashes of our game that occurred after several hours of the game running idle. Since we had multiple test kits, I could run several soak tests in parallel and isolate the crashes to one unit, and thereby conclude that it was a test hardware problem (and it was verified later that some units were known to have overheating issues)\nConsole games have the advantage that you only need to verify proper operation on a very limited set of configurations. For PC games you should have a variety of different hardware, operating systems, and various configurations for testing your game. This is true for cell phone games, too — phone models vary in screen size and color resolution, refresh rate, memory, etc.\nI nearly missed one Windows compatibility issue with a PC game after Microsoft introduced a service pack that removed support for a video codec that we used for an FMV (in fact, the codec was used by one of our middleware vendors). None of the development or test machines used by the developer had this service pack, but fortunately the publisher’s salespeople noticed the problem when they installed the game on their demo laptops. (when you’re relying on your publisher’s sales team for QA, you’re just asking for it!)\nLess is More # More than in most other software fields, game development is about efficient deployment of assets.\nThink Small # Game designers and artists often believe it’s easier to create more content than you need and pare it down as needed than to start small and add. This may be true in the “micro” sense but poses huge risks in the “macro” sense, particularly for console game development. One of the common “crunch time” factors in console games is the late attempt to get the game running in console memory. Usually this problem is hidden until an incovenient time by the fact that content developers usually develop on PC’s (and sometimes XBox’s) with high-performance graphics hardware and several times more memory than a console. And programmers, too, will develop on console devkits that feature more memory than the retail consoles.\nMany designers and artists complain about the constraints of video game development, but I was gratified to encounter one exception. A junior game designer who was ordered to pare down his level commented to me that his level was actually improved by the streamlining — it forced him to make sure everything that he did retain was effectively used. Constraints are a good thing — they keep us from wandering all over the place trying out everything possible and instead focus on validating the cliche — quality over quantity.\nEvery Polygon Has a Price # Each polygon, texture, and frame of animation should be justifiable. Serving as “eye candy” isn’t enough reason to put something in.\nOn one front end I spent quite a bit of time debugging some animated hieroglyphic textures, only to find out later that those icons had no connection to the game at all — they were just there for artistic, but meaningless, effect! HUD’s in particular tend to echo the worst of web design, ranging from the early blinking text to the modern Flash-filled pages. Games should be no exception to the principle that the interface should not get in the way — the best interfaces are interfaces that you don’t even notice.\nSound Advice # What goes for graphics, goes for sound.\nLaboring under the misconception that more options are better, one game developer president stated that our extreme sports game should allow ambient sounds and the soundtrack to be played concurrently. It turned out that loud rock songs easily obscured twittering birds in the background and hardly warranted the extra development complexity (the console had hardware support for just one stream). Another game had a list of sound effects for every element on the HUD, potentially resulting in a Las Vegas slot machine effect — the sound designer threw out most of them.\nMore is not necessarily better, and often it’s worse. Imagine all the sounds that could go off at once doing so, and scale it back if the result is cacaphony.\nDialogue # Same goes for dialog — every line should have a purpose. We don’t want voice-over (or text-over) dialog distracting from the interactive flow of the game, and each piece of dialog requires space, scripting, services of a voice actor (if voice-overs are used), rework if the dialog has to be rewritten or different voice actor is selected, and translations and re-recordings if the game is localized for different regions.\nOn one game project where I script-doctored the dialog, the publisher looked over the results briefly and asked for some crowd NPC dialog in one of the “cinematic” fight scenes. I added it just to keep them happy, but sure enough, once the level designers worked in the voice-overs, it was just a big muddle.\nOne practice I have used in writing game dialog is to include notes at the beginning of each section explaining what the dialogue is supposed to accomplish. Some of these objectives are the same as in any story, e.g. increasing empathy for the player character, establishing the badness of the bad guy. But dialogue can also highlight aspects of your game — if you hear the NPC’s talk about what they see or hear and how they coordinate amongs themselves, then you know the capabilities of the game AI.\nAnother thing to keep in mind is that scriptwriting for games is really more like scriptwriting for animated features rather than film. As with the former, you can’t rely on the range and subtlety of visual expression conveyed by human actors, so you must make sure it’s clear in the words.\nFirst Things First # As a general rule, anything that can be completed early in the project should be completed early. Get it out of the way, let it get tested thoroughly, and leave crunch time for the hard stuff, of which there will be plenty.\nFront End # The front end is typically an afterthought, fleshed out in the final months of a the game development, but it really should be one of the first things implemented. Even if the front-end requires some assets that will not be finalized for a while, placeholders can be substituted.\nCompleting a front end early provides a real functioning component of the game that can be demoed immediately and shows you’ve got more than just some storyboards and mockups with Flash.\nDesigning the front end early forces the game designers to complete the game design to that extent, so critical decisions like game modes (single-player, multiplayer, story, arcade, etc.), scores, game-save interface, are resolved early.\nImplementing the front end early gives the developers (and anyone else who sees the game, including the publisher) a specific idea of what the game is about. A common complaint among developers on game projects is that they don’t understand what the game is supposed to be about — starting up the game in the same way as the eventual customers can alleviate that problem.\nImplementing the front end early will expose design flaws, logical inconsistencies, and potential incompatibilies with the console makers’ requirements, e.g. memory card usage. Developers usually implement shortcuts that start up whatever level or feature they’re working on or testing, but then they get in the habit of relying on these shortcuts and the front end is not well-tested.\nMedia # The final distribution on media may seem like the last thing to take care of, but again, it’s something that can and should be done early. Preparing the game assets for the target media is typically an elaborate process, and it’s best to get a handle on that before crunch time. And ideally, you want to test the game running on the media as soon as possible, so you’ll know if load times are acceptable, sound and FMV streaming works, and even if the game fits on disc. Many games now depend on “world” streaming, so it is crucial to verify that disc performance can keep up. Console development systems often provide disc emulators, but the performance characeristics often do not properly match those of the real hardware. I’ve seen games work perfectly on the emulator and then, a rude disappointment, fail when run from disc, sometimes just before a required milestone delivery.\nFirst Playable, Last Shippable # Programmers complain the design is late and the designers complain they can’t finish the design until the programmers have the game up and running so they can tweak it. They’re both right. So while it’s probably not a bad idea to do as much in preproduction as you can, you can hedge your bets by working toward a “first playable”, consisting of at least one, but no more than three levels of the game.\nThis allows you to start off your project with a smaller team while you implement your core technologies and work out the basics of your game, and then you can staff up later to crank out the remaining levels.\nThe smaller target allows you to get to the playable point faster than if you tried to develop the full game at once. This allows you to reach a point much earlier at which you can evaluate the gameplay, asset budgets, target performance, and if the result is satisfactory, then you have a demo for the trade shows and game magazines.\nIf it turns out that the game is fundamentally flawed (or just not what the publisher wants), which is not uncommon, then you can change direction or even start over much more easily than if you had invested a full team and spent much longer in getting the game to a playable point.\nNote the first playable is not the same as a prototype, which is basically a minimal demo that you shop around to get the deal. The first playable is really playable, which means it has all the user interface elements, game saves, functionality and polish that you would see in the final game.\nGoing International # Localization is another typical afterthought. But as with everything else, get things ready early, so you won’t have to deal with it in the crunch.\nWho’s Your PAL? # PAL resolution is slightly different from NTSC — in particular, the aspect ratio is slightly different, so you’ll want to verify that 2D elements in particular, such as the front end, text, HUD and movies, still look OK. The higher vertical resolution of PAL also can mean greater main or video memory usage.\nI was astonished to find in one huge game project that none of the programmers had access to a PAL-capable PS2 devkit. They resorted to kludging in the code and then sending off a special build to QA for them to see if it really ran. The PAL frame rate is also different, so anything in your game dependent that assumes a certain frame period, e.g. movies or code executed per frame that doesn’t take in account real time elapsed, will behave differently.\nWatch Your Language # I’ve seen more than one project where it was assumed that the publisher would deliver localized assets (text, audio) just once, and that the assets would be correct and final. That’s a pretty unrealistic assumption — publishers will express the importance of getting a game finished on time in no uncertain terms, but when it comes to deliverables from their in-hous departments, don’t expect them to respond with the same urgency.\nAt one developer working on a console title for the US and Europe, the president of the company assured me that the localized text from the publisher would be correct and final, so not to worry that the deliverable would happen just before the ship date. As it turned out, the holiday retail season came and went as we went through several iterations of the localized text, with 3–4 weeks between the updates. One of the near-final deliveries was incomplete because our producer contact took off for Christmas vacation without bothering to give us a complete set of corrected translations (and he didn’t mark which ones were changed — that was considerate!)\nWhen you do actually receive translations, chances are they’re not going to be suitable.\nThe translation may be inappropriate for the desired context. For example, “button” could be translated differently depending on whether it belongs to a controller or piece of clothing. Or the translation may be just plain wrong. I’ve received translations that left me wondering if the publisher had just hired some beginning language students from the local college. In many cases, I’ve had to rely on European coworkers and the internet to find the right translations. Console makers typically require certain phrasing as part of their submission requirements. This can cause your submission to be returned several times until you get it right.\nOn one localization project, we went through several iterations of translations for the various mandatory disc and memory card error messages, until the console maker published a set of recommended translations for all of them. Upon which I gladly tossed out all of our publisher-provided translations.\nFinally, translations may not fit in your existing on-screen buttons and other user interface elements, so you’ll either have to find shorter translations or rearrange your screen. You’ll probably need to load multiple new fonts, increasing your asset budget, and if you have a type-in screen, arrange to display all of those characters. All the more reason to set up your game for localization early and avoid rearranging a bunch of your screens later.\nIt’s Software Development # Although game projects bear an increasing resemblance to Hollywood projects, game development is still fundamentally software development, yet despite being possibly the most challenging form of software development, the game industry lags behind other industries in software engineering and management practices.\nOffice Space # It is conventional wisdom by now, supported by studies, that programmers are more productive (and less irritable, I might add) in their own offices. The elite technology companies like DEC used to make a point of getting programmers their own offices (if you were senior enough, you got a window).\nOne of my favorite employers, BBN, was one of these companies steeped in technology culture and provided individual offices for each of their engineers, until the fiscal pressues of the early eighties prompted them to move to cubicles and euphemisms (“come see our new open office environment!”).\nThe game industry, on the other hand, is the only software business I know of where people, including engineers, talk about cubicles and open “bullpens” as productivity-enhancing. This is a case where the appearance of activity and interaction doesn’t mean more productivity — more likely there’s an inverse relationship.\nIn one particularly abysmal game company, I was crammed into an office with two other programmers, with the finicky one sitting three feet from me complaining that my typing and mouse-clicking was too loud. (Apparently, he’d never heard of headphones) As a bonus, the men’s toilet on that floor was not designed to handle twenty male game developers and clogged up constantly (now I know why the British call it a “bog”) — combined with the lack of air conditioning, it made for swampy weekends.\nNot the best environment for the regular workday, much less long work hours, which brings us to….\nAvoid the Crunch # Crunch time happens everywhere, but outside the game industry it’s recognized as a failure of management. In the game industry, however, even while paying lip service to the notion that crunch time is a bad thing, publishers and developers trot out the same trite spiel — it’s an unavoidable consequence of industry pressures, management has to tell developers to stop working and go home because they are motivated to work so much!\nThat’s quite a conceit. It’s one thing for someone to get on a roll and work through the night to get something cool done, it’s quite another for management to mandate 12-hour work days and weekend shifts for months at a time. It’s ultimately a self-defeating proposition.\nEveryone has a natural pace and level of productivity. The reliable key people on your team will put in the extra hours, anyway. Everyone else will just hang around the office longer, web surf more, and just get on the nerves of those who are really working. In either case, they will resent the disruption of their personal lives due to mismanagement of the project schedule. And they won’t be completely wrong.\nContrary to popular belief, crunch time does not engender an increased level of production — you get more code and assets, but you get more mistakes due to rush jobs, weariness, and decreasing motivation. The risk-reward balance of crunch time is becoming more dangerous as game projects get bigger and more money is at stake, especially for console games that are unpatchable and the only recourse for flaws introduced at the last minute is to recall the product from the retail shelves.\nThe Peanut Gallery # The cool thing about games is that everyone’s got an opinion. The bad thing about games is that everyone’s got an opinion. Playtesting provides critical validation of you game, but sorting the wheat from the chaff is required.\nFocus Groups # The problem with focus groups is a lack of. General comments often support the industry’s reputation for catering to adolescents — “Bigger boobs! More visual effects!” As with formulaic big-budget Hollywood movies, these elements may be reliable ingredients for drawing mainstream interest, but do you really need a survey to give you this information? Used in this manner, focus groups are just a pseudo-scientific way of reinforcing current preconceptions.\nA game company president was peeved that most of the team showed little enthusiasm for making our game more risque, so the only comments she emphasized from a focus group test were the juvenile ones asking for more skin (the sole female tester demurred, but her opinions were not considered useful). However, the game was based on a family-friendly license and was supposed to achieve an “E” rating, so we spent a lot of time at the end of the project toning things back down.\nBut focus group results can be useful, if you really focus on “finding the fun”.\nI was particularly impressed with one console maker’s rigorous in-house play-testing. Their testers would report initial impressions of the game, their impressions after one hour, then three hours, then eight hours. At each step, they gauged their level of empathy with the player character, their satisfaction with the visuals and audio, their frustration level if any with the difficulty level, and their motivation to continue.\nPublishers, Who Needs Them # Unfortunately, you do. At least if you’re working on a console game. As in Hollywood, publishers think that because they make their money off games, they know how to make games. And since they make money off one in ten games, they know what consumers want. And then there’s reality.\nDo not let a publisher design your game. If they were qualified to do that, they could develop the game themselves. Publishers should stick to their knitting — providing licensing, tools, testing, marketing, submission requirements, translations for localization, and most importantly, payment. Remarkably, I’ve seen publishers fail miserably in all these areas.\nOn one project I worked on, the publisher was late with the console development kits, borrowed more equipment from us for their other projects, paid late on almost every milestone, lost the license and then complained the game was too boring to sell (and it was fun with the license?), got briefly excited enough about the marketing campaign to order a case of custom-labelled Jones soda, and then lost interest and drank all the bottles.\nA commonly-stated excuse is that publishers are “just trying to make money”. That in itself is enough reason for developers to make sure they protect their own interests, whether it’s making a great game or just surviving. But as with any other business, such a statement is overly simplistic — any publisher you deal with is a mix of people who are out for personal glory, personal wealth, job security, and some may be actually trying to make money for the company and some may actually be trying to make a great game.\nI heard one publisher complain that they helped unknown developers get their start only to be left behind when those developers ended up on well-known franchines. Yet this publisher had a history of imposing tight schedules and low budgets on these hungry developers, and they would sell the resulting titles to other publishers at the first opportunity to make a quick profit.\nThe most successful game companies control their own fate as much as possible. The most successful game I’ve worked on relied almost entirely on in-house resources. An impressive marketing effort, including a fan site, magazine interviews, developer blogs, and even a comic book. The in-house QA group was knowledgable about console submission requirements.\nDon’t Be Evil # Publishers aren’t just often bad at their business — they are notoriously bad about business. In just the past few years I’ve heard of publishers going on group outings to strip clubs, granting projects to developers in return for trips to strip clubs (sense a theme here?), producers propositioning female developers, and even rumor of a publisher bribed with a new Porsche to get a project. Aside from the sleazy, there’s the adversarial. I’ve heard that a publisher lawyer at a game development conference stated the best negotiated deal for a publisher is one that bankrupts the developer. With this attitude, it’s no wonder taht a favorite publisher trick to enforce crunch time is to send a producer to camp out at a developer’s office and make sure they’re working into the evenings), And not only have I seen publishers make lame excuses (or no excuse) for late payment and non-payment to developers, I’ve encountered those tactics in my own contracts with them — contracts rewritten without informing me, micromanagement in order to penny-pinch (“spend ten minutes on this, fifteen minutes on that…”), and weasely attempts to get free work (“Oh, we thought you could just take a look at it…”)\nBut as easy as it is to blame industry woes on publishers, developers who engage in the same practices have my utter lack of sympathy.\nThe one time I heard management say they were opposed to mandatory crunch time work schedules, they shortly announced six months of required weekend work for the entire staff. And I’ve seen the same gamut of bad-client practices from developers, ranging from renegotiation of ongoing contracts (one client had a practice of this with her contractors, even telling me at the end of a contract “when I have time, I’ll let you know what I think is reasonable”), to blatant non-payment (on a project that was dragging on, the client said they had no expectation of paying me for the extra time, yet sued their publisher for the same thing), to sneaking in as much as possible into a contract (I started out at one developer with four weekly paid milestones which turned into two payments for four milestones which turned into one payment for four completely unspecified milestones and an unpaid “transitional period” of work.)\nAt times it seems developers and publishers are engaged in an unholy alliance.\nI’ve heard of developers expressing their “appreciation” to publishers with tokens ranging from gift certificates, birthday gifts, hotel accomodations, strip club outings, and even rumors of a car given to a producer in order to seal a development deal. I saw one breach-of-contract lawsuit filed by a developer against a publisher settled by not only payment of cash to the developer, but also a hefty pile of stock and a “consulting” agreement granted to the developer’s president. It’s not uncommon to see the owners of a game developer shutter the company, leaving the employees unpaid, only to start up a new venture. Who suffers? The rank and file.\nI’m the last one to defend publishers, but sometimes you guys deserve each other. Don’t be part of the problem.\n","externalUrl":null,"permalink":"/books/techsoft/makeagame/","section":"Books","summary":"This essay is somewhat dated, as you can see by the section on NTSC/PAL\nOnce you can remove no more, you are done.\nGetting Started # My first piece of advice to anyone contemplating a game development project — don’t. (Well, at least not until you know what you’re getting into.) But if you go ahead, anyway, here are some tips beginning with staffing:\n","title":"So You Want to Make a Game","type":"books"},{"content":"A canna’ change the laws of physics. I’ve got to have thirty minutes.\nWhat is a Schedule? # On many projects I’ve been told there is no schedule — either as a complaint (“We don’t have a schedule!”) or boast (“We don’t have a schedule!”). But there is always a schedule, and you’ll find out what it was when you don’t meet it.\nDuring an interview with a prospective client, I was told “we’re not going to release this product until it’s ready.” Soon after I started working there, the president of the company called an all-hands “come to Jesus” company meeting, where he yelled at everyone for not having the product finished several months ago.\n“We won’t release the product until it’s ready” — famous last words. Only well-funded and self-funded companies can really say it, mean it, and do it, and you usually hear this said after a product misses it’s original release date. So how do you make schedules you can meet and meet the schedules that you make?\nBefore blathering on about effective project scheduling, let’s be clear about the definition of a schedule. A schedule is an expectation of delivery dates — most importantly the product release, but also key demos, milestone deliveries to customers, promised interim release dates. Don’t confuse the schedule with a glorified task list, a daily to-do list, or lines of code written per day.\nThe management of a startup company that was cruising in research and development was obviously getting restless, so I suggested we establish a schedule. This inspired the project manager to establish a day-to-day task list for each engineer during the next two weeks. When I clarified that I really meant “when do we have to have something you’re going to show”, upper management commiserated and then informed us that we had to show a demo to investors at the company launch party in a few weeks! The micromanagement list went out the window and we scrambled to implement the key features needed for demo. (We came close, but I can’t say it was a success — we got the demo running just as the party was winding down, and the funding fell through.)\nA project’s life or death hinges on getting good demos in the premier trade shows, satisfying contractual deliveries to clients, and timely appearance on the market. The entire project revolves around these expectations, so the first job in scheduling is to figure out these expectations and make them and their assumptions explicit.\nIt’s a Deadline, Not a Guideline # After understanding what a schedule is, the next important thing is to take it seriously. Know your schedule, and make sure everyone on your project knows it.\nI was astounded on one project when I casually mentioned our recent product release and a fellow engineer on the project didn’t know what I was talking about. But I couldn’t blame him for that head-in-the-sand mentality — our management would announce “stop coding, we’re making a release today” and then justify it with “well, the beta release date was last week.”\nAny computer scientist should be able to tell you that constraints are a good thing when it comes to problem-solving — they narrow down what you can and can’t do. Take advantage of the fixed milestones in your schedule, like trade shows. Milestones that you can’t shuffle around in self-denial are useful, like the scale that won’t lie about your weight.\nEvery missed deadline means the next one will be taken that much less seriously. And every project that runs overtime means the next project will start and end that much later.\nIn a surreal moment, just a few weeks before a product release, timed to coincide with the premier industry trade show, and right after I’d dissuaded the company president from demanding new features by pointing at the bug list, a well-intentioned marketing manager suggested to me “why don’t we postpone the release by a month so you guys have more time to work on it?” Setting aside the trade show, which should have concerned him more than me, we had a supplementary feature release scheduled just three months after that, and then big upgrade a few months later. Delaying the release by a month would have just delayed all the other releases. And it wouldn’t have saved us any work — we would just have been behind by one release month.\nStick with the schedule. There’s always a next time, if you get this one done on time. And while delivering late is criminal, there’s no sin in delivering early.\nFor some reason, even when given the option to either a) release the product early or b) take the extra time to test the product, management usually elects option c) squeeze in a new feature that jeopardizes the the product and the schedule. (In fairness, engineers are often complicit — “sure, it’ll just take an afternoon”). The one time I’ve seen a product delivered early took place after the president of the company gave the development manager a fake release date. I can’t imagine that working more than once, though.\nIt’s Macro, Not Micro # When I shop for groceries, I know it’s not going to take more than half an hour, and I’ll spend about forty dollars (sixty, if I’m hungry). I know this because I’ve bought groceries before, and that’s generally how long and how much it takes.\nNow, if I plan my grocery expedition by listing all the items I think I’m going to buy, estimating the unit price of each item, and predicting how much time it will take to park the car, locate each item, stand in the checkout line, and unload each item, my schedule will be off by the time I reach the first aisle. It’s unlikely that my predicted individual prices will be on the money, so to speak, but it would be a waste of time to recalculate my schedule every time I find an item and its actual price. Even if I have a detailed grocery list written down, I’m only committed to the items I really need (can’t postpone getting that cat litter) — I may purchase additional items that happen to be on sale and omit items that turn out to be too expensive or are unavailable.\nThe same goes for project scheduling. Estimate project durations based on what you know of previous projects — that’s where experience comes in, and that’s a big reason why senior engineers should get paid more, if they’ve learned anything. Estimating project durations by summing up individual tasks only works if you’ve worked on exactly the same kind of project before and know every single task and possible schedule deviations that could happen in that type of project. In which case, you’d already know how long the total thing took, so why not use that, anyway?\nI worked on one distributed simulation project where the manager’s office wall was completely covered with a Microsoft Project schedule. I assume this included every task going into the project (and maybe tasks not going in). But this project actually had a very simple schedule — have the simulation ready for the exercise date in six months, or the exercise would proceed without us. Major milestones, like having the software components ready for integration, the network hardware up and running comfortably ahead of the exercise date, and even my security clearance so I could start work, took months longer than they should have. Yet we had our meetings where everyone reported that everything was going fine and more paper went on that scheduling wall. The final month of that project was an exercise in panic and triage.\nSchedule the major milestones first — the final release, the beta and alpha releases, and the interim milestones like first QA release and trade show demos. These are your hard targets — everything else can, and will, be more malleable, as you find certain technologies are working out better than others, you have to deal with staff turnover, sick days and vacations. I personally don’t feel it’s useful to schedule tasks to a granularity smaller than a week, but regardless, don’t let your micro-schedule drive your macro-schedule — tracking low-level tasks looks good on paper, but the feeling of control is illusory — it’s no substitute for “macro” planning.\nIt’s Not a Negotiation # I’ve worked with managers and clients who would ask for a time estimate on a task, and then respond to the estimate with “why should it take so long”, or “can you get it done sooner?”. But if you’re taking issue with an estimate, that indicates you already had a preconception of what the estimate would be, so that\u0026rsquo;s annoying. And it\u0026rsquo;s counterproductive.\nRemember what a schedule is — a prediction. I have allowed myself in some cases to lowering time estimates in these “negotiations”, but it didn’t change how much time the task actually required. If, as a manager, you ask for a lower time estimate (and it\u0026rsquo;s always a lower estimate), then you\u0026rsquo;re saying the original estimate is wrong, and if you get a revised prediction more to your liking, you should ask yourself why the revision is more believable than the original prediction.\nAs a client, you may want to bargain down on price, but bargaining down the time estimate will just backfire on you — the project will take as long as it takes. That doesn’t mean you cannot shorten the time for a project, but it means making reasoned tradeoffs in features or resources. The right question to ask is “What can we do to get this project done earlier?”.\nSchedule Suboptimally # I used to have a terrible punctuality problem when I lived in Boston. Whenever an appointment time came around, I would tell myself I just need, say, fifteen minutes to drive down Memorial Drive along the Charles River to make a meeting around MIT. Invariably, after giving myself that fifteen minutes, I would still get started late, get bogged down in Boston traffic (sometimes I forgot to factor in the rush hour impedance). And then there was the time spent getting lost, if it was an unfamiliar meeting place, finding parking (certainly a high risk factor in Boston), and navigating the destination office building.\nThis planning could be charitably called “best-case” planning, but I think everyone would agree it’s a stupid way to schedule, especially after missing more than one meeting (including job interviews) by a wide margin. Nowadays, I’m much better at this — partly because I moved to California, but also because I do take in account how long these trips usually take, and I give myself some extra time in case traffic is slow or I have to stop for gas.\nSoftware projects should be scheduled the same way. Look at how long it’s taken your group to do similar projects and add some safety time to take in account things that might happen. You don’t necessarily have to take in account worst-case scenarios — I don’t factor in potential three-hour freeway stoppages when I plan my outings (although they do happen once in a while). But do consider carefully how much risk is acceptible, a question that is de rigeur in other aspects of engineering.\nThe First Schedule is Always Right # One consequence of making a distinction between the macro schedule and micro schedule is sticking to the initial macro schedule. The schedule you set down at the beginning of a project is most likely the correct schedule — you’re basing the delivery date on market considerations, expected budget, staffing and technology capability, and the beta, alpha and interim milestones all fall from that. At this point, you’re most free of wishful thinking influences — the schedule should be consistent with your experience from your own projects and others that this is a feasible schedule. Some things will take longer than expected, some shorter, but you’ll arrive at the expected time.\nThree months into a a one year development schedule to port a 3D graphics application from Unix to Windows, I suffered several bouts of unwarranted optimism. The user interface system was basically up and running, and I told my boss I thought at this rate, I’d have the project done six months earlier. Fortunately, he didn’t tell anyone. With Windows idiosyncracies, graphics card issues, tracking ongoing changes from the Unix product line, and battling a compiler that was also in a “pre-alpha” stage, it wasn’t long before it was obvious we were exactly where the originally schedule said we’d be.\nBut no good deed goes unpunished. Once it appears your project won’t be a disaster, everyone who was keeping a healthy distance away will suddenly show up to “help”.\nTen months into a year-long crunch project, at the beginning of which it was wisely decided to pare features to enable a release by the next industry show, my boss suddenly wanted to put those features back in. He went around me (he knew what I would say) and asked some of the more optimistic and eager-to-please engineers to put in the features. After several days effort, I put my foot down and explained we already had a hundred and fifty bugs marked by QA as critical, and we could not afford the time to put in new features. “Oh, I didn’t know we had so many bugs,” was his lame acquiescence.\nOn a game project at a different company, the president tried to accelerate the project by promising game delivery two months ahead of schedule. It seemed like things were going well, and finishing this project early would have let us get started on the next game, so I agreed, but once again, I was wrong. When we reached the revised deadline, we were just starting to find all the bugs that had to be fixed, including extensive requirements by the console makers, whose approval we needed to distribute the game.\nSo we went back to the original schedule, but during the last week, once again, the president tried to advance the submission date by a couple of days. And once again, we didn’t make it. Worse, for every attempt to finish early, there was an extra flurry of activity, extra builds and late nights, that essentially wasted our energy and sapped the momentum of the team. When you’re taking catnaps in your parked car during the day, you’re probably not producing quality work (especially if you own a compact car)\nThere will always be at least one point in the project where it seems like things are going better than expected. It’s not. If the project actually gets done early (but it won’t), then ship it, and if you want to maximize the chances of that happening (but it won’t), then focus on getting those requirements done and avoid other distractions, like additional features.\n","externalUrl":null,"permalink":"/books/techsoft/artoftheschedule/","section":"Books","summary":"A canna’ change the laws of physics. I’ve got to have thirty minutes.\nWhat is a Schedule? # On many projects I’ve been told there is no schedule — either as a complaint (“We don’t have a schedule!”) or boast (“We don’t have a schedule!”). But there is always a schedule, and you’ll find out what it was when you don’t meet it.\n","title":"The Art of the Schedule","type":"books"},{"content":"When I get together with my old college pals, we typically regress and complain bitterly about the lack of women (this was back in the eighties), the concrete surroundings and lousy weather, how we missed out on the fun we’re sure everyone else had at other colleges, and finally how they didn’t teach us really practical things. Mostly we complain about the women. But as far as practical knowledge, looking back, I can see there were plenty of unintentionally imparted lessons about real life in the engineering world.\nWork Alone # My software engineering course, 6.170 (MIT classes are known by number rather than name), consisted of successively more complex projects, starting with small modules with well-defined interfaces and culminating in three-person projects where we would partition the application into modules assigned among us and then put everything together for a demo (and our final grade).\nOur project that year was a Reversi game — my teammates worked on the user interface display and keyboard input, while I worked on the actual game engine. My teammates alternated between sending me pointless talk messages in the lab (for you youngsters out there, the forerunner of instant messaging), complaining about my absence when I wasn’t in the lab, and then covered their own asses when our program displayed an obviously incorrect board in the demo (“See, the user interface is working, his game engine must be the problem”).\nOne could draw an important methodology lesson:\nIntegrate early and often.\nBut I think there are some overriding lessons in this case:\nAcademics don’t know anything about software engineering. Setting aside the faith in the design-partition-integrate process (isn’t that cute!), using a research language only used at MIT on an obsolete operating system (TOPS-20) on slow machines in an overcrowded lab isn’t a recipe for productive software engineering. Although that’s probably how we ended up with the current state of the air traffic control system.\nDon’t work with anyone else if you don’t need to. I could have done the entire project myself in less time (and I did, for my bachelor’s thesis — a Reversi program running on an experimental multiprocessor machine).\nKeep it Simple # As the final project of my electronics lab course, 6.111, my partner (who went by the moniker Psi) and I wanted to build a computer. My partner wanted to build a Lisp machine — the Lisp machines of the time involved a lot of memory and software, typically selling for $100,000, so I persuaded him to scale our ambitions down to a Forth machine.\nBut then our teaching assistant looked at our design proposal and felt it wasn’t complex enough and required us to double our chip count. After sleepless nights burning programmable logic arrays, finding/returning/replacing faulty chips, we had a wiry mess of lights that occasionally blinked out a correct computation.\nThe engineering lessons learned:\nWatch out for long wires — the digital abstraction doesn’t always hold when inductance gets in the way.\nThe real lessons:\nEstablish a good relationship with the suppliers. The old men staffing the lab parts department would give the best, i.e. working, parts to the pretty girls (“she has better parts”, one of them replied when asked why he gave atypically good service and components to one of the female students), and recycle the burnt out chips among everyone else.\nKeep the design as simple as possible. Adding complexity just for the sake of it is just risk maximization — not something you want to do in real world engineering projects, unless you’re graded on complexity and not a working result.\nKeep It Working # I did build a functioning computer in the undergraduate computer architecture course (possibly my favorite), 6.115. The course progressed through the construction of a computer from scratch — and I mean really from scratch, building the processor and clock, wiring the data pathways, and writing microcode.\nThe end of the project featured optional entry in a performance contest — if your computer is the fastest, you get to keep it (worth a couple hundred bucks). The hardware guys could add optimizations like caching — I restricted myself to the many obvious optimizations available in the microcode. But even with software changes, there was a long turnaround interval in getting them burned on the PAL’s. In the end, I was unable to enter because my changes were buggy and I didn’t have time to debug-fix-burn-test.\nMy hardware engineer friends might say I should have left the software alone and worked with hardware, but the fact is, only a few people entered the contest with working kits, and only the winner had achieved a significant performance improvement. So the lesson learned is:\nKeep your system in a working state. If I had made one minor change per PAL burn instead of trying to make every optimization I could think of, I would have entered the contest with a handful of optimizations and at least placed second.\nSteady Wins the Race # I was a crunch-time student (which, ironically, has prepared me for common industry worst practices). It seems in hazy retrospect that I stayed up every night cramming. The result was academic probation my second year followed by mediocre grade points the rest of the way.\nI noticed the students who had perfect grade points weren’t the whiz-bang smartest — they were the ones who kept regular schedules and maintained discipline, closing their dorm room doors to study, eating regular meals and going to sleep at midnight.\nSo I wouldn’t go so far as to say slow and steady wins the race, but steady is important.\nDon’t Work from Scratch # I tried to do all my homework (“problem sets”, they’re called at MIT) by myself. Mistake. There’s a time-honored tradition of, shall we say, collaborative work among MIT undergrads, assisted by class “bibles” containing assignments and exams material, meticulously assembled and lovingly passed down over the years. When the professors, clued in or not, see their students handling the class material easily, they increase the workload (hence the on-campus popularity of the phrase, “drinking from a fire hose”) until the curve is back down to where they like it.\nTrying to learn everything from scratch is a loser’s game — take advantage of available literature. This isn’t to say you shouldn’t learn the material — if you’re going to apply the knowledge, you have to learn it. A fraternity member in one of my classes turned in a photocopy for his homework. Now, that’s just too much.\nRead the Documentation # My woeful track record on hardware projects over three years was compounded by my inability to use the ultra-cool and completely mystifying Tektronix oscilloscopes that populated the labs. I would twiddle the knobs helplessly until a TA would come by and click-click all of a sudden I had a nice waveform on the screen. When I wrapped up the final project of my final lab in my final year, I happened to look behind the instrument and realized each of them had a manual.\nRTFM\nRemember Presentation # When I was there, the undergraduate MIT body boasted a three-to-one male-female ratio, a marked improvement over previous years (and vastly superior to Caltech’s nine-to-one ratio, which scared me away from that school). I could count on my male friends to ditch me any minute they had a chance to talk to a female classmate. But on Friday nights they gazed turned to the buses from area all-female schools disgorging perfumed, coiffed high-heeled undergrads looking for MIT frat parties, while MIT women in jeans and t-shirts looked on in irritation.\nWhen there’s competition, packaging counts.\nKeep Your Standards High # MIT does try to attract a diverse student body — at a party hosted by the chairman of MIT, a classmate of mine hailing from Michigan asked a representative from the admissions office if MIT gave preference to applicants from underrepresented regions. The rep explained that MIT gave consideration to the educational obstacles Midwesterners might encounter.\nNotwithstanding that politically-correct response (or else the admissions officer really thought I studied by candlelight after putting the hogs back in the pen during my high school years in Iowa) you can’t get into MIT, and you definitely can’t get out, unless you can get through the math and science courses. And MIT doesn’t have catch-up courses for varsity athletes or “physics for poets” that even the Ivy League schools have. You have to pass all the core courses that everyone else has to, and that includes the swim test. And you don’t get in by being pretty — MIT doesn’t require a photo with your application, unlike Stanford (and, oddly enough, CalTech — maybe it’s a California thing).\nFurthermore, as an MIT undergrad, you get very bright peers, famous researchers as your instructors (and some of them are excellent instructors, too), access to cutting-edge facilities, and opportunities to participate in research. Besides the brand-name degree, you come out of that institution with high standards.\nI came to that realization soon after graduating and moving to Texas. The sales guy who sold me my first car at Toyota of Irving asked me if MIT was in Minnesota. Slightly more informed was my coworker at Texas Instruments who stated upon meeting me that he would have gone to MIT if he had known about it. (I thought that was the dumbest thing I’d ever heard, but it was my first day) And a few years later, I was astounded by the level of whining I enountered as a teaching assistant at Johns Hopkins for Computer Literacy 101 (the name says it all). At MIT I listened to bragadaccio about consecutive all-nighters and a lot of persistent negotiation for grades, but the elite students of JHU were upset at me for not announcing the exact questions to expect on their exams.\nEven when your expectations are low (and to be pragmatic and realistic, they often have to be), maintain high standards. Smart People Are a Dime a Dozen\nAt MIT, everyone is bright, and some are super-bright. Some super-bright people are total jerks, and some are the nicest you’ll ever meet.\nI had one famous computer scientist as an instructor who bore down on a student for not knowing how to solve a digital signal processing problem — after she protested that she didn’t know the complex algebra required, he said, “come to me after class, and I’ll teach you complex algebra.” And then, after class, he told her, “I don’t have time.”\nIn contrast, I had an equally famed materials science instructor who set aside office hours to meet with any of his dozens of students who needed help on their homework, even though he had plenty of teaching assistants. So when I join a company and hear how smart the people there are — I’m not impressed. Unless they’re also good people to work with. That’s a lot harder to find.\nTheory and Practice # Despite boasting some of the brightest minds and a top-ranked business school, MIT is hardly a flawlessly-run institution. How many other industries can get away with increasing prices faster than the rate of inflation? Any illusion I had that MIT was a smoothly-running machine was shattered when, as a part-time system administrator, I had to run a purchase order by four consecutive desks in the purchasing office, where the form was literally rubber-stamped each time, only to return across campus to my supervisor, who looked at it and said, “this isn’t right”.\nYou can have smart people, lots of money and the latest technology, but your execution can still suck.\nAnd like any other bureacracy, MIT seems to run smoothly most of the time, but when something goes wrong, fixing it is like arguing with a rock. I didn’t get paid the entire summer I worked at the MIT Microcomputer Center because my manager repeatedly submitted my monthly timecard late (and lied about it), and that gets you shrugs instead of paychecks from the payroll office (I got paid after complaining to the Information Services director that I had tuition to pay, and my boss got a nice referral to a cushy job at another high-profile university) When I later worked in one of the MIT labs, it was Fedex who had a similar problem — they refused to accept deliveries from us for a while because MIT’s account was in arrears.\nTop-notch institutions attract the best and the brightest, but that doesn’t mean they don’t also attract the worst.\nMy favorite encounter with mindless MIT bureacracy came after graduation. The student loan department sent me a letter saying they didn’t have my address. (I suppose I should have called them and complained I didn’t have their phone number). The humor of the situation was diminished by the late fees they charged me.\nDon’t Trust Politicians # Before graduation, some of my classmates in the student government went around asking for donations to our class gift, a scholarship fund. They neglected to mention that only members of the student government or varsity sports were eligible. Members of the unique and probably more useful organizations like the Lecture Series Committee (they arranged popular weekly showings of modern and classic movies and hosted such distinguished speakers as William Shatner), were left out. Even at MIT, nerds get screwed. Or, as they say in New England, scrod.\n","externalUrl":null,"permalink":"/books/techsoft/whatilearnedatmit/","section":"Books","summary":"When I get together with my old college pals, we typically regress and complain bitterly about the lack of women (this was back in the eighties), the concrete surroundings and lousy weather, how we missed out on the fun we’re sure everyone else had at other colleges, and finally how they didn’t teach us really practical things. Mostly we complain about the women. But as far as practical knowledge, looking back, I can see there were plenty of unintentionally imparted lessons about real life in the engineering world.\n","title":"What I Learned@MIT","type":"books"},{"content":"After reading the first edition of Richard Rouse’s Game Design: Theory and Practice years ago, I wondered if the game design principles he listed could be applied to “designing” game dev itself — hence, this essay written some years back) As a break from the usual advice on how to make your project run like a factory or how to impose your will upon the troops, here’s an idea — run your project with game design principles in mind. This article is targeted toward game developers, but it may be generally applicable.\nGame Design Your Project # Game development is the software engineering equivalent of an extreme sport — the combination of fast-moving technology targets, the complexity of integrating design, art, audio and software into a single production pipeline, the demands of publishers (sometimes reasonable, sometimes not) and the typical “death march” schedules should dissuade anyone who wants a normal life from joining a game project. And it doesn’t pay startlingly well, at least compared to other forms of software and media production.\nSo why would anyone want to be a game developer? And how do you motivate and retain game developers once you’ve got them on your project?\nWell, game companies typically list “a passion for games” as a prerequisite in their employment ads. Perhaps this is the key — if game developers are also gamers, we may be able to apply game design principles to attracting and motivating game developers. After all, with game projects, as with games, we want to attract participants, inspire them to work through and complete the endeavor, then come back for another round.\nIn this article, we see how far we can stretch this analogy by applying some game design principles to game project management. The principles are selected from the introductory chapter of Richard Rouse’s book Game Design: Theory and Practice. They are listed in their original order and with their original titles and categories, but are paraphrased for brevity.\nWhy Do Players Play? # Our initial query was: What draws game developers to this industry?\nThis is an appropriate first question to ask when designing a game. What brings game players to video games over other forms of entertainment? In other words, let’s figure out what are the unique offerings of video games so we can capitalize on them.\nLikewise, game developers could easily be working in other fields, other types of software development or media production. So once we realize the unique attractions of the game business, we can leverage them.\nPlayers Want a Challenge # Game players enjoy facing challenges in games, especially single-player games. These challenges entertain, provide intellectual stimulation, and teach lessons that can be applied to other problem-solving situations.\nDevelopers also seek challenges. Not challenges in the form of how-may-bugs-can-I-fix or how-many-hours-can-I-go-without-sleep, but, as in games, challenges that are intrinsically enjoyable and result in knowledge that can be applied in the future. Programmers want to implement cutting-edge algorithms that exploit the latest hardware yet operates within those hardware constraints. Artists want to create the best-looking models and animation within their given asset budgets. Game designers want to create entertaining and addictive gameplay experience through story, AI and level design.\nDevelopers also have a pragmatic motive for intellectually and creatively extending themselves. Career longevity depends on staying current with the latest tools and technologies (ask all the developers who were slow to make the transition from 2D to 3D). Game companies are constantly looking for experience with the newest generation of consoles, and developers are always eager to work on the latest hardware.\nPlayers Want to Socialize # Long before their appearance on computer hardware, games have mostly been social activities. Social computer games range from Quake-style fragfests with players typing insults to each other in the heat of battle, to massively multiplayer persistent worlds featuring chat-style interaction.\nIn my experience, even single-player games take place in a social environment, either in taking turns, watching others play, and kibitzing. Certainly in the heydey of arcade games, you could see crowds gather around superb players. And a visit to any of the countless web-based game forums will show that gamers argue vehemently about the merits of their favorite games as much as any sports fanatic.\nLikewise, many employees want a socially engaging workplace, where they can learn from their coworkers, banter and sometimes compete with them. Some companies have company picnics and Friday afternoon beer socials. Game developers have after-hours fragfests (which blurs the distinction between game development and game play even further).\nPlayers Want a Dynamic Solitaire Experience # On the other hand, sometimes players like to play games by themselves, either because no one else is around, or the player wants a dynamic interactive experience without the hassles of dealing with (real) people.\nEven in a social workplace, most employees need some time to themselves to get their work done. This is particularly true of programmers, who need to do a lot of thinking, (paired-programming aside) but everyone needs to don the headphones during some stretch of the day to get work done.\nIn a larger sense, the workplace also offers the developers refuge from the people of their “regular” lives — spouses, children, friends, pets. (I had one manager who, at 5pm, would start moving from office to office, ostensibly to talk with people, while his wife called random numbers to track him down.)\nThen there are those who don’t want their work hours to encroach on their non-work life. These employees prefer minimal distraction and regular work hours so they can get home in time for dinner with the family, attend evening classes, play in a rock band, or engage in whatever other activities that constitute their personal lives.\nPlayers Want Bragging Rights # Playing to win means getting respect from fellow players and bragging rights over them. This bragadaccio is evident in multiplayer fragfests, organized game competitions, and the high-score tables on game screens dating back to the early arcade games. This earned respect also includes self-respect — completing games and winning, even against the computer, can inject a shot of self-esteem into someone who might be athletically, socially or academically less accomplished.\nDevelopers would like to brag that they worked on the latest smash-hit AAA title, worked for game companies that are household names, worked with game industry luminaries such as John Carmack or Will Wright. Even just mentioning you’re in the game business is a good conversation starter just about anywhere. I’ve worked in half a dozen different industries, but only since I started developing video games (even lesser-known titles), have I gotten a reliably enthusiastic response from laymen, including the guy at Starbucks. When I was working on manufacturing software, on the other hand, talking about my work inevitably resulted in a glassy-eyed stare, even from fellow programmers.\nPart of the thrill in working on a game is seeing your name in the credits. I don’t really like the idea of displaying credits in a game — it certainly isn’t a common practice in other types of software, and it can easily be seen as an unfair and arbitrary process (in the film industry, it has political to the point where there are union rules about film credits). But it does seem to provide motivation and is important for career advancement in the game industry (many game job ads list credits on shipping titles as a requirement).\nPlayers Want an Emotional Experience # Compared to other media such as film and literature, games usually exhibit limited emotional range, but at the very least all games attempt to produce excitement and a sense of accomplishment in game players.\nGame developers want to experience those emotions in game development, too. Ideally, developers should feel an increasing level of adrenalin rush and anticipation as the project nears completion, and the gold submission should be accompanied by a profound sense of achievement. Pace is important — the end of the project should be the most gratifying, not anticlimactic.\nGood emotions: interest, confidence, anticipation, excitement, satisfaction. Bad emotions: frustration, nervousness, disappointment, anger, ennui.\nPlayers Want to Fantasize # Games take players away from their normal lives by immersing them in fictional environments and circumstances. As in the movies, the game world is idealized — with the exception of The Sims, you’re not bothered by household chores, taxes, and addressing bodily functions.\nIn the workplace, of course, you still have to deal with bodily functions and taxes, but a job still offers a world separate from the home life and roles and missions that are different and possibly more exciting than available in the personal life. To different degrees, companies are like role-playing games in assigning employees to different official categories — game designer, producer, programmer, artist. Startup companies with more loosely defined responsibilities allow employees to assume a “be all you can be” attitude.\nWhat Do Players Expect? # Now that we’ve established what motivates people to become game developers, it’s time to address the second part of our query. Once we’ve got a developer on our project, how do we keep him present, happy and motivated?\nIn game design, we have the same issue — once a player has decided to play a game, he has expectations that must be fulfilled for him to enjoy and complete the game, so it is important to identify those expectations, conscious or not.\nPlayers Expect a Consistent World # Players expect their actions in a game to have predictable results. Not right in the beginning — the player has to experiment a bit, in the way that infants do learn about their environment, to understand how things work in the game world. Seemingly arbitrary cause-and-effect will discourage the player and give the impression that the game is rigged.\nIn a game development setting, motivational pats on the back and even concrete rewards like raises and bonuses will not have the intended effect if the developer cannot understand how to get those rewards. Even worse are unpredictable punishments — if working harder or taking extra responsibility results in censure, then the developer will adopt a fatalistic and passive attitude. In some extreme cases, I’ve seen employees refuse to do anything until explicitly given an order or perform deliberately bad work.\nPlayers Expect to Understand the World’s Bounds # In games, players expect to recognize boundaries on actions and movement. Visual cues such as walls and precipices indicate the world’s physical boundaries. The available controller actions constrain physical actions, e.g. some games have no jump button.\nIn the workplace, the employee wants to know the boundaries, too (they may think they don’t want to have boundaries, but at the very least, they need to know the ones that do exist). For legal reasons, corporations often communicate boundaries on acceptable workplace behavior through orientations for new employees, employment handbooks explaining company policy, and, when they’re particularly nervous about it, various forms of “sensitivity” training.\nBut all the legalese is ineffective without visible enforcement. Termination or other corrective actions will signal to everyone that the offending behavior, whether it be sexual harrassment or just talking back to the boss, is out of bounds. Letting the behavior go will either lead to ambiguity or signal tacit approval.\nBoundaries also include organizational boundaries. Game projects typically provide the publisher with a project document listing key roles and responsibilities of the development staff. This type of documentation is also useful to the team, so they have an idea who’s in charge of what and who reports to whom. Management often finds it convenient to keep these roles vague, which has the advantage of providing some flexibility, but doing this for political reasons will just result in confusion and recriminations.\nPlayers Expect Reasonable Solutions to Work # After gaining some experience with a game, the player has idea how to solve problems in the game. The player will be frustrated and irritated if any reasonable solutions based on the gameplay so far turn out to be ineffective. So designers should take care to accomodate such solutions even if they are not the primary solutions intended by the designer.\nGame developers also expect reasonable solutions to work (how many times have you heard, why doesn’t this work?) Game development is often at the cutting edge in terms of technology and scale, so oftentimes techniques that “should” work, don’t. Even, tools and middleware and equipment for game development are notoriously flakey.\nSo it is important to ensure that everything within control works like it should. The devkits provided by the console makers may arrive late and crash frequently, but the commodity hardware and software (desktop and server computers, email, backup software, for example) should be rock solid. Compilers, debugging tools, and game engine middleware are often inadequately documented and in a beta state, so the production pipeline and internal tools should be well documented. The smoothest-running game projects I’ve seen still had plenty of mystery code, halting production pipelines, and IT glitches like servers crashing, data irretrievably lost, and ill-timed upgrades during crunch times.\nPlayers Expect Direction # A game should give some indication of the the player’s objectives. Otherwise the player may roam the game aimlessly wondering what to do, randomly attacking objects, NPC’s and other players just to see if something will happen. Game developers can also roam around a game project aimlessly. In the worst case, they will break other developer’s code and art, and bitch, moan and complain.\nEveryone wants to know what the game is about. What’s the story? What type of gameplay are we trying to achieve? How does it fit in and compete with other titles on the market? This is what a high-concept documents is supposed to communicate, and this document should be readily available in-house as well as distributed to publishers. If you can’t convince your own team of the viability of the game vision, then it’s much less likely you can persuade publishers, their marketing staff, and retailers to buy into that vision.\nDirection is also provided by the schedule. The final release date and interim milestones, including specification of the critical features required at each point, should be clear, reliable and changed only in drastic situations that warrant changing the entire schedule. In other words, the milestones and release dates should not be moving targets.\nScheduling is often performed down to a fine-grained level, in some cases to tasking day by day by day or even by hours. But while some developers may require micromanagement, it is important to make a distinction between this kind of supervision and a global schedule that the entire organization needs to be working toward. A day-to-day or even weekly schedule is volatile — vacations, sick days, emergency bugs and demos, server crashes and other natural disasters happen. Some tasks take longer than expected and some turn out to be easier than anticipated, and sometimes it makes sense to reorder them, but overall they should average out to meet the scheduled milestones.\nPlayers Expect to Accomplish a Task Incrementally # Players usually know the overall objective in the game but expect to achieve this objective via a succession of subgoals. This provides awareness of incremental progress and reassurance that the player is on track. Without this feedback, a player could go off course and not realize it.\nNot only do game developers find completing subgoals more tractable than large monolithic tasks, subdividing large tasks is vital to risk management and project scheduling. Then progress can be measured and validated by monitoring the completion of these subtasks. When developers jump into general assignments such as implementing renderers, physics engines, AI without defining components and tests that can be completed in sequence, then such a project can drag on for months without visible progress, until it becomes apparent that it’s going in the wrong direction or that no progress is actually being made.\nPlayers Expect to Be Immersed # Obtrusive user interfaces and game glitches, particularly crashes, distract from the player experience. And a character that is difficult to control or unappealing will also prevent the player from comfortably playing that role and feeling part of the game world.\nIn a game development environment, you also want each team member to feel immersed in the project and concentrate on getting the job done without distraction. Bureacratic and corporate artifacts should not intrude on what should be a project that is rewarding unto itself. For example, timecards and sign-in sheets, thick employee handbooks, administrative paperwork, will remind employees they are on the clock and working for “the man”. Instead, the necessary evils of running a business should be kept simple and to a minimum, and the environment should exude the exciting aspects of the game industry — the office should have plenty of games, industry magazines, posters, etc.\nAs far as providing a suitably appealing and easily assumable character to play, this does have a counterpart in the game project, too. Each developer plays a role (sometimes more than one) — an enjoyable role will be played with gusto, a distasteful role will be dreaded and performed without enthusiasm.\nPlayers Expect to Fail # Players want challenge, so naturally they expect to fail at some points in the game. Moreover, those failures should stem from inadequate or incorrect play, rather than “tricks” or “cheap shots” utilized by the game. And the game should start out easy and ramp up later in difficulty to avoid discouraging players before the reward of the gameplay becomes apparent.\nGame developers are also in the business for a challenge (or at least they should be), so they cannot be held back by fear of failure. On the contrary, developers should learn from failure. Attempts to implement new algorithms, use new tools will almost certainly result in some failures, all as part of the learning process and should be anticipated in the schedule. (This area where breaking schedules down too far will diverge from reality — you don’t know how many different implementations of say, a dynamic shadow algorithm, you might try, but you should know when it has to be completely done).\nThese setbacks are acceptable as long as they are natural byproducts of the learning process, but aggravating if they are imposed by outside factors. Unrealistic schedules and frequent crunch times will leave room for less error while simultaneously increasing the number of mistakes. Unreliable hardware and tools…\nAs with a game, a game project should start out easy, so everyone gets in the flow and understands the rules — how to work with the production pipeline, how to work with the rest of the team.\nPlayers Expect a Fair Chance # Although players expect to fail, they also expect a fair chance. Ideally, a player should be able to make it all the way through the game on the first attempt if no mistakes are made. This means that progress shouldn’t require trial and error — it should be possible to deduce a successful path through the game. If the player finds that the only way to progress in the game is through gessing from sets of random choices, then it will seem like a waste of time.\nGame developers also will become frustrated if it seems they have no way to make decisions short of guessing.\nPlayers Expect to Not Need to Repeat Themselves # Players get annoyed if they have to repeat any tedious or painful portions of the game. Hence the availability of game saves, and, in particular, checkpoint saves.\nThe most obvious analogy in game development is avoiding loss of work. Code, game assets, and even production documents should be frequently adn regularly checked into a source control system. And everything should be backed up periodically, with the archive media stored off site and test restores performed to verify the backup integrity. This will seem obvious to some and extreme to others, but data loss due to accidental erasure, hardware failures, and absent or faulty backups is all too common.\nAnother interpretation of this game design principle is that team members shouldn’t be duplicating work. For example, timely communication and visibility of the code base should allow programmers to avoid redundant work and encourage code sharing. The game design and requirements, production pipeline, and any project and corporate procedures should be documented and easily accessible to avoid inefficiency in explaining and learning.\nPlayers Expect to Not Get Hopelessly Stuck # A game should not allow a player to get stuck in a position from which there is no chance to complete or win the game. For example, a player should not be able to jump into a while from which there is no escape, aside from quitting the game. Either provide a way out or put the player out of his misery.\nDevelopers also resent ending up in situations where they can’t succeed, and rather than hit the Quit button, they may just sit there, resentful and apathetic. If they feel they’re faced with unfair expectations given unrealistic schedules, unbounded features, late or scarce tools and assets, then they won’t even try. If a developer is just not capable enough to succeed, then there’s no point in breeding resentment by letting him linger on.\nPlayers Expect To Do, Not to Watch # Rouse opines that players want to play, not watch cut scenes. While cut scenes can be instrumental in communicating narrative and setting up new levels, the duration of cut scenes should be kept to a minimum. Games that rely on cut scenes rather than gameplay inevitably fail to keep the gamers’ attention.\nDevelopers don’t want to sit around and watch a game being put together — they want to be part of the action. Everyone has opinions on games and would like to develop a game that they actually want to play. You can’t have game design by committee, but soliciting ideas from everyone will make them feel like part of the creative process. Internal newsgroups or message boards can be used for exchanging ideas. Contents can be held for names. Songs voted on. Blog-style developer journals can be kept for historical and promotional purposes.\nOne way for developers to feel part of the game is to literally make them part of the game, by modelling characters to resemble staffers, incorporating inside jokes, recording project members’ voices for voiceovers — all of these will personalize the game for them.\nPlayers Do Not Know What They Want, But They Know It When They See It # Once a game has reached a playable state, it is important to test it with real players and gauge their reactions. Focus groups cannot be relied upon to make game design decisions — that would be too easy. Rather, it is incumbent upon the game designer to observe their reactions and use observation and experience to discern what is and is not working in the game.\nSimilarly, employees may not be able to articulate precisely what they want in a workplace or project. Putting up suggestion boxes and soliciting feedback in employee reviews may elicit some useful ideas, but you’ll get a lot of advice on running the project that still doesn’t necessarily fix problems that are disturbing them. There is no substitute for the scientific method — observe your team dynamics, hypothesize about what’s fundamentally not working (or working), make corresponding adjustments and verify your fixes work.\nA Never-Ending List # Besides playtesting and following the rules described above, a game designer can come up with any number of game design principles based on experience and personal tastes.\nIn project management, also, the best rule of thumb is to use one’s own preferences. What kind of project do you want to work on? Why are you in the game business, what attracts you to a project and what would be your expectations? As they say, your mileage may vary, but if you at least design a project that you would want to be part of, then you have something that appeals to at least one known type of person.\n","externalUrl":null,"permalink":"/books/techsoft/workandplay/","section":"Books","summary":"After reading the first edition of Richard Rouse’s Game Design: Theory and Practice years ago, I wondered if the game design principles he listed could be applied to “designing” game dev itself — hence, this essay written some years back) As a break from the usual advice on how to make your project run like a factory or how to impose your will upon the troops, here’s an idea — run your project with game design principles in mind. This article is targeted toward game developers, but it may be generally applicable.\n","title":"Work Hard, Play Hard","type":"books"},{"content":" Explore Further # Now our bowling game for iOS looks like a real app! It has an icon, a splash screen (or two), an activity indicator spinning away on the splash screen, it runs in portrait orientation, and the graphics scale to fit the screen including the UnityGUI scoreboard and pause menu. The menu is even automatically functional in iOS, with its buttons responding to taps on the screen. We can’t quite say that about the actual gameplay, but we’ll implement touchscreen based game controls in the next chapter.\nReference Manual # Once again, we’ve spent some time in the Player Settings (a recurring theme now that we’re making iOS builds), so the Reference Manual documentation on the Player Settings is worth a review.\nWe used just one new Component in this chapter, a GUITexture for our splash screen image. GUITexture and its parent class GUIElement have no relation to UnityGUI (in fact, GUITexture and its sibling GUIText were the closest things to user interface elements before UnityGUI arrived).\nThis chapter was devoted largely to icon and splash screen images, which should all be imported using the GUI preset import settings, which are documented fo Texture2D in the Asset Components section.\nScripting Reference # The one new UnityGUI feature introduced in this chapter was the matrix variable in the GUI class. At the time of this writing, the Scripting Reference page for that variable is nearly blank, but the GUIUtility class has some better-documented functions, including ScaleAroundPivot, which can be used as an alternative to setting GUI.matrix (in fact, it is a helper function that sets GUI.matrix internally.\nWe only used the Matrix4x4.TRS constructor, but the Scripting Reference documentation on Matrix4x4 is not bad, explaining how matrices are used in Unity and listing many class functions that will be useful if you ever have to start messing around with matrices.\nThe yield instruction WaitForSeconds was already introduced in Chapter 8 for the game over state, and it turns out to be convenient fordisplaying a splash screen a certain number of seconds. We took this opportunity to explore hypothetical implementations of WaitForSeconds and compare the static Time variables Time.time and Time.realTimeSinceStartup. It\u0026rsquo;s an important distinction when the pause menu is up and game time is suspended.\nWe called the static Application function LoadLevel to transition from the splash scene to the bowling scene, but we also could have called an asynchronous version of the function, Application.LoadLevelAsync. As an asynchronous function, it doesn’t suspend Unity while it’s loading a new scene, so, really, you could have anything happen in the splash scene while waiting for the new scene to finish loading.\nAs demonstrated with our use of the activity indicator functions in the Handheld class, you can make Objects survive across scenes loads by calling DontDestroyOnLoad called on them and Destroy them when they\u0026rsquo;re not needed anymore. These are both static functions in the Object class, which is always worth reading up on since it\u0026rsquo;s the parent class of everything that can be in a scene.\nTo display and hide the activity indicator, we called the StartActivityIndicator and StopActivityIndicator functions in the Handheld class. See the documentation on the activity indicator functions about the necessity to yield before performing a scene load. iOSActivityIndicatorStyle enumeration for a list of the available activity indicator styles.\nThe Handheld class is worth a looking over, as it contains all the scriptable Unity mobile features (except those specific to iOS). For example, the Handheld class has a static PlayFullScreenMovie function that can play a movie from local storage or streamed from a web site, which is another possibility for a cool-looking splash scene. The Scripting Reference page for that function has details on the supported video formats and how to control the movie player (based, at the time of this writing, on the native iOS movie player, MPMoviePlayerController).\niOS Developer Library # As we explore Unity iOS features, more and more of the documentation in the iOS Developer Library is relevant. Remember, that documentation is available both on the Apple Developer site (http://developer.apple.com/) and from the Xcode Organizer window.\nOne document worth reading in its entirely, found in the User Experience topic of the iOS Developer Library, is Apple\u0026rsquo;s iOS Human Interface Guidelines. The original guidelines dating back to the original Mac were the gold standard in user interface best practices. Since then, the guidelines have been split into Mac and iOS versions, but you should read the iOS version if only to avoid app rejections. Related to this chapter, the Custom Icon and Image Creation Guidelines section lists requirements and recommendations for creating app icons and splash screens (known as \u0026ldquo;launch images\u0026rdquo; in their terminology).\nMany Unity classes that are mobile-specific or iOS-specific will have an Objective-C counterpart. For example, the activity indicator controlled by Unity\u0026rsquo;s Handheld class is accessed in Objective-C via the UIActivityIndicatorView class, also found in the User Experience topic in the Windows and Views section.\nAsset Store # The Transitions Manager from DFT Games, available free on the Unity Asset Store, provides more sophisticated introductory screen behavior than what has been described in this chapter, including fading the screen in and out and using multiple screens. I use the Transitions Manager in all my apps.\nBooks # Josh Clark\u0026rsquo;s Tapworthy: Designing Great Apps is the book that convinced me to eschew automatic icon gloss and always select Prerendered Icon in the Unity Player Settings. It\u0026rsquo;s also a good treatment of app design in general.\nThere are plenty of textbooks on linear algebra (and even a hefty “matrix” article on http://wikipedia.org/), but any computer graphics book will have a primer on the matrix math. For example, Real-time Rendering has an appendix on “Some Linear Algebra.”\n","externalUrl":null,"permalink":"/books/learnunity4/chapters/chapter12/","section":"Books","summary":"Explore Further # Now our bowling game for iOS looks like a real app! It has an icon, a splash screen (or two), an activity indicator spinning away on the splash screen, it runs in portrait orientation, and the graphics scale to fit the screen including the UnityGUI scoreboard and pause menu. The menu is even automatically functional in iOS, with its buttons responding to taps on the screen. We can’t quite say that about the actual gameplay, but we’ll implement touchscreen based game controls in the next chapter.\n","title":"Presentation: Screens and Icons","type":"books"},{"content":"The patient died, but the operation was a success.\nWhat’s Wrong with Agile # A director of engineering once characterized me as “in-the-closet” when it came to process. I do think there are important principles and procedures to follow in software development, but when I hear people brag about having a process, I shudder. Agile development is no exception.\nI liked agile development…before it was called Agile. Now everyone says they’re doing Agile (or sometimes AGILE), job postings list openings for “Agile/XP programmers”, and Agile consultants and authors are everywhere.\nIt’s a Religion # Because Agile has so many fervent believers, it’s the worst thing to happen to software development since Microsoft. When optimizing programs, engineers are supposed to know that little improvements here and there don’t matter if you don’t fix the bottlenecks. But given clueless management and a project without direction, somehow Agile is supposed to save the day by saying, don’t worry about it. That’s not a process for creating quality products, it’s process as a coping mechanism.\nNormally, processes are pushed by management consultants on gullible management. But Agile is a religion for the masses — rank-and-file programmers think it’s their salvation. They recite scripture (design patterns), participate in rituals (daily standup-meetings, unit tests, pair programming), Bible study (reading groups), and community worship (discussion lists and wikis). As a reward, they are assured by the high priests (consultants) they are Good Programmers.\nAgile is bottom up. You don’t have to know the Big Picture. In fact, you’re better off not knowing. Just go month-to-month, week-to-week, write little snippets of code with unit tests, and keep asking “is this what you want?” Forget design. (Seriously, if you had a design, what was it?) Give up on long-range planning. It’s the type of fatalistic approach that appeals to those who have been burned and those who don’t know any better. You will be rewarded in the afterlife. (or with stock options)\nIt’s Manufacturing # Agile also appeals to management by encouraging the misconception (or wishful thinking) that software development is a form of manufacturing.\nOne large software project I worked on had an architectural identity problem — if you looked at any piece of the code, it was hard to discern the intent. Not because the code was poorly written. On the contrary, all of the thirty programmers on the project were highly qualified. The lack of design continuity arose from the practice of assigning the tasks pinned up on the corkboard to any available body. I was assigned several user interface bugs because the regular UI programmer was busy on other tasks. This had the pleasing effect of marking all of those bugs as “in-progress” or “fixed” in short order. But since the regular UI programmer had to inspect and approve my fixes before they went in, and he ended up rewriting them later, it really cost more time and effort in the long run.\nThere’s a saying in video game design, “Find the fun”. Squeezing software development into a manufacturing mold could be termed “Find the fun, then remove it”. Software development is not manufacturing, unless your idea of manufacturing is designing a new engine for every car that comes off an assembly line. Software is custom engineering and still resembles a craft more than anything else.\nIt’s Process for Process Sake # Naturally, manufacturing companies would most like treat software development as manufacturing. They love processes and “best practices” — TQM, ISO 9000, Six Sigma. They also have the worst software development.\nI worked for a factory automation company that regularly flew our Director of Engineering out to meet their Software Best Practices commitee. Yet we had a codebase that was not buildable for days at a time, misguided design, dysfunctional and hostile interaction among engineers, product requirements appearing immediately after product delivery, and components that were untested to the point of being obviously uninstallable (if anyone bothered to just look at it). And that was our cutting-edge Java application — typical start of the art in manufacturing was Visual Basic.\nI often treat “process” as a dirty word, but process should be a good thing. Learning is a process. Self-improvement is a process. Doing things better every time around is a process. Process isn’t something you trumpet — good people (in both the moral and competence senses) don’t talk about how good they are, they just are. In fact, people who like to talk about how good they are usually aren’t.\nOne of the more entertaining workplaces I’ve seen included a programmer who evangelized Agile and a manager who pushed ISO 9000. The programmer covered his cubicle wall with scrum notecards and kept complaining we didn’t have proper sprints yet didn’t maintain a reproducible build process and ignored all feedback on the product from management. The manager wrote a process manual that didn’t say much except that they had a process and gave his employees pop quizzes on the manual. Yet he didn’t bat an eye when distributing release CD’s filled with random builds of the product placed in random directories. Those guys made a perfect couple. In the meantime, there was plenty of work for service engineers.\nIndeed, one of the tenets of Agile states “people before process”. And defenders of Agile will immediately respond to any of these criticisms of negative anecdotes that “You’re not doing it right.” (This would be more credible if claims of Agile success were examined as skeptically) But theory doesn’t matter if you have to suffer the practice. When people talk about process, what they really mean is a formula that allows them to avoid thinking about principles.\nStriving for Mediocrity # The public schools system is great at educating the middle. If you’re slower than the middle, you get pushed a bit or repeat a grade. If you’re ahead of the curve, you just get bored.\nPopular agile practices are also geared toward the average (or is it the median?) Scrum meetings by definition require everyone to move together (ostensibly like a rugby team moving up the field together — or like a soccer team of five-year-olds moving en-masse around the field while their parents yell encouragments). Pair programming is great for those who need to have their hand held or code monitored. Proving that one plus one is sometimes less than two.\nI worked for one company that boasted of its agile practices — in particular, scrum. Overall, it was a quality project with high production values. But I found the process more a hindrance than a help. The daily meetings just meant there was no planning — instead of working out task dependencies early, developers just waited until the morning scrum to say, “oh, by the way, I’m waiting on this…” The pair programming required for code checkin either meant someone was totally bored while I explained the code or I ended up quickly changing the code to match someone else’s idea of good programming style just so I could check it in.\nThe real reason it was a quality project was the fact that they recruited talented people who were able to work with each other outside of the process enough to get the job done during the crunch that the whole process was supposed to avoid. All the process accomplished was to give the project managers the illusion that they were in control of things.\nCoding is not inherently a team sport. Doubles tennis can be fun to play and entertaining to watch, but the game is meant for individuals. The Cohen brothers can write scripts together and finish each other’s sentences while directing, but that is a rarity — most good work of that nature is performed by individuals. Your best programmers are the ones that can get the project done. But corporations feel more secure with all their engineers contributing mediocre work than with a handful of engineers contributing superior work and the rest killing time.\nLearn from Open Source # Agile arguments tend to be anecdotal (like those of yours truly): “We used it on Project X and it worked.” But if you want case studies, why not look at open source projects? One could argue that open source development is the most agile development of all.\nTransparency # More than any other type of project, open source projects are transparent. You can evaluate for yourself the quality of the code (just look at it), the popularity of the product (e.g. SourceForge ranking, or in the cases of projects like Apache or Firefox, it’s well known), and the level of development (check the history of change, who changed what and when).\nCommunication # With transparency and the tools to support it, communication follows. A typical open source project has active discussion lists (email and/or forum), a wiki for collaborative documention, occasional chat sessions for real-time meetings, and occasional face-to-face get-togethers at conferences. Code changes are automatically announced on commit mail lists, giving everyone an opportunity to inspect the diffs.\nTesting # Also with transparency comes testing. Anyone who’s willing to download and install is a tester. Again, tools are important. Users are more likely to submit quality bug reports (as opposed to just sending whining email) if the project web site sports a convenient bug entry page and searchable database. And users are more likely down to download the software, even free software, if the project has automated builds and tests.\nMeritocracy # Contrary perhaps to public perception, open source projects are not uncontrolled pools of code. (It’s not Wikipedia!) Successful open source projects are led by programmers with a firm direction. The set of developers allowed to commit changes is typically limited to a few trusted people. Some projects have elaborate procedures for admitting new committers. Developers have to prove themselves before getting the keys to the vault. Bad code submissions are ignored — not incorporated into the codebase just so they can be fixed later.\nNo Interference # With good tools for communication and good people doing the work, there’s no need for constant supervision by professional managers. No need for frequent meetings. I have yet to see a notable open-source project with strict style guidelines. The development drives the process, not the other way around.\nCompetition # What motivates open source developers to maintain effective practices? Competition. Even more so than with commercial software. Release buggy software, wait too long between releases, take the product in the wrong direction, anyone is free to take the code and spin off a new project with a new group of people (or even some of the same ones). Open source projects compete in a free and open market for users and developers. The agile movement, on the other hand, started in large corporate projects that can live or die based on reasons that have nothing to do with quality.\nKeep It Simple # Good tools. Good people. Transparency. It’s not that complicated.\n","externalUrl":null,"permalink":"/books/techsoft/agileisnt/","section":"Books","summary":"The patient died, but the operation was a success.\nWhat’s Wrong with Agile # A director of engineering once characterized me as “in-the-closet” when it came to process. I do think there are important principles and procedures to follow in software development, but when I hear people brag about having a process, I shudder. Agile development is no exception.\n","title":"Agile Isn't","type":"books"},{"content":" Explore Further # Testing Unity iOS apps in the Unity Editor and in the iOS Simulator is convenient, but there’s no substitute for the real thing! The good news is that building for real hardware doesn\u0026rsquo;t change much on the Unity side (really, just setting the SDK to Device SDK in the Player Settings). The bad news is that you have to go through the entire Apple developer registration, Provisioning Portal setup for your test devices and provisioning profiles, and iTunes Connect setup for all your apps. In a sense, this is the chapter where you became an iOS developer!\nNow that we’ve got that out of the way, we can leave the Angry Bots project again and return to our bowling game and spend the remainder of this book adapting the game for iOS. However, we haven’t seen the last of iTunes Connect. We will use iTunes Connect later when we incorporate Game Center (Chapter 14) and iAd (Chapter 15).\nUnity Manual # Since the the simulator and device builds for Unity iOS involve nearly identical steps, the Unity Manual sections mentioned in the previous chapter also apply to this chapter. In addition, the “Getting Started in iOS Development” section of the Unity Manual has a page that briefly lists the steps required by Apple for submitting an app to the App Store, and the “Debugging” page in the Advanced section explains how to attach a MonoDevelop debugging session to a Unity iOS app running on a device.\nApple Developer Site # The road to all Apple developer information begins at the Apple Developer site, so that should be your first stop. From there, you can find descriptions of the iOS Developer Program (and other Apple developer programs) and commence the registration process.Even before the registration is complete, you can explore the iOS Dev Center, which includes the iOS Developer Library, which in turn contains the iTunes Connect Developer Guide (listed under Languages and Utilities).\nTip The documentation in the iOS Developer Library is also available in the Xcode Organizer. As you might gather from all the work that takes place in the Organizer (provisioning profiles, screenshots, app submissions), you might be spending most of your Xcode time there!\nOnce your registration is approved, you can access the iTunes Connect site and the Provisioning Portal on the Apple Developer Site to complete the mobile provisioning and app submission steps covered in this chapter.\n","externalUrl":null,"permalink":"/books/learnunity4/chapters/chapter11/","section":"Books","summary":"Explore Further # Testing Unity iOS apps in the Unity Editor and in the iOS Simulator is convenient, but there’s no substitute for the real thing! The good news is that building for real hardware doesn’t change much on the Unity side (really, just setting the SDK to Device SDK in the Player Settings). The bad news is that you have to go through the entire Apple developer registration, Provisioning Portal setup for your test devices and provisioning profiles, and iTunes Connect setup for all your apps. In a sense, this is the chapter where you became an iOS developer!\n","title":"Building for Real: Device Testing and Submission","type":"books"},{"content":"Where we’re going, we don’t need roads.\nBackseat Driving # It’s hard to avoid giving advice when you’re sitting in the back seat. Or the passenger seat. It’s also hard to avoid getting annoyed when you’re on the receiving end.\nDuring my first job out of college, I often rode with several other coworkers who were not used to driving. The unlucky driver of the day would have an advisory committee monitoring his actions: “Slow down. Speed up! Watch out!” The constant micromanagement had the laudable intention of keeping the car and ourselves intact but, as one of the committee once remarked, “leave him alone, or we’re definitely going to get in an accident”.\nOf course, a navigator can be useful. But only if the navigation is good.\nI once had a friend visit me in the Bay Area who wanted to visit a certain restaurant in San Francisco. He would say “Turn here!” just as I passed the desired exit. Not helpful.\nGive directions plenty of time in advance. Even my Tom Tom says, for example “after one mile, turn right”.\nCheck the Roadmap # You can minimize last-minute confusion by planning your route. An interesting type of phone call I occasionally get is when a friend calls me up and essentially uses me as MapQuest, but without the starting location. (“How do I get to A?” “Where are you?” “I don’t know”) This seems to happen mostly around LA, perhaps a commentary on the freeway system here, but here’s an idea — how about looking at map before you start?\nI’m embarassed to admit I’ve succumbed to this overlay casual trip planning more than a few times, and my overconfidence (“I’ll just figure it out as I go along” or “I’ll ask someone along the way”) invariably has resulted in delays and detours and sometimes nerve-racking moments through parts of town that look dicey. But when I check out the route beforehand, I feel in control all the way through and can usually get back on track easily if there’s a minor diversion.\nProjects often start out the same way. We’ll know where we’re going when we get there. Then, months or years late, with the destination far on the horizon, management tells everyone to drive faster and and hires more drivers to help.\nFigure out where you are and where you want to be at the end of your journey. Look at the obvious routes, and take into account the possible delays and detours.\nGet in the Right Lane # Short-term planning is important, too. It’s slow torture watching drivers cruise along in a lane clearly marked to merge into another, waiting until the last possible moment to merge. What’s plan B — drive off the road? I’ve been on more than one project where it was suddenly announced “we’re delivering a release today”. When I explained to one manager that it wasn’t a good idea to just tell everyone to stop coding and ship it, he explained, apparently sincerely, that we knew we were going to have a release so it should be no surprise. Another manager thought it was a show of leadership — “Today you will gived me a build”. Rudeness, on to of stupidity. Let’s just say, those releases were not fit for final releases.\nDon’t defer decisions, whether out of complacency or indecision or a misguided desire to keep you options open, that have to be made. Execute them early, with a margin of safety and time for correction, and with everyone on board.\nUse Your Turn Signal # If you do have to change direction, be clear about it. Among my many pet peeves are those drivers who are too lazy and inconsiderate to use their turn signals — there’s a reason why those are built into cars at extra cost, namely to alert other drivers of your intentions so you don’t end up driving into each other. And it is a courtesy — how often have you cursed drivers for cutting in front of you abruptly or leaving you waiting at an intersection for them to cross when in fact they were going to turn?\nIt’s not easy being a middle manager. I got stuck in one tragicomical situation where I wanted to move one recalcitrant employee out of a game design group — my boss agreed and yet within twenty-four hours assigned her a new game design task, after telling the IT guy to remove her from the game design mail list. The employee eventually got upset that the tasks she was unwilling to do were being assigned to others and started crying in front of me, jumping to the conclusion that she was about to be terminated. My boss then informed me she would be terminated, but apparently had a change of heart and I ended up hiding from that employee for a few more weeks while she gave me dirty looks.\nNow, if that was confusing for me, imagine what it was like for everyone else in the group who had to work with that employee. At least I was able to hide.\nUnless you’re working in the equivalent of Boston traffic, where signaling your intentions is a sign of weakness, then it is important to signal your project members whenever you’re about to turn or make a lane change. If you can’t give signal your intentions clearly, anyone with initiative will just give up and you’ll be left with those who fatalistically and passively wait for micromanagement.\nAre We There Yet? # It’s an annoying question from kids in the back seat — it’s just as annoying frm your project manager.\nDon’t Drive Aggressively # I marvel every day in traffic when I see someone rushing past me to squeeze in front of my car when there’s a hundred feet of clear road behind me. Some people just don’t feel like they’re making progress unless they’re making it at someone else’s expense.\nYou can see that in the workplace, too. Despite all the platitudes about “win-win” solutions, the benchmark for others’ success is often your failure. Some see life as a zero-sum game (though it’s unlikely they are sophisticated enough to think about in consciously in those terms) Watch out for those sharks, and don’t be one of them.\nDrive Defensively # No matter how good your driving habits, you have to watch out for other drivers. The zig-zagging boss, the coworkers who cut you off.\nTry to avoid the pile-ups.\n","externalUrl":null,"permalink":"/books/techsoft/drivinglessons/","section":"Books","summary":"Where we’re going, we don’t need roads.\nBackseat Driving # It’s hard to avoid giving advice when you’re sitting in the back seat. Or the passenger seat. It’s also hard to avoid getting annoyed when you’re on the receiving end.\n","title":"Driving Lessons","type":"books"},{"content":"What have here is a failure to communicate.\nAvoid These Meetings # I’ll take a strong stand on meetings right off the bat — meetings are evil, and not even a necessary evil. In my first job out of college, the weekly meetings were painful experiences, filled with senior blowhards taking credit for work done by junior staff. After travelling on business one week, I enjoyed skipping the meeting so much I just stopped attending (shades of Office Space!). Apparently I didn’t miss anything, I got more work done, and no one bothered me about it.\nMost of my subsequent workplaces weren’t nearly as dysfunctional, but still the meetings weren’t much more useful. Automatic, repetitive, pointless — the worst ones are the typical ones:\nThe Weekly # A regular weekly group meeting is a traditional part of work life, like the coffee break. But the hours add up — say you just have one weekly departmental meeting involving forty people — that’s costing you one person on the payroll. And do you really need to herd everyone into a room to get them to communicate? To share body odors and a group nap, yes, but after all, they are supposed to be working and communicating with each other during the rest of the week.\nThe most ridiculous weekly meeting I’ve witnessed (and there’s heavy competition) was held by a manager who had just one person in his group besides himself. And they shared an office. Every Friday at 9am, the manager would turn around in his swivel chair and say to his officemate, “Ready for our meeting?”\nSometimes meetings are held just to remind everyone who’s the boss. If that’s what it takes, you’ve got other problems.\nThe Standup # I’m not a fan of scrum. And I don’t mean rugby. The thing I hate about the variant of Agile Development called Scrum is its defining characteristic, the daily standup meeting.\nThe daily standup is a reaction to the traditional weekly meeting, but it’s no better. Rather than waste an hour of everyone’s time once a week, it takes ten minutes of everyone’s time every day. Factor in the context-switch time of breaking off work and then returning to work, it’s not a real time-saver.\nThe daily meetings are also a ritualization of the what-are-you-doing-right-now school of management, which is not exactly goal-oriented. It’s irritating enough to have a manager go around a table once a week and ask “what are you working on?” but to go through that every day is like being in kindergarten. And when I did sit (stand) through such daily meetings, I still had middle management come by later in the day to ask “what are you working on?” (I always wanted to ask them the same question)\nThe Pep Rally # I am forever grateful to the high school math teacher who let us spirit-impaired nerds hide out in the computer lab during pep rallies. They were a welcome break from class, but the fact that hip-waggling cheerleaders stirring up support for our football team (despite its two consecutive years of losses) warranted time taken out of our studies gives some indication why this country isn’t preeminent in primary education.\nRah-rah corporate meetings also provide a break from work, minus the cheerleaders. They’re really an opportunity for the CEO to flex his CEO muscles — an exercise in power management. Sometimes the hypnosis works and employees fall under the sway of the exalted leader, and sometimes they just find the guy annoying, but I’ve never seen employees come away actually more encouraged and determined to work harder.\nThe Come to Jesus Meeting # I’ve heard these referred to as “come to Jesus” meetings, but I think of them as panic meetings, where management realizes, belatedly, that things are not as they should be, and calls an all-hands meeting to tell everyone to shape up. I’ve never seen anyone come out of these meetings energized to work. Usually, they go off to polish their resumes.\nThe Group Hug # At one point during my first job (the worst jobs have the best stories), a self-appointed morale coordinator who apparently had nothing better to do first issued Briggs-Meyer tests (we just handed the forms to our friends so we all got the presonality profiles we wanted), and then when team unity failed to result, set up an off-site two-day team-building session, down the street from our office. We held hands, took turns “confessing” how we could have done a better job (mostly phrased as “I could have done a better job in helping that guy do his job”, except for the fundamentalist Baptist who refused to confess because he wasn’t Catholic).\nHere’s an idea for a team-building exercise: finish the project.\nA Few Good Meetings # Despite my allergic reaction to meetings, I do believe a few can be useful, and they may be appreciated more for their rarity.\nThe Kickoff # The first useful team meeting is the project kickoff meeting. It’s important to make sure everyone is on the same page from the very beginning.\nOn my first project where I was a lead, I thought the project goals were pretty clear. But after a few months, the team members actually requested a meeting. After that, no one asked for another meeting, so either it was satisfactory or totally useless, but I do wish I held that meeting at the beginning.\nThe Countdown # There is one part of a project where I do think it’s important to for everyone to get together and know exactly what’s going on — that’s the final days before a project release. The code should be frozen and undergoing extensive testing at this point — every day there should be a meeting to go over the latest test results and decide what to do about them.\nThe Postmortem # Memories fade quickly, so start off the new project cycle with a meeting to discuss lessons learned. And anyone who feels abused by the past project is likely to be annoyed enough to honestly air their views.\nHowever, even meeting-happy managers I’ve worked for have been reluctant to hold postmortem meetings, ostensibly to avoid finger-pointing (probably at themselves), but I suspect also because the point of a postmortem meeting is to take a hard, realistic look at the process and make any necessary changes. And no one wants to do that.\nI did participate on one video game project that held a few postmortem meetings after milestone deliveries, and the sessions were useful in refining our process. Too bad all that got thrown out the window at crunch time.\nUse Technology # Technology has changed how we do nearly everything — entertainment, travel, shopping, managing our finances. So why should we hold meetings the same old way like cavemen grouped around a fire? Some technologies, like videoconferencing, just make it easier to have more meetings, much as some technologies create more paper instead of advancing us toward the paperless office. But technologies that we use to streamline the rest of our lives, standard stuff like email and web browsing, can minimize the number and duration of meetings.\nStatus Reports # The most important email everyone can issue is the the weekly email report. Rather than wait for a meeting to go around and ask everyone for a status report (the most painfully boring type of meeting), the reports instead can be composed and emailed by each member of the team before the meeting — ideally, the day before the meeting. Then everyone can put some time and thought into the report, instead of dredging it up on the fly in the meeting, and everyone can spend some time digesting the reports before the meeting and consider issues to bring up at the meeting.\nIn all cases where I’ve seen the weekly email report initiated, the time spent in the weekly meeting easily halved, and the content of the meeting was more focused. Moreover, email reports serve as written records that can be easily referenced, instead of “I’m sure I mentioned this at the meeting two weeks ago….”\nWhether or not the weekly report happens before the meeting or during, the content should not be “what I did this week”. (I had one coworker recount his trip to the dentist, and that was one of his more productive weeks) It’s a “status” report, not a “what have you been doing” report. If you’re more concerned about how people are spending every minute than what actually gets done, then you’re better off installing monitoring software at every workstation. Asking people what they’ve been doing sends a message that you care more about looking busy than what’s actually getting done.\nThe report should contain information that is actually useful and gives everyone else on the team a feeling that they know what’s going on. And, to put it crassly, it’s also a CYA device for developers who feel their contributions and concerns may be glossed over by their managers. (To put it less crassly, think of it as an implementation of the open-door policy that companies like to brag about) The reports should include:\nChanges made to the system that everyone else should see. (For source code, these are changes committed to the source code repository and can be verified by others, not in-progress code that is on the developer’s machine).\nDependencies that the developer is waiting on — hardware, test cases from QA, code from other developers, decisions from management.\nProblems that require attention — current approach is not working out, the developer is overloaded, progress is slow and target date will not be reached without more resources or trimmed features.\nEveryone should issue a weekly report, not just the programmers. There are a lot of tools for monitoring software development — keeping track of marketing, sales and management activity is another matter. If every department is made more “transparent”, that can counter the typical perception from engineers that everyone else is on a coffee break while they’re under the gun. And if it turns out some people don’t have anything to report (or are reporting the same thing for weeks on end) then now you know you’ve got a situation.\nThe Intranet # All project information should be accessible on a local intranet server. These days, it’s not uncommon to find a wiki set up on the intranet — this makes it easy for project members to add and correct project information. And then there’s no excuse for anyone to not understand what’s going on in the project.\nBad Technology # On the other hand, say no to instant messaging and any other form of communication that facilitates interruption. Whereas use of email promotes thought and clarity in expression and response, instant messaging caters to the short attention span. I had one manager who couldn’t stop reading and writing her IM even while I was standing next to her giving a status report. Great example for the staff!\nSome managers don’t like their employees wasting time instant messaging with the outside world, but internal IM is even more damaging — coworkers and managers will get in the bad habit of expecting instant responses to off-the-cuff questions, instead of well thought out answers to valid questions.\nStay Focused # Have an Agenda # It’s easier to get decisions made in a meeting if you plan the meeting that way. There are few events more uninteresting than going around the room asking for each individual to give a report. Once you get rid of the round-the-table what-have-you-done routine, then it becomes clearer that you should have an agenda (and if you can’t think of one, then there’s no point in having the meeting).\nCertainly, a standard part of the weekly meeting agenda should be to address any concerns that have been raised in the weekly reports.\nRelease the Hostages # Now that you have an agenda for your meeting, stick to it. This doesn’t mean slavish devotion to a list or formula — just remember why you’re there.\nSome people take advantage of having a captive audience in meetings. One company president would regale us with a review of last weekend’s movie she saw or game she played, or relate some formative event in her life. Another producer would spend the beginning of the meeting telling bawdy stories and insulting the French, then snap at everyone else to stay focussed. Remember, it’s not a social gathering. Save the fraternizing for happy hour.\nStart on Time # The first aspect of a meeting is, obviously, starting the meeting. Adhering to a strict start time sets the right tone — get going, get to the high points, and get this meeting over with so we can get back to work. On the other hand, inconsistent start times not only waste time as people sit around waiting for the meeting to start, it sends a subtle message that time is not valuable, or that some people’s time is not as valuable as others.\nI had one manager who would repeatedly postpone a meeting to attend to various things, and then she would complain about how she had to round up everyone for the meeting when it actually took place. Not only was this was just annoying, but it meant no one could effectively plan their work around the meeting — you would either get interrupted right in the middle of trying to figure something out or you’d be twiddling your thumbs waiting for the damned thing to happen. Not a good way to promote time management discipline in a project that was already challenged with a tough schedule.\nEnd on Time # The reasons for starting meetings on time also apply to ending them on time.\nThe best regular meetings I ever attended were held by an MIT professor for his research group who always ended his weekly meetings on time. Even if there were more items that could have been discussed, the professor still adjourned the meeting and we tabled the discussion for next time. I left that meeting never feeling that it dragged on, and on at least a few occasions I felt it was productive and worth the time!\nEnding early is OK, but letting a meeting go over the prearranged time is the same as allowing a schedule overrun. If you can’t keep a meeting on schedule, what hope is there for keeping the project on schedule?\nWrite it Down # Have you been to meetings that seemed like the movie Groundhog Day? Same day of the week, same time, same topics, only it feels like you’re the only one who remembers going through all of this before. (“Vampire topics” that repeatedly come back to life, as one of my friends termed them) Or perhaps you’re one of the blissfully bringing up the same topic again and again.\nI participated in a two-day annual sales meeting for a startup company where supposedly we discussed our product plans and marketing strategies. You’d think in a startup with one product and only a handful of sales and marketing folks, someone would remember whatever was decided at that meeting, but I found myself repeating peevishly for months, “We discussed this at the meeting!”.\nThere’s not much point to a meeting where decisions made are not remembered. So make sure everything of note in the meeting is written down and distributed to everyone who should know what’s going on. The intranet wiki is a great place for that — then you have a history of meeting results that you can refer to.\nThe problem isn’t always due to short-term memories (possibly salespeople only remember as far back as their last commissions). Sometimes memory is selective, especially among management.\nOn a video game project where I was the sole programmer for a specific platform, the president of the company asked if we could develop an interactive previewer for that package. I responded that we didn’t have the manpower to do that and stay on schedule — if it was important, we needed a tools programmer. Yet that topic kept coming up — either she kept forgetting my answer or thought I would eventually forget.\nAnd if you do have someone record the meeting results, make sure the recorder can do so reliably. Case in point: one of my coworkers who was regularly aggressive in pushing his own agenda was all too eager to record our weekly meeting results. Somehow, the meeting minutes always indicated his opinions had prevailed.\nHaving a fictitious record of a meeting is even worse than having no record.\n","externalUrl":null,"permalink":"/books/techsoft/minimizingmeetings/","section":"Books","summary":"What have here is a failure to communicate.\nAvoid These Meetings # I’ll take a strong stand on meetings right off the bat — meetings are evil, and not even a necessary evil. In my first job out of college, the weekly meetings were painful experiences, filled with senior blowhards taking credit for work done by junior staff. After travelling on business one week, I enjoyed skipping the meeting so much I just stopped attending (shades of Office Space!). Apparently I didn’t miss anything, I got more work done, and no one bothered me about it.\n","title":"Minimizing Meetings","type":"books"},{"content":"Is this going to be a standup fight, sir, or another bug hunt?x\nTest Early # Testing isn’t something you do when you’re almost finished. It’s something you do as soon as you have something running. It’s not just management that is proned toward delaying testing — programmers are often just as bad.\nOn my first commercial software project, the software was so incomplete and crash-prone that I was reluctant to give the first “alpha” build to our test group. Fortunately, the QA manager insisted, and the resulting bombardment of bug reports forced me to immediately focus on the problems that prevented the testers from exercising the application in any meaningful way. Left to my own devices, I would have worked on what seemed to be the harder and more important core 3D issues, and probably delayed too long on seemingly mundane issues like the user interface, load-save functionality, and compabilility with all the varieties of consumer hardware we were planning to support.\nThe bug count on any project has to go up before it goes down. Get that spike early and you can whittle it down gradually, instead of attempting to deal with it at the end.\nTest Often # Once you start testing, keep testing.\nOn my first console game project, our publisher didn’t have QA department look at our game until just before E3, the big game industry trade show where retailers get a look at the upcoming games. That bit of testing just provided foreshadowing of bug reports to come — after the show they didn’t look at the game again until less than three months before the submission date. Within a week we had several hundred bugs logged.\nTesting should be a continuous part of the development process, not a footnote.\nTest Everywhere # Test on all the platforms that you plan to support. You can’t assume that a product running on a system will run on all minor variations of that system.\nAt a computer graphics software company developing applications for SGI workstations, our chief sales guy proudly informed me he sold thirty seats of our product to a prominent video game developer. Unfortunately, those were thirty licenses of a product that was still in beta, and the customer was planning to run on new SGI workstation models that we hadn’t even seen, yet. I had to make two followup visits to the customer — one to make a feeble attempt at diagnosing our product crashes on the new machines, and the other to get yelled at by the customer (they were yelling at one of our sales support guys, but he couldn’t take it any more so they sent me in as a replacement)\nIn an ideal world, everyone would have access to the every platform of interest. Usually, there will be compromises due to constrained budgets or limited availability of the target hardware, particularly if you’re in a small company. I’ve seen several situations where the QA group was first in line for all new types of hardware, probably reasoning that QA is responsible for testing on all platforms (turf may have something to do with it, too). But assuming there’s logic behind it, that logic is misguided.\nSoon after I joined the aforementioned graphics software company, the QA manager chastised me for not testing my code before I integrated it into the test build. Well, I did test it on my workstation, but it happened to fail only on hers because it was the latest and greatest model and she had the only one (This was at a time when it seemed like SGI was cranking out new models every couple of months, each with new subtle hardware and software incompatibilities) This meant I had to sit at her desk to try to diagnose the problem.\nEvery programmer knows it’s ridiculously more difficult to track down and fix code on a machine that’s not set up with a development environment. So you can save everyone a lot time and grief by making sure the programmers get first dibs on new hardware (as long as they use it!)\nTest Everything # There’s not much point in just testing the obvious — test what the developer may have overlooked. Exercise boundary conditions (zero dollars, empty text values, empty files), feed the program garbage data (negative numbers, text instead of numbers, non-alphanumeric characters, random files). Treat it like a game, where the goal is to find a way to break the program.\nTest Methodically # It’s just as important to know what works as what doesn’t work. So record all test results. Better yet, write down a test procedure. Even better yet, automate testing as much as possible. Not only does automated testing, in the same manner as automated build and backup procedures, give you confidence that you have a known and reproducible process, but it allows you to test conditions that are impossible to create manually.\nAutomated testing is especially important in simulating network usage. When I worked on a networked virtual military exercise, manual testing revealed a lot of interesting bugs (submarines flying above water, ships plowing through continents, planes flying backward), but problems with handling high network traffic didn’t become apparent until the exercise day when I turned the switch on and our whole system crashed.\nWeb-based systems in particular should always have automated test systems. A lot of web startups see their products work with a few users and just extrapolate. I was horrified, after moving from the Bay Area to a startup in Venice, CA, to see the web server team test by asking a few employees to try connecting to the server at the same time. And I was more horrified to see that test crash the server immediately.\nBug Reports Welcome # Testing is everyone’s responsibility. Hopefully everyone involved in developing a software product will actually run that product. So take advantage of that manpower by making it easy for anyone to submit a bug report.\nWhen I worked with Silicon Graphics as a vendor, back when they were top dog in the graphics world, I had a love-hate relationship with them. Mostly the latter. Their developer support program was great, unless you wanted to report a bug. They officially could not receive bug reports — those had to be submitted to their (paid) customer support program which only accepted problem reports over the phone, via a receptionist who would take down your phone number and workstation system ID, and attempt to jot down the description of your problem. Weeks later, a junior engineer would call you back so you could repeat the problem description. Then the engineer would be transferred to another group and another engineer would call you.\nIt’s one thing to solicit bug reports from everyone, it’s another thing to actually get them. Only the truly motivated will report bugs if the process is at all inconvenient.\nI worked with one QA group that put together a sorely-needed online bug entry form. The bad news — it looked like a tax form. Field after field, all mandatory and without convenient default values. The result, hardly anyone outside QA would submit a bug report, and any that were submitted tended to have misleading wrong data. Keep the bug reporting process simple. It’s a bug report, not a TPS report.\nShow Me Yours, And I’ll Show You Mine # By the same token, use your customers as testers. Companies often do this with beta and even alpha releases, but there’s no reason to stop there. Assuming you have a real customer base, the real testing will start when your product ships.\nI wasted several months fretting over a mystery bug when developing a product for SGI workstations and ended up releasing the product with a convoluted workaround. After several months of complaining alternately to our compiler vendor and to SGI, and then tracking the behavior down to a particular ordering of the libraries passed to the linker at build time, our SGI support contact informed me that it was a known bug that had been on the books for a year.\nIn contrast, one of my favorite experiences in adopting Java has been the Sun Bug Parade, which has allowed me to check if a bug I’ve encountered has been encountered by others, and what the current status is. As a bonus, the Bug Parade allowed you to vote for the bugs that you consider most critical and displays the current vote for each entered bug.\nProtect the Database # QA has their own product — the bug database. The bug database represents the state of the product and should drive all development decisions. Thus it should speak the truth.\nA month before the release date of a 3D graphics program, the company president insisted that VRML support had to go into this release (“I just want it”, was his cogent argument). After we wasted a couple of days trying to cram it in, I pointed out that our bug database listed 300 bugs, most of them categorized as high priority. The president said “Oh, I didn’t know we had so many bugs” and changed his mind.\nJust about every QA group I’ve dealt with would escalate originally low priority bugs to higher priority toward the end of a project as a not-so-subtle way to tell developers what to fix. That is a misuse of the bug database — if all the critical and high-priority issues are resolved, don’t relabel low-priority issues as critical. Just say it’s OK to fix low-priority bugs, now. If management has prohibited work on low-priority bugs, then fix that (at least the edict, better yet, fix management). And don’t downgrade a bug just because no one wants to deal with it.\nThe grandest act of wishful thinking I’ve seen applied to a database was invoked by a game publisher who ordered their QA staff to mark all remaining bugs in the database as fixed after we made what we hoped was our final submission. As if the bugs would really just disappear just because the product was going to ship. The tactic made even less sense considering the European version of the game still had to undergo localization, testing and submission.\nCooking the QA books is not as illegal as cooking financial books, but it should be. Protect the integrity of the database.\nYou’re Not the Boss of Me # I’ve met a few QA people who somehow thought that QA was on top of the organizational pyramid.\nWhen CMM was all the rage, a QA coworker of mine gave a presentation on the topic and concluded that his group should oversee all of development, meanwhile waving the CMM book that clearly stated that shouldn’t be the case (there should be CMM oversight of both groups, but considering we had fifteen people, I don’t know why were talking about it at all)\nMost QA professionals I’ve met, depending on the industry, were in it as an entry level job (in game development, it’s touted as a first step to becoming a game designer) or as a less stressful alternative to programming (one tester told me she just didn’t like thinking about code after coming home from work — I don’t blame her!). But it’s the type of job that can attract cops and bureaucrats.\nI worked with one QA manager who, while a nice guy, liked to lecture the development staff about proper procedure. It surprised no one when he casually mentioned that he used to be a traffic cop.\nNow, I love working with testers who want the product to be the best possible. But the best way for QA to estrange the development staff is to take things personally.\nOn the first project where I was a manager, the QA lead was originally going to assign a senior artist to test the graphics product we were developing, on the theory that experienced professionals in the field were best acquainted with the valuable features of the product. That might have worked out OK, but I’d seen enough problems dealing with some senior (and even junior) testers who were accustomed to thinking of bugs as impediments to their own pet art projects (one guy’s bug reports consisted of “It’s broken”, “I didn’t do anything”, and the ever helpful “Fix it!”) rather than behavior they should attempt to discover, reproduce and track down. Since I was more interested in getting quality bug reports (or at least peace and quiet) instead of whining or tantrms, I almost begged the QA manager for the services of one even-tempered entry-level hire. I think that paid off — he did a great job sitting through crash after crash and submitting dozens of detailed bug reports every day until the code got stable.\nRemember, as a tester you’re paid to find and help track down bugs. Disgruntled, whiny customers can be had for free.\nBut You’re Not Peons # On the other hand, management needs to understand that QA is an intrinsic part of software development, not a cleanup crew shuffled in at the end of various projects. Especially, when you have a salaried QA group.\nWhile working on a long-term hugely spec’d proposal processing server for the Hubble Space Telescope, I was both bored and stymied (I’m not proud of this) and instead spent my time on a little stealth project, a GNU Emacs mode for editing proposals. It attracted some interest from in-house users and management, so I trudged down to the QA room, where I found everyone was sitting idle (as you may guess, we weren’t cranking out a lot of software). The lead tester showed some interest in trying out my program but said he couldn’t spend any time on it without permission from his boss, then returned to his solitaire game. Your tax dollars at work.\nIt’s not just a matter of keeping people busy. QA knows how to use your product as well as anyone else in the company, and probably better. Use that expertise.\nSometimes it seems people want demos to fail. I’ve had several managers who habitually dropped into my office expecting impromptu demos for a VIP right while I’m coding. One was apparently unaware that I arrived at work three hours early to prepare a demo and decided to bring the visitor back a few hours later so he could watch me compile and crash. I got so irritated at another that I let him run the demo himself and flail in the debugger. In each case, the QA guys were in the room next door. Not only were they painfully aware of what potholes to avoid if they wanted to try out various features (“don’t click there!”), they also knew which build from the past several days would demo best.\nBut testers aren’t just useful for demos — they are your experts on the state of the product on the state of your product. If you want to know how close your product is to release, ask them.\nThe one project where I had total greenlight authority, I consulted not upper management (who kept demanding new features), or marketing (who wanted to delay the release date for no good reason), or sales (who proudly sold a site-license for an unfinished and crash-prone version of our last project to a high-profile customer) — I asked the guy who’d been testing it every day for six months. If he said it was ready, it was ready.\n","externalUrl":null,"permalink":"/books/techsoft/qa/","section":"Books","summary":"Is this going to be a standup fight, sir, or another bug hunt?x\nTest Early # Testing isn’t something you do when you’re almost finished. It’s something you do as soon as you have something running. It’s not just management that is proned toward delaying testing — programmers are often just as bad.\n","title":"QA for Everyone","type":"books"},{"content":"I’ve had a surprisingly good run working independently, dabbling in my own projects and paying the bills with consulting and contract development work. There’s always the possibility I’ll have to get a regular job again (I’ve had some long dry spells), but as I mentioned in an earlier article, one reason I’m not anxious to get back in to the 9–5 (or 12–9, as my schedule tended to be), is that office space has gotten worse: I’ve seen the industry transition from giving programmers plenty of space or even their own offices to cubicles euphemistically termed “open offices” to the really open offices where we’re all sitting at the same table wearing headphones and avoiding eye contact with the people sitting around us, like New Yorkers on a subway.\nThe other aspect of the industry that’s gotten worse is the job interview. During the on-campus interviews at MIT in my senior year, there was one puzzle question from Xerox PARC (I blame Microsoft for popularizing the practice), and one quiz from an IT consulting firm whose rep looked embarrassed at handing it out. All the other interviews were conversations. My favorite was BBN, whose rep asked about my interests and advised me that at least one of them warranted going to grad school. When I mentioned that I thought I remembered him speaking at the BBN open house, he said “yeah, they make me do everything there”, and later I found he was a VP at the company! From then on, I really wanted to work there.\nHowever, my first job was at Texas Instruments, and during that interview they put me up in a nice hotel (high floor of a Sheraton), took me to a nice lunch, listened to a presentation of my bachelor thesis, showed me a demo of their project which I slept through, and then hired me while the manager who didn’t like my low grades was away on travel.\nIn contrast, at a Bay Area job interview twenty years later, I flew to San Francisco on my own dime because I didn’t want to do a three-hour skype interview, the first interviewer hadn’t read my resume, asked me about object-oriented programming because he didn’t see what the point was, then asked me to write some code on a whiteboard. I said I didn’t work that way. He said that’s how they worked. I thought that was a terrible way to work (we actually did that at one company and then threw away the design once we started coding), and said I expected to be asked questions like how I implemented HTTP when I developed a WAP gateway instead of a quiz question like “explain what HTTP is”. Whereupon he informed me the next interviewer was planning to ask me to explain what HTTP is. So I thanked them for their time, apologized for terminating the interview, and said since I’d flown up at my own expense I was going to enjoy the afternoon and go to the Asian museum (which I highly recommend, by the way).\nIt shouldn’t be surprising that my favorite interviews resulted in my favorite jobs, like both parties of a first date hitting it off. For example, probably my briefest interview was for an MIT research position involving C programming, and the professor just asked if I was comfortable picking up a new language, and I said sure, it’s no big deal. That was good enough for him (and I got the hang of C after about a month).\nAfter that, I finally got to work at BBN, and the interview was like a bunch of nerds exchanging interests (one kept talking about wavelets). That’s also where I finally got my own office. They did ask if I was comfortable taking over code instead of writing stuff from scratch, and I said of course, that’s reality, man.\nAt Nichimen Graphics, full of ex Lisp machine programmers and surfers, people would just wander into the room while I explained my background and projects and what I found interesting in their company and product. I liked the informality and casual atmosphere, even though I had to start my spiel from the beginning several times over.\nBut like dark clouds on the horizon, I could see the trend. When I interviewed with three groups at one research institute, two of them gave me quiz questions. One was such a simple question (how to traverse a linked list), I finished writing the code before the interviewer finished turning around after saying “take as much time as you need.” The other question was something about garbage collection which I thought the interviewer got wrong. So I opted to work in the third group because they didn’t ask me any silly questions. Which is probably not the most pragmatic approach to career decisions, but hey, principles. And at least I didn’t just toss the quiz into the trash like another applicant did (he later wrote a popular programming book).\nAt least those interviews still had an interview part. My first introduction to the all-quiz format was a phone interview with Google. The guy said he was going to ask me some Java questions, I said I haven’t used Java in a couple of years but OK, then he apparently thought that meant I’d forgotten all of Java so he would try C. Whatever.\nAfter an uninteresting session of how-would-you-implement-this over the phone, he asked if I had any questions for him, and all I could think of was, what kind of stupid interview is this where you show no interest in anything I’ve done, and should I take his invitation literally and start quizzing him? But I just said no, and the lack of interest was mutual. When I told a Google recruiter years later that I’m not going through that again, he assured me they vastly improved their process by cutting down the number of quizzes.\nAs with Microsoft and puzzles, Google popularized the quiz-first interview, but the game industry is hard-core about it. Members of one game studio cautioned me not to get too upset at the upcoming questioning. My favorite question was non-technical: “Why do you want to work here?” “I haven’t decided, yet.” The quizzer was actually a cool guy and apologized for the quiz a few years later after going through a guantlet of them himself. I was baffled at another interview because the quizzer was someone I worked with before. I was thinking, don’t you remember working with me for a year?\nA lot of this quizzing business is just lazy bureacratic screening (after a phone quiz with Amazon, they got back to me and said a different position opened up, I just had to answer all the same questions I answered last time), but some of it is showing off. A virtual world startup (back when virtual worlds were hot) required me to take an online quiz, then a bonus question over the phone, and then a talk with the CTO, who quizzed me step by step over the construction of a hypothetical compiler, and at one point said let’s assume you answered this part incorrectly, so he could go through an explanation.\nAfter that, they said they’d fly me up for an on-site interview, but changed their minds and wanted one more phone interview with a team lead. I said OK, thought about adding “as long as there or no more quiz questions”, but thought that was snarky and unnecessary. I was at least half wrong. The lead started off by asking me to come up with a classic circle-drawing trick (I think you can find it on folklore.org), I decided that was a quiz too far and I was getting hungry, so I terminated the interview.\nThe quizzing can also backfire if the interviewer is wrong. At one startup, I had an overall nice interview because I insisted on meeting everyone and making sure I got a good vibe (after being at a stressfully political place), but one lead did ask me some quiz questions and he thought that grabbing a lock in Java prevented any other methods from being called on that object, whether or not they also tried to grab the lock. I got the job, anyway, and he was a good programmer, just confused on that topic (just about every programmer I know is confused about something – often it’s Unicode), but it does beg the question: if the interviewer is asking an important question and doesn’t know the answer himself, should he quit? Get a job in Customs?\nAnother time when the quiz answers don’t seem to be important is when I mention I was invited to apply by the founder. That’s happened a couple of times and in both cases the quizzing stopped, and the interviewer said “Oh, never mind this, then.” That’s almost worse than being quizzed. Then I think, “So it’s that kind of place.” And in each case, it was.\nI’m not saying don’t ask any questions, of course, but instead of handing out quizzes like a teaching assistant or expecting candidates to perform like monkeys at a whiteboard, you should be asking good, useful questions that reflect well on you and your company like the ones you should be asking as part of your work. Questions that have a point and are based on research. Read the resume, look at the github repos everyone’s asking for these days. I got in a tiff on Quora with a recruiter who insisted that “Why should I hire you?” is a necessary interview question. I assure you I have been on both sides of a lot of interviews, and no one has been crass enough to ask that (or said, “Why should I work here?”).\nIt’s not hard to weed out candidates with conversational questions, like “What classes did you use in your Java project” (that was a softball thrown to a junior-level developer and drew a blank), “Why did you use XML instead of …?” (again, couldn’t answer…), and often, maybe I’ve watched too many police dramas, if you let them talk they’ll do themselves in. Like that candidate who kept evading my questions about his work and talking about how he liked Asian women. Now, that wouldn’t have come out in a quiz.\n","externalUrl":null,"permalink":"/books/techsoft/artoftheinterview/","section":"Books","summary":"I’ve had a surprisingly good run working independently, dabbling in my own projects and paying the bills with consulting and contract development work. There’s always the possibility I’ll have to get a regular job again (I’ve had some long dry spells), but as I mentioned in an earlier article, one reason I’m not anxious to get back in to the 9–5 (or 12–9, as my schedule tended to be), is that office space has gotten worse: I’ve seen the industry transition from giving programmers plenty of space or even their own offices to cubicles euphemistically termed “open offices” to the really open offices where we’re all sitting at the same table wearing headphones and avoiding eye contact with the people sitting around us, like New Yorkers on a subway.\n","title":"The Art of the Interview","type":"books"},{"content":"This book introduces Unity starting with installation and activation, learning the interface with the included Angry Bots demo, and then builds up successively more elaborate project examples from scratch and using free assets from the Unity Asset Store. A simple spinning cube and dancing skeleton scene is constructed, but most of the book is devoted to building a 3D bowling game with the control style of HyperBowl. The game is first developed and tested in the Unity Editor, incorporating graphics, scripting (with JavaScript), physics, sound, user interface, complete rules for a bowling game, and mouse controls. The game is then adapted to run on iOS with touchscreen and (a little bit of) accelerometer input. Testing with the Unity Remote, iOS Simulator and real devices is explained, Game Center and iAd integration is covered, and then optimization techniques are described. The book concludes with a brief treatment of miscellaneous topics such as C# scripting, Unity Editor scripting, Android development, and tracking and promoting sales.\nSome retail descriptions list Unity\u0026rsquo;s Mecanim animation system. The book does mention but does not use Mecanim. Instead, a chapter is devoted to a dancing skeleton example using Unity\u0026rsquo;s Legacy animation system and a free skeleton package on the Asset Store. Also, some retail descriptions list Unity\u0026rsquo;s support for gyroscope on iOS devices. The book does mention but does not use Unity\u0026rsquo;s gyroscope API (Input.gyroscope). The book does describe how to access the touchscreen (Input.touches), accelerometer (Input.accelerometer), and webcam (WebCamTexture).\nTechnical review was provided by Marc Shårer of Gayasoft.\n","externalUrl":null,"permalink":"/books/learnunity4/about/","section":"Books","summary":"Summary","title":"About","type":"books"},{"content":" Explore Further # You might be experiencing deja vu, because we started with the Angry Bots demo as our first project and now we’ve returned. The difference of course is now we’re building the project for iOS. We\u0026rsquo;ve taken baby steps, changing the build target to iOS, testing in the Unity Editor with Unity Remote, and then building with Xcode to run in the iOS Simulator. The next step, building to run on a real iOS device, will take place in the next chapter, and then we\u0026rsquo;ll return to our regular programming, the bowling game. By then, hopefully, you\u0026rsquo;ll be comfortable with the build process and can concentrate on making the game an iOS game!\nUnity Manual # Because the discussion has returned to Angry Bots, it’s fitting that the first relevant section in the Unity Manual is the “Unity Basics” section, specifically the page on “Publishing Builds.”\nThe Unity Manual also includes several sections specifically about Unity iOS, although you may have to click the iPhone icon at the top of the manual to make that content visible. The section “Getting Started with iOS Development” is somewhat out of date as of this writing, but its page on the “Unity Remote” is still useful to explain how to set up and operate that app.\nMore recent documentation on Unity iOS is listed in the “Advanced” section of the Unity Manual, including a page on the “Structure of a Unity Xcode Project.” It’s a good idea to become familiar with the files in the generated Xcode project, but you won’t be messing with the Xcode files generated by Unity, except to enable the built-in profiler when you get to Chapter 16.\nReference Manual # Most of the work in getting Angry Bots to build consisted of filling in appropriate values in the Player Settings. This chapter provided a cursory overview of the iOS-specific settings, and only the Default Orientation and Device SDK settings are important for running in the iOS Simulator, but the “Player Settings” page in the Reference Manual details each of the individual cross-platform and iOS-specific Player Settings, along with the settings for other platforms.\niOS Developer Library # Download links and documentation for Xcode are available on the Xcode page at the Apple Developer site. One of the great things about using Unity for iOS development is that you can avoid needing to know much about Xcode and Objective-C. But still, learning your way around Xcode and understanding Objective-C code can only help.\nIn addition to the Xcode documentation you can find under its Help menu, there are links to developer documentation from the Xcode web site. There are many other articles listed under the Xcode topic, and many are also available in the Xcode Help menu, including the Xcode User Guide and Xcode Basics Help.\nThe iOS Developer Library Lists Xcode under Topics, and most of the relevant “IDE” section of the Xcode topic can be found in the iOS Simulator User Guide. The guide is extensive, featuring multiple chapters that expand on the introduction in this book to the iOS Simulator, explaining how to launch the simulator from Xcode, how to operate the simulator, and how to invoke simulated device input.\nAlthough, Unity does a lot to shield you from working in Xcode, and in this chapter you literally just had to click the Run button in Xcode to run the iOS Simulator, it’s a good idea to read up on the tool in preparation for the next chapter, where you\u0026rsquo;ll learn how to build and run our app for testing and build for submission to the App Store.\n","externalUrl":null,"permalink":"/books/learnunity4/chapters/chapter10/","section":"Books","summary":"Explore Further # You might be experiencing deja vu, because we started with the Angry Bots demo as our first project and now we’ve returned. The difference of course is now we’re building the project for iOS. We’ve taken baby steps, changing the build target to iOS, testing in the Unity Editor with Unity Remote, and then building with Xcode to run in the iOS Simulator. The next step, building to run on a real iOS device, will take place in the next chapter, and then we’ll return to our regular programming, the bowling game. By then, hopefully, you’ll be comfortable with the build process and can concentrate on making the game an iOS game!\n","title":"Using Unity iOS","type":"books"},{"content":"","externalUrl":"https://web.archive.org/web/20130305093043/http://drupal.technicat.com/","permalink":"/about/old/drupal/","section":"About","summary":"","title":"Drupal","type":"about"},{"content":"","externalUrl":"https://web.archive.org/web/20010422002627/http://www.technicat.com/","permalink":"/about/old/forrest/","section":"About","summary":"","title":"Forrest","type":"about"},{"content":"Does that come with dental?\nFind Your Next Job Now # I’ve had twelve salaried jobs so far (nothing to brag about, I know — it probably indicates I’m pretty good at getting a job, but not so good at picking one) and I’ve been called a “short-timer” by many of my ex-coworkers. But in retrospect, it’s apparent I’ve never left too soon (unless you count the severance pay that I missed). Even if you’re reasonably content with your current job, you should be prepared if it becomes time to find a new one. Even if you have to settle for less just to pay the bills, you’ll be ready when opportunities present themselves.\nKnow What You Like # Rather than waiting until a new job opportunity shows up and then rationalizing that it’s a good move, recognize early on the type of work that interests you.\nI made one of my worst career choices when moving to Silicon Valley. Moving to the center of the dot-com boom near its peak was a good move — taking a job offer because it was convenient was the mistake. With a little more effort I could have continued talks with AvantGo, a company that appeared to be filled with talent and developed mobile applications, one of my top interests. Instead, I went to a software startup that had just been acquired by PRI Automation, a supplier of semiconductor fab equipment company I knew and respected the CTO whom I had worked for previously, and they offered me a job almost immediately. After a wasted year of turmoil and corporate intrigue, during which I found the whole field of manufacturing completely boring (and the state of manufacturing software completely appalling), I found another job at a mobile internet startup called Neomar. That didn’t last long, either, but it was a lot more fun, and we had a product out in six months.\nDon’t fall into the trap of just taking a job because it’s convenient, or because you’re dissatisfied with your current job and anything new sounds better.\nKnow What You Want # I have an uncle, a Silicon Valley executive, who has tried to impress upon me the importance of having a five-year career plan. I still prefer to wing it (and look where it’s got me), but I do feel you should know the direction you want your career to go.\nMy best career move was in leaving the defense contractor BBN for a small company developing commercial 3D software called Nichimen Graphics. BBN had a great technology history and culture, but I’d worked on corporate and government projects for my entire career, and, especially with the Internet boom starting, I wanted to work on products that you didn’t need a security clearance to use. Nichimen didn’t last long, but it turned out that I really did get more satisfaction from delivering shrink-wrapped packages to real consumers, and small companies moved at a pace that I enjoyed.\nFigure the Odds # My advice — don’t take a new job unless it offers at least two distinct things that appeal to you.\nI once asked a prospective employer what I would get out of the job. The only reason she could come up — “You’ll learn a lot.” And I did — mostly, that I shouldn’t have taken the job.\nIt’s a matter of risk management — if you change jobs based on one reason, it may well turn out that rationale was invalid. But if you have more than one reason for taking the job (and being unhappy with your previous job doesn’t count), then there’s a decent chance you won’t feel like you made a terrible mistake.\nPeer-to-Peer Networking # Recruiters writing job-advice columns love to tell you how you should network by calling up all everyone you know when you need a job. But that’s not networking, that’s panhandling. It’s what recruiters do, but it’s pretty annoying.\nMost of my jobs and all of my contracts have come through referrals by friends and colleagues, and I try to keep them in mind whenever I hear of an opportunity any of them might be interested in. On the other hand, there are those who only seem to remember me when they want a contact name or even a personal introduction (a lot of salespeople fall in this category). Those guys are on my anti-networking list.\nNetworking is an economy — you get out of it what you put in. If you contribute answers and useful information to discussion lists, then you will more likely be rewarded with assistance when you need help (and more likely to be treated with leniency if you ask a dumb question). If you help people get jobs, then you will more likely be remembered when those same people hire or make referrals. Those who only reach out when they need a job, a loan, or introduction to business contacts are as welcome as the pal who calls only when he needs help moving his sofa.\nMost importantly, be good at your work. People will remember, and the jobs will come to you. Don’t Waste Time on Recruiters\nI’ve known people to get jobs through third-party recruiters, and I’ve managed to get some decent interviews and even a couple of jobs (but not good ones) through recruiters. So I’m not saying don’t use recruiters, but don’t let them waste your time.\nThe last recruiter I wasted time on was an outfit called Remington International, a high-flying outfit located in a fancy Westwood, LA office tower. At least one of their staff was honest enough to tell me that if I didn’t check with them every two weeks they would forget about me. This was after waiting in the lobby after being warned the previous day not to show up late, and then sitting through a “practice inteview” in which I was supposed to give them leads at every company I’d ever worked at. But it was entertaining to watch the recruiters running around giving each other high-fives.\nDon’t be misled into thinking that recruiters work for you.\nAt the height of the dot com boom, I applied for a position advertising a high salary. But the recruiter from the imaginatively named firm General Employment not only assumed I was at his beck and call (“Hey, I scheduled an interview in an hour — can you show up?”), he spent most of his efforts knocking down my asking salary. “It’s not 140k, that was a mistake. It’s 120. So you’ll take 110?” Maybe his rent check was due.\nThird-party recruiters work for themselves — they get paid when they close a deal, like realtors (but without the license or two-week course).\nBe Prepared # Do Your Research # In this great Internet day and age, it’s easy to do some research on your prospective employer. Any self-respecting company, including startups, will have a web site, where you can check out the company history, management and products. Not only will this allow you to form an initial impression of the company, this will give you a foundation for asking some questions during your interview, either to impress your interviewers with your preparedness or to figure out if these guys are for real.\nQuiz Show # I don’t like interview quizzes (made fashionable years ago by Microsoft and more recently by Google.\nBut quizzes are a fact of life and you should prepared for them. I prefer asking candidates about their projects, why they made the choices they did, and what tools they used. Anyone who actually accomplished anything should be able to answer those questions.\nDuring the height of the dot-com era, I interviewed a Java programmer who cited involvement in several Java web projects but could not name a single Java classes she used in any of those projects. And yet she expected close to a six-figure salary!\nIt’s easy to forget the various tools, languages and API’s that one encounters in a programming career, but take the time to review them and jog your memory before the interview.\nOne C++ game programmer I interviewed kept talking about “object orientated” programming. That was really distracting.\nDon’t Ask, Don’t Tell # Important as it is to refrain from discussing race, sex and religion in the workplace, it is even more crucial to keep your opinions to yourself in the interview. There are plenty of federal regulations intended to prevent those factors from keeping you out of a job, so take advantage of that protection. If it means that much to you, you can inflict your opinions, pecadilloes and dogma on your coworkers-to-be when they’re stuck with you.\nPut Your Best Face Forward # This is stating the obvious, but make a good impression.\nI interviewed a technical writer who was looking to make a move from Chicago to the bay area during the dot com boom. On the cover of the technical report he submitted as as a writing sample, “technical” was misspelled.\nCross your t’s and dot your i’s.\nDon’t Look Like a Mercenary # Of course, money is important (unless you’re fortunate enough to be young, rich and stupid). But when you’re applying for a job, you should at least pretend that money is not your only motivation.\nA coworker introduced me over a cheap dinner to a friend of his who expressed some interest in working for our company. His only real question to me was “how much does the job pay?”. Considering he didn’t have much to say about himself, and we weren’t a large company looking for a Level 2 Software Engineer with a specific pay grade, I had no idea and little interest in coming up with a figure. I couldn’t tell how good he was, but I was under the definite impression that his primary interest was in finding a higher salary.\nDon’t Be Late # First impressions make a difference, and showing up late to an interview is just about the first possible bad impression you can make.\nI used to have a terrible punctuality problem, but the worst was when I showed up a half hour late for an interview with iRobot — I left work at what I thought was the last possible momemnt and then crawled through commuter traffic all along the Charles River. For some reason, I seem to be more punctual these days, possibly because I no longer deal with Boston traffic, but also I try to get there a bit earlier, at least to scope out the lay of the land.\nScheduling yourself to arrive fifteen minutes to half an hour early gives you some safety margin — and if you do get there early, it gives you time to check out the office building and check out the surrounding area.\nDon’t Be Weird # If you’re rich and weird, you’re eccentric. If you’re interviewing, keep a lid on it.\nI conducted one of the most painful interviews of my life with a guy who started off by professing his infatuation with Asian women (“I love Asian women”, I believe were his exact words). I can only imagine he got started on that thread because the previous person who interviewed him was an Asian woman (and in management, to boot). It turns out that was the most interesting thing he had to say for the next very long hour.\nLook for Flaws # A new job is an investment — you are committing time in the expectation of gaining income, expertise and connections that will advance you in terms of career, finance and overall happiness. There is an opportunity cost in taking a new job — that is time you could spend elsewhere, learning other skills, completing other projects and meeting other people. So do your “due diligence”.\nThe First Date # Job interviews are like first dates. Everyone is on their best behavior, so any visible flaw you see will certainly be present several times over if you actually “hook up”.\nI spent one interview listening to the general manager yelling into the phone at his subordinates. He assured me that he never did that with his engineers (not true) — nevertheless, I ended up buying an iPod to tune him out, and my final meeting at that company lasted three hours, much of it a high-volume blamefest. A company president with a similarly self-absorbed personality complained to be numerous times before I joined about the rudeness and insensitivity of programmers (at least we appreciate irony). That got pretty old after a while and again, when times got tough, the tough got accusatory.\nIf you see any disturbing behavior, imagine what it’s going to be like on the job, especially during stressful times.\nMeet the Family # It’s not just the boss you have to worry about. Check out your prospective coworkers, and see if they’re hiding anyone in the closet. And get a feel for the company culture.\nWhen I was working on a poorly managed defense project in suburban Maryland, insult was added to injury as I worked overtime with the flu while my coworkers attempted to engage me in “debates” on the evils of gay pedophiles (as opposed to straight ones), interracial marriage, how America was a Christian nation, and what Rush Limbaugh said last night.\nA company culture might not just offend you — it can change you, for better or worse.\nAt my first job in Silicon Valley, I learned a thing or two about political infighting, but I felt dirty (and physicalyl a little ill), and the moments of wicked satisfaction didn’t make up for lost time. Later, I joined a game company filled with so much childish behavior (crying, foot stomping, throwing things — and that was the management) that I wanted to take my toys and go home.\nOrder the Lobster # One traditional date test is how much the guy is willing to spend. Hopefully, that is no longer the case in this modern day and age. But still, it’s something to watch out for when “dating” a prospective employer — a company that is cheap during the interview will be even more stingy with you as an employee, and particularly for small companies, it may be a sign of low operating funds.\nEven companies that are not particularly generous will put on a good show during the interview, but I did have an interview with a company in New Jersey that didn’t even offer to reimburse me for taking a train to the interview from Boston (and back the same day). Combine that with their reluctance to give a specific offer when they expressed intereset in hiring me, I opted for a job that seemed less interesting but seemed to have more abundant and secure benefits.\nAnother employer kept asking me during my interview to think about the least amount of money I needed for my standard of living. In retrospect, I should have responded by asking them to consider the maximum amount of money they could spend on me. And then perhaps I wouldn’t have ended up getting the job, which involved a pay cut, reduced benefits, and ended up with me purchasing hardware for the project so I wouldn’t have to listen to the boss make a big deal about spending the money.\nRead Between the Lines # Some ominous phrases:\n“We’re a family.” The dysfunctional kind, like the ones in the Jerry Springer Show.\n“We have a good core team.” Everyone else left.\n“We won’t deliver a product until it’s ready.” We’re late.\n“I know we can do this.” All evidence to the contrary.\n“We’re in stealth mode.” We have no marketing.\n“I’m really direct.” I’m really obnoxious.\n“On occasion we need everyone to work extra hours.” We have a stupid schedule.\n“We have some high-power management ready to come in at a later date.” After you dall all the work, you’re not getting promoted.\n“You’re recommended by X? Then this is just a formality.” This place is really political.\n“Don’t worry, I’ll take care of you.” Promises, promises.\nIn my experience, your best shot at avoiding politics (if that’s what you really want) is in startup companies that have less than twenty people. Once they grow to a certain size, then people start worrying more about their titles and turf then in getting something done and keeping the company alive. But if you’re more interested in structure and security, that might not be the right situation for you.\nBelieve the Rumors # The rumor mill is right. That’s not to say you should believe everything anyone says about a prospective employer. But the reputation of a company is propagated by numerous employees, customers, vendors and partners over the years.\nSo if the word on the street is to turn around and run the other direction, then do it.\nCheck the Benefits # Don’t take any benefits for granted. I started my career at large corporations with standard benefits and relocation packages, so I’ve been caught by surprise a few times when dealing with small and even some medium-sized companies.\nRelocation # When I got an offer from an interesting startup in California, I assumed they would reimburse me for my move from Boston, but fortunately I casually mentioned the issue just before I verbally accepted the offer. My manager-to-be was surprised by that assumption, but was quite reasonable and came back to me with a modification of the offer — an amount that didn’t quite cover the cost of relocation, but was still better than nothing.\nWith a much larger company numbering several thousand employees at the height of the dot-com boom, I again assumed that relocation was a standard part of the offer, but only after I formally accepted and called up the HR department did I learn that it wasn’t. After starting work, a coworker who just started said he had been relocated by the company, so I should have just made sure of this during the offer negotiation.\nVacation # When I started working, it seemed that three weeks of vacation was standard, and I even had one job that provided six weeks a year. But like all other benefits, you can’t take it for granted, anymore.\nThe first console game developer I joined lowballed me on the salary, which distracted me from noticing that they only offered five days of vacation. And they were pretty stingy with those — even after working every weekend, they would deduct a half day if I was out for an afternoon (and yet still worked the evening)\nSome advice I’ve received but have yet to apply — when you’ve finished negotiating your salary, also negotiate your vacation. Particularly if you’ve had a long work history — there’s no reason you should start with an entry level amount of vacation.\nHealth # In the United States, it’s a lot easier to lose health coverage than gain it, so this is one area where you should pay special attention. First of all, check that health benefits are indeed available, as technically speaking, companies are not required to provide it. And those that do, may not not activate it immediately or may have certain restrictions.\nFor example, worked at one company that had just spun off from a major consumer electronics firm and still carried the same benefit packages — however, the health insurance did not start until one month after the start date. I believe this is fairly common in the entertainment industry.\nMake sure your previous coverage will last up to the beginning of your new coverage. Short-term policies are convenient for this situation, but don’t waive or terminate your COBRA rights until you’ve established new insurance. If your new job falls through before your new coverage starts, you don’t want to compound that problem by not having health coverage.\nKnow Your Worth # I remember in particular one piece of advice at Texas Instruments, my first job right out of college — “You would be a fool not to keep track of your market value.” And this was from a distinguished computer engineer who’d been at that company for decades.\nIndustry salary surveys are a starting point, although the methodology is usually sketchy.\nFor example, I saw in one issue of the popular Game Developer magazine salary survey that none of the programmer salaries in the survey exceeded $200,000. Then if you read their explanation of the survey methodology, they note that they discarded all reported salaries over $200,000. Which means what? Nothing.\nAnd I suspect that survey results are skewed high — if you feel good about your salary you’re more likely to respond to a survey than if you’re low-paid or unemployed.\nYou may be willing to trade off salary for other aspects of a job, but keep in mind, when you take a pay cut, it may not be easy to make up that difference later. Employers tend to negotiate based on your most recent salary, not your highest previous salary. And while employers are quite willing to point out that economic times are slow, the job market is not good, and the cost of living in their area may be lower than others, they are not quite so enthusiastic about offering more when times are hot and they are based in an expensive area.\nThe one time I took a significant pay cut for a new job, I regretted it. The decrease was even more significant if you consider the portion that was actually a signing bonus and returnable if I left the company for any reason during the first year, and if you count the markedly lower benefits. The company shares mentioned in the offer letter were conveniently forgotten by the employer, and the job turned out to be quite unpleasant. It didn’t take me long to feel stupid — right after I joined, my new boss rattled on about how she was willing to pay twice as much for others she was trying to recruit.\nSo if you’re taking a pay cut, be sure about what you’re getting in return.\nAnd (this is old news now since the dot com bust) don’t do it just for the stock options.\nWhen I left PRI, I didn’t bother to exercise the startup’s pre-IPO shares, reasoning that the money was better spent on a Dreamcast (and it was). When I left Neomar, I did exercise my options, but largely out of politeness — the stock certificate still sits on my wall today.\nI will note, however, that employee stock purchase plans in a public company are a good deal. If always sell as soon as possible, you’ll make a little something.\n","externalUrl":null,"permalink":"/books/techsoft/getajob/","section":"Books","summary":"Does that come with dental?\nFind Your Next Job Now # I’ve had twelve salaried jobs so far (nothing to brag about, I know — it probably indicates I’m pretty good at getting a job, but not so good at picking one) and I’ve been called a “short-timer” by many of my ex-coworkers. But in retrospect, it’s apparent I’ve never left too soon (unless you count the severance pay that I missed). Even if you’re reasonably content with your current job, you should be prepared if it becomes time to find a new one. Even if you have to settle for less just to pay the bills, you’ll be ready when opportunities present themselves.\n","title":"Get a Job","type":"books"},{"content":"My favorite language is Lisp. What happened?\nWhat I Miss About Lisp # Simplicity # A common complaint against Lisp is the parentheses. Lots of Interspersed Spurious Parentheses. That’s pretty funny, but it’s wrong. The parentheses are not spurious — each one serves a purpose, and if your program compiles, you have exactly the number you need. And there is no question about operator precedence or scope. I’ve never heard Lisp haters say they’re confused by parentheses — they just find them annoying.\nBut a combination of curly braces, parentheses, brackets, periods and commas is simpler and more succinct? No one has ever had to pop open a Lisp book to remember its syntax (although I did wear out my CLtL2 referencing all the built-in functions). Think how many hours have been lost to Java and C/C++ operator precedence bugs, forgetting to add brackets when expanding a single-line if clause (and Eclipse will nag me about unnecessary brackets if I try to play it safe) and the endless debates among programmers about their favorite bracket usage and placement conventions.\nElegance # A related complaint is that Lisp is too strange and hard to understand. There is a misguided notion that programming languages should resemble English. Which has given us COBOL, BASIC and AppleScript. (I have fond memories of BASIC, and Microsoft had a pretty good run with it, but no one’s going to write AI programs or even web server applications with it). English expression of computer programs is as efficient and clear as writing mathematical formulas in English.\nSimplicity lends itself to elegance. You know you’re using an elegant language if you’re not distracted by discussions of proper style. I don’t recall wasting time on coding style debates when working in Lisp. But after moving to Java and C++, nearly every organization I joined made a big deal about adherence to a coding standard, which usually involved some variation of the the abomination known as Hungarian notation. (Although Sun has defined a perfectly readable and simple style exemplified in the Java standard class libraries, and Hungarian notation is a monster when applied to object-oriented languages). A foolish consistency is the hobgoblin of little minds, the saying goes. So is a mandated coding style. When you’re programming, you should be thinking more about the problem than the language.\nFlexibility # The syntax makes possible a unique feature of Lisp, one that every satisfied Common Lisp user seems to appreciate — macros. “Macros” seems like such a mundane name — C macros or Excel macros are hardly in the same league. What other language allows you to implement new constructs that can even define new control flow, in a way that blends in with the built-in syntax? It’s a small price to pay for parentheses.\nAfter using Flavors, Object Lisp, C++ and Java, I still have to say the Common Lisp Object System is the best. Generic functions, eql parameters, multiple inheritance (yes, it’s a good thing), a metaobject protocol that lets you customize the object system — nothing else matches it.\nOptimization # A fallacy about Lisp is that it’s slow. Of course, it’s easy to write slow code in any language, and even easier in Lisp because 1) it’s big, and tends to be slow just to start up, 2) automatic memory management and a run-time type system has an overhead and 3) Lisp is easy to learn — any idiot can learn it well enough to produce a complicated, messy prototype of something that looks sophisticated (although it takes an idiot with taste to appreciate it).\nBut it’s really the best of both worlds. You can prototype an application quickly and clearly, and then optimize — at the algorithmic and data structure level as with any language, but also at the language level, e.g. by adding declarations that turn off run-time type checking. This avoids a scenario like the application I worked on that was prototyped in Tcl — and stayed in Tcl for two years while the development tried to figure out how to migrate it to another language.\nIt’s painful to watch Java follow in Lisp’s footsteps and yet apparently not learn all its lessons. I worked on a high-performance 3D content creation tool in Lisp — I still cannot imagine that a 3D Java application can perform as well.\nCulture # Lisp had a cool culture. Much like AI labs, it attracted groupies of dubious ability but also some of the most brilliant programmers around. And I mean brilliant in a worldly, literate, sense. Lisp programmers don’t make lists of design patterns, although Richard Gabriel did a lot of writing on how design patterns were originally applied to architecture. Among the well-known names involved in the origination, development and popularization of Lisp — Paul Graham, Peter Norvig, Guy Steele, Marvin Minsky, Rod Brooks, Richard Stallman, James Gosling….\nWhy Didn’t Lisp Become Java? # A Hook # Whether it was a brilliant marketing move or stroke of luck, the introduction of Java initially for browser applets was crucial. It’s not quite so popular for that, now (another essay — Why Didn’t Java Become Flash?) but it was a great introduction that made Java an everday word. Java hasn’t exactly dominated the desktop and has been hit and miss in various areas, but has been targeted successfully in the web server and mobile phone arenas. Common Lisp never had such a hook. It was associated with AI and large, expensive Lisp workstations. Now it is the first choice for, what?\nIt Wasn’t Free # If you want everyone to adopt a standard, it has to be free. Netscape understood it and Microsoft understood it when they wanted to crush Netscape. Everyone who wanted to get into this cool thing called the World Wide Web was able to download Java and play around with it.\nThere are free implementations of Common Lisp (GCL, CMU Common Lisp, CLISP), but they came late and incomplete. The commercial vendors have been slow and late to release free versions of their products and still do only under restrictive licenses (evaluation/educational/personal use). The open source versions don’t have everything you really need, e.g. multithreading.\nClass Libraries # Common Lisp is big, but doesn’t include as a standard libraries that are important for real applications — multithreading, networking, user interface. Commercial Lisp implementations have their own versions of these libraries, but they’re all different. For developers, the appealing part of Java’s vaunted write-once-run-everywhere philosophsy is not so much the bytecode portability — any polished app will have different installers for different platforms, anyway — but the fact that you can code to a single set of standard class libraries.\nAnd Java has great class libraries. Not only do they supply just about everything you need and extend them as industry needs advance (without the lame Microsoft tactic of just adding new functions with “Ex” appended), they are typically well-designed — they express good API design, the standard Sun Java coding style, and model the underyling functionality well. For example, serious network programmers should read classic texts like Stevens, but just learning the Java network class libraries will give you a reasonable idea of what’s really going on. And anyone concerned about coding style should just emulate conventions used in the Java API’s.\nNative Integration # Real applications also have to look like they belong on the machine they’re running on. Java faced up to that in Swing — running with the Metal look and feel everywhere wasn’t acceptable to anyone shipping a commercial product, so now you can switch to a Windows, Mac or Motif look and feel.\nToo Big # It’s easy to write “Hello, World” in Lisp. It just takes a while to load.\nToo Good # The unique features of Common Lisp are largely unappreciated, even by Lisp devotees. I’ve seen macros used a lot, but mostly to inline code — few Lisp programmers think abstractly enough to define their own language within a language. I think CLOS is still the best object system out there, but most Lisp programmers I’ve seen are content to use lists. A West Coast Lisp programmer, during an interview for a startup using Dandelion isp machines, opined that “object-oriented programmers are born, not made”. I’d have to agree — I’ve met many programmers complain about “too many objects”, whether it’s C programmers moving to C++ or Lisp programmers encountering CLOS.\nIn a sense, Lisp was too easy. A programmer who couldn’t deal with C pointers could still hack together code in Lisp. I’ve seen plenty of prototypes that demoed well enough to get funding and turn into serious projects, then stall because the software was held together with string and bailing wire. And Lisp was too cool — it attracted a lot of groupies who weren’t that great at coding but liked the culture and cachet (particularly in AI surroundings). So it’s no surprise that Lispers come off as wine snobs to the beer-drinking masses out there.\nToo Smart # It’s a VB world out there. Most programmers don’t really want to program — they want an IDE that will do as much work as possible for them, like graphically connect components and generate skeleton code. And they want the security of knowing they’re using the same language, tools, API, design patterns, methodology…as everyone else. Personally, I was happy running Lisp in Emacs, but if there was the equivalent of Eclipse for Lisp (or at least a VB-style environment), there might be a larger following.\nPanic # While developing a commercial product in Lisp, I often heard, “No one will buy our product if they know it’s written in Lisp”, the implication being that we shouldn’t tell any customers about Lisp, despite the obvious extensibility benefits, and that we should consider porting the whole thing to C++. For some reason, I never heard “We’re having trouble selling the product because our salespeople aren’t informed about the product, the company as a whole is uninformed about the target market, and we released the product with a lot of bugs.”\nI never heard any user complain about the implementation being in Lisp, but I did see one customer complaint about being “treated like a two-dollar whore” and I was called to a customer site to field angry tirades — I wasn’t even on the project anymore at that point, but the regular sales support people couldn’t take the abuse, anymore.\nThe attempts I’ve seen to move a project away from Lisp didn’t solve anything and sometimes made things worse. Lucid doubled their size by buying a C++ company and then went bankrupt. A lesser-known CAD system that I worked on, called DROID and running on TI Explorer machines, had their own Lisp vs. C++ battle and somehow compromised on Smalltalk (now, what was the point of that?). Business people like to say that the product and its technology is secondary to smart business strategy and marketing, but when they screw up, it must be the technology.\n","externalUrl":null,"permalink":"/books/techsoft/imisslisp/","section":"Books","summary":"My favorite language is Lisp. What happened?\nWhat I Miss About Lisp # Simplicity # A common complaint against Lisp is the parentheses. Lots of Interspersed Spurious Parentheses. That’s pretty funny, but it’s wrong. The parentheses are not spurious — each one serves a purpose, and if your program compiles, you have exactly the number you need. And there is no question about operator precedence or scope. I’ve never heard Lisp haters say they’re confused by parentheses — they just find them annoying.\n","title":"I Miss Lisp","type":"books"},{"content":"","externalUrl":"https://web.archive.org/web/20031024213206/http://www.technicat.com/","permalink":"/about/old/lists/plain/","section":"About","summary":"","title":"Lists","type":"about"},{"content":" ","externalUrl":null,"permalink":"/books/techsoft/amazonreviews/","section":"Books","summary":" ","title":"Reviews on Amazon","type":"books"},{"content":"Jeff Atwood, Coding Horror\nPhilip Chu\u0026rsquo;s Seven Habits of Highly Effective Programmers is witty, eloquent, and peppered with illustrative real world anecdotes\nJames Shore, The Art of Agile\nPhil Chu of Technicat has published Seven Habits of Highly Effective Programmers. Pragmatic and dead-on, it\u0026rsquo;s one of those essays I wish I had written. Go read it.\nAndrew McConnell\nThis post by Philip Chu is a fantastic read… anyone in software consulting or development should consider it a must read.\n","externalUrl":null,"permalink":"/books/techsoft/blogreviews/","section":"Books","summary":"Jeff Atwood, Coding Horror\nPhilip Chu’s Seven Habits of Highly Effective Programmers is witty, eloquent, and peppered with illustrative real world anecdotes\nJames Shore, The Art of Agile\nPhil Chu of Technicat has published Seven Habits of Highly Effective Programmers. Pragmatic and dead-on, it’s one of those essays I wish I had written. Go read it.\n","title":"Reviews on Blogs","type":"books"},{"content":"","externalUrl":"https://web.archive.org/web/20010422002627/http://www.technicat.com/","permalink":"/about/old/search/search/","section":"About","summary":"","title":"Search","type":"about"},{"content":"A collection of software essays.\n","externalUrl":null,"permalink":"/books/techsoft/","section":"Books","summary":"A collection of software essays.\n","title":"Technicat on Software","type":"books"},{"content":" Explore Further # Finally, the scoreboard display makes our bowling game a fully functional bowling game, and the addition of a start/pause menu provides some of the polish that players expect!\nThe addition of the game GUI not only completes the bowling game (in a commercial game project, this might be considered a “first playable” milestone) but it also marks the end of our introduction to Unity’s basic features typically used in a 3D game.\nTip: Although I left the GUI development to the end of this phase, which is unfortunately common in game development, it’s best to include GUI design early in the project. Even just sketching out the menus will help clarify the anticipated game modes and options.\nFor the most part, although you’ve been modifying and testing the game solely in the Editor, these are cross-platform features. Right now, you could build this game as a web player or a Mac or Windows executable, and the game would run the same on all platforms, performance differences aside. But the ultimate goal of this book is to get you into iOS development, so, starting with the next chapter, the remainder of this book will be all about Unity iOS.\nUnity Manual # The Game Interface Elements link in the Creating Gameplay section of the Unity Manual leads to the “Unity Scripting Guide,” which is a tutorial-style sequence of pages that goes through the UnityGUI system, from creating a single button to adding various other UnityGUI Controls such as sliders and radio buttons, use of automatic layout vs. fixed layout, creating reusable compound Controls, and customizing the GUI appearance with styles and skins.\nThe “Unity Scripting Guide” also explains how you can customize the Unity Editor using UnityGUI. It turns out the Editor interface is actually implemented with UnityGUI (which explains why on occasion you may see an OnGUI error message in the Console View that is not related to any of your code)!\nReference Manual # I briefly mentioned how additional fonts besides the built-in Unity font can be imported into a Unity project and then assigned to UnityGUI styles and skins. The Reference Manual has a page in its Asset Components section describing the Font asset and its import options in more detail.\nScripting Reference # Naturally, the Runtime Classes list in the Scripting Reference includes pages describing the UnityGUI functions you’ve used, starting with the OnGUI callback defined in the MonoBehaviour class.\nMost of the UnityGUI functions used in both the scoreboard and pause menu are the static GUI and GUILayout functions used to create the various UnityGUI Controls, such as GUI.Button and GUI.Label. It’s worth going through the Scripting Reference pages for each of them so you know what GUI Controls are available, along with customization variables like GUI.color and GUI.skin (and there are others, e.g., to customize the background color). GUIStyle and GUISkin are classes too, and you can change their properties any time in a script.\nBesides the UnityGUI classes, a few others are used in the pause menu. The static variable Time.timeScale was set to pause and unpause the game, Application.Quit called to exit the game, and the AudioListener, QualitySettings, and SystemInfo classes accessed in the Options page.\nAsset Store # The Necromancer GUI looked great in the pause menu, demonstrating how nice UnityGUI can look with a well-crafted GUISkin, but there are many others on the Asset Store. They\u0026rsquo;re all listed, along with the Necromancer GUI, in the GUI Skins category under “Textures and Materials.” That category is well populated with skins for UnityGUI and also skins for third-party GUI systems, such as the popular EZGUI from Above and Beyond Software and NGUI from Tasharen Entertainment.\nThose third-party GUI systems are available under the Scripting category, in the well-populated GUI subcategory, which is filled with pre-scripted GUIs such as minimaps and menus. In fact, a version of the pause menu implemented in this chapter is on the Asset Store in the Complete Projects section (under the name FuguPause).\nThe Asset Store also has a decent assortment of fonts listed under the Fonts category of “Textures and Materials.” But since Unity can import TrueType and OpenType fonts, a plethora of free font sites on the web is available to you, along with moderately priced font libraries (I use the MacXWare Font Library).\n","externalUrl":null,"permalink":"/books/learnunity4/chapters/chapter09/","section":"Books","summary":"Explore Further # Finally, the scoreboard display makes our bowling game a fully functional bowling game, and the addition of a start/pause menu provides some of the polish that players expect!\n","title":"The Game GUI","type":"books"},{"content":" Explore Further # This chapter was a change of pace, concentrating solely on scripting. Most of that scripting was added to the game controller script, FuguBowl.js, in the form of a state machine, but scoring code was incorporated in a new script, FuguBowlPlayer.js.\nIf you\u0026rsquo;re tired of writing big chunks of code and long for the little script snippets that we started with, you just have to endure writing one more big script in the next chapter, for the user interface. And, as a counterpart for the scoring code added in this chapter, the next one includes a small additional script to display a scoreboard.\nUnity Manual # State machines are useful not only for game control logic but also for anything that can be represented as going through different states (simple examples: a light is on or off, a weapon is locked and loaded, a door is open or closed). State machines are particularly useful for animation (walking, running, throwing) which is why the new Mecanim animation system does have its own FSM capability. This is described in the Unity Manual, under “The Mecanim Animation System” section, in “Animation State Machines.”\nScripting Reference # The major scripting technique introduced in this chapter was the use of coroutines, specifically to implement an FSM in the FuguBowl script. The Scripting Overview section of the Scripting Reference has a page on “Coroutines and Yield,” that provides a basic explanation some examples.\nThe classes related to coroutines include Coroutine and WaitForSeconds (both of them inherit from YieldInstruction). The one function we used is the StartCoroutine function of MonoBehaviour. The documentation page for each MonoBehavior callback specifies whether the callback can be used as a coroutine (as we saw, Start can, but Awake, Update, and FixedUpdate cannot).\nThe added code in the FuguBowl script also had frequent cause to access Components, so the page on “Accessing Components” is relevant. That page lists the Component and GameObject variables that can be used to access commonly attached Components and also provides examples on how to call the function GetComponent (either on a Component or a GameObject) to access Components, including scripts.\nAsset Store # Several more sophisticated FSM frameworks are available on the Asset Store. A search for “fsm” in the Asset Store window brings up several, including a popular visual programming package called Playmaker, developed by Huton Games.\nOn the Web # Wikipedia has an extensive description of bowling and its scoring rules. Just search for “bowling” on the site. And if you search for “state machine” you\u0026rsquo;ll find an article that explains probably more than you\u0026rsquo;ll ever want to know about FSM\u0026rsquo;s!\nI mentioned some game engines have FSM\u0026rsquo;s built into their scripting system. It\u0026rsquo;s interesting to compare them and see how FSM\u0026rsquo;s are implemented in those systems. For example, CryEngine has a state-switching mechanism built into its Lua scripts. Visit the CryEngine 3 Free SDK site and search for “state” to find an article on “Entity States.”\nI worked on a CryEngine-based virtual world called Blue Mars, which heavily utilized that FSM support. Visit the Blue Mars wiki and search for “entity script” to the introductory examples (I actually started that wiki entry five years ago!)\nAnd even the most well-known virtual world, Second Life, has FSM support. Search for “state” on the Second Life wiki to see how states are defined using the Linden Scripting Language (LSL).\n","externalUrl":null,"permalink":"/books/learnunity4/chapters/chapter08/","section":"Books","summary":"Explore Further # This chapter was a change of pace, concentrating solely on scripting. Most of that scripting was added to the game controller script, FuguBowl.js, in the form of a state machine, but scoring code was incorporated in a new script, FuguBowlPlayer.js.\n","title":"Let's Play! Scripting the Game","type":"books"},{"content":" Explore Further # The bowling game is starting to look like a bowling game at this point (whereas at the end of the previous chapter, we had at best what could be called a rolling game). But although he player can roll the ball around and knock down bowling pins, we still don\u0026rsquo;t have the rules of the game. Stay tuned for that in the next chapter, which will get much heavier into scripting. In fact, this chapter is sort of a turning point, trending to more and more scripting and less introduction of new Components. So from now on, so you should be spending most of your time in the “Scripting Reference” of the Unity documentation.\nScripting Reference # The Instantiate function in the Object class was introduced to create the bowling pins at runtime. This is the function used to spawn GameObjects, typically from prefabs. In other games, you might use Instantiate to spawn anything from pickup items to NPC\u0026rsquo;s. The function is described in the “Scripting Overview” but its page in “Runtime Classes” has more detailed information.\nOne new callback, Awake, was introduced as an alternative to the Start callback. The MonoBehaviour collision callbacks OnCollisionEnter, OnCollisionStay, and OnCollisionExit were introduced in the previous chapter but used again for rolling and collision sounds. The Collision class for information on collisions: relative velocity, the GameObject that was collided against. Other data such as the actual point of contact are also available.\nThe page for the Rigidbody Component is worth reading in its entirety. Its variables correspond largely to the properties available in the Inspector view, and besides the AddForce function you used to push the Ball, there are many related functions: AddRelativeForce, Add Torque, AddRelativeTorque, AddExplosionForce, AddForceAtPosition.\nThe Transform class was used again, this time checking Transform.position to determine if the Ball had rolled off the Floor. Since Quaternions were mentioned, take a look at the rotation and localRotation variables in Transform and compare to eulerAngles and localEulerAngles variables.From the GameObject class, the SendMessage and BroadcastMessage functions were used to invoke the ResetPosition functions in other GameObjects. There\u0026rsquo;s also a SendMessageUpward function that works like BroadcastMessage, except the message is sent up the GameObject\u0026rsquo;s hierarchy instead of down. The message functions are also defined in the Component class.\nAudioSource functions were used to play and stop AudioClips. Other functions are useful if you want to refine your sound code. For example, the HyperBowl rolling sound code changes the volume of the sound (using the AudioSource.volume variable) according to the ball’s velocity, which not only provides a nicer rolling sound but also a softer cutoff of the sound when stopping.\nAssets # We saw the Asset Store has a bountiful selection of free barrel models and sound libraries. And there\u0026rsquo;s much more if you don\u0026rsquo;t restrict yourself to free assets. Although the Asset Store doesn\u0026rsquo;t yet have bowling pin models, it\u0026rsquo;s not hard to find some on 3D model marketplaces such as Turbosquid. Free audio, including bowling sounds, are available on the Creative Common licensed Freesound.\n","externalUrl":null,"permalink":"/books/learnunity4/chapters/chapter07/","section":"Books","summary":"Explore Further # The bowling game is starting to look like a bowling game at this point (whereas at the end of the previous chapter, we had at best what could be called a rolling game). But although he player can roll the ball around and knock down bowling pins, we still don’t have the rules of the game. Stay tuned for that in the next chapter, which will get much heavier into scripting. In fact, this chapter is sort of a turning point, trending to more and more scripting and less introduction of new Components. So from now on, so you should be spending most of your time in the “Scripting Reference” of the Unity documentation.\n","title":"Let's Bowl! Advanced Physics","type":"books"},{"content":" Explore Further # Now we have the beginnings of real gameplay. It\u0026rsquo;s not a complete bowling game, yet, but it has physics (a ball rolling on a floor), interactive control (pushing the ball), and camera movement (following the ball). Each of those features are rich topics in game development, but in particular we\u0026rsquo;ll be digging deeper into physics in the next chapter with the addition bowling pins and collision-based sound effects. Then the game will look a lot more like a bowling game!\nUnity Manual # In the Asset Import and Creation section, the page on “Procedural Materials,” which you used on the Floor, describes the Substance archive format a little bit and provides an overview of the tools used to create and analyze procedural materials.\nIn the Creating Gameplay section, the page on “Input” describes the Input class and its GetAxis function used in the FuguForce script implemented in this chapter and lists the joystick and keyboard values passed to that function. The lower portion of that page describes Input functions and variables available for iOS, so you can read that for a preview of this book\u0026rsquo;s chapter on iOS input.\nThis chapter has been mostly about physics, so the page on “Physics” is the most important to read. It lists all the collider types, including the Sphere Collider, Box Collider, and Mesh Collider used in this chapter. The page describes the differences between Rigidbodies (the ball) and static colliders (the floor), and how Physic Materials and their properties affect collision behavior.\nReference Manual # In the Asset Components section, the page on “Procedural Material Assets” explains what you see in the Project View and Inspector View for procedural materials. The section on Physics Components lists all the available colliders in detail, along with the available joints (including hinges and springs), constant force, and cloth components (cloth is not supported in Unity iOS).A new Settings Manager was introduced in this chapter, the “TagManager,” which was used to create a new tag for the Floor.\nIn the Scripting Concepts section, the page titled “What Is a Tag?” expands on how to create a tag and apply it to a GameObject, along with an example of how a tag can be used to find a GameObject at runtime.\nThe page on “Rigidbody Sleeping” explains how a Rigidbody “goes to sleep” when it rests. This is a nice optimization that reduces unnecessary physics computation.\nScripting Reference # In the Runtime Classes listing, the page for the “MonoBehaviour” class lists the collision callbacks that were introduced in this chapter: OnCollisionEnter, OnCollisionStay, and OnCollisionExit.\nWe queried the “Collision” class for information on collisions: relative velocity, the GameObject collided against. Other data like actual point of contact are available.\nI introduced the “Rigidbody” Component in this chapter, and the Script Reference page for this class is worth reading in its entirety. It’s variables correspond largely to the properties available in the Inspector view, and besides the AddForce function you used to push the Ball, there are many related functions: AddRelativeForce, AddTorque, AddRelativeTorque, AddExplosionForce, AddForceAtPosition.\n“Component” has several variables that act as shortcuts to reference other Components often attached to GameObjects. Of the two scripts created so far in this book, the FuguRotate script references the transform variable, and the FuguForce script references the rigidbody variable. The Component variables mirror the same set of variables in “GameObject.”\nThe one function in the “Input” class that we used is Input.GetAxis. If you plan on making any desktop or web games, you’ll want to check out the various functions used to query the keyboard, mouse, and joystick. This page also lists the Input functions available for mobile applications.\nOn the Web # The physics implementation in Unity is based on an older version (2.x) of the PhysX engine, originally developed by NovodeX, acquired by Ageia who bundled it with a hardware physics accelerator, and now a product of nVidia. The latest version (3.x) is available on the nVidia Developer Zone. The PhysX Software Development Kit is worth a look just to get a better idea what physics engine features underlie the Unity physics Components and script functions.\nThe fairly new Learn center on the Unity web site includes an extensive set of physics tutorials covering much of what was discussed in this chapter and will be discussed in the next chapter.\n","externalUrl":null,"permalink":"/books/learnunity4/chapters/chapter06/","section":"Books","summary":"Explore Further # Now we have the beginnings of real gameplay. It’s not a complete bowling game, yet, but it has physics (a ball rolling on a floor), interactive control (pushing the ball), and camera movement (following the ball). Each of those features are rich topics in game development, but in particular we’ll be digging deeper into physics in the next chapter with the addition bowling pins and collision-based sound effects. Then the game will look a lot more like a bowling game!\n","title":"Let's Roll! Physics and Controls","type":"books"},{"content":" Explore Further # Thus ends our dalliance with dancing skeletons. For the rest of this book, you\u0026rsquo;ll be concentrating on developing a bowling game with mostly physics-based motion. But you should already feel a sense of accomplishment, having spent the past three chapters evolving a simple static cube scene into a musical dancing skeleton scene, complete with fancy graphics features like particle effects and dynamic shadows. But fancy features tend to be expensive features in terms of performance, so use them judiciously!\nUnity Manual # The Asset Import and Creation section covers the two new types of assets introduced in this chapter: audio and animation. The page titled “Audio Files” lists the audio formats recognized by Unity and describes the AudioClip asset that results from importing an audio file.In earlier chapters, we just dipped out toes into the Creating Gameplay section of the Unity Manual, but now we\u0026rsquo;ve deeper end, adding content described in the pages “Particles,” “Legacy Animation System,” and “Sound.” Also, the “Mecanim Animation System” is the future of Unity animation, so it’s worthwhile to read up on that.\nDynamic shadows is a big topic. The Advanced section of the Unity Manual has an extensive treatment on “Shadows in Unity”, which covers “Directional Shadows,” “Troubleshooting Shadows,” and “Shadow Size Computation.”\nReference Manual # The Animation section of the Reference Manual has pages on the “Animation Component” and “Animation Clip” asset used by the Legacy animation system. This section also includes several pages on Components used in the new Mecanim animation system.\nThe Audio section lists the audio Components need to add music to the dancing scene constructed in this chapter: “AudioListener” (normally automatically attached to the Main Camera) and “AudioSource” (attached to the sound source). In addition, the section lists “Audio Filter Components” (Pro feature) that can add effects like echo, for example.\nThe Effects section has a page on the new Shuriken particle system and multiple pages on the Legacy particle system.\nThe Reference Manual also documents the various Settings Managers, including the one for “Quality Settings,” which you used to adjust your shadow quality, but it also affects other visual quality elements, such as lighting and particles.\nAsset Store # The Asset Store not only offers a lot of music in the Audio category, much of it free, but also provides scripts for playing music. If you want to play more than one song in your dance scene, you could write a script that plays a fixed or random sequence of songs, using the Unity functions defined in the AudioSource class (to play and stop music) and AudioListener class (to control the volume). But it’s easier to just download, for example, the Free Jukebox script from the Asset Store (or Jukebox Pro if you’re willing to part with a few dollars).\nComputer Graphics # I mentioned the book Real-Time Rendering at the end of Chapter 3, and it merits a recommendation again for the computer graphics topics you encountered in this chapter: animation, particle effects, and dynamic shadows. There are many books just on character animation, including those on the content-creation side for professional animators, such as George Maestri’s Digital Character Animation.\n","externalUrl":null,"permalink":"/books/learnunity4/chapters/chapter05/","section":"Books","summary":"Explore Further # Thus ends our dalliance with dancing skeletons. For the rest of this book, you’ll be concentrating on developing a bowling game with mostly physics-based motion. But you should already feel a sense of accomplishment, having spent the past three chapters evolving a simple static cube scene into a musical dancing skeleton scene, complete with fancy graphics features like particle effects and dynamic shadows. But fancy features tend to be expensive features in terms of performance, so use them judiciously!\n","title":"Let's Dance! Animation and Sound","type":"books"},{"content":" Explore Further # The scene has evolved from pretty and static to pretty and dynamic, merely with the addition of simple scripted movement. We\u0026rsquo;ll jazz up the scene some more in the next chapter with animation and sound, but the major milestone you’ve reached at this point really is learning how to create, edit and debug scripts. From now until the end of the book, you\u0026rsquo;ll be adding scripts, so get used to it!\nUnity Manual # The “Building Scenes” section of the Unity Manual has two pages relevant to the work in this chapter—a description of “Prefabs” and an explanation of the “Component-Script Relationship.”\nThe one new type of asset introduced in this chapter (besides prefabs) is the script. The page in the “Asset Import and Creation” section on “Using Scripts” introduces the basic concepts covered in our rotation script—creating a script, attaching it to a GameObject, printing to the Console (using the print function instead of Debug.Log as you did), declaring a variable, and even applying a rotation in the Update function.\nIt’s worth mentioning the page on “Transforms” again, since our rotation script is in the business of modifying Transforms. That page also describes the parent–child GameObject relationship, which technically is among Transforms, but since there’s a one-to-one relationship between GameObjects and Transforms, it’s less confusing to think of the linkage among GameObjects, as displayed in the Hierarchy view.\nWe dipped into one Advanced topic in this chapter—“Debugging.” This section describes the Console view, the MonoDevelop debugger, and where to find Log files on your file system.\nScripting Reference # I’ve mentioned two of the three main pieces of official Unity documentation so far—the Unity Manual and the Reference Manual. The third piece is the Scripting Reference. This chapter presented our first foray into scripting, so everything in the “Scripting Overview” section of the Scripting Reference is worth reading at this point. The list of “Runtime Classes” illuminates the inheritance relationship among the Unity classes. After that, I recommend making frequent use of the search box on that page anytime you see anything in a script you don’t recognize (or even if you do recognize it, if you haven’t read its documentation).\nAsset Store # We downloaded iTween from the Asset Store, but iTween users should also visit Bob Berkebile’s official iTween web site with comprehensive documentation and demo projects.\nAlthough iTween is popular and one of the first tween packages for Unity, at this point several tween implementations are available (just search for tween in the Asset Store), including Holoville’s HOTween, and Prime31 Studio’s GOKit, source code available on GitHub.\nScripting # Although we’re only working with JavaScript in this book, there’s enough JavaScript and C# out in the Unity world that you should get comfortable with both. The book Head First C# by Andrew Stellman and Jennifer Greene is a great visual step-by-step introduction to C#.\nAnd since C# was created by Microsoft as part of its .NET framework, the official C# documentation and other resources can be found by searching for C# on the Microsoft Developer Network (MSDN).\nWhile you’re on MSDN, search also for .NET documentation, as the Unity scripting engine is implemented with Mono, which is an open source version of .NET.\nYou probably don’t need to worry about Boo, the other Unity scripting language (I have yet to see a Boo script in the wild).\nPut two programmers together in a room, and if there’s anything they’ll fight about, it’s coding conventions. My rule of thumb is to go along with the convention of the official language and framework that I’m coding in. It’s a dull topic with fun names.\nFor example, Unity uses a combination of camel case and Pascal case in its capitalization rules (or camelCase and PascalCase, if we apply the conventions to themselves). You can look up “camel case” on Wikipedia.\nBracket placement is also a common source of contention. The convention I use here (and by Unity, at least when creating the template for new scripts) is called Egyptian style, according to Jeff Atwood (of StackExchange fame) on his popular blog Coding Horror. The article also terms the practice of applying a standard prefix to class names “Smurf naming.”\n","externalUrl":null,"permalink":"/books/learnunity4/chapters/chapter04/","section":"Books","summary":"Explore Further # The scene has evolved from pretty and static to pretty and dynamic, merely with the addition of simple scripted movement. We’ll jazz up the scene some more in the next chapter with animation and sound, but the major milestone you’ve reached at this point really is learning how to create, edit and debug scripts. From now until the end of the book, you’ll be adding scripts, so get used to it!\n","title":"Making it Move: Scripting the Cube","type":"books"},{"content":" Explore Further # This chapter may have seemed like it covered a lot of material (no pun intended) just to create a simple static scene, but a lot of basic Unity concepts were explored along the way, particularly the relationship between Components and GameObjects. As a result, now you have a scene with a bump-mapped and textured Cube, illuminated by a Point Light that’s sporting a Flare, and surrounded by a Skybox. The scene was populated with assets imported from local files, the Unity Standard Assets, and the Unity Asset Store. And the scene isn\u0026rsquo;t completely static due to the MouseOrbit script attached to the Main Camera. Scripting will play a dominant role in this book, starting with the next chapter as we move beyond a static scene.\nBefore moving on to that, take a break and go over the official Unity documentation on the features used so far, if only to get familiar with where to find this documentation for future reference.\nUnity Manual # The Unity Basics section of the Unity Manual was mostly relevant to the previous chapter, describing the user interface, but that section does have a “Creating Scenes” page that describes the basic elements of a scene.\nMore relevant is the “Building a Scene” section, which describes the relationship among GameObjects, Components, and scripts, how to use the Inspector View to edit Component properties, and how to navigate the Scene View and move GameObjects, all of which was covered in thsi chapter. Lights and Cameras are also explained. One feature listed in this section that won’t be used in this book is the Terrain Engine (it is available in Unity iOS but slow). Terrain is a significant and impressive Unity feature, though, so it’s worth a read.The “Asset Import and Creation” section describes the asset types used in this chapter: Meshes, Materials, textures and scripts. The process of importing assets and the Asset Store are also explained.\nWe haven’t arrived at a point where we have gameplay, but the “Creating GamePlay” section has a page on “Transforms,” which is we saw is fundamental to understand even just for placing static GameObjects.\nReference Manual # Getting more in depth than the Unity Manual, the Reference Manual describes each Component in detail, explaining its properties and documenting the use of the Component. The Reference Manual also documents the asset types and gives an explanation of GameObject.\nAs a rule, you should read the Reference Manual documentation for every Component and asset type you use. Remember, there is a Help icon on each Component in the Inspector view that will bring up the appropriate Reference Manual page when you click it. Like the Unity Manual, the Reference Manual is available not just from the Unity Help menu but als on the Unity web site under the Learn tab (which can be reached directly at http://docs.unity3d.com/).\nThe “Settings Manager” section of the Reference Manual includes a page on the Render Settings, which is where the Skybox in this chapter was assigned.The “Transform Components” section lists just one Component, naturally, the Transform Component, which is attached to very GameObject.\nThe “Mesh Components” section is more interesting, as it describes both the MeshFilter and MeshRenderer Components necessary for any GameObject with Mesh, such as the Cube created in this chapter.The “Rendering Components” section is more bountiful, yet, featuring the Camera Component and its associated GUILayer Component and FlareLayer. The Light Component is also documented here.Although assets aren\u0026rsquo;t really Components, the Reference Manual has a section titled “Asset Components,” which lists the various asset classes. In this chapter, Flare, Material, Mesh and Texture2D were incorporated into the scene (remember that Skybox is really a Material).\nThe most fun reading is in the section titled “Built-In Shader Guide,” which describes in detail (and with pictures) all of the built-in shaders, ranging from the simple and fast to very fancy. The Cube in this chapter started out with the default Diffuse shader and was replaced with a deluxe Specular Bump Map shader. As mentioned in this chapter, a shader is really a program, so if you can\u0026rsquo;t find a built-in shader that suits your needs, you can write your own by following the examples and instructions in the “Shader Reference” section.\nAsset Store # This chapter begins our book-long practice of using free assets from the Unity Asset Store. I recommend browsing the Asset Store regularly to check the latest releases. Besides the free textures, models, and scripts, there are plenty of reasonably priced packages that can save you a lot of time and work. The Asset Store can also be viewed with a regular web browser at http://assetstore.unity3d.com/ (but without the ability to purchase or download any assets).\nComputer Graphics # Computer graphics is a huge and intricate area of study. This chapter worked with 3D models, textures, bump maps, light flares, skyboxes, and we’re just getting started. So it’s well worth reading up on basic (and advanced) computer graphics, such as the popular and comprehensive text Real-Time Rendering, by Tomas Akenine-Möller, Eric Haines, and Naty Hoffman. Mark Haigh-Hutchinson’s Real-Time Cameras is an entire book devoted to the subject of virtual Cameras and their control schemes.\nI won’t be covering the process of creating assets that can be imported into Unity, but Luke Ahearn has two books that may be generally helpful: 3D Game Textures: Create Professional Game Art Using Photoshop and 3D Game Environments: Create Professional 3D Game Worlds. And you can tell from the title of Wes McDermott’s Creating 3D Game Art for the iPhone with Unity that it’s an appropriate complementary text for this book.\n","externalUrl":null,"permalink":"/books/learnunity4/chapters/chapter03/","section":"Books","summary":"Explore Further # This chapter may have seemed like it covered a lot of material (no pun intended) just to create a simple static scene, but a lot of basic Unity concepts were explored along the way, particularly the relationship between Components and GameObjects. As a result, now you have a scene with a bump-mapped and textured Cube, illuminated by a Point Light that’s sporting a Flare, and surrounded by a Skybox. The scene was populated with assets imported from local files, the Unity Standard Assets, and the Unity Asset Store. And the scene isn’t completely static due to the MouseOrbit script attached to the Main Camera. Scripting will play a dominant role in this book, starting with the next chapter as we move beyond a static scene.\n","title":"Making a Scene","type":"books"},{"content":" Explore Further # We\u0026rsquo;ve come to the end of this Unity tour and our play time with Angry Bots demo. Beginning with the next chapter, you\u0026rsquo;ll be creating Unity projects from scratch to learn the game engine features. But this won\u0026rsquo;t be the last you\u0026rsquo;ll see of Angry Bots, as we\u0026rsquo;ll return to that project in Chapters 10 and 11, repeating this process to introduce Unity iOS development. Until then, starting with the next chapter, you\u0026rsquo;ll be creating Unity projects from scratch and exploring general and mostly cross-platform Unity game engine features.\nThis is the first chapter that really starts using Unity. You haven’t yet started building your own scene (that will begin in Chapter 3), but you’ve utilized the sample Angry Bots project installed with Unity to get familiar with the Unity Editor. From this point on, there are plenty of official Unity resources that expand on the topics I will be covering.\nUnity Manual # As you can see, there\u0026rsquo;s a lot of Unity user interface, and we\u0026rsquo;ve hardly covered it all. This is a good time to get serious about reading the Unity Manual, either from within the Unity Editor (the Welcome screen or the Help menu) or on the Unity web site under the Learn tab in the “Documentation” section. The web version is pretty handy when you want to look something up or just read about Unity without having a Unity Editor running nearby.\nMost of what was covered in this chapter matches topics in the Unity Basics section of the Unity Manual, particular the sections on “Learning the Interface,” “Customizing Your Workspace,” “Publishing Builds,” and “Unity Hotkeys” (although I think a better reference is just to check the keyboard shortcuts listed in the menus).\nI did jump ahead into the Advanced section of the Unity Manual and touch on Unity’s support for version control. That’s covered more in depth with the Unity Manual’s page on “Using External Version Control with Unity.”\nTutorials # Besides the “Documentation” section, the Learn tab on the Unity web site also includes a “Tutorials” section that features an extensive set of Beginning Editor videos. As the name implies, these videos provide an introduction to the Unity Editor, and in fact the set of videos cover much of what was discussed in this chapter, including descriptions of the most important views (the Game View, Scene View, Hiearchy View, Inspector View and Project View) and even the process of publishing a build.\nVersion Control # Although I only discussed version control briefly, in the context of explaining how to remove meta files, that topic is worth a little more discussion, since a VCS is so important to software development (which you\u0026rsquo;ll realize the first time you lose your project or can\u0026rsquo;t remember what change you made that broke your game!). If you already have a favorite VCS, you may want to use it with Unity, and if you haven’t been using one, then you may want to consider it if only to keep old versions of your project around in case you need to roll back, with the ability to check differences between versions.\nAmong version control systems, Perforce is a popular commercial tool used in game studios, and Subversion (svn) has a long history as an open source option. These days, distributed version control systems like Git and Mercurial are trending. I used Mercurial on Bitbucket (http://bitbucket.com/) for my internal projects and post public projects on GitHub, including the projects for this book.\nTo say Unity VCS support is product agnostic is really another way of saying Unity doesn’t have any particular version control system integrated into the Unity Editor. The meta files, and YAML scene files for Unity Pro users, simply provide better compatibility with text-oriented version control systems that are commonly used for source code. You still have to run the VCS operations yourself outside of Unity. You can find out more about YAML, by the way, on http://yaml.org/\nI find it convenient to use the Mac GitHub app provided on the GitHub web site and similarly Sourcetree for BitBucket, also available on that web site. And as we mentioned while explaining the options for Version Control Mode in the Editor Preferences, Unity also offers a VCS designed specifically for Unity called the Unity Asset Server. It requires the purchase of a Unity Team License.\n","externalUrl":null,"permalink":"/books/learnunity4/chapters/chapter02/","section":"Books","summary":"Explore Further # We’ve come to the end of this Unity tour and our play time with Angry Bots demo. Beginning with the next chapter, you’ll be creating Unity projects from scratch to learn the game engine features. But this won’t be the last you’ll see of Angry Bots, as we’ll return to that project in Chapters 10 and 11, repeating this process to introduce Unity iOS development. Until then, starting with the next chapter, you’ll be creating Unity projects from scratch and exploring general and mostly cross-platform Unity game engine features.\n","title":"A Unity Tour","type":"books"},{"content":" Explore Further # My favorite technical books, like Peter Van Der Linden\u0026rsquo;s Just Java (a very detailed but easygoing introduction to Java for non-programmers), provide a nice break at the end of each chapter by reciting an interesting anecdote, a bit of trivia, or some relevant history. Alas, I won\u0026rsquo;t be doing that in this book. However, I do find simple chapter summaries and recaps dull (I always skip them as a reader), and I feel one of the major challenges facing new Unity developers is that they need to get in the habit of finding Unity information on their own, and they need to know where to find that information, which isn\u0026rsquo;t always easy!\nTherefore, at the end of each chapter, and including this one, I\u0026rsquo;ll direct you to documentation and other resources related to the topics you just learned, so you\u0026rsquo;ll know where to find the definitive and comprehensive information sources and can take things further when you\u0026rsquo;ve finished this book. I\u0026rsquo;ll focus on the official Unity manuals and the Unity web site but also mention some third-party resources.So now that you have Unity installed, before putting it to use in this book, take a break and browse the web sites and reference documentation that you will surely be utilizing heavily from now on. It\u0026rsquo;s a always a good idea to figure out where to find what you need, before you need it! iOS Development Requirements\nAt the beginning of this chapter, I mentioned it’s a good idea to get the ball rolling on downloading Xcode and registering for Apple’s iOS Developer Program. Requirements for iOS development, including required hardware and details about the iOS Developer Program, are listed on Apple’s developer support page.\nInformation about Xcode requirements and downloading Xcode can be found at http://developer.apple.com/xcode.\nThe Unity Web Site # Along with the growth of Unity features and platforms, the Unity web site has grown, too. It’s all worth browsing, but in particular, for general information about Unity, check out the FAQ section on the Unity web site.\nThe license activation process and License Management window are documented on http://unity3d.com/unity/activation. This chapter mentioned the distinct Pro and non-Pro versions of Unity and Unity iOS, but the license comparison table at http://unity3d.com/unity/licenses provides a more comprehensive table of features and their availability for the various licenses. Many instructional videos are available on the Unity Video archive and Unity has recently introduced a Learn tab on their web site for easy access to documentation and tutorials.\nUnity Manuals and References # The top section of the Unity Help menu (Figure 1-17) lists the official Unity documentation consisting of three documents: the Unity Manual, the Reference Manual and the Scripting Reference. Although the Unity Manual doesn’t have much information on the installation and licensing procedure discussed in this chapter, the manual otherwise provides good general instruction and conceptual explanations on using Unity. The Reference Manual and Scripting Reference will become increasingly important as we create and script scenes throughout this book.\nFigure 1-17. The Help menu\nThe Unity Help menu items bring up the locally-installed copies of those manuals, but they are also available under the Learn tab of the Unity web site.\nThe Unity Community # The first three items in the middle of the Unity Help menu are links to the official Unity community sites. The forum is where users can bring up just about anything related to Unity (the forum does have moderators, though).\nThe Unity Answers site follows the format of Stack Exchange and provides some quality control over questions and answers. The Unity Feedback site allows users to post feature requests and and vote on feature requests, whether they’re their own or posted by someone else.\nTip: Although the bug type selector offers Feature Request as a Type of Bug, Unity encourages everyone to submit feature requests to their Feedback site.\nWelcome to the Unity community!\n","externalUrl":null,"permalink":"/books/learnunity4/chapters/chapter01/","section":"Books","summary":"Explore Further # My favorite technical books, like Peter Van Der Linden’s Just Java (a very detailed but easygoing introduction to Java for non-programmers), provide a nice break at the end of each chapter by reciting an interesting anecdote, a bit of trivia, or some relevant history. Alas, I won’t be doing that in this book. However, I do find simple chapter summaries and recaps dull (I always skip them as a reader), and I feel one of the major challenges facing new Unity developers is that they need to get in the habit of finding Unity information on their own, and they need to know where to find that information, which isn’t always easy!\n","title":"Getting Started","type":"books"},{"content":"Technically, I first started programming on a TRS-80 in my junior high school library, but really I just typed in the same BASIC code listing from a magazine every day until the librarian mentioned I could save the program on a cassette. I\u0026rsquo;m embarrassed to recall my first reaction when I heard the library had a computer: “What\u0026rsquo;s it good for?”\nA year later, I saw the light when I got my hands on an Apple II. After cracking open the user manual and learned how to draw graphics in BASIC, I was hooked. Soon I was writing Reversi games (one in BASIC, one in 6502 assembly) and even a 3D wireframe display program.\nIn the intervening years I wandered the Windows wasteland and worked in small and large groups developing computer graphics and games. But fast forward to six years ago, when I happily got back into the Apple fold (now with Unix!) and attended my first Apple World Wide Developer Conference. Joachim Ante, one of the cofounders and the CTO of Unity Technologies, gave me an impromptu demo of Unity 1.5, and it was exactly what I\u0026rsquo;d been looking for - an inexpensive 3D game engine that ran on a Mac and able to target multiple platforms, including Windows, Mac and web browsers.\nSo I bought a Unity 1.5 Indie license as soon as I returned home (this was when Unity Indie wasn\u0026rsquo;t free), later upgraded to Unity Pro, and was pleasantly surprised a couple of years later that Unity would support iOS! (I love it when a plan comes together) In the meantime, my former employers at Hyper Entertainment granted me a license to port HyperBowl, a 3D arcade bowling game I worked on over ten years ago, to Unity and various platforms supported by Unity, so now I had a meaty project to work with, besides the smaller apps I\u0026rsquo;d been experimenting with.\nIt took me six months to get the first version of the HyperBowl remake running as a Unity webplayer, standalone Mac and PC executables and on the iPhone (and by the way, also Android, Linux and Flash). And really, it was three months actually spent using Unity if you subtract the time I spent figuring out how to extract the art and audio assets from the original game.\fWith each new version of UnityOver the next few years, HyperBowl and my other games got faster and better-looking with each new version of Unity, and took advantage of more iOS features and more iOS devices like the iPad. I added capabilities using third-party plugins, a new pause menu, and even an entire new HyperBowl lane (level) with packages from the Unity Asset Store, which is conveniently integrated in the Unity Editor.\nThis has all taken place with a dev team of one (not counting all the work put into the original licensed assets), and I didn’t have to learn a single line of Objective-C or create my own art! In a sense, I feel like I\u0026rsquo;ve returned to my programming roots, working on my own projects for fun, and as a bonus, profit! Hopefully, I can distill my experience with Unity over the last six years (both mistakes and successes) into this book.\nAbout this Book # With any game development book there’s the problem of trying to be all things to all people - there are plenty of areas in game development, Unity, and iOS that could easily take up whole books in themselves. This book is an introduction to developing games for iOS with Unity, so our goal is to get everyone acquainted with Unity and moving into Unity iOS development smoothly, following the same progression I\u0026rsquo;ve made over the years (but in less time!)\nOn the way, we\u0026rsquo;ll go through step-by-step project examples to learn the Unity Editor and how to incorporate graphics, audio, physics and scripting to make games, and then we\u0026rsquo;ll move on to developing specifically for iOS. We\u0026rsquo;ll take advantage of free art and audio from the Unity Asset Store, so we won\u0026rsquo;t be creating 3D models or sound samples from scratch and can stay within the comfy confines of Unity (except when we have to dabble in Xcode when making iOS builds). We will, however, do plenty of scripting with Unity\u0026rsquo;s version of Javascript. Our focus will be on using the built-in Unity script functions, but we\u0026rsquo;ll point you to Unity plugins and packages that provide further capability.\nExplore Further # No one knows everything. That\u0026rsquo;s why a key to successful development is knowing how to find the tools, assets, information and help you need. So instead of just listing a recap of topics at the end of each chapter (I never bother reading those), we\u0026rsquo;ll suggest followup reading and resources for you to explore further. This is a good place to recommend some other worthwhile Unity books. Even on the same topic, it\u0026rsquo;s useful to read different books for their different takes on the subject. For example, Will Goldstone wrote one of the first Unity books, Unity Game Development Essentials, Sue Blackman\u0026rsquo;s Beginning Unity 3D Development is a hefty tome that presents an adventure game, and Jeff Murray covers Unity iOS in Game Development for iOS with Unity 3D, using a kart racing game as an example. Since I waxed nostalgic on Apple computers, I should follow up with a list of good Apple historical reading. Revolution in the Valley is a fun collection of Mac development anecdotes collected by Andy Hertzfeld. iWoz is an interesting peek at early Apple history and at the Woz himself. While this book does use make heavy use of example game projects, we won\u0026rsquo;t have much discussion on game design. But there\u0026rsquo;s certainly a lot of interesting reading on the subject. My favorite game design book is Richard Rouse\u0026rsquo;s Game Design: Theory and Practice, mostly a collection of interviews with famous game designers. And there\u0026rsquo;s a bounty of game design articles and blogs on the web site Gamasutra.\nAcknowledgments # Before we get started, I\u0026rsquo;d like to give a special mention to the people who helped me get started back in my Apple II days. My parents, who bought the Apple II that I ended up programming (and also a printer after they saw me typing out code listings on a typewriter - that junior high typing class really paid off!). My fellow Apple II programmers, Dave Lyons (now actually at Apple) and Cam Clarke (who made it to Silicon Valley but left us all too early), and Mr. Leaman, the computer programming teacher who let us hide out in the computer lab during pep rallies. That was time well spent.\n","externalUrl":null,"permalink":"/books/learnunity4/chapters/chapter00/","section":"Books","summary":"Technically, I first started programming on a TRS-80 in my junior high school library, but really I just typed in the same BASIC code listing from a magazine every day until the librarian mentioned I could save the program on a cassette. I’m embarrassed to recall my first reaction when I heard the library had a computer: “What’s it good for?”\n","title":"How I Met Unity","type":"books"},{"content":"Published by Apress, featuring a bowling project made with free Asset Store assets. There is a second edition updated by another author (and which I get more royalties from because it didn\u0026rsquo;t pay me an advance), but I prefer this first edition as I have the source - they didn\u0026rsquo;t even send me a copy of the second edition, but from ebook previews it seems they removed my introduction where I thanked my parents and friends but not the editors and they removed my author photo but jammed my mangled bio next to the second author\u0026rsquo;s photo. In any case, don\u0026rsquo;t buy either edition, they\u0026rsquo;re both obsolete.\n","externalUrl":null,"permalink":"/books/learnunity4/","section":"Books","summary":"Published by Apress, featuring a bowling project made with free Asset Store assets. There is a second edition updated by another author (and which I get more royalties from because it didn’t pay me an advance), but I prefer this first edition as I have the source - they didn’t even send me a copy of the second edition, but from ebook previews it seems they removed my introduction where I thanked my parents and friends but not the editors and they removed my author photo but jammed my mangled bio next to the second author’s photo. In any case, don’t buy either edition, they’re both obsolete.\n","title":"Learn Unity 4 for iOS Game Development","type":"books"},{"content":"","externalUrl":"https://github.com/technicat/technicat-on-software/releases","permalink":"/books/techsoft/github/","section":"Books","summary":"","title":"The Book","type":"books"},{"content":"New and recovered old blogs (some with approximate dates).\n","date":"March 18, 2026","externalUrl":null,"permalink":"/blog/","section":"Blog","summary":"New and recovered old blogs (some with approximate dates).\n","title":"Blog","type":"blog"},{"content":"","date":"March 18, 2026","externalUrl":null,"permalink":"/tags/cafe/","section":"Tags","summary":"","title":"Cafe","type":"tags"},{"content":"","date":"March 18, 2026","externalUrl":null,"permalink":"/categories/cat/","section":"Categories","summary":"","title":"Cat","type":"categories"},{"content":"","date":"March 18, 2026","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"March 18, 2026","externalUrl":null,"permalink":"/tags/fediverse/","section":"Tags","summary":"","title":"Fediverse","type":"tags"},{"content":"I\u0026rsquo;m a generally a fan of anything fediverse, but Pawfed looks like it might be my favorite thing, tracking animal welfare locations using OpenStreetMap and social media reports. I\u0026rsquo;ve started adding cat cafes (featuring adoptions).\n","date":"March 18, 2026","externalUrl":null,"permalink":"/blog/cats/pawfed/","section":"Blog","summary":"I’m a generally a fan of anything fediverse, but Pawfed looks like it might be my favorite thing, tracking animal welfare locations using OpenStreetMap and social media reports. I’ve started adding cat cafes (featuring adoptions).\n","title":"Pawfed","type":"blog"},{"content":"","date":"March 18, 2026","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"March 18, 2026","externalUrl":null,"permalink":"/","section":"technicat.com","summary":"","title":"technicat.com","type":"page"},{"content":"","date":"March 4, 2026","externalUrl":null,"permalink":"/categories/spam/","section":"Categories","summary":"","title":"Spam","type":"categories"},{"content":"I found IconBuddy convenient for finding icons and downloading them in the desired size, but after a while I became concerned that the advertised open source license didn\u0026rsquo;t always match what I found on the original icon repo, which is something I don\u0026rsquo;t want to be careless about. Plus the site brags about crediting the original icon providers which isn\u0026rsquo;t something to brag about, it\u0026rsquo;s what you\u0026rsquo;re supposed to do, unless you\u0026rsquo;re one of those AI companies that think the internet is a free buffet provided just for them.\nSo I stopped using them but the trap was set, now they had my email, they started spamming me to sell, ironically, a mass mailer, which didn\u0026rsquo;t seem to have a working unsubscribe function, but it stopped after numerous unanswered emails, a report on their github issues (it\u0026rsquo;s not open source, they\u0026rsquo;re just using github for issues) that their unsubscribe wasn\u0026rsquo;t working (they deleted the report and blocked me), and finally just leaving the note \u0026ldquo;spammer\u0026rdquo; on their dev.to bragging about entrepreneurship account.\nThat was last year, but their spam software does seem to have the industry-standard feature of not really unsubscribing but wait a year and start again. So now they\u0026rsquo;re pushing a web scraper.\nI just launched No Code Web Scraper — a Chrome extension that lets you scrape any website without writing code.\nI wish they\u0026rsquo;d stick to icons.\n","date":"March 4, 2026","externalUrl":null,"permalink":"/blog/spam/spambuddy/","section":"Blog","summary":"I found IconBuddy convenient for finding icons and downloading them in the desired size, but after a while I became concerned that the advertised open source license didn’t always match what I found on the original icon repo, which is something I don’t want to be careless about. Plus the site brags about crediting the original icon providers which isn’t something to brag about, it’s what you’re supposed to do, unless you’re one of those AI companies that think the internet is a free buffet provided just for them.\n","title":"SpamBuddy","type":"blog"},{"content":"","date":"January 31, 2026","externalUrl":null,"permalink":"/categories/career/","section":"Categories","summary":"","title":"Career","type":"categories"},{"content":"I abandoned my frankenstein resume site built with deno, fedify, and modified resume-json schema (I had a vision of a fediverse portfolio site) and went retro, starting from scratch with a Gauche Scheme script converting the JSON to basic HTML (Gauche has some nice JSON and HTML support) and styling with basic CSS. The key word is basic, going back to basics!\n","date":"January 31, 2026","externalUrl":null,"permalink":"/blog/career/gauchresume/","section":"Blog","summary":"I abandoned my frankenstein resume site built with deno, fedify, and modified resume-json schema (I had a vision of a fediverse portfolio site) and went retro, starting from scratch with a Gauche Scheme script converting the JSON to basic HTML (Gauche has some nice JSON and HTML support) and styling with basic CSS. The key word is basic, going back to basics!\n","title":"New Year, New Resume","type":"blog"},{"content":"","date":"January 31, 2026","externalUrl":null,"permalink":"/tags/resume/","section":"Tags","summary":"","title":"Resume","type":"tags"},{"content":"I\u0026rsquo;m a fan of itch.io but left in a huff a while ago because the forum was polluted with juvenile (in at least one case literally, I think one of the offenders was a teenager) racist and homophobic posts, so whenever I checked the Latest feed it was an entire thread of \u0026ldquo;Why is this site 99% gay\u0026rdquo; and dozens of \u0026ldquo;Re: Why is this site 99% gay\u0026rdquo;. A moderator apologized to me when I did the usual I\u0026rsquo;m-outta-here post, but I don\u0026rsquo;t blame them, it\u0026rsquo;s all volunteers and this is a non-profit site, not Meta. Nevertheless, I did shut down my profile and moved all my downloads to github, where I don\u0026rsquo;t mind sucking up their bandwidth.\nBut github is one of the villains of the past year with their you-are-the-product AI hoovering policies (ironically, I just got some spam from a gen-AI startup lying they found my profile on github, which is now empty), and I don\u0026rsquo;t want to burden Codeberg with big downloads (some of them exceed the upload limit anyway), so I\u0026rsquo;m resurrecting my itch.io profile, conveniently supported with a built-in badge by this Hugo Blowfish theme. I\u0026rsquo;m pondering which games to republish, but at the very least the HyperBowl and Talk Dim Sum downloads are now there. And the forum looks OK now as far as I can see.\n","date":"January 30, 2026","externalUrl":null,"permalink":"/blog/games/itchio/","section":"Blog","summary":"I’m a fan of itch.io but left in a huff a while ago because the forum was polluted with juvenile (in at least one case literally, I think one of the offenders was a teenager) racist and homophobic posts, so whenever I checked the Latest feed it was an entire thread of “Why is this site 99% gay” and dozens of “Re: Why is this site 99% gay”. A moderator apologized to me when I did the usual I’m-outta-here post, but I don’t blame them, it’s all volunteers and this is a non-profit site, not Meta. Nevertheless, I did shut down my profile and moved all my downloads to github, where I don’t mind sucking up their bandwidth.\n","title":"Back on Itch.io","type":"blog"},{"content":"","date":"January 30, 2026","externalUrl":null,"permalink":"/categories/games/","section":"Categories","summary":"","title":"Games","type":"categories"},{"content":"","date":"January 30, 2026","externalUrl":null,"permalink":"/tags/unity/","section":"Tags","summary":"","title":"Unity","type":"tags"},{"content":"","date":"January 30, 2026","externalUrl":null,"permalink":"/tags/web/","section":"Tags","summary":"","title":"Web","type":"tags"},{"content":"A neat feature of the Blowfish theme I\u0026rsquo;m using for these websites is the built-in Buy Me a Coffee widget. It works (someone kindly donated fifty dollars recently), but if you want chip in for my expenses (e.g. my annual Apple developer renewal fee which alas contributes to Apple\u0026rsquo;s political bribery slush fund i.e. Tim Cook\u0026rsquo;s salary) and have a Steam account, I recommend buying Hyperbowl for $.99 on Steam. It\u0026rsquo;s the only app/game I\u0026rsquo;m still charging for (HyperBowl is also on the App Store, but free because, again, political bribery slush fund).\n","date":"December 5, 2025","externalUrl":null,"permalink":"/blog/app/hyperbowl/buyhyperbowl/","section":"Blog","summary":"A neat feature of the Blowfish theme I’m using for these websites is the built-in Buy Me a Coffee widget. It works (someone kindly donated fifty dollars recently), but if you want chip in for my expenses (e.g. my annual Apple developer renewal fee which alas contributes to Apple’s political bribery slush fund i.e. Tim Cook’s salary) and have a Steam account, I recommend buying Hyperbowl for $.99 on Steam. It’s the only app/game I’m still charging for (HyperBowl is also on the App Store, but free because, again, political bribery slush fund).\n","title":"Buy HyperBowl, Because I'm Not Selling Anything Else","type":"blog"},{"content":"","date":"December 5, 2025","externalUrl":null,"permalink":"/categories/game/","section":"Categories","summary":"","title":"Game","type":"categories"},{"content":"","date":"December 5, 2025","externalUrl":null,"permalink":"/tags/hyperbowl/","section":"Tags","summary":"","title":"HyperBowl","type":"tags"},{"content":"","date":"December 5, 2025","externalUrl":null,"permalink":"/categories/politics/","section":"Categories","summary":"","title":"Politics","type":"categories"},{"content":"My static sites on render.com have been dropping offline one by one, well actually one then a whole bunch. Seems to be some SSL thing but it\u0026rsquo;s easier to just move than debug and a good reason to try something else (especially since render started requiring me to add a credit card even for free hosting).\nAs mentioned in the previous blog, I already moved this site to Deno (not the most obvious choice for static hosting, but I found this blog). After the others winked out, I set them up on the indie-ish, privacy-oriented, and totally European statichost.eu. The only change required was adding their hosting file for Hugo. I have to hit the manual rebuild button after a git commit instead of relying on automatically triggered rebuilds, but maybe that\u0026rsquo;s a good thing.\nDuring this process, I decided it\u0026rsquo;s time to phase out the Fugu Games site. Nothing\u0026rsquo;s going on there except for the associated fediverse account, I\u0026rsquo;m done with Unity, I\u0026rsquo;ve been getting gamedev spam on that address ever since I listed myself as a game studio on gamasutra, and it\u0026rsquo;s cluttering the top links on this site that point to less-abandoned projects. So I relocated the site to statichost but in a half-assed manner, and I probably won\u0026rsquo;t renew the domain name (after twenty years!).\nI suppose I could redirect it back to itch.io site where everything gamewise should still be but is deactivated. I actually like itch.io and hope for its success, but I couldn\u0026rsquo;t stand the teens and middle-aged men running amok in the forum complaining how gay it was (with the occasional racist meme thrown in) and left in a huff. Returning after leaving in a huff takes away from the leaving in a huff part, but I might do it if someone asks nice and the coast looks clear (they rely on volunteer moderators, so it\u0026rsquo;s a tough job and the results vary).\n","date":"June 25, 2025","externalUrl":null,"permalink":"/blog/web/europe/","section":"Blog","summary":"My static sites on render.com have been dropping offline one by one, well actually one then a whole bunch. Seems to be some SSL thing but it’s easier to just move than debug and a good reason to try something else (especially since render started requiring me to add a credit card even for free hosting).\n","title":"Turning European","type":"blog"},{"content":"","date":"June 25, 2025","externalUrl":null,"permalink":"/categories/web/","section":"Categories","summary":"","title":"Web","type":"categories"},{"content":"","date":"February 2, 2025","externalUrl":null,"permalink":"/tags/apple/","section":"Tags","summary":"","title":"Apple","type":"tags"},{"content":"","date":"February 2, 2025","externalUrl":null,"permalink":"/tags/mastodon/","section":"Tags","summary":"","title":"Mastodon","type":"tags"},{"content":"Last year was a huge disappointment outside of anything I\u0026rsquo;ve done or failed to do, so I don\u0026rsquo;t feel like a doing a year in review. But I\u0026rsquo;m fairly satisified with my IT setup right now, which has at least a decreasing entanglement with Vichy Tech.\nMy websites are built with Hugo (Blowfish theme), deployed on Render and Deno (this site), along with a links/resume site (ham-handed) hand-built with Deno Fresh and and a sprinkle of Fedify (just to get a feel for it). My code repos are on Codeberg (for the open source stuff) and Gitlab (anything that\u0026rsquo;s not quite open source), with some lingering use of AI pirate site Github for Deno (which doesn\u0026rsquo;t integrate with anything else). Social accounts all on the fediverse (get with the program, people!), official ones on Mastohost, Mitra and Snac test instances self-hosted on Digital Ocean (I had visions of many platforms, but have only kept those two running), and the rest relying on the kindness of strangers (volunteer admins putting up with complaints from thousands of freeloading users). Only actively \u0026ldquo;selling\u0026rdquo; on Steam and the App Store, still getting $.99 per occasional purchase on the former and giving it away on the latter since they\u0026rsquo;re Bad Apple now and I don\u0026rsquo;t want to be in their bribe supply chain. It\u0026rsquo;s an open question what I\u0026rsquo;ll do when my app developer agreement (is it really an agreement when one side dictates the terms) is up for renewal this fall, but I still have a fediverse app in development (in Swift/SwiftUI, at least I\u0026rsquo;ve never been Facebook-tainted with react native) on Testflight (which is a much more convenient place for a free app). Domains registered on Dynadot, which doesn\u0026rsquo;t have the greatest UI but it\u0026rsquo;s cheap (they hook you with a deal the first year and get you on the renewal). Mail, VPN, and services I don\u0026rsquo;t use at Proton. It\u0026rsquo;s not easy self-hosting, but it\u0026rsquo;s easier than it used to be, and cheaper. I used to pay Dreamhost a hundred dollars a year, but now Render is free for static sites, Deno doesn\u0026rsquo;t cost me anything, and Digital Ocean just a few dollars a month.\nMastohost is $6/month (less than my miserable attempt a couple years ago to self-host Mastodon), I forget what Proton costs since I signed up for a multi-year subscription (which is just as well since they recently joined the he-just-said-what-he-really-thinks club), most of my domains are around $20/year except pc.cafe which costs a couple of hundred (maybe it will pay off when some shady Caribbean company fronting for Big Tech tries to buy it).\nFinally, Apple charges a hundred dollars a year for the privilege of having your apps rejected (an insult considering they feature the Musk/Trump apps) and bug reports returned requesting the information you just supplied (I know where Apple Intelligence isn\u0026rsquo;t).\nTo complete the business picture, I pay $59/month for a virtual office at Work Hive in Salt Lake City and $15/year to maintain my LLC (Utah: don\u0026rsquo;t come here for abortions but we\u0026rsquo;re small business and book ban friendly!).\n","date":"February 2, 2025","externalUrl":null,"permalink":"/blog/yearreview/2024/","section":"Blog","summary":"Last year was a huge disappointment outside of anything I’ve done or failed to do, so I don’t feel like a doing a year in review. But I’m fairly satisified with my IT setup right now, which has at least a decreasing entanglement with Vichy Tech.\n","title":"What I'm Using","type":"blog"},{"content":"","date":"November 10, 2024","externalUrl":null,"permalink":"/categories/app/","section":"Categories","summary":"","title":"App","type":"categories"},{"content":"This hurts me more than it hurts them, but I\u0026rsquo;m making my apps on the App Store free rather than contribute to Tim Cook\u0026rsquo;s salary. I still have a $.99 income stream on Steam, so come on, Steamers!\nhttps://daringfireball.net/2024/11/i_wonder\nhttps://www.yahoo.com/news/mark-zuckerberg-tim-cook-were-180125921.html\n","date":"November 10, 2024","externalUrl":null,"permalink":"/blog/app/appsforfree/","section":"Blog","summary":"This hurts me more than it hurts them, but I’m making my apps on the App Store free rather than contribute to Tim Cook’s salary. I still have a $.99 income stream on Steam, so come on, Steamers!\n","title":"Money for Nothing, Apps for Free","type":"blog"},{"content":"","date":"November 10, 2024","externalUrl":null,"permalink":"/tags/talk-dim-sum/","section":"Tags","summary":"","title":"Talk Dim Sum","type":"tags"},{"content":"Eagle-eyed readers of this blog may notice the Codeberg icon on this site. A social media acquaintance from a few years ago told me he was moving from GitHub to Gitlab because of owner Microsoft\u0026rsquo;s practices, and finally, what with Copilot and Microsoft\u0026rsquo;s AI head talking about fair use like a teen operating a pirate site, I\u0026rsquo;m packing up my bags, starting with the open source repos.\nSo far, Codeberg seems to work well, has the same basic functionality as GitHub (no convenient GUI so I\u0026rsquo;ll have to get used to command-line git again), but they\u0026rsquo;re all about open source, so I still have to seek another home for my other repos.\n","date":"July 10, 2024","externalUrl":null,"permalink":"/blog/web/codeberg/","section":"Blog","summary":"Eagle-eyed readers of this blog may notice the Codeberg icon on this site. A social media acquaintance from a few years ago told me he was moving from GitHub to Gitlab because of owner Microsoft’s practices, and finally, what with Copilot and Microsoft’s AI head talking about fair use like a teen operating a pirate site, I’m packing up my bags, starting with the open source repos.\n","title":"On Codeberg","type":"blog"},{"content":"","date":"July 10, 2024","externalUrl":null,"permalink":"/categories/software/","section":"Categories","summary":"","title":"Software","type":"categories"},{"content":"","date":"July 6, 2024","externalUrl":null,"permalink":"/categories/design/","section":"Categories","summary":"","title":"Design","type":"categories"},{"content":"If you\u0026rsquo;ve been wondering why this blog hasn\u0026rsquo;t been updated since December (probably not), it\u0026rsquo;s because it got into an unupdateable state on render.com, maybe because I crammed too many assets (photos) into it.\nI\u0026rsquo;ve seen mentions of similar issues there resolved by contacting support and having them reset something, but I just let it sit for a while until I started playing with Deno recently and decided to try the instructions for deploying Hugo on Deno. So if you\u0026rsquo;re reading this, it works!\n","date":"July 6, 2024","externalUrl":null,"permalink":"/blog/web/deno/","section":"Blog","summary":"If you’ve been wondering why this blog hasn’t been updated since December (probably not), it’s because it got into an unupdateable state on render.com, maybe because I crammed too many assets (photos) into it.\n","title":"On Deno","type":"blog"},{"content":"","date":"December 18, 2023","externalUrl":null,"permalink":"/categories/books/","section":"Categories","summary":"","title":"Books","type":"categories"},{"content":"","date":"December 18, 2023","externalUrl":null,"permalink":"/tags/bookwyrm/","section":"Tags","summary":"","title":"Bookwyrm","type":"tags"},{"content":"As part of my move to the Fediverse, I joined bookwyrm as my goodreads replacement. It basically works the same, with the exception of being on the fediverse and not owned by Amazon. It\u0026rsquo;s a bit more work finding books, the search is spotty and often you\u0026rsquo;ll have to choose an edition to import or select among variations of the same book, but it does the job, you can track the books you\u0026rsquo;ve read or want to read, and I\u0026rsquo;d say the community feel is better than on goodreads (may vary depending on the instance you choose - I picked the main one, bookwyrm.social).\nMy instance is now displaying my reading year in review, which gives me a nice warm feeling of accomplishment (somewhat undeserved, as the books read include ones I remembered from previous years), does show some of the incomplete info such as the missing cover graphics and the wildly incorrect stat that Steve Jobs by Walter Isaacson is 32 pages (unless there\u0026rsquo;s a graphic novel version).\nOne goodreads-like feature I sort of wish bookwyrm didn\u0026rsquo;t have is the five-star rating system, which I feel in general (apps, too) is a dumbing down of the Internet and cheapens the appraisal of a work. I just read Cormac McCarthy\u0026rsquo;s The Passenger, and if I were to give it a rating it\u0026rsquo;d be four stars, but it seems insulting to just assign a number grade, and it\u0026rsquo;s not like there\u0026rsquo;s any kind of standard. Plus it leads to the dumbass \u0026ldquo;I really wanted to give this five stars, but\u0026hellip;\u0026rdquo; wallowing in star-giving power. You want to know about a book, you should have to read a review, and if you want to rate a book, you should write something. So I\u0026rsquo;m going to try avoid giving stars (can\u0026rsquo;t unstar previous ones though) and see how that goes.\n","date":"December 18, 2023","externalUrl":null,"permalink":"/blog/book/bookwyrm/","section":"Blog","summary":"As part of my move to the Fediverse, I joined bookwyrm as my goodreads replacement. It basically works the same, with the exception of being on the fediverse and not owned by Amazon. It’s a bit more work finding books, the search is spotty and often you’ll have to choose an edition to import or select among variations of the same book, but it does the job, you can track the books you’ve read or want to read, and I’d say the community feel is better than on goodreads (may vary depending on the instance you choose - I picked the main one, bookwyrm.social).\n","title":"Bookwyrm","type":"blog"},{"content":"","date":"December 18, 2023","externalUrl":null,"permalink":"/tags/reviews/","section":"Tags","summary":"","title":"Reviews","type":"tags"},{"content":"","date":"December 16, 2023","externalUrl":null,"permalink":"/categories/covid/","section":"Categories","summary":"","title":"Covid","type":"categories"},{"content":"","date":"December 16, 2023","externalUrl":null,"permalink":"/categories/telehealth/","section":"Categories","summary":"","title":"Telehealth","type":"categories"},{"content":"Well, I had a good run, but covid caught up with me. Tested positive after getting a sore throat (and after running through the entire lot of free federal inteliswabs - four test kits is not enough). I called the local urgent care center, which advised me to isolate for five days and mask for another five, but then I saw test2treat, an NIH/UMass funded study on telemedicine which offers free consultation and treatment online. I just filled out a symptom questionnaire, uploaded a photo of my positive test, called the assigned physician the next day for a treatment plan, and they fedexed me paxlovid, showed up on my doorstep the next morning. That\u0026rsquo;s the way to do it!\n","date":"December 16, 2023","externalUrl":null,"permalink":"/blog/web/test2treat/","section":"Blog","summary":"Well, I had a good run, but covid caught up with me. Tested positive after getting a sore throat (and after running through the entire lot of free federal inteliswabs - four test kits is not enough). I called the local urgent care center, which advised me to isolate for five days and mask for another five, but then I saw test2treat, an NIH/UMass funded study on telemedicine which offers free consultation and treatment online. I just filled out a symptom questionnaire, uploaded a photo of my positive test, called the assigned physician the next day for a treatment plan, and they fedexed me paxlovid, showed up on my doorstep the next morning. That’s the way to do it!\n","title":"Test2Treat","type":"blog"},{"content":"","date":"December 6, 2023","externalUrl":null,"permalink":"/tags/salt-lake-city/","section":"Tags","summary":"","title":"Salt Lake City","type":"tags"},{"content":"Salt Lake City is a great bookstore city, with half a dozen nice indie bookstores. I didn\u0026rsquo;t know that when I moved here, but I did make sure there was one good bookstore and that was Weller Book Works, which has the nicest bookshelf layout.\n","date":"December 6, 2023","externalUrl":null,"permalink":"/blog/book/stores/wellers/","section":"Blog","summary":"Salt Lake City is a great bookstore city, with half a dozen nice indie bookstores. I didn’t know that when I moved here, but I did make sure there was one good bookstore and that was Weller Book Works, which has the nicest bookshelf layout.\n","title":"Weller Book Works","type":"blog"},{"content":"I\u0026rsquo;m still figuring out the freeways around Salt Lake City, so when I assumed the left lane would merge onto the interstate, instead it dumped me into Midvale. I parked downtown, checked out the street art, and stopped at Tres Gatos Coffee.\n","date":"December 4, 2023","externalUrl":null,"permalink":"/blog/travel/utah/midvale/","section":"Blog","summary":"I’m still figuring out the freeways around Salt Lake City, so when I assumed the left lane would merge onto the interstate, instead it dumped me into Midvale. I parked downtown, checked out the street art, and stopped at Tres Gatos Coffee.\n","title":"Downtown Midvale","type":"blog"},{"content":"","date":"December 4, 2023","externalUrl":null,"permalink":"/tags/street-art/","section":"Tags","summary":"","title":"Street Art","type":"tags"},{"content":"","date":"December 4, 2023","externalUrl":null,"permalink":"/categories/travel/","section":"Categories","summary":"","title":"Travel","type":"categories"},{"content":"","date":"December 4, 2023","externalUrl":null,"permalink":"/tags/utah/","section":"Tags","summary":"","title":"Utah","type":"tags"},{"content":"","date":"December 2, 2023","externalUrl":null,"permalink":"/tags/app/","section":"Tags","summary":"","title":"App","type":"tags"},{"content":"With the passing of Kissinger, I just want to note that I made a note of his war crimes in my dim sum app\n","date":"December 2, 2023","externalUrl":null,"permalink":"/blog/politics/kissinger/","section":"Blog","summary":"With the passing of Kissinger, I just want to note that I made a note of his war crimes in my dim sum app\n","title":"Kissinger","type":"blog"},{"content":"","date":"December 2, 2023","externalUrl":null,"permalink":"/tags/war-crimes/","section":"Tags","summary":"","title":"War Crimes","type":"tags"},{"content":"","date":"November 28, 2023","externalUrl":null,"permalink":"/categories/film/tv/","section":"Categories","summary":"","title":"Film/Tv","type":"categories"},{"content":"Just posted this on a \u0026ldquo;What are you grateful to k-dramas for?\u0026rdquo; thread on Dramabeans\nI\u0026rsquo;m grateful k-drama was there via Hulu and Dramafever (RIP) when I stopped paying for cable to save money.\nI\u0026rsquo;m grateful k-drama showed me something of Korean culture (of which I knew nothing) and more East Asian culture (I\u0026rsquo;m Chinese by way of Iowa).\nI\u0026rsquo;m grateful k-drama gave me some momentum in learning languages (childhood Chinese Sunday school lessons were a failure, but an Asian language with an alphabet where you don\u0026rsquo;t have to learn nine different tones? Sold!)\nI\u0026rsquo;m grateful I can spend the evening watching not 99% Caucasian TV (sometimes I play a game while watching a show that I call Spot the Asian).\nI\u0026rsquo;m grateful to k-drama for expanding my palate, starting with a search for omurice in SoCal Garden Grove Koreatown, and this year my favorite discovery is Korean street toast (Gilgeori toast).\n","date":"November 28, 2023","externalUrl":null,"permalink":"/blog/tv/kdrama/gratefulkdrama/","section":"Blog","summary":"Just posted this on a “What are you grateful to k-dramas for?” thread on Dramabeans\nI’m grateful k-drama was there via Hulu and Dramafever (RIP) when I stopped paying for cable to save money.\n","title":"Grateful for Kdrama","type":"blog"},{"content":"","date":"November 28, 2023","externalUrl":null,"permalink":"/tags/kdrama/","section":"Tags","summary":"","title":"Kdrama","type":"tags"},{"content":"","date":"November 28, 2023","externalUrl":null,"permalink":"/tags/korean/","section":"Tags","summary":"","title":"Korean","type":"tags"},{"content":"Fedicat is now on Testflight. Still plenty to work on (like notifications) but I think it browses nice.\n","date":"November 25, 2023","externalUrl":null,"permalink":"/blog/app/testflight/","section":"Blog","summary":"Fedicat is now on Testflight. Still plenty to work on (like notifications) but I think it browses nice.\n","title":"Fedicat on Testflight","type":"blog"},{"content":"","date":"November 25, 2023","externalUrl":null,"permalink":"/tags/ios/","section":"Tags","summary":"","title":"IOS","type":"tags"},{"content":"","date":"November 25, 2023","externalUrl":null,"permalink":"/categories/social/","section":"Categories","summary":"","title":"Social","type":"categories"},{"content":"","date":"November 20, 2023","externalUrl":null,"permalink":"/tags/fedicat/","section":"Tags","summary":"","title":"Fedicat","type":"tags"},{"content":"","date":"November 20, 2023","externalUrl":null,"permalink":"/tags/html/","section":"Tags","summary":"","title":"HTML","type":"tags"},{"content":"After the latest tweak to the not-really HTML parser in my fediverse app (it does use the SwiftSoup HTML parser but just to extract plain text and relies on a bunch of pre and post-processing hacks to look OK), I decided it was time to have a real HTML-to-markdown converter.\nFortunately, I ran across HTML2Markdown, already modified from the original to use SwiftSoup and add options tailored to converting HTML produced by Mastodon.\nI forked it to add some customizations for my app, so far they include handling the h1-h6 header tags (not produced by Mastodon as far as I know but I encountered them in Firefish announcement text), and boldfacing hashtags and mentions while removing their href links (I display tappable mentions and tags separately underneath the post).\nHere\u0026rsquo;s how I call the converter, from a String extension:\nlet dom = try HTMLParser().parse(html: self) return dom.markdownFormatted(options: [.escapeMarkdown, .swiftui, .mastodon, .boldTag, .boldMention, .unorderedListBullets]) The .escapeMarkdown option escapes any existing characters that may accidentally be rendered as markdown, .mastodon makes a few adjustments for Mastodon-generated HTML, and .unorderedListBullets makes nice lists.\nI added .swiftui to generate only markdown that can be rendered by SwiftUI (this is applicable to the header tags), .boldTag and .boldMention to turn hashtags and mentions into boldface without links. That code might not be so robust, though, as it just checks links if they have @ and # prefixes (Mastodon includes hashtag and mention classes but can\u0026rsquo;t rely on that from other platforms).\n","date":"November 20, 2023","externalUrl":null,"permalink":"/blog/programming/swift/html2md/","section":"Blog","summary":"After the latest tweak to the not-really HTML parser in my fediverse app (it does use the SwiftSoup HTML parser but just to extract plain text and relies on a bunch of pre and post-processing hacks to look OK), I decided it was time to have a real HTML-to-markdown converter.\n","title":"HTML2Markdown","type":"blog"},{"content":"","date":"November 20, 2023","externalUrl":null,"permalink":"/tags/markdown/","section":"Tags","summary":"","title":"Markdown","type":"tags"},{"content":"","date":"November 20, 2023","externalUrl":null,"permalink":"/categories/programming/","section":"Categories","summary":"","title":"Programming","type":"categories"},{"content":"","date":"November 20, 2023","externalUrl":null,"permalink":"/tags/swift/","section":"Tags","summary":"","title":"Swift","type":"tags"},{"content":"","date":"November 16, 2023","externalUrl":null,"permalink":"/tags/ageism/","section":"Tags","summary":"","title":"Ageism","type":"tags"},{"content":"It\u0026rsquo;s nice they\u0026rsquo;re funding progressive campaigns, but my first impression of Run for Something some years ago was that it oozed Bay Area tech millennial self-adulation, going on and on about supporting young, diverse (excluding the not young), and progressive (as long as you\u0026rsquo;re young) candidates. They had some fine print specifying an age limit (I think it was 35) and a weak rationale that they wanted to invest in candidates who will be there for the next thirty years (they don\u0026rsquo;t want current old politicians, just future old ones?)\nNow it\u0026rsquo;s worse. Their current website looks like a campaign against old people, caricatured enough to be amusing if they didn\u0026rsquo;t target Democratic leadership like a bunch of Trumpers, indistinguishable from the Fox News refrains about Biden and Pelosi being old and senile. It\u0026rsquo;s disrespectul and shows you progressivism is not their top priority.\nThe previous age stipulation is gone (which makes sense since older millennials are now over forty now, wake up and smell the jello, you\u0026rsquo;re not the fresh new thing, anymore), replaced by required membership in the millennial and gen-z clubs (have to include them, you can\u0026rsquo;t exclude old and actually young people). Which is stupid, buying into the marketing (\u0026ldquo;You\u0026rsquo;ve come a long way, baby\u0026rdquo;), but that\u0026rsquo;s always been their real mission statement. It isn\u0026rsquo;t really about age, it\u0026rsquo;s generational tribalism.\nSo if you run, go ahead and take their money, but they\u0026rsquo;re just another set of narcissistic Silicon Valley political funders with some disgusting attitudes.\n","date":"November 16, 2023","externalUrl":null,"permalink":"/blog/politics/runforsomething/","section":"Blog","summary":"It’s nice they’re funding progressive campaigns, but my first impression of Run for Something some years ago was that it oozed Bay Area tech millennial self-adulation, going on and on about supporting young, diverse (excluding the not young), and progressive (as long as you’re young) candidates. They had some fine print specifying an age limit (I think it was 35) and a weak rationale that they wanted to invest in candidates who will be there for the next thirty years (they don’t want current old politicians, just future old ones?)\n","title":"Logan's Run for Something","type":"blog"},{"content":"","date":"November 12, 2023","externalUrl":null,"permalink":"/categories/food/","section":"Categories","summary":"","title":"Food","type":"categories"},{"content":"","date":"November 12, 2023","externalUrl":null,"permalink":"/tags/navajo/","section":"Tags","summary":"","title":"Navajo","type":"tags"},{"content":"I already miss the food scene in South Salt Lake. Aside from the Chinatown area there is a diversity of food - Indian, Latin American, and even Native American. At Navajo Hogan (hogan is \u0026ldquo;home\u0026rdquo;), you can get a Navajo taco, which is a frybread with fixins. And even learn a few words from reading the restroom signs (hastiin is \u0026ldquo;man\u0026rdquo;).\n","date":"November 12, 2023","externalUrl":null,"permalink":"/blog/travel/utah/southsaltlake/navajohogan/","section":"Blog","summary":"I already miss the food scene in South Salt Lake. Aside from the Chinatown area there is a diversity of food - Indian, Latin American, and even Native American. At Navajo Hogan (hogan is “home”), you can get a Navajo taco, which is a frybread with fixins. And even learn a few words from reading the restroom signs (hastiin is “man”).\n","title":"Navajo Hogan","type":"blog"},{"content":"","date":"November 12, 2023","externalUrl":null,"permalink":"/tags/restaurant/","section":"Tags","summary":"","title":"Restaurant","type":"tags"},{"content":"","date":"November 12, 2023","externalUrl":null,"permalink":"/tags/taco/","section":"Tags","summary":"","title":"Taco","type":"tags"},{"content":"","date":"November 12, 2023","externalUrl":null,"permalink":"/tags/travel/","section":"Tags","summary":"","title":"Travel","type":"tags"},{"content":"Rules are more easily accepted, even found interesting if there\u0026rsquo;s a story to tell, if there\u0026rsquo;s an explanation.\n","date":"November 4, 2023","externalUrl":null,"permalink":"/blog/rules/","section":"Blog","summary":"Rules are more easily accepted, even found interesting if there’s a story to tell, if there’s an explanation.\n","title":"Rules","type":"blog"},{"content":"","date":"November 4, 2023","externalUrl":null,"permalink":"/tags/sign/","section":"Tags","summary":"","title":"Sign","type":"tags"},{"content":"","date":"November 4, 2023","externalUrl":null,"permalink":"/categories/ui/","section":"Categories","summary":"","title":"UI","type":"categories"},{"content":"","date":"October 29, 2023","externalUrl":null,"permalink":"/categories/bandwidth/","section":"Categories","summary":"","title":"Bandwidth","type":"categories"},{"content":"","date":"October 29, 2023","externalUrl":null,"permalink":"/categories/las-vegas/","section":"Categories","summary":"","title":"Las Vegas","type":"categories"},{"content":"","date":"October 29, 2023","externalUrl":null,"permalink":"/categories/utah/","section":"Categories","summary":"","title":"Utah","type":"categories"},{"content":"I still have an office in Las Vegas which I\u0026rsquo;m working on closing down. One reason, besides the fact that I moved, is the pathetic broadband speed, similar to that of my last apartment there, which is more than 200x slower than the fiber connection in my new apartment near Salt Lake City.\nI had high-tech hopes for Vegas when I moved there seven years ago, and I think there was a missed remote-work-here opportunity during the pandemic, but really their only infrastructure upgrade has been letting Elon Musk build more Tesla tunnels.\n","date":"October 29, 2023","externalUrl":null,"permalink":"/blog/web/slcvsvegas/","section":"Blog","summary":"I still have an office in Las Vegas which I’m working on closing down. One reason, besides the fact that I moved, is the pathetic broadband speed, similar to that of my last apartment there, which is more than 200x slower than the fiber connection in my new apartment near Salt Lake City.\n","title":"Vegas Is Too Slow","type":"blog"},{"content":"One thing you may notice if you\u0026rsquo;re in Utah is all the license plates virtue signalling the American flag and In God We Trust (adopted by our founding fathers in 1956). I registered my car recently, so I had the opportunity to combat the spread of theocracy by selecting one of the atheist plates.\nI chose Life Elevated Arches because I couldn\u0026rsquo;t tell what was going on with the nearly all white skier plate. I haven\u0026rsquo;t been to the Arches National Park yet (apparently it\u0026rsquo;s so heavily visited they have reservations and timed entry), but I guess now I should check it out.\n","date":"October 19, 2023","externalUrl":null,"permalink":"/blog/travel/utah/license/","section":"Blog","summary":"One thing you may notice if you’re in Utah is all the license plates virtue signalling the American flag and In God We Trust (adopted by our founding fathers in 1956). I registered my car recently, so I had the opportunity to combat the spread of theocracy by selecting one of the atheist plates.\n","title":"Life Elevated","type":"blog"},{"content":"","date":"October 19, 2023","externalUrl":null,"permalink":"/tags/theocracy/","section":"Tags","summary":"","title":"Theocracy","type":"tags"},{"content":"One update I made to Talk Dim Sum this year was to add a custom router so I can escape the NavigationLink straightjacket.\nMy router is just a simple stack.\n@Observable public class Router\u0026lt;T: Equatable\u0026gt; { public var path: [T] = [] public init() { } public func push(_ route: T) { path.append(route) } public func pushNew(_ route: T) { if path.last != route { push(route) } } public func pop() { if !path.isEmpty { path.removeLast() } } func clear() { path = [] } } It\u0026rsquo;s generic so I can use it in more than one app, each with a different set of routes. Here\u0026rsquo;s the one for my dim sum app, just listing the routes for bringing up a camera view and for displaying the image taken.\nenum Route: Hashable { case mlCamera case mlImage(UIImage) } The enum cases have to be mapped to actual views.\nstruct DestinationView: View { let route: Route var body: some View { switch route { case .mlCamera: MLCameraView() case let .mlImage(image): MLImageView(image: image) } } } Now I can instantiate the router at the top level of my app and pass it down as an environment object.\n@State var router = Router\u0026lt;Route\u0026gt;() var body: some Scene { WindowGroup { AppView() .environment(router) } } First supplying it to the NavigationStack, and within that establish the navigation destination.\n@Environment(Router\u0026lt;Route\u0026gt;.self) var router: Router\u0026lt;Route\u0026gt; var body: some View { @Bindable var router = router NavigationStack(path: $router.path) { Tabs() .navigationDestination(for: Route.self) { route in DestinationView(route: route) } } } Now it\u0026rsquo;s ready to use, e.g. this line pushes a new view on the stack (if it\u0026rsquo;s not already there)\nrouter.pushNew(.mlImage(image)) ","date":"October 15, 2023","externalUrl":null,"permalink":"/blog/programming/swift/route/","section":"Blog","summary":"One update I made to Talk Dim Sum this year was to add a custom router so I can escape the NavigationLink straightjacket.\nMy router is just a simple stack.\n@Observable public class Router\u003cT: Equatable\u003e { public var path: [T] = [] public init() { } public func push(_ route: T) { path.append(route) } public func pushNew(_ route: T) { if path.last != route { push(route) } } public func pop() { if !path.isEmpty { path.removeLast() } } func clear() { path = [] } } It’s generic so I can use it in more than one app, each with a different set of routes. Here’s the one for my dim sum app, just listing the routes for bringing up a camera view and for displaying the image taken.\n","title":"A SwiftUI Router","type":"blog"},{"content":"I spent the past week updating my Swift code to the latest and greatest. In some cases it didn\u0026rsquo;t simplify much (Observable), but I was able to remove a bunch of SQLite.swift code and replace it with just a few lines of SwiftData.\nThat code implemented the favorite feature in Talk Dim Sum, where you mark your favorite dishes and see only those in a separate view. Whereas before I stored the IDs of the favorited dishes in a table and wrote functions to insert, search for, and delete those entries, with SwiftData I defined a very simple persistent model containing that ID.\n@Model class Favorite { @Attribute(.unique) var id: String init(dish: Item) { self.id = dish.id } } Then add a modelContainer in the main view of the app that contains favorites.\nvar body: some Scene { WindowGroup { AppView() .modelContainer(for: [ Favorite.self ]) .environment(dimsum) .environment(places) .environment(tts) .environment(stt) .environment(router) } } To favorite a dish, just perform the insert on an environment object.\nstruct FavoriteButton: View { @Environment(\\.modelContext) private var context let dish: Item var body: some View { ActionButton(\u0026#34;dish.favorite\u0026#34;, \u0026#34;heart\u0026#34;) { context.insert(Favorite(dish: dish)) } } } To delete, access the stored favorites using @Query, and once I\u0026rsquo;ve found the one that matches the dish I want to unfavorite, call delete on the environment object.\nstruct RemoveFavoriteButton: View { @Environment(\\.modelContext) private var context @Query() var faves: [Favorite] let dish: Item var body: some View { ActionButton(\u0026#34;dish.unfavorite\u0026#34;, \u0026#34;heart.fill\u0026#34;) { let found = faves.filter { $0.id == dish.id } context.delete(found[0]) } } } And to display the list of favorites, just use that @Query and map the Favorites back to dishes (here I do some filtering to remove any obsolete IDs, as it\u0026rsquo;s possible for dishes to be removed or have their IDs changed).\nstruct FavoritesCollectionView: View { @Environment(DimSum.self) var dimsum: DimSum @Query() var faves: [Favorite] var body: some View { DishCollectionView(dishes: faves.filter({dimsum.isDish($0.id)}).map { dimsum[$0.id]! }) } } ","date":"October 8, 2023","externalUrl":null,"permalink":"/blog/programming/swift/swiftdata/","section":"Blog","summary":"I spent the past week updating my Swift code to the latest and greatest. In some cases it didn’t simplify much (Observable), but I was able to remove a bunch of SQLite.swift code and replace it with just a few lines of SwiftData.\n","title":"Simple SwiftData","type":"blog"},{"content":"","date":"September 27, 2023","externalUrl":null,"permalink":"/tags/bookstore/","section":"Tags","summary":"","title":"Bookstore","type":"tags"},{"content":"","date":"September 27, 2023","externalUrl":null,"permalink":"/tags/drag/","section":"Tags","summary":"","title":"Drag","type":"tags"},{"content":"The Salt Lake City area has a wealth of bookstores. After discovering Weller Books, I thought I was done, but then I found Legendarium, then Under the Umbrella, then Marissa\u0026rsquo;s, and I finally got around to checking out The King\u0026rsquo;s English after being reminded by news of a bomb threat (this city doesn\u0026rsquo;t deserve all these bookstores).\nLike Sunrise Books and Music in Reno, The King\u0026rsquo;s English occupies an old house which somehow seems bigger than it looks from the outside.\nAnd on the outside there\u0026rsquo;s a social media-friendly photo spot\nplus a shelf of books that you can pick up for a donation (via venmo).\n","date":"September 27, 2023","externalUrl":null,"permalink":"/blog/book/stores/thekingsenglish/","section":"Blog","summary":"The Salt Lake City area has a wealth of bookstores. After discovering Weller Books, I thought I was done, but then I found Legendarium, then Under the Umbrella, then Marissa’s, and I finally got around to checking out The King’s English after being reminded by news of a bomb threat (this city doesn’t deserve all these bookstores).\n","title":"The King's English","type":"blog"},{"content":"","date":"September 24, 2023","externalUrl":null,"permalink":"/tags/crowdin/","section":"Tags","summary":"","title":"Crowdin","type":"tags"},{"content":"You can check in your translations, but you can never leave.\n","date":"September 24, 2023","externalUrl":null,"permalink":"/blog/programming/crowdin/","section":"Blog","summary":"You can check in your translations, but you can never leave.\n","title":"It's Crowdin, not Crowdout","type":"blog"},{"content":"","date":"September 24, 2023","externalUrl":null,"permalink":"/tags/localization/","section":"Tags","summary":"","title":"Localization","type":"tags"},{"content":"Whenever you have a feed, you need successive queries to obtain older (and newer) items. The Mastodon API takes and returns descriptors for each page of results, but the return is a link header in the response.\nConveniently, TootSDK conveniently packages the page descriptor in a PageInfo struct that is passed and returned from the TootClient functions that correspond to the API endpoints.\nFor example, I have a fairly simple timeline display implemented in SwiftUI, with just two state variables, one for the displayed list of latest posts, and a variable holding the page info for the next oldest page to retrieve.\n@State private var list: [Post] = [] @State private var prev: PagedInfo? To get the most recent page of Posts, I call the TootClient query. TootClient.getTimeline takes a timeline type (home, local, federated\u0026hellip;) and an optional PageInfo which we leave as null since we want the latest page.\nfunc getLatest() async { do { let result = try await toot.getTimeline(timeline) list = result.result prev = result.previousPage } catch { // handle error } } One we\u0026rsquo;ve called getLatest, we have our most recent Posts and essentially a pointer the next page, nil if we\u0026rsquo;re at the end. So we can call this function to to retrieve and append the next page.\nfunc getPrev() async { if prev != nil { do { let result = try await toot.getTimeline(timeline, prev) list.append(contentsOf: result.result) prev = result.previousPage } catch { // handle error } } } Now to display the list\nLazyVStack { ForEach(list) { post in PostView(post: post).onAppear { if post == list.last { Task { await getPrev() } } } } } .onAppear { Task { await getLatest() } } .refreshable { Task { await getLatest() } } When this view appears or is pulldown refreshed it gets and displays the latest page. Then as you scroll down (you\u0026rsquo;ll probably want to wrap a ScrollView around it), once the bottommost item appears, it calls getPrev to fetch the next page.\nThis is pretty simple, every call to getLatest resets the list and starts from scratch, and if you keep scrolling down the list just grows. You may want to use the TootStream layer around timelines that treats timelines like stream. But there are many other Mastodon/TootClient queries that handle paging in the same way (and not just for posts, also Accounts, Tags\u0026hellip;) so this template can be applied to any of those.\n","date":"September 14, 2023","externalUrl":null,"permalink":"/blog/programming/swift/tootsdk/paging/","section":"Blog","summary":"Whenever you have a feed, you need successive queries to obtain older (and newer) items. The Mastodon API takes and returns descriptors for each page of results, but the return is a link header in the response.\n","title":"Paging with TootSDK","type":"blog"},{"content":"","date":"September 13, 2023","externalUrl":null,"permalink":"/tags/reno/","section":"Tags","summary":"","title":"Reno","type":"tags"},{"content":"One of the first things I look for when checking out a new place is an indie bookstore, and I was surprised to find it in this impressive house in midtown Reno, Sundance Books and Music.\nIt looks big on the outside and doesn\u0026rsquo;t disappoint on the inside, appropriately roomy.\nSelection-wise, it\u0026rsquo;s a mix of new and used. The sci-fi selection (my bookstore test) is not large, but it\u0026rsquo;s respectable, including Adrian Tchaikovsky\u0026rsquo;s Something of Something series.\n","date":"September 13, 2023","externalUrl":null,"permalink":"/blog/book/stores/sundancebooks/","section":"Blog","summary":"One of the first things I look for when checking out a new place is an indie bookstore, and I was surprised to find it in this impressive house in midtown Reno, Sundance Books and Music.\n","title":"Sundance Books and Music","type":"blog"},{"content":"","date":"September 11, 2023","externalUrl":null,"permalink":"/categories/art/","section":"Categories","summary":"","title":"Art","type":"categories"},{"content":"","date":"September 11, 2023","externalUrl":null,"permalink":"/tags/highwayart/","section":"Tags","summary":"","title":"Highwayart","type":"tags"},{"content":"","date":"September 11, 2023","externalUrl":null,"permalink":"/tags/streetart/","section":"Tags","summary":"","title":"Streetart","type":"tags"},{"content":"While driving through the Salt Lake Desert, I saw this thing in the middle of nowhere, along I80.\nI did a web search (I didn\u0026rsquo;t google, I duckduckgoed) on salt lake art, and discovered this is the Tree of Utah.\n","date":"September 11, 2023","externalUrl":null,"permalink":"/blog/travel/utah/saltlakedesert/treeofutah/","section":"Blog","summary":"While driving through the Salt Lake Desert, I saw this thing in the middle of nowhere, along I80.\nI did a web search (I didn’t google, I duckduckgoed) on salt lake art, and discovered this is the Tree of Utah.\n","title":"The Tree of Utah","type":"blog"},{"content":"I have an easy neighborhood walk to Oh Mai Sandwich Kitchen but only on my last trek did I notice the street art out front.\n","date":"September 6, 2023","externalUrl":null,"permalink":"/blog/travel/utah/southsaltlake/ohmystreetart/","section":"Blog","summary":"I have an easy neighborhood walk to Oh Mai Sandwich Kitchen but only on my last trek did I notice the street art out front.\n","title":"Oh Mai Street Art","type":"blog"},{"content":"","date":"September 1, 2023","externalUrl":null,"permalink":"/tags/privacy/","section":"Tags","summary":"","title":"Privacy","type":"tags"},{"content":"I don\u0026rsquo;t agree with every single position the ACLU takes but I feel they do good and important work, so I sent them a small donation a while back, only to have them spend all of it on postage requesting more donations.\nBut I got a bunch of junk mail from other organizations too, so they still made money by selling my information, notwithstanding their scolding of corporations for opt-out sharing of consumer data.\nI know this because I read their lengthy privacy statement which talks about how they diligently protect your data, and by protect they mean give/sell/exchange it way. A couple of snippets from the weaselese:\nWhen we participate in data cooperatives, we may share your personal information, including contact and interaction information — for example, donation history — with data cooperative vendors\nTo grow our base of donors, ACLU may share your contact information with other nonpartisan organizations, either on a rental basis (i.e., for a monetary fee) and/or in exchange for a similar supporter list\nBut no problem, if you want to opt out, you can fill out a form!\n","date":"September 1, 2023","externalUrl":null,"permalink":"/blog/politics/aclu/","section":"Blog","summary":"I don’t agree with every single position the ACLU takes but I feel they do good and important work, so I sent them a small donation a while back, only to have them spend all of it on postage requesting more donations.\n","title":"The ACLU Lack of Privacy Statement","type":"blog"},{"content":"","date":"August 25, 2023","externalUrl":null,"permalink":"/tags/apartment/","section":"Tags","summary":"","title":"Apartment","type":"tags"},{"content":"","date":"August 25, 2023","externalUrl":null,"permalink":"/categories/finance/","section":"Categories","summary":"","title":"Finance","type":"categories"},{"content":"The latest in the series of predatory product offers for renters who are hard up, promoted by my apartment complex:\nWe are providing a new perk available to our residents through a company called Flex. This program allows you to split your rent into two payments without any late charges. We are excited to get you more information as we roll out this new initiative. Please see the attached files for more information.\nThe attached brochures are enticing, pay half your rent when it\u0026rsquo;s due and Flex pays the rest, you repay Flex later in the month. Nowhere does it mention what\u0026rsquo;s the catch. There\u0026rsquo;s a fee, of course, not mentioned in the brochures. At first I couldn\u0026rsquo;t find it on their website, not even in the FAQ (RentPlus did mention a fee in the middle of the FAQ, as if that wouldn\u0026rsquo;t be naturally be the first question asked), without digging into their Terms of Service (\u0026ldquo;now where would I put info that I don\u0026rsquo;t want anyone to find?\u0026rsquo;). Now I see it does show up in an example figure of monthly payments, but it feels like they just snuck it in there as minimal disclosure (there\u0026rsquo;s a more prominent diclosure on debit card fees).\nAnyway, I\u0026rsquo;ll save you the search, it\u0026rsquo;s $15/month, so basically it\u0026rsquo;s high interest credit - that\u0026rsquo;s $15 to postpone paying half your rent by a few weeks. I suspect, as with the previous offer RentPlus, part of their business model relies on the first few payments from customers who took a while t notice the surprise fee.\n","date":"August 25, 2023","externalUrl":null,"permalink":"/blog/scam/flex/","section":"Blog","summary":"The latest in the series of predatory product offers for renters who are hard up, promoted by my apartment complex:\nWe are providing a new perk available to our residents through a company called Flex. This program allows you to split your rent into two payments without any late charges. We are excited to get you more information as we roll out this new initiative. Please see the attached files for more information.\n","title":"Flex","type":"blog"},{"content":"","date":"August 25, 2023","externalUrl":null,"permalink":"/categories/scam/","section":"Categories","summary":"","title":"Scam","type":"categories"},{"content":"","date":"August 24, 2023","externalUrl":null,"permalink":"/tags/ali-wong/","section":"Tags","summary":"","title":"Ali Wong","type":"tags"},{"content":"","date":"August 24, 2023","externalUrl":null,"permalink":"/tags/noodles/","section":"Tags","summary":"","title":"Noodles","type":"tags"},{"content":"The Salt Lake area doesn\u0026rsquo;t have the breadth of Chinese restaurants that Vegas has, but there\u0026rsquo;s one place that I\u0026rsquo;ll miss if I leave, and that\u0026rsquo;s One More Noodle House in the Chinatown Supermarket plaza.\nThey specialize in homemade noodles, but an impressive variety.\nI think it\u0026rsquo;ll take me at least a year to get through all that. And everything I\u0026rsquo;ve tried is good - the noodles have great texture and flavor. You can\u0026rsquo;t go wrong with the dan dan noodles, and I really like the oil-tossed noodles. I get the eggplant noodles with tofu or pork if I want to eat healthy.\nI\u0026rsquo;ve seen the menu described as \u0026ldquo;fusion\u0026rdquo; but as far as I can tell these are basically classic dishes (which I\u0026rsquo;m learning about for my Talk Dim Sum as I try each one).\nBut don\u0026rsquo;t take my work for it, check out the rave review by Ali Wong displayed on their wall.\n","date":"August 24, 2023","externalUrl":null,"permalink":"/blog/travel/utah/southsaltlake/onemorenoodlehouse/","section":"Blog","summary":"The Salt Lake area doesn’t have the breadth of Chinese restaurants that Vegas has, but there’s one place that I’ll miss if I leave, and that’s One More Noodle House in the Chinatown Supermarket plaza.\n","title":"One More Noodle House","type":"blog"},{"content":"","date":"August 17, 2023","externalUrl":null,"permalink":"/tags/boxing/","section":"Tags","summary":"","title":"Boxing","type":"tags"},{"content":"A nice thing about Salt Lake City is neighborhoods (coming from a city that is somewhat neighborhood-deprived). Once nice neighborhood I found somewhat accidentally but now visit on a regularly is Sugar House. It has undergone a recent gentrification, with new buildings sporting a fake historical look housing a Whole Foods, Barnes and Noble, and Panda Express, but still, it is a nice walkable area and has an indie bookstore, Central Book Exchange.\nI like to pick up a book there and then cross the street to hang out at Tea Zaanti and have some tea while I do some reading.\nOn my most recent visit I passed by this cool boxing gym called Boxing is For Girls.\n","date":"August 17, 2023","externalUrl":null,"permalink":"/blog/travel/utah/slc/sugarhouse/","section":"Blog","summary":"A nice thing about Salt Lake City is neighborhoods (coming from a city that is somewhat neighborhood-deprived). Once nice neighborhood I found somewhat accidentally but now visit on a regularly is Sugar House. It has undergone a recent gentrification, with new buildings sporting a fake historical look housing a Whole Foods, Barnes and Noble, and Panda Express, but still, it is a nice walkable area and has an indie bookstore, Central Book Exchange.\n","title":"Sugar House","type":"blog"},{"content":"","date":"August 17, 2023","externalUrl":null,"permalink":"/tags/tea/","section":"Tags","summary":"","title":"Tea","type":"tags"},{"content":"","date":"August 16, 2023","externalUrl":null,"permalink":"/tags/apartments/","section":"Tags","summary":"","title":"Apartments","type":"tags"},{"content":"I was about to leave a one-star review on apartments.com for an apartment complex that ripped me off, and I was not alone as someone beat me to it, yet somehow the final rating is 4.9 out of 5, even though the average review rating is 1.0 (and would have been reinforced if my review submission hadn\u0026rsquo;t errored out).\nSupposedly, they have a \u0026ldquo;blended\u0026rdquo; rating system that incorporates other aspects of the property.\nLike maybe having doors gets you an automatic two stars at least? I suspect one of those unlisted aspects is some kind of kickback from the property (similar to how some restaurant owners have told me Yelp will call up to push their business membership and hint \u0026ldquo;nice reviews you got there, shame if something would happen to them\u0026rdquo;).\nIt also reminds me of how LinkedIn recruiter spam was accompanied by five-star ratings, which if you dug into the fine print, just indicated that some people replied to that spam.\nI\u0026rsquo;m guessing my review submission didn\u0026rsquo;t error out due to technical problems.\n","date":"August 16, 2023","externalUrl":null,"permalink":"/blog/social/apartments/","section":"Blog","summary":"I was about to leave a one-star review on apartments.com for an apartment complex that ripped me off, and I was not alone as someone beat me to it, yet somehow the final rating is 4.9 out of 5, even though the average review rating is 1.0 (and would have been reinforced if my review submission hadn’t errored out).\n","title":"Blended Ratings","type":"blog"},{"content":"","date":"August 16, 2023","externalUrl":null,"permalink":"/tags/linkedin/","section":"Tags","summary":"","title":"LinkedIn","type":"tags"},{"content":"","date":"August 16, 2023","externalUrl":null,"permalink":"/tags/ratings/","section":"Tags","summary":"","title":"Ratings","type":"tags"},{"content":"","date":"August 16, 2023","externalUrl":null,"permalink":"/tags/yelp/","section":"Tags","summary":"","title":"Yelp","type":"tags"},{"content":"","date":"August 7, 2023","externalUrl":null,"permalink":"/tags/lisp/","section":"Tags","summary":"","title":"Lisp","type":"tags"},{"content":"","date":"August 7, 2023","externalUrl":null,"permalink":"/tags/scheme/","section":"Tags","summary":"","title":"Scheme","type":"tags"},{"content":"The Talk Dim Sum dishes are now viewable on talkdimsum.com, with some scripting in Lisp to convert the JSON data to markdown files for Hugo. It\u0026rsquo;s a breeze with Gauche Scheme\u0026rsquo;s JSON and regexp support. It doesn\u0026rsquo;t have all the other data, like the phrases and restaurant lists, and if you want to hear or practice saying the words, you\u0026rsquo;ll still need the app.\n","date":"August 7, 2023","externalUrl":null,"permalink":"/blog/app/talkdimsum/ontheweb/","section":"Blog","summary":"The Talk Dim Sum dishes are now viewable on talkdimsum.com, with some scripting in Lisp to convert the JSON data to markdown files for Hugo. It’s a breeze with Gauche Scheme’s JSON and regexp support. It doesn’t have all the other data, like the phrases and restaurant lists, and if you want to hear or practice saying the words, you’ll still need the app.\n","title":"Talk Dim Sum on the Web","type":"blog"},{"content":"Say Utah and Mormons come to mind, but there are a number of Hindu temples in Salt Lake City and a big one south of the city in Spanish Fork, featuring a gift shop, restaurant, llamas, and birds wandering around. It\u0026rsquo;s worth a turn-off as you pass by on the interstate.\n","date":"August 4, 2023","externalUrl":null,"permalink":"/blog/travel/utah/krishna/","section":"Blog","summary":"Say Utah and Mormons come to mind, but there are a number of Hindu temples in Salt Lake City and a big one south of the city in Spanish Fork, featuring a gift shop, restaurant, llamas, and birds wandering around. It’s worth a turn-off as you pass by on the interstate.\n","title":"Birds and LLamas","type":"blog"},{"content":"","date":"August 4, 2023","externalUrl":null,"permalink":"/tags/hindu/","section":"Tags","summary":"","title":"Hindu","type":"tags"},{"content":"I\u0026rsquo;m watching the lovely kdrama My Liberation Notes, from the writer of one of my favorites, My Ajusshi. My Liberation Notes is a slow, moody show, even more than My Ajusshi. My favorite part is the Liberation Club, a group of introverts pressured by HR to join a club and socialize with their coworkers. I can relate. So they enact that old joke about a club of introverts and actually form one.\n","date":"July 21, 2023","externalUrl":null,"permalink":"/blog/tv/kdrama/liberationnotes/","section":"Blog","summary":"I’m watching the lovely kdrama My Liberation Notes, from the writer of one of my favorites, My Ajusshi. My Liberation Notes is a slow, moody show, even more than My Ajusshi. My favorite part is the Liberation Club, a group of introverts pressured by HR to join a club and socialize with their coworkers. I can relate. So they enact that old joke about a club of introverts and actually form one.\n","title":"My Liberation Notes","type":"blog"},{"content":"","date":"July 21, 2023","externalUrl":null,"permalink":"/categories/tv/","section":"Categories","summary":"","title":"TV","type":"categories"},{"content":"","date":"July 18, 2023","externalUrl":null,"permalink":"/categories/climate-change/","section":"Categories","summary":"","title":"Climate Change","type":"categories"},{"content":"","date":"July 18, 2023","externalUrl":null,"permalink":"/tags/death-valley/","section":"Tags","summary":"","title":"Death Valley","type":"tags"},{"content":"I was thinking I\u0026rsquo;m glad not to be in Las Vegas this week, it\u0026rsquo;s like Death Valley out there! Then I looked at the temp in Death Valley.\n","date":"July 18, 2023","externalUrl":null,"permalink":"/blog/travel/nevada/vegas/heat/","section":"Blog","summary":"I was thinking I’m glad not to be in Las Vegas this week, it’s like Death Valley out there! Then I looked at the temp in Death Valley.\n","title":"Heat","type":"blog"},{"content":"","date":"July 18, 2023","externalUrl":null,"permalink":"/tags/vegas/","section":"Tags","summary":"","title":"Vegas","type":"tags"},{"content":"","date":"July 16, 2023","externalUrl":null,"permalink":"/tags/las-vegas/","section":"Tags","summary":"","title":"Las Vegas","type":"tags"},{"content":"","date":"July 16, 2023","externalUrl":null,"permalink":"/categories/tech/","section":"Categories","summary":"","title":"Tech","type":"categories"},{"content":"One thing that surprised me in Salt Lake City is the ubiquity of fiber. Every apartment I looked at had fiber connections (and made them a mandatory add-on part of the lease, so keep that in mind when you\u0026rsquo;re checking out the rents here).\nIn Las Vegas, on the other hand, I only saw fiber listed at one high-end ($2000/month or more) apartment. The clubhouse wifi at my last apartment there was so bad that I was better off using mobile hotspot and going to the cat cafe for their wifi. My condo building in downtown Vegas was wired for fiber, but I didn\u0026rsquo;t find out for three years because the sales office apparently didn\u0026rsquo;t think that was a feature worth advertising (and neither did my real estate agent when I tried to sell it).\nInternet performance is just one aspect of the Vegas tech problem. When I got that condo, it seemed there was a budding tech scene downhtown: a bootcamp that held regular talks, including one by Nolan Bushnell, a University of Phoenix VR center, a WeWork-style coworking building, and a self-driving bus that circled the block around Container Park.\nFive years later, the coworking building is shuttered, the VR center is a small tech incubator, the bootcamp is now a design firm, and the self-driving bus is gone (it didn\u0026rsquo;t work that well, anyway - jaywalking is a huge problem in Vegas, so the bus stopped every few feet).\nOf course, the pandemic happened, but I think that was a lost opportunity. If you\u0026rsquo;re going to work remotely, you could make a pitch to move to Vegas for the same reasons I did - low cost living, affordable real estate, 24hr lifestyle support (for those time-shifted and time-crunched programmers), and a short flight from California.\nBut nope, the closest they got to bringing in some Silicon Valley is giving Elon Musk a license to build Tesla tunnels.\n","date":"July 16, 2023","externalUrl":null,"permalink":"/blog/travel/nevada/vegas/tech/","section":"Blog","summary":"One thing that surprised me in Salt Lake City is the ubiquity of fiber. Every apartment I looked at had fiber connections (and made them a mandatory add-on part of the lease, so keep that in mind when you’re checking out the rents here).\n","title":"Techless Vegas","type":"blog"},{"content":"","date":"July 15, 2023","externalUrl":null,"permalink":"/tags/booktore/","section":"Tags","summary":"","title":"Booktore","type":"tags"},{"content":"The Salt Lake City area has proven to be an unexpected bounty of bookstores. One that I found accidently while exploring the Sugar House area is Central Book Exchange.\n","date":"July 15, 2023","externalUrl":null,"permalink":"/blog/book/stores/centralbookexchange/","section":"Blog","summary":"The Salt Lake City area has proven to be an unexpected bounty of bookstores. One that I found accidently while exploring the Sugar House area is Central Book Exchange.\n","title":"Central Book Exchange","type":"blog"},{"content":"","date":"July 14, 2023","externalUrl":null,"permalink":"/tags/chinese-food/","section":"Tags","summary":"","title":"Chinese Food","type":"tags"},{"content":"I\u0026rsquo;ve updated this list of Chinese food cookbooks (or recipe books - one of them is about boba drinks) that I recommend in my Talk Dim Sum app with a couple of new ones that I really like: My Shanghai and The Woks of Life Cookbook.\nThe Dim Sum Field Guide is an extensive illustrated collection of dim sum, and A Little Tea Book discusses varieties of tea (not just Chinese) and tips on tea preparation. Fuchsia Dunlop has written on various regional Chinese cuisines.\nMy favorites are cookbook/recipe/memoirs written with an Asian-American perspective, including The Boba Book, Mr. Jiu\u0026rsquo;s in Chinatown, The Mission Chinese Cookbook, Chinese Soul Food, books by Grace Young, The Nom Wah Cookbook, The Woks of Life Cookbook, My Shanghai, and Xi\u0026rsquo;an Famous Foods.\nFor kids, there\u0026rsquo;s Dim Sum for Everyone!, Luna\u0026rsquo;s Yum Yum Dim Sum (also an intro to math concepts and the Chinese zodiac), the Let\u0026rsquo;s Go Yum Cha series, Yum Yum Dim Sum, and Welcome to Chinatown (no dim sum, but some food words and a nice intro to Chinatown).\n","date":"July 14, 2023","externalUrl":null,"permalink":"/blog/book/reviews/dimsum/","section":"Blog","summary":"I’ve updated this list of Chinese food cookbooks (or recipe books - one of them is about boba drinks) that I recommend in my Talk Dim Sum app with a couple of new ones that I really like: My Shanghai and The Woks of Life Cookbook.\n","title":"Dim Sum Books","type":"blog"},{"content":"","date":"July 14, 2023","externalUrl":null,"permalink":"/categories/review/","section":"Categories","summary":"","title":"Review","type":"categories"},{"content":"","date":"July 12, 2023","externalUrl":null,"permalink":"/tags/beatty/","section":"Tags","summary":"","title":"Beatty","type":"tags"},{"content":"","date":"July 12, 2023","externalUrl":null,"permalink":"/tags/burro/","section":"Tags","summary":"","title":"Burro","type":"tags"},{"content":"The wide open spaces of Nevada are not the most visually exciting (like the white sands of New Mexico), but there are surprises, like this herd of wild burros hanging out in the big rig parking lot across the two-lane highway from a casino in Beatty. It\u0026rsquo;s a pretty small casino, but it has a nightclub, so I guess Beatty isn\u0026rsquo;t too boring.\n","date":"July 12, 2023","externalUrl":null,"permalink":"/blog/travel/nevada/beatty/burros/","section":"Blog","summary":"The wide open spaces of Nevada are not the most visually exciting (like the white sands of New Mexico), but there are surprises, like this herd of wild burros hanging out in the big rig parking lot across the two-lane highway from a casino in Beatty. It’s a pretty small casino, but it has a nightclub, so I guess Beatty isn’t too boring.\n","title":"Burros in Beatty","type":"blog"},{"content":"","date":"July 12, 2023","externalUrl":null,"permalink":"/tags/casino/","section":"Tags","summary":"","title":"Casino","type":"tags"},{"content":"","date":"July 12, 2023","externalUrl":null,"permalink":"/tags/nevada/","section":"Tags","summary":"","title":"Nevada","type":"tags"},{"content":"","date":"July 9, 2023","externalUrl":null,"permalink":"/tags/art/","section":"Tags","summary":"","title":"Art","type":"tags"},{"content":"","date":"July 9, 2023","externalUrl":null,"permalink":"/tags/cars/","section":"Tags","summary":"","title":"Cars","type":"tags"},{"content":"","date":"July 9, 2023","externalUrl":null,"permalink":"/tags/goldfield/","section":"Tags","summary":"","title":"Goldfield","type":"tags"},{"content":"On my latest visit to Vegas I decided to loop back up I95 so I can visit the International Car Forest of the Last Church in Goldfield. While I was there someone drove up and told me the artist is a 90-year old woman who single-handedly \u0026ldquo;plants\u0026rdquo; these cars.\n","date":"July 9, 2023","externalUrl":null,"permalink":"/blog/travel/nevada/goldfield/carforest/","section":"Blog","summary":"On my latest visit to Vegas I decided to loop back up I95 so I can visit the International Car Forest of the Last Church in Goldfield. While I was there someone drove up and told me the artist is a 90-year old woman who single-handedly “plants” these cars.\n","title":"The International Car Forest of the Last Church","type":"blog"},{"content":"When I go on road trips I search google maps for coffee shops on the way. That\u0026rsquo;s my idea of a rest area. Between Las Vegas and Salt Lake City the pickings are slim, but there are some at strategic locations, such as Haven Coffee in Nephi (otherwise known for rodeos). It\u0026rsquo;s a charming spot with a deck overlooking a water wheel and next to a park. I try to stop there on every trip up and down the state.\n","date":"July 5, 2023","externalUrl":null,"permalink":"/blog/coffeeshop/haven/","section":"Blog","summary":"When I go on road trips I search google maps for coffee shops on the way. That’s my idea of a rest area. Between Las Vegas and Salt Lake City the pickings are slim, but there are some at strategic locations, such as Haven Coffee in Nephi (otherwise known for rodeos). It’s a charming spot with a deck overlooking a water wheel and next to a park. I try to stop there on every trip up and down the state.\n","title":"Haven Coffee","type":"blog"},{"content":"","date":"July 4, 2023","externalUrl":null,"permalink":"/tags/robocall/","section":"Tags","summary":"","title":"Robocall","type":"tags"},{"content":"Bots don\u0026rsquo;t take holidays, so on this July Fourth I got a robocall from Vitalant, which oddly was followed by a customer satisfaction survey. I was giving blood on a regular basis for a while, mostly at participating comic cons, but then there was some kind of reorg under the Vitalant brand and I started receiving calls to donate (from out of state), then a pause after I asked them to remove me from the list, then another batch offering Amazon gift cards (the worst kind of gift card if you dislike Amazon), and most recently an offer of a free cooler, reminiscent of the junk mail I get to sign up with the AARP.\nIt seems a worthy cause has been taken over by dot com marketing types, and not the most competent ones.\n","date":"July 4, 2023","externalUrl":null,"permalink":"/blog/spam/vitalant/","section":"Blog","summary":"Bots don’t take holidays, so on this July Fourth I got a robocall from Vitalant, which oddly was followed by a customer satisfaction survey. I was giving blood on a regular basis for a while, mostly at participating comic cons, but then there was some kind of reorg under the Vitalant brand and I started receiving calls to donate (from out of state), then a pause after I asked them to remove me from the list, then another batch offering Amazon gift cards (the worst kind of gift card if you dislike Amazon), and most recently an offer of a free cooler, reminiscent of the junk mail I get to sign up with the AARP.\n","title":"The Vitalant Bot","type":"blog"},{"content":"","date":"July 4, 2023","externalUrl":null,"permalink":"/tags/vitalant/","section":"Tags","summary":"","title":"Vitalant","type":"tags"},{"content":"","date":"July 3, 2023","externalUrl":null,"permalink":"/tags/comics/","section":"Tags","summary":"","title":"Comics","type":"tags"},{"content":"I really like living near a bookstore, although it\u0026rsquo;s not so great for my wallet. I\u0026rsquo;ve mentioned some of the cool bookstores in the Salt Lake City area such as Legendarium, but my current neighborhood money sink is Marissa\u0026rsquo;s Books, which is about a mile away. So, close enough to walk to and conveniently catty corner to a nice coffee shop where I can read my latest haul.\nThe outdoor looks like a repurposed auto repair garage. Indoors, it\u0026rsquo;s something else.\n","date":"July 3, 2023","externalUrl":null,"permalink":"/blog/book/stores/marissas/","section":"Blog","summary":"I really like living near a bookstore, although it’s not so great for my wallet. I’ve mentioned some of the cool bookstores in the Salt Lake City area such as Legendarium, but my current neighborhood money sink is Marissa’s Books, which is about a mile away. So, close enough to walk to and conveniently catty corner to a nice coffee shop where I can read my latest haul.\n","title":"Marissa's Books","type":"blog"},{"content":"","date":"July 3, 2023","externalUrl":null,"permalink":"/tags/scifi/","section":"Tags","summary":"","title":"Scifi","type":"tags"},{"content":"It\u0026rsquo;s not just big tech, everyone\u0026rsquo;s selling your info. Like apartments, I don\u0026rsquo;t see why I have to pay rent when moving and cleaning companies are giving them kickbacks. This being rent day at my new apartment, I just noticed after staring closely at the rent itemization that I\u0026rsquo;m getting charged monthly for RentPlus which I apparently was automatically signed up for in my lease.\nI did get this nice follow up email that doesn\u0026rsquo;t mention I\u0026rsquo;m getting charged $9/month to improve my credit score which was already over 800, otherwise I would have clicked on the cancel link which doesn\u0026rsquo;t work. My online account has no mention of the charge, either (although it does have a barely working cancel link). I am skeptical about that 95% favorability claim. I wouldn\u0026rsquo;t refer a friend, but I might refer an enemy.\nWe are excited to welcome you to RentPlus! We are sure you are going to love it. In fact, 95% of RentPlus members would refer a friend.\nSit back and relax, because all you have to do is pay your rent and we will report your monthly payments to the credit bureaus.\nInside the RentPlus app, you will be able to see your reporting history, manage your subscription, and take control of your finances with our award-winning financial management and education tools!\nAccess your RentPlus account below, and let RentPlus make a positive difference to your credit and your financial future. If you no longer want RentPlus, you can cancel your membership by clicking here.\n","date":"July 2, 2023","externalUrl":null,"permalink":"/blog/scam/rentplus/","section":"Blog","summary":"It’s not just big tech, everyone’s selling your info. Like apartments, I don’t see why I have to pay rent when moving and cleaning companies are giving them kickbacks. This being rent day at my new apartment, I just noticed after staring closely at the rent itemization that I’m getting charged monthly for RentPlus which I apparently was automatically signed up for in my lease.\n","title":"RentPlus Is a Minus","type":"blog"},{"content":"","date":"July 1, 2023","externalUrl":null,"permalink":"/tags/gas/","section":"Tags","summary":"","title":"Gas","type":"tags"},{"content":"One thing I noticed when driving across the border from Nevada to Utah (besides the sudden predominance of white people when you arrive in St. George) is the change in octane offerings at the fuel pump.\nI checked my car manual to reaffirm that 87 is the lowest recommendated octane for my car (a 2015 Honda Civic). Turns out 85 is a holdover for old cars (i.e. with carburetors) running at high altitude, so it\u0026rsquo;s still available in mountain states with old cars and low budgets.\n","date":"July 1, 2023","externalUrl":null,"permalink":"/blog/travel/utah/octane/","section":"Blog","summary":"One thing I noticed when driving across the border from Nevada to Utah (besides the sudden predominance of white people when you arrive in St. George) is the change in octane offerings at the fuel pump.\n","title":"Low Octane","type":"blog"},{"content":"","date":"July 1, 2023","externalUrl":null,"permalink":"/tags/octane/","section":"Tags","summary":"","title":"Octane","type":"tags"},{"content":"On Mastodon you don\u0026rsquo;t need to pay for your verification links, just make sure the sites you link to have a reciprocal backlink with rel=\u0026ldquo;me\u0026rdquo; included, as described in the Mastodon doc.\nSome platforms, e.g. GitHub and my Hugo sites using the Blowfish theme, even recognize Mastodon profile links and will augment them automatically.\nI had to augment the backlink manually in my JSON-generated resume.\n\u0026lt;a href=\u0026#34;https://universeodon.com/@technicat\u0026#34; rel=\u0026#34;me\u0026#34;\u0026gt;technicat\u0026lt;/a\u0026gt; Just remember to resave your profile after making the change to trigger the verification check.\n","date":"June 25, 2023","externalUrl":null,"permalink":"/blog/social/verified/","section":"Blog","summary":"On Mastodon you don’t need to pay for your verification links, just make sure the sites you link to have a reciprocal backlink with rel=“me” included, as described in the Mastodon doc.\n","title":"Get Your Free Verification Links","type":"blog"},{"content":"","date":"June 25, 2023","externalUrl":null,"permalink":"/tags/github/","section":"Tags","summary":"","title":"Github","type":"tags"},{"content":"","date":"June 25, 2023","externalUrl":null,"permalink":"/tags/hugo/","section":"Tags","summary":"","title":"Hugo","type":"tags"},{"content":"","date":"June 15, 2023","externalUrl":null,"permalink":"/tags/reddit/","section":"Tags","summary":"","title":"Reddit","type":"tags"},{"content":"While Steve Huffman expounds on the need to get paid, he\u0026rsquo;s not so enthusiastic about doing the paying, you know, being in the parasitic content harvesting business, as explained at length in the Reddit user agreement.\nWhen Your Content is created with or submitted to the Services, you grant us a worldwide, royalty-free, perpetual, irrevocable, non-exclusive, transferable, and sublicensable license to use, copy, modify, adapt, prepare derivative works of, distribute, store, perform, and display Your Content and any name, username, voice, or likeness provided in connection with Your Content in all media formats and channels now known or later developed anywhere in the world. This license includes the right for us to make Your Content available for syndication, broadcast, distribution, or publication by other companies, organizations, or individuals who partner with Reddit. You also agree that we may remove metadata associated with Your Content, and you irrevocably waive any claims and assertions of moral rights or attribution with respect to Your Content.\n","date":"June 15, 2023","externalUrl":null,"permalink":"/blog/social/reddit/","section":"Blog","summary":"While Steve Huffman expounds on the need to get paid, he’s not so enthusiastic about doing the paying, you know, being in the parasitic content harvesting business, as explained at length in the Reddit user agreement.\n","title":"Reddit Doesn't Pay For It","type":"blog"},{"content":"","date":"June 14, 2023","externalUrl":null,"permalink":"/tags/pride/","section":"Tags","summary":"","title":"Pride","type":"tags"},{"content":"I spent more time than I intended waiting in downtown Salt Lake City hotels for my apartment application to be approved (which I gave up on, but that\u0026rsquo;s another story\u0026hellip;). But on the plus side, I was around to see the weekend Pride festivities, starting with the Friday march that began with speeches at the state capitol building (when they list the march/parade start time, they really mean an hour after the speeches), then the march downhill. A warmup for the big parade on Sunday.\n","date":"June 14, 2023","externalUrl":null,"permalink":"/blog/politics/pride/","section":"Blog","summary":"I spent more time than I intended waiting in downtown Salt Lake City hotels for my apartment application to be approved (which I gave up on, but that’s another story…). But on the plus side, I was around to see the weekend Pride festivities, starting with the Friday march that began with speeches at the state capitol building (when they list the march/parade start time, they really mean an hour after the speeches), then the march downhill. A warmup for the big parade on Sunday.\n","title":"Pride March","type":"blog"},{"content":"I recently posted about Legendarium, a fantastic bookstore, cafe, and D\u0026amp;D LGBTQ+ safe space. Another one I just discovered, while walking to the Hong Kong Teahouse for dim sum on the west side of downtown Salt Lake City, is Under the Umbrella.\nThey have an excellent graphic novel selection.\nAnd, first time I\u0026rsquo;ve seen this in Utah, a mask requirement.\n","date":"June 4, 2023","externalUrl":null,"permalink":"/blog/book/stores/undertheumbrella/","section":"Blog","summary":"I recently posted about Legendarium, a fantastic bookstore, cafe, and D\u0026D LGBTQ+ safe space. Another one I just discovered, while walking to the Hong Kong Teahouse for dim sum on the west side of downtown Salt Lake City, is Under the Umbrella.\n","title":"Under the Umbrella","type":"blog"},{"content":"Looks like the Sacklers are not just getting away scot-free with pushing opioids, they\u0026rsquo;re free of lawsuits.\nThey\u0026rsquo;re not just responsible for ruining and ending lives of patients and addicts. A classmate of mine was one of their \u0026ldquo;high value target\u0026rdquo; physicians and ultimately committed suicide after surrendering her medical license.\n","date":"June 2, 2023","externalUrl":null,"permalink":"/blog/politics/malsky/","section":"Blog","summary":"Looks like the Sacklers are not just getting away scot-free with pushing opioids, they’re free of lawsuits.\nThey’re not just responsible for ruining and ending lives of patients and addicts. A classmate of mine was one of their “high value target” physicians and ultimately committed suicide after surrendering her medical license.\n","title":"The Sacklers Get Away With Murder","type":"blog"},{"content":"I was reacquainting myself with the Liberty Wells area of Salt Lake City, which includes some favorite spots from my last visit: Tinker\u0026rsquo;s Cat Cafe and The Tea Grotto, when I passed by Legendarium.\nAt first I thought it was a bar with a fancy name, but it turned out to be an awesome combination of comics, scifi, D\u0026amp;D, and coffee.\nOne clever device - scrabble tiles as signs.\nLove the whiteboard.\nAnd the toilet.\nIt\u0026rsquo;s a fairly new place. Check out the writeup.\n","date":"May 30, 2023","externalUrl":null,"permalink":"/blog/book/stores/legendarium/","section":"Blog","summary":"I was reacquainting myself with the Liberty Wells area of Salt Lake City, which includes some favorite spots from my last visit: Tinker’s Cat Cafe and The Tea Grotto, when I passed by Legendarium.\n","title":"Legendarium","type":"blog"},{"content":"This was an old blog that I dug up because I had to make a new launch screen and forgot how. The only change is the Object Library is not as easy to find, you have to click the + button at the top right of Xcode or use some keystrokes.\nLike a lot of things, the process of creating a launch screen for an iOS app has changed over time, and not necessarily for the simpler. Originally I had a launch screen image set in the Asset Catalog. Then I had an Interface Builder (.xib) file.\nNow I’m using storyboard files (don’t get excited — there’s no animation support). Among the New File choices there is now a Launch Screen option. That is actually a storyboard file you can use as the launch screen.\nOnce you select that, you will have a new storyboard file you can select as the launch screen source in the General tab.\nDespite Apple’s guideline that launch screens should look like a screen within your app, the default storyboard is a standard name-and-copyright presentation.\nI just want my launch screen to show my logo and nothing else, so I Command-Delete the text items and constraints, and create an image set containing my logo an Asset Catalog, with the images sized to fit within the screen (these are around 300pt, so 300/600/900px)\nNow I can find my logo in the Object Library (click the + button at the upper right) and drag it into the storyboard.\nTo center the image, I select the image in the hierarchy at left and then click on the Align option below the storyboard and select horizontal and vertical alignment.\nThe resulting constraints should show up like this, with the image view centered in its parent view.\nAnd that’s all there is to it, unless it doesn’t work. On occasion, I’ve seen this look fine and appear correctly when run in the Simulator but not show up on the device (this is one of those “not for the simpler” things). Apparently, it happens to other people, too.\nThe most recent occurrence (this morning), was resolved when I fixed an incorrectly sized app icon. But who knows if that was the real problem. Anyway, once it’s working, I’ll leave it alone until there’s a new way to do it. Or until I can animate it!\n","date":"May 28, 2023","externalUrl":null,"permalink":"/blog/app/launchstoryboard/","section":"Blog","summary":"This was an old blog that I dug up because I had to make a new launch screen and forgot how. The only change is the Object Library is not as easy to find, you have to click the + button at the top right of Xcode or use some keystrokes.\n","title":"Making a Launch Storyboard","type":"blog"},{"content":"","date":"May 28, 2023","externalUrl":null,"permalink":"/tags/xcode/","section":"Tags","summary":"","title":"Xcode","type":"tags"},{"content":"This being AAPI month, I think it\u0026rsquo;s a particularly good time to complain about how the media, and in this case my go-to new site NPR, focuses on white people (which is a bit disappointing since I know there are several accomplished Asian-American journalists on their staff, one of the benefits of it being radio).\nExhibit 1 is their placement of the British crowning ceremony as their top headline. When did they become the BBC? Anglophile is not a good look, especially with other news going on (a few hundred people drowned from a flood in the Congo, but you had to scroll waaaay down for that).\nAnd then, Exhibit 2, there\u0026rsquo;s Elizabeth Holmes who continues to get top billing (during her trial she consistently outranked Britney Griner who was actually in unjustly prison, a Russian prison). But you know, the media is a sucker for young attractive white woman in distress, and tech entrepreneur? That\u0026rsquo;s how she got all that money in the first place.\n","date":"May 17, 2023","externalUrl":null,"permalink":"/blog/media/npr/","section":"Blog","summary":"This being AAPI month, I think it’s a particularly good time to complain about how the media, and in this case my go-to new site NPR, focuses on white people (which is a bit disappointing since I know there are several accomplished Asian-American journalists on their staff, one of the benefits of it being radio).\n","title":"Blondes Have More Funding","type":"blog"},{"content":"","date":"May 17, 2023","externalUrl":null,"permalink":"/categories/diversity/","section":"Categories","summary":"","title":"Diversity","type":"categories"},{"content":"","date":"May 17, 2023","externalUrl":null,"permalink":"/categories/media/","section":"Categories","summary":"","title":"Media","type":"categories"},{"content":"As I see CNN reprising their role as Trump\u0026rsquo;s publicity firm, I wish I still had the screenshot I took during the previous presidential primaries of CNN devoting more than half of their election page to Trump.\nBut a random trip down the Wayback Machine to 2016, really, the first date I looked at, reaffirms my memory. CNN game Trump the first headline, the most headlines, the biggest headlines (including one titled Trump: Media King), and featured him in the most photos. I guess at CNN they call those the good old days.\n","date":"May 14, 2023","externalUrl":null,"permalink":"/blog/politics/cnn/","section":"Blog","summary":"As I see CNN reprising their role as Trump’s publicity firm, I wish I still had the screenshot I took during the previous presidential primaries of CNN devoting more than half of their election page to Trump.\n","title":"CNN's Clown Hall","type":"blog"},{"content":"","date":"May 14, 2023","externalUrl":null,"permalink":"/tags/election/","section":"Tags","summary":"","title":"Election","type":"tags"},{"content":"","date":"May 14, 2023","externalUrl":null,"permalink":"/tags/journalism/","section":"Tags","summary":"","title":"Journalism","type":"tags"},{"content":"","date":"May 5, 2023","externalUrl":null,"permalink":"/tags/asian/","section":"Tags","summary":"","title":"Asian","type":"tags"},{"content":"Las Vegas has a pretty good library system (in contrast to the Jersey City library in my neighborhood that said they wouldn\u0026rsquo;t take book donations - are they not even trying?).\nEven the small ones have interesting art and history exhibits, like this one I just saw in the Spring Valley branch on the legal history of Chinese-American women, which sounds dry until you see what they had to go through.\n","date":"May 5, 2023","externalUrl":null,"permalink":"/blog/racism/women/","section":"Blog","summary":"Las Vegas has a pretty good library system (in contrast to the Jersey City library in my neighborhood that said they wouldn’t take book donations - are they not even trying?).\n","title":"Herstory","type":"blog"},{"content":"","date":"May 5, 2023","externalUrl":null,"permalink":"/categories/racism/","section":"Categories","summary":"","title":"Racism","type":"categories"},{"content":"After twelve years in Chinatown (or as the locals know it, Spring Mountain Road), Big Wong is closing sometime in the next few weeks. I stopped by and got the t-shirt.\n","date":"April 27, 2023","externalUrl":null,"permalink":"/blog/travel/nevada/vegas/bigwong/","section":"Blog","summary":"After twelve years in Chinatown (or as the locals know it, Spring Mountain Road), Big Wong is closing sometime in the next few weeks. I stopped by and got the t-shirt.\n","title":"So Long, Big Wong","type":"blog"},{"content":"For the first time, as far as I can remember, I have no health insurance. I was coasting along, automatically renewing my ACA coverage during each open enrollment and having those exorbitant premiums covered by tax credits, until I decided to check go to my insurance provider\u0026rsquo;s website (\u0026ldquo;portal\u0026rdquo; is an overly grand term for these things and should be reserved for wormholes) and check the claim status of a recent eye appointment.\nTurns out the claim was denied, which sometimes happens if the provider screws up or if the insurer screws up, but what was surprising was the reason: my policy was cancelled a few months ago. Turns out I stopped getting tax credits, which I wasn\u0026rsquo;t notified about but could tell if I\u0026rsquo;d looked more carefully at my automatic renewal, and the insurer started billing me full price again, without notifying me or even sending me a bill, and then they cancelled my policy for non-payment of the first bill, again without notifying me. But I did find those invoices and cancellation on the \u0026ldquo;portal\u0026rdquo;, including the additional premiums they kept billing each month after the cancellation (make up your mind!).\nThe good news is that after calling the state ACA management, they reprocessed my application to get the tax credits back within a day, bad news is then they handed it off to Medicaid to check eligibility with them, and when that happened in the past they took so long that open enrollment expired and I had to go back to my old ways and get something off ehealthinsurance. So now I\u0026rsquo;m part of the walking uninsured, and if you\u0026rsquo;re shopping for health insurance, absolutely do not choose Friday Health Plans.\n","date":"April 26, 2023","externalUrl":null,"permalink":"/blog/personal/friday/","section":"Blog","summary":"For the first time, as far as I can remember, I have no health insurance. I was coasting along, automatically renewing my ACA coverage during each open enrollment and having those exorbitant premiums covered by tax credits, until I decided to check go to my insurance provider’s website (“portal” is an overly grand term for these things and should be reserved for wormholes) and check the claim status of a recent eye appointment.\n","title":"Bad Friday","type":"blog"},{"content":"","date":"April 26, 2023","externalUrl":null,"permalink":"/categories/health/","section":"Categories","summary":"","title":"Health","type":"categories"},{"content":"Now that I\u0026rsquo;ve been off twitter for a while (well before it\u0026rsquo;s current spiral into madness), Yahoo is my go-to cesspool of racist commentary. For example, a recent Yahoo \u0026ldquo;news\u0026rdquo; story recounting Ali Wong\u0026rsquo;s complaints about white people turning up their noses at dim sum (yes, it is obnoxious to tell your Chinese-American or Chinese- Canadian friends that Chinese food is disgusting, especially when you\u0026rsquo;re actually at the restaurant), engendered these puerile jokes from the Internet think tank.\nAnd that\u0026rsquo;s just a sample, although \u0026ldquo;Commenting on this article has ended\u0026rdquo;, so I guess they hit their quota of racist posts. I saw one one other reply was deleted for violating Yahoo\u0026rsquo;s \u0026ldquo;content policy\u0026rdquo;, which makes me wonder what you have to say to get deleted.\nAnd it\u0026rsquo;s not just the comments. I had to contact The Guardian to get their MMA sportswriter to stop calling a Chinese fighter \u0026ldquo;the Chinaman\u0026rdquo; in his Yahoo stories.\nWhat a bunch of yahoos.\n","date":"April 23, 2023","externalUrl":null,"permalink":"/blog/racism/yahoo/","section":"Blog","summary":"Now that I’ve been off twitter for a while (well before it’s current spiral into madness), Yahoo is my go-to cesspool of racist commentary. For example, a recent Yahoo “news” story recounting Ali Wong’s complaints about white people turning up their noses at dim sum (yes, it is obnoxious to tell your Chinese-American or Chinese- Canadian friends that Chinese food is disgusting, especially when you’re actually at the restaurant), engendered these puerile jokes from the Internet think tank.\n","title":"Bunch of Yahoos","type":"blog"},{"content":"I\u0026rsquo;m currently developing only apps for the App Store, but it\u0026rsquo;s not because I like developing for Apple. More like it\u0026rsquo;s their thumb I\u0026rsquo;ve chosen to be under.\nJust today I received this message for a couple of apps:\nSince this app hasn’t been updated within the last three years and doesn\u0026rsquo;t meet a minimum download threshold, it’s scheduled to be removed from the App Store in 90 days. We ask that you submit an app update as soon as possible.\nSo, get those downloads or get working!\n","date":"April 20, 2023","externalUrl":null,"permalink":"/blog/app/appleremoves/","section":"Blog","summary":"I’m currently developing only apps for the App Store, but it’s not because I like developing for Apple. More like it’s their thumb I’ve chosen to be under.\nJust today I received this message for a couple of apps:\n","title":"Apple Removes","type":"blog"},{"content":"From realtor.com\nBut once the listing has expired, this “means that your home is unrepresented and free game for other agents to contact you,” Sales says.\nThis explains why the vultures have been calling and texting for two weeks. What a terrible industry. Also, a sales agent named Sales?\n","date":"April 15, 2023","externalUrl":null,"permalink":"/blog/spam/realtorspam/","section":"Blog","summary":"From realtor.com\nBut once the listing has expired, this “means that your home is unrepresented and free game for other agents to contact you,” Sales says.\nThis explains why the vultures have been calling and texting for two weeks. What a terrible industry. Also, a sales agent named Sales?\n","title":"Realtor Spam","type":"blog"},{"content":"","date":"April 9, 2023","externalUrl":null,"permalink":"/categories/language/","section":"Categories","summary":"","title":"Language","type":"categories"},{"content":"Mastodon posts have a language property indicating what language is in. This is potentially useful for automatic translation and to allow followers to filter which languages they want to see in posts (this is also in the Mastodon API as part of the follow request).\nSo I put in a language menu.\nThe API spec says the language property is a two-character language identifier from ISO 639.1. So that\u0026rsquo;s what I started with, but after looking at the Mastodon source (and the Mastodon web interface), I realize now it\u0026rsquo;s actually ISO 639.1 minus Gaurani (gn) and Samoan (sm), and plus several three-letter codes from ISO 639.3, although some of those codes are so recent they\u0026rsquo;re not in Apple\u0026rsquo;s ISO list (too bad, because otherwise they provide localization of the display names).\nAnd too bad, Mastodon\u0026rsquo;t list doesn\u0026rsquo;t include Klingon.\n","date":"April 9, 2023","externalUrl":null,"permalink":"/blog/social/mastodonlanguages/","section":"Blog","summary":"Mastodon posts have a language property indicating what language is in. This is potentially useful for automatic translation and to allow followers to filter which languages they want to see in posts (this is also in the Mastodon API as part of the follow request).\n","title":"Mastodon Languages","type":"blog"},{"content":"","date":"March 24, 2023","externalUrl":null,"permalink":"/tags/fugu-games/","section":"Tags","summary":"","title":"Fugu Games","type":"tags"},{"content":"My first reaction at seeing Apple\u0026rsquo;s new bottom-of-the-barrel pricing options pricing options starting at $.29 (with increments of $.10 on up) is you\u0026rsquo;ve got to be kidding, what\u0026rsquo;s the point of pricing anything that cheap, but then I decided might as well republish some of my old Fugu Games.\nI\u0026rsquo;m not maintaing them anymore, some of them don\u0026rsquo;t run as well on the newer devices (which is kind of weird, you\u0026rsquo;d expect performance to increase at least, but 3D graphics is fragile). I let them free on the App Store for a while but then you get a bunch of crappy entitled reviews from people who act like they paid for it.\nSo for the arbitrarily low price of $.29 I can make them available and still filter out the random downloaders, and maybe make a quarter here and there (after Apple takes their cut).\nThat doesn\u0026rsquo;t solve the other reason I unpublished these games previously, which is that Apple doesn\u0026rsquo;t provide any control over the order apps are displayed in the App Store (nice feature in itch.io) and on an iPhone only the first three apps are immediately visible without (the non-obvious) horizontal scrolling. So I\u0026rsquo;ve already reunpublished one Fugu Games game just to get HyperBowl slide up back into the top three.\n","date":"March 24, 2023","externalUrl":null,"permalink":"/blog/app/fugugames/","section":"Blog","summary":"My first reaction at seeing Apple’s new bottom-of-the-barrel pricing options pricing options starting at $.29 (with increments of $.10 on up) is you’ve got to be kidding, what’s the point of pricing anything that cheap, but then I decided might as well republish some of my old Fugu Games.\n","title":"Fugu Games are Back on the App Store","type":"blog"},{"content":"Apple\u0026rsquo;s new pricing options include bottom of the barrel prices starting at $.29 and increments of $.10 from there. More exciting to me is the option for whole dollar amounts. No more of that $.99 nonsense!\nSo now you can have HyperBowl for a dollar and Talk Dim Sum for two dollars.\nBut I\u0026rsquo;ve noticed since that penny price raise, my sales have dropped. Gosh, you guys are cheap. Or maybe there\u0026rsquo;s some psychology thing here. I mean, there\u0026rsquo;s a 99 Cent Store. On the other, there\u0026rsquo;s also Dollar General. Anyway, maybe I\u0026rsquo;ll drop them back a penny at some point and see what happens.\n","date":"March 20, 2023","externalUrl":null,"permalink":"/blog/app/dollarpricing/","section":"Blog","summary":"Apple’s new pricing options include bottom of the barrel prices starting at $.29 and increments of $.10 from there. More exciting to me is the option for whole dollar amounts. No more of that $.99 nonsense!\n","title":"Dollar Pricing","type":"blog"},{"content":"","date":"March 14, 2023","externalUrl":null,"permalink":"/categories/holiday/","section":"Categories","summary":"","title":"Holiday","type":"categories"},{"content":"","date":"March 14, 2023","externalUrl":null,"permalink":"/tags/pi/","section":"Tags","summary":"","title":"Pi","type":"tags"},{"content":"Happy Pi Day! This day brings back to my high school days during which I found a library book explaining ways to calculate pi and programmed a couple of them on an Apple II.\nDecades later, I tried that again in Processing (code is on GitHub), which looks nice visually:\nBut I like how the code looks in Gauche Scheme (code also on GitHub)\n(define (pi radius) (let f ((inside 0) (total 0)) (print (* 4.0 (/ inside (+ 0.000000001 total)))) (if (incircle? (random radius) (random radius) radius) (f (+ 1 inside) (+ 1 total)) (f inside (+ 1 total))))) (define (random range) (- (* (random-real) (+ range range)) range)) (define (incircle? x y radius) (\u0026lt; (+ (square x) (square y)) (square radius))) ","date":"March 14, 2023","externalUrl":null,"permalink":"/blog/holiday/piday/","section":"Blog","summary":"Happy Pi Day! This day brings back to my high school days during which I found a library book explaining ways to calculate pi and programmed a couple of them on an Apple II.\n","title":"Pi Day","type":"blog"},{"content":"","date":"March 14, 2023","externalUrl":null,"permalink":"/tags/processing/","section":"Tags","summary":"","title":"Processing","type":"tags"},{"content":"There isn\u0026rsquo;t really a strong business case for this, but I\u0026rsquo;m working on yet another Mastodon iOS app. I already found alsmot twenty (listed on GitHub), most of which are free, and half still actively updated.\nBut I want to get more familiar with the nuts and bolts of the Fediverse, and Mastodon in particular, and the best way to learn some software tech is to actually code something.\nPlus, I\u0026rsquo;m flitting among multiple Mastodon apps right now (most frequently Ice Cubes and Metatext), and I have my own ideas of what I\u0026rsquo;d like to in a Mastodon app, and more generally, in a social media app (I developed one for WordsEye several years ago and I was pretty happy with it, although it was pretty much abandonware once it hit the App Store).\nSome key ideas I want to implement:\nRound avatar icons. This is debatable, the most obvious objection I can think of is that not everyone uploads an avatar image intended to be rounded, but making avatar icons round means that it\u0026rsquo;s immediately obvious which graphics are avatars by the shape (assuming you\u0026rsquo;re not rounding any other graphics, and that would be weird). Show boost dates. Typically apps will just show the original post date, but then it\u0026rsquo;s confusing why your supposedly chronological feed is showing showing dates out of order. The argument against this is, of course, clutter, but I think this isn\u0026rsquo;t too bad. Encourage alt text. This means the interface for posting images should immediately present alt text entry (Metatext does this), and the feed should make the presence (and absense) of alt text obvious, and even better, immediately display it (it seems to me that would be better for accessibility, too). I have this prototyped, and I like it - there\u0026rsquo;s a lot of good alt text prose that people are missing out on reading. Easy to mute and block. I\u0026rsquo;m a big fan of filtering your own feed by blocking (and OK, muting, but I think that\u0026rsquo;s wimpy. I figure if someone\u0026rsquo;s blocking me, they\u0026rsquo;re doing both of us a favor). In some apps, maybe most, it can take some work to find those options, and some users may not even realize that\u0026rsquo;s an option. Also, it\u0026rsquo;s required by the Apple submission guidelines (as I discovered with the WordsEye app). I have more opinions, but I\u0026rsquo;ll wait until they\u0026rsquo;re implemented, so I have the option of changing my mind or pretending I never had those opinions.\n","date":"March 7, 2023","externalUrl":null,"permalink":"/blog/social/mymastodonapp/","section":"Blog","summary":"There isn’t really a strong business case for this, but I’m working on yet another Mastodon iOS app. I already found alsmot twenty (listed on GitHub), most of which are free, and half still actively updated.\n","title":"My Mastodon App","type":"blog"},{"content":"Social media is time-consuming enough, but with Mastodon there are a plethora of apps to try out. Most are free, one (Ivory) requires a subscription but offers a free tria, another (Toots) is paid.\nThey each have their quirks and features, so my favorite app is actually my favorite three: IceCubes for general usage, MetaText for alt-text entry and as a share target, and the official Mastodon app for profile editing.\nI put a survey list on GitHub.\n","date":"March 2, 2023","externalUrl":null,"permalink":"/blog/social/mastodapps/","section":"Blog","summary":"Social media is time-consuming enough, but with Mastodon there are a plethora of apps to try out. Most are free, one (Ivory) requires a subscription but offers a free tria, another (Toots) is paid.\n","title":"Mastodon Apps","type":"blog"},{"content":"Running my own Mastodon instance has reaffirmed that I\u0026rsquo;m not a server side engineer. It took me several reinstallations to get it running (including one after an overly aggressive upgrade), and even after that I had frequent SSL connection problems.\nAnd then there\u0026rsquo;s the maintenance, tracking all the linux security warnings, memory and disk usage, and watching the constant hacking attempts with consternation.\nFinally, I ran out of disk space (maybe from all those security patches), and rather than upgrade my server to a more expensive configuration, I decided to move to one of the big community instances, universodon.com (George Takei is there).\nAdmittedly, this is the reverse of the recommended progression, start off on a big server so you can learn the ropes and find people before moving on, but maybe this is better: I got the running-your-own-instance impulse out of my system, and now I can just socialize.\n","date":"February 27, 2023","externalUrl":null,"permalink":"/blog/social/movingmastodon/","section":"Blog","summary":"Running my own Mastodon instance has reaffirmed that I’m not a server side engineer. It took me several reinstallations to get it running (including one after an overly aggressive upgrade), and even after that I had frequent SSL connection problems.\n","title":"Moving Mastodon","type":"blog"},{"content":"","date":"February 26, 2023","externalUrl":null,"permalink":"/tags/chess/","section":"Tags","summary":"","title":"Chess","type":"tags"},{"content":"One of the cool things about Mastodon is the variety of apps, notwithstanding the occasional App Store blockage. Each is another point in design space, and each new entrant arrives with some feature I like, so now I\u0026rsquo;m rotating among four apps (I\u0026rsquo;ve started keeping track of them on Github).\nThe latest one is Mammoth, and it\u0026rsquo;s unique offering is built-in games. Which really makes no sense, but I found myself playing the chess game and after losing a few rounds, I\u0026rsquo;m about to hit the books and refresh myself on chess openings.\n","date":"February 26, 2023","externalUrl":null,"permalink":"/blog/app/mammoth/","section":"Blog","summary":"One of the cool things about Mastodon is the variety of apps, notwithstanding the occasional App Store blockage. Each is another point in design space, and each new entrant arrives with some feature I like, so now I’m rotating among four apps (I’ve started keeping track of them on Github).\n","title":"Mastodon Games","type":"blog"},{"content":"","date":"February 21, 2023","externalUrl":null,"permalink":"/tags/klingon/","section":"Tags","summary":"","title":"Klingon","type":"tags"},{"content":"While setting up a new app in Xcode, I noticed there\u0026rsquo;s a \u0026ldquo;more languages\u0026rdquo; submenu in the localization section. To my surprise, it includes Klingon (but I guess it shouldn\u0026rsquo;t be a surprise, as Klingon has an ISO code).\nAnd indeed, I was able to switched my iPhone to Klingon, but alas, there were no Klingon words in sight.\nOn the other hand, that means there\u0026rsquo;s an opportunity here. Be one of the few (or only?) Klingon-friendly apps!\n","date":"February 21, 2023","externalUrl":null,"permalink":"/blog/language/klingon/","section":"Blog","summary":"While setting up a new app in Xcode, I noticed there’s a “more languages” submenu in the localization section. To my surprise, it includes Klingon (but I guess it shouldn’t be a surprise, as Klingon has an ISO code).\n","title":"This Is America, Speak Klingon","type":"blog"},{"content":"Way back when I worked on a GameCube game, one of the trickier things was controlling the rumble feature on the controller. You had to start and stop the rumble and feed it a rumble signal for the type of rumble you wanted. Often if there was a bug the rumble would never stop.\nNow, after noticing some Mastodon iOS apps providing haptic feedback on some taps, e.g. favoriting a post, or even upon scrolling, I decided to try adding a little rumble when favoriting a dish in my Talk Dim Sum app.\nTurns out to be straightforward: create a UIImpactFeedbackGenerator with the type of rumble you want (ranging from light to heavy, or soft to rigid), and then call impactOccurred on it.\nThe class and method names are a bit clunky, so I created a little wrapper so that lets me call Rumble.lightly() and so forth.\npublic class Rumble { public static var light = UIImpactFeedbackGenerator(style: .light) public static func lightly() { light.impactOccurred() } } ","date":"February 15, 2023","externalUrl":null,"permalink":"/blog/programming/swift/rumble/","section":"Blog","summary":"Way back when I worked on a GameCube game, one of the trickier things was controlling the rumble feature on the controller. You had to start and stop the rumble and feed it a rumble signal for the type of rumble you wanted. Often if there was a bug the rumble would never stop.\n","title":"Ready to Rumble","type":"blog"},{"content":"phil, I\u0026rsquo;m so sorry to hear you decided to delete your Starbucks account. For Starbucks, our customers are always very valuable and I know that this is an important part of your Starbucks experience. Please be assured, I will address this request for you.\nBe advised that for record keeping purposes, we are unable to completely delete an account.\n","date":"February 10, 2023","externalUrl":null,"permalink":"/blog/coffeeshop/starbucks/","section":"Blog","summary":"phil, I’m so sorry to hear you decided to delete your Starbucks account. For Starbucks, our customers are always very valuable and I know that this is an important part of your Starbucks experience. Please be assured, I will address this request for you.\n","title":"A Starbucks Card Is Forever","type":"blog"},{"content":"","date":"February 4, 2023","externalUrl":null,"permalink":"/tags/calculator/","section":"Tags","summary":"","title":"Calculator","type":"tags"},{"content":"","date":"February 4, 2023","externalUrl":null,"permalink":"/tags/hp/","section":"Tags","summary":"","title":"HP","type":"tags"},{"content":"It\u0026rsquo;s that time of year again, tax time, which for me runs from the beginning of the year right up to tax time. And that\u0026rsquo;s when I dust off my trusty HP-15C scientific calculator, which among other nifty features can handle complex numbers, although really I just use it total up my app store sales.\nThis thing must be about 35 years old, as it was discontinued in 1989, so I must have purchased it in college or right after. I have a vague memory of losing my first calculator and then buying this one, maybe during my first job at Texas Instruments, but then wouldn\u0026rsquo;t I have purchased a TI calculator?\nIn any case, it\u0026rsquo;s nice to have real buttons.\n","date":"February 4, 2023","externalUrl":null,"permalink":"/blog/personal/hp15c/","section":"Blog","summary":"It’s that time of year again, tax time, which for me runs from the beginning of the year right up to tax time. And that’s when I dust off my trusty HP-15C scientific calculator, which among other nifty features can handle complex numbers, although really I just use it total up my app store sales.\n","title":"My HP-15C","type":"blog"},{"content":"I appreciate every complimentary review, but this App Store review for HyperBowl is special.\n","date":"February 1, 2023","externalUrl":null,"permalink":"/blog/app/hyperbowl/loveforever/","section":"Blog","summary":"I appreciate every complimentary review, but this App Store review for HyperBowl is special.\n","title":"Love Forever","type":"blog"},{"content":"Chinese New Year ends tomorrow, so here\u0026rsquo;s one more photo, of a pre-pandemic parade on Main St downtown Las Vegas.\n","date":"January 31, 2023","externalUrl":null,"permalink":"/blog/travel/nevada/vegas/chinesenewyear/","section":"Blog","summary":"Chinese New Year ends tomorrow, so here’s one more photo, of a pre-pandemic parade on Main St downtown Las Vegas.\n","title":"Still Chinese New Year","type":"blog"},{"content":"I wrote this a while ago but don\u0026rsquo;t remember when.\nI never see this on what-do-employees-want-from-their-workplace surveys, but aside from stock options and free lunch, I think employees really appreciate a good apology. Or maybe they just don’t realize what they’re missing. I’ve received few enough that I remember them vividly.\nThe first management apology I received was at my first job, where I received a tepid first salary review (I think the word “disappointed” was used), but later my boss said he made a wrong assessment. Admittedly, this was when he was trying to keep me from quitting. But I felt he was sincere.\nAnd it’s hard to give a good apology without being sincere. Insincere apologies tend to be about things beyond their control (“I’m sorry the business climate has been so tough” instead of “Sorry we didn’t pay you”) or even criticisms of others, like the group confessional we also had at my first job (a mother-lode of Dilbert source material), when we went around in a circle and “confessed” what we could do better, which was usually what we could have helped that other guy do better. I hear they also do this in North Korea.\nThe same goes for the apology’s junior partner, the admitted mistake. “I made a mistake by hiring the wrong people,” for example, is an efficient way to pass the buck, to everyone else. On the other hand, hearing, “Yeah, that was a bad idea,” gives me not just a feeling of vindication but also some hope that it won’t happen again. It can also get people off your back, like when one of my bosses said, “Alright, alright, I made a mistake, stop bringing it up.” I was gratified, but I really wasn’t trying to nag — when you’re recounting history, you don’t omit unpleasant parts (except in certain school textbooks).\nSome people are famous for never apologizing or admitting a mistake (and some professions discourage it), but it doesn’t have to be a big deal. Throw in a simple “You’re right” here and there, and work your way up. As with many things, admitting to mistakes or apologizing sooner and more frequently avoids bigger confessions later.\nBut as they say, apologies are better late than never. One former manager apologized to me and a coworker a few years later for not being a particularly good boss. He was looking for a job at the time, but it was nice to hear.\nNevertheless, I don’t really take apologies to indicate a change. One client apologized to me for being disrespectful the previous day in snapping “I don’t care, I just want it!”, and that’s a grade A apology — you rarely see an apology for behavior and using the word “disprectful”. But it’s not like he never threw a tantrum again.\nI just appreciate apologies in the same way as those employee achievement awards that don’t have any monetary value but look good on your LinkedIn profile. Actually, those LinkedIn recommendations would carry more weight if they were in the form of apologies, e.g. “We should have paid him more.” or “Our mistake for not promoting him.” You get the idea.\n","date":"January 30, 2023","externalUrl":null,"permalink":"/blog/management/apologize/","section":"Blog","summary":"I wrote this a while ago but don’t remember when.\nI never see this on what-do-employees-want-from-their-workplace surveys, but aside from stock options and free lunch, I think employees really appreciate a good apology. Or maybe they just don’t realize what they’re missing. I’ve received few enough that I remember them vividly.\n","title":"Apologize","type":"blog"},{"content":"","date":"January 30, 2023","externalUrl":null,"permalink":"/tags/apology/","section":"Tags","summary":"","title":"Apology","type":"tags"},{"content":"","date":"January 30, 2023","externalUrl":null,"permalink":"/categories/management/","section":"Categories","summary":"","title":"Management","type":"categories"},{"content":"An exasperating aspect of downtown Vegas is that the places I like to hang out at, coffee shops nd bookstores, close in the afternoon. But good news for me, in the past year The Writer\u0026rsquo;s Block has extended their hours (and by extension, their coffee shop hours), so I can go twilight book browsing, when it\u0026rsquo;s nice and quiet, like a library. A bonus is that I get to see the nighttime lighting trim around the building. It is Vegas, after all.\n","date":"January 29, 2023","externalUrl":null,"permalink":"/blog/book/stores/writersblock/","section":"Blog","summary":"An exasperating aspect of downtown Vegas is that the places I like to hang out at, coffee shops nd bookstores, close in the afternoon. But good news for me, in the past year The Writer’s Block has extended their hours (and by extension, their coffee shop hours), so I can go twilight book browsing, when it’s nice and quiet, like a library. A bonus is that I get to see the nighttime lighting trim around the building. It is Vegas, after all.\n","title":"The Writer's Block at Night","type":"blog"},{"content":"","date":"January 27, 2023","externalUrl":null,"permalink":"/tags/museum/","section":"Tags","summary":"","title":"Museum","type":"tags"},{"content":"If there was a time to visit outdoor museums it\u0026rsquo;s now, and the Neon Museum in Las Vegas fits the ball. In the daytime you don\u0026rsquo;t get the full effect of the signs that are still lit, but afternoons are also less crowded. The area is aptly called The Boneyard, with the skeletal remains of neon signs of yore, and I killed some time in the gift shop too, got myself a Frida Dreams mug. If you take the short unappealing stretch of walk back downtown, just before the freeway offramp and in front of a tire store is a local favorite taco stand, where I picked up a giant torta.\n","date":"January 27, 2023","externalUrl":null,"permalink":"/blog/travel/nevada/vegas/neon/","section":"Blog","summary":"If there was a time to visit outdoor museums it’s now, and the Neon Museum in Las Vegas fits the ball. In the daytime you don’t get the full effect of the signs that are still lit, but afternoons are also less crowded. The area is aptly called The Boneyard, with the skeletal remains of neon signs of yore, and I killed some time in the gift shop too, got myself a Frida Dreams mug. If you take the short unappealing stretch of walk back downtown, just before the freeway offramp and in front of a tire store is a local favorite taco stand, where I picked up a giant torta.\n","title":"The Neon Museum","type":"blog"},{"content":"My apps are in the top hundred of their respective App Store categories, still in the long tail revenue wise, but at least they\u0026rsquo;re looking good.\n","date":"January 24, 2023","externalUrl":null,"permalink":"/blog/app/longtail/","section":"Blog","summary":"My apps are in the top hundred of their respective App Store categories, still in the long tail revenue wise, but at least they’re looking good.\n","title":"In the Long Tail","type":"blog"},{"content":"It\u0026rsquo;s an unusally clear night, probably due to the recent rains, so we have a nice dusk view with both the Stratosphere and the crescent moon visible.\n","date":"January 23, 2023","externalUrl":null,"permalink":"/blog/travel/nevada/vegas/dusk/","section":"Blog","summary":"It’s an unusally clear night, probably due to the recent rains, so we have a nice dusk view with both the Stratosphere and the crescent moon visible.\n","title":"Dusk in Vegas","type":"blog"},{"content":"","date":"January 21, 2023","externalUrl":null,"permalink":"/tags/genocide/","section":"Tags","summary":"","title":"Genocide","type":"tags"},{"content":"Googing for news about Xinjiang brings up these helpful ads from booking.com and travelocity. Do the residential properties include internment camps?\n","date":"January 21, 2023","externalUrl":null,"permalink":"/blog/racism/xinjiang/","section":"Blog","summary":"Googing for news about Xinjiang brings up these helpful ads from booking.com and travelocity. Do the residential properties include internment camps?\n","title":"Travel Xinjiang!","type":"blog"},{"content":"I saw today on Daring Fireball that Apple is putting the Ice Cubes Mastodon app through the App Store rejection wringer. Ah, that brings back memories. The gullible Apple fanbase may guzzle down their snooty declarations of high standards and mission to protect their customer base (they use the word \u0026ldquo;safety\u0026rdquo; a lot, even when, say, telling me I have to add an online tutorial to my game), but really it\u0026rsquo;s not a crack team of app designers reviewing your app, it\u0026rsquo;s an army of beaureacrats who spend a few minutes at a time on the thousands of app submissions and updates that stream in every day.\nWhen they reject an app, it might be for a valid reason, a personal opinion of the reviewer, an honest mistake (which they will never admit, as this is a corporation, so they\u0026rsquo;ll make you change something anyway to save face), or a poorly hidden corporate agenda, like when they started rejecting all apps (incuding updates) made with a certain middleware which apparently they decided they didn\u0026rsquo;t like, based on having \u0026ldquo;minimal functionality\u0026rdquo; (the catch-all submission rejection reason they can use for anything).\nBut as they were trying to get traction with the newly introduced and poorly received Apple Maps, each rejection came with the same caveat that they might let it go if I added native iOS functionality, say, I don\u0026rsquo;t know, maybe Apple Maps? And this is why early on I added Apple Maps to my Talk Dim Sum app. Because you never know.\n","date":"January 19, 2023","externalUrl":null,"permalink":"/blog/app/icecube/","section":"Blog","summary":"I saw today on Daring Fireball that Apple is putting the Ice Cubes Mastodon app through the App Store rejection wringer. Ah, that brings back memories. The gullible Apple fanbase may guzzle down their snooty declarations of high standards and mission to protect their customer base (they use the word “safety” a lot, even when, say, telling me I have to add an online tutorial to my game), but really it’s not a crack team of app designers reviewing your app, it’s an army of beaureacrats who spend a few minutes at a time on the thousands of app submissions and updates that stream in every day.\n","title":"Apple Is Melting Ice Cubes","type":"blog"},{"content":"Here\u0026rsquo;s the evolution of this website, starting from a search-only page during the first dot-com boom, to a Yahoo-style hand-coded site of links, to sites generated by Forrest and Drupal, a Crafty template, Jekyll on Github Pages, and now this site using Hugo and Blowfish. I\u0026rsquo;d like to think my design skills have improved, but honestly, it\u0026rsquo;s the frameworks.\n","date":"January 18, 2023","externalUrl":null,"permalink":"/blog/web/evolution/","section":"Blog","summary":"Here’s the evolution of this website, starting from a search-only page during the first dot-com boom, to a Yahoo-style hand-coded site of links, to sites generated by Forrest and Drupal, a Crafty template, Jekyll on Github Pages, and now this site using Hugo and Blowfish. I’d like to think my design skills have improved, but honestly, it’s the frameworks.\n","title":"Old Websites","type":"blog"},{"content":"My Unity webplayers have been out of action since I ditched itch.io, but now they\u0026rsquo;re back on no-frills websites, a two-lane sampler of HyperBowl and assorted Fugu Games.\n","date":"January 17, 2023","externalUrl":null,"permalink":"/blog/games/webplayers/","section":"Blog","summary":"My Unity webplayers have been out of action since I ditched itch.io, but now they’re back on no-frills websites, a two-lane sampler of HyperBowl and assorted Fugu Games.\n","title":"Unity Webplayers","type":"blog"},{"content":"Latest Steam review for HyperBowl.\n","date":"January 16, 2023","externalUrl":null,"permalink":"/blog/app/hyperbowl/takesmeback/","section":"Blog","summary":"Latest Steam review for HyperBowl.\n","title":"Takes Me Back","type":"blog"},{"content":"This is the last day of ACA open enrollment, so if you still don\u0026rsquo;t have health insurance, now is the time. It\u0026rsquo;s still a messy system, and it would be far better to have automatic universal coverage, but relying on GoFundMe as a backup plan is not a practical or ethical alternative (and if you do end up on GoFundMe, much like the Covid unvaccinated who end up on ventilators, please include a PSA telling others not to make the same mistake).\nIn earlier years I didn\u0026rsquo;t have the patience to get through the California and Nevada exchanges so I continued to shop for insurance on ehealthinsurance.com, which was convenient and often cheaper than buying directly on the insurer sites, but pre-Obamacare there was less assurance of getting a policy (Blue Cross Anthem denied me due to high cholesterol as a preexisting condition and invited me to apply for a \u0026ldquo;high risk\u0026rdquo; policy), and with Obamacare I was still missing out on the income-based subsidies available when you insure through the exchanges.\nBut the system has been improving, and I finally got through the Nevada exchange just as the subsidies expanded to cover a wider income range, so my monthly payment has gone from around five hundred dollars a month to nothing. I could probably get a better policy now (my opthamologist gave me a discounted rate on my last visit because my deductible is so high), but I don\u0026rsquo;t want to mess with it - now that I\u0026rsquo;m in the system, everything is automatically renewed for each new year, I pay no premiums, and even though my deductible is high, I\u0026rsquo;m not paying the ridiculous list prices for uninsured medical services. Get covered. It\u0026rsquo;s in your best interest, and it\u0026rsquo;s in everyone\u0026rsquo;s interest.\n","date":"January 15, 2023","externalUrl":null,"permalink":"/blog/personal/aca/","section":"Blog","summary":"This is the last day of ACA open enrollment, so if you still don’t have health insurance, now is the time. It’s still a messy system, and it would be far better to have automatic universal coverage, but relying on GoFundMe as a backup plan is not a practical or ethical alternative (and if you do end up on GoFundMe, much like the Covid unvaccinated who end up on ventilators, please include a PSA telling others not to make the same mistake).\n","title":"Get Covered!","type":"blog"},{"content":"","date":"January 14, 2023","externalUrl":null,"permalink":"/tags/california/","section":"Tags","summary":"","title":"California","type":"tags"},{"content":"","date":"January 14, 2023","externalUrl":null,"permalink":"/tags/history/","section":"Tags","summary":"","title":"History","type":"tags"},{"content":"\u0026hellip;FDR issued Proclamation 2537 a prelude to the executive order that FDR \u0026ldquo;reluctantly\u0026rdquo; signed imprisoning over 125,000 Americans of Japanese ancestry, entire families, two-thirds of them native born US citizens (Asian immigrants were not allowed to naturalize), behind barbed wire and guard towers in the desert.\n","date":"January 14, 2023","externalUrl":null,"permalink":"/blog/history/manzanar/","section":"Blog","summary":"…FDR issued Proclamation 2537 a prelude to the executive order that FDR “reluctantly” signed imprisoning over 125,000 Americans of Japanese ancestry, entire families, two-thirds of them native born US citizens (Asian immigrants were not allowed to naturalize), behind barbed wire and guard towers in the desert.\n","title":"On This Day...","type":"blog"},{"content":"The latest addition to the Talk Dim Sum app is salted meat with tofu ribbons, a Shanghai dish. I\u0026rsquo;m using the term \u0026ldquo;tofu ribbons\u0026rdquo; from Fuchsia Dunlop in her book Land of Fish and Rice (at Noodle King in Las Vegas, where I got this for takeout, it\u0026rsquo;s simply called \u0026ldquo;fried tofu with salted meat\u0026rdquo;), but the Chinese word is also used to refer to Venetian blinds. The meat is pork, so it\u0026rsquo;s basically bacon (non-crispy).\n","date":"January 12, 2023","externalUrl":null,"permalink":"/blog/tofuribbons/","section":"Blog","summary":"The latest addition to the Talk Dim Sum app is salted meat with tofu ribbons, a Shanghai dish. I’m using the term “tofu ribbons” from Fuchsia Dunlop in her book Land of Fish and Rice (at Noodle King in Las Vegas, where I got this for takeout, it’s simply called “fried tofu with salted meat”), but the Chinese word is also used to refer to Venetian blinds. The meat is pork, so it’s basically bacon (non-crispy).\n","title":"Tofu Ribbons","type":"blog"},{"content":"I\u0026rsquo;m starting to get into the groove with Mastodon, so this week I deleted my Hive app (but not the account, as I didn\u0026rsquo;t see an account deletion option, so there may be fifty or so followers wondering why I\u0026rsquo;m not posting cat and food photos).\nOn Mastodon, I just have about a dozen followers, a far cry from my heyday of fifteen hundred followers on twitter (plus a bunch of lists), but that\u0026rsquo;s ancient history, as I left twitter (and deleted my account) two years ago (and the Facebook family of democracy destroying apps even further back).\nI have just myself to blame for the slow start as I went against the Mastodon recommendation to start by joining an existing instance and instead began by setting up my own single-user instance, which is like moving to a deserted island and wondering where is everyone (I used to joke that I wanted to set up an asocial network, and this is it).\nBut I\u0026rsquo;m on Mastodon largely because I want to get to know how Mastodon (and the greater Fediverse) works, and you can still find users of interest by browsing other instances, just there\u0026rsquo;s a lot copy and paste involved. There\u0026rsquo;s still a lack of documentation and a hobbyist feel to it, but that\u0026rsquo;s part of the fun. Now I\u0026rsquo;m thinking of making my own Mastodon app. Stay tuned.\n","date":"January 11, 2023","externalUrl":null,"permalink":"/blog/social/mastodon/","section":"Blog","summary":"I’m starting to get into the groove with Mastodon, so this week I deleted my Hive app (but not the account, as I didn’t see an account deletion option, so there may be fifty or so followers wondering why I’m not posting cat and food photos).\n","title":"On Mastodon","type":"blog"},{"content":"PublicUs was open but crowded on New Year\u0026rsquo;s, so I took my reading break in the back alley.\n","date":"January 1, 2023","externalUrl":null,"permalink":"/blog/coffeeshop/publicusthurber/","section":"Blog","summary":"PublicUs was open but crowded on New Year’s, so I took my reading break in the back alley.\n","title":"New Year at PublicUs","type":"blog"},{"content":" I blogged for a while, so this seems like a good time to catch up. Here\u0026rsquo;s what happened this year.\nStarted converting my Jekyll (static site generation) sites hosted on Github Pages to self-hosted Hugo (also static site generation) sites. Like this one.\nStarted resuscitating my blog, last seen on ghost.io, right here.\nAfter rebelling from Apple\u0026rsquo;s strict ecosystem for a few years with my Android phone (a Samsung Galaxy with a cracked screen and battery swelling problem), returned to their warm embrace by getting an iPhone 14 (and then immediately finding my Talk Dim Sum had problems on it).\nAfter getting that iPhone, put my Android devices and the Flutter code for Talk Dim Sum in hibernation (but open source), and unpublished the app from Google Play, now focusing on the Swift version on the App Store (as much as I complain about the App Store, everything else is worse).\nAlso started charging for Talk Dim Sum instead of relying on in-app purchases. It doesn\u0026rsquo;t make that much either way, but free downloads tend to get whinier reviews (for some reason, Canadians and Europeans are the biggest complainers).\nI more successfully disengaged from big tech robber baron Amazon (none of this fancy schmancy toxic social media stuff, just good old fashioned union-busting and worker mistreatment), actually managing to completely close my account(s) (the process resembled a rocket launch countdown, requiring closing of my AWS, Amazon author, Amazon appstore, and regular Amazon accounts in a certain order). Hey, if I need to use AWS again for a (paying) project, I can always create a new account.\nAlso bailed from itch.io. It\u0026rsquo;s a handy landing page for all your games and experiments, big and small, but the forum was driving me crazy with juvenile homophobic threads, and, as with the Amazon appstore, I was making some money, but not enough to make it a tough choice.\nWrote some scripts in Gauche, an implementation of Scheme, for JSON validation, link checking, copying files, sIttuff like that, plus a pi calculator for fun. It feels good to program in Lisp again.\nGot back on the social media scene (I was ahead of the curve in abandoning twitter two years ago) with Hive Social, and when Hive went offline, I set up a Mastodon server, single-user for now (not the best way to get started on Mastodon, but my new year\u0026rsquo;s resolution is to do my server side stuff).\nRecreated my resume in the JSON resume schema, got some practice with nodejs in the process.\nI discovered a bunch of domain names that I let expire years ago and were immediately squatted upon and put up for auction became available again. So welcome back, hyperbowl3d.com, technicat.cafe, wholebraingames.com!\nI resolved to do some more open source work, or at least have more of an open source presence, this year, and I think I succeeded, published more public repositories and contributed a few fixes.\nStopped blogging on ghost.io after an upgrade that broke all the links in my articles, and right after they charged the annual fee. Would have been nice to get a partial refund after I closed my account, but I guess that\u0026rsquo;s my monetary open source donation for the year. I was also using the blog as my technicat.com site, but switched that back to GitHub Pages.\nSo here we are.\n","date":"December 29, 2022","externalUrl":null,"permalink":"/blog/yearreview/2022/","section":"Blog","summary":" I blogged for a while, so this seems like a good time to catch up. Here’s what happened this year.\nStarted converting my Jekyll (static site generation) sites hosted on Github Pages to self-hosted Hugo (also static site generation) sites. Like this one.\n","title":"Year in Review","type":"blog"},{"content":"Even the mantis at Container Park is decked out for Christmas\n","date":"December 24, 2022","externalUrl":null,"permalink":"/blog/holiday/merrymantis/","section":"Blog","summary":"Even the mantis at Container Park is decked out for Christmas\n","title":"Merry Mantis!","type":"blog"},{"content":"Latest Steam review of HyperBowl\n","date":"December 20, 2022","externalUrl":null,"permalink":"/blog/app/hyperbowl/hyperbowlchildhood/","section":"Blog","summary":"Latest Steam review of HyperBowl\n","title":"HyperBowl Childhood","type":"blog"},{"content":"","date":"January 1, 2022","externalUrl":null,"permalink":"/tags/hashnode/","section":"Tags","summary":"","title":"Hashnode","type":"tags"},{"content":"My first post on a new blogging platform is typically, how did I find this thing and should I continue writing on it?\nWell, the answer to first question is I found hashnode on the Flutter community page, and it so happens I currently don\u0026rsquo;t have a blogging platform, as I deleted my Medium account (it\u0026rsquo;s a great online word processor bundled in a social media network with all the problems of a social media network).\nThe answer to the second is in progress. As I write this, it doesn\u0026rsquo;t feel as seamless and pretty as typing on Medium, but it\u0026rsquo;s alright, and I can get used to writing in Markdown. I ended up copying all my Medium posts into a markup format (asciidoc, but now I\u0026rsquo;m thinking I should have stuck with markdown) on github, anyway.\nAnother thing I check out immediately on a new platform is the Terms of Service, especially the Indemnity section. The one here is not the worst I\u0026rsquo;ve seen (that would be Yelp), but not the best, either.\nIt\u0026rsquo;s a three-parter, and the first part is OK, tying indemnification to poor behavior on your part, the second is so-so, putting the onus of any copyright infringement claim upon you, but the third part has that broad \u0026ldquo;any activity related to your use\u0026rdquo; that would seem to include just about anything, with a side order of \u0026ldquo;any other person accessing your device with or without your consent\u0026rdquo; which I assume includes someone stealing your phone or my cat pawing emojis on my keyboard.\nSo it\u0026rsquo;s not a slam dunk. But it does feel good to blog again.\n","date":"January 1, 2022","externalUrl":null,"permalink":"/blog/social/hashnode/","section":"Blog","summary":"My first post on a new blogging platform is typically, how did I find this thing and should I continue writing on it?\nWell, the answer to first question is I found hashnode on the Flutter community page, and it so happens I currently don’t have a blogging platform, as I deleted my Medium account (it’s a great online word processor bundled in a social media network with all the problems of a social media network).\n","title":"How Did I Get Here?","type":"blog"},{"content":"There has been a lot going on with statues, lately. There are some long, well-reasoned responses to those who ask, rhetorically, if we remove all Confederate statues, what about those slave-owners, Washington and Jefferson?\nI have a shorter and simpler answer: it’s fine with me if I never see a statue of Washington or Jefferson. I don’t think we should have statues of politicians (much less have their heads blasted into mountainsides), even long-dead revered ones. It promotes (literally) oversized and glorified images. We shouldn’t be worshipping historical figures — we should be learning about them, the good and the bad, and what they did, not just what they said. Most of the founding fathers were slave-owners. FDR signed an executive order sending 120,000 Japanese-Americans into desert prison camps.\nWhen I visit Washington D.C. I just want to see the museums, I can do without the statues. The only statue I’ve ever made a point of visiting is the famed statue of Hachiko at Tokyo’s Shibuya Station, because that story always gets to me, and dogs, what’s not to like? I’m pleased to just recently learn there’s a new statue showing him reunited with his master, who he waited for at the train station every day for years after his master’s passing.\nHachiko’s story has been made into a Japanese film and an American one starring Richard Gere (which might be a fine movie, but I’ve avoided it because it reeks of the Last Samurai “this would be great if it just had a white American movie star”), but my favorite depiction is a Futurama episode, Jurassic Bark. It’s the saddest thing I’ve ever seen on TV.\n","date":"January 1, 2022","externalUrl":null,"permalink":"/blog/racism/theonlygoodstatueisadogstatue/","section":"Blog","summary":"There has been a lot going on with statues, lately. There are some long, well-reasoned responses to those who ask, rhetorically, if we remove all Confederate statues, what about those slave-owners, Washington and Jefferson?\n","title":"The Only Good Statue Is A Dog Statue","type":"blog"},{"content":"I’m almost done with my social media cleansing, deleted my facebook, whatsapp, instagram, twitter, tumblr, linkedin…but there’s still Medium. I love Medium as a writing tool, it’s an amazing browser-based word processor, but as much as I try to avoid looking at my feed, it’s still social media, or trying desperately to be (the curse of Web 2.0 is every useful idea has to be wrapped in a social media network).\nFor example, I thought it’d be cool to put my resume on Medium since I could make it look nice (which was what I wanted to use LinkedIn for, but it just looked like a crappy Craigslist post and served as recruiter-spam bait).\nBut I just checked it out, and Medium is pushing (curated) garbage at the bottom, spanning unpleasant, tawdry, and insipid.\nHey, I need a job, so come see my resume and a bunch of clickbait! Not for the first time, I’m wondering if I should have stuck with my original Dreamhost and Wordpress setup, and maybe it’s time to check out new blogging options. After all, I’ve been on Medium five years now, and this was my first post.\nI’m thinking, not anymore?\n","date":"August 18, 2021","externalUrl":null,"permalink":"/blog/social/gettingoffmedium/","section":"Blog","summary":"I’m almost done with my social media cleansing, deleted my facebook, whatsapp, instagram, twitter, tumblr, linkedin…but there’s still Medium. I love Medium as a writing tool, it’s an amazing browser-based word processor, but as much as I try to avoid looking at my feed, it’s still social media, or trying desperately to be (the curse of Web 2.0 is every useful idea has to be wrapped in a social media network).\n","title":"Getting Off Medium","type":"blog"},{"content":"","date":"August 18, 2021","externalUrl":null,"permalink":"/tags/medium/","section":"Tags","summary":"","title":"Medium","type":"tags"},{"content":"For the last year of my twitter usage before I abandoned it entirely, I followed no one and only read feeds via twitter lists to avoid cluttering my feed with other people’s arguments (partially successful). It also forced me to organize my social media usage into topics of interest, and turns out my favorite list was of cat cafes and one of my favorite twitter activities was adding cat cafes to the list.\nCat cafes originated in Asia (popular in Taiwan and Japan) as a way for apartment dwellers to get some quality time with pets. In the U.S., they’re typically a mechanism for getting shelter cats adopted, with customers paying either a visiting fee or purchasing food and drinks and then hanging out with the cats. Here I’ll list the ones I can remember, in the hopes of one day doing a cross country tour of cat cafes:\nThe first cat cafe I ever encountered is The Cat Cafe in downtown San Diego, which I visited weekly, often multiple times per week.\nSo when I moved to Las Vegas, I was excited by the plans for the Meow or Never cat cafe in downtown Las Vegas, but it seemed to have run out of steam while they were fixing up the building and all that remains is the mural above.\nHowever, along came another cat cafe in the Las Vegas area (technically, North Las Vegas) called Rescued Treasures. It’s basically an office of a cat rescue and is open to the public for $10/hr.\nThose are the only two I’ve been to, and I recommend both of them, they’re run by cat people and do good work in getting cats adopted. Here are some of the others I found on twitter:\nMAUHAUS Cat Cafe and Lounge in the St. Louis, Missouri area is my favorite cat cafe name.\nThe Pawfee Shop in Appleton, Wisconsin is a recent find and also gets points for its name.\nMew Haven Cat Cafe is, of course, in New Haven, Connecticut.\nThe Brooklyn Cat Cafe is temporarily closed for the pandemic.\nPurrington’s Cat Lounge in Portland, Oregon, was opened and closed and sold and opened and also currently closed for the pandemic. Tough business.\nAnd on one of my recent coffee runs, the barista mentioned Tinker’s Cat Cafe in Salt Lake City. It’s fitting that I heard about a new cat cafe in a cafe.\n","date":"August 15, 2021","externalUrl":null,"permalink":"/blog/cats/catcafes/","section":"Blog","summary":"For the last year of my twitter usage before I abandoned it entirely, I followed no one and only read feeds via twitter lists to avoid cluttering my feed with other people’s arguments (partially successful). It also forced me to organize my social media usage into topics of interest, and turns out my favorite list was of cat cafes and one of my favorite twitter activities was adding cat cafes to the list.\n","title":"Cat Cafes of America","type":"blog"},{"content":"","date":"August 15, 2021","externalUrl":null,"permalink":"/tags/san-diego/","section":"Tags","summary":"","title":"San Diego","type":"tags"},{"content":"","date":"August 14, 2021","externalUrl":null,"permalink":"/tags/coffee/","section":"Tags","summary":"","title":"Coffee","type":"tags"},{"content":"","date":"August 14, 2021","externalUrl":null,"permalink":"/tags/twitter/","section":"Tags","summary":"","title":"Twitter","type":"tags"},{"content":"It’s been just a few days since I abandoned twitter (I spent ten years getting into social media and the next ten years trying to get out). Sure, I miss the cool community, news and discussions that you can’t get by watching TV, but what I really miss is inflicting my daily coffee and food photos on a bunch of people I’ve never met.\nSo, dear Medium readers, you can now look forward to more of the following, starting with this morning’s pre-scorching-heat trek to Vesta Coffee Roasters, one of my regular spots as they set up a couple of tables on the sidewalk (Las Vegas’s version of the sidewalk cafe).\nLike much of this city’s impromptu outdoor dining, it lacks shade unless a tall SUV parks next to you. But at least there’s more than six feet between the two tables, which was a good thing today, as the other table was occupied by someone having a long loud phone conversation in my direction. Alas, the days of my sitting outside and alone seem to be coming to an end, as others seem to be catching on to outdoor seating.\nI spent all week planning this expedition as a reward for staying in and trying my hand at amateur cold brews. Also, their egg salad sandwich might be their only menu item I haven’t tried (I’m generally leery of externally produced egg salad, perhaps dating to yesteryears of saran-wrapped sandwiches)\nIt was good, but I guess I’m out of practice, forgot to save some chips to scoop up the egg salad spillage at the end. If you go, I recommend my favorite items, the basic avocado toast (go for the optional poached egg on top!) and the Hawaiian benedict breakfast sandwich.\n","date":"August 14, 2021","externalUrl":null,"permalink":"/blog/travel/nevada/vegas/vesta/","section":"Blog","summary":"It’s been just a few days since I abandoned twitter (I spent ten years getting into social media and the next ten years trying to get out). Sure, I miss the cool community, news and discussions that you can’t get by watching TV, but what I really miss is inflicting my daily coffee and food photos on a bunch of people I’ve never met.\n","title":"Vesta Coffee","type":"blog"},{"content":"I miss Waterfall software development. Not the actual process (I always had trouble pretending a stack of design specs wasn’t a work of fiction — in the fantasy genre), but the name. Waterfall is so…tranquil.\nNow the trendy methodologies sound like they require daily infusions of Red Bull. First there was Agile, from which sprung Extreme Programming and Scrum, and sprints made their way from Scrum to Design Sprints (to paraphrase Steve Jobs, great designers steal). And this all takes place in Lean Startups.\nBut who’s kidding who. It’s still a bunch of people wearing headphones and collected around a table staring at screens and tapping away at keyboards, taking breaks to stare at their phones and tap on those keyboards, or, if that’s too much effort, speaking to them. Sweating the day away in a sedentary way.\nIf there was truth in buzzwording, Agile workplaces would require navigating the office parkour style. “Can you review my code before checkin?” my coworker asks. “Sure,” I say, as I vault over the table between us.\nScrum already has standup meetings, but there should be a real scrum. Or at least some tackling. I can imagine everyone piling on the scrum master as he attempts to reach the corkboard to pin the latest index card. This is a good way to combat feature creep.\nAnything with sprints should involve actual running. At standup meetings you could run in place, but laps would be better, perhaps for each person during the five-minute per person go around. That would keep everyone except your resident Ironman from going over the limit.\nAnd I would be disappointed to see a Lean Startup that didn’t only have employees with a BMI under 25. Anyone violating the company policy should do some sprints.\n","date":"January 1, 2021","externalUrl":null,"permalink":"/blog/management/leanagilescrumsprints/","section":"Blog","summary":"I miss Waterfall software development. Not the actual process (I always had trouble pretending a stack of design specs wasn’t a work of fiction — in the fantasy genre), but the name. Waterfall is so…tranquil.\n","title":"Lean Agile Scrum Sprints","type":"blog"},{"content":"It’s Father’s Day this Sunday, so if you’re still looking for a gift or just remembered because you’re reading this, I suggest this fun little book.\nI spied it in the kids section of my neighborhood indie bookstore The Writer’s Block, got myself a copy, read it over coffee and a cookie (my regular routine there), and just ordered one for my dad on bn.com.\nI price-compared with amazon, and it’s about the same price — amazon is cheaper but bn has free 2–3 day shipping (so it might get there in time) and doesn’t bug you to sign up for a credit card or amazon prime.\nI’m not a girl or Mexican-American and my dad didn’t ride a motorcycle, but he is an immigrant, we did live in California, and most importantly, it’s about a dad being a dad. So I think he’ll like it.\n","date":"January 1, 2021","externalUrl":null,"permalink":"/blog/book/reviews/mypapihasamotorcycle/","section":"Blog","summary":"It’s Father’s Day this Sunday, so if you’re still looking for a gift or just remembered because you’re reading this, I suggest this fun little book.\nI spied it in the kids section of my neighborhood indie bookstore The Writer’s Block, got myself a copy, read it over coffee and a cookie (my regular routine there), and just ordered one for my dad on bn.com.\n","title":"My Papi Has a Motorcycle","type":"blog"},{"content":"","date":"January 1, 2021","externalUrl":null,"permalink":"/tags/software/","section":"Tags","summary":"","title":"Software","type":"tags"},{"content":"I filled out my census form online yesterday and it was quick and easy, not as long as I remembered it being in previous years. Kind of like a dating interview, actually: “So…you single? Own your own home? Living with anyone?”\nBut the question that always bothers me is the one about race (I suppose that could come up in dating interview, too). It reminds me of my encounters with New Yorkers who want to know “What’s your race? Asian? What kind of Asian?”\nI get the importance of making sure the makeup of the population is properly recognized and resources and attention properly paid. But simply saying “race” is so ill-defined and unscientific (and mailing everyone a question about it just encourages them to do the same). I answered “Chinese” but I don’t think of Chinese as a race. I do think of nineteenth-centry bigots like Al Swearengen referring to Chinese as a race, and worse.\nI checked my 23andme account and they don’t use the word race anywere that I can see. They say “ancestry” and that sounds right to me. When people (again, a lot of New Yorkers) ask my race or nationality or where I’m from or really from, what I’m waiting for is the word “ancestry”.\nAnd even then, a one-word answer is going to be too simplistic. Notwithstanding my census answer, according to 23andme I’m mostly Chinese, but I have Elizabeth Warren traces of several other groups.\nSo I wish the census form would ask for ancestry instead of race, and I wish I could just submit my 23andme report. Maybe one day the census form will just ask for a cheek swab.\n","date":"November 1, 2020","externalUrl":null,"permalink":"/blog/racism/whatsyourancestroy/","section":"Blog","summary":"I filled out my census form online yesterday and it was quick and easy, not as long as I remembered it being in previous years. Kind of like a dating interview, actually: “So…you single? Own your own home? Living with anyone?”\n","title":"What’s Your Ancestry?","type":"blog"},{"content":"Some of the first programs I wrote on the Apple II (in other words, some of the first programs I ever wrote), were different visualizable ways to calculate pi , courtesy of a book on the history of pi that I found in the public library (between readings of scifi novels and Agatha Christie mysteries, my tastes were eclectic).\nRecreating those programs hardly seemed worth all the setup that a simple Hello World requires these days, but I started playing with Processing the other day (another longstanding item on the checklist) and it seemed like the perfect platform for this type of thing.\nThere are many methods to choose from but probably the simplest is to essentially throw darts at a square enclosing a circle. The number of darts in the circle divided by the total number of darts in the square approximates the circle area by the square area and that all should converge toward pi/4.\nIn Processing, I just typed in this code, hit Play to run and display the window above, and hit Export to deploy it on itch.io . Maybe I\u0026rsquo;ll try Buffon\u0026rsquo;s Needle , next!\nfloat total = 0.0; float inside = 0.0; float radius = 640.0; PFont f; float pi() { if (total == 0) { return 0; } else { return inside/total *4; } } void setup() { size(640,640); background(0); ellipse(radius/2,radius/2,radius,radius); f = createFont(\u0026#34;Arial\u0026#34;,16,true); } void draw() { float x = random(-radius,radius); float y = random(-radius,radius); total = total +1; if (x*x+y*y \u0026lt; radius*radius) { inside = inside+1; } fill(0); rect(0,0,100,40); fill(0,255,255); ellipse(x,y,5,5); fill(255,255,0); textFont(f,24); text(pi(),10,25); } ","date":"October 12, 2020","externalUrl":null,"permalink":"/blog/yearreview/processingpi/","section":"Blog","summary":"Some of the first programs I wrote on the Apple II (in other words, some of the first programs I ever wrote), were different visualizable ways to calculate pi , courtesy of a book on the history of pi that I found in the public library (between readings of scifi novels and Agatha Christie mysteries, my tastes were eclectic).\n","title":"Processing Pi","type":"blog"},{"content":"I’ve been off twitter for a few days now, and I won’t lie, I miss not having an untweeted thought, but now I go entire days without getting aggravated, and I’m getting more reading done.\nTo fill my newly expanded reading hours, I finally got around to trying out the Hoopla app to eborrow from my local library.\nI haven’t tried the music, videos, or audibooks, just the comics and ebooks. The one comic I tried seemed like it was scanned at too low resolution, I had some discomfort reading the lettering, and it was blurry when I magnified it.\nHoopla is a decent ebook reader, though, with the basic features I’m accustomed to on my Barnes and Noble nook app, including the ability to select a word and look up its definition.\nIt’s not quite as slick as the nook books, though. In particular, I take care to preview books on the nook reader to make sure it has a nice font I can read easily (there’s also an option to override the original font), but Hoopla has no preview feature (maybe not a high priority since you’re not actually buying the book), and all the books I’ve read so far are displayed by default in my iPad’s San Francisco font.\nIt’s not a great font for books, but I haven’t tried changing it except increasing the size (ebook readers should have a convenient big print setting!).\nI’ve found the Wimpy Kid series the most readable ebooks, as they feature hand lettering and at a higher fidelity than the comics. Also, they’re a lot of fun. This sequence is particularly topical.\n","date":"August 11, 2020","externalUrl":null,"permalink":"/blog/book/reviews/hoopla/","section":"Blog","summary":"I’ve been off twitter for a few days now, and I won’t lie, I miss not having an untweeted thought, but now I go entire days without getting aggravated, and I’m getting more reading done.\n","title":"Hoopla","type":"blog"},{"content":"One of my free TV streaming sources is the Tubi app, and one of the shows I started watching is Leverage, currently included in the scrolling list of featured videos at the top of the app.\nAt first glance, you might think that is what passes for a reasonably diverse cast in a TV show, but I scrolled through the rest of the features and of the twenty actors displayed only five are women and one is not white.\nThis didn’t bother me in my early TV watching years, when I happily binge-watched Cheers, but I’ve been watching TV for fifty years now, and these days sometimes I just watch the first few minutes of a show and exclaim (to myself), I can’t watch another show about white people!\nAnd then I turn to Korean drama. It’s not like I feel a cultural connection. I don’t know the language and not much of the history, but I’ve learned a bit of both by watching lots of it, as my Tubi recommendations indicate.\nIt’s just nice to see some Asians on TV, even if they’re not Asian Americans.\n","date":"July 29, 2020","externalUrl":null,"permalink":"/blog/tv/diversity/diversityinthumbnails/","section":"Blog","summary":"One of my free TV streaming sources is the Tubi app, and one of the shows I started watching is Leverage, currently included in the scrolling list of featured videos at the top of the app.\n","title":"Diversity in Thumbnails","type":"blog"},{"content":"An online account that provides no option to delete the account inevitably makes me want to delete the account. So I had to email the MIT alumni association to delete my account. That was just one of the small reasons for removing it. Another was receiving class emails even after unsubscribing a year earlier (apparently alumni spam works just like regular marketing spam).\nBut the big impetus is the MIT Epstein scandal. The whole thing stinks: the hobnobbing (and worse, if the Minsky allegation is true), the money, the coverup…and the total lack of reflection on the constant drive for donations, no less money-grubbing than corporate profit-seeking but cloaked in the idealism of higher education.\nAs a student, I didn’t like seeing freshmen recruited into fundraising callathons (and as a part-time employee, I saw the Institute was not particularly well-run as an organizaation), as a graduate I was annoyed that the first call I received from a classmate was a solicitation for a class donation, and as a recent class officer I was astonished there’s an annual alumni conference focused on fundraising. It looked to me like the entire alumni association is a machine for generating donations, and I felt a bit used.\nSure, it’s nice to connect with old (and getting old) classmates, but frankly, I didn’t get around that much while in school, so there aren’t that many to keep in touch with, anyway. And it’s nice to have that lifetime Technology Review subscription. When I applied to MIT, someone told me Technology Review was the best science and tech magazine, and for a long time I agreed.\nLately, however, either my standards have changed or they’ve gone downhill. It’s seemed to me too yay science and rah rah Institute, with some writing that bordered on the unprofessional (one writer complained about “mouth breathers” — hey, anti-nerd, much?), which I also feel was exhibited when they edited the class notes I submitted as an officer (they removed quote marks from a press release I quoted, which by the way they submitted to me for inclusion, so once againI felt I was working for them for free). And don’t get me started on their annual 35-under-35 issue (hey, let’s copy Forbes, the shallow part!)\nMore importantly, Tech Review really missed the boat on Epstein. I don’t expect them to make a big NYT-like scoop on that sort of thing, but in all those years, decades even, as a journalistic endeavor with instituational access, there should have been some examination of the Institute’s questionable practices (maybe the student paper does a better job). So I’m fine with canceling my account and terminating my lifetime subscription. Besides, there’s always the web site.\nI always thought MIT was superior to other schools in some cultural and ethical ways (e.g. no legacy and celebrity admissions or sports scholarships, although who knows, admissions is still a subjective and opaque process, and there was that Ivy Group financial aid collusion lawsuit). I still like to think MIT is better, but now I realize it’s not much better.\n","date":"January 31, 2020","externalUrl":null,"permalink":"/blog/mit/leavingmit/","section":"Blog","summary":"An online account that provides no option to delete the account inevitably makes me want to delete the account. So I had to email the MIT alumni association to delete my account. That was just one of the small reasons for removing it. Another was receiving class emails even after unsubscribing a year earlier (apparently alumni spam works just like regular marketing spam).\n","title":"Leaving MIT","type":"blog"},{"content":"","date":"January 31, 2020","externalUrl":null,"permalink":"/tags/mit/","section":"Tags","summary":"","title":"MIT","type":"tags"},{"content":"I recently listed my favorite shows from the past year\nThe Good Place Dead to Me Killing Eve The Mandalorian Russian Doll Stranger Things The Handmaid’s Tale Veronica Mars Barry Watchmen Only afterwards did I realize most of these shows featured female leads, and in fact most of them had women as their main protagonists. This was true of some of my past favorite shows but probably not most, and the pickings were slimmer. If I had to pick five off the top of my head, it’d be Buffy, Sarah Connor Chronicles, BSG, Deadwood, Breaking Bad, and that’s maybe two out of five (I always thought The Sarah Connor Chronicles was more about Sarah Connor than John Connor).\nSo, this is one of the few positive trends going into the new decade.\n","date":"January 4, 2020","externalUrl":null,"permalink":"/blog/tv/diversity/favoriteshows/","section":"Blog","summary":"I recently listed my favorite shows from the past year\nThe Good Place Dead to Me Killing Eve The Mandalorian Russian Doll Stranger Things The Handmaid’s Tale Veronica Mars Barry Watchmen Only afterwards did I realize most of these shows featured female leads, and in fact most of them had women as their main protagonists. This was true of some of my past favorite shows but probably not most, and the pickings were slimmer. If I had to pick five off the top of my head, it’d be Buffy, Sarah Connor Chronicles, BSG, Deadwood, Breaking Bad, and that’s maybe two out of five (I always thought The Sarah Connor Chronicles was more about Sarah Connor than John Connor).\n","title":"My Favorite Shows","type":"blog"},{"content":"","date":"January 1, 2020","externalUrl":null,"permalink":"/tags/ada/","section":"Tags","summary":"","title":"Ada","type":"tags"},{"content":"I remember the original Mac interface guidelines were design bibles (I wish I still had them — they were sitting on my shelf for years). The rules were simple, with well explained rationales, and consistent adherence to them aided the user’s mental model.\nBut I also feel that Apple is not the beacon of guiding design light that it used to be, although they still act like they are (especially when you get an app rejection) and the trend toward form over function is a big part: their WWDC talks go on about making “delightful” apps, removing borders from buttons so they’re indistinguishable from labels, removing the affordance of visible scroll bars so it’s not obvious there’s more content you can scroll to (or even which direction to scroll), and, as mention, removing the home button so you have to google for what is the new swipe equivalent (it’s sad when you have to google how to use an apple).\nAnd while in the early Mac days I would know I could always find operations appropriately in the menubar and context menus (and I would use these rules when making apps), it seems pretty random (on iMovie, for example, one delete operation is available in the menubar, one other one is on one visible element, and command-delete is only available on one type of element).\nSome things are too easy to invoke. One-tap convenience caused me to accidentally make a lot of phone calls just by tapping on my call history (until Apple finally fixed that after too many accidental calls to 911), and, a current peeve, I often accidentally switch playing podcasts just from an stray tap.\nBut Steve Jobs was also guilty of breaking the rules you mention. His insistence on a one-button mouse gave us shift/control/option/command clicks (not really simpler than a right-button mouse click) and even double click (just a shortcut for right-click and run). And they don’t admit they make mistakes, so the Apple mouse still had one button, just a really big one that you could click in various ways like multiple buttons. Now with trackpads they can just pretend the mouse never happened.\nAnd the new MacOS confused the single-click/double-click issue (a real problem when I’ve had to help people not good with comptuters: “double-click that, just single click this, control-click this…”) with the dock. Thanks to Jobs I’ve been double-clicking to run over a decade and now there’s this dock where you single-click to run, and in the worst case you launch something twice.\nSo I would argue this trend started with the new Apple after Jobs took it over again, and probably there are several contributing influences, including the ascendance of Ives, the move toward mobile, maybe just a global trend (used to be it was just Apple and Sony that were about the pretty, and now it’s everyone), and the passing of Jobs. The Apple Stores started to move to a cheaper experience but they backtracked on that, and while some say there’s a lack of inspiration and innovation, some things have been executed better (I’m not a fan of iCloud, but it’s a lot better than MobileMe).\nI feel better ranting about this knowing that the original Mac UI designers also have complaints:\n","date":"January 1, 2020","externalUrl":null,"permalink":"/blog/yearreview/applehasforgotten/","section":"Blog","summary":"I remember the original Mac interface guidelines were design bibles (I wish I still had them — they were sitting on my shelf for years). The rules were simple, with well explained rationales, and consistent adherence to them aided the user’s mental model.\n","title":"Apple Has Forgotten","type":"blog"},{"content":"Long ago, during a meeting with my boss, I quoted someone famous on a technical topic, and my boss countered just because that guy said it doesn’t make it true.\nNow, I was just trying to provide proper attribution and never really got along with my boss, but he did have a point. More generally, even if something is true, just because someone famous said it doesn’t necessarily impart more weight to it. It might even detract from the point of the quote.\nFor example, I frequently see quotes from the eminently quotable Franklin Delano Roosevelt, and they are fine quotes about freedom and such that no one should disagree with. However, he is the President who signed the executive order interning over a hundred thousand Japanese-Americans, entire families, women, children, most of them native-born US citizens, in barbed wire desert camps for the duration of World War II (with some released in order to serve in combat).\nAlthough it seems to be agreed upon by most (but somehow not all), that the internment was a travesty of justice (even back then, there were many who knew it was wrong), FDR seems to get a pass on it. So next time you see a quote from him, try appending (as I do mentally) what I just said above, or the short version:\n…said the guy who ordered the internment of Japanese-Americans.\nHere, you can practice on this selection I just grabbed from goodreads:\nThe only thing we have to fear is fear itself.\nRemember, remember always, that all of us, and you and I especially, are descended from immigrants and revolutionists.\nIf you treat people right they will treat you right … ninety percent of the time.\nHuman kindness has never weakened the stamina or softened the fiber of a free people. A nation does not have to be cruel to be tough.\nBetter the occasional faults of a government that lives in a spirit of charity than the consistent omissions of a government frozen in the ice of its own indifference.\nTrue individual freedom cannot exist without economic security and independence. People who are hungry and out of a job are the stuff of which dictatorships are made.\nGreat power involves great responsibility.\nIn the truest sense, freedom cannot be bestowed; it must be achieved.\nToday we are faced with the pre-eminent fact that if civilization is to survive, we must cultivate the science of human relationships, the ability of all peoples of all kins to live together and to work together in the same world at peace.\nIt is the purpose of government to see that not only the legitimate interests of the few are protected but that the welfare and rights of the many are conserved.\nThere should be no bitterness or hate where the sole thought is the welfare of the United States of America. No man can occupy the office of President without realizing that he is President of all the people.\n","date":"January 1, 2020","externalUrl":null,"permalink":"/blog/racism/fdrquotes/","section":"Blog","summary":"Long ago, during a meeting with my boss, I quoted someone famous on a technical topic, and my boss countered just because that guy said it doesn’t make it true.\n","title":"FDR Quotes","type":"blog"},{"content":"","date":"January 1, 2020","externalUrl":null,"permalink":"/tags/henry-petroski/","section":"Tags","summary":"","title":"Henry Petroski","type":"tags"},{"content":"","date":"January 1, 2020","externalUrl":null,"permalink":"/tags/iowa/","section":"Tags","summary":"","title":"Iowa","type":"tags"},{"content":"Lately I’ve been reading some articles here on Medium that I find interesting enough to hit the Recommend button…until I reach that last line saying, typically, “If you like this article, please click on the Recommend button so others can enjoy it.”\nPart of my reaction is just a tendency to balk at being pressured (one more reason I enjoy self-employment). However, I do think it’s annoying. Not as annoying as the most-of-you-won’t-share-this Facebook shame-intimidation posts, but there is the implication that if you don’t hit that Recommend button, you are somehow depriving others of the enjoyment provided by this article.\nEven without that burden of responsibility, it’s just undignified to plead please recommend, please share, please retweet…that’s not marketing, that’s begging. Neither Don Draper nor Steve Jobs closed a presentation with “Please buy this product. It would really help us out.”\nPlus, if you ask can-you-spare-a-share on some posts and not others, are you saying, nah, don’t bother sharing those other posts? If you consistently implore at the end of each post, well, it takes up space and gets repetitive, which is why the social site places the share/recommend/retweet button right there, but not a sentence explaining the benefits of clicking it. This isn’t Social Media for Dummies.\nBut if you feel compelled to entreat, you should deal out the treats. I was pestered by one Unity Asset Store vendor repeatedly to write a five-star review for the package I purchased. When I agreed and mentioned it would be nice if he would do the same for my free packages, he agreed and never did. Just the pestering is enough to deter me from being a repeat customer — the sheer laziness in reciprocity seals the deal.\nIf he was thinking ahead, he would have checked out and rated my products before asking the same. Then it wouldn’t have been a favor. But there’s no need to be so calculating. Review unto others, and so on. As in other professional networking, don’t just be a taker — if you’re a generous sharer, referrer, recommender and retweeter, you will reap the rewards, and the retweets, without having to ask. Save the campaigning for your next kickstarter.\nAnd by the way, if you like this article, please click the Recommend button so others can enjoy it. Pretty please, with sugar on top.\n","date":"January 1, 2020","externalUrl":null,"permalink":"/blog/social/socialpanhandling/","section":"Blog","summary":"Lately I’ve been reading some articles here on Medium that I find interesting enough to hit the Recommend button…until I reach that last line saying, typically, “If you like this article, please click on the Recommend button so others can enjoy it.”\n","title":"Social Panhandling","type":"blog"},{"content":"It’s hard to self-isolate, but one thing that helps keep me inside is being an Asian American. Not unpredictably after Trump’s Chinese-branding of the coronavirus (for once, he didn’t name something after himself, but personally I think “Trump virus” or “MAGA plague” sound about right), coronavirus-inspired hate crimes against Asian Americans are happening.\nI checked the latest Las Vegas-area virus case stats from the Southern Nevada Health District, and at five percent Asians are well below their demographic (ten percent, according to the census).\nAlthough I suppose there could be a lot of Asians in Unknown (and who could blame them for not telling?)\nIt’s easy to blame Trump, but that’s too easy. As with the treatment of refugees at our southern border, politicians of “both sides” have been complicit in letting this happen. This election season has been the first time I’ve seen Democrats grow a backbone on immigration. When I lived in California, I couldn’t find any mention of immigration in the issues list on Dianne Feinstein’s web site. Even this campaign season, the Democratic candidates still prefaced every mention of immigration with “Yes we need border security” (Andrew Yang’s site mentioned it twice: “Border security…DACA…Border security…”)\nAnd I winced when Bernie Sanders first ran for president and while debating Hillary Clinton addressed a mostly white New England audience with “You shouldn’t have to compete against Mexicans and Asians who are making…” (I more than winced, I stopped watching the debate and started supporting Hillary). When I brought that up in response to his twitter account encouraging everyone to “if you see something, say something” about racism, a bunch of Bernie-can-do-no-wrongers whitesplained to me what he “really” meant. I. Don’t. Care. It’s the type of careless or not-so-careless framing that can get people killed, like when Vincent Chin was beaten to death by unemployed auto workers in Detroit who thought he was Japanese (or didn’t care about the difference) while politicians like Dick Gephardt conducted Asia-blaming campaigns. By the way, Chin’s murderers served no time.\nBefore the Sanders zealots complain that I’m just picking on him, I also reminded Kamala Harris’s twitter account, when she brought up Earl Warren as an inspiration (contrasting with Brett Kavenaugh, whose Supreme Court confirmation was in progress) that Warren was instrumental in the World War II internment of 120,000 Japanese Americans (the executive order was signed by FDR, another hero of progressives). So you could say he really exceeded expectations as a Supreme Court justice.\nAs far as I know, the subject is still not mentioned much in school history classes (although when I lived in Huntington Beach, the city distributed a self-produced centennial history video to schools which bizarrely defended the internment). It has come up more often during the Trump administration, particularly with the Muslim bans. At the time, I tweeted that Chinese-Americans who didn’t care about the Muslim ban or the treatment of refugees at the border should remember the internment and consider, we could be next. And here we are.\n","date":"January 1, 2020","externalUrl":null,"permalink":"/blog/racism/stayhomeifyoureasian/","section":"Blog","summary":"It’s hard to self-isolate, but one thing that helps keep me inside is being an Asian American. Not unpredictably after Trump’s Chinese-branding of the coronavirus (for once, he didn’t name something after himself, but personally I think “Trump virus” or “MAGA plague” sound about right), coronavirus-inspired hate crimes against Asian Americans are happening.\n","title":"Stay Home If You’re Asian","type":"blog"},{"content":"A comment I made on a Medium article about Apple\u0026rsquo;s prescribed tab behavior.\nI don’t see the described Medium behavior as a problem. I believe this is correct design. The tab bar represents the top or root node of the navigation tree, and the 3–5 screens represented by the tabs are the siblings just underneath the root (in the code, those UIViewControllers are children of the UITabViewController), and if they say every screen should display the tab bar, I believe they mean specifically those screens, not every “screen.”\nYou could argue that it would be better to see the tabs on every screen to see which top level branch of the tree you’re in, and that may be more common on web sites, but you have to make design compromises on the small screen, as along as the rule is consistent, and personally I’ve either gotten used to or like having the tab show only on the top level. When you see the tab bar, you know you’re “Home” and when you don’t, you know you’re further down in the tree, and the left/back arrow tells you that also. That back arrow is built into the standard iOS navigation controller (it can be overridden with another graphic) and by default displays the name of it’s parent, so leaving it blank is a design decision which I might agree is part of an unfortunate form-over-functionality trend, like omitting labels under the tab icons (and Medium’s stats page is very pretty and almost useless).\nAlso, as long as we’re talking about iPhones, I don’t believe it makes sense and is unnecessarily complciated to make a distinction between modal and child views and in-betweenish. For all practical purposes, every “view” is modal (although by view I believe you mean a whole-view screen and what I used to know as a UI component Apple calls a view, even a label). This may be a different story on iPads which is moving in a windowed direcgtion.\nAnyway, all that terminology is confusing and though it may be a hard sell to non-programmers I believe it would be helpful to use class names like UIView and UIViewController, and I think Apple does use some of that terminology in its design guideline doc.\nWhere I believe Medium is committing a design sin is in the Write tab at the center of the tab bar. Every other tab behaves as you would expect, switching among the screens associated with that tab and still displaying the tab bar. But select the Write tab and that screen takes over and that I would agree is problem behavior along what you describe where it feels like something modal took over, and the tab button did not behave like a tab button. Instagram does that too, using the center tab button to bring up the camera, and that bugs me, too.\nFor comparison, I just took a look at Medium on my Android phone, and it’s using a hamburger menu instead of a tab. I much prefer the tabs.\nI should add, one thing I like about tabs is that there’s almost a convention in their usage for large category of apps (I actually wrote about it on Medium a while ago). I was working on a social media app for a while, and I realized that facebook/pinterest/instagram (except for that camera tab), twitter, arstation, and on and on not only have similar tabs but have them in the same order, so even if you’re supposed to somehow know what all those unlabelled tab icons mean, you know by know that the leftmost tab is the feed, the rightmost will be your account/profile, center is going to me some primary activity (camera, write, or in Facebook’s case, messaging) and activity/notifications in between on the left or right.\nEdit: I just looked at the App Store app on my iPad and I can see that matches the desired behavior you describe. Also, the navigation is clearer because they have the top level screen names labeled under the tab icons and displaying in the back buttons. I’m not sure overall I like it better because I think some of the bottom child level behavior is funky, like a modal horizontally scrolling row of images that has to be dismissed with a Done button, but I agree Medium is not consistent overall with that. I guess I’m biased because I tend to go more with the Medium style (except for that Write button) in my apps. But then again, I also throw in a side/hamburger menu, too.\n","date":"January 1, 2020","externalUrl":null,"permalink":"/blog/app/tabs/","section":"Blog","summary":"A comment I made on a Medium article about Apple’s prescribed tab behavior.\nI don’t see the described Medium behavior as a problem. I believe this is correct design. The tab bar represents the top or root node of the navigation tree, and the 3–5 screens represented by the tabs are the siblings just underneath the root (in the code, those UIViewControllers are children of the UITabViewController), and if they say every screen should display the tab bar, I believe they mean specifically those screens, not every “screen.”\n","title":"Tabs","type":"blog"},{"content":"Many of my classmates from Iowa City West High School (which by the way is a really convenient name, as I found some document frames at Staples already containing a “West High School” diploma) still live in Iowa City, and a few recently noted on Facebook that Iowa City is #3 on this list of 16 Best Places to Live.\nSetting aside that the article shows only white people living in all those towns (to be fair, not every photo shows a white person — there is an almond croissant and a couple of crabs), I do have some fond memories of Iowa City.\nFor one thing, I remember in downtown Iowa City, drivers would always stop for pedestrians crossing the street, wherever they happened to cross. So it’s a miracle that I didn’t end up on a windshield when I went to Boston for college (that actually happens to a few freshmen crossing Mass Ave. every year). And once as I trudged to school, an elderly man stopped and offered me a ride, which I took. Around here, that would result in an Amber Alert.\nOf course, it’s been a while, and things may have changed. But I suspect not a lot. When I drove back there for my tenth year reunion and stopped at a truck stop for breakfast, my brain misfired and I requested hash browns instead of the corned beef hash that I intended to order. The waitress asked “Just hash browns?”, and when I confirmed, returned with a mountain of hash browns, enough for more than a meal. The bill was $.99. I suspect she figured I was a starving foreign student (this was 35 pounds ago). Anyway, best plate of hash browns I ever had.\n","date":"January 1, 2020","externalUrl":null,"permalink":"/blog/travel/iowa/iowacity/","section":"Blog","summary":"Many of my classmates from Iowa City West High School (which by the way is a really convenient name, as I found some document frames at Staples already containing a “West High School” diploma) still live in Iowa City, and a few recently noted on Facebook that Iowa City is #3 on this list of 16 Best Places to Live.\n","title":"The Best Places to Live","type":"blog"},{"content":"On my list of things-I-want-to-do-but-I’m-not-serious-just-talking is a history of computers, or at least a history of computer programming, something like Bertrand Russell’s History of Western Philosophy or Will and Ariel Durant’s Story of Civilization.\nI got this interest during my one and only stint in academic teaching as an assistant to Computer Literacy 101 at Johns Hopkins University. The textbook included a decent history of computers, which was wasted on all the psych majors who only took the course because it was a requirement and raised their hands just to ask “Is this going to be on the test?”\nBut I felt a really comprehensive history of computers would be fascinating and something both CS and non-CS majors should learn. Because it’s history, and it’s an interesting history that’s intertwined with everything from WWII codebreaking to the space race to just about everything you’re doing right now. And also it does help you learn how computers and computer programs actually work.\nI still haven’t seen any book or set of books like I’m envisioning, but I have been to a couple of computer history museums, most recently the one in Mountain View next to Google (there were some rather obvious Googlers sporting Google Glasses walking around), and I’ve read some biographies that collectively give you a sampling of computer history, like those of Countess Ada Lovelace, John Atanasoff, Alan Turing, John von Neumann…\nWait a minute: Countess Ada Lovelace? Sounds like the heroine in a romance novel or a Lifetime movie. But real life is even better. She was the daughter of a rapscallion Lord Byron who left the family after she was born. Ada grew up a whiz at math and unfortunately was sick most of her life and died young, but in the meantime figured out how to program Charles Babbage’s (never-finished) Analytical Engine. She would have been a shoo-in for a 3o-under-30 list back then, or more like a 1-under-30 list if you narrowed the list to tech.\nIn other words, Ada Lovelace was the first programmer, even without a functioning computer, and in general, hold on to your Google Glasses, women were the first programmers on real computers. I realized that after reading the Alan Turing biography and learning about the women at Bletchley Park who operated the machines he designed and decrypted German codes during World War II. They were even called “computers”.\nSo, women representation in software development hasn’t just been dropping since the 1980\u0026rsquo;s, it’s been dropping since the 1800\u0026rsquo;s, where it started at 100%. After WWII, men started crowding into the field and getting those plum jobs at IBM, but there were still influential women like the colorful and later Admiral Grace Hopper, who developed the earliest compiled languages like COBOL and popularized bugs (just she and Countess Ada are enough for a new Bill and Ted movie where they go back in time and collect famous computing women to present at a Google diversity seminar).\nBut even if you turn up your nose at COBOL (although that was a nice skill to have during the Y2K scare), every modern programming language, and concepts like GUIs, and design patterns like MVC, can be traced back to Adele Golderberg’s Smalltalk (if you’ve ever wondered why Objective-C is the way it is, look no further…).\nLess popularly known, one of my MIT professors, Barbara Liskov, won the Turing Award and developed influential languages like CLU and Argus (CLU was used in the software engineering course she taught where I learned about data abstraction, commenting code, and not working with partners on your final project if you can possibly help it).\nIn the meantime, Ada did get her own computer language. And she’s shown up here and there in pop culture among those in the know, for example in, appropriately, the William Gibson/Bruce Sterling steampunk novel The Difference Engine. So maybe a history of computing is too ambitious, but there’s still plenty of material for a History of Women in Computing. Someone, get on that!\n","date":"January 1, 2020","externalUrl":null,"permalink":"/blog/history/historyofprogramming/","section":"Blog","summary":"On my list of things-I-want-to-do-but-I’m-not-serious-just-talking is a history of computers, or at least a history of computer programming, something like Bertrand Russell’s History of Western Philosophy or Will and Ariel Durant’s Story of Civilization.\n","title":"The History of Programming","type":"blog"},{"content":"When I fly, I take it as an opportunity to get in some reading, and I try to pick up a book at the airport, especially if the airport has a real bookstore. Even better, a bookstore that has a science fiction section, like the Warwick’s at San Diego (the only other airport bookstores with a scifi section I can think of are in San Francisco and Portland).\nSo on my return from Comic Con, I chose The Man in the High Castle, which I read a long time ago, pretty much forgot, and meant to read again after watching the TV series.\nI remember I found the book interesting but not particularly compelling at first reading, but either due to age or the current administration I found it more absorbing this time around. It’s not the only alternate history in which the Axis powers won World War II, but it is the most bizarre, extreme, and yet surprisingly still believable one.\nThe thing about Philip K. Dick stories, however, is that it’s hard to get invested in the characters, so this is one of those cases where if I had to choose between the novel and screen adaptation, I’d choose the latter, even though it’s a very, very loose adaptation. Really, the series just takes the alternate history premise, borrows some of the characters and makes them more nuanced and sympathetic, omits the pervasive mystical use of the I Ching, and thankfully avoids some of that weird Japanese-English talk (and thought) used in the book.\nI mean, when PKD writes Nazi dialogue and thought processes, they sound like Joe American (including the Nazi named Joe). But the Japanese characters are written the same way sci-fi writers might write aliens. By the way, I have this issue also with Blade Runner (the movie, not the original story), which despite its fascination with Asian culture just uses it as a backdrop for a story about white people (and white androids).\nThe TV version of the Man in the High Castle, on the other hand, (I don’t get to say this very often) has a lot of great Asian characters (it would be bizarre if it didn’t, considering this alternate history takes place largely in a Japanese-occupied West Coast, but hey, look at Firefly). In particular, Cary-Hiroyuki Tagawa was amazing and his performance and role carried a good portion of the show. There was even a Japanese-American member of the resistance and a mention of Manzanar, which almost felt forced (but hey, the Japanese-American internment did happen, and apparently also in that alternate history).\nOne complaint I have about the TV series is that I felt it kind of ended on a Hollywood note where they sort of explained that everything tied together through the goodness of the heroine, which made no sense, whereas the book ended more on a “What the…?” note. Which in a story like this, makes more sense.\n","date":"January 1, 2020","externalUrl":null,"permalink":"/blog/tv/scifi/maninthehighcastle/","section":"Blog","summary":"When I fly, I take it as an opportunity to get in some reading, and I try to pick up a book at the airport, especially if the airport has a real bookstore. Even better, a bookstore that has a science fiction section, like the Warwick’s at San Diego (the only other airport bookstores with a scifi section I can think of are in San Francisco and Portland).\n","title":"The Man In The High Castle","type":"blog"},{"content":"I guess we shouldn’t be surprised at the recent anti-Mexican sentiment. It’s not that recent. I wrote this during the 2008 presidential race.\nRecently, a neighbor of mine undergoing some financial difficulty complained to me that if she had a Hispanic last name, she’d be getting all kinds of free services. If she really believes that, well, nothing’s stopping her from legally changing her name, but this isn’t the first time I’ve heard that kind of talk, since I moved to California, and not just in Orange County where a the mayor of Costa Mesa is an honorary Minuteman.\nIn fact, shortly after moving to West LA from Boston over ten years, ago, a friendly salesman at the electronics shop Good Guys in Marina Del Rey welcomed me to lovely Southern California with the caveat that the place has gone downhill what with the Mexicans moving in. When I worked in Dallas, a native Texan had informed that’s how Mexicans were looked upon in Texas, but it was a shock to encounter it first in Sunny LA. And it’s not just in retail — when I was still paying attention to the Orange County Java Users Group, the umpteenth mail list discussion bemoaning how Asians were taking all our jobs (not so common now that progammers are raking it in with the Web 2.0 boom) somehow managed to devolve into one member wistfully pondering how the Mexicans here were “nice people” but didn’t seem to value education. (That guy, by the way, was a terrible programmer)\nAnd now that I think of it, I’d seen this long before as a kid when I transferred to Cope Junior High School in Redlands, CA. Despite my grade school records, which included A grades and competition in the district spelling bee, the school administrators apparently assumed I was fresh off the boat and placed me in, shall we say, “lower-tier” classes — my math class was populated with jocks and taught by the gym teacher who conducted class with questions at the chalkboard like “if you’re at the fifty yard line and catch a pass at the fifty-five yard line, how far did you go?”, and my English class was taught by an elderly white woman who constantly made mistakes and publicly praised me for bringing her mistakes to her privately instead of mentioning them in front of the other students. She blamed some of those mistakes on the Latino student who had marked up my test according to her instructions and confided in me (in the same manner as the Good Guys salesman years later), “that kid will never go anywhere”. If that was a remedial class, I don’t see how it could have remedied anything.\nUntil the last couple of years, I thought this was just a weird California thing, like the obsession with plastic surgery and electing movie stars to the governor’s office. But apparently the whole nation has secure-the-border fever (in advanced stages, it becomes build-a-really-big-fence fever). In one of the Republican debates televised by CNN, in which crazy-angry Tom Tancredo seemed be the one candidate to have vehement anti-immigrant feelings, only John McCain went beyond the “secure the border” rhetoric parroted by the other candidates and gave one of his “straight talk” speeches, stating “let’s be clear — we’re talking about Mexicans and people of Mexican descent” and to look at the Hispanic names listed on the Vietnam War Memorial and among the troops currently fighting overseas. Of course, CNN, the soapbox of Lou Dobbs (remember when it used to be a news network?), couldn’t fit that into one of their oft-repeated post-debate sound bites.\nSince then, McCain has apparently decided to stick with what plays in Peoria and starts off any immigration discussion with the term “border security”. And Obama is no better. He voted against the McCain-Kennedy immigration bill, and his tome of a Blueprint for America, while featuring several detailed pages on health care and education, has less than a page’s worth of statements on immigration (more like a Letterman’s Top Ten List, really), starting with, you guessed it, border security.\nBut to be disappointed in politicians is to be naive. I’m more disturbed by other Asian Americans around here who complain about Latinos. It’s not that long ago in California that Chinese were denied citizenship and could not own property (you think they all wanted to live in Chinatown?), Japanese had their land taken and were shipped off to the desert behind barbed wire, and interracial marriage was forbidden (the recent state Supreme Court case on gay marriage had much discussion of the court’s anti-miscegenation law ruling). Just remember, people, it could be you, next.\n","date":"January 1, 2020","externalUrl":null,"permalink":"/blog/racism/uglysideofcalifornia/","section":"Blog","summary":"I guess we shouldn’t be surprised at the recent anti-Mexican sentiment. It’s not that recent. I wrote this during the 2008 presidential race.\nRecently, a neighbor of mine undergoing some financial difficulty complained to me that if she had a Hispanic last name, she’d be getting all kinds of free services. If she really believes that, well, nothing’s stopping her from legally changing her name, but this isn’t the first time I’ve heard that kind of talk, since I moved to California, and not just in Orange County where a the mayor of Costa Mesa is an honorary Minuteman.\n","title":"The Ugly Side of California","type":"blog"},{"content":"Aside from the first week at my junior high school, where they apparently assumed I was a poor immigrant kid who would be a low performing student and thus assigned me to classes with other low performing students, I was generally considered a “gifted” student. That came with perks like, in grade school, going on a field trip to an aquarium, and, in high school, a day spent learning how to be “creative” (some fads never go away).\nIt seems to me every kid would have benefited from the aquarium trip, and maybe more than the so-called gifted kids, but they weren’t missing anything with the creativity class. We listened to anecdotes on how famous scientists experienced their ephiphanies and then we ran around smashing ice cubes (is that a band name?) to see who could make water the fastest.\nThat time would have been better spent reading a book like Leonard Midlow’s The Upright Thinkers, a recounting of the revolutions in scientific thought.\nA major message of the book is that science is a hard slog, and often it’s a hard slog going down the wrong path (much unlike the quick-fix resolutions in the MacGyver episodes written by the author, who is not only a noted physicist but a screenwriter).\nFor example, Newton didn’t havean apple fall on his head. Or he could have, but that would have been just bad luck.\nRather, after an emotionally deprived childhood and working essentially as a grad student without a scholarship, he spent spent thirty years burning the midnight oil on alchemy before Edmund Halley (of Halley’s Comet fame) asked him to look over Kepler’s orbital laws, and then Newton spent another eighteen months burning the midnight oil putting together his Laws of Motion.\nEinstein did crank out three revolutionary theories in one year at his patent office job, (which reminds me of the recent advice I received from a retired mailman telling me I should have worked for the post office). Still, he spent much of his career futilely trying to turn back the tide of quantum mechanics.\nAnd those are the success stories. For every crackpot theory that turned out to be revolutionary, there are a bunch of crackpot theories that are still crackpot theories and theorists who’ve only come up with crackpot theories.\nSo there are no easy answers or shortcuts to success. Instead, there’s hard work and perserverance, good luck, and being in the right place and the right time. And being born in the right place and right time, and right gender (there’s a reference to Lise Meitner, who co-discovered nuclear fission but missed out on the Nobel).\nBut overall the book is an optimistic one, profiling those who were dedicated to their intellectual passions and eventually rewarded with brilliant insights, and overall furthering the march of human progress. And the author’s bio reminds us that, whatever your main job is, don’t give up on your bookwriting and screenwriting aspirations.\n","date":"January 1, 2020","externalUrl":null,"permalink":"/blog/book/reviews/uprightthinkers/","section":"Blog","summary":"Aside from the first week at my junior high school, where they apparently assumed I was a poor immigrant kid who would be a low performing student and thus assigned me to classes with other low performing students, I was generally considered a “gifted” student. That came with perks like, in grade school, going on a field trip to an aquarium, and, in high school, a day spent learning how to be “creative” (some fads never go away).\n","title":"The Upright Thinkers","type":"blog"},{"content":"Digging up old book reviews, I discovered for some reason I wrote two reviews of To Engineer is Human. Here is the second one. Or maybe the first.\nWhen I worked in Silicon Valley, it seemed everyone wanted the title Software Architect. It’s a sexy-sounding title, maybe because in the movies all the cool people work in advertising or architecture firms, but in the real building world, while the architects get the glory, someone has to put it together and make sure it doesn’t fall apart.\nLooking at other engineering fields may sound dull (that is why I majored in software engineering, after all), but reading a few books by Henry Petroski fixes that. The Evolution of Everyday Things and Small Things Considered: Why There is No Perfect Design are reminiscent of Donald Norman’s The Design of Everyday Things but with the focus less on why is everything so badly designed and more on how we got there. Wonder why there seems to be a new hot scripting language every year? Look at how forks evolved from sharp sticks to two-tine prongs and then the tines kept coming, along with endless variations of curvature and finish. Much of the impetus is fashion (and the Emily Post comments on silverware foreshadow the code style critics of today), but the five hundred variations of hammer design found just in seventeenth century England are likely due to the fact that when you have a hammer, everything really does look like a nail. This engineering as evolution is consistent with Eric Raymond’s observation that open source projects tend to start as itches that need to be scratched.\nThe belated advent of industrial design, exemplified by the career of Raymond Loewy, has its counterpart in today’s GUI’s. Starting with the Mac desktop interface, form followed aesthetics along with function. But these are just fun analogies — the book that gives me pause is Petroski’s To Engineer Is Human: The Role of Failure in Successful Design. I can’t think of the software equivalent of a metal fatigue crack that just keeps growing, since software (at least once you stop coding) is static. But, as with the Liberty Bell, I guess there is software that you use gingerly, knowing it’s frailty (click slowly and carefully!)\nMore obvious lessons come from examples like the Tacoma Narrows bridge which oscillated wildly and collapsed under high winds. (Watch those boundary conditions!) Not only lessons learned, but lessons that should have been learned already — it’s long been practice for soldiers to stop marching in sync when they cross a bridge. And then making expedient ad-hoc design changes and material substitutions is just asking for trouble, as with the Kansas City Hyatt Regency disaster.\nWhen there’s no long-established precedent, sometimes there are more recent clues of something amiss, as in damaged O-rings in missions preceding the Challenger disaster (more low-level examples in software — there’s a race condition? Put in a sleep call. You’re getting an exception? Wrap an “ignore-errors” handler around it). Ignore at your own (or others) risk. Oh, yeah, and when the engineers you trusted to build the thing are concerned, listen to them.\nBut often you’re building something new, maybe not completely new, but new enough that test as you might, it fails in some unanticipated manner, like the Comet jet that unexplainedly disintegrated. Then you literally have to pick up the pieces (in this case, in the Mediterranean) and perform forensic analysis exceeding anything you’ve seen on CSI and perform test after test (with the Comet, submerging it and simulating thousands of pressurizations/depressurizations). With software, fortunately, we usually have the software intact and the input data to replicate the problem, although there are a few cases like spacecraft gone loco that would drive me to something less stressful, like heart surgery.\nPetroski ends the book with a plea for transparency in the analysis of engineering failure. In game development, we have the excellent tradition of “post-mortem” articles written for Game Developer Magazine and archived on gamasutra, but those are mostly for games that have actually shipped with enough success that we want to read about them. Not much on outright failure. And in the rest of the industry, nada. How about a book on notable software failures — To Program Is Human?\n","date":"January 1, 2020","externalUrl":null,"permalink":"/blog/book/reviews/toprogramishuman/","section":"Blog","summary":"Digging up old book reviews, I discovered for some reason I wrote two reviews of To Engineer is Human. Here is the second one. Or maybe the first.\nWhen I worked in Silicon Valley, it seemed everyone wanted the title Software Architect. It’s a sexy-sounding title, maybe because in the movies all the cool people work in advertising or architecture firms, but in the real building world, while the architects get the glory, someone has to put it together and make sure it doesn’t fall apart.\n","title":"To Program Is Human","type":"blog"},{"content":"I don’t pay much attention to HBR articles ever since I saw one of their collections on the shelf at a Ralph’s supermarket featuring a “study” on left-brain vs. right-brain people. But I just saw another HBR-published study concluding women score higher on leadership skills than men, and it reminds me of other claims I’ve seen about how women are better leaders and managers because they’re more teamwork-oriented, more nurturing, have less ego, etc.\nWhile well-intentioned, this sounds a lot like the folk wisdom of girls are sugar and spice and boys are made of snails and puppy dog tails (which logically spirals into “boys will be boys”). It’s the type of “science” that ends up in Google Manifestos and not only do I think it’s not helpful, it’s not true, at least not in any useful sense.\nSure, I had a woman manager who baked me a cake while I crunched on a project (which my male coworkers ate, to her irritation), but I also had a woman manager who cursed like a sailor (maybe she baked cakes, too, but I expect she’d curse during the whole process).\nAnd they were my favorite woman managers. My first one, when I worked at the microcomputer center in college, liked to give pop quizzes to all the staff, scolded me for talking to customers, and lied that she sent my timesheet to payroll for three months, until I quit, whereupon she deliberately withheld my pay (I got paid after I wrote a letter to her boss saying I needed to pay my tuition bill).\nIn fact, I’ve been cheated out of more pay by women than men (and also by more artists than programmers, so all those bemoaning the lack of programmer ethics, hey this is a case where we can paint with a broader brush).\nThe most egregious case was a woman-run game studio that I’d quit and made the mistake of going back to for contract work. When I sent her my final invoice for several weeks of work including crunch time, she said she didn’t expect it to be that much, then that she didn’t expect to pay at all, I was taking advantage of her, she was really uncomfortable, it was all a misunderstanding, and finally, can we still be friends?\nThis was the type of thing that made me quit in the first place, so that should have been a lesson learned (and now I assume contracts end when they end and don’t continue until someone explicitly says they’re going to pay).\nMy point isn’t that women are worse leaders and managers than men. Saying men are better is just as silly as saying women are better. What I’m saying is that women are fully capable of being as terrible as men, if they’re just given the opportunity.\n","date":"June 1, 2019","externalUrl":null,"permalink":"/blog/racism/justgivethemachance/","section":"Blog","summary":"I don’t pay much attention to HBR articles ever since I saw one of their collections on the shelf at a Ralph’s supermarket featuring a “study” on left-brain vs. right-brain people. But I just saw another HBR-published study concluding women score higher on leadership skills than men, and it reminds me of other claims I’ve seen about how women are better leaders and managers because they’re more teamwork-oriented, more nurturing, have less ego, etc.\n","title":"Just Give Them a Chance","type":"blog"},{"content":"“Self-publishing” is kind of a fuzzy term, but one factor to consider is how easy is it to unpublish. For example, getting an app approved on the App Store can be a challenge, but unpublishing it is just a button click. Same with Google Play, GameJolt, itch.io….\nIn contrast, while Kongregate seemed to be a self-publishing platform, it didn’t have any kind of unpublish button or form, so I contacted customer support to just delete my account, as I had $4 in revenue just sitting there for years, and my old Unity webplayer version of HyperBowl didn’t run on modern browsers. They offered to unpublish it for me but leave the account active, as deleting my account would lose my $4 to them, but that just made me want to leave even more (“I want my four dollars!”)\nBut generally speaking, while seemingly a last resort, removing my account has been effective in getting me an unpaid balance. When the Nabi tablet was discontinued and the company went into bankruptcy, I received a check for around $50. And after six months of chasing Fingerprint for payment (another case where I got suckered by “oh cool, an app store for kids!”), I asked them to terminate our contract, whereupon they wired be about $170 (the tablet I purchased for development cost around $100, so technically this was a profitable venture!).\nBut that was nine months ago, and it turns out, they’ve still been publishing my apps all this time. In addition to publishing my HyperBowl on Samsung Kids, the contract included installation on Launchpad tablets distributed by Playaway. Recently, I ignored an email from Plawaway generically addressing me as “Hello,” and referring to “your apps,” asking to transfer my contract to them directly, as I figured it was some mass email. But then they messaged me on the HyperBowl Facebook page, again generically for some reason (“Hey there,”), saying they were distributing my apps and would like to continue, whereupon I said I didn’t think so, as I’d terminated the contract and never received any payment for any Launchpad installations.\nBut I guess we’re both right, as they reiterated they were indeed including variations of HyperBowl in several bundles, such as this:\nAnd they said they’d also been sending payment to Fingerprint. So best case is they haven’t sold any HyperBowl bundles and I haven’t been missing out on revenue, and worst case is someone owes me money. Or maybe I have the best case and worst case reversed. Anyway, my response was no thanks, please remove my apps. Dead silence for response, so I’ll check again in a month. Unpublishing sure isn’t easy!\n","date":"May 30, 2019","externalUrl":null,"permalink":"/blog/app/selfiunpublishing/","section":"Blog","summary":"“Self-publishing” is kind of a fuzzy term, but one factor to consider is how easy is it to unpublish. For example, getting an app approved on the App Store can be a challenge, but unpublishing it is just a button click. Same with Google Play, GameJolt, itch.io….\n","title":"Self-Unpublishing","type":"blog"},{"content":"On thing people not in software don’t realize about software is that software degrades (sometimes referred to as “bit rot”).\nOf course, it’s not that the bits actually rot (although after some years, phsyical digital media does become unreadable, so yay for the cloud, I guess). What happens is that everything else upgrades. For example, I just tried to upgrade HyperBowl to the latest version of Unity, and not for the first time, it came through scathed (they do always warn you to make a backup before upgrading).\nThis bug actually looks kind of cool, but that HyperBowl logo is supposed to be on a metal door that opens and closes between scene transitions with a Star Trek automatic door-like swoosh.\nI thought it might be shaders, because I’m using shaders that are announced to be obsolete and will stop working any time now. But upon closer inspection, seems some mesh references got lost during upgrade. There are some other in-game elements missing, too, some that can’t be glossed over, like the bowling pins. And I still have to do something about the shaders, eventually.\nThis could be useful information (not the shader/mesh stuff but keeping-it-upgraded) to anyone complaining “Why doesn’t this work, anymore?” or attempting to deploy a new app with the assumption they can pay for its development once and then leave it out there forever.\nBut people who should know better forget this, too. I’ve worked at places where they dust off some code every few years and wonder “Why doesn’t this work, anymore?” and on contracts where the client doesn’t want to pay for upgrades and then gets agitated when the two year old app crashes on the latest Samsung phone.\nSure, my Toyota Celica lasted nineteen years(!) but I still took it in for oil changes and other maintenance every six months. Similarly, if you want your software to last nineteen years, or at least a couple, I recommend you take it in for maintenance every six months or so. And maybe release an update while you’re at it.\n","date":"May 19, 2019","externalUrl":null,"permalink":"/blog/programming/softwaredegrades/","section":"Blog","summary":"On thing people not in software don’t realize about software is that software degrades (sometimes referred to as “bit rot”).\nOf course, it’s not that the bits actually rot (although after some years, phsyical digital media does become unreadable, so yay for the cloud, I guess). What happens is that everything else upgrades. For example, I just tried to upgrade HyperBowl to the latest version of Unity, and not for the first time, it came through scathed (they do always warn you to make a backup before upgrading).\n","title":"Software Degrades","type":"blog"},{"content":"You might assume, as a software developer, that my favorite Star Trek characters are the engineers, like Scotty and Geordi. Star Trek does indeed do a good job of showing engineers as real people with full personalities, not half-dimensional geeks who need to be shown what it means to be human (on network TV, that instructional job is typically filled by a young attractive woman).\nThe only complaint I have about Star Trek engineers is their annoying habit of fixing warp core engines in the nick of time, thus leading to poor risk management by Star Trek viewers-turned-engineering-managers the world over.\nBut not for that reason, my favorite Star Trek characters aren’t the engineers. Rather, I sympathize with the not-quite-humans, like Spock and Data. They’re the ones who are always getting lectured on humanity. It reminds me of the liberal arts grads who, with every new Facebook scandal, smugly say if only techies took humanities courses… Hey, news flash: it’s not love of technology behind ethical lapses, it’s love of money, power, ego… the classics. And stop watching The Big Bang Theory (honestly, I find it entertaining, but it’s not a documentary), and stop idolizing Steve Jobs. He was no peach. Give some of that respect to the Woz.\nAlso, as an Asian-American, I empathize with Spock and Data for their identity issues. If Spock didn’t have pointy ears and no one was the wiser about his Vulcan ancestry, maybe everyone would have treated him normally (except during his once-in-seven-years hormonal rages) and not like he’s from another planet (although there was that one time-travel episode where they passed of him off as Chinese…) And if everyone didn’t know Data was an android, instead of constantly explaining the nature of humanity to him, they might have just assumed he was an unhealthily pale, socially awkward, irritatingly precise, cat aficionado. Or an engineer.\n","date":"February 17, 2019","externalUrl":null,"permalink":"/blog/racism/spock/","section":"Blog","summary":"You might assume, as a software developer, that my favorite Star Trek characters are the engineers, like Scotty and Geordi. Star Trek does indeed do a good job of showing engineers as real people with full personalities, not half-dimensional geeks who need to be shown what it means to be human (on network TV, that instructional job is typically filled by a young attractive woman).\n","title":"My Favorite Character Is Spock","type":"blog"},{"content":"","date":"January 30, 2019","externalUrl":null,"permalink":"/tags/chinese/","section":"Tags","summary":"","title":"Chinese","type":"tags"},{"content":"Periodically, I go on a language learning kick, and each time it’s easier, especially now with all the free apps. Right now, I’m cranking through Mandarin with the Memrise app (I’ve lowered my expectations; I’m not going for fluency, just to restore my one-year college course profiency). It reminds me I wrote this blog ten years ago (and got a comment from a Hawaiian shirt store).\nOn a recent tour of LA Chinatown, I was surprised to hear several shopkeepers say “xie xie”, the Mandarin thank you (and just about the only Mandarin I know). I’ve always thought of Chinatown’s as populated with Toison and Cantonese speakers. But maybe they assumed I was a tourist — I was the only one sporting a Hawaiian shirt, shades and a Stargate SG-1 baseball cap.\nEven though utterances of xie xie are wasted on me, it still drives me crazy to hear the pronunciation mangled. It’s not that difficult, setting aside inflection (one battle at a time) — it more or less rhymes with “yeah, yeah”, yet many, like sports reporter Jim Gray during the 2008 Olympics, pronounce it “chichi”, or sometimes “shay-shay”. It was an Olympic highlight for me when IOC president Jacque Rogges pronounced it correctly at the closing ceremonies. But he’s a polyglot.\nI guess once you’re past a certain age, it’s hard to add flexibility to your speech, especially if you’re starting with a strong accent (although I’m sure to some extent accent is in the eye of the beholder — every time I move I’m told I have an accent — a California accent?). I recall in a Wellesley Chinese course (there to meet girls but all I got was slightly improved Mandarin comprehension), a student from the South had a terrible time speaking with precise inflection. Although after living in Boston and Dallas, I’d say Southerners are much better at dropping their accents and speaking TV English than New Englanders (where’d all those r’s go?) Interestingly, among my foreign-born colleagues, the best speakers of accent-less 90210 English are Scandinavian.\nIn a Orange County Computer Society talk on the One Laptop project, Alan Kay, in response to a question about his opinion on bilingual education, said there are studies indicating that learning multiple languages in childhood improves flexilibility in thinking in other areas. So perhaps those English as an Official Language advocates (which strikes me more as a “I don’t want to hear any more Spanish” movement) should worry more about making sure American kids can speak internationally. But if English does become “official” (please, let’s not end up with something like Quebec’s language law), I look forward to the outlawing of text-message spelling (“OMG!”), sportscasters overusing “thus far”, mispronunciations like “nucular”, misuse of words like “systemic” for “systematic”, long-standing mis-words that won’t go away (“irregardless”, “flammable”), and horrendous new ones like “pretexting” and “ginormous”.\n","date":"January 30, 2019","externalUrl":null,"permalink":"/blog/language/howtosaythankyou/","section":"Blog","summary":"Periodically, I go on a language learning kick, and each time it’s easier, especially now with all the free apps. Right now, I’m cranking through Mandarin with the Memrise app (I’ve lowered my expectations; I’m not going for fluency, just to restore my one-year college course profiency). It reminds me I wrote this blog ten years ago (and got a comment from a Hawaiian shirt store).\n","title":"How To Say Thank You","type":"blog"},{"content":"One way to look back and evaluate your progress as an app developer is to look at your app store presence.\nThe most notable new accomplishment on that front for me is finally (I can’t remember how long ago people requested this), getting a Steam version of HyperBowl out.\nI consider it a success in the sense that I made back the Steam submission fee, and the reviews so far have been good. This year’s goal: make an update with more Steam support (leaderboards, achievements…) and maybe more content. But I’m waiting for my next Steam payment first (they don’t crank them out monthly like the other app stores).\nThat makes me one for two on long-delayed ports of HyperBowl. I gave up on the Wii U version, or rather, Nintendo discontinued developer support for the Wii U. I signed up for the Wii U developer four years ago so no excuses (except that the Wii U version of Unity was always behind the main version), so the lesson I got out of it is no more console dev for me. Anyone wanna buy a slightly used devkit?\nAnd the total number of app stores I’m on has remained the same, as I removed HyperBowl from Kongregate. At first, I just tried to unpublish it, as the version there was the old Unity webplayer that is not supported by modern browsers, but when I discovered there was no way to do that myself or even edit or remove the published email address that’s found it’s way onto spam lists, I contacted Kongregate support to remove my account.\nKongregate said I would lose the two dollars I’ve accumulated in revenue, but I said go ahead anyway. What a ripoff — at least when I closed my Fingerprint account after badgering them for six months to pay me, they did pay me. By the way, that’s one of my major 2018 accomplishments!\nIn the continued spirit of cleaning up my store presence, I decided I’m never going to fulfill my initial idea of deploying a hundred apps, so I’m going the other direction. Starting with the App Store, I decided to only leave published a number of apps that will show up in the App Store on a single iPad screen. I haven’t checked th iPhone because I don’t have one. That’s another 2018 event, switching to Android, and this year, maybe I’ll get around to doing some native Android development.\nFor Google Play, I decided to just go with the number of apps that fit on one row in a browser.\nStill, I want to have someplace where I can deploy everything I’ve worked on, or at least everything that’s still running. As a game portal, itch.io works well, particularly with its support for WebGL badge links to mobile app stores, and the ability to customize the pages and arrange your apps as you like (so it’s not quite so important to have everything appear on the screen at once).\nThe only restriction I feel with itch.io is that it’s intended for games and is supposed to host content. So I’m pretty happy with how I’ve got WebGL and desktop versions of my apps on itch.io with links to the app store versions, but, for example, it doesn’t seem appropriate to feature my non-game, iOS-only, Talk Dim Sum app there.\nI do list Talk Dim Sum and everything else on Unity Connect, which I’m using as a comprehensive portfolio/CV.\nUnity Connect has screenshot and video support and links to app stores and social media, but on the other hand, it’s kind of messy and hard to arrange just how you like. So the initial landing page for everything I want you to see is still the Technicat web site.\nI know, it won’t win any beauty contests, but it’s better than Kongregate.\n","date":"January 6, 2019","externalUrl":null,"permalink":"/blog/yearreview/yearinreview2018/","section":"Blog","summary":"One way to look back and evaluate your progress as an app developer is to look at your app store presence.\nThe most notable new accomplishment on that front for me is finally (I can’t remember how long ago people requested this), getting a Steam version of HyperBowl out.\n","title":"2018 Year In Review: App Stores","type":"blog"},{"content":"Despite my not being a Steve Jobs fan, or perhaps partly because of it, I found Walter Isaacson’s bio of Jobs absorbing. In aggregate, it didn’t tell me anything new (Jobs personality, failures and successes are pretty well documented), but it comprehensively filled in a lot of detail, especially from his childhood to his early adult years, and the depiction of his illness is wrenching.\nAs a business study, it is illuminating, covering not just Apple, but Pixar, all the way to its merger with Disney, NeXT, and competing players like Microsoft and Google, although the history lacks some technical insight. For example, it was clear to me and I’m sure others at the time that both Microsoft and Apple had to get over the OS hump (one of my Bay Area commented, core competency-wise, there are some companies that do OSs and Apple wasn’t one of them) from their early PC days; Microsoft ended bringing in people from DEC to get them Windows NT while Sculley unfortunately depended on a partnership with IBM. I always felt he was unfairly maligned (my favorite Macs were from the Sculley era), and he gets the same treatment here (but not as much as Amelio).\nAlthough this book is about Jobs, I find the supporting cast just as interesting, especially his biological sister and his belatedly acknowledged daughter, but also his lieutenants and partners — Ives, Cook, Cue, Forstall….and of course Wozniak (let’s not forget him), who is perhaps as perfect a counterpoint to Jobs as could be conceived even in fiction.\nIn the end, what I find fascinating is not Job’s reality distortion field and his self-assurance that rules applying to everyone else didn’t apply to him, but how people reacted and still react to that. And I’m left with the perhaps the mundane question I can’t shake: how can someone who spent his whole life refusing to put license plates on his car and parking in handicapped parking spots still be allowed to drive? I guess the rules really didn’t apply to him.\n","date":"January 1, 2019","externalUrl":null,"permalink":"/blog/book/reviews/realitydistortion/","section":"Blog","summary":"Despite my not being a Steve Jobs fan, or perhaps partly because of it, I found Walter Isaacson’s bio of Jobs absorbing. In aggregate, it didn’t tell me anything new (Jobs personality, failures and successes are pretty well documented), but it comprehensively filled in a lot of detail, especially from his childhood to his early adult years, and the depiction of his illness is wrenching.\n","title":"A Story of Reality Distortion","type":"blog"},{"content":"","date":"January 1, 2019","externalUrl":null,"permalink":"/tags/monk/","section":"Tags","summary":"","title":"Monk","type":"tags"},{"content":"A few years ago, I wrote about how a history of computer programming would feature women who haven’t received enough recognition (which in itself is a good reason for everyone to learn about the history of computers), most notably Ada Lovelace.\nSince then, I’ve updated my reading, including, most recently, http://sydneypadua.com/[Sydney Padua]’s imaginative alternate-history graphic novel https://en.wikipedia.org/wiki/The_Thrilling_Adventures_of_Lovelace_and_Babbage[The Thrilling Adventures of Lovelace and Babbage].\nI expected a fun read and wasn’t disappointed (how is this not a TV series by now?), but the real treat is all of the real biographical details, much of it original painstaking research, of Lovelace and company (not just Babbage, who perhaps is a cautionary tale for entrepreneurs, but also a cast of characters in their circle and of their time).\nAda also receives an entire chapter (the first chapter!) in Walter Isaacson’s https://en.wikipedia.org/wiki/The_Innovators_(book)[The Innovators], which also sketches the course of her too-short life with its unavoidably juicy details (she was genuinely a “rockstar” programmer). One point I would quibble with is Isaacson’s determination that Ada wasn’t the first programmer, based on the technicality that Babbage the hardware guy obviously knew how to program his computer (if it were ever to be built, that is).\nBut that’s like saying (I hope this is not too tortured an analogy) that the first car driver was the person who first invented the car. Again, technically, yes, but that’s a far cry from a professional driver (race car, Lyft…). Here’s a better and more in-depth explanation from a programmer’s viewpoint.\nShe saw greater potential in Babbage’s design than merely being a programmable calculator. She saw beauty in code and, as Isaacson notes, called programming a “poetical science” (fitting for the daughter of Lord Byron and humanities majors, take note, you’re missing out!). She even predated Alan Turing by a century in pondering the possibility of artificial intelligence (Turing cited her musings as Lady Lovelace’s Objection).\nIsaacson’s book also profiles Grace Hopper (of COBOL fame) and the half dozen or more “Women of ENIAC”, so it would be a mistake to think of Ada as the only woman who was a key figure in computing history, but I think it’s fair to say Ada was not only the first “real” programmer, but also the first computer scientist, and I look forgot to seeing a television series of The Thrilling Adventures of Lovelace!\n","date":"January 1, 2019","externalUrl":null,"permalink":"/blog/history/moreaboutada/","section":"Blog","summary":"A few years ago, I wrote about how a history of computer programming would feature women who haven’t received enough recognition (which in itself is a good reason for everyone to learn about the history of computers), most notably Ada Lovelace.\n","title":"More About Ada","type":"blog"},{"content":"If you’re not a fan of the TV show Monk, then this book may fall flat for you. Then again, you might find the characters quirky and charming. The same could be said of the TV series — the stories were just an excuse to see the characters every week. The author was one of the show’s writers so it’s no surprise that the book carries the same feel — it’s like putting on a comfortable old shoe.\nThe first person narrative from Natalie, Monk’s assistant, at first seems odd, but I think it’s a smart choice. Let’s face it, I liked Natalie on the show, but she wasn’t one of the more interesting characters. This choice not only keeps her from fading into the background but actually pushes her forward as a main character you’re rooting for.\nThere’s some closure also in getting to see Sharon and Randy together — that really felt like it was thrown in at the end of the show. So, just like one of the TV episodes, this was nice, I’m looking forward to the next one.\n","date":"January 1, 2019","externalUrl":null,"permalink":"/blog/book/reviews/monkonpatrol/","section":"Blog","summary":"If you’re not a fan of the TV show Monk, then this book may fall flat for you. Then again, you might find the characters quirky and charming. The same could be said of the TV series — the stories were just an excuse to see the characters every week. The author was one of the show’s writers so it’s no surprise that the book carries the same feel — it’s like putting on a comfortable old shoe.\n","title":"Mr. Monk on Patrol","type":"blog"},{"content":"","date":"January 1, 2019","externalUrl":null,"permalink":"/tags/paul-rand/","section":"Tags","summary":"","title":"Paul Rand","type":"tags"},{"content":"About once a month, someone will present me with an app idea. In general, I don’t want to hear it, I don’t want to sign an NDA to hear it, I don’t want to work on it for free or for cheap, and if you’re worried about me stealing your idea don’t tell it to me. If you tell me about your app idea, anyway, let’s be clear, this is me providing free consulting, not you doing me a favor. And before you describe your idea to me, or pitch it to anyone else, do some homework. Here are some general resources you should look at:\nA quick-start, the book Idea to iPhone, pretty easy to find at your local Barnes and Noble’s, is a great introduction to getting your app realized — from fleshing out your idea to realistically limiting its scope to finding someone to implement it, and finally marketing.\nAssuming you’re targeting the iPhone (despite the competitive market shares, it’s always an “iPhone” idea), visit the Apple developer site and see what’s involved in creating an App Store account. Decide whether you’re going to publish the app in someone else’s account or in your own account.\nIt may be convenient to have the developer you contract publish it in their account, but then you have less control, less branding, and if you switch developers you have to transfer the app to a different account (and there is a mechanism to do that, unlike in the early days of the App Store).\nIf you publish the app in your own App Store account, you have to decide whether to register an individual account or a company account. Both will cost you $99/year, but a company account requires submitting information about the company, including bank info, and can take a few months for approval, whereas an individual account is usually approved almost immediately. So if you want your app listed on the App Store under a company name, don’t dilly-dally, get this taken care of now.\nIn case you didn’t know, there is an app approval process, which can take anywhere from a day to infinity, but typically is a couple of weeks, and apps do get rejected. So you should read the App Store Review Guidelines, which are really more like commandments, lest you invest time and money in something that is sure to be rejected. And, contract-wise, make sure your and the developer consider the situation where the app has to go through multiple submissions and even the case where you have to give up on the app.\nThe tone of the guidelines will also give you an idea of what kind of discourse you may have with Apple in the event of a rejection. Even though this is the kindler and gentler post-Jobsian era, last I checked snobby phrases like “less than very good” permeate the guidelines.\nThe guidelines are general enough to allow for any verdict, depending on the winds of Apple policy. For example, I had some apps built with certain middleware that was rejected for “not enough functionality” but Apple said they would approve them if I added native functionality, with Apple Maps cited as an example each time. So, reading between the lines, I surmised they didn’t want anyone using that middleware, anymore (not the first time that’s happened), and they really wanted to push Apple Maps.\nIf this review process is starting to worry you, consider going with an Android app on Google Play, instead, which does have some guidelines but doesn’t have a review process (though they do boot apps off their store).\nAlso, read the iOS Human Interface Guidelines. Again, you want to keep these guidelines in mind to avoid app rejection, but they are also worth reading as general user interface principles, a legacy dating back to the original Macintosh User Interface Guidelines. Besides, you want Apple to really, really, like your app, even feature it on the App Store and if you hit the jackpot, win an Apple Design Award.\nIf you’re going with Android, read the Google Design Guidelines.\nThe Human Interface Guidelines give you an idea what’s in the toolbox of user interface elements provided by iOS. If you just sketch out the pretty user interface designs you have in your head without regard to the user interface elements that actually exist, either the developer will have to replace and probably redesign most of it (maybe in a way that you don’t want), or it will balloon in cost and possibly never get completed as the developer attempts to literally construct what you’ve spec’d, like a runaway defense project.\nYou’ve come this far, now take a look at the iOS Developer Library. I know, you’re not a programmer, that’s why you’re hiring one, but it doesn’t hurt to learn as much as you can. Think of it like a home renovation project — you’re hiring the experts to do the expert and grunt work, but it behooves you pick up some books at Home Depot and learn the different types of tile and so on, so you know the pros and cons and impossibilities of each option. As an example, one entrepreneur, after meeting me for coffee and asking me to sign an NDA, presented an app idea that involved using the built-in movie player in a manner that the documentation says won’t work. Worst case, you end up paying someone to read the documentation that you could have.\nThere are some good books on app design, for example William Hecke’s Learning iOS Design.pdf, but app design is fairly faddish, so you should look at a lot of apps, especially those similar to the one you have in mind, and see how they look, the color schemes, the layouts and screen arrangements, the user interface elements used…try to analyze why they are the way they are, and if you have something different in mind, whey they’re not doing it that way.\nAnd if you’re on Medium, you should notice one of the popular topics is app design, so there’s no shortage of material on the latest trends (and debates about the trends). But the web articles I find most useful are those describing completed app projects. If you’re making a game, the postmortem articles on gamasutra are invaluable — they present data on the budgets, team size and duration of real projects. If you expect your project to be better, cheaper, faster than every other, well, that’s a nice fantasy world you’re living in, send me a postcard.\nAt this point, you might realize you should scale back your ambitions (or maybe at the point the developer gives you an estimate). Especially if this is your first, app, start simple, as simple as you can. In particular, don’t start with an app that requires a server. If you don’t know what that means, you really shouldn’t have an app that requires a server, but here’s a tip — if there’s any kind of user login, there’s a server.\nRemember, you can always update the app, so you can schedule additional features that way. In fact, the trend these days is frequent updates — Facebook updates every two weeks, Pinterest updates every three weeks…(they even say so in the update notes), and users have come to expect regular updates. Any app that hasn’t been updated in a few months appears abandoned.\nWhich means you should think beyond the initial release of the app and plan for the lifetime of the app and how it will be maintained. If you’re not planning any upgrades, new versions of iOS and new devices appear nearly yearly, so the app may require at the last some touchup to look good or even function at all. Make sure if your developer will not be available in the future that you will be able to hand off to another developer. This means having a copy of the source code that can be reliably compiled. You’ll need this if you want to sell your IP to another publisher.\nOK, I’ve just listed the high-level steps on getting an app done and on the App Store. I haven’t gone into the various devices, screen sizes, graphics that someone will need to provide…but that’s in the reading listed above. And I haven’t gone into marketing or the non-app aspects of apps. For example, a guy in a coffee shop recently told me he wanted to make an Uber-of-X app for $10k. Don’t get me started….Anyway, that’s my free consulting. Time’s up.\n","date":"January 1, 2019","externalUrl":null,"permalink":"/blog/app/soyouhaveanappidea/","section":"Blog","summary":"About once a month, someone will present me with an app idea. In general, I don’t want to hear it, I don’t want to sign an NDA to hear it, I don’t want to work on it for free or for cheap, and if you’re worried about me stealing your idea don’t tell it to me. If you tell me about your app idea, anyway, let’s be clear, this is me providing free consulting, not you doing me a favor. And before you describe your idea to me, or pitch it to anyone else, do some homework. Here are some general resources you should look at:\n","title":"So You Have An App Idea…","type":"blog"},{"content":"Just before the last dot-com crash and housing recession, I decided yeah, sure, my home value has gone up awfully fast, but instead of selling immediately, I’ll plunk down a big chunk of cash on a home remodeling project. So I ended up waiting another six years to sell. But I did end up with a nice bathroom and this essay.\nIt’s been a couple of years since I’ve heard of any cool new names for software methodologies now, I know a lot of us prefer to spend our time talking about coding than actually coding, so here I’d like to propose “software remodeling”, for no good reason — it has “model” in it, and anything starting with “re” has potential (“refactoring”, “reification”,…)\nBut the real reason a software-remodeling metaphor comes to mind is my recent bathroom renovation project. I decided to practice some risk management (the primary risk being by total ignorance in this area) by going with Expo,(the deluxe arm of Home Depot) as the primary vendor — they perform the design, supply the materials, and handle the remaining subcontracting.\nAt first, it went swimmingly. There was the pre-design walkthrough with the designer and primary contractor, where the latter made some persuasive suggestions that increased the scope of the project. The designer showed me all the really nice-looking stuff they sell at Expo, deduced what I wanted, and sketched out nice design which involved completely demolishing my bathroom. OK, originally I’d just wanted a new bathtub with some nice tile, and the new estimate exceeded my initial budget by more than fifty percent, but what’s a little feature creep?\nThe process appeared rigorous. The materials dropped off were accompanied by an Expo rep who opened every box to check that everything arrived in good condition. He found a tiny nick on the toilet that I probably would have overlooked, and he insisted on marking it for exchange. At the pre-demolition meeting, the primary contractor placed a workbook containing all of the design sketches, material lists and a sign-in sheet for every contractor to record his visit. I was so impressed, I told the primary contractor their process was vastly better than any I’d seen in software development.\nAnd then demolition began.\nThree months later (and six months after commissioning the project), I decided I was wrong. Their process sucked just as much as any software process.\nDespite the materials inspection, a third of the items turned out to have problems. The shower grab bar was actually a towel bar — somehow the box had the right part number for a grab bar yet was labelled correctly as a towel bar, which would have come right off the wall after some use. The box containing the ceiling fan was missing half its components. The bathtub turned out to be the wrong bathtub (again right box, wrong contents) — since it didn’t have a side access panel, the contractors ended up knocking a hole in the bedroom wall next to the bathroom.\nSome components didn’t fit with each other — the shower head turned out to be incompatible with the rest of the plumbing. Some components didn’t fit the room — the vanity shelf when installed covered a power outlet. After installing beautiful tile floor-to-ceiling there was an ugly cement-looking strip that could not be covered with a rounded or corner strip of tile because (it was realized a bit late) that the drywall was curved and the exposed line varied too much in width (satisfactory kludge — paint it white like the rest of the untiled wall).\nAnd the schedule. Most of the guys who dropped in didn’t bother to tell me when the next group would come by. The ones who did tell me that the next step would take place in a couple of days were wrong. Sometimes weeks would go by, during which I had a big pile of dirt in my front patio waiting to be mixed into cement (the neighborhood pets started using it as their toilet — I just hope I don’t have pet excrement mixed behind my shower tile). Some signed the workbook log, some didn’t. I think some forgot which primary contractor they worked for on this job — a couple of guys showed up in Lowe’s shirts.\nAnd oddly, even when they showed up without enough information, they were extremely reluctant to call primary contractor for clarification. When the city inspector left a cryptic note stating that something needed to be sealed better, the contractor who came by later asked me for clarification, I shrugged, and he ended up hammering down everything in the bathroom that looked like it might be the culprit.\nThe wrap-up was less than rigorous, too. If I hadn’t asked about the water being too cold and the remaining hole in the bedroom wall, I’m not sure they would have noticed/remembered (it’s probably a good thing I mentioned the water before the hole — they need the latter left open to access the plumbing). And I didn’t realize that the motion-sensor control for the light (required by city code, apparently, for energy saving) had a very short timer, less than a minute (so if you plan on spending a lot of time on the toilet, be prepared to flail your arms around).\nSo much for all the meetings, specs, and checklists. Still, despite the less-than-smooth finish, a couple of months late, the project did come in under the initial estimate — there were a few extra costs, but more materials that turned to be unnecessary and thus returned. And, though I thought I was just keeping up with the Joneses, turns out, after giving some neighbors a tour, I may have the best bathroom in my condo complex. All in all, I’d still have to say it came out ahead of most software projects!\n","date":"January 1, 2019","externalUrl":null,"permalink":"/blog/programming/softwareremodeling/","section":"Blog","summary":"Just before the last dot-com crash and housing recession, I decided yeah, sure, my home value has gone up awfully fast, but instead of selling immediately, I’ll plunk down a big chunk of cash on a home remodeling project. So I ended up waiting another six years to sell. But I did end up with a nice bathroom and this essay.\n","title":"Software Remodeling","type":"blog"},{"content":"Perhaps my favorite thing about the San Francisco airport (with the food court dim sum a close second) is the San Francisco Museum of Modern Art store in the International terminal. I try to always stop there and pick up a design book that would be hard to find in my local Barnes and Noble (not to mention Crown Books, which is almost the only other bookstore where I live).\nOn one of my recent trips through SFO, I snagged Paul Rand’s Thoughts on Design. This is a small book, less than a hundred pages, largely with graphics (naturally), and it starts off with fairly general pronouncements, but there’s some good stuff once it gets going, in particular some directives I haven’t seen before, like making use of repetition, and avoid choosing a font style correlated with the subject (e.g. the cliche of “chop suey” lettering).\nI wouldn’t say this is a must-have on your designer bookshelf, but, hey, it’s Paul Rand.\n","date":"January 1, 2019","externalUrl":null,"permalink":"/blog/book/reviews/thoughtsondesign/","section":"Blog","summary":"Perhaps my favorite thing about the San Francisco airport (with the food court dim sum a close second) is the San Francisco Museum of Modern Art store in the International terminal. I try to always stop there and pick up a design book that would be hard to find in my local Barnes and Noble (not to mention Crown Books, which is almost the only other bookstore where I live).\n","title":"Thoughts on Design","type":"blog"},{"content":"That’s my Chinese name, and I’m writing this mostly so I can remember it and I can better play the “What’s your Chinese name” game when I go out for dim sum.\nI’ve always had a copy written down, but what’s happened over the years is I’ve found a ratty copy of my name and then retranscribed it on a fresh piece of paper, and because I don’t actually know how to write Chinese characters, after a few iterations it becomes gibberish.\nBut I recently found a correctly written version, probably provided by my mom, and this time I got it onto my computer via a torturous sequence involving the camera and handwriting features in Google Translate, as I don’t know how to use a Chinese softare keyboard, either.\nI think I can be forgiven for not remembering my surname 徐, as the English spelling of my surname Chu is not particularly close to the Cantonese pronunciation “chèuih” or the Mandarin pronunciation “xú” (my dad told me people in mainland China also had trouble figuring out his name).\n徐 is not one of the top ten Chinese surnames, but it is number eleven, and the same name as the Hong Kong filmmaker Tsui Hark, so that helps.\nAs for the rest of my name, which is used as my English middle name, the English spelling “Hung-en” bears only a vague resemblance to the Cantonese pronuncation “wàhng yān” but is pretty close to the Mandarin pronuncation “hóng ēn” (which is weird since my father’s side of the family is Cantonese).\nMy mom said they made a slight mistake choosing that name, should have been something slightly different. I’m thinking it might have been 宏願 (wàhng yuhn in Cantonese, hóng yuàn in Mandarin, means “great ambition”), but I’m just guessing. Anyway, my current name is on my drivers license and other docs, so I have no plans on changing it.\nAlthough enough people misspell my first name “Philip” (bankers and baristas: somehow it often turns into “Phillip” on my bank statements and I’m amazed when I see “Fil” or “Fill” on my coffee cup) or see I’m Asian and start calling me “Chu” as if it’s my first name (or only name, like “Cher”), I think, well, maybe renaming isn’t a bad idea.\nFor example, someone thought I was “Dan” the other day and I tried it out in my head for a while, Dan, Danny, Daniel, Daniel Day-Lewis, Daniel Dae Kim. Not bad. Keep ’em coming.\n","date":"January 1, 2019","externalUrl":null,"permalink":"/blog/language/mychinesename/","section":"Blog","summary":"That’s my Chinese name, and I’m writing this mostly so I can remember it and I can better play the “What’s your Chinese name” game when I go out for dim sum.\n","title":"徐宏恩","type":"blog"},{"content":"As much as I complain about Americans acting like I’m an immigrant (and it’s not just white Americans — recently an African-American asked “What’s your nationality?” and a New Yorker of Puerto Rican descent attempted a visual DNA analysis when I showed her some family photos), actual immigrants are among the worst offenders.\nRecent Asian immigrants want to nail down exactly what kind of Asian I am, and if they’re Chinese, watch out, I might get a lecture on how I should know Mandarin and I owe fealty to the motherland. Back when I was active on Quora, I saw a doozy of a question, where someone who was working here on a visa asked why his non-white coworkers ate American food when they went out to lunch and looked uneasy when he asked them why they didn’t display their “home culture” in public, if it was “taboo” to do so. This is how I answered:\nThey’re uneasy when you ask such questions because it sounds like you’re making assumptions based on stereotypes. I was born here, but since I’m Asian American I still have random people welcoming me to America, asking me how long I’ve lived here (I give them my age, but they usually don’t get it), what’s my nationality (I doubt if I asked any white person that question they’d respond with their ancestral European country), and telling me how nice and hard-working the Chinese are. I don’t even speak Chinese, and I’m first-generation. Even my parents, who are from Hong Kong, have lived here most of their lives by now. How we act in public is how we act at home, including when we celebrate Thanksgiving and Christmas. If you look at my house, it doesn’t look different from any other American house (except perhaps a slightly better appreciation than average for Asian food, which I buy at Trader Joe’s). Now, if this bugs me, imagine how someone who’s ancestors came here generations ago feels. And consider that there’s a history of discriminating against people because of their apparent ancestry and considered less American for those reasons. No one’s going to appreciate someone saying, hey, despite how you’re acting, I know you’re different, tell me how different you really are, do you have a secret handshake? Especially in the workplace, where some people have to wonder, did I not get that promotion because… Now of course, there are a variety of cultural influences here and people with differing backgrounds, and it’s really nice to see the mix — here in California you can get Korean tacos, for example. That’s one of the great things about this country. Just don’t try to make people into something they aren’t.\n","date":"October 4, 2018","externalUrl":null,"permalink":"/blog/racism/questionsyoushouldntask/","section":"Blog","summary":"As much as I complain about Americans acting like I’m an immigrant (and it’s not just white Americans — recently an African-American asked “What’s your nationality?” and a New Yorker of Puerto Rican descent attempted a visual DNA analysis when I showed her some family photos), actual immigrants are among the worst offenders.\n","title":"Questions You Shouldn’t Ask Your American Non-White Coworkers If You’re On An H-1B Visa","type":"blog"},{"content":"I won’t say I was exactly guilted, but after seeing a nice thank you YouTube video from my class scholarship recipient, I thought maybe I should actually donate. I didn’t see a class scholarship fund on the MIT alumni site, but there’s a page of other categories, and I was pleased to see an Undergraduate Research Opportunities Program (UROP) fund.\nThe UROP program was my favorite part of MIT, except possibly working on my bachelor’s thesis. But the thesis didn’t pay, and the fact that UROP positions are paying jobs was key. If I wasn’t on financial aid (an assumption of part-time income is part of the package), I would have joined Project Athena and been on the forefront of Unix, workstations, and local area networking.\nSo, instead, I spent my freshman year and summer as a word processor (meaning I typed on a word processor workstation transcribing from a professor’s voice recorder), Mac lab admin, technical press release writer, and rep at the MIT Microcomputer Center, which was run by a horrible person who didn’t pay me all summer and then got a recommendation for a cushy academic job elsewhere. This experience and other inefficiencies I saw in the campus bureacracy, by the way, is why I’ve been reluctant to donate all these years.\nBut anyway, I got a couple of UROP projects that spanned the rest of my undergrad years. I didn’t actually perform any research, but I wrote code that was used (a wire-frame display for computer vision research and a display for the semantic net generated by a natural language parser). And I did that work in the world famous MIT computer science and AI labs, soaked up the atmosphere, listening to and even talking to world famous researchers (although actually I talked to Marvin Minsky when he called the Micro Center to ask about a Mac).\nHowever, after I submitted my donation, the resulting page said this: Image for post Image for post\nAnd below that it also listed the UROP fund. So I’m really not sure where that money is going. Did I mention there are some inefficiencies in the campus bureaucracy?\n","date":"September 6, 2018","externalUrl":null,"permalink":"/blog/mit/urop/","section":"Blog","summary":"I won’t say I was exactly guilted, but after seeing a nice thank you YouTube video from my class scholarship recipient, I thought maybe I should actually donate. I didn’t see a class scholarship fund on the MIT alumni site, but there’s a page of other categories, and I was pleased to see an Undergraduate Research Opportunities Program (UROP) fund.\n","title":"I Think I Donated to UROP","type":"blog"},{"content":"It’s been a while since I read that John McCain\u0026rsquo;s autobiography, but what stuck with me was his capture, imprisonment and torture for over five years during the Vietnam war and his refusal to be released for PR purposes before his fellow prisoners. It amazes me that he professes no hard feelings for most of his captors (except one sadist he’d probably still punch out if he got the chance).\nI also liked how he admitted to and took responsibility for what he saw as his failings, including poor behavior as a student, the failure of his first marriage and breaking under torture to give a false confession (although obviously you can’t blame him for that).\nOf course, I don’t agree with Senator McCain on all his politics (otherwise I’d be a Republican), but I admired him enough I might have voted for him in his presidential campaign if he hadn’t selected Sarah Palin as his running mate (dealbreaker). Certainly I would have preferred him over George W. in his earlier run.\nThe reason I’m writing this now is because this is Purple Heart Day, and it seems like an appropriate occasion to keep the word “hero” in perspective. Some were calling McCain a hero for his no vote on the Republican “skinny repeal” health care bill. Well, first he was called a hero by fellow politicans when his current cancer situation was discovered, then not a hero by those aghast at his return to vote yes on “consideration” of the Republican health care bill, and I saw one tweeter say the North Vietnamese guards who tortured him were heroes (which just goes to show there are always dumbasses on any side of an issue), and then back to hero again (and possibly Machiavellian genius), with some pointing out that actually the two Republicans who consistently voted no from the beginning were the real heroes.\nSenator McCain is a hero for his service in the Vietnam War. Voting in the Senate and voting his conscience is his job, as it is for every Senator. Giving (and taking back) the term “hero” in this context disrespects the real risks and sacrifices he and others have made in life-threatening conditions and shows how far our standards and expectations have dropped.\n","date":"August 7, 2018","externalUrl":null,"permalink":"/blog/book/reviews/johnmccain/","section":"Blog","summary":"It’s been a while since I read that John McCain’s autobiography, but what stuck with me was his capture, imprisonment and torture for over five years during the Vietnam war and his refusal to be released for PR purposes before his fellow prisoners. It amazes me that he professes no hard feelings for most of his captors (except one sadist he’d probably still punch out if he got the chance).\n","title":"Faith of My Fathers","type":"blog"},{"content":"","date":"August 7, 2018","externalUrl":null,"permalink":"/tags/war/","section":"Tags","summary":"","title":"War","type":"tags"},{"content":"You can now reach this blog via itshardtofondlepenguins.com There’s no good reason: I collect domain names like I collect app ideas. There’s no way I’m going to do anything with more than a few of them. But still, sometimes I fancy a name, and yearly registration is less than the cost of…well, almost everything else. So I register them on a whim and then try to figure out a use for them, like pointing to my Medium page.\n“It’s hard to fondle penguins” is an inside joke interpretation of MIT’s informal motto acronym “IHTFP” (though I’m sure it’s hardly exclusive to MIT). ihtfp.com was already taken, so I registered itshardtofondlepenguins.com, breaking my rule of only registering domains that are easy to type. I made that rule after working at a startup with digitalchameleon.com and discovering no one knew how to spell chameleon. So maybe it’s just a spelling rule.\nSome of my other domains:\nphilipchu.com — Again, not my first choice. I would have preferred philchu.com which is shorter, and for some reason, a lot of people misspell Philip (sometimes two l’s, and sometimes starting with an f, believe it or not). But there are a lot of Philip Chu’s, so I still lucked out.\ntechnicat.com — that was my first domain, picked because I needed a name for my first domain. Yet again, it wasn’t really my first choice — I wanted technocat.com, which was taken, but by now I think technicat is just as good or better.\nfugugames.com — because I was watching a Food Network segment on fugu (the poisonous Japanese puffer fish delicacy) and thought that would make a good game label. Tasty, with a hint of danger. Also, I liked the alliteration.\nslowgamer.com — because I’m a slow gamer. Ask any game designer or tester I worked with.\nillusivity.com — this was a domain name I picked as a replacement for digitalchameleon.com after a lawyer representing a Canadian comic book colorist sent us a letter. I registered it for myself recently when I saw it available because I still like it, although I have no memory of how I came up with the name.\nomoapps.com — like fugugames, you can blame TV for this one. I watch a lot of Korean drama, and the characters often utter “Omo!” which is kind of like OMG. So I just thought omoapps sounded cool.\nwholebraingames.com — another game domain, this one is a form of protest against one of my pet peeves, people talking about left-brain vs. right-brain. I’ve even seen an HBR Review article on it, but it’s unscientific and the type of stupid thing that right-brained people like to indulge in. Just kidding. But really, it is stupid. Also, I like how wholebraingames sounds.\ntalkdimsum.com — this is the closest one to a rationally derived domain name. I have an iOS app that helps people order dim sum by displaying photos and descriptions of dim sum dishes and providing Cantonese text-to-speech so they can practice pronouncing the dishes. So I called it Talk Dim Sum.\nI have a few more, but some of them fall out of favor and I just let them expire. The ones above I still have hopes for.\n","date":"July 10, 2018","externalUrl":null,"permalink":"/blog/mit/itshardtofondlepenguins/","section":"Blog","summary":"You can now reach this blog via itshardtofondlepenguins.com There’s no good reason: I collect domain names like I collect app ideas. There’s no way I’m going to do anything with more than a few of them. But still, sometimes I fancy a name, and yearly registration is less than the cost of…well, almost everything else. So I register them on a whim and then try to figure out a use for them, like pointing to my Medium page.\n","title":"It’s Hard to Fondle Penguins, and Other Domain Names","type":"blog"},{"content":"The recent comparisons of the family detainment and separations at the border with the Japanese-American internment during World War II, reminded me of a nearly decade-long complaint I’ve had with the city-comissioned hour-long centennial video of Huntington Beach, which for some reason included a short segment on the internment, right around the 25 minute mark.\nDespite the wording of this notice displayed briefly in the segment, the narrator of this pseudo-documentary only described the detainees as “Japanese residents” and “immigrants”, and that the loyalty of said immigrants was a question that could not be answered. Not that entire families were imprisoned in desert camps behind barbed wire, most of them American citizens.\nAfter my last complaint sent directly to City Hall, they said I was the only one who complained, but because of my complaint, they would stop airing the film on the local public channel. But it’s still on the city web site, so the complaint stands.\nIt just goes to show, there are people who still justify the internment, go out of their way to make videos justifying the internment, and those people are in government. It also goes to show there are people willing to help out in the production of those videos for a paycheck (I complained to the narrator of the film, and he said he totally agreed with me but he wasn’t the writer).\nI was blogging my complaints back then, too, so here a couple on this issue from nine and eight years ago. Sucks To Be Them\nSince I only have six working TV channels, one of which is the Huntington Beach city channel (HBTV), I’ve been catching snippets of 100 Years of Huntington Beach, basically a pleasant trip down memory lane including reminiscences of the city’s first beach concession, the introduction of surfing, yada yada. But I was appalled by the segment mentioning the internment of local Japanese-Americans (including citizens and whole families) during World War II. It came off as: the General had a tough decision to make, and he made it. Followed by a resident remembering a nice boy she wanted to date before he got sent off to the camp. Oh, well. Sucks to be them.\nSo I sent a semi-snippy suggestion to the city that they edit the film to remove that segment, if they couldn’t do the topic justice, and received this prompt, polite and not altogether satisfactory reply:\nThank you for your thoughtful comments regarding the history video. I know we tried to include it as part of the history of Huntington Beach. I will share your concerns with others in leadership in the community. The program is featured on our government channel, website and was shown on KOCE. We have also distributed hundreds of copies to individuals, middle schools and high schools. Yours is the first “negative” comment we have received and I can assure you people of all different backgrounds have viewed the video. Thanks again for your input.\nNo-one-else-complained-about-it is the type of reply I used to get from apartment landlords, and it’s pretty weak as an academic argument. We-already-distributed-it-to-a-bunch-of-students is just upsetting. I don’t remember getting any of this subject when I was in school — I hope there isn’t a whole generation of kids who are learning that sending American citizens to live behind barbed wire because of their race was a “difficult choice”.\nAnd aside from portraying it as a debatable decision (I thought we were beyond that, like the debatability of separate-but-equal and anti-miscegenation laws), the segment was light on facts, not mentioning that the governer and President supported it, that it only took place in California and not even Hawaii where Pearl Harbor happened, and that many had their land usurped by unscrupulous neighbors.\nFinally, I can’t believe all the “different backgrounds” included anyone who’s family was affected by this, or, say, Arab/Muslim/Persian Americans who might consider this type of thing could happen to them. (If there’s ever a war with China, I guess I better get packing). The HB centennial program includes a couple of talks on the internment, one from the last baby born inside the camp, so surely some people in the city government know better.\nWhoever’s in charge of that film could take a cue from Ken Burns, who adjusted his documentary The War after complaints that he failed to depict Latino-Americans. He said afterward that the film was just as good after the change, although in some odd logic he said that validated his original methods — c’mon, you’re a media guy, just admit you’re a product of culture just like everyone else. I grew up with 70’s television, and the only minorities I remember from then is Speedy Gonzales, Pat Morita speaking fake Chinese in Happy Days, various African-Americans on the wrong side of the law in cop movies, and Bill Cosby. And in this supposedly post-racial time, the situation isn’t a lot better — TV land is by default white.\nThe War also has extensive treatment of the internment and the Japanese-Americans who volunteered anyway to fight in Europe and suffered terrible losses there. If Ken Burns isn’t your cup of tea, you can listen to George Takei talk about it on this web site, or just google “Japanese internment” — there’s plenty of information. Fred Korematsu Day\nA couple of weeks ago, Gov. Schwarzenegger designated September 23 as Fred Korematsu Day, recognizing his civil rights leadership in resisting the Japanese-American internment of World War II.\nMeanwhile, here at Huntington Beach public library , I picked up a copy of the 100-year Huntington Beach documentary published by the local historical society, which cheerfully notes how the chili crop production dipped during the war because the Japanese-American farmers were interned, but otherwise life went on as normal. And the book profiled a local Japanese “immigrant” who was interned (failing to elaborate that citizens were also interned), quoting him as saying “it had to be” (I’d like a second opinion on that translation), noting his “associates” (his poker buddies, or everyone of Japanese descent on the west coast?) were well-treated by their neighbors (except perhaps the Fountain Valley residents who didn’t want a Japanese-American soldier buried near his family’s home after he’d been drafted from camp to serve and be killed in Europe) and some were even offered the option to move inland (the interment sounds like a time-share presentation). Nothing about how that whole internment thing was a really bad idea (there were some who did object — the Orange County Register, Ansel Adams, and, oh yeah, the 120,000 sent to live behind barbed wire).\nI had earlier complained to City Hall about the documentary they were broadcasting on local cable, but it turns out that was just a faithful rendition of this book. I just want to hear a “My bad, we didn’t know what we were talking about” but so far I’ve only heard “There’s nothing wrong with it”, “A diverse group of community leaders approved it” (have you seen the candidate roster this election? It’s blindingly white), and, horrifyingly, “It’s been sent to local schools”. Nice to know that when the next generation takes over, if there’s a war with China, I’m headed off to “camp” even though I’m an American-born citizen. I’m also descended from Muslims on my father’s side, so I’m doubly screwed (I assume those who are determined to think Pres. Obama is a Muslim would think I am, too). But gosh, I hear everyone was treated really well in those camps, so let me pack my bags!\n","date":"June 25, 2018","externalUrl":null,"permalink":"/blog/racism/huntingtonbeachhistory/","section":"Blog","summary":"The recent comparisons of the family detainment and separations at the border with the Japanese-American internment during World War II, reminded me of a nearly decade-long complaint I’ve had with the city-comissioned hour-long centennial video of Huntington Beach, which for some reason included a short segment on the internment, right around the 25 minute mark.\n","title":"The Huntington Beach History of Surfing and Japanese-American Internment","type":"blog"},{"content":"So, word on the street is that Google removed it’s famous “Don’t be evil” rule from their code of conduct, coincidentally or not after some employees objected to some defense work.\nI’m surprised the clause has been there all this time (and that it’s taken this long for employees to take it seriously). I wrote this years ago when Google first started operating in China:\nFriday night, on the News Hour with Jim Lehrer, in a segment on the impact of the Internet on China, the head of Google China, Kai-Fu Lee, was asked about Google’s agreement to filter (a polite euphemism for “censor”) their search results as a precondition for Google’s presence in China. He responded with that Google had to comply with local law and it was “better to provide information than not”. — he didn’t say exactly who it was better for, but I assume he meant the company line that it was better for the people of China.\nTo be fair, Yahoo and Microsoft should have undergone similar questioning, in particular how Yahoo feels about handing over the identity of a blogger to the Chinese government, which subsequently imprisoned the blogger for his criticism. (Microsoft has just censored bloggers, with the same justification — compliance with local laws)\nBut that just points out one fallacy of Google’s justification. The Official Google Blog post on the subject doesn’t mention any competitors in China at all, either the usual US rivals or the burgeoning Chinese ones. It gives the impression of “no google, no search”, although it does start off presenting the problem as a customer service issue — people in China are already using Google, but with some downtime and missing results (I assume much of that due to the Chinese government’s standard censorship mechanism — so in effect Google is offering to do a better job of that)\nThe central part of the blog post gets into the usual idealistic rationalization that it’s better for everyone (in this case, the world) to engage and spread this wonderful information revolution, even with compromises. It reminds me of the waning arpartheid days in South Africa when many of my classmates at MIT (but not apathetic me) demonstrated for MIT do divest its holdings there, and the administration felt it wasn’t appropriate to use moral criteria in making financial decisions (currently still echoed by Jim Cramer on Mad Money when he’s pushing a tobacco stock).\nI’m sure this rationalization was sincere — my freshman adviser, David Saxon, the President of MIT, often generously invited his advisees to his penthouse dinner parties, during one of which he asked us our opinions on this matter, and he seemed genuinely conflicted over the issue. And he had been one of the academics who’d lost his job during the McCarthy years for refusing to sign an anti-Communist loyalty oath and was a dean at UCLA during Vietnam War protests (he recounted at a party how Lew Alcindor, later Kareem Abdul Jabbar, had overturned a small campus vehicle and everyone was nervous about the resulting leaking fuel).\nSo, OK, it’s not an easy issue, but would all those companies be so eager to spread the Digital Word in China if they didn’t think it would lead to a lot of profits in the future? At the end of the Google blog post, the word “investment” sneaks in, and mention of the how “dynamic” and “important” China is. Finally, we cut to the chase. If it was all about altruism, you’d see similar concerted efforts in regions that really need it (there are several international Official Google Blogs, but none for Africa). In math parlance (which the Google founders speak far better than I), the profit motive is a “necessary condition” — if there are no other constraints, than it is a “necessary and sufficient condition”. So I wonder which it is?\nIt’d be nice to have an honest statement: “We’re a publicly owned company, and even though our motto is “don’t be evil”, we have a responsibility to our shareholders, our rivals are already in China, and we’re afraid of getting left out. So we’ve agreed to comply with censhorship of our search results, but we don’t want to put people in jail, so we haven’t moved our mail and blog services over” There, was that so hard?\n","date":"May 18, 2018","externalUrl":null,"permalink":"/blog/politics/dontbeevil/","section":"Blog","summary":"So, word on the street is that Google removed it’s famous “Don’t be evil” rule from their code of conduct, coincidentally or not after some employees objected to some defense work.\n","title":"Don’t Be Evil (just a suggestion)","type":"blog"},{"content":"","date":"May 18, 2018","externalUrl":null,"permalink":"/tags/google/","section":"Tags","summary":"","title":"Google","type":"tags"},{"content":"During a twitter thread complaining about game publishers, I interjected that pirates are the worst publishers, as they publish your work without permission and make money off it without giving you a cut.\nBut sometimes publishers are the worst pirates, when they make money off your work without paying you, and after suckering you into providing custom builds for them. At least regular pirates don’t involve you in the process.\nFor example, I went into angry letter mode with a publisher, recently, doing my best impression of the “I want my two dollars” paper boy in Better Off Dead (or alternatively, Glenn Close’s “I will not be ignored” in Fatal Attraction):\nThanks for getting back to me with an update, but that’s after three emails to accounting, two to support and one to the CEO. The total amount is not much (it will just cover the amount I spent on an Android tablet to test, a Samsung Kids subscription to try out HyperBowl there, and the royalties I owe the HyperBowl IP licensor), but I noticed there was no promotion of the app from Fingerprint (a tweet would have been nice) and for some reason it wasn’t uploaded into the Game category, I don’t know why it was removed from Samsung Play in December (I think the contract expires at the end of this year, if I remember correctly), and the several other variations of the app I provided to QA were never deployed as far as I know. So combine that with no payment for over a year and the difficulty getting an explanation or update, I have to say this is my worst experience with an app publisher (except maybe Handster which deployed my apps without telling me, but at least I didn’t have to prepare any customzied builds for them), and it was a mistake signing up with Fingerprint (at least without requiring an advance payment).\nWell, it was my mistake for replying to a “We want to publish your app!” email that didn’t identify the app, and my mistake in not requiring an advance payment. Call it a “We’re not pirates” deposit.\n","date":"May 8, 2018","externalUrl":null,"permalink":"/blog/app/publishersaretheworstpirates/","section":"Blog","summary":"During a twitter thread complaining about game publishers, I interjected that pirates are the worst publishers, as they publish your work without permission and make money off it without giving you a cut.\n","title":"Publishers Are the Worst Pirates","type":"blog"},{"content":"When I first got HyperBowl running on Android several years ago, a South Korean publisher paid me a $300 advance to publish it in Asia. It took some time to add Korean localization (which they supplied), and the sales did not result in any royalties (probably because Google Play started operating in South Korea not long after), so really, the advance just covered my time. But in retrospect, I failed to appreciate how nice it was to get an advance.\nI did get a much larger advance from Apress to publish my Unity book, but that wasn’t really an advance, and certainly not the type of book advance you hear about where writers can quite their day job and hole up in a cabin for six months to write. It’s really more a series of payment installments for deliveries of the chapters, which in my case took a year, and that is deducted from future royalties. Not only is there no payment until work is done, they take their sweet time paying you. And since the advance was split into installments and they rounded down each payment, they still owe me a penny (pro tip: make sure your advance divides into its installments evenly).\nBut at least they paid something, and they paid eventually. I’m still waiting to see a check from Fingerprint. When they sent me an email about publishing my apps on Samsung Kids, I asked them which ones, and they replied HyperBowl and its variations, so I figured maybe that wasn’t some mass email and they’re legit. I thought about asking them for an advance (I was kind of hoping they’d bring it up first), but hey, it’s for kids, and it’ll be on all Samsung devices!\nBut now it’s been over a year, and while I get nicely formatted royalty reports from their accounting department with exciting news about what the company is up to, I have yet to see a check. The answer to my first inquiry said a check will be on the way (actually it said “we will start sending out checks…” which is odd phrasing that makes me wonder if they’d never sent checks before), but the next two inquiries resulted in dead silence.\nHonestly, even if I got paid, I would only recoup the money I spent on buying a Samsung tablet and signing up for Samsung Kids. Maybe if they’d done some marketing for HyperBowl (I mean, they do have a twitter account) and placed HyperBowl in the Games category instead of non-Games for some reason, revenue would be higher. Or maybe not, but that’s just more reason I should have asked for an advance. Well, next time.\n","date":"March 7, 2018","externalUrl":null,"permalink":"/blog/app/getanadvance/","section":"Blog","summary":"When I first got HyperBowl running on Android several years ago, a South Korean publisher paid me a $300 advance to publish it in Asia. It took some time to add Korean localization (which they supplied), and the sales did not result in any royalties (probably because Google Play started operating in South Korea not long after), so really, the advance just covered my time. But in retrospect, I failed to appreciate how nice it was to get an advance.\n","title":"Get an Advance","type":"blog"},{"content":"Over ten years ago, I retired the first email address I set up for my game dev business because of a constant stream of spam (I think due to it being listed in gamasutra) but every once in a while I have to reactive it temporarily to do some business and then deactivate it again before my inbox fills up with spam again.\nI had to do this again last night (for some reason I was still using that email address for Steam), and sure enough spam started coming in. Last time I complained about a spammer, they demanded I show them proof and threatened to hire a lawyer, so I’m going to try to keep copies around from now on.\nSo, at the risk of giving them free advertising, here’s a company that apparently has been mass emailing me for maybe the last fourteen years.\nHi Good morning. Hope the New Year started well for you. Just checking if you have any projects planned for this year that might need help in terms of 2D \u0026amp; 3D artworks \u0026amp; animation, 3D product visualization, VR developments, video presentations, rich interactive applications and games on various platforms like PC, Web, Console and Mobile. We are a group of creative professionals with extensive industry experience over last 17 years. Mr. Anil Saraswathy, CTO of InApp is based out of our California office now. On your convenient date/time, we would like to arrange a meeting with to provide a brief introduction about our company and services. Please visit below links for sample applications\u0026hellip;\n","date":"January 24, 2018","externalUrl":null,"permalink":"/blog/spam/spamarchives/","section":"Blog","summary":"Over ten years ago, I retired the first email address I set up for my game dev business because of a constant stream of spam (I think due to it being listed in gamasutra) but every once in a while I have to reactive it temporarily to do some business and then deactivate it again before my inbox fills up with spam again.\n","title":"The Spam Archives","type":"blog"},{"content":"Well, the country went backwards last year, but let’s talk about me: 2017 was the year I got organized.\nNew Web Site # My technicat web site has gone through a lot of incarnations, from its 90s beginnings (blinking text!), a good stretch using Forrest, a few different static templates, and wandered around on different blog sites after I stopped self-hosting on ISPs. But last year, I moved it to a Github page and found a Jekyll template that provided a clean look on desktop and mobile.\nIt won’t win any design awards, but I’m satisfied with it so far, it’s easy to maintain, and it shows I’m hip to git.\nNew Platforms # I thought I would catch up on all the platforms that I’ve been meaning to port HyperBowl to (basically, all the platforms that Unity supports), but after getting HyperBowl running on tvOS, Apple rejected it for, well first, blargle blargle blargle, but I kind of got them to sort of hedgily clarify they didn’t like seeing the portrait window embedded in a static fullscreen background. And then Apple started rejecting updates to the Mac App Store version for the same reason and then a bunch of other reasons, so I decided to take my toys and go home by unpublishing it. One step forward and two steps back.\nBut I did get HyperBowl on the Windows Store, so I pretty much broke even in the platforms department.\nNew Portal # While getting a handle on all the platforms, I decided to focus on using itch.io as my main game portal. It’s developer-friendly, has a pay-what-you-want feature, supports app store links, and is fairly polished.\nHowever, I had trouble getting the WebGL version of HyperBowl running there, so I have that on GameJolt, instead. Besides, I like GameJolt (also developer-friendly), so it’s nice to still have something there.\nNew Portfolio # After complaining forever about LinkedIn, I finally removed my account. Conveniently, Unity Connect showed up, and it looks to me like it’s Unity’s version of LinkedIn with some portfolio support and a job market. I’m not that interested in the social features (LinkedIn’s feed was their least interesting feature, aside from recruiter spam), but I’ve always wanted something like LinkedIn’s online resume with a portfolio.\nNew Book # Just before the year closed, I published the second edition of Learn Unity 4 for iOS Game Development, appropriately titled Learn Unity 2017 for iOS Game Development. Or rather, Apress published it, and Allan Fowler updated it, but it’s still got my name on it, and I get a split of the theoretical royalties.\nThe important thing is that it got updated without me having to do any work on it. 2017 was also the year of getting more efficient.\n","date":"January 17, 2018","externalUrl":null,"permalink":"/blog/yearreview/yearinreview2017/","section":"Blog","summary":"Well, the country went backwards last year, but let’s talk about me: 2017 was the year I got organized.\nNew Web Site # My technicat web site has gone through a lot of incarnations, from its 90s beginnings (blinking text!), a good stretch using Forrest, a few different static templates, and wandered around on different blog sites after I stopped self-hosting on ISPs. But last year, I moved it to a Github page and found a Jekyll template that provided a clean look on desktop and mobile.\n","title":"2017 In Review","type":"blog"},{"content":"A while ago I was digging through my box of HyperBowl hardware (related to the original attraction game), I found this 3.5\u0026quot; floppy disk.\nIt’s been a while since I’ve seen one of those, so I posted it on the HyperBowl Facebook page and jokingly explained that this was, in quotes, a “floppy disk.” But someone responded in all apparent sincerity that he’d been wondering why save icons looked that way. Like this one from google material design:\nSo, young ‘uns, gather around, and let me tell you a story. When I started programming, it was on computers like these at the Computer History Museum (in fact, these were the first three models I programmed on, that order, left to right).\nBack then, there were no USB flash drives or rewriteable CDs and DVDs (actually, there was no USB. But we did have music CDs. Vinyl was dead, they said). But desktop computers didn’t have hard drives, either, so you had to save and run your programs from something removable.\nOn the Radio Shack (that company is gone) and Commodore (also gone) computers, I used cassette tapes for removable storage. Well, after the school librarian told me I didn’t have to type the same BASIC program listing into the TRS-80 every day just to play the game. But those cassette players saved and loaded really slowly (like playing a song, naturally), didn’t work well in humid Iowa summers, and often got snarled just like in my car (back when cars came with cassette players).\nBut then Apple (still here) introduced the Apple II with a 5 and a quarter inch floppy disk drive, which were like hard drives except that the disks were removeable and not hard. They really were floppy, basically a flexible disk in an envelope, and you could bend the whole thing (or fold it if you wanted to render it unusable). They came in single or double-sided versions, but you could notch a single-sided one to make it double-sided.\nThis opened up a whole new world of fast saving and loading and piracy (I was pleased to find my first game on a pirate floppy – that excitement has faded since then).\nThe Mac introduced the 3.5 inch floppy shown above, which like the Mac was small and cute (sometimes called a diskette). The plastic case protected it from dust and made it more resistant to user error, like folding. It fit in your shirt pocket (if you wore shirts with pockets).\nBut I could see the beginning of the end for the mini floppy after I bought a Powerbook from Fry’s that required ten floppies to install the OS. And being from Fry’s and their crack ethical sales team, it turned out to be a returned unit with the installation halted at disk 3. I guess the previous purchaser got tired of swapping disks.\nThe modern equivalent of the floppy is the flash drive. It’s a lot smaller and follows Moore’s Law – I just bought one that has twice as much capacity as the previous one I bought a year ago, and at the same price. But it doesn’t make music:\n","date":"January 1, 2018","externalUrl":null,"permalink":"/blog/history/floppies/","section":"Blog","summary":"A while ago I was digging through my box of HyperBowl hardware (related to the original attraction game), I found this 3.5\" floppy disk.\nIt’s been a while since I’ve seen one of those, so I posted it on the HyperBowl Facebook page and jokingly explained that this was, in quotes, a “floppy disk.” But someone responded in all apparent sincerity that he’d been wondering why save icons looked that way. Like this one from google material design:\n","title":"A Farewell to Floppies, or A Flash from the Past","type":"blog"},{"content":"Spoilers here, so don\u0026rsquo;t read this until you\u0026rsquo;ve seen Logan. And I recommend you see Logan. It\u0026rsquo;s the best movie I\u0026rsquo;ve seen in the theater the past year. OK, I\u0026rsquo;ve only seen three movies, but the other two were the John Wick sequel and Rogue One. Hmm, do I only see sequels these days? That\u0026rsquo;s a subject for another article.\nI recently saw a twitter thread by Mark Waid where he maintained that story was not that important, or at least not as nearly as important as character. I\u0026rsquo;ve never quite agreed with that, perhaps because I grew up on mysteries and sci-fi that were great at plot and world-building but not memorable in the character-building department. And as an adult I developed a taste for spy thrillers.\nHowever, the two most recent films I\u0026rsquo;ve seen in the theater are Logan and Kong: Skull Island, respectively, and I liked Logan a lot more. A lot, lot more. And that\u0026rsquo;s due mostly to the characters.\nBut after watching Logan, I would agree that is a great film, or at least a really good one, because of it\u0026rsquo;s characters and the story itself is unremarkable. Although I\u0026rsquo;m not sure it\u0026rsquo;s so much the character development as the compelling acting. Hugh Jackman was convincing as the somewhat noirishly cynical Wolverine (I\u0026rsquo;m mentally blending him with Thomas Jayne-played Miller of The Expanse), Patrick Stewart\n","date":"January 1, 2018","externalUrl":null,"permalink":"/blog/film/ataleoftwomonstermovies/","section":"Blog","summary":"Spoilers here, so don’t read this until you’ve seen Logan. And I recommend you see Logan. It’s the best movie I’ve seen in the theater the past year. OK, I’ve only seen three movies, but the other two were the John Wick sequel and Rogue One. Hmm, do I only see sequels these days? That’s a subject for another article.\n","title":"A Tale of Two Monster Movies","type":"blog"},{"content":"","date":"January 1, 2018","externalUrl":null,"permalink":"/tags/amazon/","section":"Tags","summary":"","title":"Amazon","type":"tags"},{"content":"","date":"January 1, 2018","externalUrl":null,"permalink":"/tags/bbn/","section":"Tags","summary":"","title":"BBN","type":"tags"},{"content":"A while ago, someone asked me what I considered a good company culture, and I cited BBN. I don’t really have an interest in working there again, simply because it’s not the type of business I want to work in — contract R\u0026amp;D, mostly for the government. I left back at the beginning of the dot com boom to get into something more consumer oriented, and that’s what I still prefer.\nBut my stint at BBN was the longest salaried tenure of my career, and it was comfortable enough I could have stayed indefinitely. And I only have fond memories of that place as a great place to be a programmer.\nWhat was so great about it? Well, it’s mostly stuff you appreciate when you leave. It had an intellectual culture. One of my coworkers got into an animated discussion of wavelets, which was one of the cool new things back then, and a passerby stopped and said, “wavelets? wavelets?” It may not contribute to the bottom line like discussions on monetization, but it sure is more interesting and less mind-deadening.\nProgrammers, and really all the tech staff, were respected. We all had our own offices. This didn’t inhibit interaction. On the contrary, it facilitated spontaneous gatherings to discuss the issue of the moment or collaborate on some code, instead of people mashing around a cubicle while innocent bystanders (cubesitters) try to shut out the distraction with headphones. It’s kind of hilarious that one such spontaneous meeting with my whole group appeared in my office just as I got a job offer over the phone (the one I ended up accepting). Awkward.\nThere was an atmosphere of trust. You could check out books from the well-stocked library just by writing the book title and your office number in a box of index cards. Self serve honor system. Despite being a defense contractor, we didn’t have preemployment or random drug tests, like most of the other defense contractors I talked to.\nOffice politics were minimal. The person who asked me about culture scoffed when I said this, but it’s true, from where I sat, I really didn’t see any politics, and I’ve seen plenty at other places (at my first job, working for Texas Instruments, I was pretty depressed thinking that this would be the rest of my career). The most workplace friction I saw was my boss wondering if my coworker could maybe show up for work before three in the afternoon. He was pretty cool. We had kind of a funny exchange when I told him I was leaving for another job — he offered to give me a raise to stay, I said I wouldn’t feel right about changing my mind and staying just for more money, and he said he liked that and that’s the only reason he was willing to offer more, but of course, then I would have really felt like a jerk if I took it.\nThere was no executive elitism as far as I could tell. No executive cafeteria (which I was kind of startled to find that Sun had one). When I left, the VP of my division gave me an informal exit interview — it was his standard practice to ask everyone leaving about any issues they could address. In fact, when I had an on-campus interview with BBN, I didn’t realize the interviewer was also a VP — he merely chuckled and said, “yeah, they make me do a little of everything” when I mentioned I’d seen him at the company open house. (slap myself on the forehead)\nQuality of life wasn’t short-shrifted. The company held training sessions on CPR and rollerblading. I participated on the company soccer team (we got wasted by Digital) and played pickup basketball at lunch with a combination of programmers and accountants. By the way, when you have coworkers who cheerfully recount their days in Cambodian labor camps when they were allowed to forage for fresh fruit, you feel like an idiot complaining about the morning’s ethernet outage.\n","date":"January 1, 2018","externalUrl":null,"permalink":"/blog/career/bbnculture/","section":"Blog","summary":"A while ago, someone asked me what I considered a good company culture, and I cited BBN. I don’t really have an interest in working there again, simply because it’s not the type of business I want to work in — contract R\u0026D, mostly for the government. I left back at the beginning of the dot com boom to get into something more consumer oriented, and that’s what I still prefer.\n","title":"BBN Culture","type":"blog"},{"content":"I don’t see a lot of movies in the theater, but I did see the new Blade Runner, and it was beautiful and moving. However, I still had my standard complaint about how sci-fi movies of the future, especially those that make a point of showing off a lot of artifacts of Asian culture, show fewer Asians than you would find in a Southern California mall or occupying cubicles in a Bay Area tech company.\nAnd they’re never Asian American. It was a total turnoff for me in Ready, Player, One when the sole two Asians with speaking parts (I did spy a young Asian woman extra in a crowd), appeared to have just recently arrived from Asia. That’s likely a faithfulness to the book, which I didn’t finish, but the book made me appreciate Snow Crash (and the movie made me appreciate the Final Fantasy), which I just finished reading for the third time. I hope the talk of a long-overdue Snow Crash movie takes place, because if they’re faithful to that book, the lead will be an African-Asian-American. Also, I can see Jason Momoa as Raven. I’m just throwing that out there.\nAnyway, on a recent flight they had both Blade Runner movies (Jet Blue Mint!), and though I started watching the new one first, I switched to the original, so I guess the first one, even with the Harrison Ford narration, is more special to me. Here’s a bit I wrote about several years ago (apparently before I got a Blue-Ray player):\nIn one of the many interesting featurettes in recently released Blade Runner: The Final Cut DVD set, a staff member of BladeZone asserts there are only people who hate Blade Runner and people who love Blade Runner. Well, not me. I do have some special memories of Blade Runner — it was my first R-rated movie (a high school hacker friend and his father invited me along) and probably the first time I saw on-screen boobs. I did like the movie a lot more than the critics who panned it — I felt they just didn’t get sci-fi at all. And I remember attending a meeting for volunteers at the MIT Media Lab during the winter break period (Intersession Activities Period, I think), in which one of the Lab students invited us to help him create a “loose-sync” multimedia project that, as far as I could tell, just randomly zipped among Blade Runner scenes. I thought it was a silly project, but it gave me an inkling of the film’s influence, despite it’s lack of initial commercial success.\nBut Blade Runner didn’t make as much an impression on me as Star Wars (or, for that matter, Ridley Scott’s previous film, Alien, which really freaked me out), and it’s not my favorite sci-fi work (2001, Firefly, the new Battlestar Galactica) On the other hand, it does have staying power. I still have the 1991 laserdisc director’s cut (and I definitely prefer it without the voiceover), it was the film that got me to eventually read Philip K Dick, and I’ve spent a couple of weeks watching all five DVD’s in this new set.\nThe highly interesting featurettes documenting the film’s influence and the battles between Ridley Scott and the studio, between the director and the crew (they got the impression the English director didn’t like working with Hollywood crew, and it seems they were at least partly right), the writing struggles, disagreements over casting, budget and schedule issues, and even some disgruntlement by Harrison Ford gave me a greater appreciation of the film and its creation. If you want to see everything, make sure you don’t just hit Play All on each of the DVD’s — there are some segments that are played separately, and thus easily overlooked.\nWhen Blade Runner hit the theaters, I didn’t take seriously a concern that the portrayal of a future LA filled with Asians could stoke anti-Asian sentiment — this was back in the days when Buy American meant don’t buy Japanese, and the skyscrapers of Blade Runner LA are covered with video billboards of geishas proferring wares.\nBut now that I live in LA (I first saw the movie when I lived in Iowa), I look at ethnic composition in the film and think, waah? The skies are filled with video billboards featuring geishas, but as far as I can tell, all the Asian characters on the street are Chinese (certainly the case with theTsingtao beer Harrison Ford orders). That reminds me of an IT colleague who wanted to try out the Japanese restaurant in his neighborhood — turned out to be a Chinese seafood restaurant, yet once there he still said he wanted “gyoza, gyoza, gyoza!” And the Chinese peasants peddling bicycles and wearing coolie hats — where did that come from? I’m just glad there weren’t rickshaws (although a futuristic one designed by Syd Mead might have been cool)\nIt makes more sense after viewing the featurette on the film’s art direction. Despite the emphasis on Asian influences, the entire art department seems to have been white and just went with what looked cool, like the people now who sport Chinese character tattoos that don’t mean what they think.\nBut Asians fare better than other minorities — Edward James Olmos presents one of the most interesting characters in the film despite less screen time, but it does bother me a bit that the one identifiable Latino sort of looks like a pimp. An LA with white rich people and white seedy cops straight out of film noir, Japanese commercialism, elderly Chinese who look like they’ve spent their lives in Chinatown or a rice paddy, one Latino pimp, and no African-Americans. Well, maybe that was the British view of LA.\n","date":"January 1, 2018","externalUrl":null,"permalink":"/blog/film/bladerunners/","section":"Blog","summary":"I don’t see a lot of movies in the theater, but I did see the new Blade Runner, and it was beautiful and moving. However, I still had my standard complaint about how sci-fi movies of the future, especially those that make a point of showing off a lot of artifacts of Asian culture, show fewer Asians than you would find in a Southern California mall or occupying cubicles in a Bay Area tech company.\n","title":"Blade Runners","type":"blog"},{"content":"Another one (actually a couple) from the archives several years ago. You might think I dug these up based on the current administration’s campaign against non-white foreigners and immigrants, but really they came back to my mind in the pre-Trump days when I saw Bernie Sanders exhort the audience in his debate vs. Hillary Clinton that they shouldn’t have to compete against low-paid Mexican and Vietnamese workers. Some things don’t change.\nAmid all the television news stories on the economic crisis, I saw a report detailing the woes of Canadian carmakers, namely GM Canada, Ford Canada…apparently there are lower employee costs in a country that doesn’t rely on employer-sponsored healthcare. Aside from the competitive disadvantage imposed by the US healthcare system, another thought occurred to me — I’ve never heard anyone blame Canada for taking our jobs.\nI remember way back in the 80s when Gephardt was campaigning for the presidency and talking up the Japanese scare with auto unions, but I’ve never heard a peep about US auto jobs moving to Canada. Ross Perot warned of that sucking sound of jobs going south, not north. I’ve heard Lou Dobbs warn about terrorists, disease, criminals and job-stealers crossing the Mexican border but nothing about Canada (to be fair, I don’t watch angry white man shows much, so maybe I missed something). When EA shut down it’s Seattle office and opened up a new one in Vancouver, the only controversy there was the EA Spouse story, but game outsourcing to China is worth a Game Developer Magazine issue. When a highly automated Mac factory was constructed in Ireland, the story was about how cutting-edge and automated that factory was, while stories about iPod manufacturing in China are about outsourcing to China (OK that’s Ireland, not Canada, but somehow Blame Ireland isn’t such a catchy blog title).\nWhile aerospace jobs here in Huntington Beach moved to Arizona and a good portion of your favorite TV shows and movies are filmed not in Hollywood but in Canada (where they have rules requiring the hiring of Canadian actors, as I learned on the commentary of Slither), the Orange County IT and programming mail lists I subscribed to were filled with whining about Indian programmers taking our jobs. One poster somehow ended with a lament that Mexicans were hard-working and friendly but didn’t value education. I could have rejoindered that’s what I thought about white people, but actually, a disproportionate number of my programming coworkers have been white people — Europeans and, you guessed it, Canadians.\nI know there are a lot of protests and counter-arguments that can be made, and I’ve heard them all from the aforementioned mail lists, ranging from I’m not a racist to trends…yada yada…magnitude…yada yada…but all I ask is, if you’re hand-wringing about the Chinese and Indians and Mexicans, be fair and just once in a while, blame Canada.\nAnd another one in similar vein:\nBelow is a list from Wikipedia of scifi TV shows filmed in Canada since 2010. That’s just since 2010, and just sci-fi shows. Imagine the list since 2000, for example (also in the same wikipedia page if you’re curious) and expand it to all genres. And think about movies. The reason I bring this up is that when people complain about jobs going to other countries, it’s always Mexico or an Asian country. I hear this from white Californians, Fox TV (and CNN until Lou Dobbs left) and campaigns from both parties during election season (“Bangalore!” and “Beijing!” featured prominently in Meg Whitman’s campaign, and the Obama campaign is uttering “Mexico!” and “China!” against Romney — it’s nice to see such bipartisanship). I have yet to hear a complaint about film production and acting jobs going to “Hollywood North”, or any other type of jobs (there is a Canadian auto industry, and check out all the hi-tech offices EA, IBM and Microsoft opened there). But I suspect if filming moved down to Mexico (or Bollywood), you’ll start hearing about it.\nAlcatraz (2012) Arrow (2012) Continuum (2012) Covert Affairs (2010) Haven (2010) Human Target (2010) Les Rescapés (2010) Lost Girl (2010) Once Upon a Time (TV series) (2011) R.L. Stine’s The Haunting Hour (2010) Tower Prep (2010) ","date":"January 1, 2018","externalUrl":null,"permalink":"/blog/racism/blamecanada/","section":"Blog","summary":"Another one (actually a couple) from the archives several years ago. You might think I dug these up based on the current administration’s campaign against non-white foreigners and immigrants, but really they came back to my mind in the pre-Trump days when I saw Bernie Sanders exhort the audience in his debate vs. Hillary Clinton that they shouldn’t have to compete against low-paid Mexican and Vietnamese workers. Some things don’t change.\n","title":"Blame Canada","type":"blog"},{"content":"I’m always discovering new App Store submission requirements. Last year, when I submitted the WordsEye app, I ran into the rule that apps featuring user-generated content must allow users to block and report content and had to resubmit with those features added.\nOf course, I’m never happy about getting an app rejection, (and I suspect the motivation for the submission requirement has as much to do with limiting liability as user experience), but actually, blocking and reporting users are two of my favorite features in social apps. It’s kind of fun. Like that time a person I blocked got so aggrieved he created another twitter account so he could contact me to ask why I blocked him (which kind of validated my initial blocking decision). Or that time I reported @realdonaldtrump for abuse. What, he’s still on?\nAnyway, blocking, reporting, and their weaker cousins like muting, are useful in exercising the Turing Test against bots, venting without getting into stupid and futile arguments, cleaning up your feed, striking a feeble blow against the forces of evil…\nBut blocking and its ilk would be more useful if it wasn’t treated in the thumbs up world of social media as a shameful secret, like customer complaint forms. Show it off as a proud feature. In addition to the Who to Follow suggestions, how about a Who to Block? I could kill an evening using that (and it would be great on commutes). Instead of just showing number of likes on a user profile, show the number of blockers. Take it as a warning or badge of honor. With this supposed new emphasis on curtailing abuse, if users saw how often they’re blocked and reported, maybe they’ll take a hint. Maybe.\nLiking is overrated. Embrace the negativity.\n","date":"January 1, 2018","externalUrl":null,"permalink":"/blog/social/blockismyfavoritefeature/","section":"Blog","summary":"I’m always discovering new App Store submission requirements. Last year, when I submitted the WordsEye app, I ran into the rule that apps featuring user-generated content must allow users to block and report content and had to resubmit with those features added.\n","title":"Block Is My Favorite Feature","type":"blog"},{"content":"","date":"January 1, 2018","externalUrl":null,"permalink":"/tags/canada/","section":"Tags","summary":"","title":"Canada","type":"tags"},{"content":"","date":"January 1, 2018","externalUrl":null,"permalink":"/tags/fiction/","section":"Tags","summary":"","title":"Fiction","type":"tags"},{"content":"I was sure I’d read Finding Serenity:Anti-heroes, Lost Shepherds and Space Hookers in Joss Whedon\u0026rsquo;s Firefly, a collection of essays on the TV show Firefly edited by Jane Espenson, but there it was on the sale-priced-because-the-show’s-closing pile in the waning hour of this year’s Comic Con, and skimming it, I didn’t recognize the articles, so I bought it. Good deal, turns out the book I read previously was Serenity Found, the sequel.\nAfter those two Firefly books, and some Buffy and Angel collections, I’m beginning to recognize a pattern. Books on the Whedonverse are mostly stuffed with analyses from adoring fans, one or two reminisces from the cast and crew, and for some reason there’s always one really annoying essay (like the Buffy essay complaining the show isn’t that humorous — it could have been condense to one line: “I don’t get it.”). And in the case of Firefly, a healthy dose of Fox-bashing.\nThe cast contibution in Finding Serenity is provided by Jewel Staite and is so cheerful and sweet it could have been written by here character Kaylee. The token obnoxious essay is by a self-professed fan who feels the show is missing the chivalry of the Old West, going on and on about “modern sensibilities” and even referring to his wife as an “authoress” — I get it, when men were men and women were women and I think you’re confusing chivalry with chauvenism and who let Archie Bunker write a Firefly essay?\nThe essay that prompted me to buy the book is one that I felt was missing when I read the sequel first, titled Asian Objects in Space and pointing out the lack of Asian representation, or at least an explanation of that lack, in this Chinese-speaking (mangled-Chinese speaking) ‘verse. It doesn’t exactly take Joss Whedon to task (this is a fan essay collection, after all), but rather speculates some event in the ‘verse history that has yet to be revealed.\nBut a simpler explanation is oversight. The essay Chinese Words in the ‘Verse notes the dialog was originally supposed to be Cantonese, but the translators just assumed it was Mandarin (or maybe they only knew Mandarin?) It’s a mixed bag — I’m surprised and delighted that Whedon actually knows there’s more than one Chinese dialect (or language, depending how you view the differences) and dismayed at the follow through. I mean, it’s not hard to find a Cantonese speaker in Los Angeles (just go to a dim sum restaurant). In fact, one voice actor (who probably only knew Cantonese) spoke her lines in Cantonese.\nI have a couple of apps on the App Store that feature Cantonese text-to-speech (Apple has Cantonese built into Macs and iOS devices, great for the Hong Kong market). The chapter listing all of the Chinese dialog in Firefly gives me an idea for another one — an app that pronounces Firefly Chinese as it was meant to be heard: in Cantonese and not horribly mangled. I’m serious. Stay tuned.\nFirefly is still one of my favorite shows and maybe the favorite, but not because of the ain’t-it-cool Chinese trappings. In that respect, I feel it’s all hat and no cattle. But I’m impressed that Finding Serenity has three chapters devoted to it, so that’s something.\n","date":"January 1, 2018","externalUrl":null,"permalink":"/blog/book/reviews/findingserenity/","section":"Blog","summary":"I was sure I’d read Finding Serenity:Anti-heroes, Lost Shepherds and Space Hookers in Joss Whedon’s Firefly, a collection of essays on the TV show Firefly edited by Jane Espenson, but there it was on the sale-priced-because-the-show’s-closing pile in the waning hour of this year’s Comic Con, and skimming it, I didn’t recognize the articles, so I bought it. Good deal, turns out the book I read previously was Serenity Found, the sequel.\n","title":"Finding Serenity","type":"blog"},{"content":"I was tempted to title this Five Design Books You Should Read Before You Die, but I hate those titles, so I won’t. (Maybe Five Design Books You Should Read Before I Die would really lay on the guilt trip, though. New trend?)\nAnyway, someone on twitter asked for favorite UX books, and these five popped to mind immediately. Interestingly, they’re all old books, and I haven’t read them in a long time, so I don’t remember them well, but they each have something distinctive that stuck with me.\nThe Design of Everyday Things by Donald Norman # If any book was a revelation to me, this book by Don Norman was it. This was the book that showed me the light: if something is confusing or difficult for the user, it’s not user error, it’s a design problem.\nThe example of the ubiquitous blinking VCR clocks may puzzle the those who are so young they’ve never seen a floppy disk, but doors that have no indication whether they’re to be pushed or pulled open are still with us today.\nThis is the book that got me to notice everyday things that could be better, and to think about how they could be better, and to appreciate the details of those things what work well (I recently noticed how there’s a raised border around the lock/unlock-all-doors button in my car, so that I won’t accidentally hit it while driving and operating the adjacent open/close-windows buttons).\nThe Evolution of Useful Things by Henry Petroski # I like all of Henry Petroski’s books; my favorite perhaps is To Engineer Is Human, but The Evolution of Useful Things is focused on how products evolve and proliferate in variety over time.\nThe example from this book that I remember is the fork, its history and variations, and in particular how the spork didn’t quite catch on, even though it seemed to make sense.\nDesigning Interactions by Bill Moggridge # I love books that collect the experiences of various luminaries Masterminds of Programming, Game Theory: Design and Practice…), and this compilation by Bill Moggridge features plenty, including those who don’t get nearly enough press, like Doug Englebart.\nBut the account in this book that sticks in my mind is that of Palm Computing and how the first prototype was a block of wood they carried around in their shirt pockets and simulated using to get a feel for it. There’s no substitute for actually using, or pretending to use, your own design.\nTog on Interface by Bruce Tognazzini # This collection of essays is written by “Tog”, one of the original Mac interface designers. I remember the one that explained how surprisingly efficient it was to access the Mac menu bar. Since the menu bar was at the top of the screen, users didn’t have to move the mouse precisely over the desired menu. Instead, they could just whip the mouse up the screen, as the top essentially acted as a mouse barrier, and then move the mouse laterally as needed. (This of course doesn’t hold true on window systems that have menu bars on floating windows)\nThis example actually came to mind years ago when I was arguing with some coworkers about why our 3D graphics tool had a bizarre right-click-to-mouse-warp-to-the-right-side-menu feature. The rationale was that it was too slow to manually move the mouse there for power users.\nI had almost too many objections to articulate: the right-side menu was always at the right side of the screen, so like the Mac menu bar, moving the mouse there just takes a quick movement without danger ofovershooting; mouse-warping is a UI design no-no; it warped to an arbitrary position that was most unlikely to be the desired menu item; the side menu only existed because they decided to do their product design by surveying potential customers who were used to seeing a side menu in similar products; power users were likely to use our original popup menus that would popup wherever the mouse was, like Maya’s radial menus; and I’ve never seen anyone say how come Maya doesn’t have side menus?\nBut that’s what happens when you start reading about UI design. You get into exasperating arguments with those who haven’t.\nThe Macintosh Human Interface Guidelines by Apple Computer # Tog, as a member of the original Mac team, was also an author of the original Macintosh Human Interface Guidelines, the grandaddy of the current Apple Human Interface Guidelines.\nThe current guidelines are worth reading and should be read by everyone in a coffee shop or startup who says they have a great app idea, but the original guidelines could lay a valid claim as being the definitive UI design text of the time.\nThis was the Apple whose mantra was making interfaces intuitive, clear and consistent, not the current form-over-function Apple that babbles on about “delightful apps” and crams their engineers into a hamster cage where they walk into glass walls (which, by the way, happened to me in a WeWork building). Some of Apple’s current interfaces are terribly inconsistent by the standard of their original guidelines (single-click on the Dock is the same as double-click in the Finder, some operations in context menus should be in the menu bar but aren’t…)\nThe Apple II BASIC Programming Manual got me into programming on the Apple II+, the Lisp Machine Manual was another absorbing read that started me on Lisp machines and the first part of my career programming in Lisp, and in that tradition, the Macintosh Human Interface Guidelines made me want to be a Mac developer (Macs did not come with a copy of the Guidelines, but they should have…)\nAnd, just as I’m trying to wrap up this article today, I finished rereading Snow Crash and discovered in the end notes that the Macintosh Human Interface Guidelines was one of the inspirational sources for that story!\n","date":"January 1, 2018","externalUrl":null,"permalink":"/blog/book/reviews/fivedesignbooks/","section":"Blog","summary":"I was tempted to title this Five Design Books You Should Read Before You Die, but I hate those titles, so I won’t. (Maybe Five Design Books You Should Read Before I Die would really lay on the guilt trip, though. New trend?)\n","title":"Five Design Books","type":"blog"},{"content":"Now that I’ve disentangled myself from Facebook, my next target is Amazon, especially considering their recent firing spree.\nIt’s not easy shedding a big tech entity. I had no problem unfriending all my Facebook friends, but Facebook pages were actually useful for my app support, and I was also on Whatsapp and Instagram.\nBut after a couple of years that’s all done now (although I still have an Oculus Rift hooked up to my PC). I’ve started the process with Amazon by unpublishing HyperBowl from the Amazon Appstore (the revenue was down to two dollars a month, but hey, two dollars…)\nAnd today, I got rid of Goodreads. I joined twelve years ago in their early days, but even then I was annoyed when they introduced one of those all-encompassing indemnification clauses (the founder did personally reply to my complaint, explaining their lawyers told them to have that clause and everyone else has it), and of course their acquisition by Amazon was depressing.\nGoodreads is pretty handy when I’m book browsing to check whether I’ve read a book already and how are the reviews, and the app is pretty slick with it’s camera book-cover recognition feature, but as I discovered after recently rereading Cryptonomicon, if I can’t remember reading the book, I might as well reread it, and I can always google for reviews (Google is not yet on my big tech hit list).\nBut, like discovering I’ve already read this book, I realized I’ve tried deleting my Goodreads account before. The problem is I have an author account, and the usual instructions for deleting an account from the web site don’t seem to work in that situation. The trick is to delete your account from the Goodreads app. Now my user profile is gone (although the author profile remains).\nThe next step in my de-Amazonifying campaign is to unpublish my self-published book. I hate to lose the reviews, but anyone can still buy it on bn.com, Apple, or download it free.\nI doubt I’ll completely get rid of my Amazon account, because I do want the option of buying stuff there (although I’ve moved to buying books on bn.com and my local indie bookstore, and I try to buy direct in other cases when possible, like my recent cloth mask purchase). If you do buy from Amazon in these hazardous times, try to stick to the important stuff.\n","date":"January 1, 2018","externalUrl":null,"permalink":"/blog/social/goodbyegoodreads/","section":"Blog","summary":"Now that I’ve disentangled myself from Facebook, my next target is Amazon, especially considering their recent firing spree.\nIt’s not easy shedding a big tech entity. I had no problem unfriending all my Facebook friends, but Facebook pages were actually useful for my app support, and I was also on Whatsapp and Instagram.\n","title":"Goodbye, Goodreads","type":"blog"},{"content":"","date":"January 1, 2018","externalUrl":null,"permalink":"/tags/goodreads/","section":"Tags","summary":"","title":"Goodreads","type":"tags"},{"content":"When I tell people I like to watch Korean dramas, they typically ask “Oh, are you Korean?” No, I just get tired of watching American shows with no Asian faces (I don’t actually say that).\nBut recently I binged Kim’s Convenience, which is not a Korean drama, bur instead a Canadian sitcom. It’s my favorite show with an Asian-American cast (out of the three I’ve seen in the last thirty years). And by Asian-American, I’m including Asian-Canadian, as this show is based in Toronto (yet another reason to move to Canada these days).\nThe dialogue is sharp and witty, there is emotional depth, and all of the actors do a great job (it feels good just to see Asian-American actors get work), and I’ve watched enough Korean drama to recognize all five of the Korean words uttered in the show. And in fact there is even a visiting cousin straight out of a typical kdrama making a couple of appearances.\nIt’s not all about the Asian immigrant experience. It’s a show with a variety of characters with different backgrounds in everyday situations.\nBut the heart of the show is Mr. Kim and his relationship with his family.\nMy favorite relationship in the show is between Mr. Kim and Mrs. Kim. And my favorite scene is her singing Love Shack.\n","date":"January 1, 2018","externalUrl":null,"permalink":"/blog/tv/diversity/kimsconvenience/","section":"Blog","summary":"When I tell people I like to watch Korean dramas, they typically ask “Oh, are you Korean?” No, I just get tired of watching American shows with no Asian faces (I don’t actually say that).\n","title":"Kim’s Convenience","type":"blog"},{"content":"I haven’t written many reviews on Goodreads, but I wrote a few brief ones on some of Len Deighton’s Cold War-era spy novels. His books are largely out of print (although SS-GB was recently produced as a TV series), but I often find them in libraries and used bookstores.\nXPD is one of my favorite Len Deighton stories. I’m sure of that because I’ve read it at least three times, now. It has among the best plot twists of Deighton’s novels, but I think the appeal of this one is, atypically, the characters at the center who aren’t spies, just poor schlubs who are caught in the middle but who have a fascinating intertwined history and some strength of character and sense of morality.\nParticularly, and again atypically, the American character Charles Stein, whose girth and gusto might be intimidating in person but are entertainingly depicted in the book. This story doesn’t have the first person cynicism of the Bernard Samson books but it does feature the traditional Deighton ingredients of wartime nostalgia, longtime regrets, ever-present danger and uncertainty, and a glimpse of hidden and hard world operating beneath ordinary life.\nViolent Ward is one of Len Deighton’s weaker novels — it’s as if he’s trying out an LA noirish detective voice, and it doesn’t sound natural. Also, while the story has his customary twists, it’s not as absorbing as his usual work. But the characters are interesting to the point where you (eventually) start rooting for them, throw in some sly digs at the LA and Hollywood scene, and it still makes for an entertaining read.\nLen Deighton’s American characters tend to be somewhat cardboard and caricatured compared to his European ones, but in MAMista he does a good job in making the guerrillas in this story interesting and sympathetic, without glossing over the moral gray areas they occupy. The novel is laced with cynicism (moral and political) and ends with some neat ironic twists but the real star of the show is the jungle. The writing effectively immerses you into the simultaneous oppressiveness, beauty and danger of the environment so much that you wish you were there to see it and you’re glad you’re not.\n","date":"January 1, 2018","externalUrl":null,"permalink":"/blog/book/reviews/lendeighton/","section":"Blog","summary":"I haven’t written many reviews on Goodreads, but I wrote a few brief ones on some of Len Deighton’s Cold War-era spy novels. His books are largely out of print (although SS-GB was recently produced as a TV series), but I often find them in libraries and used bookstores.\n","title":"Len Deighton","type":"blog"},{"content":"I was listening to the /Film podcast review of Logan and remembered that while it was one of my favorite films of the year (and second favorite superhero film), I had a few quibbles. I thought the Shane thing was a bit heavy-handed, it was uncomfortable watching little kids dishing out so much violence (a problem I also had to a lesser extent with Kick Ass), even more uncomfortable watching a plot premise that involves a government organization imprisoning and traumatizing children (bad enough in a film and worse in real life). And, really, staying over at an innocent bystander’s place while the bad guys are tracking you, and surprised when the bad guys wipe out all the innocent bystanders? That’s superhero malpractice.\nAll that goes with movie territory, but the one thing that really bugged me is the discovered DNA link between Wolverine and the girl, which Prof. Xavier keeps reminding Wolverine of (“She’s your daughter!”). As if a failed paternity test would result in Wolverine dumping off the kid at the nearest gas station.\nIn fact, I think the emotional payoff at the end would have been even more impactful without the genetic relationship setting it up.\nThe movie is about an adoptive relationship, where they ultimately learn how to trust and take care of each other. There’s no need to justify it with a circumstantial biological link. I mean, they’ve both got knives coming out of their hands. That’s kinship enough.\n","date":"January 1, 2018","externalUrl":null,"permalink":"/blog/film/logan/","section":"Blog","summary":"I was listening to the /Film podcast review of Logan and remembered that while it was one of my favorite films of the year (and second favorite superhero film), I had a few quibbles. I thought the Shane thing was a bit heavy-handed, it was uncomfortable watching little kids dishing out so much violence (a problem I also had to a lesser extent with Kick Ass), even more uncomfortable watching a plot premise that involves a government organization imprisoning and traumatizing children (bad enough in a film and worse in real life). And, really, staying over at an innocent bystander’s place while the bad guys are tracking you, and surprised when the bad guys wipe out all the innocent bystanders? That’s superhero malpractice.\n","title":"Logan","type":"blog"},{"content":"My current must-see kdrama is Mother, a Korean remake of an acclaimed Japanese series (there\u0026rsquo;s also a Turkish remake).\nPerhaps because it\u0026rsquo;s a remake, this show is an atypical kdrama. It is standard fare to show in Korean series uncomfortable topics like domestic violence, child abuse and neglect, gambling addiction, school bullying…but typically in a Law and Order case of the week manner (although, kdramas typically air two episodes a week), so the treatment often seems superficial or even exploitative.\nBut with Mother, the entire show is about a woman rescuing a child from an abusive situation. This is not something I would normally tune into, but I\u0026rsquo;m a fan of the lead actress Lee Bo Young (although in her previous show Whisper, I tuned out after seeing her gamely chomp down on a product-placed Subway sandwich while plotting revenge against the corrupt law firm that frame her father).\nLee Bo Young\u0026rsquo;s role in Mother is actually reminiscent of her portrayal of a fiercely protective mother in Nine Days who has somehow gone back in time nine days to prevent the impending death of her daughter. That series is another favorite of mine and costars\n","date":"January 1, 2018","externalUrl":null,"permalink":"/blog/film/mother/","section":"Blog","summary":"My current must-see kdrama is Mother, a Korean remake of an acclaimed Japanese series (there’s also a Turkish remake).\nPerhaps because it’s a remake, this show is an atypical kdrama. It is standard fare to show in Korean series uncomfortable topics like domestic violence, child abuse and neglect, gambling addiction, school bullying…but typically in a Law and Order case of the week manner (although, kdramas typically air two episodes a week), so the treatment often seems superficial or even exploitative.\n","title":"Mother","type":"blog"},{"content":"My favorite part of the film Ronin is not the deft cinematography and sound that capture the grim nature of the shadowy world populated by terrorists, organized crime, and ex-spies. Not is it the believable yet spectacular action sequences — well paced gunplay and the most amazing car chases I’ve ever seen.\nInstead, the part of the movie that strikes a chord with me is when the character played by Robert De Niro puts his foot down during a mission planning session and states that if it’s “amateur hour” and he can’t get the information and manpower he wants, then his price goes up. As a fellow contractor, I can relate.\nOK, so his project involves an armed ambush to steal a mysterious case for an international terrorist operating in Europe, while I just write software. And contract termination in his case likely involves a real “termination”, so we won’t be sending dues to the same professional societies. But a project is a project, and this team of freelancers faces the same obstacles that bedevil all projects — team members who don’t trust each other (besides De Niro’s ex-CIA character, there is an ex-KGB operative played with perfect coldness by Stellen Skarjsgard), varying levels of competence (Sean Beam’s weapon specialist exhibits just enough bragadaccio and nervousness to make you doubt his reliability), unhelpful leadership (De Niro asks Jean Reno if he’s “labor or management”), and people who are anxious to change course (De Niro at one point tells his coworkers, “Let’s stick with the plan, it’s a good plan” — how often I’ve wanted to say that!)\nThe team dynamics improve for a while (after one member is released with a terse non-disclosure agreement) but labor-management relations worsen after a double-cross during the flaming ambush, and all surviving participants somehow come together again in a slightly anticlimactic ending involving Katarina Witt and Russian organized crime.\nThe DVD features a slick menu design that displays a drivers view of the chase sequence — you can kill some time just by watching that — and a detailed commentary by the director John Frankenheimer. As with the film, the commentary is most interesting when elaborating on the camera and stunt techniques, but less than persuasive when explaining the Ronin theme — masterless samurai roaming as soldiers for hire but still adhering to the old code. It’s not clear how far this analogy is supposed to stretch, but in the end this group of mercenaries seem less like the Seven Samurai and more like a bunch of guys in jobs they don’t particularly enjoy, but it’s better than working at Starbucks.\nThe characters are not particularly sympathetic, and I can’t even remember all their names, but that actually works for this movie — the main contact Dierdre (I think of her as the project manager) is chastised by her boss when she refers to the driver Larry by his first name (“poor Larry”). There is supposed to be some romantic, or at least sexual, tension between De Niro’s character and Dierdre — he is pretty cool after all — but the chemistry between De Niro and Reno is more convincing.\nFrankenheimer seems a bit too nice, or too politically-correct, when talking about the people involved in the film. He heaps praise on everyone, but director and cast commentaries are more entertaining and illuminating when the narrators let go a bit and talk about real difficulties they faced and parts they wish had been done differently (although there is one amusing anecdote about the always-prepared De Niro learning French in anticipation of lengthy French dialogue, only to be disappointed that he had to speak only a few French words for the entire movie).\nFrankenheimer also says he agrees with the studio’s desire to change the ending after a test screening, but after viewing the original ending that is supplied as a bonus feature on the disc, I’d have to say this is one of the usual times that the original ending is better. It does supply less closure than the feel-good version released in the theaters, but I was thinking about the more unsettling ending a week later, and that lasting impact can be the difference between a good action film and a great action film.\n","date":"January 1, 2018","externalUrl":null,"permalink":"/blog/film/ronin/","section":"Blog","summary":"My favorite part of the film Ronin is not the deft cinematography and sound that capture the grim nature of the shadowy world populated by terrorists, organized crime, and ex-spies. Not is it the believable yet spectacular action sequences — well paced gunplay and the most amazing car chases I’ve ever seen.\n","title":"Ronin: Life of the Modern Contractor","type":"blog"},{"content":"","date":"January 1, 2018","externalUrl":null,"permalink":"/tags/seinfeld/","section":"Tags","summary":"","title":"Seinfeld","type":"tags"},{"content":"I often complain how during my few months working in New York City, people there routinely assumed I worked in a Chinese restaurant (“I’m here to pick up my order”).\nBut, as I was reading Seinfeldia, a delicious (I use this word because I just said restaurant) dive into the history of Seinfeld, I remember seeing only two Asians in the show: one was the venerable James Hong, working at a Chinese restaurant with his trademark fake Chinese accent (I was shocked when I saw him in an old sci-fi movie talking in his normal American voice), and the other was a Chinese delivery boy who made a phone call to China.\nThe book touches on the lack of diversity in the show just briefly but also notes that Seinfeld formed America’s view of New York and (I don’t know about this) performed a key role in revitalizing the city. So, in a way, you could say the show provided an authentic display of New York’s diversity as viewed by a segment of New Yorkers (and not the first — take all those Woody Allen movies).\nIt’s not just the Chinese restaurant thing. When I was working in New York, we had a meeting with Samsung America with a white American guy and an Asian American guy. Afterwords, a coworker wondered whether the Asian guy was from Korea. Sure, his name is Sam and he has no foreign accent and the other guy is American, but OK, he’s from Korea.\nAnd I saw on twitter a Chinese-American woman announced it was an anniversary of her arrival in New York, whereupon a New Yorker congratulated her and said America needed more immigrants like her. Except she’s not an immigrant, she’s from LA.\nAlso on twitter, a designer who moved to New York from California said he liked New York’s authentic diversity with people from all kinds of countries building communities together, vs. the “social justice” of Berkeley types. OK, he just moved there, but sounds like New York’s more his style. Anyway, I responded that I prefer California diversity more: the type where people don’t routinely assume I’m from another country.\nLike when a Manhattan museum staffer asked if I was Korean because he was thinking of buying a Hyundai and wanted some tips. Even if I was Korean, what tips would I have? Like there’s a secret Hyundai newsletter for Koreans? This is starting to sound like a Seinfeld bit. If Seinfeld was Asian. Asian-American George, Elaine, Kramer, even Newman, I could visualize it… Hey, we’ve had two sitcoms in the last twenty-five years featuring Asian Americans, I think we’re due.\n","date":"January 1, 2018","externalUrl":null,"permalink":"/blog/book/reviews/seinfeldia/","section":"Blog","summary":"I often complain how during my few months working in New York City, people there routinely assumed I worked in a Chinese restaurant (“I’m here to pick up my order”).\n","title":"Seinfeldia","type":"blog"},{"content":"The author brings up a lot of interesting points and case studies of how automation can have the opposite of the intended effect, but halfway through, I feel he is belaboring the point without bringing up solutions (he does mention an improved approach to design, but in a manner that suggests there is some kind of entrenched conspiratorial resistance to it). And I felt like asking him, I bet you\u0026rsquo;re using a word processor, and not using a typewriter (like Elmore Leonard) or handwriting the book, and you haven\u0026rsquo;t even turned off the spell checker, right?\n","date":"January 1, 2018","externalUrl":null,"permalink":"/blog/book/reviews/glasscage/","section":"Blog","summary":"The author brings up a lot of interesting points and case studies of how automation can have the opposite of the intended effect, but halfway through, I feel he is belaboring the point without bringing up solutions (he does mention an improved approach to design, but in a manner that suggests there is some kind of entrenched conspiratorial resistance to it). And I felt like asking him, I bet you’re using a word processor, and not using a typewriter (like Elmore Leonard) or handwriting the book, and you haven’t even turned off the spell checker, right?\n","title":"The Glass Cage","type":"blog"},{"content":"","date":"January 1, 2018","externalUrl":null,"permalink":"/tags/whedonverse/","section":"Tags","summary":"","title":"Whedonverse","type":"tags"},{"content":"Cinefex 156 is now available on Cinefex iPad Edition, and although the film featured on the cover is Thor: Ragnarok (which I haven’t watched, yet), the one I’m pleased to see in this issue is Wonder Woman, which was my favorite film of the year, certainly the most emotionally compelling.\nLogan was good, too, but a bit melodramatic, and I felt the father-daughter relationship would have had more impact if it didn’t rely on their actually having a biological father-daughter relationship. Blade Runner was beautiful, but like the original, a bit emotionally distant, and, like the original, it would be nice to see a more diverse main cast in this otherwise culturally diverse future (you can actually see more diversity in present-day LA). Guardians of the Galaxy was pretty entertaining. And I haven’t even seen the new Star Wars, yet. The only movie I regretted watching in the theater was Kong: Skull Island. So, a pretty good year for film.\n","date":"December 28, 2017","externalUrl":null,"permalink":"/blog/film/cinefex156/","section":"Blog","summary":"Cinefex 156 is now available on Cinefex iPad Edition, and although the film featured on the cover is Thor: Ragnarok (which I haven’t watched, yet), the one I’m pleased to see in this issue is Wonder Woman, which was my favorite film of the year, certainly the most emotionally compelling.\n","title":"Cinefex 156","type":"blog"},{"content":"This has been a good year for Korean drama. Kdramas have long excelled in production values, to the point where they dominate popularity in the Asian market and have an increasing following overseas (there is even a current American remake of the kdrama Good Doctor).\nBut this year two shows: Forest of Secrets (also known as Stranger) and Because This Life Is Our First are now among my favorites and have raised the bar in polished acting, storytelling, and emotional engagement.\nYet somehow the NYT managed to make it’s inclusion of Stranger (listed by that title on Netflix) on it’s best TV shows list seem like a gimmick, calling it an affirmative-action move (I don’t even understand that – if that’s affirmative action, then so is going to Panda Express for dinner) and listing it’s eight-episode run as an improvement over the normal sixteen episodes, evn though it actually is sixteen episodes, begging the question of whether the reviewer watched the entire series (or perhaps got it confused with the first season of Stranger Things).\nAfter the inevitable Internet complaints, the affirmative-action part and the incorrect episode count were quietly removed, so now the entry is just one sentence and less stupid but still stupid: “Hey, it stars Bae Doona, the only Korean actor I’ve seen in American movies, and it’s not as silly as other Korean shows”. I’m a Bae Doona fan and she’s a co-star of the series but the main lead is the excellent Jo Seung-woo (who costarred in another of my favorites, God’s Gift: 14 Days)Also it’s the only entry without a link to the show, it really looks like they mailed this one in.\nThe entry is listed under International Shows, so I don’t know why it’s the only one that merits the “cultural differences” treatment, but I do know: it’s the golly gee white American tourist in Asia (“you guys eat dog, right?”). So maybe they should have an additional category: Stranger Shows. As for affirmative action, let’s see some more Asian Americans on American TV, then we can talk.\n","date":"December 7, 2017","externalUrl":null,"permalink":"/blog/tv/diversity/strangershows/","section":"Blog","summary":"This has been a good year for Korean drama. Kdramas have long excelled in production values, to the point where they dominate popularity in the Asian market and have an increasing following overseas (there is even a current American remake of the kdrama Good Doctor).\n","title":"Slayerfest ‘98","type":"blog"},{"content":"Spam is a fact of life, but someone has to fight the good fight, so sometimes I reply and ask where they got my email address, which usually just gets ignored, but once in a while I get a response saying whoever sent the email is out of the office however rest assured we never buy email lists (they must be really good at guessing email addresses then). And sometimes I just leave a complaining review. But this person didn’t take it well.\nHello Philip, My name is Ed DeAngelis the CEO of Amerifi, LLC. I am in receipt of the 1 star review you gave us but can not find any record whatsoever of your name in our salesforce system. I am not sure who you were contacted by from my company AMERIFI, so I am requesting you please supply documentation of this email or several emails that you received from Amerifi. We are not a sleazy company in any way and we do not solicit or reach out to anyone unless they are interested in our products. I noticed you are new to Trustpilot which raises a red flag to me that you may possibly have been put up to this by Andy. I am not sure, but I am in process of hiring an attorney to investigate this for me as false accusations are unethical and somewhat illegal. We are a great company and we will do whatever it takes to protect our pristine reputation! I sure hope this can be resolved amicably. Thank you for your time on this matter \u0026amp; have a great day\nHey, if I hired a lawyer for every one-star review I got for my apps, well, I’d stop making apps.\n","date":"December 7, 2017","externalUrl":null,"permalink":"/blog/spam/whosandy/","section":"Blog","summary":"Spam is a fact of life, but someone has to fight the good fight, so sometimes I reply and ask where they got my email address, which usually just gets ignored, but once in a while I get a response saying whoever sent the email is out of the office however rest assured we never buy email lists (they must be really good at guessing email addresses then). And sometimes I just leave a complaining review. But this person didn’t take it well.\n","title":"Who’s Andy?","type":"blog"},{"content":"While chatting with some app developers at a meetup, one told me she’d tried working as a realtor and got out because couldn’t stand the dishonesty. To be fair, yesterday I talked to a realtor who said she’d hated working with arrogant and socially-challenged software engineers.\nThat led me to realize (besides the fact I should identify myself as a programmer much earlier in conversations), that one thing I like about software development is the honesty. You can quibble about how much software engineering is engineering and how much computer science is science, but fundamentally it’s truth-based. Algorithms have proofs of correctness (they’re still working on that with programming languages). You can’t lie to a compiler. A spec is a spec even if the implementation doesn’t follow it. Everything is in the repo.\nI don’t think I’m indulging in oh-isn’t-my-profession-so-wonderful. It’s a well-known tactic at trade shows to try to talk to the engineers because they’ll give you the straight scoop. It’s painful to watch businesspeople single out a competitor’s engineers and mine them for information. They should have handlers.\nOf course, programmers do lie. But not as a matter of course, at least with regard to software, and it’s hard to be completely honest in one aspect of your life and dishonest in the rest. Unless maybe if youre a spy.\nWhereas I once worked with a pathological liar in marketing and thought that might be an asset in his job, dishonesty is not a good look on a programmer. I could be wrong. I did work with a lying programmer who got promoted to management. But maybe that says more about management.\nProgrammer’s can’t just prove their case with assertions (that’s kind of an inside joke), like the ones in every communication I’ve ever received from a lawyer. You have to be able to back up what you say. At least with a StackOverflow link.\nOne disillusionment I experienced when writing a book for a publisher was that the editors never cited any references when they told me something had to be written a standard way, even though there’s no shortage of published (and often differing) standards like the Chicago Manual of Style and Strunk and White (I recommend listening to the Grammar Girl podcast). One editor even told me “I don’t have time to look it up.”\nWhereas, when a programmer once said the same thing to me when pushing for Hungarian notation, I could visualize his brain going “Run away! Run away!” As programmers, we spend half our time looking things up. I don’t know how we got anything done before the Internet (a lot of poring through huge programming language manuals). If you claim you don’t have time to look something up, either you’re too afraid to, or too lazy to.\nHonesty is not just a character trait in programming, it’s a competency issue. If your arguments are circular, maybe your loops don’t terminate, either. If you really believe what you’re saying, and I don’t, one of us is probably wrong. Unless we’re talking about software methodologies and favorite programming languages. Then truthiness prevails.\n","date":"November 1, 2017","externalUrl":null,"permalink":"/blog/career/programmersdontlie/","section":"Blog","summary":"While chatting with some app developers at a meetup, one told me she’d tried working as a realtor and got out because couldn’t stand the dishonesty. To be fair, yesterday I talked to a realtor who said she’d hated working with arrogant and socially-challenged software engineers.\n","title":"Programmers Don’t Lie, Much","type":"blog"},{"content":"","date":"November 1, 2017","externalUrl":null,"permalink":"/tags/programming/","section":"Tags","summary":"","title":"Programming","type":"tags"},{"content":"There’s all this talk about how designers should have empathy, but empathy’s a lot easier when you’re empathizing with yourself. For example, until recently I’ve been in the school of I-want-it-exactly-the-way-I-want-it when choosing font sizes in my apps. But there are some bad app apples out there that display text like they’re on medicine bottle labels or the unsubscribe instructions in spam. Google Maps in particular drives me crazy because zooming in doesn’t make the street names any more legible to my ageing eyes (which started ageing when I was seven).\nGoogle Maps doesn’t respond to the Text Size slider in the iOS Settings app, either, but most of the apps I use regularly, like Twitter, do support Apple’s Dynamic Type.\nI figured I should start doing so, too. It’s easy. In my Talk Dim Sum app, now instead of a fixed size font, I’m requesting the preferred font, like this:\nUIFont.preferredFont(forTextStyle: .body)\nFor the text to instantly resize in response to Text Size changes, you need to set this property on the UIView displaying the text:\nadjustsFontForContentSizeCategory = true\nThe dynamic text (actually called Dynamic Type by Apple) also responds to the Bold Font option in Settings (just under the Text Size option in Display and Brightness).\n","date":"October 15, 2017","externalUrl":null,"permalink":"/blog/app/textsizeforbadeyes/","section":"Blog","summary":"There’s all this talk about how designers should have empathy, but empathy’s a lot easier when you’re empathizing with yourself. For example, until recently I’ve been in the school of I-want-it-exactly-the-way-I-want-it when choosing font sizes in my apps. But there are some bad app apples out there that display text like they’re on medicine bottle labels or the unsubscribe instructions in spam. Google Maps in particular drives me crazy because zooming in doesn’t make the street names any more legible to my ageing eyes (which started ageing when I was seven).\n","title":"Text Size for Bad Eyes","type":"blog"},{"content":"When I hear people say what ails the tech industry is engineers not getting enough liberal arts or just art in their education, I feel like someone’s been watching Revenge of the Nerds, lately. No one ever says, if only those Wall Street bankers had liberal arts educations, or if only those politicians had taken more art classes. And I’ve been cheated by more artists than programmers.\nNevertheless, I opinionated in a previous article that programmers (and everyone else) would benefit from a history of computing in their studies. I got a refresher on this recently at the Computer History Museum in Mountain View, near Google HQ.\nNatually, it’s pro-software, so don’t expect an exhibit on the impending AI apocalypse here.\nThe building and the courtyard in front are lovely. You can just hang out here and enjoy the Bay Area weather (it’s near the bay). Especially considering the admission fee, like everything else in the Bay Area, is a bit pricey.\nOr you can check out the gift shop. They have some fun stuff there.\nThis is my second time there, so I wondered if it was worth it, but they do have new exhibits, in this case a display on modern video games. Blizzard was high-profile here.\nAnd even among the regular exhibits, there’s enough that you’re probably not going to absorb everything in one go. It starts way, way back to the earliest of computing.\nWhich for me would be these three PCs (literally — these were the first three PCs I programmed on, in order from left to right).\nAnd my first Mac laptop (from the Sculley years, so stop bashing him!).\nI didn’t remember them having such a good collection of video game hardware.\nI didn’t remember the robot section, either.\nEven the beanbag makes an appearance.\nOne disappointment: I didn’t see any mention of the women of Bletchley Park in their section on Bletchley Park and Alan Turing. But they do have an entire area dedicated to Countess Ada.\n","date":"October 8, 2017","externalUrl":null,"permalink":"/blog/history/computerhistorymuseum/","section":"Blog","summary":"When I hear people say what ails the tech industry is engineers not getting enough liberal arts or just art in their education, I feel like someone’s been watching Revenge of the Nerds, lately. No one ever says, if only those Wall Street bankers had liberal arts educations, or if only those politicians had taken more art classes. And I’ve been cheated by more artists than programmers.\n","title":"The Computer History Museum","type":"blog"},{"content":"Ad companies are really bad at advertising themselves. Here’s the latest obvious mass email feebly pretending to be personalized (a more succinct version would be “Hey you, love your stuff, try us!”) that I received on an address that is not associated with my YouTube account (it’s not even supposed to be public, although it’s used on a site that was hacked earlier this year, so, hmm…).\nHi there- I was checking out your content on YouTube, and I am super impressed! I work for Brandzooka. We help people launch video ads all over the web through an easy-to-use, self-service platform. In just a few minutes, you can get your awesome videos delivered to your target audience on top sites across the web. It would be my pleasure to buy your first campaign…\nOne thing I’ve noticed lately is that when ad companies say they want to “buy” something (campaign, traffic…) they’re not actually offering any money. That’s a real disappointment (along with the realization that maybe they haven’t actually looked at your video, app, site…). In this case the email included a promo code, which I’m guessing, since signing up is already free, provides an initial credit.\nTo be fair, the last couple of times I responded to these emails, I got immediate responses, even though they just said sorry, don’t know where we got your email, and in this case they said we definitely never ever buy or sell email addresses. I don’t know that I believe them, but hey, it’s the ad business.\n","date":"September 19, 2017","externalUrl":null,"permalink":"/blog/spam/weloveyourvideos/","section":"Blog","summary":"Ad companies are really bad at advertising themselves. Here’s the latest obvious mass email feebly pretending to be personalized (a more succinct version would be “Hey you, love your stuff, try us!”) that I received on an address that is not associated with my YouTube account (it’s not even supposed to be public, although it’s used on a site that was hacked earlier this year, so, hmm…).\n","title":"We Love Your Videos","type":"blog"},{"content":"There’s a special class of spam I’ve been receiving more of, lately, which comes in the guise of a fellow developer reaching out. It pains me to see that — it’s one thing to get an obvious mass email from a recruiter who claims he saw my programming skills in my Foursquare profile, but devs employing sleazy marketing tactics are like Klingons fighting without honor. And often badly.\nFor example, here’s one I got yesterday, oddly enough on an email address that is not associated with GitHub.\nHey, Philip, I found your GitHub profile by clicking through the SwiftHTTP repo. I’m reaching out because I’m an ios dev interested in making network and server errors easier to visualize and understand in production. If I may first ask, do you know or care about when your users are losing cell connection? Learning about any problems/pains/wishes you’ve had (so I can help fix them!) regarding the network would be awesome. Thanks! James\nAnd I haven’t contributed or forked that repo, although I may have used it, or at the very least I’ve starred it.\nIt’s from “James” with no title or links provided, but the email address indicates it’s from an outfit called Caffeine Computing. If they identified themselves and showed real evidence they checked me out (if they looked at my github repos, for example, and my apps…), then, developer to developer, I’d be happy to respond, as a courtesy, But if there’s one thing I hate more than an obvious mass email, it’s a mass email pretending not to be a mass email.\n","date":"September 12, 2017","externalUrl":null,"permalink":"/blog/spam/devspam/","section":"Blog","summary":"There’s a special class of spam I’ve been receiving more of, lately, which comes in the guise of a fellow developer reaching out. It pains me to see that — it’s one thing to get an obvious mass email from a recruiter who claims he saw my programming skills in my Foursquare profile, but devs employing sleazy marketing tactics are like Klingons fighting without honor. And often badly.\n","title":"Dev Spam","type":"blog"},{"content":"It’s been six years in a row at Comic Con and I still enjoy it as much as ever, but there’s one thing I miss — my ritual attendance at Syfy’s Friday night screening of Eureka.\nI’ll be the first to admit that Eureka is not the perfect show. I’d be hard pressed to even call it a great show. The writing is not at the same level as Battlestar Galactica or The Sarah Connor Chronicles or most Whedon series. The episodes are mostly of the mishap-of-the-week variety (for a pro-science show, they do threaten planetary destruction an awful lot), some of the jokes are obvious (I can’t think of any other show with as many boner innuendoes), and the season arcs are not that compelling, mostly adequate as platforms for developing the relationships among the characters.\nBut that’s where Eureka shines. I wouldn’t say there’s any level of sexual tension, but the fun bickering and bantering somehow leads up to pairing up that’s both fun to watch and tugs at the ol’ heartstrings when our heroes run into both personal and scientific challenges. It’s easy to feel for these characters (in contrast to the Revenge-of-the-Nerds vibe of The Big Bang Theory) And it’s all very PG.\nThat’s another thing. I enjoy the edginess of the aformentioned BSG and Sarah Connor Chronicles (by the way, would have oved to see Joe Morton working with Terminator Summer Glau, but his character in Eureka is one of my favorites), however, sometimes you just want to watch something that’s not bleak, and if Eureka is not one thing, it’s bleak. It’s peppy. So the addition of Felicia Day in the final seasons was a perfect match. Zane, I could have done without, but let’s not be mean. There are no bad guys here.\n","date":"August 1, 2017","externalUrl":null,"permalink":"/blog/tv/scifi/imisseureka/","section":"Blog","summary":"It’s been six years in a row at Comic Con and I still enjoy it as much as ever, but there’s one thing I miss — my ritual attendance at Syfy’s Friday night screening of Eureka.\n","title":"I Miss Eureka","type":"blog"},{"content":"I broke my daily blogging streak because of Comic Con, but I’m back now, and to make up for it, I will inflict you, dear reader, with a Comic Con diary (the equivalent of the old slide show presentations of family trips).\nFirst, a travel tip. Take a photo of where you parked. I learned this the hard way.\nBeautiful Las Vegas McCarran airport, before you end up in a grimy terminal filled with slot machines.\nBook pickings are slim at the airport stores, but I did snag this for some flight reading.\nSan Diego airport doesn’t have slot machines, but they do have art and books. Right out of the gate, I walked by their sci fi exhibit. Bradbury, Heinlein, H. G. Wells…\nThe hotels are hip, too (although in my experience Portland has the best hotel service). The everpresent greeter at the Sofia.\nQuick bite at Waters to relax and enjoy the San Diego weather before heading into the mealstrom.\nChecked in at the con. It’s a very efficient process if you know exactly where to go, and I could tell most people didn’t.\nThere’s not much to do until Preview Night opens. I hung out at my sister’s table in Artist Alley.\nIf only the exhibit area was like this every day.\nI go to Comic Con these days as much to see San Diego as the con itself. While walking around, I passed by a WeWork, who’ve done an impressive job amassing a real estate empire based on people who actually want to spend all day in closed spaces together. Nice business model.\nMore interesting, Little Italy, which doesn’t really seem all that Italian, anymore, but you can get gelato, pizza and coffee and check out some art galleries and artsy shops.\nMy favorite part of San Diego and thus Comic Con is the Cat Cafe, which has become a chill place to hang out and meet people during Comic Con. They take reservations and charge $15 during Comic Con, but it’s for a good cause (these cats are all up for adoption). And you get a drink.\nAnother favorite stop is the San Diego Central Library. Comic Con has filled the capacity of the San Diego convention center years ago, but they’ve compensated by spreading out to venues around downtown, including the library, which holds sessions related to education on the scenic top floor.\nThe library also has a nice store where I found a fun cat book for kids, which I donated to the Cat Cafe. Turns out the author is local to San Diego and was doing a signing at the con, so I was able to talk to her, and maybe she and the cafe can do something together. Full circle!\nI can take only so much of the con crowd, though, so I spend a lot of time at the neighboring hotels, where they show movies and run a blood drive. Pro (and non-Pro) tip: take a snack break at the Con Suite.\nOf course, I couldn’t leave without gettin a cosplay pic.\nBack to San Diego airport, which is not a bad place to hang out for a while.\nDowntown San Diego is somewhat bookstore challenged, but the airport has Warwick’s. When’s the last time you saw an airport bookstore that has a science fiction section?\nMy routine there is to buy a book at Warwick’s and then a snack at Elegant Desserts (I was disappointed they didn’t have anything from the Donut Bar).\nBack at McCarran, which doesn’t have a sci fi exhibit, but does have some history stuff, like this classic car that used to tool around the airport before it was named McCarran.\nSee you next year, San Diego.\n","date":"July 25, 2017","externalUrl":null,"permalink":"/blog/comiccon/2017/","section":"Blog","summary":"I broke my daily blogging streak because of Comic Con, but I’m back now, and to make up for it, I will inflict you, dear reader, with a Comic Con diary (the equivalent of the old slide show presentations of family trips).\n","title":"Comic Con 2017","type":"blog"},{"content":"The No Asshole Rule is a good first rule in a company, but a No Bullshit Rule would rank a close second.\nThe first casualty of bullshit is credibility, a non-renewable resource like reliability and trustworthiness. When I hear bullshit, it’s in the record books, and every assertion from the same source from then on is tainted with that bullshit.\nThe second casualty of bullshit is respect. I lose respect for the bullshitter and I feel disrespected by the bullshitter for expecting me to buy that bullshit.\nThe third casualty of bullshit is time. Making up and listening to bullshit answers is a waste of time (and the same goes for bullshit questions). Bullshit as policy results in unrealistic schedules and budgets (or more dire consequences).\nOf course, bullshit abounds. I expect to hear bullshit from politicians, marketing, lawyers, management…well, OK, just about everyone. But it is particularly painful to hear it from engineers. Alas, although engineering is inherently a fact-based activity, engineers have self-images, too, often as know-it-alls and intellectually superior beings, and they (we) don’t like to lose arguments, admit to mistakes, or confess we don’t know something.\nI’ve caught myself more than a few times pretending to understand the topic of discussion because it’s embarassing to say, “Sorry, I’m not familiar with that,” and oftentimes it just seems more expedient to say the expedient thing so you don’t look bad or to just get the conversation over with. But it’s a bad habit. And eventually, you start believing your own bullshit.\n","date":"July 17, 2017","externalUrl":null,"permalink":"/blog/language/silenceisbetterthanbullshit/","section":"Blog","summary":"The No Asshole Rule is a good first rule in a company, but a No Bullshit Rule would rank a close second.\nThe first casualty of bullshit is credibility, a non-renewable resource like reliability and trustworthiness. When I hear bullshit, it’s in the record books, and every assertion from the same source from then on is tainted with that bullshit.\n","title":"Silence Is Better Than Bullshit","type":"blog"},{"content":"A weird thing about the blistering heat of Las Vegas summers: it makes me want to go outside. The rest of the year, I’m content to stay in all day with the windows open and fresh air coming in, but a sealed environment makes me feel I gotta get out of here. I guess space travel is not in my future.\nSo this Saturday I went against my antisocial instincts and trundled downtown in 115 degree heat to check out Las Vegas Demo Day. After all, free pizza.\nThe event takes place monthly at the Redflint Experience Center. It’s a nice venue, and in between sessions, I got to try out the Vive at their VR station. I like the Vive better than my Oculus Rift (much more glasses-friendly), and Tilt Brush was a blast.\nThe presenters were a mixture of experienced and newer developers, and the projects a nice variety of games, web apps, mobile apps, and academic-ish, with intermissions for mingling and follow-up discussions. It’s a friendly environment and a good opportunity to network (some people are there to check out the talent).\nThe other centers of software dev networking here are the Iron Yard (also downtown, and where I attended an entertaining talk by Nolan Bushnell) and the Innevation Center (took me a while to figure out the “ne” is for Nevada and not just bad spelling). And maybe Grouchy John’s where the iOS Developers meetup sometimes congregates. So while it’s not Silicon Valley, Las Vegas does have a tech scene.\n","date":"July 9, 2017","externalUrl":null,"permalink":"/blog/travel/nevada/vegas/demoday/","section":"Blog","summary":"A weird thing about the blistering heat of Las Vegas summers: it makes me want to go outside. The rest of the year, I’m content to stay in all day with the windows open and fresh air coming in, but a sealed environment makes me feel I gotta get out of here. I guess space travel is not in my future.\n","title":"Demo Day","type":"blog"},{"content":"There once was a time when I deployed whatever I could to whatever app stores I could, because hey, I put the work into it. Now I’m pickier. On Amazon, I’ve removed all apps except the paid version of HyperBowl, which I’ve imaginatively called HyperBowl Pro.\nI have some sensible reasons for this app store layoff:\nDownloads are infrequent. Updating apps is time-consuming. Updating apps is confusing if you don’t do it regularly (tip: you have to click on the X delete corner of the existing build icon before uploading a new APK, and don’t click the Remove Build button or you’ll lose your settings). Sometimes they reject an app, e.g. if it doesn’t make use of Kindle Fire buttons or it it links to a page that references other app stores. I don’t need that, I go to Apple for my arbitrary app rejections. My ancient Kindle Fire doesn’t run any of my apps, anymore. And some less rational reasons:\nI don’t like Amazon, their Borg-like presence, and their attitude (“Join our Free App of the Day promotion. Sure, you won’t get paid, but you’ll make it up in volume!”) It really bugs me that you can’t immediately unpublish an app, you have to submit a request with reason to unpublish (although that’s a better situation than the Google Play apps that I can’t unpublish until I update). I don’t like how the Amazon appstore looks. Like most Amazon websites, the Amazon appstore looks like something I might have designed, at best unremarkable, at worst a bit painful to look at, especially with sharp-cornered app icons.\nBut when you round the icon corners, they don’t look good on the app page, like here on the HyperBowl Pro page (which I’m leaving up because it is bringing significantly more revenue than the paid version on Google Play used to).\nThese days, I’m all about app store looks. If I’m not making much money, then at least I want a good looking portfolio. And while Apple’s App Store is the Apple Store of app stores, then Amazon’s is more like a dollar store (although I do like my local Dollar Store).\nThat’s a reason why I maintain my apps on the polished itch.io. I even upload APKs that rarely get downloaded because it just looks better with the little Android icons.\nI also like itch.io because they have app store badges for each app (so it’s sort of a storefront for app stores).\nThey even support Amazon appstore badges, so who knows, maybe I’ll repopulate my account there at some point. When I get a new Kindle Fire.\n","date":"June 24, 2017","externalUrl":null,"permalink":"/blog/app/amazonicantquityou/","section":"Blog","summary":"There once was a time when I deployed whatever I could to whatever app stores I could, because hey, I put the work into it. Now I’m pickier. On Amazon, I’ve removed all apps except the paid version of HyperBowl, which I’ve imaginatively called HyperBowl Pro.\n","title":"Amazon, I Can’t Quit You, Entirely","type":"blog"},{"content":"","date":"June 24, 2017","externalUrl":null,"permalink":"/tags/itch.io/","section":"Tags","summary":"","title":"Itch.io","type":"tags"},{"content":"I watched one season of Dr. Who and enjoyed it, but despite Neil Gaiman’s praises I’m not much of a Dr. Who fan (and I like The Big Bang Theory, so go ahead, dock my nerd cred card).\nStill, I welcomed the announcement of a woman as the 13th incarnation of the Doctor. I mean, look at this roster of previous Whos (image from Wikipedia).\nThe diversity spans the whole gamut of young white British males to old white British males. This constantly renewing time-traveling alien sure doesn’t like to get out of his comfort zone.\n","date":"June 16, 2017","externalUrl":null,"permalink":"/blog/tv/scifi/drwhocares/","section":"Blog","summary":"I watched one season of Dr. Who and enjoyed it, but despite Neil Gaiman’s praises I’m not much of a Dr. Who fan (and I like The Big Bang Theory, so go ahead, dock my nerd cred card).\n","title":"Dr. Who Cares","type":"blog"},{"content":"I wrote this several years ago — since then, the Expanse is another series that does silent (and weightless) space right, and I’ve read that the Chinese in Firefly was originally supposed to be Cantonese, but one of the translators gave them Mandarin and they didn’t notice. Also, the Tams were originally going to be at least part Asian, but they didn’t follow through on that.\nI recently read Serenity Found, an enjoyable set of essays on on Joss Whedon’s Western sci-fi depicted in the TV series Firefly and the movie Serenity. Firefly is probably my second favorite TV series, next to Buffy the Vampire Slayer, for the same reasons as as everyone else — the characters, the humor, the writing, the visual effects and colorful vision of the future.\nBut none of the essays mentioned that in the Firefly universe, space is silent! I can’t think of any sci-fi on film since 2001: A Space Odyssey that didn’t allow sound (big booming spaceship and space weapon sounds) to travel through vacuum. Even the makers of the new Battlestar Galactica briefly considered showing silent film space battles but fell back on the traditional noisy dogfights. Now, it would have been nice to see the Firefly crew floating around their vessel, but I understand television production budgets don’t allow for zero-gravity studios, yet.\nThe aspect of the Firefly universe that really bothers me, though, is the nearly complete absence of Chinese. Now, Joss Whedon’s Sunnydale is no worse than Woody Allen’s and Seinfeld’s Manhattan (although the complete absence of Latinos in Sunnydale, CA is pretty weird). And when white Hollywood screenwriters force the issue and try to go ethnic, the results are sometimes not pretty. Daniel Dae Kim was great as one of Wolfram and Hart’s slimy lawyers in Angel, and I liked the Asian girl in the first Buffy alternate universe episode who ends up on an automated blood-sucking conveyor belt, largely because they weren’t Chinatown demons, exotic hotties from another dimension or Chinese potential slayers complaining loudly in Mandarin about lactose intolerance.\nAnd while I’m at it — how did Crash get an Oscar? A movie ending with illegal alien Chinese smuggled by greedy local Chinese are “rescued” by a African-American carjacker who responsibly dumps them in Chinatown with a a few bucks for noodles. He couldn’t have dropped them off in Irvine?\nBut I digress — the Firefly crew routinely curse in Chinese, which is cute (as much as the pronunciation is awful — and I speak awful Chinese, so I know). The Sino-slang ostensibly stems from an Anglo-Chinese expansion into space. Yet where did all the Chinese go? Two of the Firefly crew have the last name Tam (brother and sister) and have dark hair. Are we to infer that all Asians intermarried with the Anglos enough generations that in the future no Asian actors will be needed? There is one episode — count it, one — where a group of rural Chinese are dancing outdoors. They have no speaking parts, so I guess the future only has room for Chinese extras.\n","date":"June 11, 2017","externalUrl":null,"permalink":"/blog/book/reviews/serenity/","section":"Blog","summary":"I wrote this several years ago — since then, the Expanse is another series that does silent (and weightless) space right, and I’ve read that the Chinese in Firefly was originally supposed to be Cantonese, but one of the translators gave them Mandarin and they didn’t notice. Also, the Tams were originally going to be at least part Asian, but they didn’t follow through on that.\n","title":"In Space, No One Can Hear You Scream…If You’re Chinese","type":"blog"},{"content":"I’ve been on a bit of a belated language-learning kick, lately, with various iOS apps (Memrise, Duolingo…), so I’m dusting off some related tumblr blogs. Here’s one from six years ago:\nI read the Harry Bosch (Michael Connelly) novel Nine Dragons on my Christmas Eve flight to Oklahoma, and while I found the book moderately entertaining, I think the author had Cantonese and Mandarin confused — the translator in the story spoke both of those Chinese dialects, but learned Mandarin because his parents were from Hong Kong, and Mandarin was described as the dialect with the more sing-song tone. That’s Cantonese. I should know, my parents are from Hong Kong and speak Cantonese. (hey, was that character in the book based on me?)\nYou might think what’s the big deal, but then again if I referenced Italian and French interchangeably, you’d probably think that’s stupid. On the other hand, I’ve met plenty of Chinese (including waiters at restaurants that I now know to avoid) who express horror that I can’t speak with them in Mandarin — well, excuuuse me, if I returned to my “roots” I’d be speaking Cantonese, not Mandarin. And you can forget about that tip.\nBut I’m bluffing a little — I can’t speak Cantonese, either, except for the baby stuff I picked up before I entered grade school. And I seem to have a lack of affinity or interest in learning other languages in general — I took a few semesters of Spanish, German, French, and even Mandarin, and very little has stuck with me.\nStill, every little bit helps, I think. A friend of mine who’s a language teacher asked me to cite instances where language skills have been (or would have been) professionally useful, and looking back, I’ve had colleagues in nearly every workplace who were non-native English speakers — Spanish, Chinese, Japanese, Italian, Indian, French, Norwegian, just off the top of my head.\nOf course, they all spoke English in the workplace (well, not of course — I did work for one Japanese-owned company), but look at it from their point of view, they’re forced to speak in a second language all the time. I’m sure any attempt to communicate with them in their native languages would have been much appreciated (and let’s be real, with office politics, you need all the networking you can get). And more and more, you can see professionals conversing with each other (tweeting, etc.) on the Internet in their own languages. They’re probably saying something interesting.\nAside from office gossip and dealing with foreign management, I’ve occasionally had foreign travel on business. I enjoyed going to the Tokyo Game Show, but probably would have enjoyed it more if I knew Japanese (I had a lot of trouble just ordering a Big Mac). You’d think Canada would be a breeze, but I discovered during an AI conference in Montreal that French-speaking skills are welcome there.\nWhich brings me to real work — since joining the game industry, many of my tasks have involved “localization”, customizing games to work with other languages, and the first such project I had was a French version of HyperBowl for installation in Montreal. The translations provided by our client turned out to be incorrect, which was fortunately detected and fixed by another programmer who happened to know French. This also happened on the European version of a GameCube title (this time, fixed by a French-speaking programmer from Switzerland).\nMore recently, I’ve been working on Asian language support for the virtual world Blue Mars, so players can have their avatars converse in Japanese, for example. You can imagine that being able to come up with complete sentences in the desired languages would really help in testing. I even have to install programs with UI’s that are entirely in another language (imagine getting a popup on screen and not knowing which button is “OK” and which is “Cancel”).\nOutside of work, living here in California, the usefulness of knowing other languages is obvious. I sometimes channel-surf onto Telemundo or Univision, and I really want to know what’s going on in those spicy soap operas. Same with the Asian channels (although Time-Warner took away AZN and replaced it with a golf channel). LA has Little Tokyo, Thai Town, Little Armenia, Chinatown, Monterey Park, and I live near Little Saigon in Westminster, the largest Vietnamese-American community in the US (and I imagine the largest collection of Pho restaurants). At one Chinese restaurant nearby, it seemed that the staff was able to speak several languages to accommodate the variety of customers here (Thai, Chinese (Mandarin and Cantonese), Vietnamese…).\nAnd lest you think I’m neglecting Europe, I pay weekly visits to a sandwich shop run by two French ladies. But besides being able to efficiently order off the menu, I think the real value of knowing other languages, even just a little bit, is to appreciate them. A friend from college once confided to me that she was freaked out when she heard her Vietnamese-American boyfriend speak in Vietnamese to his mother. It probably sounded like Klingon to her.\nMore recently, and typical of the immigration debate around here, I had a neighbor who complained to me that English was becoming a second language, his point being that uneducated illegal immigrants from south of the border were taking over (when I pointed out that most of the Spanish-speakers I meet also speak English, he retorted “I’m not talking about all those MBA-types you work with”).\nThis is sad, fear of foreign languages added to a whole ignorant package of xenophobia (there are still locally produced documentaries here defending the decision to intern Japanese-Americans during WWII). And sad that when you have those blinders on, you miss out on all the multicultural goodness around you. So if you’ll excuse me, I’ll head out for lunch at the French cafe, pick up some groceries at the Asian supermarket, and spend the evening trying to figure out what those hot women on Telemundo are saying.\n","date":"June 10, 2017","externalUrl":null,"permalink":"/blog/racism/speakklingon/","section":"Blog","summary":"I’ve been on a bit of a belated language-learning kick, lately, with various iOS apps (Memrise, Duolingo…), so I’m dusting off some related tumblr blogs. Here’s one from six years ago:\n","title":"This is America. Speak Klingon.","type":"blog"},{"content":"One nice feature that Unity as a web site has added over the years is their open bug database. I like to think I had something to do with it, as I asked for this early on (lingering memories of spending six months tracking down an SGI bug only to find out it was in their bug database), and when a Unity developer said that’s unheard of, I pointed to Sun’s Bug Parade as an example.x\nHowever, there are problems shown with this entry. First of all, I don’t like the practice of closing duplicate bugs. It shows that the priority is keeping the open bug count down or recording as many closed bugs as possible. It reminds me of the game publisher who told us to mark all bugs as fixed when we shipped the game!\nBut duplicate bugs are still open bugs, and when you close them you’re discarding or at least hiding useful information. Especially when you say the issue is “resolved.” It’s not resolved. The bug database is not just a todo list for programmers — it ideally should give you all the available information about the state of the product.\nIn any case, there should be a link to the issue it’s duplicating (and a link back so you can see all the related cases). Now there’s no way to see if it’s really resolved or just resolved because it’s a duplicate. There’s no way to compare the case you just reported with the other instances of this issue. Who knows, maybe it was misclassified and it’s not really a duplicate, but there’s no way you can check.\nAnd after asking users to carefully fill out a form and provide a sample project and reproducible steps and error message and stack trace, just saying thanks, you just wasted your time, we already know about this, bug is CLOSED — that’s just a big bureaucratic middle finger to bug reporters.\n","date":"June 7, 2017","externalUrl":null,"permalink":"/blog/management/duplicates/","section":"Blog","summary":"One nice feature that Unity as a web site has added over the years is their open bug database. I like to think I had something to do with it, as I asked for this early on (lingering memories of spending six months tracking down an SGI bug only to find out it was in their bug database), and when a Unity developer said that’s unheard of, I pointed to Sun’s Bug Parade as an example.x\n","title":"Duplicates Are Your Friends","type":"blog"},{"content":"It’s been about a year since I moved from California to Las Vegas, and I like it. I actually thought I might not like it, but felt compelled to make the move to save money (no state income tax, rent is lower by a thousand easily…), because I was getting fed up with California LLC issues, and I’d been telling people for years the smart move was to cash out your California property and live like a king in Vegas (I’m a firm believer that you should do what you say you’re going to do, unless you’re Trump).\nI don’t quite live like a king, but I live comfortably in the North Green Valley area of Henderson, directly east of Las Vegas proper. You can get a nice apartment for under $1000, or a decent condo for under $100k, or a townhome under $200k, or a house under $300k. I’m within walking distance of a supermarket, luxury theatre, Trader Joe’s, coffee, donuts, ice cream and a public library, so I drive as little as I did when I lived in downtown San Diego. The only reason I need to drive is to visit my virtual office to pick up mail. Which is when I get my dim sum fix. There are about ten dim sum places here, which doesn’t surpass the Bay Area or LA, but is far superior to what’s around San Diego. Good ramen selection, too. This is a great food town.\nAnd it’s easier to set up a virtual office here. I don’t even know if it’s possible in California, but here for $35/month, I have a physical business address where they display my business license and receive my mail. That’s a better deal than a rented mailbox, and if business gets good, I can upgrade to a real office.\nYou’d think that California would be the leader in convenient online management of state corporate registrations, but it’s just awful. Just about the only thing you can do online is pay (and I think I have an overpayment of $70 I have no idea how to get back). Nevada lets you do everything online in one place – register an LLC, register the business license, pay, change information…and they actually send you reminders about any annual reregistrations or payments. Unlike California, where they just took money out of my bank account if something was late.\nEven the DMV here is better. Again, everything is available online, and they send registration reminders over a month before they’re due. I used to have warm fuzzy feelings about the California DMV, but in the past couple of years they mingled two different addresses in my registration and sent it to an invalid address that at best would be an empty lot next to a Jack in the Box, and when I changed addresses later, they updated my license but not my registration and I got socked for a late fee. Also, you don’t have to wait like a loser in the DMV office here – they page you.\nService can be spotty (there are lapses in execution that make me think this will never be the next Silicon Valley), but it’s usually friendly, so it’s not like Boston or New York where you have to listen to someone complain about other customers before you can get your matter attended to. I’ve only dealt with one surly apartment manager here, and I suspect she’s from New York. It’s not like it’s Hawaii time here, but the pace is slower, and it took me a while to temper my impatience and mellow. Californians put a lot of effort into looking relaxed, but they’re full of inner anxiety.\nBut actually, it seems like most people I meet here moved recently from California because it’s cheaper, as I did. And everyone I met here says they love it except for the summers. Same here. It’s freakin’ hot, unless you moved here from Arizona. In August, I feel like my eyeballs are boiling, so I stay inside and wait until 2AM to go grocery shopping (there’s a lot of 24-hour stuff in this town). And then it’s still too hot. To compound that, electricity here is expensive (you’d think the whole state could be solar powered). So at least in the summer, I miss California.\n","date":"May 5, 2017","externalUrl":null,"permalink":"/blog/travel/nevada/vegas/livinglasvegas/","section":"Blog","summary":"It’s been about a year since I moved from California to Las Vegas, and I like it. I actually thought I might not like it, but felt compelled to make the move to save money (no state income tax, rent is lower by a thousand easily…), because I was getting fed up with California LLC issues, and I’d been telling people for years the smart move was to cash out your California property and live like a king in Vegas (I’m a firm believer that you should do what you say you’re going to do, unless you’re Trump).\n","title":"Living Las Vegas","type":"blog"},{"content":"Just in case you’ve been laboring under this misconception, the App Store approval process is not so much a review by a jury of celebrity judges like on a reality show – it’s really more like getting processed by a clerk at City Hall. Which makes sense, if you think about how many apps get submitted and updated every day.\nWith most apps, it works out OK. Even in the cases of app rejection, I could read between the lines and discern the underlying company agenda. Like when they took two months to review and reject an app because of “not enough functionality”, I presumed it was really due to the dancing female silhouette in the app. A year later, after they instituted an official nudity policy, it was accepted.\nAnd when they started rejecting apps I created with a certain middleware, saying “could be implemented as a web app”, it was well known they were cracking down on that type of middleware. And this was during the troublesome introduction period of Apple Maps, so they qualified “but we’ll accept it if you integrate Apple Maps”.\nThe big problem is with games. I don’t know if it’s because the reviewers expect games to be like applications, or if they’re wanna-be game designers like users who go “I don’t like this, but it’d be great if you had this…”, or maybe sometimes it’s one or the other.\nCase in point: my first attempt at a tvOS app, the reviewer rejected it because the background image didn’t cover the entire screen and then sent me a bunch of guidelines and links about how to make a “delightful” iOS app. I didn’t see a guideline about that, but fine, I changed the background to cover the entire screen, and this time it was rejected for having a static background. I pointed out that I didn’t see this requirement in the guidelines, either, and if the requirement was to change the aspect ratio (portrait to landscape) of the 3D window, I’d have to redesign many of the 3D environments.\nInstead 0f a confirmation, I got this response.\nWe understand that it can be difficult to determine what the best experience is to offer your users. While there isn’t one set answer that works for every app, the following iOS development videos offer great information for helping understand how your app can provide a great user experience:\nIt’s like a game designer married a corporate lawyer and had a baby.\nNow, I’d pretty much given up on this app by now, but as a minor moral victory I just wanted them to say specifically what it is they want instead of playing guess-what-number-I’m-thinking, so I pressed for a confirmation that they wanted the 3D view to cover the whole screen:\nThank you for inquiry. While your suggestion of making the 3D view fullscreen appears to be in compliance; we are not able to provide endorsement or pre-approval to developers for proposed application ideas or concepts without reviewing the app itself. Each application is unique and we would need to look at all its features, and complexity to be able to give you an answer. Therefore, we recommend that you resubmit your application for review.\nThe traditional publisher-studio model of game development has its painful aspects, but I do appreciate some things, now. Like the concept preapproval, and how at least they’re paying you instead of you paying them while their QA tortures you. This process, in contrast, is like, hmm, I don’t like this, no that’s not it, either, I’ll know it when I see it, never mind just redo the whole thing (literally, the previous time this happened, they called me up to say “start over from the ground up.”)\nNot to sound defeatist, it’s my experience that as the saying goes, you can’t fight City Hall. But you can blog about it.\n","date":"April 25, 2017","externalUrl":null,"permalink":"/blog/yearreview/applereviewspeak/","section":"Blog","summary":"Just in case you’ve been laboring under this misconception, the App Store approval process is not so much a review by a jury of celebrity judges like on a reality show – it’s really more like getting processed by a clerk at City Hall. Which makes sense, if you think about how many apps get submitted and updated every day.\n","title":"Apple Reviewspeak","type":"blog"},{"content":"It’s often exhorted that there’s no such thing as a dumb question, but that’s just dumb advice. (better advice: ask good questions!) Browse Quora for examples.\nThere’s a special category of dumb questions, related to race. A twitter thread started by Rachel Swarns on Asian American experiences reminded me of some I’ve received.\nAre you Korean? I’m thinking of buying a Hyundai, so maybe you can give me some tips.\nThat’s from a museum staffer in Manhattan.\nIs my order ready?\nAsked of me while I’m waiting for my order at a Chinese restaurant in Jersey City. To be fair, the proprietors did offer me a delivery job.\nAre you still open?\nVietnamese restaurant in California. I’ve got to stop going out for Asian food.\nYour baby is beautiful.\nOK, that’s not a question, and it is a good-looking baby, but it’s not mine.\nWelcome to America! Want to buy some weed?\nOregon.\nWhat nationality are you?\nAmerican. And you should probably look up the definition of nationality.\nHow long have you been in this country?\nI give my age, but then they say gosh, that’s a long time, and now I feel old.\nWhere are you from?\nHere.\nI mean before that.\nThere.\nBefore that…\nThat other place.\nYou know what I mean.\nUnfortunately, I do.\nWhat’s your background?\nLisp, Unix. Wait, this isn’t a programming interview?\nAre you Chinese? I had a trip to China last summer. They are such a polite people!\nGood to know, stranger at Denny’s who just approached my table, since I’ve never been to China. However, I did visit Europe, and let me say, they are so civilized over there. Kudos.\nCan you participate in a speech study? We need a sample of non-native English speakers.\nCoworker at a Boston tech company. Dude, just because I don’t have a Boston accent…\nYou guys don’t like Koreans, right?\nNope, but they make great cars.\n","date":"March 16, 2017","externalUrl":null,"permalink":"/blog/racism/dumbquestions/","section":"Blog","summary":"It’s often exhorted that there’s no such thing as a dumb question, but that’s just dumb advice. (better advice: ask good questions!) Browse Quora for examples.\nThere’s a special category of dumb questions, related to race. A twitter thread started by Rachel Swarns on Asian American experiences reminded me of some I’ve received.\n","title":"Dumb Questions","type":"blog"},{"content":"I was getting bored reading my own social media profile blurbs, which were basically product listings like this:\nSelf-publishing Fugu Games and HyperBowl. Author of Learn Unity 4 for iOS Game Development and Technicat on Software.\nThat’s pretty common, but I can’t tell that it actually results in any sales, the text doesn’t really flow that well, and we’re up to Unity 5.5 already.\nSo I changed them from what I’ve made to what I do (or what I want people to think I do):\nWriting, tweeting, blogging, coding, publishing apps and games.\nMaybe that’s too vague, but it’s easier on the eyes, and I’m going to rely on viewers to click on my company link (which every social media profile seems to provide except Medium) if they really want to see my products and services.\nThere are other ways to go. For example, the superlative terms of professional stardom like “visionary”, “expert”, and “czar”. But I think anything resembling Wile E. Coyote’s business card should be avoided.\nI also don’t want my profile to look like it’s for an online dating service. Sometimes I see an age (always young). But otherwise, almost always “millennial”, which just reminds me of the millennials-seeking-millennials meetups I saw listed in San Diego. It’s possible I’ve seen a boomer or two, but never anyone advertising themselves as Generation X. Actually, I don’t remember much Gen X self-designations since the Coupland novel. Maybe it wasn’t a good novel (I don’t know, I just read the first chapter in Wired magaqzine). Then again, Gen Y didn’t catch on, either. I do have hopes for Gen Z if we can turn them into zombies.\nAnd then there’s religion. But almost always Christian. I might have seen a few Muslims, but in this day and age, why invite government data mining?\nThe Christian stuff is often paired with family. Proud husband and father and so forth. Although I think I see more mention of the parental and less of the spousal, so it still works as a dating profile. I’m not knocking bragging about your kids. When I had cats, I inflicted plenty of cat pics on social media. Alas, now I just have a Japanese toy plush cat, so my revealing personal bio would simply read:\nGen X atheist. Proud owner of a fake cat.\nActually, that’s not bad.\n","date":"March 6, 2017","externalUrl":null,"permalink":"/blog/social/profile/","section":"Blog","summary":"I was getting bored reading my own social media profile blurbs, which were basically product listings like this:\nSelf-publishing Fugu Games and HyperBowl. Author of Learn Unity 4 for iOS Game Development and Technicat on Software.\n","title":"My Social Profile","type":"blog"},{"content":"I’ve rewatched my John Wick Blue-Ray enough I figured I should catch the sequel on the big screen (especially since I live near one of those luxury theaters), and John Wick: Chapter Two did not disappoint. I’ve seen enough fight scene critiques (and Kung Fu Film Festival sessions at Comic Con) to appreciate the long action cuts, especially considering Keanu Reeves is over 50. So next time someone asks what to do in the tech industry when you’re over the hill at 35, consider becoming an action film star.\nThe sequel did feel longer than the original, and occasionally I caught myself thinking about what to buy at the grocery store later while Keanu was in the middle of a gun battle, but I actually like the rather obvious attention to the assassin guild world-building (with the rather obvious look ahead to sequels and maybe other properties — video game?). Still, the backstory recap at the beginning is rather perfunctory — essentially a crime boss explaining they killed his dog and stole his car — so I recommend watching the original first.\nAnd I had a some Deadwood flashbacks with Ian McShane echoing a line or two reminescent of his Al Swearengen character and Keanu Reeves sounds a lot like Timothy Oliphant’s Deadwood sheriff at the end. So I also recommend watching Deadwood to see if you also catch these, and because Deadwood is one of my favorite shows all time. And one of the most profane shows of all time. I’m trying to imagine a foul-mouthed John Wick, now.\n","date":"February 27, 2017","externalUrl":null,"permalink":"/blog/film/johnwick/","section":"Blog","summary":"I’ve rewatched my John Wick Blue-Ray enough I figured I should catch the sequel on the big screen (especially since I live near one of those luxury theaters), and John Wick: Chapter Two did not disappoint. I’ve seen enough fight scene critiques (and Kung Fu Film Festival sessions at Comic Con) to appreciate the long action cuts, especially considering Keanu Reeves is over 50. So next time someone asks what to do in the tech industry when you’re over the hill at 35, consider becoming an action film star.\n","title":"Wickwood","type":"blog"},{"content":"…Parag Havaldar! I generally have little interest in the Oscars and rarely watch it, but it sure would be cool to win one. The next best thing is to see a friend win one, so it was great to see that Parag, a colleague from my Nichimen Graphics days (we used to play basketball together!) won a Technical Achievement Oscar for his work on facial capture at Sony Pictures Imageworks. Leslie Mann stumbled through the intro, John Cho was cool (“Parag in the house!”) and Parag gave a really nice speech.\n","date":"February 23, 2017","externalUrl":null,"permalink":"/blog/film/oscar/","section":"Blog","summary":"…Parag Havaldar! I generally have little interest in the Oscars and rarely watch it, but it sure would be cool to win one. The next best thing is to see a friend win one, so it was great to see that Parag, a colleague from my Nichimen Graphics days (we used to play basketball together!) won a Technical Achievement Oscar for his work on facial capture at Sony Pictures Imageworks. Leslie Mann stumbled through the intro, John Cho was cool (“Parag in the house!”) and Parag gave a really nice speech.\n","title":"And the Oscar Goes To…","type":"blog"},{"content":"That ancient Chinese curse, “May you live in interesting times,” seems increasingly appropriate these days. However, it’s not Chinese, and not particularly ancient.\nI didn’t realize this until I looked it up recently on QuoteInvestigator and Wikipedia, after realizing that I’ve never heard anyone in my family say it (although it’s not like we had dinner conversations discussing ancient Chinese sayings), and during six months in Hong Kong the only Chinese curse I heard was the Cantonese equivalent of “fuck” (which I heard repeatedly because I had trouble distinguishing between the six Cantonese tones and the woman who was trying to to teach me the word had to whisper it repeatedly in my ear — so basically she was talking dirty to me and I was totally unable to appreciate it).\nI don’t know about Mandarin or other Chinese dialects, but, like much of the language in general, Cantonese cursing tends to be succinct. “May you live in interesting times,” is about as cutting as “Delete your account.” But it might work in rap.\nSo rather than another case of cultural appropriation, this quote appears to be a case of cultural misattribution, promulgated by Austen Chamberlain, son of Joseph Chamberlain (patriarch of a pre-Kennedy Kennedyesque British political dynasty), who was perhaps born ahead of his time. Austen would be at home in these modern days making ironic hipster statements and sporting nonsensical Chinese tattoos. And he would be living in interesting times.\n","date":"February 20, 2017","externalUrl":null,"permalink":"/blog/racism/mayyouliveininterestingtimes/","section":"Blog","summary":"That ancient Chinese curse, “May you live in interesting times,” seems increasingly appropriate these days. However, it’s not Chinese, and not particularly ancient.\nI didn’t realize this until I looked it up recently on QuoteInvestigator and Wikipedia, after realizing that I’ve never heard anyone in my family say it (although it’s not like we had dinner conversations discussing ancient Chinese sayings), and during six months in Hong Kong the only Chinese curse I heard was the Cantonese equivalent of “fuck” (which I heard repeatedly because I had trouble distinguishing between the six Cantonese tones and the woman who was trying to to teach me the word had to whisper it repeatedly in my ear — so basically she was talking dirty to me and I was totally unable to appreciate it).\n","title":"May You Live In Interesting Times","type":"blog"},{"content":"My Democratic congresswoman’s response to the Muslim ban is rather tepid:\nI support rigorous vetting for anyone entering the United States, to ensure that they pose no danger to our nation or the American people. However, this action by the President has led to the detention of green card holders and those who have already passed through the vetting process. This action appears to have been taken in a haphazard way, that has created confusion, and necessitated swift action from the courts to rectify problems with the order.\nTwo of my constituents, who have been green card holders for the last five years, and are in the process of applying for their citizenship, were detained for roughly eight hours in Chicago. Both are in wheelchairs, and one is legally blind. We can develop a better policy than this, one that is in line with our values, and that is serious about truly protecting the American people.”\nIt reads like “Nice idea, but badly executed, and it inconvenienced two potential voters in my district.” Looking at her background and short congressional history so far, it’s not clear to me that Muslim rights are high on her priority list, so, first I wondered if I voted for her (I really couldn’t remember), and then I wondered why I voted for her (the other guy appeared to be worse, which is pretty much most of my voting decision-making and still better than not voting, or, say, voting for Jill Stein as a protest).\nThis, by the way, is why I didn’t appreciate the Hillary campaign site in Nevada exhorting everyone to vote for the full Democratic slate (there was also a “Millennials for Hillary” group listed — this tribalism is getting ridiculous, but that’s another story). Slavish partisanship is one reason why we’re in this mess. Use your brain and vote for the best-qualified candidate.\nUnfortunately, although I think I voted for the best option in my Congressional district, and she won, I don’t have high hopes for her. I was thinking about moving to adjacent Las Vegas this summer, anyway, where the representatives have made stronger statements.\n","date":"February 1, 2017","externalUrl":null,"permalink":"/blog/politics/jackyrosen/","section":"Blog","summary":"My Democratic congresswoman’s response to the Muslim ban is rather tepid:\nI support rigorous vetting for anyone entering the United States, to ensure that they pose no danger to our nation or the American people. However, this action by the President has led to the detention of green card holders and those who have already passed through the vetting process. This action appears to have been taken in a haphazard way, that has created confusion, and necessitated swift action from the courts to rectify problems with the order.\n","title":"Jacky Rosen Just Lost a Voter","type":"blog"},{"content":"","date":"February 1, 2017","externalUrl":null,"permalink":"/tags/obamacare/","section":"Tags","summary":"","title":"Obamacare","type":"tags"},{"content":"I’ve been a New England Patriots fan since the Parcells era, rooting for them every year, against everyone. And scandals like Deflategate didn’t bother me, because 1) I didn’t feel like the NFL presented a convincing case, and 2) it’s just sports. Who cares.\nBut this will be the first year I’m rooting for the other team (the Atlanta Falcons, in case you don’t follow football or are on another planet). It’s because of Trump. The Patriots don’t just have Friends of Trump, they have Friends of Trump in High Places — the quarterback, coach and owner.\nGenerally, I won’t criticize anyone on their choice of friends. Your friends are your friends, and you’re loyal to your friends. This quote at the end of the movie Devil in a Blue Dress (I can’t remember if it’s in the book) always struck a chord with me:\nEasy Rawlins: If you got a friend that you know does bad things, I mean real bad things, and you still keep him as a friend even though you know what he’s like, do you think that’s wrong?\nDegan Odell: All you got is your friends.\nI understand you don’t like to diss your friends in front of others (at least other non-friends, and especially not in front of your friend’s enemies). In the same way, I can understand how Peter Thiel’s ultra rich Silicon Valley friends try to make excuses for him (although perhaps being a rich and powerful friend alters the equation).\nBut I don’t think any of my friends should be President, even the ones who share all my political beliefs (sorry, everyone). And the Patriots Friends of Trump have shown support for Trump for President (though probably not intentionally publicly) without distancing themselves from any of his statements or views. If they’d just do that…no, never mind. That was last week. Go Falcons.\n","date":"January 30, 2017","externalUrl":null,"permalink":"/blog/politics/friendsoftrump/","section":"Blog","summary":"I’ve been a New England Patriots fan since the Parcells era, rooting for them every year, against everyone. And scandals like Deflategate didn’t bother me, because 1) I didn’t feel like the NFL presented a convincing case, and 2) it’s just sports. Who cares.\n","title":"Friends of Trump","type":"blog"},{"content":"","date":"January 30, 2017","externalUrl":null,"permalink":"/tags/patriots/","section":"Tags","summary":"","title":"Patriots","type":"tags"},{"content":"","date":"January 30, 2017","externalUrl":null,"permalink":"/tags/trump/","section":"Tags","summary":"","title":"Trump","type":"tags"},{"content":"A reviewer of one of my apps on the App Store commented that HyperBowl had the most frequent updates without visible changes of any app that he’d ever seen. I think that was a compliment.\nAnyway, there are many reasons for frequent updates. One is that customers these days expect them. The big names like Facebook, Twitter and Pinterest update every two weeks (and don’t even bother to list specific changes in the release notes, unless you count “bug fixes” as a specific change).\nAnother is that it’s better to make and submit (and then fix, if you screwed them up) incremental changes than make and submit them all at once. Especially with having to go through the review process.\nBut the main reason I like to update my apps frequently is so that I remember how to, and so that I keep up with changes that help or break the build.\nTake for example the Mac App Store version of HyperBowl, which I left unupdated for over a year. I completely forgot how to build a Mac App Store app with Unity, so I had to reread the Unity documentation, which has been unupdated even longer than my app. For example, it suggests using a third-party tool that has not been updated in a couple of years and only exists in undocumented github form. It seems the Mac App Store is not high on Unity’s priority list.\nTo be fair, the Mac App Store doesn’t seem high on Apple’s priority list, either. One indication it’s been too long since your last update is when the certificate used to sign your has expired, but when I went to the certificate management page, none of the nearly dozen types of certificates you can create or for the Mac App Store. However, if you bring up the Preferences window in Xcode, there they are: Image for post Image for post\nAnd once the Mac certificates are created, they can be used to sign the app and installer (I put these commands in a shell script to be run after the Unity build).\ncodesign -force -sign “3rd Party Mac Developer Application: Technicat, LLC” — entitlements HyperBowl.entitlements HyperBowl.app/Contents/Frameworks/MonoEmbedRuntime/osx/libmono.0.dylibcodesign -force -sign “3rd Party Mac Developer Application: Technicat, LLC” — entitlements HyperBowl.entitlements HyperBowl.app/Contents/Frameworks/MonoEmbedRuntime/osx/libmonoPosixHelper.dylibcodesign -force -sign “3rd Party Mac Developer Application: Technicat, LLC” — entitlements HyperBowl.entitlements HyperBowl.appproductbuild -component HyperBowl.app /Applications -sign “3rd Party Mac Developer Installer: Technicat, LLC” HyperBowl.pkg The entitlements file is just a plist with the sandbox entitlement listed:\n\u0026lt;?xml version=”1.0\u0026#34; encoding=”UTF-8\u0026#34;?\u0026gt; \u0026lt;!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd\u0026#34;\u0026gt; \u0026lt;plist version=”1.0\u0026#34;\u0026gt; \u0026lt;dict\u0026gt; \u0026lt;key\u0026gt;com.apple.security.app-sandbox\u0026lt;/key\u0026gt;\u0026lt;true/\u0026gt; \u0026lt;/dict\u0026gt; \u0026lt;/plist\u0026gt; Before building, the app’s info.plist needs to be customized. It would be nice to have this in the Player Settings, but until that happens, various developers have cobbled up their own procedures. I took the postprocess build script from a forum thread, and winnowed it down to what seems to be minimally sufficient.\nusing System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEditor; using UnityEditor.Callbacks; using UnityEditor.iOS.Xcode; public class PostProcessBuildOSX {[PostProcessBuild(1)]public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject) {bool isOSX = target == BuildTarget.StandaloneOSXIntel || target == BuildTarget.StandaloneOSXIntel64 || target == BuildTarget.StandaloneOSXUniversal;if (!isOSX) return;string plistPath = string.Format(“{0}/Contents/Info.plist”, pathToBuiltProject); PlistDocument plist = new PlistDocument(); plist.ReadFromString(File.ReadAllText(plistPath)); PlistElementDict rootDict = plist.root;rootDict.SetString(“NSHumanReadableCopyright”, PlayerSettings.companyName); rootDict.SetString(“CFBundleGetInfoString”, “HyperBowl “+PlayerSettings.bundleVersion); rootDict.SetString(“CFBundleIdentifier”, “com.technicat.hypermac”); rootDict.SetString(“CFBundleShortVersionString”, PlayerSettings.bundleVersion); rootDict.SetString(“CFBundleVersion”, PlayerSettings.bundleVersion); rootDict.SetString(“LSApplicationCategoryType”, “public.app-category.games”);File.WriteAllText(plistPath, plist.WriteToString()); } } This script (placed in the Editor folder) sets the version to the same as the one I use for iOS/Android, the bundle ID, the app category, and the Get Info and Copyright strings that you see in the Get Info popup.\nSo after performing a Unity Build, then running my shell script to codesign and create the installer, I have to upload the pkg file to iTunesConnect using Application Loader. Although the Apple documentation on Application Loader directs you to download Application Loader on a page that has no download link, the current version of Application Loader is now installed with Xcode. However, that wouldn’t upload my app, and on the Apple developer forums that seems to be a known issue as far back as September, and one workaround is to use an older version of Application Loader. Which brings us back to that cul-de-sac download documentation, but it turns out I have a pretty old version of Application Loader still in my Applications folder (maybe that’s why it’s still there).\nAnd that worked. As a bonus, I see the Mac App Store approval times are now as zippy as the App Store, with HyperBowl getting approved in a few hours. One reason I haven’t been updating is because I had a lot of trouble getting it through review the past couple of times (the reviewers seemed to be determined to find fullscreen glitches, even switching to/from fullscreen during level transitions — who are these guys, QA ronin?).\nNow that the submission process is sorted out on both ends, expect frequent updates. Because I can.\n","date":"January 20, 2017","externalUrl":null,"permalink":"/blog/yearreview/backtothemacappstore/","section":"Blog","summary":"A reviewer of one of my apps on the App Store commented that HyperBowl had the most frequent updates without visible changes of any app that he’d ever seen. I think that was a compliment.\n","title":"Back to the Mac App Store","type":"blog"},{"content":"I originally posted this article on my self-hosted blog, then later on Gamasutra, and, after a couple of recent “What part of Asia are you from?” and “What’s your nationality” inquiries, I’m in the mood again.\n(Rewind to 2013)\nAfter seeing yet another I’d-really-like-to-show-some-diversity-but-it’s-sooo-hard-and-I-always-get-in-trouble-for-it article, (which at least is a refreshing change I’d-really-like-to-show-some-diversity-but-the-customer-doesn’t-want-it-and-never-mind-that-I-don’t-have-real-evidence-for-that), I’ll start of this new year with a repost of a Blog I wrote in 2011 after reading a column by Brandon Sheffield that was well intentioned and not as defensive as the latest, but nevertheless rubbed me the wrong way like that salesperson who blared “Ni hao ma” at me in the mall the other day (I’m Asian-American, but I bet that you CAN’T tell that from my speech or writing, except when I start ranting about this stuff)\n(Rewind to 2011)\nI welcomed Brandon Sheffields’ column in the latest issue of Game Developer, pointing out the white male heterosexual dominance of video game “casting”. I’m going to quibble a bit, though. For one, I have trouble believing that white people are deliberately chosen as video game characters because they are “safest”. I don’t sit in on those kinds of meetings (“I vote for female Klingon”), but I just have trouble envisioning a scene where someone says “let’s make the character non-white”, and cooler heads caution “better not, we’re going to get a lot of criticism.” In fact, as in film, there doesn’t seem to be much reluctance in casting non-white characters in non-protagonist roles, particularly as ethnic decoration, or to sex up lead females with bigger boobs and smaller outfits — actually, I have been witness to this type of decision, where a publisher (and our company management) insisted on tarting up our female characters, even more than the game artists wanted to!\nMore plausibly, the subject doesn’t come up and there’s a default assumption the character is white, or if someone does suggest a non-white character, it takes some decision-maker out of his or her comfort zone, and maybe the “safety” rationale is raised, just as dubious as the catering-to-the-market rationale that film studio executives use, when they say, great idea for a movie, but can the lead be a white guy? (Or, as Sheffield points out, in the case of recent Hollywood anime remakes, can the entire cast of this Japanese story be white?)\nWhich brings me to my next quibble. Sheffield states that film has done more to advance racial understanding than to hinder. Maybe in one particular year, here or there, but overall, I doubt it. We’re all programmed by our culture, including film (if you’re going to claim a medium enlightens, you have to admit it can reinforce negatively, too, and there go the defenses about not promoting violence, it’s an art form, etc.), and I think if film was overall a net force for positive social change, we’d all be holding hands and singing “We are the world…” by now.\nIn any case, Sheffield cites Spike Lee and Pedro Almodovar, but films that really make a difference are those that have a mixed cast without being self-conscious about it in settings that we can relate to. Sheffield asks if portraying an Indian character in a game would bring in more Indian players (I assume he means Asian Indian), and concludes not. I think they would, as long as you’re not talking about Apu in a Simpsons game. I just read a story on the Fast and Furious franchise where some of its success was attributed to it’s multi-racial casting. There are some TV shows I watch (e.g. The Mentalist, Bones, The Closer) largely because they regularly feature Asian-Americans like me and for the most part not involved in a story about Chinatown gangs, human smuggling from China, or martial arts (although there is always one such episode).\nOddly, the shows I just cited are crime shows and most of the crime fiction I read have the “white man writing” syndrome where all the characters including the protagonist are assumed to be white (and women are described in terms of how hot they are), and you know this because any non-white character is specified as such when they are introduced, often accompanied by some banter in the form of “hey, you’re white” “hey, you’re black” and some attempt at an ethnic patois. If found it very distracting in the Spenser novels, for example. And speaking of Boston, I have three native Bostonian friends — multigenerational Jewish, Chinese and Italian — and if you closed your eyes and asked them to say “wicked awesome”, there’s no way you could tell which is which.\nAnd that’s the nice thing about writing — you can leave some things open to interpretation. I was actually startled when I saw The Lord of the Rings how white the cast was (except for the orcs). Somehow, when I read it in my childhood, I didn’t visualize it that way. Of course, it’s likewise understandable that white people will assume a character is white unless otherwise specified (I did that with the Alex Cross character of the James Patterson novels until I saw Morgan Freeman in the role), but it can go too far, as with the casting agent I saw interviewed on TV who said Latino actors aren’t getting a lot of roles because there aren’t parts written for them. Implying most roles are written explicitly not for them? Most of the sample scripts I’ve seen while I’ve worked on my never-going-to-be-finished screenwriting project don’t have character descriptions like WHITE MALE, or NOT LATINO. The same goes for video game characters. Personally, I think it would have been cool if Nathan Drake was an Asian-American (for that matter, Indiana Jones, too).\nSo when Sheffield concludes, saying how in a recent project he attempted to create four characters of different races that were “quite different” from his life experience as a Caucasian male, I don’t see why he had to try that hard, unless he normally writes game stories involving British ancestry, dining on haggis or welsh rarebit or whatever, or a game where the character is prone to severe sunburns. I’m glad that he’s encouraging developers to stretch a bit, but don’t get the idea that you have to stretch that far. We’re not that different. Just close your eyes.\n","date":"January 15, 2017","externalUrl":null,"permalink":"/blog/racism/justcloseyoureyes/","section":"Blog","summary":"I originally posted this article on my self-hosted blog, then later on Gamasutra, and, after a couple of recent “What part of Asia are you from?” and “What’s your nationality” inquiries, I’m in the mood again.\n","title":"Just Close Your Eyes","type":"blog"},{"content":"As a mobile app developer, I am frequently approached by people with a “great” app idea. Now I tell them to first read Idea to iPhone by Carla White. It spells out many of the issues I routinely bring up. For example, avoid ideas that require a server — that complicates everything, in an expensive way.\nI don’t agree with everything in this book (I’m not a big fan of NDAs — chances are, your idea is not that special, and if I have to sign an NDA just to hear your idea, I’d rather not hear it)\nAlso, I would add a few more must-research items to the book, such as read the Apple Human Interface Guidelines and their submission guidelines. The former explains the building blocks available to iOS developers, and is a generally good read on UI design (the original Macintosh User Interface Guidelines was a classic read), and if you don’t bother to read the submission guidelines you’re courting an Apple rejection.\nI’ll post my own so-you-want-to-make-an-app list soon. In the meantime, this book is a good start.\n","date":"January 1, 2017","externalUrl":null,"permalink":"/blog/book/reviews/ideatoiphone/","section":"Blog","summary":"As a mobile app developer, I am frequently approached by people with a “great” app idea. Now I tell them to first read Idea to iPhone by Carla White. It spells out many of the issues I routinely bring up. For example, avoid ideas that require a server — that complicates everything, in an expensive way.\n","title":"Idea to iPhone","type":"blog"},{"content":"Prior to reading this book by Nicholas Carlson, I’ve only seen the snippets criticizing Marissa Mayer’s performance at Yahoo and reactions that the book is a hack job. However, I found the author’s treatment to be fairly balanced, pointing out the early progress she made and the major role she played at Google\nFrankly, I found the account of her career at Google and the assorted politics there more interesting than her fewer years at Yahoo, but despite its title, this book is not just about the Mayer era at Yahoo — it covers Yahoo’s history and the succession of management there from its beginning, which is fascinating and convincingly poses the question what Yahoo’s role really is and can the company be saved if the question of its relevance can’t be answered?\nThe book is only slightly blemished by a few incongrously put together sentences where I wondered exactly what point the author was making, and a light touch of the common male tech writer’s tendency to mention womens’ hair color and men’s only if they don’t have hair. I counted two blondes and three bald men. Meyer is one of the blondes, of course.\n","date":"January 1, 2017","externalUrl":null,"permalink":"/blog/book/reviews/yahoo/","section":"Blog","summary":"Prior to reading this book by Nicholas Carlson, I’ve only seen the snippets criticizing Marissa Mayer’s performance at Yahoo and reactions that the book is a hack job. However, I found the author’s treatment to be fairly balanced, pointing out the early progress she made and the major role she played at Google\n","title":"Marissa Mayer and the Fight to Save Yahoo!","type":"blog"},{"content":"I may have to reread the James Ellroy’s other books, as I recall being totally absorbed by the connected history of LA Confidential, The Black Dahlia, American Tabloid…, and [Perfidia] (https://en.wikipedia.org/wiki/Perfidia_(Ellroy_novel))features the same characters and jazzy prose.\nBut while I didn’t quite have to slog through the chapters of this prequel to his “LA Quartet”, I also didn’t find the characters that compelling or sympathetic, particularly with the constant stream of racial slurs.\nThat’s nothing new in Ellroy novels and can be taken as natural patter in historical context, and even taken ironically, but I can’t help feeling the author enjoys writing these words a bit too much, in a Tarantino-esque way. But kudos for placing the Japanese-American internment at the center of the story, even if you don’t buy the conspiracy theory.\n","date":"January 1, 2017","externalUrl":null,"permalink":"/blog/book/reviews/perfidia/","section":"Blog","summary":"I may have to reread the James Ellroy’s other books, as I recall being totally absorbed by the connected history of LA Confidential, The Black Dahlia, American Tabloid…, and [Perfidia] (https://en.wikipedia.org/wiki/Perfidia_(Ellroy_novel))features the same characters and jazzy prose.\n","title":"Perfidia","type":"blog"},{"content":"We’ve all had selfish colleagues, and I even worked with a pathological liar (he was in marketing, so it could have been worse), but a full-blown narcissist is something else. I was really taken aback by my first completely self-absorbed boss (a lot of them become bosses) who’s mantra alternated between “Look at it from my point of view” and “No one knows how hard it is for me” while telling everyone to work overtime as she went off to aerobics class.\nShe especially felt sorry for herself when firing someone. These conversations make her really uncomfortable, she explained to me while simultaneously not paying me (when I asked if she wanted me to continue my contract, she apparently assumed I meant without pay) and complaining she felt I was taking advantage of her. You’ve never really been exploited until you’ve been exploited by a narcissist.\nI say “first boss” because I worked for a second one, a Steve Jobs wannabe (one sign of a narcissist is they admire famous narcissists — not so much for the accomplishments as for narcissistic with impunity). It surprised me that there could be two such similar people, but at least this time I was prepared and got out of Dodge when he transitioned from the effusive you-guys-are-awesome honeymoon period to the peevish I-don’t-see-why-I-should-pay-you rumblings.\nCraig Malkin’s explanation of narcissism in Rethinking Narcissism: The Bad-and Surprising Good-About Feeling would have helped my narcissist-recognition skills. It describes and confirms what I already thought about these extreme cases: these level 9–10 point cases on a 10-point narcissism scale are too far gone for you to do anything about (like alcoholics, they have to recognize the problem themselves)— avoidance and damage control (if avoidance is not an option) are the best you can do.\nHe describes some narcissistic patients and patients who have narcissists in their lives, but I do wonder how much the patients who complain can be trusted in their narratives. How do we know they’re not the narcissists? (What I’ve learned is that narcissists can spin a good yarn — they make the best conspiracy theorists). And of the narcissists he treats, how does he treat them? While he suggests interventions and appeals to empathy, the book is depressingly barren of cured-narcissist case studies.\nBut the main thrust of the book is that there is a healthy level of narcissism, and in fact there is dysfunction in not having enough (“echoists”), evident in people who are uncomfortable receiving compliments, for example. You can imagine an echoist-narcissist pairing is a bad combination.\nOf course, this is all on a spectrum, the aforementioned 1–10 scale, and the book includes a narcissism test (in case you’re wondering, the scoring does compensate for narcissists biasing their answers toward non-narcissism), and suspicious of pop psychology texts as I am (Narcissists are from Mars…), I appreciate the described history and differences in opinion on the subject (narcissism is bad vs. narcissism is not all bad).\n","date":"January 1, 2017","externalUrl":null,"permalink":"/blog/book/reviews/rethinkingnarcissism/","section":"Blog","summary":"We’ve all had selfish colleagues, and I even worked with a pathological liar (he was in marketing, so it could have been worse), but a full-blown narcissist is something else. I was really taken aback by my first completely self-absorbed boss (a lot of them become bosses) who’s mantra alternated between “Look at it from my point of view” and “No one knows how hard it is for me” while telling everyone to work overtime as she went off to aerobics class.\n","title":"Rethinking Narcissism","type":"blog"},{"content":"The problem with calling someone a racist is no one believes they’re racist, even though we evolved as biological generalization-making and snap judgement machines (see Malcolm Gladwell’s books), and have been fed with biases and stereotypes by society and culture (even bots get racist when exposed to the Internet).\nYet Silicon Valley tech execs who pride themselves on rationality are unable to believe themselves capable of even subconscious bias, even as they sell advertising space and distribute fake news. So what can you expect from those who consume it?\nIf we all admitted we’re at least a little bit racist, then we can move on to how racist are you? Like at the Japanese curry restaurant I frequent, where they ask how spicy you want it on a scale of 1–20 (3 is a medium, which probably works for racism, too).\nIf you voted for Trump because you like the racist things he said, then you’re high on the racist-o-meter. I mean, you voted for the same reasons as David Duke. If you voted for Trump despite the racist things he said, then you’re probably still at least in the mid-range, because those racist things apparently just aren’t that important to you. Whereas, say, if you’re Muslim, then being banned, listed in a registry, or worst case, ending up in a concentration camp, is a deal-breaker.\nNow, I did see a Medium blog titled something like “I’m a Muslim who voted for Trump and I’m not racist” from a woman who voted for Trump because she didn’t believe he would be allowed to keep his racist and anti-Muslim promises. In this particular case, I believe her, she’s not a racist. She’s an idiot (and the problem with calling someone an idiot is no one believes they’re an idiot). That’s just really bad risk management.\nThat reminds me of this one storeowner who told me Trump was the guy to get us out of this mess, because the qualified people got us into this, so it will take an unqualified guy like Trump to get us out…unless he turns into Hitler. Again, bad risk management, and if he wasn’t white, I expect he’d take the Hitler thing a bit more seriously.\nBut actually, among the storeowners (for some reason they were mostly storeowners) who tried to convert me to Trump this summer, he was the only one who was white, and he was the only one who wasn’t blaming the country’s ills on illegal aliens, so it goes to show minorities can be as racist as anyone else, especially if it’s against another minority. I’ve discovered this also on plane trips (I’ve got to stop flying Grievance Coach class), having sat next to a Muslim couple complaining about Jews, and an Indian woman complaining about Muslims. If they would just all get on the same flight together…(story idea!)\nOn the other hand, if you have a mixed heritage, that cuts down the number of groups you might feel prejudiced toward. I’m Chinese-American (usually I just think of myself as American, but people keep reminding me I’m Chinese), with white, other Asian, Muslim, Jewish, Christian, very Christian, agnostic, atheist, probably some Buddhist, and gay relatives.\nAs a consequence, I’m easily offended. For example, while I was living in a New Jersey town that looked like it’d been a target of Chris Christie retribution, a woman told me, “I don’t care about the color of anyone’s skin,” which invariably leads to a racial monologue, which in this case included the tidbit that “you know, Obama is from the ‘neighborhood’”, and “he’s Muslim because his father was Muslim and they say that makes him Muslim.” When I pointed out that that would make me Muslim (not that there’s anything wrong with that), she said “but you’re not a terrorist, right?”\nSo apparently, while being related to a minority (or if you’re a minority, a different minority) may broaden your perspective, just talking to one, not so much, notwithstanding one Medium blogger’s contention that we should do business with Peter Thiel in order to engage with Middle America (I can’t imagine a German-born Bay Area billionaire has much relationship with Middle America beyond flying over it a lot).\nWhich is another example of how this election has brought out the stupid in a lot of blogs. But while we’re waxing (blogging) ridiculous, I recall another story idea I had about a society where everyone could only marry someone of a different race. I don’t know if it would make a good scifi novel, but it would be a fun campaign platform.\n","date":"January 1, 2017","externalUrl":null,"permalink":"/blog/racism/racistometer/","section":"Blog","summary":"The problem with calling someone a racist is no one believes they’re racist, even though we evolved as biological generalization-making and snap judgement machines (see Malcolm Gladwell’s books), and have been fed with biases and stereotypes by society and culture (even bots get racist when exposed to the Internet).\n","title":"Where are you on the Racist-O-Meter?","type":"blog"},{"content":"From online reviews, it seems many readers of Stanley Fish’s https://www.harpercollins.com/products/winning-arguments-stanley-fish?variant=32130292711458[Winning Arguments] were disappointed that the book doesn’t actually tell you how to win arguments. It’s actually rather fatalistic in describing futile arguments: those that are full of emotion and recrimination and spiral out of control, and those that are grounded in such opposing viewpoints that rapproachment will never happen.\nHe does provide some tips, marriage counselor style and actually provided by marriage counselors, on how to get out of arguments by taking a step back and being more objective, by being more empathic, and making concessions. I just find that more discouraging, not just because the author admits they don’t really work for him, either, but because those tactics only work great when the other party reciprocates. Often I’m talking with someone who just wants to win and come out not wrong, and if you give them an opening, they’ll take it. (“Maybe I misunderstood you.” “Yes, you misunderstood me.”)\nI do find useful arguments of the sincere information trading variety where you can go in providing your arguments with context saying “This is what I think but on the other hand this and this…” and you can genuinely say “That’s a good point” when someone points out something you overlooked or didn’t know and at the end you can recap with due credit to each person’s observations.\nBut often I’ve met people who are compulsive, oftentimes defensive, arguers (for some reason, I’ve met a lot from New York). They will argue to win the argument and reflexively hop around spontaneously-generated assertions to keep their momentum going (I blame high school debate for training students to talk really fast just to spew out more points than the opposition).\nSometimes they are recreational arguers who enjoy the process, apparently as a form of conversation, so they’re disappointed if you abstain. But that’s not my idea of fun or time well spent, so my policy toward arguing, if you can’t trust going in unarmed, is similar to Colin Powell’s criteria on invading other countries. Don’t get in unless you think you can win, go in prepared with overwhelming resources, and have an exit strategy.\nI do find illuminating the author’s comparison of different arenas of argument, including marital, academic, political (of course) and legal, and the forms argument can take, even visual. And the author, no surprise as an attorney, has a genuine appreciation of argument and considers it a core process of how we develop and operate as a society, though he makes the goal of seeking an objective truth through argument seem like a fool’s errand. I also would have appreciated some tips on how to avoid getting into arguments (or avoiding bad arguments), before it’s too late, but I won’t quibble about that.\n","date":"January 1, 2017","externalUrl":null,"permalink":"/blog/book/reviews/winningarguments/","section":"Blog","summary":"From online reviews, it seems many readers of Stanley Fish’s https://www.harpercollins.com/products/winning-arguments-stanley-fish?variant=32130292711458[Winning Arguments] were disappointed that the book doesn’t actually tell you how to win arguments. It’s actually rather fatalistic in describing futile arguments: those that are full of emotion and recrimination and spiral out of control, and those that are grounded in such opposing viewpoints that rapproachment will never happen.\n","title":"Winning Arguments","type":"blog"},{"content":"One reason to use more than boilerplate release notes in the App Store is to avoid an utterly boring Version History. For example, look at the App Store history for Facebook (“Thanks for using Facebook!…Thanks for using Facebook!…Thanks for using Facebook!…”)\nI like browsing the version histories of my own apps just to make sure I’ve actually been making progress. And at year end, I can point to them and say, “See, look what I did.” So here are four iOS apps I can remember actively developing (the rest are mostly “Updated to Unity 5.3…Updated to Unity 5.3.1..Updated to Unity 5.3.2…All work and no play makes Jack a dull boy.”).\nI’ve been working on this app for WordsEye for quite a while, and it was finally released, recently. So far, just one crash fix update.\nI’ve been dabbling with this app ever since working and eating in Hong Kong and realizing iOS has Cantonese text-to-speech. Last year I switched it over from Xamarin to Swift last year. This year I switched it from free to paid after Apple discontinued iAds, so downloads have dropped. But I’ve received feature requests (for food and favorites), so gotta keep plugging away at it.\nMy flagship app from the early days of the App Store in 2009. Up to around 400k downloads (counting the free versions), with a non-insignifant following on Facebook, and it’s licensed IP, so I gotta keep trying to make some money on it.\nAnother contract, this year I started working on updates of the iPad app for Cinefex. Most of the updates correspond to new editions of Cinefex magazine (issue 150 should be showing up soon!)\n","date":"December 31, 2016","externalUrl":null,"permalink":"/blog/yearreview/yearinreleasenotes/","section":"Blog","summary":"One reason to use more than boilerplate release notes in the App Store is to avoid an utterly boring Version History. For example, look at the App Store history for Facebook (“Thanks for using Facebook!…Thanks for using Facebook!…Thanks for using Facebook!…”)\n","title":"The Year in Release Notes","type":"blog"},{"content":"","date":"December 6, 2016","externalUrl":null,"permalink":"/tags/nook/","section":"Tags","summary":"","title":"Nook","type":"tags"},{"content":"For years, my policy about unpublishing apps was not to. Especially after going through Apple’s approval process, that app is there to stay. But this past year or two has seen some downsizing of my app portfolio for a variety of reasons.\nFor example, both Apple and Google, as part of their sweep for moldering apps, unpublished a few apps that I made with middleware (like Andromo) that I can’t or won’t use, anymore, resulting in unattended apps.\nThere are some apps that I was updating, but the approval process was getting to be too much trouble. I had an app called Elektra Dance that Apple periodically rejected (because of implied nudity). That was an example of an app that I didn’t even care about that much, but it spent so much time wallowing in the review process, I’ve been keeping it around for years. Nevertheless, after new Apple objections from the most recent update attempt, I decided enough is enough, time to declare victory and Developer Reject that app so I won’t keep going back to the Resolution Center (the App Store version of getting sent to the principal’s office).\nIn the good old days, you didn’t have to worry about an app approval process with Google, but they recently started applying more scrutiny to paid apps for some reason, and by scrutiny I mean an apparently automatic scanner that flagged a comma separated credit list in my paid HyperBowl app (HyperBowl Pro) as a set of tags and a complaint that the content rating I supplied was incorrect. I got rid of the credit list but couldn’t figure out what content rating they wanted. Originally, it basically had a PG rating and when cranking it up to NC-17 didn’t work I decided this was a lot of time spent on an app that’s mostly pirated, anyway. So now I’m sticking to free ad-supported apps on Google Play, including the free version of HyperBowl.\nWhich led me to think that instead of being reactive, let’s be strategic about this product pruning, or at least pretend we’re doing it for strategic reasons. So I did the same thing on the Amazon Appstore, the evil twin of Google Play, except in that opposite universe I’m making more money off the paid version of HyperBowl, so I’m getting rid of the free version.\nBut this is another reason I don’t like to remove apps. No matter how silly the app or how many people don’t like it, there are always some that do. And I hate to throw away nice reviews even more than I hate throwing away apps.\nNow I’m having second thoughts, but Amazon doesn’t have a simple publish/unpublish switch like Google and Apple. You send in a removal request, which takes two days to process, and if you have removal remorse, you have to reintroduce your app as a new app (one reason why the Amazon Appstore is the evil twin).\nThe Nook app store had this process, too, and look where they are now. Although Google has a simple switch, it doesn’t work if the app metadata isn’t up to date, so I have several apps that I would like to remove, but then I’d have to update the store description with all the latest fields and required graphics just to remove an app because I don’t want to update it, anymore. That just seems perverse.\nSo Apple has the most arduous app approval process, but they do app removal right.\n","date":"December 6, 2016","externalUrl":null,"permalink":"/blog/app/retiringapps/","section":"Blog","summary":"For years, my policy about unpublishing apps was not to. Especially after going through Apple’s approval process, that app is there to stay. But this past year or two has seen some downsizing of my app portfolio for a variety of reasons.\n","title":"Retiring Apps","type":"blog"},{"content":"","date":"October 2, 2016","externalUrl":null,"permalink":"/tags/facebook/","section":"Tags","summary":"","title":"Facebook","type":"tags"},{"content":"","date":"October 2, 2016","externalUrl":null,"permalink":"/tags/instagram/","section":"Tags","summary":"","title":"Instagram","type":"tags"},{"content":"I’d like to say I use Instagram as part of an overarching social media strategy, but to tell you the truth I only started using it recently, for the following reasons:\nMy sister said I should use it. She has a lot more followers, and she’s the one who said I should start using Facebook and Twitter. As one would expect, Instagram shares easily with Facebook. I used to use Pinterest a lot (and I still like it better than Instagram), but when their shares to Facebook started to not look so good, I started posting photos directly to Facebook. This is also one reason I stopped using Foursquare. Well played, Facebook. My Facebook friends complained I wasn’t performing checkins with the photos that I posted. That happens more or less automatically with my Instagram photos, so now, Instagram first. It seems more of my friends (Facebook and otherwise) are active on Instagram. However, the number of Instagram photos I share to Facebook is diminishing, because:\nFacebook kept nagging me to write a review of my recent checkins. I’m more likely to post photos on Instagram that I wouldn’t post on Facebook. I post a lot of food photos, and some of my white Facebook friends go “Ewww!” when they see unfamiliar foods. (Don’t get me wrong, some of my best Facebook friends are white, but sometimes I feel like a need to add a #NSFWP tag — not safe for white people). So you could say that I’m using Instagram more because I’m using Facebook less. Not so well played, Facebook.\n","date":"October 2, 2016","externalUrl":null,"permalink":"/blog/social/whyiuseinstagram/","section":"Blog","summary":"I’d like to say I use Instagram as part of an overarching social media strategy, but to tell you the truth I only started using it recently, for the following reasons:\n","title":"Why I Use Instagram","type":"blog"},{"content":"Facebook, I’m unfriending you. It’s not you, it’s me. No, it’s you. You’re too clingy. Constantly reminding me of my Memories, it’s like hanging out with my college buddies or my Mom (“Remember that time when…”) And saying “We care about you and your memories” every time just sounds simultaneously touchy-feely and insincere. Do you really care I ate a burrito six years ago and for some reason decided to share it with everyone?\nHonestly, you’re a bit of a nag. Like with the Suggested Pages. Maybe you’d like this page. Or this one. Or this one. Leave me alone.\nAnd I think you’re beginning to take me for granted. Every time I post a photo via Instagram, you tell me to write a review on it. How about saying “please”?\nI do appreciate how you’ve introduced/reintroduced me to my friends. And I don’t mind baby pics, pet pics, work pics, but the political stuff makes me reach for the unfollow button (I don’t see the point of follow, but unfollow is indispensable until they add a no-Fox-News filter).\nSo I’ve stopped checking Facebook on my laptop. I still check Facebook on my iPhone and iPad, but that means I check it less often and not while I’m working, but when I’m doing something useless, like eating lunch or standing in line. And when I do check it, I only check it briefly. I don’t know if it’s the screen size or the handheld nature of using an app or the minimal-attention-span nature of using a handheld device, but I just check notifications and maybe scroll down the feed just a bit to see that latest.\nPart of that is due to the app design. Some features are just missing, e.g., the app tells me about new comments on an album, but it doesn’t show those comments. One welcome deliberate omission is Messenger-now that it’s a separate app that I don’t install, I don’t have to deal with chat. All those “Is it done, yet?” Skype messages at work (they should create an app that only sends is-it-done-yet messages and call it an Enterprise edition), have soured me on IM.\nI can’t quit you. I have too many high school classmates on Facebook whom I’m otherwise never recognize at a reunion (if I ever get around to attending one). But after years of this dysfunctional relationship where I’m complaining about you while still constantly checking on you and posting, I think we need some time apart. At least until after the election.\n","date":"September 18, 2016","externalUrl":null,"permalink":"/blog/social/unfriendingfacebook/","section":"Blog","summary":"Facebook, I’m unfriending you. It’s not you, it’s me. No, it’s you. You’re too clingy. Constantly reminding me of my Memories, it’s like hanging out with my college buddies or my Mom (“Remember that time when…”) And saying “We care about you and your memories” every time just sounds simultaneously touchy-feely and insincere. Do you really care I ate a burrito six years ago and for some reason decided to share it with everyone?\n","title":"Unfriending Facebook","type":"blog"},{"content":"","date":"August 10, 2016","externalUrl":null,"permalink":"/tags/vr/","section":"Tags","summary":"","title":"VR","type":"tags"},{"content":"A year after failing to assemble a Google Cardboard kit I saw on the shelf at Barnes and Noble, I made some more progress by finding a fully assembled Cardboard viewer at Toys ‘R Us (they had a couple of models).\nThat was cool, but the viewer doesn’t fit the iPhone SE I downscaled to (I haven’t seen any Cardboard viewers that do). But after seeing a stack of Oculus Rifts at Best Buy (oddly, another nearby store has none and displays a sign saying they’ll arrive this winter), I plunked down for a whole Rift setup.\nThe Asus Rift-ready PC I also got from Best Buy does the trick, but doesn’t have any setup documentation (do they think they’re Apple?), and the most helpful information came from Amazon reviews.\nOnce I got it up and running after buying more cables (it only has one HDMI port which is needed for the Rift), I have to admit I’m hooked, sort of, and the experience is pretty much as advertised — it’s immersive and absorbing, a bit disturbing a la 3D movies (like when a dinosaur starts running at you), and some of the motion-intensive apps made me feel like throwing up.\nI’m surprised I haven’t heard anyone express problems with the Rift and glasses. The Oculus doc on their web site says it should fit your glasses but if it doesn’t, don’t use those glasses. Which is pretty much what I did. My regular glasses didn’t fit, so I switched to my alternate pair with the newer prescription that gives me headaches. The immersion is somewhat dampened by the headset pressing my glasses into my face, so that keeps the sessions short. I’ve started supporting the headset with my hands, and at one point I just wore the headset like a baseball cap and watched the imagery on the monitor. The most annoying thing is my glasses are bent and scruffed up after each session so I have to wipe them clean each time.\nThat’s still better than other devices I’ve tried at trade shows that didn’t accomodate glasses at all (resulting in very short demos: “Look at that object.” “What object? It’s all a blur.”). Again, this is a similar experience I’ve had with 3D movies — those glasses never work with my glasses. This should be one of the first questions asked of new technologies: will it work for the four-eyed market? Remember who your early adopters are.\nIn the meantime, I might just have to get contacts.\n","date":"August 10, 2016","externalUrl":null,"permalink":"/blog/yearreview/vrprogress/","section":"Blog","summary":"A year after failing to assemble a Google Cardboard kit I saw on the shelf at Barnes and Noble, I made some more progress by finding a fully assembled Cardboard viewer at Toys ‘R Us (they had a couple of models).\n","title":"VR Progress","type":"blog"},{"content":"“Apologies for any confusion,” was the official reply for Ubisoft’s boneheaded survey. This is a classic non-apology non-confession. It doesn’t admit to any mistake or wrongdoing and even hints it might be your fault for misunderstanding. After all, you are apparently easily confused.\n“Miscommunication” is another one. It sounds better than “lying” or “didn’t bother to tell you” or “just wrong.” Like when the Mars Climate Orbiter crashed and burned on Mars (actually, the reverse) due to an English-metric unit mismatch, that was a miscommunication. Thanks for stating the obvious. But at least there’s an admission in there that someone miscommunicated.\n“Lack of communication,” on the other hand, seems to say this is a partnership, and this could have been avoided if we just talked more. Keep in touch. Don’t be a stranger. Let’s have more meetings. Perhaps that three hour session of anecdotes from my boss would actually be helpful if it went on for another hour. Let’s skype. And we should listen to more cable TV news.\nAs a troubleshooting conclusion, it’s like pointing to a cadaver during a postmortem and citing “lack of breathing” as the problem. It’s likely not the fundamental issue, and in many cases, unreasonable to expect. And if you did get more communication, even of the honest nature, it might not be that helpful.\nFor example, people have differing agendas. No one’s going to say, “Yeah, I want something totally different than you, but here’s all the information that would be helpful to you and detrimental to me. Good luck!” Especially from those who believe advancement is a zero-sum game.\nAnd then there’s incompetence. The problem with incompetence is no one realizes they’re incompetent. So you’re not going to get “Here’s all I know, and it’s probably wrong,” or “Keep checking with me, there’s probably something important I’m neglecting to tell you.”\nPeople like to keep their options open. That’s one reason why decisions and projects are late and you’re eating dinner at work. It’s not that the decision wasn’t communicated. The decision wasn’t made.\nSome people are just inconsiderate. Like those who don’t use their turn signals.\nAnd then there’s full-blown narcissism. Or as I like to call it, why-can’t-everyone-read-my-mind. I had a boss who was constantly complaining her employees didn’t do what she wanted even when she hadn’t said what she wanted. Following up on that turn signal analogy, I had to follow her once while she was driving fast in her BMW while making sudden lane changes and turns without signalling.\nSometimes it’s not malice or gratuitous selfishness, just self-preservation. I had a coworker fail to report his lack of progress until nearly the project deadline (he still didn’t report it, the project manager finally figured it out). I would like to say that’s no the way to go, but he lasted longer in the company that way than I did.\nAnd sometimes you figure, what’s the point? I had a boss state you should always report bad news, but that’s easy for her to say. I put that theory into action at my first job and discovered it’s a good way to shorten your job tenure. Not that I got kicked out — just when you lay out all your complaints and it’s clear no one wants to hear them, everyone’s ready to part ways that much sooner. There’s probably a dating analogy in there.\nSo next time I hear it was a “lack of communication,” well, thanks for the communication. It was really helpful.\n","date":"July 10, 2016","externalUrl":null,"permalink":"/blog/language/failuretocommunicate/","section":"Blog","summary":"“Apologies for any confusion,” was the official reply for Ubisoft’s boneheaded survey. This is a classic non-apology non-confession. It doesn’t admit to any mistake or wrongdoing and even hints it might be your fault for misunderstanding. After all, you are apparently easily confused.\n","title":"What We Have Here Is A Failure To Communicate, But That’s Not The Real Problem","type":"blog"},{"content":"","date":"June 30, 2016","externalUrl":null,"permalink":"/tags/manzanar/","section":"Tags","summary":"","title":"Manzanar","type":"tags"},{"content":"On my way back from Lake Tahoe last week, I decided to take the scenic route down 395, not realizing one of the sights is Manzanar, probably the most well-known internment camp where Japanese-Americans were relocated in World War II. You can’t miss it — the guard towers are easily visible from the highway.\nI’ve been to the Japanese-American museums in LA and Portland, but it’s one thing to see an exhibit on the internment and another to actually see where it happened and stand there in the heat and dust (and it’s still early summer), surrounded by barbed wire, and think about all the families that were removed from their homes and imprisoned here because of their ancestry.\nMost of the buildings are gone.\nBut there are remnants of the park.\nAnd the cemetery.\nThere’s even a pet cemetery.\nThe park rangers there told me some people drive by every day and have never stopped. By all means, stop and look.\n","date":"June 30, 2016","externalUrl":null,"permalink":"/blog/travel/california/manzanar/","section":"Blog","summary":"On my way back from Lake Tahoe last week, I decided to take the scenic route down 395, not realizing one of the sights is Manzanar, probably the most well-known internment camp where Japanese-Americans were relocated in World War II. You can’t miss it — the guard towers are easily visible from the highway.\n","title":"Manzanar","type":"blog"},{"content":"","date":"June 7, 2016","externalUrl":null,"permalink":"/tags/office/","section":"Tags","summary":"","title":"Office","type":"tags"},{"content":"I don’t want to be one of those who go on about the good old days, and for software development, there’s a world of difference today. As I was recently googling for answers on stackoverflow, it occurred to me that Irix OpenGL linking bug which took me over half a year to track down back in the min-90’s (it would have been longer if some SGI folks hadn’t seen us demoing a Windows version of our product which prompted them to send us engineering help instead of more salespeople), would probably have been solved in an afternoon if we had today’s Internet back then.\nAnd look, I’m self-publishing games and apps developed on my own with a laptop in my living room instead of working in a huge team with expensive middleware on software dictated by a publisher or corporate management. Although I still have to do the latter on occasion to pay the b8lls.\nBut not everything is better. For one thing, as an industry professional, the office situation has gone steadily worse. (The other thing is interviewing, but I’ll save that for another article). When I started in the 80\u0026rsquo;s, it was customary to share an office, but it was an office, and usually with just one officemate. At my first job with Texas Instruments, it was me in one corner of a large office and my officemate in the other corner. At MIT, I shared a smaller office, and drink fridge, with a grad student. And also at the Space Telescope Science Institute, I had one officemate.\nBut one officemate is still one more than ideal, so I was pretty happy to get my own office at BBN, where that was standard. You might think, as “open office” advocates are wont to say, that this results in introverted engineers shutting their doors and never communicating with others, but actually what happens is you can get work done without listening to your officemate get in political arguments or have long phone conversations, and you can actually hold spontaneous meetings in your office (only awkward when someone I interviewed with called during one of those meetings).\nBut that was in the mid-90’s and the beginning of the end. BBN with its new management from IBM and Internet-centric focus proudly announced their new “open office environments” which turned out to be cubicles. Perhaps that also signaled a new emphasis on marketing-speak.\nFrom there, it was downhill. I moved to LA and shared a large office with two others at a small company in LA, still considered crowded at the time but not too bad. It was pretty much impossible to conduct business phone conversations, though, so I ended up conducting my weekly phone meetings with Franz (not the guy’s name, but our Lisp compiler vendor) at home before coming into work. So when I read about CEOs who have no office like everyone else at work, I say, yeah, right.\nThen I moved to Silicon Valley and my non-cubicle run was finally over. It was a bubblelicious time, so we did upgrade to super cubicles, importing ceiling high custom wood-with-sliding-glass-door cubes from Canada which made me feel even more exposed like a panda at the zoo, so I tried covering up the door with Buffy the Vampire Slayer and Dr. Evil posters, but the CEO ordered them taken down (I’m not sure which was the offending poster, or both). Still it felt more like an office than a cubicle, albeit with me inside staring balefully out (I did set a trend in arranging my desk to face outward — everyone was doing it).\nMy next startup in San Francisco also transitioned from traditional cubes to not-so-cubed, when we got funding and moved upstairs to rooms with a view. I did have to share an office again, but the view was fantastic and this being a San Francisco dot com, we all got Aeron chairs, and then for budgetary reasons settled for cheap folding tables as desks (I do the same for my home office — the cheap table, not the expensive chair).\nThen I went into the game industry, and I’ll keep it short — open office, then crammed into a small office with two others (after being assured that it was would be just one — it’s not a good sign when things aren’t turning out how you expected on the first day).\nAfter that, I went freelance with only the occasional on-site contract, so it was several years before I encountered the really open open office where everyone is sitting at a single table together wearing headphones and pretending not to see the people on either side and facing them. This arrangement is great for Maryland crab cake feasts and table top games, but pretty much the worst arrangement for work short of having people sitting in each others’ laps.\nI did try this seating arrangement in a WeWork office once. I found the whole coworking space thing ridiculous. Partly the concept, largely the execution. I see the appeal — it was all new and shiny with glass walls everywhere, filled with a lot of young people who liked to call themselves millennials and talking about how they’re targeting millennials, business school grads walking around saying they’re going to be the AirBnb of this and the Uber of that (“We’re gonna crush it!”), shelves full of design books and the occasional programming book, and free coffee.\nI like the free coffee. The glass walls were silly. I’m not just saying that because I walked into one of them (ouch!). I did appreciate that in the summer walking through the halls you could see a lot of nice legs in those offices, but if I paid for an office I’d want some privacy (brings back memories of those glass cubicles…). And for business reasons, you need walls. If you have any confidential information, a glass-walled office is not the best place to keep it (much less confidential hardware — I have console equipment that I can keep at home as long as it’s in a room where not everyone can see it).\nBetween the picnic table and the glass office, they have variations of desks and cubes, including the budget “hot desk” option where you grab whatever seat is available every day. I’m tempted to say I don’t see the point, but I can understand some people go stir crazy if they’re working at home by themselves, especially if they’re crammed into a dinky apartment in the big city, but why not just work at Starbucks? The coffee’s not free, but the music is better. And they have some comfy lounge chairs. At WeWork, I did spend the majority of my time in their lounge on the sofa (where people would wander in off the street and ask what is this place?), made possible by working on a laptop (if you have a desktop PC in one of these coworking spaces, you have to tether it like a bicycle on a sidewalk).\nIn fact, I’ve noticed that recruiting pages for tech companies often show some smart and sharp-looking young people sitting with their laptops on a sofa. So maybe I’m complaining needlessly and for the next open office trend everyone will move into the lounge. Or their neighboring Starbucks.\n","date":"June 7, 2016","externalUrl":null,"permalink":"/blog/management/openopenoffice/","section":"Blog","summary":"I don’t want to be one of those who go on about the good old days, and for software development, there’s a world of difference today. As I was recently googling for answers on stackoverflow, it occurred to me that Irix OpenGL linking bug which took me over half a year to track down back in the min-90’s (it would have been longer if some SGI folks hadn’t seen us demoing a Windows version of our product which prompted them to send us engineering help instead of more salespeople), would probably have been solved in an afternoon if we had today’s Internet back then.\n","title":"The Open Open Open Office","type":"blog"},{"content":"I formed Technicat, LLC almost eleven years ago after I had two contracts in a row and it looked like I wasn’t just using the word “consulting” as a euphemism for unemployment. Also, it’s a lot easier to get evaluation software when you have a company.\nBy now, I’ve had enough clients and contracts to rank them in various ways.\nRevenue # Not to sound mercenary, but as a contractor/consultant I’m a mercenary, and the point of taking contracts is to avoid getting a real job as long as possible so you can work on your own fun stuff. So one of the most, if not the most, important features of a client is how well they pay your bills. Number one on my list in that respect is Avatar Reality. I worked on their Blue Mars virtual world for four years, albeit part time, and there was a gap for most of the first year. But that’s the longest I’ve survived on one contract and that’s the most of I’ve made in total from one client.\nMagnasync is close behind even though I worked on their call center software for only eight months. However, being not a game project, it paid a better rate than most of my contracts, and not only was it full time, they complained I wasn’t billing enough hours! Until they started running out of money, anyway.\nBack to games, at number three is High Moon Studios, which was Sammy Studios when I started working on their Darkwatch game, also for eight months.\nI should mention Next Media, also, because at six months full time and a couple of half-time months, they’re a significant client. Every other contract I’ve had below these four were far below.\nCool # The money is important, but if the project is interesting, that’s a huge bonus, not least because it looks good on your portfolio, and it’s nice when you like talking about the projects you’ve done. At the top again is Avatar Reality. Blue Mars is a CryEngine-based virtual world, in the mode of Second Life, with an active group of beta users and content creators who created accessories and minigames. No contest.\nSecond is High Moon Studio. Darkwatch is the only AAA game I worked on, a vampire western shooter running on the Xbox and PS2. Again, no contest.\nI’m going to give number three to both Visionscape and Heavy Water since they’re the same company, and though their games are smaller, I worked on several of them, including four games in the Tech Deck: Bare Knuckle Grind series (skateboarding thumbs), and a couple of released Playstation Home games (a rally racing game and surprisingly violent teddy bears).\nEvery other project was not a game (call center software), barely a game (the Elect Bilat instructional software for troops to negotiate with locals in Iraq), or prototype or cancelled software (I could put “cancelled the project” among my resume accomplishments and project consulting skills, but that sounds just too Darth Vaderish).\nLocale # Okay, I should have one more ranking. How about location? Again, Avatar Reality is number one, based in Honolulu. Again, no contest. I actually worked from home near the beach in Huntington Beach, which is a great place for a home office, and once in a while visited the client office and stayed in Waikiki.\nSecond again is High Moon Studios, based in Carlsbad, CA. Close enough to the beach that coworkers would hit the surf on a good day during their lunch break. San Diego County is great.\nActually, most of my clients have been in California, so I could pick Visionscape/Heavy Metal in (east) San Diego County (pleasant) or Magnasync in Hollywood (not in a great neighborhood but it’s still Hollywood), but for number three I’m picking Next Media, based in Hong Kong. That place has got a lot of problems, such as pollution, crowding, and China, but it was a great opportunity to spend a significant amount of time in a foreign country trying to order food in a different language. I also got a trip to Budapest out of it, somehow.\nThat’s it for now, until I think of other ranking criteria (office space? networking opportunities? repeat business?)\n","date":"May 25, 2016","externalUrl":null,"permalink":"/blog/career/favoriteclients/","section":"Blog","summary":"I formed Technicat, LLC almost eleven years ago after I had two contracts in a row and it looked like I wasn’t just using the word “consulting” as a euphemism for unemployment. Also, it’s a lot easier to get evaluation software when you have a company.\n","title":"Favorite Clients","type":"blog"},{"content":"I’m a bit late to the VR party, still messing around with Cardboard. Even then, after an unsuccessful attempt to assemble a Cardboard viewer, I gave up on it until I found a couple of different non-cardboard Cardboard viewers at Toys ‘R Us.\nSo, finally, progress on the research phase. Tried out a few Cardboard apps (good timing, I’d just finished watching The Expanse and then saw the Expanse VR app advertised at CES).\nNow, on to development. Thought about trying to make a VR version of HyperBowl, but decided to go with Fugu Maze, not just because it’s a much simpler app, but because it’s a simpler app, control-wise. The existing app just uses swipe-to-turn and press-to-move as controls.\nGetting started involves downloading the Google Cardboard Unity SDK, reading their Getting Started documentation, and realizing they’re apparently just getting started on their documentation. In fact, the Getting Started section just tells you how to run the demo project.\nThe useful stuff is in the Samples and Tutorials section, in particular VR Stereo Camera Basics, which tells you to import the SDK into your Unity project, dragthe StereoController script under the camera. I did that in Fugu Maze, and immediately got stereovision!\nIt looks good in the viewer and automatically moves as you move your head. Look, Ma, no GUI! The tap-to-move button is not visible, which saves me the trouble of making it not visible (though I should really clean that up at some point), and the pause/options menu that initially appears I did deliberately disable. I gather uGUI elements do work with Cardboard, but have to be in world space to show up in stereo, so it was just easier for now to hide it. And I’m not sure I even want it for a VR version. Immersion, after all.\nMotion is where I got bogged down. I want to use the magnetic trigger, the pull level on the viewer, to control motion. This script will detect the trigger:\nvoid Start () { GvrViewer.Instance.OnTrigger += TriggerPulled; } void TriggerPulled() { // } This API isn’t in the doc, so you have to figure this out by looking at the source code (or StackOverflow and then the source code). Also, by the way, I started working on this before Google repackaged their Cardboard SDK as GoogleVR and bundled it with the Daydream API. So I also had to look at the source code (and repo diffs) to figure out I had to replace Cardboard.SDK with GvrViewer.Instance. Migration doc would be handy, and, a nitpick, their link to the Unity SDK repo actually goes to the Android SDK repo.\nAnyway, the trigger code works when simulated in the Editor, but the movement’s still not happening on the device although it’s definitely detecting the trigger. Close, but not cigar. Stay tuned on that. In the meantime, I’m going to start looking at getting a Rift-ready PC, when I graduate to deluxe VR.\n","date":"May 24, 2016","externalUrl":null,"permalink":"/blog/yearreview/vrbeginnings/","section":"Blog","summary":"I’m a bit late to the VR party, still messing around with Cardboard. Even then, after an unsuccessful attempt to assemble a Cardboard viewer, I gave up on it until I found a couple of different non-cardboard Cardboard viewers at Toys ‘R Us.\n","title":"VR Beginnings","type":"blog"},{"content":"Last week, as a refreshing change of pace from offers to sell me skinnable code, I got a real “Love your game!” message on the HyperBowl facebook page.\nAt just over 800 fans, or likes, or whatever they’re calling it these days, the HyperBowl facebook page is my most successful social media site (unless you count my twitter feed with just over 1000 followers). It was the first facebook page I set up, and I feel a bit guilty about blasting invites to my friends, but that did jump-start the count, and then somewhere after the 500 mark there was a surge of likes from the Phillipines, for some reason. The count actually peaked around 900, until facebook did some pruning using some criteria I still don’t know about.\nI also have pages for Fugu Games and Technicat, to keep brands distinct, but they have far fewer followers, so I don’t know if that was a good idea.\nI have fugugames.com pointing to tumblr and moved my old self-hosted blog there, but it’s not a good writing platform, and it’s a lot easier to get hearted by posting images and reblogging. I get the feeling there’s not much innovation going on there since Yahoo acquired it, besides putting more ads in and pushing increasingly useless notifications to the iOS app.\nIn contrast, I can see Medium is constantly experimenting. Recently, I just noticed the icons at top right appear to increase in size from left to right, which I assume is deliberate and…interesting. The app is pretty, too. And it’s a great writing platform, similar to the bare-bones writing apps for iOS that pretty much have a blank screen and nice fonts and let you have at it before losing everything in iCloud. For a while I was even using Medium as my main word processor, until it occurred to me I would still like the option of writing if I didn’t have wifi around.\nBut there are instances where it seems form gets in the way of function. For example, the only way I see to organize my articles is to put them in publications, and I only created three publications because that’s all they will list in your profile. It’s not easy to browse and search among your own articles. There’s no RSS support (I don’t know if they just don’t feel it’s important or if they have some kind of design objection to it).\nAnd my feed is pretty uninteresting. It improved a bit after I experimented with not following any tags or anyone who has more than a thousand followers (I know, that’s a weird heuristic). But I still rarely read articles straight from my feed.\nPerhaps issues like these are limiting Medium as a social media platform. According to my stats page, I have one article that was viewed like gangbusters and not so much for the rest. But still Medium is my current blogging platform, and I have technicat.com redirecting to it (tumblr does a better job of making it easy assign a custom domain name). Because it’s so easy and comfortable to just sit down and write in it. Like this article.\n","date":"May 14, 2016","externalUrl":null,"permalink":"/blog/social/mysocialmedia/","section":"Blog","summary":"Last week, as a refreshing change of pace from offers to sell me skinnable code, I got a real “Love your game!” message on the HyperBowl facebook page.\nAt just over 800 fans, or likes, or whatever they’re calling it these days, the HyperBowl facebook page is my most successful social media site (unless you count my twitter feed with just over 1000 followers). It was the first facebook page I set up, and I feel a bit guilty about blasting invites to my friends, but that did jump-start the count, and then somewhere after the 500 mark there was a surge of likes from the Phillipines, for some reason. The count actually peaked around 900, until facebook did some pruning using some criteria I still don’t know about.\n","title":"My Social Media","type":"blog"},{"content":"","date":"May 14, 2016","externalUrl":null,"permalink":"/tags/tumblr/","section":"Tags","summary":"","title":"Tumblr","type":"tags"},{"content":"As I’m waiting for my Nevada health insurance to show up any day now, I think I’ve got the hang of the system. I don’t like calling it Obamacare because I don’t like naming things after politicians (although I guess the obvious name, Medicare, is taken, and it’s better than a meaningless branding name like the Patriot Act), and it‘s a word that often seems to be uttered pejoratively (along with it’s namesake Obama).\nBecause, overall, I find the new system an improvement. Sure, the state-run health-insurance sites suck, at least the two I’ve looked at. In California, I made the mistake of checking the box, sure, let’s see if I qualify for a subsidy. Several weeks later after back and forth emails requesting more documentation, the open enrollment period was over. Nevada didn’t look much better, but in both cases I just stuck with using ehealthinsurance.com, which I’d been using anyway for at least ten years.\nAnd that process has become easier. I no longer have to fill out a long questionnaire about my medical history only to get rejected by, say, Blue Shield, because I’m taking cholesterol medication. Now I just fill in basic info, pay, and I’m in. This is a big issue if you’re self-employed, and it seems to me it gets lost in discussions about O-care (“health care for the self-employed indie software developer!” is not a rallying cry you hear in town hall meetings).\nMore than once, I’ve been worried about losing health care because of that preexisting condition thing or because an insurer cashed my check but didn’t credit my account (the California consumer insurance agency came through on that one for me). And this was after following all the important HIPPA rules that every freelance should have known but didn’t about that theoretically guaranteed you health insurance if you maintained continuous coverage and maxed out your COBRA coverage from your last job if you had to. Now, you just have to remember to get your act together during the open enrollment period, and it seems like you really have to screw up to get kicked off your insurance, at least until the next open enrollment period.\nOn the other hand, I have to admit that restricting enrollment to an annual window seems weird and inconvenient, because sometimes it takes only a month before I get really annoyed with my insurer, and especially when you’re moving to another state, in which case you have to provide some documentation for the move to qualify for the new insurance (again, it seems going through ehealthinsurance made that easier for me — I tried going direct to the Blue Cross site, but my 33-page lease was too big to upload to it).\nAlso, my premiums supposedly went up due to O-care, but they’ve been going up every year with alternating excuses (rising health care costs, you’re older now, yada yada…). In fact, in the ten years it had already gone from $50/month to $300/month. So, just like that time they said it was my fault they cashed my check without crediting me (and then listed my name as “Ralph” on their non-apology letter), I don’t believe a thing they say. But I’m happy to be enrolled.\n","date":"May 5, 2016","externalUrl":null,"permalink":"/blog/politics/illtakethishealthcare/","section":"Blog","summary":"As I’m waiting for my Nevada health insurance to show up any day now, I think I’ve got the hang of the system. I don’t like calling it Obamacare because I don’t like naming things after politicians (although I guess the obvious name, Medicare, is taken, and it’s better than a meaningless branding name like the Patriot Act), and it‘s a word that often seems to be uttered pejoratively (along with it’s namesake Obama).\n","title":"I’ll Take This Health Care","type":"blog"},{"content":"I’ve moved from San Diego to Las Vegas, and Technicat is now a Nevada LLC. The primary and official reason is because it’s cheaper to live here. Lower rent and real estate prices, no state income tax, food and gas is cheaper…while I was living in Huntington Beach, I kept telling everyone the smart move was to sell my condo and move to Las Vegas, but right after I finally sold my condo, I got a contract in Hong Kong, then joined a startup in New York, and eventually meandered back to the Bay Area, down to San Diego and, now, as originally planned, I’m in Vegas.\nDuring that last nomadic stretch in California, I found additional motivation to get out of the state. Normally, I’m a fan of the State of California. Back when I mailed a complaint about my health insurer to the state health insurance department, they responded they only deal with HMOs, but they went ahead and forwarded it to the consumer insurance agency, which was enough to get a resolution and an insincere apology from my insurer.\nAnd after New Jersey for some reason said they had to take my California drivers license in order to give me a New Jersey one, California just told me I’m still on file so here’s a new ID (and you can keep your New Jersey license, but I just hold onto it as a reminder of how much I hate New Jersey). My new California address did get scrambled so the license got sent to a vacant lot next to a Jack in the Box, but they said it was their fault (even though it might have been mine) and didn’t charge me for another ID.\nHowever, when I moved to San Diego and changed my address online, they only changed it for my drivers license and after realizing I’d been driving around with expired plates, I got charged an extra $100 for the registration renewal. I suspect they didn’t adjust my voter registration, either (so if Trump wins, I’m blaming the DMV). Now I’m thinking that first address screwup really was probably them.\nSo my enthusiasm for the DMV is waning, but the group that manages business entities is a whole other deal. It’s as if they send people no one else wants there (similar to how some of my groups have been staffed). Or it’s operated by bots (that run so badly no one else wants them).\nWhere it all started going wrong for me was the required biennial Statement of Information form (because annual is too easy to remember). Fortunately, they do send a postcard reminder, and it’s a simple one-page form. But apparently not that simple, or too simple, because the one I sent got returned with a comment that I didn’t list all the members, even though this is a single-member LLC — one owner, one member. So I sent it back in with my name written down in one more place, and months later, when a mystery hold of over $400 was placed on my business bank account, I had to go to the bank, then call them, who directed me to call the State of California, to find out this was for a late filing of the SOI. No warning, no explanation, no way to appeal. That’s pretty obnoxious.\nIn the process, the informed me I owed a lot of back LLC taxes. OK, this was my fault (and this is what happens when you decide to run everything yourself as a learning experience — education is expensive). I assumed they would send reminders like they do with the SOI. That guy told me that even though it’s a fixed $800 yearly tax (and I discovered at this point every other state charges far less), I had to first complete all the returns I didn’t file then call them back for the amount I owed. I did that, called back, and that guy told me they couldn’t give me a number, I had to mail it all in, first, and some other department would make the calculation. But the third guy I called went head and gave me a number. which turned out to be wrong (a significant overpayment).\nAfter all that, I still received letters saying I owed taxes and faced dissolution of the LLC (which I was starting to welcome at that point), so I had to call again. Now, the trick is to select the voice menu option that says you owe them money, and then typically you’re on hold less than an hour, otherwise the robovoice says the expected hold time is several hours, do you want a callback? But apparently I wasn’t the only one with problems because even the express option said call volume is too high, try again on another day. This went on for a few weeks, and despite all the exhortations accompanying their letters to check your online account, all registrations were locked out for the past year due to ongoing security upgrades.\nEventually, they opened their online system to registrations again (and all previous accounts had to be created from scratch), and I could see my payment, with change to spare. So I called again, got in this time, and the guy explained my previous payment covering several years were all applied to the same year, so they logged a ridiculous overpayment for one year and had me past due for the rest. Amazing.\nI was so annoyed I tried to shut down my LLC right then and there. Again, a simple one-page form, but they sent it back saying it was not the latest form and didn’t list all members. Again, single-member LLC and I listed me whereever I could. And it was January 2016 and the form listed 2016 as the version date, while the checklist error form they returned was a year older. So who’s using the wrong form? It would have been faster and cheaper to just not pay my taxes and let them dissolve the company.\nSo the first thing I did in Vegas was register a new LLC online, which took just a few hours, set up a virtual office (apparently this is easier in Nevada, too, as I see virtual offices advertised everywhere), and register a business license online, which costs $200 a year but is still cheaper than California’s $800. And I sent in the California LLC dissolution form, again, with comments stating it’s the latest one downloaded from the site and it’s just me, me, me as the company owner, member and manager. I hope this time it took.\nI do miss California weather, though. And fish tacos.\n","date":"April 30, 2016","externalUrl":null,"permalink":"/blog/travel/nevada/vegas/arrivinglasvegas/","section":"Blog","summary":"I’ve moved from San Diego to Las Vegas, and Technicat is now a Nevada LLC. The primary and official reason is because it’s cheaper to live here. Lower rent and real estate prices, no state income tax, food and gas is cheaper…while I was living in Huntington Beach, I kept telling everyone the smart move was to sell my condo and move to Las Vegas, but right after I finally sold my condo, I got a contract in Hong Kong, then joined a startup in New York, and eventually meandered back to the Bay Area, down to San Diego and, now, as originally planned, I’m in Vegas.\n","title":"Arriving Las Vegas","type":"blog"},{"content":"Well, I normally don’t announce my birthday, deadened as I am to all those Facebook notifications, but turning 50 (yesterday) is a milestone of sorts in our base 10 society. For programmers, maybe 48 or 0x30, should be more meaningful. Regardless, I don’t feel older, or wiser, or even more mature. It does seem other people are getting more immature, but I guess that’s just relativity in action.\nPhysically, I do feel I’m getting older, the worst part being my eyesight. It was always bad, and at least with modern technology my glasses are much thinner and lighter than the coke bottles I wore as a kid. But now in libraries I look longingly at the big print section, which reminds me that I now qualify for AARP membership (and in five years, the senior meals at Denny’s!)\nIt doesn’t help that according to conventional wisdom in the Logan’s Run world of Web 2.0, I was over the hill fifteen years ago, and apparently forgot to retire.\nOf course, every generation (however artificially demarcated), considers the previous generation obsolete, so youthful disrespect is just karma. I remember when I mentioned my Dad was middle-aged, and he asked, “What do you think is middle age?”, I guessed 30 or over. But I was in grade school.\nYou can’t entirely blame the young for drinking millennial kool-ade (every generation’s graduation commencement speech exhorts “You are the future!”), especially considering who’s serving it these days— old rich people who go on and on about the importance of young people, like this latest bit from Paul Graham (he’s not really old, he’s just old like me). Now they’ve created a monster.\nWhat can us other oldsters do to fight back? Bore the crap out of younger people by telling stories of “the old days” when we used floppy disks and modems. But that can backfire, as one twenty-something asked me, in all seriousness, “There was a Silicon Valley back then?” (maybe this is a problem with the tech industry, if a sense of history is disappearing)\nAnother time-honored form of punishment is to dispense unsolicited advice, which features the double-whammy threat of being boring and also potentially bad advice. So here’s mine:\nWhen you’re young, you spend a lot of time trying to decide what you want to be. You should spend more time deciding who you want to be. And by who you want to be, I don’t mean you want to be a Steve Jobs wannabe. Think about what kind of person you want to be, even if you’re not rich and famous (being a rich and famous asshole sounds like fun, just being an asshole, not so much…)\nAnd figure out who you are. It’s like finding yourself, but without the wishful thinking. There’s no need to obsess over it — there’s a fine line between being self-aware and self-absorbed. But it does get easier over time because you have more data. Then you can think about how to get from who you are to who you want to be and if it’s worth the trip (if only there was a Google driving directions feature for that…)\nI found once I hit middle age, I didn’t care as much about what I was supposed to be or where I was supposed to be in life (there’s a Joe Haldeman snippet somewhere that better articulates getting more comfortable in your skin). I used to think I would get more patient as I get older, but the reverse has happened. Among other things, I don’t have the patience for is pretending I’m something I’m not, even to myself. This, by the way, does not go over as well as it should during job interviews — people just act confused when I tell them what I’m not good at or what I have trouble seeing myself doing (sorry, Google Evangelist position).\nThis may all sound limiting, but it’s actually freeing. When I was in high school, I talked about being President and a millionaire, someday (I don’t remember in which order), but the closest I’ve come to politics is a stint on my homeowners association board, and I could only tolerate that for three months. As for being a millionaire, well, a million isn’t that much, anymore, but it would still be nice (anyone who complains about the problems that money brings, well, it’s a reversible problem — just spend it all on kickstarters).\nIt goes to show those early plans weren’t that useful — better to take an Agile approach, which in my case involved going with the flow, taking a variety of different jobs to pay the bills (see, I’m putting a positive spin on not achieving millionaire status), and then eventually going freelance. If I had picked an early track and stuck to it, I wouldn’t know how much fun it is to create and self-publish games and apps, for example. Which, by the way, is something that is much more feasible now — when I first started programming, games were published by sending out floppy disk. Oops, sorry, I’m telling floppy disk stories again…\nAnyway, it seems for many, this stage of life marks the beginning of Act II. I met a civil engineer who retired at 50 and goes to Comic Con every year (if you are going to pick an early track, make it something with a sweet retirement and pension plan). I know people who went back to school for their PhDs at this age, one of who went on to create a startup I’m doing some work for. My sister (a bit younger than me) is enjoying a fairly new and surging career as a comic book writer. I’ve read about people cashing in their retirement funds to start up their dream bakery, or whatever. Now that takes guts (and makes you wonder if risk management skills improve with age).\nI’m not planning anything that drastic, but given that this is just halftime, maybe I shouldn’t be dispensing life advice. Which leads me to my last bit of advice, don’t take anyone’s advice. You can still learn from others, but as with politicians, don’t just accept what they say. Instead, watch and learn. And I’ll get back to you in another twenty-five years.\n","date":"April 13, 2016","externalUrl":null,"permalink":"/blog/personal/turning50/","section":"Blog","summary":"Well, I normally don’t announce my birthday, deadened as I am to all those Facebook notifications, but turning 50 (yesterday) is a milestone of sorts in our base 10 society. For programmers, maybe 48 or 0x30, should be more meaningful. Regardless, I don’t feel older, or wiser, or even more mature. It does seem other people are getting more immature, but I guess that’s just relativity in action.\n","title":"Turning 50","type":"blog"},{"content":"When designing apps, you should of course read the interface guidelines, but you should also survey the field to see the modern conventions. Of course, there are differences, and fashions change, but there’s a surprising amount of uniformity.\nTake tabs. A typical social-featured iOS app has five tabs on the bottom, which you would expect if you read the iOS Human Interface Guidelines and saw that UITabBar displays a maximum of five icons. But it’s interesting to see what those icons are: almost all social apps (on my device, Facebook, twitter, tumblr, instagram, flicker, artstation, artstack, pinterest, ello, medium…) have the content stream in the leftmost tab, notifications in the second to leftmost or second to rightmost tab (sometimes called activity, e.g. tumblr, and some apps like Pinterest just avoid the whole naming issue by having no tab names — but what do they call them in internal meetings, “that watchamacallit in the second tab?”), account info in the rightmost tab, and the middle is often the creation screen, e.g. the camera in instagram or write in medium.\nThose last two examples are also kind of weird in that they override the middle tab button so it brings up a modal screen. Facebook is further bizarre in placing a Messenger button there, which brings you out of the app into the Messenger app, but it’s sort of the same idea in placing the function you want to promote in the center button, as opposed to placing what you want to first see in the leftmost button.\nAlso, have you noticed user avatar icons in iOS apps are almost always round? Again, if you’re familiar with the underlying implementation, it’s pretty easy to render round images (by tweaking UIImageViews layers), probably easier than doing on web pages, so this may be why older apps like twitter and Facebook still have square icons (with rounded corners, so never mind that harder on the web theory), but it’s interesting to see Facebook’s Messenger and Pages use round icons.\nAs for search, it seems they all use a UISearchbar at top, sometimes with an everpresent bar over the feed (Facebook) or, probably more often, a search icon (spyglass) that brings up said search bar.\nAs for likes, seems like everyone’s going with hearts instead of stars, with twitter a notable convert, though Facebook still has thumbs. Hearts tend to be red when voted (pinterest), though medium has a weird green color, which matches their other tint colors, but…green?\nFor comments, I think I see a trend toward chat-bubble displays, with pinterest adding them. Maybe an attempt to make everything look more like messaging apps, but it does look more interesting.\nThere are some apps that do all this very differently, like Giphy. But, yuck, have you seen that thing?\n","date":"April 6, 2016","externalUrl":null,"permalink":"/blog/app/appconventions/","section":"Blog","summary":"When designing apps, you should of course read the interface guidelines, but you should also survey the field to see the modern conventions. Of course, there are differences, and fashions change, but there’s a surprising amount of uniformity.\n","title":"App Conventions","type":"blog"},{"content":"It just occurred to me that the way I pine longingly for the office I used to have myself (at the venerable BBN) or the offices I used to share with just one other coworker (and now belatedly appreciate) is similar to how the old days of air travel are described with nostalgia. Even cubicles (presented enthusiastically at BBN during their difficult period as a “new open-office environment” by ex-IBM management) are luxuries — today’s open-office environment is a big table where you try not to look at the person in front of you who’s trying not to look at you and try to avoid knocking elbows with those on either side of you, while surreptitiously covering any personal activity on your screen. But there’s no option to purchase extra leg room, although if you move up to first class (upper management) you can get an office. I was astonished to see coworking spaces rent out “hot seats”, lower-cost desks that are first-come first-serve. The Southwest Airlines of coworking, if you will.\nSupposedly it’s all about communication, but everyone wears headphones (the secret pillar supporting Apple’s business model), and that’s the way management likes it — if everyone started talking to each other like they’re at a Maryland crab feast picnic table I guarantee you management would tell everyone to shut up and get back to work. In fact, modern workplaces can take a page from the airline industry’s book and have workplace “attendants” with carts patrol around the big table every hour or so selling drinks and headphones. And throw in some free peanuts.\n","date":"March 30, 2016","externalUrl":null,"permalink":"/blog/management/workingcoach/","section":"Blog","summary":"It just occurred to me that the way I pine longingly for the office I used to have myself (at the venerable BBN) or the offices I used to share with just one other coworker (and now belatedly appreciate) is similar to how the old days of air travel are described with nostalgia. Even cubicles (presented enthusiastically at BBN during their difficult period as a “new open-office environment” by ex-IBM management) are luxuries — today’s open-office environment is a big table where you try not to look at the person in front of you who’s trying not to look at you and try to avoid knocking elbows with those on either side of you, while surreptitiously covering any personal activity on your screen. But there’s no option to purchase extra leg room, although if you move up to first class (upper management) you can get an office. I was astonished to see coworking spaces rent out “hot seats”, lower-cost desks that are first-come first-serve. The Southwest Airlines of coworking, if you will.\n","title":"Working Coach","type":"blog"},{"content":"Although it’s a smidgen compared to the Japanese-American National Museum in LA’s Little Tokyo, I found the Nikkei Legacy Center in Portland, as they advertise on their web site, intimate, and enlightening. I was already aware of the Japanese-American internment taking place in California during WWII, but didn’t know that those in Portland were rounded up as “evacuees” in an “assembly center” normally used to house livestock, before being dispersed to various internment camps. This was no picnic — people lost their property, their privacy (I shuddered just looking at photos of the latrines), three years of their lives, and in some cases, their actual lives. The center is currently showing the Uprooted exhibit, detailing how some were allowed to work as cheap farm labor because, despite local opposition to their presence, farmers needed more workers for wartime production.\nIt seemed a timely visit, considering the Trump anti-Muslim, anti-refugee and anti-immigrant rhetoric (already I’m falling into his trap, extending his ego-trademark from Trump Towers and Trump University to…Trump Rhetoric). But one could argue, disregarding the horrifying prospect that he might actually win, that he has done everyone a service by exposing still-existing prejudices.\nRemember, besides Trump calling for banning Muslims and Syrian refugees from entering the US, there was post 9/11 talk of barring Muslims from airlines (which Bush Jr. immediately dismissed), and with the secret watchlist and suspected Muslims getting kicked off planes by paranoid passengers and crew, you could say it’s partly in effect.\nWhich brings up the link between religious prejudice and racial prejudice. In many cases, those kicked off planes weren’t Muslim, they “looked” like Muslims. The shooting at the Sikh temple in Wisconsin is apparently the least-disturbing mass shooting in recent US history, garnering only a First Lady condolence visit.\nIt seems to me anti-Muslim sentiment is really more racial than religious (I did hear an impatient customer in a supermarket express lane describe himself as an “angry Christian” — now that’s scary). While spending five months in New Jersey and thinking how much I hated New Jersey (Christie’s Trump endorsement is pretty much the nail in the coffin on that), I responded to someone going on about how Obama is from “the neighborhood” and is really Muslim because his father is Muslim and Muslims say sons of Muslims are Muslim, then in that case I’m a Muslim, as I come from a long line of Muslims on my father’s side. But she closed her argument with, well, you’re not a terrorist, are you? I think that was supposed to be a compliment, like you’re one of the good ones.\nWhile it was a relief to come back to California, where I no longer had to receive the usual “Where are you from?” and “Where are you really from?” questions, and the occasional “Are you Korean? I’m thinking about buying a Hyundai” question, here there’s a lot of anti-immigrant talk of the anti-Mexican variety. Even in the Bay Area last year, I was talking to a realtor selling million-dollar properties who warmly greeted a young Asian couple and did her best to ignore a young Latino couple, managing to hold her irritation until after they left. She had a British accent, by the way, so rest of the world, don’t act so superior.\nNon-whites aren’t off the hook, either. Those Asian jokes at the Oscars…please, way to make it all about just you. And the stuff I’ve heard Asians say…don’t get me started. It’s not like all racists are Republicans, either, even if at times it seems part of their party platform. I’ve seen Democratic presidential contenders pandering to union fears of foreign labor from Japanese autoworkers in the eighties to Bernie Sander’s recent evocation of competition from Mexican and Vietnamese laborers. Just once, I’d like to hear them talk about trade disputes with Canada, the sucking sound of jobs going up north (check the credits on your favorite TV shows), or unfair competition from those masses of Irish factory workers. Then there was that head-scratcher from Geraldine Ferraro, smarting from Clinton’s loss to Obama and opining on Fox News that Obama wasn’t facing racism, but “racial resentment.”\nBack to the Japanese-American internment: although it’s hard to believe something like that could ever happen again, while I was living in Huntington Beach, the city released a 100-year anniversary video that inexplicably devoted a few minutes to an hour-long otherwise puff piece with a misleading defense of the internment (never mentioning that most of the interned were American citizens, and describing their loyalty as “a question that could not be answered”). I can only hope that the video is boring enough that students in the schools they sent copies to won’t notice that segment. There’s hope for the future yet, if they learn from the past and are not paying too much attention to the present.\n","date":"March 7, 2016","externalUrl":null,"permalink":"/blog/racism/racialresentment/","section":"Blog","summary":"Although it’s a smidgen compared to the Japanese-American National Museum in LA’s Little Tokyo, I found the Nikkei Legacy Center in Portland, as they advertise on their web site, intimate, and enlightening. I was already aware of the Japanese-American internment taking place in California during WWII, but didn’t know that those in Portland were rounded up as “evacuees” in an “assembly center” normally used to house livestock, before being dispersed to various internment camps. This was no picnic — people lost their property, their privacy (I shuddered just looking at photos of the latrines), three years of their lives, and in some cases, their actual lives. The center is currently showing the Uprooted exhibit, detailing how some were allowed to work as cheap farm labor because, despite local opposition to their presence, farmers needed more workers for wartime production.\n","title":"It’s Not Racism, It’s “Racial Resentment”, or…Beware the Angry Christian","type":"blog"},{"content":"I discovered a new reason to like Medium: their Terms of Service: Medium Terms of Service Effective Date: 4-10-14 ¶ Medium Terms of Service ¶ We’ll try to make this as painless and straightforward as… medium.com\nIt’s not too long (unlike the pages of constantly-revised Apple ToS you have to flip through), written in human-readable language (unlike almost every ToS), and to my utter surprise, does not include an indemnification clause, like this one from Goodreads:\nIndemnity - You agree to defend, indemnify and hold harmless Goodreads and its subsidiaries, agents, managers, and other affiliated companies, and their employees, contractors, agents, officers and directors, from and against any and all claims, damages, obligations, losses, liabilities, costs or debt, and expenses (including but not limited to attorney’s fees) arising from: (i) your use of and access to the Service, including any data or content transmitted or received by you… I cite Goodreads as an example because I did complain to them back when they were just getting popular and before they became part of Amazon. I think the founder/CEO replied, which was nice, but it was the standard reply I get when I complain about contract provisions with clients and employers:\nThis is what our lawyers told us to do.\nEveryone does it.\nTrust us.\nWell, lawyers don’t always know what they’re talking about (and it’s one of those professions in which they never admit it), not quite everyone does it (I believe I mentioned Dreamhost and Twitter in my response), and if we’re so trusting, we don’t need this bit of financially threatening legalese, do we?\nAnd it is financially threatening, notwithstanding the corporate counsel who assured me that indemnification didn’t involve any money and then backtracked after looking up the definition in the dictionary (supporting my first point above).\nIt is particularly problematic on user review sites where anyone can sue over a negative review, like Yelp. Their indemnification clause ranges far and wide:\nYou agree to indemnify, defend, and hold Yelp, its parents, subsidiaries, affiliates, any related companies, suppliers, licensors and partners, and the officers, directors, employees, agents and representatives of each of them (collectively, the “Yelp Entities”) harmless, including costs, liabilities and legal fees, from any claim or demand made by any third party arising out of or relating to (i) your access to or use of the Site, (ii) your violation of the Terms, (iii) any products or services purchased or obtained by you in connection with the Site, or (iv) the infringement by you, or any third party using your account, of any intellectual property or other right of any person or entity. Yelp reserves the right, at your expense, to assume the exclusive defense and control of any matter for which you are required to indemnify us and you agree to cooperate with our defense of these claims. You agree not to settle any such matter without the prior written consent of Yelp. Yelp will use reasonable efforts to notify you of any such claim, action or proceeding upon becoming aware of it.\nNot only are you on the hook for any damages resulting from your use of the site, but also any products or services you bought “in connection” to the site, anyone else using your account (with or without permission), but you’re indemnifying not just the company but their contractors, suppliers, licensors…pretty much everyone except their pets. And while you’re on the hook for damages, you give Yelp total control over how you can respond, at your expense.\nSo you’ll be seeing more of my reviews here in Medium, even if I’m just moving them from another site.\n","date":"January 18, 2016","externalUrl":null,"permalink":"/blog/social/noindemnity/","section":"Blog","summary":"I discovered a new reason to like Medium: their Terms of Service: Medium Terms of Service Effective Date: 4-10-14 ¶ Medium Terms of Service ¶ We’ll try to make this as painless and straightforward as… medium.com\n","title":"No Indemnity","type":"blog"},{"content":"Every year I think about going to CES and don’t, because it’s so soon after Christmas and New Year’s. But it’s on my bucket list, and ostensibly relevant to my profession, so finally made the trip to Vegas.\nFirst of all, I like Vegas hotels. CES is probably the worst time to get one — the M was charging over $400 and I ended up at the Hampton Inn for $200, but in both cases the reception was apologetic for the prices and that’s still nothing compared to the Bay Area during OracleWorld (America’s Best Value Inn was charging $300).\nOnce you reach Friday, the rates go down. I stayed at the Linq for $100 on Friday, $80 for Saturday, and after that it’s only $35, so I stayed an extra day. Add in the annoying $30 daily resort fee, still cheaper than a regular Marriott Courtyard in Orange County. And by the way, there’s a nice 24-hour Starbucks across the street, so I got a lot of work done.\nApparently, the crowds go down by Friday, too. I wouldn’t even use the term “crowd”. Healthy attendance, but nothing like Comic Con. And this show is really for industry — I didn’t get much attention walking around in my Pismo Beach sweatshirt. The Mark Zuckerberg look isn’t working for me.\nMostly, I was interested in the gaming-related stuff, and there was a section of a hall devoted to AR, VR, controllers, etc. I was pleasantly surprised to see a Syfy booth devoted to The Expanse, including a showing of their 3D printing and their VR app.\nBut the AR/VR stuff was outnumbered by the drones. Lots of drones. And then there was the hall with pavilions by Samsung, LG, Sony et. al. filled with big TVs and smart refrigerators.\nAnd then go into the next hall, and…cars. Very cool cars.\nBut in that final hall, half of it was filled with iPhone cases. So there you have it, CES in a nutshell is: drones, cases, and automobiles.\n","date":"January 12, 2016","externalUrl":null,"permalink":"/blog/travel/nevada/vegas/myfirstces/","section":"Blog","summary":"Every year I think about going to CES and don’t, because it’s so soon after Christmas and New Year’s. But it’s on my bucket list, and ostensibly relevant to my profession, so finally made the trip to Vegas.\n","title":"My First CES","type":"blog"},{"content":"I find it lecturesome when people say “This is a good time to mention…” but with CES in town, I feel this is a good time to mention there is a Chinatown in Las Vegas, so consider ditching the overpriced “pan-Asian” (otherwise known as “Asian food is all the same to me”) and get the real stuff just west of the Strip on Spring Mountain Road.\nChinatown is really a stretch of not quite contiguous strip malls along that road, so often it’s just referred to as “Spring Mountain Road,” and for a long time I’ve resisted calling it Chinatown. But still, it’s anchored by Chinatown Plaza, the strip mall that started it all.\nThe plaza has a recently refreshed look, including a Journey to the West statue.\nAnd some nice lighting at night.\nChinatown Plaza has a 99 Ranch Market, several eateries including dim sum, Korean BBQ, boba tea, casual Chinese, Japanese snacks, and a variety of shops, so pretty much everything you might want on a Chinatown outing, and I’ve met some longtime residents who still only visit Chinatown Plaza, but there’s plenty of other stuff if you explore (unfortunately not easily by walking, as Las Vegas’s urban planning is focused mostly on the Strip and downtown, while the rest of the city has streets that don’t align at intersections).\nIn fact, my favorite Chinatown strip mall is directly across the street from Chinatown Plaza, the newly constructed (actually, still under construction last I looked) Shanghai Plaza. My regular spot there is 88 Noodle Papa, a Hong Kong style casual eatery.\nShanghai Plaza has a variety of other eateries, including a popular bakery, sushi and pho, boba tea, Korean hot dogs, and Hong Kong style desserts. I’m actually not a big fan of Chinese desserts, but they are pretty.\nNext to Chinatown Plaza and also across Shanghai Plaza is a corner strip mall with several restaurants, a bakery, and as far as I know the fanciest selection of Chinese tea at Tea Station, where you can get anything from a $6 pot of jasmine tea to an $18 pot of high mountain oolong tea.\nAnd I would be remiss if I didn’t mention dim sum. Besides Harbor Palace in Chinatown Plaza, there are nearly a dozen other dim sum places in Las Vegas outside of the Strip. You can get dim sum on the Strip but it’ll cost you, and most of those places have a limited variety, like the Northside Cafe in the Sahara (formerly SLS, formerly Sahara), which by the way also serves an excellent breakfast burrito.\nJust along Spring Mountain, there’s real old school cart-served dim sum at New Asian BBQ and Noodles (old Asian BBQ and Noodles is still around but specializes in noodle and dumpling soup) and Hong Kong Garden, which is open until 6AM and for some reason closes for three hours before opening again at 9AM.\nBranching south on Decatur, there’s longtime local favorite Chang’s and newer (with vegetarian offerings) Yum Cha, and looping back on Flamingo, the Palms, Rio and Gold Coast casino hotels are adjacent to each other and yet each have their own dim sum restaurants: Tim Ho Wan, Ping Pang Pong, and KJ’s Dim Sum \u0026amp; Seafood, which is all less than a mile from Chinatown Plaza.\nTo be complete, there’s also Orchid Garden, another longtime local favorite, a bit north on Charleston, and for those living in the westerly master-planned community of Summerlin, there’s the Dim Sum Cafe.\nI tend to go to Yum Cha, Tim Ho Wan, and the Dim Sum Cafe because I can order off the menu there and not end up with too many plates off the first cart that appears, but they’re all good. Take some time out on your visits to Vegas and give each a try!\n","date":"January 7, 2016","externalUrl":null,"permalink":"/blog/travel/nevada/vegas/chinatowninvegas/","section":"Blog","summary":"I find it lecturesome when people say “This is a good time to mention…” but with CES in town, I feel this is a good time to mention there is a Chinatown in Las Vegas, so consider ditching the overpriced “pan-Asian” (otherwise known as “Asian food is all the same to me”) and get the real stuff just west of the Strip on Spring Mountain Road.\n","title":"Chinatown in Vegas","type":"blog"},{"content":"I’m really enjoying Wil Wheaton’s Conversations with Creators, episodes downloadable free on the Playstation Store. The first four conversations have been with various prominent game studios, including one of my favorites, Bungie (in the video above).\nI’m also glad it’s conversations with “creators”, not “creatives”. I’ve seen the latter so much in print and CNBC-style segments that I’m actually surprised to see the former. Calling a person a “creative” rubs me the wrong way not just because it strikes me as just one more mangling of the English language (don’t get me started on using “reticent” to mean “reluctant”), but my main objection does stem from using what was once an adjective as a noun. Calling a person a “creative” does not just describe the occupation, like “actor”, “engineer” and “financial analyst”. It ascribes a character and talent to the person.\nWhat’s wrong with that? Well, first of all, it’s a broad brush. Members of the ad industry are routinely called “creatives”, but how many of them really are? (and if you’re going down that road, might as well call political campaigners “creatives”). I’m not just picking on ad people. Realistically, any occupation is going to have plenty of people who just aren’t that good at their jobs, or at least not good enough to be considered gifted at it.\nAnd frankly, it’s elitist. Calling someone a “creative” implies that anyone who isn’t one, isn’t. Creative, that is. It’s like calling someone an “intellectual”, as a noun instead of an adjective. Oh, right, we do that. But you have to admit, it’s kind of snooty (tune in for Wil Wheaton’s Conversations with Intellectuals…snore), especially when you use it on yourself. Like when LinkedIn profiles have “visionary” in the description — again, noun instead of adjective.\nBut for that reason, “creative” is probably here to stay. Calling yourself a “creative” is like wearing a cool jacket (the same jacket that Don Draper wears)— as long as it’s in style, you can get away with it, and there’s probably some self-affirmation value in it (I’ve seen quite a few meetups for “creatives” to get together, and even “young creatives” — there’s a nice puppy, good puppy!)\nAlas, with all these adjectives turned nouns, I’ll have to update my LinkedIn profile from “creative, intellectual visionary” to the more verbose “a creative, an intellectual, and a visionary”. And a “humble”, as soon as that turns into a noun.\n","date":"January 1, 2016","externalUrl":null,"permalink":"/blog/tv/scifi/conversationswithcreators/","section":"Blog","summary":"I’m really enjoying Wil Wheaton’s Conversations with Creators, episodes downloadable free on the Playstation Store. The first four conversations have been with various prominent game studios, including one of my favorites, Bungie (in the video above).\n","title":"Conversations with Creators (not Creatives)","type":"blog"},{"content":"Occasionally, I see the question “What led you to gamedev?” (on twitter, for example). I didn’t start out as a game developer, but rather stumbled into it later in my career, so my default answer is that it’s because I worked at a small company called Nichimen Graphics in the mid-90s, developing 3D graphics tools for film and games. As my coworkers moved on to other companies, many of them game companies, I got jobs and contracts through their referrals.\nThese included my first gamedev job working on HyperBowl (which I’m now working on by myself with a license from Hyper Entertainment), the Tech Deck: Bare Knuckle Grind games (which led to a later contract working on Playstation Home games for the same company), the Darkwatch PS2/Xbox game, a military negotiation sim for USC/ICS, the Blue Mars virtual world, and a consulting stint for nxTomo Games in Hong Kong.\nBut I didn’t start out as a graphics programmer, either, so what led me to Nichimen Graphics? Short answer: Lisp. It turns out Nichimen Graphics was once upon a time the graphics division of Symbolics, a Lisp machine company. When I joined them, their products were running on Silicon Graphics workstations but still implemented in Lisp, and that’s what I got hired for. Up to that point, I’d been programming Lisp for BBN, MIT, SAIC, the Space Telescope Science Institute, and Texas Instruments. About seven years professionally, not counting the part time work and thesis project as an MIT undergrad.\nWhich means, you could say MIT led me to gamedev. If I’d gone to any other school, what are the chances I would have learned any Lisp at all? At MIT, on the other hand, the beginning CS class, 6.001 Structure and Intepretation of Computer Programs, still used Scheme at the time, my AI class used Common Lisp, I did my bachelors thesis on a multiprocessor Lisp, and the part time programming work I found was in the MIT AI Lab, conveniently on Symbolics workstations.\nTo tell you the truth, I didn’t understand 6.001 while I was taking it, but I reread the text after graduating and thought it was the greatest thing since sliced bread. So I really learned Lisp from that part-time work in the AI Lab, and you could also say that AI led me to gamedev.\nThe popular choice for part-time student programmers was Project Athena, which would have turned me into an early Unix/C programmer. However, that wasn’t a paying gig, and I was on financial aid which required a paying student job, so you could say not being wealthy led me to gamedev.\nAnd I don’t know if I would have ended up at MIT if I hadn’t gone to high school in Iowa. Only a handful of students from Iowa applied to MIT that year, and I think most of the got in, whereas if I’d had to compete against the pool from New York, the acceptance odds would have been worse. (When I asked an admissions officer if Iowa gave me an edge, she replied they took in account disadvantaged educational circumstances – sorry Iowa City West High, you got dissed)\nAnd it was at my junior high in Iowa where I learned to program, on the Apple II in the library. That wasn’t the first computer I’d seen (which would be the TRS-80 in the library of my previous junior high, which I just typed BASIC listings into over and over until the librarian showed me the cassette recorder), but it was the first computer which showed me the programming light. Really, when I read the Applesoft manual, it was like a light going on in my head, and I understood coding.\nThus, you could say Iowa led me to gamedev. Go Hawks!\nBut let’s stop there. My first Apple II programs included a reversi game (which I later found on a pirate floppy, so it was also my first pirated game), and a wireframe surface display. However, my undergrad Lisp job also included a 3D surface display, my bachelors thesis was a MultiLisp reversi game, the Lisp job for the Space Telescope got me my masters degree at Johns Hopkins, including the graphics course there, the SAIC project was a submarine simulation in a wide area networked military exercise with cool names like Maritime Synthetic Theater of War (MSTOW) and Warbreaker, but really it was just a big multiplayer game, and the Nichimen tools were used in real games like Mario 64, I think. And that’s where my just-as-I’m-getting-out-they-drag-me-back-in gamedev career began.\nSo, that’s the answer I’m sticking with: Lisp led me to gamedev.\n","date":"January 1, 2016","externalUrl":null,"permalink":"/blog/career/lispledmetoouterspace/","section":"Blog","summary":"Occasionally, I see the question “What led you to gamedev?” (on twitter, for example). I didn’t start out as a game developer, but rather stumbled into it later in my career, so my default answer is that it’s because I worked at a small company called Nichimen Graphics in the mid-90s, developing 3D graphics tools for film and games. As my coworkers moved on to other companies, many of them game companies, I got jobs and contracts through their referrals.\n","title":"Lisp Led Me to Texas, Outer Space, and Game Development","type":"blog"},{"content":"The new Heroes series, Heroes Reborn, looks mildly intriguing, but I didn’t watch all of the original, losing enough interest during the second season to pause and complain about the first:\nI was absorbed by Heroes in its first season, but after a disappointing second season and with the third not looking any better, I can start harping on the lack of imagination (ironic for this series) in ethnic portrayals. The variety is far better than most of television, especially the lily-white WB (I’m looking at you, Gossip Girl!), but all the Asians are from Japan (and the two principal ones are nerdy salarymen), and of the black characters, one was Haitian, the other a convict, and his relations (introduced in Season Two) lived in the ‘hood. Season Two introduced two Latinos, both illegal Mexican immigrants. I was astonished to see an African-American “hero” at the beginning of the most recent episode, but she lasted about two seconds before Sylar ate her brain.\nOf course, this is nothing new. My favorite sci-fi show of all time is Firefly, but nowhere is it explained why everyone speaks Chinese slang (badly) yet there’s no Asian in sight. And while Star Trek was progressive for its time (the first one, anyway), in the future Federation there appears to be a lot more interspecies dating than interracial dating. As a result, you don’t see anyone on the Enterprise with an obviously mixed ancestry. Not too many accents (except for Scotty, and poor Chekov), but characters’ ethnicities are identified heavily by their names. Jean-Luc Picard is so French that in a time-hopping series finale he’s seen retired on a French vineyard.\nA more insidious problem with Star Trek is the foisting of convenient ethnic cliches on poor aliens — the brutish dark-skinned Klingons always looking for a fight (although the TNG version acted more like Vikings), the inscrutable Oriental-looking Vulcans and their cousins, the devious, calculating Romulans.\nYou can’t just blame the original series — the newer series introduced the Ferengi. small, stooped, money-grubbers with big…ears (making them erogenous zones was a nice, er, touch). And the Borg — why are all futuristic alien hive minds so unfriendly and dull? (In other words, why not Mac, rather than Windows? There should be a Borg on the Microsoft commercial, saying “I am a PC”)\nSci-fi shows should be the first to turn around conventions, especially if you get to play with aliens. There’s no reason Ferengi couldn’t be a tall, athletic species (hey, look at all the professional athletes who love to gamble with all their professional endorsement money), Klingons and Cardassians could look like swimsuit models (after all they did that with one Borg), the regal Vulcans could be short, hairy and fat. And those tribbles would be a lot more interesting if they were aggressive and carnivorous, or looked like sea slugs. Now that’s a show I’d like to see.\n","date":"January 1, 2016","externalUrl":null,"permalink":"/blog/racism/scifi/","section":"Blog","summary":"The new Heroes series, Heroes Reborn, looks mildly intriguing, but I didn’t watch all of the original, losing enough interest during the second season to pause and complain about the first:\n","title":"Sci-Fi Stereotypes","type":"blog"},{"content":"I got around to reading Slay the Dragon! Writing Great Video Games a little while ago because I’m interested in writing, I work in game development, I met one of the authors when he was a producer at Crave Games and I worked on a game and later consulted for them, and the book looked like a bargain when I ordered it from Amazon for around $10.\nI’m pleased to say it’s the best game writing book I’ve ever read. It’s also the only one I remember reading, but seriously, I enjoyed the comprehensive nature of the book and the authors’ obvious love of the industry and craft, and I highly recommend it to anyone interested in writing for games, or who’s already a game developer (this is why I try to read about game audio design, cinematography…the more you know about all aspects of gamedev, the better), or even just curious about it. I even sent a copy to my comic book writer sister.\nThe book also reminds me of my short-lived career as a game writer. And by short-lived, I mean three hours. You know how successful writers often say for real writers it’s an obsession and you have to write every day? That’s not me, unless you count attempts at regular blogging (and that’s more like going to the gym, where it’s more a matter of self-discipline for my own good. Yep, this blog is like 20 minutes on the treadmill). But put me as a consultant on a game project where the lead game designer has left and the studio head wants the existing first two levels of dialogue rewritten from scratch this afternoon before the first playable is submitted to the publisher…instant game writer! (I imagine this is how TV episodes are often written).\nTurns out I enjoyed it. It always helps to have a deadline, so no time to worry about how bad I was writing (plus it’s just dialogue, so no tortured prose, just tortured dialogue), just plow through the game and insert dialogue here. I got to hear that tortured dialogue when we actually recorded it in house with members of the gamedev team providing the voices (aspiring writer, meet aspiring voice actors!). It didn’t sound half bad, but I did learn a few lessons:\nLetting the staff provide voiceovers, even temporary ones, is a great team-building activity and a nice break from an otherwise unfun crunch.\nThere’s something to be said for leaving room for actor interpretation, but sometimes it pays to be explicit. One exclamation I put in the dialogue was uttered as a bored monotone, like a recorded subway message.\nExtroverts make the best screamers (I don’t even remember writing a screaming scene).\nIt’s hard to avoid making exertion noises sound sexual (I’m reminded of a behind-the-scenes clip on a Buffy DVD where Joss Whedon yells at Darla the vampire, “Less orgasmic!”).\nSomeone’s always going to interpret something as homoerotic. My response is that great writing is open to interperation and he who smelt it, dealt it.\nExpect significant rewrites to accomodate game design changes, even small ones. A minor rearrangement in one level resulted in reordering some dialogue in a way that made no sense.\nAlas, the game was cancelled (not due to the writing, I hope), although possibly repurposed and cancelled later, or perhaps even published in some mutated form a lawsuit or two later. In any case, I assume my writing didn’t survive, but if you’ve got a game to ship in a few hours and you need some writing done, drop me a line.\n","date":"January 1, 2016","externalUrl":null,"permalink":"/blog/book/reviews/slaythedragon/","section":"Blog","summary":"I got around to reading Slay the Dragon! Writing Great Video Games a little while ago because I’m interested in writing, I work in game development, I met one of the authors when he was a producer at Crave Games and I worked on a game and later consulted for them, and the book looked like a bargain when I ordered it from Amazon for around $10.\n","title":"Slay the Dragon!","type":"blog"},{"content":"The circles in my personal vision of Hell are designated for the likes of car salesmen, the return department at Fry’s, phone and fax telemarketers, and SUV drivers who never signal. And down in the lower regions is a special area reserved for spammers.\nIt occurs to me once in a while that I might be unfair — after all, spammers are people too, maybe just trying to make a living or perhaps just clueless. But these moments of weakness are forever set aside now, after reading Brian McWilliam’s profiles of notable spammers in Spam Kings: The Real Story Behind the High-Rolling Hucksters Pushing Porn, Pills, and %*@# Enlargements. They range from criminals, schizophrenics, and neo-Nazi’s to otherwise reputable businessmen, but they all have one thing in common — they’re trying to make a lot of money and don’t care how they do it.\nBut this book is not just about spammers — it’s about the often-dirty war between spammers and the vigilant anti-spam community. And, as in any war, even the good guys cross the line, going beyond reporting and tracking down spammers to illegal intrusion hacks, theft of data, harassment and obsessive stalking worthy of the paparazzi. Some notable anti-spam figures have even apparently traded sides (depending on interpretation, they’re either working with previous offenders to implement anti-abuse policies, or they’ve been coopted by the enemy).\nThe real-time feel of the book, interleaving the activities of the principals in their cat-and-mouse games, keeps the whole story moving like a spy novel. And the liberal inclusion of email and instant-messaging excerpts have the effect of placing the reader in the message board and IM conversations, which gives a vivid sense of the personalities, or at least the online personas (the combination of chattiness, net lingo, and vituperative exchanges shouldn’t be unfamiliar to Epinions members!)\nBut the lack of background exploration leaves us with little idea how these people got where they were. OK, we can simply just say spammers are amoral, money-grubbing parasites (although Davis Hawke’s miserable time in the school system may have given impetus to his path from chess-player to wannebe Nazi leader, despite his Jewish ancestry and original name of Greenbaum, to spammer). That still leaves the anti-spammers. How much are they motivated by righteous indignation, sense of justice, protectiveness of the Internet, or free time on their hands? Along with Hawke, the colorful and somewhat flirtatious anti-spam “goddess” Shiksaa forms the backbone of this narrative, but I’m sure there is short shrift given to many characters donating tech-savviness, legwork and legal efforts against spam. For example, Lawrence Lessig is just mentioned once in reference to his proposal of a bounty on flagging spam, but anyone following technology knows he’s the most recognized legal figure espousing and defending the Internet, airwaves, and digital content as the common good.\nThe narrow focus of the book also limits the presentation of the general spam issue. While the spammers portrayed in this book, all in the US, seem to be more or less out of business, spam is still growing, particularly internationally. Porn is part of the book’s title, and there is reference to porn and reputed organized crime connections, but the spammers in this book primarily hawk quack diet, muscle and sexual enhancers. (Though the Wanted: Time Machine spams are a nice touch) And some fundamental issues in proposed solutions to spam could use some exploration, like the tradeoff between allowing anonymity and privacy versus tracking the origins of all email (this is why you have the option to block caller ID).\nStill, it’s nice to know there are people trying to do something about the two-hundred unwanted daily emails in my inbox. And it’s OK to hate spammers.\n","date":"January 1, 2016","externalUrl":null,"permalink":"/blog/book/reviews/spamkings/","section":"Blog","summary":"The circles in my personal vision of Hell are designated for the likes of car salesmen, the return department at Fry’s, phone and fax telemarketers, and SUV drivers who never signal. And down in the lower regions is a special area reserved for spammers.\n","title":"Spam Kings","type":"blog"},{"content":"","date":"January 1, 2016","externalUrl":null,"permalink":"/tags/writing/","section":"Tags","summary":"","title":"Writing","type":"tags"},{"content":"Technicat LLC is based in Salt Lake City, Utah, providing software development and consulting in addition to self-publishing apps and games.\n","date":"September 21, 2015","externalUrl":null,"permalink":"/about/","section":"About","summary":"Technicat LLC is based in Salt Lake City, Utah, providing software development and consulting in addition to self-publishing apps and games.\n","title":"About","type":"about"},{"content":"","date":"September 21, 2015","externalUrl":"https://gamedevslikeyou.libsyn.com/phil-chu","permalink":"/about/interview/hometeam/","section":"About","summary":"","title":"Hometeam GameDev","type":"about"},{"content":"","date":"September 21, 2015","externalUrl":null,"permalink":"/about/interview/","section":"About","summary":"","title":"Interviews","type":"about"},{"content":"Even after all these years, it’s surprisingly hard to find a decent (mobile) app store. Apple’s and Google’s are the gold standards. Amazon is OK but not quite at that level, and everyone else just sucks.\nEven though it’s fairly easy to upload an app to Amazon, it’s not as frictionless as Google’s instant submission. Amazon has it’s own set of required screenshots, etc. and for updates there are some quirks like having to remove the existing build before adding a new one. And they do have a review process, not as suspense-ridden and dictatorial as Apple’s, but with some similar requirements like not having links, directly or indirectly, to other app stores. So you have to wonder if it’s worth the effort for just a few downloads.\nEvery other app store has even worse download numbers (speaking from my own experience) and don’t look like they’re even being maintained. I had high hopes and good initial numbers for Barnes and Noble, but, coincidentally or not, after a large Microsoft investment, they seemed to drop the ball. Last I checked, their portal was still Flash-based, and didn’t seem to have the sharpest people running it.\nFor example, I filed a bug report complaining that I shouldn’t have to switch to the reporting page as directed to retrieve my publisher ID in order to file the bug report — response was, “How else are we supposed to know the ID?” — my response was, I’m logged in and the number is displayed on another page so obviously the system does know it, and every decent app store (the top three) do this properly. Once I mentioned the App Store does this, they said, ah, OK.\nMore annoying, like Amazon and unlike Apple and Google, there’s no unpublish button, so you have to contact developer support to request an app removal from the store. Unlike Amazon, my request didn’t stick — an app I requested unpublished only stayed unpublished for a few days. And some apps were rejected or removed for no apparent reason. So I guess it cancels out, and I’ve pretty much given up on the Nook store. When I see news articles on how the Nook business is having tough times against the competition, I suspect a lot of the damage is self-inflicted.\nThe Nabi is another example of good hardware with a bad app store. It looks like they just bought an app store from someone else at the last minute. In fact, I’m sure that’s what they did, because the screenshots required by the Nabi store do not match the screen sizes of the Nabi, so you have to take Nabi screenshots and then resize them to some phone size before uploading. And they only pay quarterly, instead of monthly (are they from the book publishing industry?). I made some inquiry about the payment, I forget what about, and never got a response. So I’ve given up on that one, too (plus, as with the Nook, I no longer have a functioning test device).\nAnother app store that’s changed hands without any kind of upgrade is Handango, now the Opera app store. I didn’t even plan on submitting to Handango — I responded to an invitation from LG, I think, who had contracted out there app store to Handango, and I couldn’t even get through the LG submission process (just filling out the online forms), but in the meantime Handango had snagged my apps for their own store. They’re not the most ethical bunch.\nI had slightly better luck with the Samsung store, successfully getting HyperBowl on there, but later they added some requirement about using Samsung APIs, so that was that.\nI supposed I should mention Aptoide, since I put HyperBowl there, but I only registered an account because that’s what they ask you to do when you complain that myriad pirated copies of your app are on the site. They still won’t remove those pirated apps, and now I can’t remove my account, either. Nice business they have. Maybe someone will buy them.\n","date":"September 13, 2015","externalUrl":null,"permalink":"/blog/app/twoandahalfappstores/","section":"Blog","summary":"Even after all these years, it’s surprisingly hard to find a decent (mobile) app store. Apple’s and Google’s are the gold standards. Amazon is OK but not quite at that level, and everyone else just sucks.\n","title":"Two-and-a-Half App Stores","type":"blog"},{"content":"The latest Chinese crackdown on activists reminded me of a complaint I saw from an American entrepreneur there who cited web censorship as his top “daily aggravation” and pointed to that along with pollution as the main reasons he would never start a business in China.\nI agree those are sucky, but that’s like saying you’d never live in North Korea because of the winters and lack of HBO. Let’s get some perspective — missing out on your email is one thing, but Chinese citizens end up in hard labor camps from blogging or having dinner conversation about democracy (I sometimes wonder if China is propping up North Korea so they look good in comparison).\nLast year an activist who was jailed months earlier on her way to the airport to speak at a UN human rights meeting died from lack of medical attention. This is the type of stuff we used to portray in anti-Soviet movies during the Cold War. When I was in Hong Kong, I felt like I was living next to the Death Star, with the TV playing six channels of state television, Hong Kong reporters mysteriously attacked by mainland gangs, and the Chinese government making veiled threats about what would happen at the next Occupy protest. Actually, the Empire (Star Wars, not British) in comparison didn’t seem all that bad — I think they mostly had a PR problem.\nSo if you have qualms about doing business in China, there are plenty of moral qualms you can pick from: for starters just read the overview from Human Rights Watch.\n","date":"July 14, 2015","externalUrl":null,"permalink":"/blog/politics/thegreatfirewall/","section":"Blog","summary":"The latest Chinese crackdown on activists reminded me of a complaint I saw from an American entrepreneur there who cited web censorship as his top “daily aggravation” and pointed to that along with pollution as the main reasons he would never start a business in China.\n","title":"At Least the Great Firewall Is Not a Prison Wall","type":"blog"},{"content":"","date":"July 14, 2015","externalUrl":null,"permalink":"/tags/china/","section":"Tags","summary":"","title":"China","type":"tags"},{"content":"As pleased and surprised as I was to see an Asian American do so well in the Democratic race, Andrew Yang was not one of my preferred candidates largely because I have a rule against voting for anyone who has shown no interest in any elected office besides the top one (a rule I also applied to Donald Trump, Jesse Jackson, Ross Perot…).\nI also had some other qualms about his campaign. The whole Yang Gang thing felt very Bernie Broish. And he seemed to be more willing to blame robots than racism for society’s ills. That could have been somewhat tactical since, face it, if you want to win, you want the racist votes, too.\nBut the opinion piece by Yang exhorting Asian Americans to prove their American-ness could have been written by a white guy, like someone I could think of in the White House, and it doesn’t sound any better coming from an Asian American.\nI can relate to the first few paragraphs relating his past experiences with racism. In the spectrum of racial experiences in America, I’ve had it pretty easy, mostly just people telling me about their summer trip to China and how polite my people are, but I still remember ching-chong comments from my youth and more recently while I jogged by a grade school I heard someone call me a Chinaman (first time I felt the urge to climb a fence and chase down a pack of schoolkids — kids these days, just like kids in the old days).\nBut his piece goes downhill from there. I think this is the worst paragraph.\nDuring World War II, Japanese Americans volunteered for military duty at the highest possible levels to demonstrate that they were Americans. Now many in the Asian American community are stepping up, trying to demonstrate that we can be part of the solution. Some 17 percent of U.S. doctors are Asian and rushing to the front lines.\nI’m not Japanese American, but I find that first sentence awful. It diminishes the patriotism of those who volunteered for the war (and also fails to mention fat lot of good that did them, they ended up in internment camps and got drafted to fight anyway — those who resisted the draft got imprisoned even more).\nSimilarly, I assume Asian Americans who are risking their lives on the front lines of the pandemic are doing it for the best of reasons, not primarily to “demonstrate that we can be part of the solution.” By the way, don’t forget the nurses (shout out to all the Filipino nurses out there — you won’t see them on TV medical shows, but they’re here).\nWe Asian Americans need to embrace and show our American-ness in ways we never have before.\nI’ve never doubted I’m an American or felt obligated to prove it. It doesn’t seem Andrew Yang is there, yet.\n","date":"July 14, 2015","externalUrl":null,"permalink":"/blog/politics/yang/","section":"Blog","summary":"As pleased and surprised as I was to see an Asian American do so well in the Democratic race, Andrew Yang was not one of my preferred candidates largely because I have a rule against voting for anyone who has shown no interest in any elected office besides the top one (a rule I also applied to Donald Trump, Jesse Jackson, Ross Perot…).\n","title":"Dang, Yang","type":"blog"},{"content":"(Written a while ago, but still true…)\nThis Tuesday, for some reason, the Buffy the Vampire Slayer quote “Dawn’s in trouble. Must be Tuesday.” kept intruding into my head. It’s actually kind of a poignant line for me, dating back to a friend of mine who started watching BTVS while battling cancer. When he emailed me that the series was pretty interesting, I just startled rattling on about the show, who sired who, and all the other intricacies that are for more interesting than fixing lines of code at work. He got sufficiently absorbed in the show that he cried foul at the introduction of younger sister Dawn who was non-existent in previous seasons. But I assured him, it’s not stupid Hollywood screenwriting — Joss Whedon has a master plan. And indeed Dawn turned out to be created by ancient monks and spliced into this reality to avoid the nefarious clutches of…well, you should really watch the series. But my friend passed away around that time, so I don’t know if he saw all those pieces come together.\nThe point of that melancholy reminiscence is that there are a special group of people who appreciate Buffy. I keep discovering new clumps of them. For example, a Facebook friend might mention watching on old Buffy episode the other night. Then Buffy fans emerge from the woodwork and chime in on their favorite episodes, other Joss Whedon shows (Angel, Firefly). Or I remember visiting nVidia years ago back when they were just one of many players in the graphics card space, and finding out one of the OpenGL experts there was a Buffy fan. It’s like noticing someone is wearing the same secret decoder ring. (or part of the same shadowy underground cult, if you’re an observer)\nIn my experience, Buffy fans are pretty cool people. And of the people I know who make me want to run for the hills whenever I see them, none have any interest in the Whedonverse. So I’d like to try an application of this partitioning rule — start a company and only hire members of the Buffy appreciation society. It would simplify the hiring process immensely — in the interviews, ask if the applicant is a Buffy fan. Fakers can easily be spotted — a real fan will spout favorite lines, gush over favorite characters, reenact favorite scenes, or burst into song from the Buffy musical. Obviously, anyone making dismissive remarks about vampire-slaying cheerleaders will be shown the door. To be fair, some cool people might have somehow missed the series (a comic book store owner in Bend told me they didn’t get the series until season 3), so check for these “potentials” by seating them at a computer and bringing up Dr. Horrible. See if they dig it.\nNow, there might be a problem pitching this to a VC (“I don’t know what the company will produce, but we’re only going to hire fans of Buffy the Vampire Slayer, and we’ll call each team a scooby gang, team leads will be slayers, and the department head is called a watcher, but maybe the legal department doesn’t have to have fans, they just need to be legitimately evil, like on Wolfram and Hart, but that’s Angel, not Buffy….”). I guess we just need to find an angel investor who’s a Buffy fan…\n","date":"May 25, 2015","externalUrl":null,"permalink":"/blog/tv/buffy/buffyfans/","section":"Blog","summary":"(Written a while ago, but still true…)\nThis Tuesday, for some reason, the Buffy the Vampire Slayer quote “Dawn’s in trouble. Must be Tuesday.” kept intruding into my head. It’s actually kind of a poignant line for me, dating back to a friend of mine who started watching BTVS while battling cancer. When he emailed me that the series was pretty interesting, I just startled rattling on about the show, who sired who, and all the other intricacies that are for more interesting than fixing lines of code at work. He got sufficiently absorbed in the show that he cried foul at the introduction of younger sister Dawn who was non-existent in previous seasons. But I assured him, it’s not stupid Hollywood screenwriting — Joss Whedon has a master plan. And indeed Dawn turned out to be created by ancient monks and spliced into this reality to avoid the nefarious clutches of…well, you should really watch the series. But my friend passed away around that time, so I don’t know if he saw all those pieces come together.\n","title":"Buffy Fans Apply Here","type":"blog"},{"content":"For a while, I’ve been hearing a lot of references to the Hero’s Journey, a “pattern” for structuring stories in movies and games, based on the work by Joseph Campbell. But as I currently plow through three seasons of Roswell before my free month of Amazon Prime runs out, I realize that my favorite stories are group stories — Roswell, Deadwood, Battlestar Galactica (the new one), Sarah Connor Chronicles, Buffy, Angel, Firefly (those are just my all-time favorites — you could throw in Lost and some of the modern Star Treks)\nYou could argue that each story has a Hero — obvious by the titles in Buffy and Angel — but it’s hard to pick a particular one in the others, and even in Buffy and Angel, I’m often more interested in the other characters, who have their own story arcs and sometimes even their own episodes (evil Willow, Xander plays hero for a day, Cordelia’s it’s-a-wonderful-life episode). In a popularity contest, Spike might win in both series.\nAnd it’s a stretch to say they’re all following their own Hero’s Journey — what makes the whole thing interesting is how they’re all different and join the group in different ways — typically someone is chosen or appointed to the challenge, some are trusted friends and followers, some are drawn in by lust or love, some are in it for selfish reasons. Part of the story is just seeing who earns or stumbles their way into the group and who falls out, sometimes to fall back in, later. Like a family (in that sense, these characteres are more like Norm in Cheers than Ulysses in Greek mythology). And as if just to make you realize how vested you are in all the characters, one may be suddenly removed from you, never to return (notwithstanding Cylons, time travel, and ghosts).\nJoss Whedon is the grandmaster of assembling these scooby gangs (as the Buffy crew self-consciously labels itself), but he did have one series that just didn’t do it for me, Dollhouse. And that provides some clues as to what’s required in the scooby formula. Dollhouse had the group, sure, but it was too much about Eliza Dushku’s character (like in a regular series), and for the most part the characters didn’t like each other, were unlikable, or blank personalities performing as indentured servants (like in a regular job). And the grimness of the show’s premise wasn’t lightened by Whedon’s trademark humor. For that to work, I think you have to actually like the characters.\nHowever, I enjoyed the second season a lot more. By then, the dolls developed real personalities, interpersonal relationships, they collaborated against a common enemy, and somehow the whole thing was funnier. Maybe this is why I can’t think of great scooby stories in other media (except perhaps The Wild Bunch). These stories need time.\n","date":"May 25, 2015","externalUrl":null,"permalink":"/blog/tv/buffy/scoobies/","section":"Blog","summary":"For a while, I’ve been hearing a lot of references to the Hero’s Journey, a “pattern” for structuring stories in movies and games, based on the work by Joseph Campbell. But as I currently plow through three seasons of Roswell before my free month of Amazon Prime runs out, I realize that my favorite stories are group stories — Roswell, Deadwood, Battlestar Galactica (the new one), Sarah Connor Chronicles, Buffy, Angel, Firefly (those are just my all-time favorites — you could throw in Lost and some of the modern Star Treks)\n","title":"The Scoobies’ Journey","type":"blog"},{"content":"The most entertaining part of Blake J. Harris’s Console Wars is the forward by Seth Rogen and Evan Goldberg. That isn’t a knock on the book — the forward is just really entertaining banter. The rest of the book is entertaining, too, and it should be, considering the subject matter: the video game industry, in particular the head-to-head battle between Nintendo and Sega during the SNES and Genesis years.\nHowever, the story feels incomplete, as it ends with Tom Kalinske’s departure as the head of Sega of America (and it begins with his hiring there, so the book could have been more boringly but precisely titled Tom Kalinske’s Time at Sega), so it doesn’t cover anything after the Sega Genesis, including their last console hurrah the Dreamcast (the one Sega machine I owned), or what they’re doing now (I have some curiosity on the subject as I worked for a game studio several years ago that was acquired by Sega).\nAnd the book reads like a made-for-movie or made-for-TV script, with dialogue that sometimes feels contrived (there is a disclaimer in the beginning that the conversations are reconstructed) and so over-the-top prose. There is also the tendency, common among male writers of tech books and pulp thrillers, to describe women in terms of physical attractiveness and men in Norse god ranking, e.g. women are “brunette” and “doe-eyed”, while men are “steely-eyed” and hair is not mentioned except when it’s absent. But if you’re at all interested in the video game industry, this is an informative and engaging read.\n","date":"January 1, 2015","externalUrl":null,"permalink":"/blog/book/reviews/consolewars/","section":"Blog","summary":"The most entertaining part of Blake J. Harris’s Console Wars is the forward by Seth Rogen and Evan Goldberg. That isn’t a knock on the book — the forward is just really entertaining banter. The rest of the book is entertaining, too, and it should be, considering the subject matter: the video game industry, in particular the head-to-head battle between Nintendo and Sega during the SNES and Genesis years.\n","title":"Console Wars","type":"blog"},{"content":"When I saw Creativity, Inc. on the bookshelf, I thought it was just another business book on creativity — in other words, dumb. But this book is by Ed Catmull on how Pixar is run. I mean, this is the guy who invented texture mapping. And that early part of the book recounting the early days of his career and the hardware computer graphics business that preceded Pixar is pretty interesting, but the meat of the book is how Pixar keeps its groove on (and quite interestingly, how Pixar imparted that groove to Disney after the merger).\nThere’s plenty of stuff about processes and storytelling and processes about processes and storytelling, and Steve Jobs, but there’s one lesson in there that I’ve been telling people: check your backups. Pixar almost lost an entire movie due to two classic errors: rm -f and assuming that the backup process was working. They really lucked out due to an employee working at home who had copied everything.\nI’m surprised people this smart would have fallen into this trap of bad risk management, but I’ve seen it happen at two of my workplaces. One was a small game studio that was backing up the wrong drives and the backups weren’t working, anyway. The other was software related to a space telescope (I won’t say which one, except that it rhymes with bubble). These are just two backup failures that I’ve been around — I’ve heard of others. So, don’t pull a Pixar — check your backups!\n","date":"January 1, 2015","externalUrl":null,"permalink":"/blog/book/reviews/creativityinc/","section":"Blog","summary":"When I saw Creativity, Inc. on the bookshelf, I thought it was just another business book on creativity — in other words, dumb. But this book is by Ed Catmull on how Pixar is run. I mean, this is the guy who invented texture mapping. And that early part of the book recounting the early days of his career and the hardware computer graphics business that preceded Pixar is pretty interesting, but the meat of the book is how Pixar keeps its groove on (and quite interestingly, how Pixar imparted that groove to Disney after the merger).\n","title":"Creativity, Inc.","type":"blog"},{"content":"","date":"January 1, 2015","externalUrl":null,"permalink":"/tags/graphics/","section":"Tags","summary":"","title":"Graphics","type":"tags"},{"content":"Haunted Empire: Apple After Steve Jobs directs a much-needed focus on the negative aspects of Apple’s impact on the world, particularly the pressures brought to bear on Asian manufacturers, and juicily brings to light the discordant elements of Apple’s internal politics.\nBut it seems too grimly determined to cast a dour look on Apple, I think unfairly characterizing the current management’s capabilities out of hand and dismissing the company’s chances.\nBasically, it’s just too melodramatic, as evidenced by the chapter recounting the forlorn Foxconn life of a young woman in China — I spent most of the chapter expecting it to end in her suicide, coming as it did after the chapter listing Foxconn suicides, and thankfully it didn’t, but really, it was an unnecessary detour (it could just as well have been a separate book, fiction or non-fiction) and as much an indictment of China and Chinese culture as Apple. Still, it provides a welcome alternative to the worshipful treatments of Apple and Jobs.\n","date":"January 1, 2015","externalUrl":null,"permalink":"/blog/book/reviews/hauntedempire/","section":"Blog","summary":"Haunted Empire: Apple After Steve Jobs directs a much-needed focus on the negative aspects of Apple’s impact on the world, particularly the pressures brought to bear on Asian manufacturers, and juicily brings to light the discordant elements of Apple’s internal politics.\n","title":"Haunted Empire","type":"blog"},{"content":"","date":"January 1, 2015","externalUrl":null,"permalink":"/tags/memoir/","section":"Tags","summary":"","title":"Memoir","type":"tags"},{"content":"","date":"January 1, 2015","externalUrl":null,"permalink":"/tags/nintendo/","section":"Tags","summary":"","title":"Nintendo","type":"tags"},{"content":"","date":"January 1, 2015","externalUrl":null,"permalink":"/tags/sega/","section":"Tags","summary":"","title":"Sega","type":"tags"},{"content":"Bill McDermott’s autobiography Winners Dream (or is it Winner’s Dream?) is not a particularly insightful business study, and the book drags a bit toward the end where I would expect details of SAP business and recent strategy to be more interesting.\nBut it’s hard not to moved by the author’s enthusiastic recounting of his youth and how he worked his way up to where he is now. In real life, working with rah-rah exuberant salespeople can drive me nuts, but this bio gives me a little more understanding of what it takes to survive in that tough business.\nAnd hey, the guy is running SAP, now.\n","date":"January 1, 2015","externalUrl":null,"permalink":"/blog/book/reviews/winnersdream/","section":"Blog","summary":"Bill McDermott’s autobiography Winners Dream (or is it Winner’s Dream?) is not a particularly insightful business study, and the book drags a bit toward the end where I would expect details of SAP business and recent strategy to be more interesting.\n","title":"Winners Dream","type":"blog"},{"content":"Geosocial isn’t quite the buzzword it used to be, but a while ago I was consulting for a place interested geosocial apps. The nice thing about consulting is you get paid to have an opinion, and after looking around and thinking a bit, I concluded geosocial is a trap.\nFirst, just the idea that your app has two main thrusts to it sounds dubious. It reminds me of the time I asked my boss which of two features was most important, and he said “yes.” Then you might as well call Facebook not just a geosocial app but geosocialphoto app and so on. Might be great for marketing, but a recipe for muddleheadedness in product design.\nTaking a more evidence-based approach, look at supposedly geosocial apps and you’ll find they are really geo apps with a bit of social added, or vica versa. Facebook is all social, and most of the time you don’t care where people are posting from. Same with twitter, tumblr and any blogging or photo-sharing platform. Foursquare is geo with social added. Same with tripadvisor, yelp and anything where you’re looking for places.\nOne way to tell whether an app is geo or social is figure out what the user really wants to see first. In social apps, the user should see a feed of whatever’s being shared — tweets, blogs, photos…whereas in geo apps, the first thing I want to see is a map. A map is the best visualization of where you are and what’s around you and how to get there. A list of things nearby is a nice supplement but a poor substitute.\nThat’s why I like using the tripadvisor app and avoid using the web site — the former presents me with a map immediately, and the latter makes me jump through some hoops, first. I do want to see reviews and prices, but later, after I figure out where and what’s there. This has been a problem with the Foursquare app — it was always pushing the social aspect first, when I really just wanted to find where I was and check in, and I stopped using it when the location features became too unrealiable on my phone. Maybe they recognized the geo/social confusion when they tried to push all their users to Swarm, but I’ve noticed lately the Foursquare app is now creepily good at notifying me where I am and what I’m near.\nSo if you’re making a geolocation service with social networking features or a social networking site with geolocation features, that’s great — just figure out which one it is, and don’t forget it.\n","date":"January 1, 2014","externalUrl":null,"permalink":"/blog/social/geosocial/","section":"Blog","summary":"Geosocial isn’t quite the buzzword it used to be, but a while ago I was consulting for a place interested geosocial apps. The nice thing about consulting is you get paid to have an opinion, and after looking around and thinking a bit, I concluded geosocial is a trap.\n","title":"It’s not Geosocial, it’s Geo or Social","type":"blog"},{"content":"I don’t know how anyone manages to publish an iBook. After self-publishing my collection of software development essays on Amazon and Barnes and Noble, I said (to myself) that was easy, let’s try an iBook now. After all, I was already self-publishing apps on the App Store.\nBut at the time, publishing an iBook required setting up a separate iTunes user account for some reason. And Apple requires an ISBN. I don’t remember how I got that, but I did create a new iTunes account, and I remember submitting the book. And…nothing.\nSome years later, Apple announced iBooks could be uploaded into an existing iTunesConnect account, so I tried again. It’s still weird. Although you can log in with the same credentials, it’s a separate login from an iTunesConnect app login. And you have to upload iBooks with a separate app, iTunes Producer, which requires an app-specific generated password.\nBut I did all that, and…that was over a year ago.\nAbout once a year, I log in and check that my book is indeed under review on the stores for fifty-one countries. I’d pretty much given up on it, until I got an email today saying I needed to fix something. The ticket says I need to properly format the author name, according to these guidelines.\nI checked iTunes Producer and thought, what the heck are they talking about it? I entered my name the way is says to.\nBut then I realized what I thought were formatting instructions below the name field is actually a second field. The first field is supposed to have “Philip Chu” and the second one is supposed to have “Chu, Philip”.\nThis is what happens when someone decides borders are so twentieth century (and so are affordances). Lines, who needs lines?\nAnyway, I’ve resubmitted the book. Look forward to it in two and half years.\n","date":"January 1, 2014","externalUrl":null,"permalink":"/blog/book/reviews/writingibooks/","section":"Blog","summary":"I don’t know how anyone manages to publish an iBook. After self-publishing my collection of software development essays on Amazon and Barnes and Noble, I said (to myself) that was easy, let’s try an iBook now. After all, I was already self-publishing apps on the App Store.\n","title":"Writing iBooks Is A Tough Business","type":"blog"},{"content":" Where’s My Name? # This blog I wrote in 2008 after reading the IGDA draft credit guidelines (got a nice comment from Jason Della Rocca on it) devolved into something about crunch time, so I’ve been waiting for the next big credit or crunch controversy to recycle it here. Hasn’t happened, yet (problem solved? or we just got used to it?), but prompted by the latest quality of life feature on gamasutra (Are Game Developers Standing Up for Their Rights?) and a colleague who recently tweeted his kid was asking if Daddy’s only going to be having dinner with them on weekends.\n(rewind to 2008)\nThe latest email newsletter from the Independent Game Developers Association includes a mention of the https://www.gamasutra.com/view/news/110881/Mythic_In_Warhammer_Online_Credits_Controversy.php[EA Mythic credit controversy] and a request to review the beta draft of the IGDA Game Credit Standards.\nWhile I’ve found the IGDA papers and reports valuable enough to sign Fugu Games up as a studio affiliate to show support, and the credit guidelines are better than nothing (as far as I know, there really is nothing else out there), and I’ve just taken one quick pass at it, I’ll weigh in with a few criticisms (hey, they did ask).\nFirst, the report doesn’t distinguish between a game that has no credits and a game that is incompletely credited. Software outside of games sometimes includes credits, but it is hardly standard practice (and one of my friends who was credited on a commercial document editor thought it was a silly practice). So, if only to avoid blog comments by software developers outside the game industry in the nature of “why are you game developers whining about credits, I don’t get any”, I think the IGDA should focus clearly on the fairness issue of incompletely credited games.\nNext a nitpick about definitions (but then again, a document like this is largely about definitions), in this case the definition of contributing to “production” — the guidelines take pains to define the minimum number of days (or fraction of a project term) that requires crediting but doesn’t say what exactly constitutes production. You could say it’s like the definition of obscenity (“I know it when I see it”), but I surmise it’s left vague to avoid confronting publishers over putting the marketing, legal and accounting staff on the credit list, not to mention executives who might have just attended a few meetings. And then there are producers. Like the Hollywood joke that no one knows what producers do, I like to say (hah, hah) that producers are the only ones on a game project who don’t actually produce anything. But seriously, there’s a spectrum ranging from those who just trot task lists around and hold meetings to those who really know game production and can solve problems. From what I’ve seen, the contribution level tends to be inverse to the pay grade. As an example, an assistant producer at a publisher I consulted for told me one of their senior producers made a point of spending just enough time on several different games to get a credit on each. (See Joel Spolsky’s discussion of hit-and-run management)\nAnd the guidelines say third-party materials are to be fully credited. That sounds great, but I just bought a $50 commercial font library from MacXWare off the shelf at Staples for use in my games, and the packaging doesn’t list the individual font designers. Or maybe I contracted with an audio designer for sound effects, and he has a bunch of flunkies but only requires in his contract with you that he or his company name be credited.\nThe standard states that fictitious and joke names are not allowed. But what happens if a developer doesn’t want to be credited at all? I took my name off a game once because I got so annoyed at the studio head screeching at me during crunch time (righteousness isn’t always the smart way to go), and I know a producer who took his name off when he felt a game wasn’t credited fairly. Maybe that shouldn’t be allowed, but I think the display of each individual’s name should at least be approved by that individual. That would avoid cases I’ve seen where only a developer’s last name was missing (and he wasn’t a supermodel), a credit list where the state or country of origin was listed with each name (a producer’s idea), and a credit list annotated with items like “And ladies, he’s single!” (all written by the studio head, who gave herself a description stating how she worked really, really hard)\nAnother issue is the length of the document. I know I just said it could use some additional definitions, but pass around copies to a typical game development team, and maybe one or two will read it. Programmers typically read a number of game development books and some overlapping writings on game design, game artists read comic books (you’ll find them all at Comic-Con), a handful of game designers will read serous game design books like A Theory of Fun, and publishers, forget about it, they don’t read anything except their own press clippings. So if anyone is going to read it, and especially if anyone is going to use it as a reference for creating credits, the guidelines need a concise summary, like:\nDeveloper credits come before publisher credits. Anyone working on the project at least x days or y percent of the project must be credited. Third-party materials must be credited as fully as possible. No joke credits or fictitious names. and maybe more, but at least that will fit on the back of a business card.\nBut by far the biggest problem is the same as with the Quality of Life document, which came to the fore during the EA Spouse controversy — the IGDA is preaching to the converted and the uninterested. You can raise all the common sense objections to crunch time practices all you want — publishers don’t feel they’re getting the full effort and their money’s worth if developers aren’t putting in crunch time, and it is common practice for them to send producers on-site at developer studios to sit there and make sure that’s happening. And independent studios aren’t any better — crunch time is invariably the result of bad management, but as long as the people running studios feel better seeing their staff working nights and weekends (“must be willing to put in the necessary hours to make a great game…”), they’re actually encouraged to continue making bad decisions. There are a few individuals who will self-inflict crunch time but more often you have studio management mandating it after waffling and taking wrong turns (I’ve even seen one studio head repeatedly promise an earlier-than-requested delivery date every time it looked like we might be on schedule, resulting in three successive crunch times instead of just the usual one)\nAnd the same goes for credits — there is no incentive for publishers to decide they must make sure all individual developers to be fairly credited and placed above their own names. The owner of an independent studio is not going to make place his or her name in itty bitty print below the staff and make sure everyone who wasn’t “loyal” enough to stay through to the end is fully credited.\nIf these guidelines are really appealing to the people who matter, you’ll see studios and publishers voluntarily sign up and proclaim their adherence, but I haven’t seen such a list. More likely, you’ll see the big publishers and studios tread more carefully around crunch time practices (possibly resort to more offshore outsourcing, and by offshore, I include Canada) due to attention from the press and class action lawyers, and perhaps eventually adopt standard credit guidelines when the industry is unionized. I expect this may happen as the big-budget games get more Hollywood-ized and involve more actor, writer, musician and production unions. And independent developers will be the last to reform.\n","date":"January 10, 2013","externalUrl":null,"permalink":"/blog/games/wheresmyname/","section":"Blog","summary":"Where’s My Name? # This blog I wrote in 2008 after reading the IGDA draft credit guidelines (got a nice comment from Jason Della Rocca on it) devolved into something about crunch time, so I’ve been waiting for the next big credit or crunch controversy to recycle it here. Hasn’t happened, yet (problem solved? or we just got used to it?), but prompted by the latest quality of life feature on gamasutra (Are Game Developers Standing Up for Their Rights?) and a colleague who recently tweeted his kid was asking if Daddy’s only going to be having dinner with them on weekends.\n","title":"The Open Open Open Office","type":"blog"},{"content":"","date":"January 1, 2013","externalUrl":null,"permalink":"/tags/gamedev/","section":"Tags","summary":"","title":"Gamedev","type":"tags"},{"content":"","date":"January 1, 2013","externalUrl":null,"permalink":"/tags/introvert/","section":"Tags","summary":"","title":"Introvert","type":"tags"},{"content":"I saw William Shatner give a talk at MIT back in the eighties. I recalls his enthusiasm, relating stories that surely were embellished, one of which featured some instinctual martial arts prowess that he miraculously summoned, along with a complete misunderstanding of physics (he cited the opposite of one of Newton’s Laws). The crowd loved him.\nThis memoir is similar, but it’s not all ham. Spanning the ups and downs of his adult life (not much about his childhood, but you get the impression that he didn’t get the attention he needed), he gets serious about his first wife’s addiction and accidental death, rough treatment by tabloids, low points of his career (living out of a car), and his ambivalence about being Kirk (interestingly resolved after meeting Patrick Stewart, who took his Jean-Luc Picard role very seriously).\nDespite the self-deprecating bits of his narration, Shatner is obviously sensitive to the criticism of his acting and hostility by many of his Enterprise crewmates. And who wouldn’t be? But really, he should have watched a couple of Comedy Central roasts before agreeing to be the target of one, and if a lot of people who worked with you don’t like you, saying they’re just jealous and what did I do? isn’t very convincing.\nIt seems to me his humor is slightly homophobic, and slightly more anti-geek (hey, if you don’t like what the critics are saying, remember your fans and stop telling them to get a life). And hardly any mention of 3rd Rock from the Sun? But the guy is working hard and having fun, and it’s hard to hold anything against him. He may not be a geek, or everyman (he seems to think being broke as an actor is worse than any of us being broke), but he is Kirk.\n","date":"January 1, 2013","externalUrl":null,"permalink":"/blog/book/reviews/shatnerrules/","section":"Blog","summary":"I saw William Shatner give a talk at MIT back in the eighties. I recalls his enthusiasm, relating stories that surely were embellished, one of which featured some instinctual martial arts prowess that he miraculously summoned, along with a complete misunderstanding of physics (he cited the opposite of one of Newton’s Laws). The crowd loved him.\n","title":"Shatner Rules","type":"blog"},{"content":"I see there’s a [newer edition]https://www.jblearning.com/catalog/productdetails/9780763795931 of this book. Here’s a review of the first edition that I wrote on Epinions, so it’s a bit dated (with reference to hardware).\nAs video games become more respectable(?), an increasing number of books, magazines and web sites offer to divulge the “secrets” of game development.\nThe sexiest category is game design — stand in a crowd of game designers and you’ll hear them tossing around phrases like “tweaking”, “balancing”, “finding the fun”, and “removing the fourth wall”. Programmers get their fair share of glory, too — your eyes will glaze over as they discuss AI, game physics, 3D rendering, and the ever more complex game hardware. No one knows what producers really do, but they’re often quoted in interviews and they accept game awards, so whatever it is, it must be important.\nUnfortunately, actually shipping a game involves inglorious tasks like testing and packaging, user interface implementation, and fulfilling all the detailed and sometimes conflicting requirements of publishers and hardware vendors. These tasks are often assumed to be “easy”, and they are — in the sense that digging a ditch is easy, yet grueling and time-consuming.\nOne of these mundane yet crucial areas is localization — the process of converting a program to run and appear correctly for a different part of the world. More and more, it is assumed that console video game (as opposed to a PC game), will be released in more than one region (US, Japan, Europe), and any game that encounters success is sure to have additional localizations performed (I worked on a special-case French localization of an arcade game for a client in Montreal, to satisfy the local statute requiring mostly French text in just about everything).\nYou can find a few articles here and there on localization, but now there is an entire book, Heather Maxwell Chandler’s The Game Localization Handbook, published as part of Charles River Media’s sizable Game Development Series. The book is ambitious in scope, covering the business case for localizations, degrees of localization, the various assets that need to be localized, planning, budgeting and executing the localization work either in-house or via outside vendors.\nThe author’s bio indicates she is a producer at Red Storm Entertainment, known as the developer of the Tom Clancy games. This background seems to correspond with the strengths and weaknesses of this book. As a producer, she ably presents an overview of the cost-benefit analysis for localization and the available levels of localization (ranging from none to just the packaging to full blown in-game text, graphics, and voiceovers). The itemization of production and marketing stages for localization and checklist of assets that potentially have to be localized fulfills the “handbook” part of the title. (Depending on what part of the production pipeline you’re in, it’s easy to overlook things like manuals that have to be translated and reprinted, graphic symbols that make no sense in other parts of the world, and things that just won’t fly in certain countries, e.g. Nazi symbols are not allowed in Germany)\nBut as an independent developer (as opposed to a publisher), Red Storm likely contracts out much of its localization work, and thus the Handbook provides tips on finding and negotiating terms with localization contractors while the section on in-house staffing is skimpy. And while I love seeing real sample project documents in these types of books (every practicing or aspiring game developer wants to know what people really charge), I’m a bit troubled by one sample quote that spreads a fixed cost over multiple languages. What happens if the publisher decides to forgo one language (and believe me, publishers change their minds all the time)? You can say, excuse me while I recalculate all the numbers, or more likely the publisher will take that increment out of your profit margin, if you have any left (one publishing executive stated at a recent conference that a deal that puts a developer out of business is a good deal).\nMaybe there is an element of political correctness in avoiding criticism of publishers or localization contractors — as an independent game developer, you don’t want to antagonize them. But I’m a little surprised the book doesn’t mention that there can be many iterations due to shoddy work. On every localization project I’ve worked on, I’ve had coworkers point out that translations provided by the publisher were wrong (I highly recommend having an international staff). One group corrected half of their translations and then went on vacation without telling me which half was fixed.\nThe book is weakest, not surprisingly, in its treatment of the technical issues. The author hits a lot of the high points, but you get the feeling she’s regurgitating what she’s heard from the programmers on her team, or the snippets of developer interviews that are interspersed throughout the book. For example, she mentions that for localization, game code should be Unicode or double-byte enabled, rather than using single bytes for each character.\nThings are a actually a bit more complicated — Unicode is an assignment of numbers to every possible text character in the world (so indeed you need more than one byte to represent that range of numbers), but there are a variety of ways to represent that within a program, including double-byte but also schemes that allow variable numbers of bytes, e.g. one byte for English text (same as ASCII) and as many bytes as necessary for other character sets. By the way, this isn’t particular to games — proper web pages are supposed to indicate what encoding they use, and quite possibly you’ve run into cases where one byte included regular characters plus just enough more to handle a few European languages (Latin-1).\nAnd the treatment of console issues doesn’t indicate the true pain you can encounter when you’re not developing for PC’s with their gobs of memory. Start with a game running on a PC with 256MB, pretty much minimal today. A version running on the Xbox has only 64MB, which still isn’t too hard to work with. But then move down to the Playstation 2 with it’s 32MB. And then the GameCube with 24MB. If you double-byte all the text, you’re doubling the memory occupancy of that text (we’ll ignore issues with data size on disc).\nAlso, additional or larger user interface elements (larger buttons and menu items, name entry keyboards with more keys for a larger alphabet) take up memory. The author describes the difference between the NTSC TVs we’re familiar with in the US and the PAL TVs in Europe, but doesn’t note that the larger number of vertical lines also means a bigger chunk of memory used for display. (You can run into a lot of problems with the 60Hz vs. 50Hz difference, too)\nBut the biggest omission on the technical side isn’t in the details — rather it’s in the big picture. The author advocates, rightly, planning ahead for localization, and that is sufficient for well-defined tasks like translating the player manual. But the whole approach may leave the reader with the impression that as long as the programmers have used the right coding techniques it’s just a matter of dropping in translated assets when it comes time to make a European version.\nThis is why we have crunch times. Not only should you plan ahead for localization, you should have localization from the beginning of the project on. This doesn’t mean you have to have all the full German translations at the very start, but it does mean you should have prototype German builds early on so you can see there’s no way that word is going to fit on that tiny button.\nAnd you’ll know early if the PAL version will run out of memory or have weird object collisions because of the different frame rate (I’ve run into both). On one game where I started doing regular PAL builds early in the projects, I really did just need to swap in translations at the end. On another project where it was more of an afterthought, the programmers didn’t even have PAL TV’s to test their changes.\nOverall, notwithstanding programmer gripes, this book is a welcome addition to the game development literature (which was non-existent a decade ago).\n","date":"January 1, 2013","externalUrl":null,"permalink":"/blog/book/reviews/gamelocalization/","section":"Blog","summary":"I see there’s a [newer edition]https://www.jblearning.com/catalog/productdetails/9780763795931 of this book. Here’s a review of the first edition that I wrote on Epinions, so it’s a bit dated (with reference to hardware).\n","title":"The Game Localization Handbook","type":"blog"},{"content":"","date":"January 1, 2013","externalUrl":null,"permalink":"/tags/william-shatner/","section":"Tags","summary":"","title":"William Shatner","type":"tags"},{"content":"During a childhood camping trip in Catalina, while all the other kids ran off to the beach, I sat at a picnic table, went into library mode, and settled into a good book (can’t remember which one, but I was really into Heinlein and Asimov back then).\nLater that evening, a camp counselor asked me if I was unhappy or having problems with the other kids. Apparently, a well-intentioned elderly couple saw me sitting by myself and alerted the counselors, and they all had some trouble believing a kid would like sitting by himself and reading.\nSo I was pleasantly surprised by the popularity of Susan Cain’s book and TED talk on introverts. I still haven’t read the book, but I watched the talk and read many ensuing interviews (part of my surprise is just seeing an introvert be such a successful public speaker and interviewee).\nI suspect the attention is due not just introverts seeing their story publicized (there aren’t a lot of introvert conventions — well, maybe Comic Con), but also non-introverts finally getting a handle on those wallflowers who never want to join the group for lunch (guilty). Kind of like discovering a new species…fascinating.\nNow, to gripe a bit, the problem is that now people like to call themselves introverts, just like it’s been fashionable to say you have OCD, Asperger’s, and wheat allergies. At least, that’s what I’ve seen talk show guests say, like “I have OCD — I always have to make sure my kitchen cabinets are closed”. And just look at Whole Foods. That’s a whole lotta well-heeled folks with a gluten grudge.\nIf you call yourself an introvert because on occasion you don’t feel like partying, that’s like calling yourself anorexic because you settle for a salad once in a while. If you’re really introverted, then at parties you feel like the Tim Robbins character in Jacob’s Ladder:\nSpeaking for myself, it’s not that I’m not social. There’s just a limit. A three-hour limit (I’ve timed it). And no crowds (I spent six months in Hong Kong waiting for the food court quiet hours — lost five pounds). If I had a video game energy bar above my head, you could see it draining at every GDC party I’ve attended.\nBut a quiet drink or meal with one or two friends, no problem (two is possible as long as neither of them are too extroverted — otherwise the two’s company, three’s a crowd rule applies).\nI’m not bragging about being introverted. Aside from the social aspects, professionally it has its disadvantages. A total aversion to meetings is not really better than being one of those sickos who enjoy calling meetings (yeah, I’m talking to you, scrum masters…)\nBut given that introversion is almost trendy, now, I don’t feel like the Steve Martin character in The Lonely Guy:\nAnd I get a lot of reading done.\n","date":"January 1, 2013","externalUrl":null,"permalink":"/blog/book/reviews/yeahimintroverted/","section":"Blog","summary":"During a childhood camping trip in Catalina, while all the other kids ran off to the beach, I sat at a picnic table, went into library mode, and settled into a good book (can’t remember which one, but I was really into Heinlein and Asimov back then).\n","title":"Yeah, I'm Introverted, Now Leave Me Alone","type":"blog"},{"content":"I read the The Hunger Games almost accidentally — it happened to be at the top of the list of Kindle books I could borrow while trying out Amazon Prime, and I remember seeing an entertainment news personality excitedly discussing the upcoming movie, so I figured why not.\nAnd one bleary-eyed all-nighter later, I’d finished it. The action is compelling, the vision of this dystopian future is fascinating, and the concept of the Hunger Games — kids fighting to the death in a combination of gladiatorial and MacGyver combat — is original and twisted.\nSo I was pretty surprised later to hear that this is a “teen” novel (but I’m glad to see some teens are reading this instead of Twilight — after two pages of that I thought my brain would explode, just like when two teenage girls sat near me at the local pizza parlor and talked about boys and texting for half an hour. Substitute vampires for texting). I suppose I should have been tipped off by the oh-no-two-boys-love-me-what-shall-I-do handwringing, which was getting on getting on my nerves, but I do like the Katniss’s attitude of I-don’t-have-time-for-this-I’m-on-a-mission. Literally, she’s trying to be the breadwinner. Now that’s a modern (or really, postmodern) woman.\nAnd I’ll admit it, I was getting into the romantic aspects, to the point where I was wondering about the chasteness of the whole book (another tip that it’s targeted to the teen demographic). But I’m not embarrassed to be a fan of this story. I’m really not. Especially after I just read in the sporting news that LeBron James has been reading Mockingjay (the third in this trilogy) in the locker room before each game of the Heat-Celtics series, including his 45-point high-percentage Game Six. I wonder when he was raining down all those shots if he felt like Katniss letting fly an arrow.\n","date":"January 1, 2012","externalUrl":null,"permalink":"/blog/book/reviews/hungergames/","section":"Blog","summary":"I read the The Hunger Games almost accidentally — it happened to be at the top of the list of Kindle books I could borrow while trying out Amazon Prime, and I remember seeing an entertainment news personality excitedly discussing the upcoming movie, so I figured why not.\n","title":"The Hunger Games","type":"blog"},{"content":"Like the author’s well-known book The Long Tail, I felt Chris Anderson’s more recent book Free: The Future of a Radical Price would have been fine as a Wired article but suffers from being artificially stretched to book length. It overreaches, citing anything remotely related to free, even including the term “free lunch” as an example.\nAs in other works of this ilk, the author breathlessly extols the new world order while understating the challenges this poses to those who reside in the “long tail.”\nIronically, I found this book in the bargain section of Office Depot.\n","date":"January 1, 2010","externalUrl":null,"permalink":"/blog/book/reviews/free/","section":"Blog","summary":"Like the author’s well-known book The Long Tail, I felt Chris Anderson’s more recent book Free: The Future of a Radical Price would have been fine as a Wired article but suffers from being artificially stretched to book length. It overreaches, citing anything remotely related to free, even including the term “free lunch” as an example.\n","title":"Free: The Future of a Radical Price","type":"blog"},{"content":"During my recent trip to Portland, I was saddened to see Powell’s Technical Books is no more, now just a portion of the third floor of Powell’s main store. And there are five floors (that’s why they call it https://www.powells.com/[Powell’s City of Books]).\nBut I wasn’t surprised. Every other computer bookstore I used to frequent is gone, already. It’s as if I left a trail of dead bookstores in my wake.\nLos Angeles: OpAmp Books — a technical bookstore in Hollywood, as you would expect filled with books useful for the entertainment industry. Got some good computer graphics books, there.\nSan Diego: San Diego Technical Books — I only went there once, while I was living in Orange County. Bought some O’Reilly books there in some O’Reilly promotion which they terminated so I think O’Reilly owes me something.\nOrange County: Irvine Sci-Tech Books — serving the decent high-tech presence around Irvine (they have a Google!). They had some good t-shirts.\nBoston: Quantum Books — my favorite bookstore around MIT is still the MIT Press bookstore, but it was nice to have a regular technical bookstore in Kendall Square. You’d think with the MIT Media Lab around the corner and the MIT Laboratory of Computer Science up the road and all the bio and other tech in Kendall Square, that would be enough…but now you have to go to the MIT Coop bookstore.\nBay Area: Computer Literacy — the granddaddy (or grandmama, not to be sexist) of computer bookstores. I may have visited the DC area store during my government contract days, but it was already in decline when I frequented the original Bay Area store (so you could blame the rise of the Internet, or decline of the Internet), as it became Digital Guru, then Fatbrain and was eventually acquired by Barnes and Noble. Which is where I get my computer books now.\n","date":"January 1, 2010","externalUrl":null,"permalink":"/blog/book/reviews/computerbookstores/","section":"Blog","summary":"During my recent trip to Portland, I was saddened to see Powell’s Technical Books is no more, now just a portion of the third floor of Powell’s main store. And there are five floors (that’s why they call it https://www.powells.com/[Powell’s City of Books]).\n","title":"The Last of the Computer Bookstores","type":"blog"},{"content":"Imagine a police department that closes a case if they figure they can’t solve it. Say this department tosses away criminal complaints if the suspect is already accused of another crime. And they upgrade misdemeanors to felonies to make sure they get solved.\nThat would be one messed up police force. It might be entertaining as a TV show (but maybe not — imagine Cold Case if every episode consisted of “Wow, this case is really old. Case closed.”)\nThis is often how bug databases are operated, though. Bug reports are closed because they’re duplicates, because there’s no plan to fix the bug, because the product was released (seriously, I worked on a game project where the publisher marked all bugs as closed when the game shipped), basically because everyone likes seeing bugs closed (except for the bug submitter who didn’t get a fix). And I’ve seen bugs upgraded from minor to critical to raise their priority as other critical bugs got fixed. This isn’t a bug database — it’s a to-do list.\nA bug database is supposed to represent the truth of the system. It’s your weapon against wishful thinking (I presented one of my bosses with the open bug count when he kept trying to cram new features into an impending release — that was enough to get him to back down). It’s the history of the product development — each bug is a story that shouldn’t end abruptly with “and they lived happily ever after. The End.” And the bug database is your source of statistics. You should see bug reports spike up and ramp down during a project. But they should be real statistics. To borrow from another TV police drama, The Wire — “Don’t juke the stats.”\n","date":"June 1, 2009","externalUrl":null,"permalink":"/blog/management/dontjukethestats/","section":"Blog","summary":"Imagine a police department that closes a case if they figure they can’t solve it. Say this department tosses away criminal complaints if the suspect is already accused of another crime. And they upgrade misdemeanors to felonies to make sure they get solved.\n","title":"Don’t Juke the Stats","type":"blog"},{"content":"","date":"June 1, 2009","externalUrl":null,"permalink":"/tags/qa/","section":"Tags","summary":"","title":"QA","type":"tags"},{"content":"","date":"January 1, 2009","externalUrl":null,"permalink":"/tags/metaverse/","section":"Tags","summary":"","title":"Metaverse","type":"tags"},{"content":"The Second Life Herald: The Virtual Tabloid That Witnessed the Dawn of the Metaverse by Peter Ludlow and Mark Wallace brings up many interesting issues including avatar rights, how or whether to report possible real-world crimes that are related in the virtual world, corporate undergovernance and overgovernance, online misbehavior, underage users operating virtual prostitutes….\nBut it’s obscured by the usual fascination with cybersex (teledildonics, anyone?), the grudge-like complaining over how Ludlow was treated by EA during the Herald’s Sims Online years (it sounds like me complaining about my cable provider) and the distracting use of third-person in a first-person narrative (it’s mostly about Ludlow). Imagine listening to a sports star (or star journalist?) talk about himself in the third person at book length.\nThe Herald itself is entertaining, though not updated in a couple of years, and the About page gives you a taste of the tone of the book. One thing I’ve learned from working with virtual worlds (including participation in a developer meeting in-world for Blue Mars), is that putting something in a virtual world makes it more interesting.\n","date":"January 1, 2009","externalUrl":null,"permalink":"/blog/book/reviews/secondlifeherald/","section":"Blog","summary":"The Second Life Herald: The Virtual Tabloid That Witnessed the Dawn of the Metaverse by Peter Ludlow and Mark Wallace brings up many interesting issues including avatar rights, how or whether to report possible real-world crimes that are related in the virtual world, corporate undergovernance and overgovernance, online misbehavior, underage users operating virtual prostitutes….\n","title":"The Second Life Herald: The Virtual Tabloid That Witnessed the Dawn of the Metaverse","type":"blog"},{"content":"I once had a salary review in which my boss explained there’s always something you can do better, so she always made a point to bring up that something in the review. In this case, she said she’d like me to volunteer for tasks more often, whereupon I replied that every time I did that, it turned out badly. To that, she responded, “I don’t know what to say to that.”\nNevertheless, I think she had a point, but one problem I’ve seen in workplaces is there’s always someone who people don’t expect to improve. For example, in that same workplace, there was a guy working with a PhD working on the algorithmic side, and more than one person told me he had to be supplied with prebuilt libraries of our code. I don’t know if they just assumed he couldn’t perform the necessary Visual Studio build steps or if he’d made a fuss about it, but when I went through it with him, he had no problems with it, and it seemed to me he was happy to have that much more control.\nIt is a bigger problem if the person really doesn’t want to learn. That’s how you eventually end up like my coworker who pretended to make progress for months and later was passed around from group to group as a charity case.\nSometimes this happens because of the social dynamic. People who don’t know anything about what you do are non-threatening because they don’t know anything about what you do. You can see this in the typical programmer-marketing dynamic. While programmers always complain how marketing doesn’t know anything about the tech, while not really expecting them to know it or making much of an attempt to explain it, and meanwhile marketers get impatient at long explanations and complain “I just want a yes or no answer!” (you can substitute management for marketing).\nIt’s more insidious when this happens between management and employees. I’ve been at more than one place where the top dog enjoyed complaining about their incompetent underlings but never really expected them to do a better job, and those mediocre workers ended up as the longer-lasting employees. Which just goes to prove that your job is to make the boss happy, and sometimes that means making him feel superior.\nOf course, despite the stories about people getting thrown into the deep end and flourishing, you can’t always expect dramatic leaps in capability and production. That’s sometimes what happens to those pigeonholed as hopeless — they fail and flail and then no one (including themselves) expect further success. But like my boss said, you can always improve. Start small if you have to, but get better.\n","date":"January 1, 2007","externalUrl":null,"permalink":"/blog/management/haveexpectations/","section":"Blog","summary":"I once had a salary review in which my boss explained there’s always something you can do better, so she always made a point to bring up that something in the review. In this case, she said she’d like me to volunteer for tasks more often, whereupon I replied that every time I did that, it turned out badly. To that, she responded, “I don’t know what to say to that.”\n","title":"Have Expectations","type":"blog"},{"content":"I don’t know if it’s my lack of inspiration or the power of twitter, but lately most of my blog ideas have stemmed from twitter threads. The latest was a tweet lamenting the lack of books showcasing the art of video games.\nAnd there doesn’t seem to be many, but that thread did remind me one game I worked on, Darkwatch, did have an book showcasing its art, aptly titled The Art of Darkwatch (with a nice blurb from Syd Mead.\nOne of the things about Darkwatch is that the team had a lot of top-level artists, designers, and comic book writers, so they did a good job of leveraging the IP into art books, game magazines and comic books.\nI spotted the The Art of Darkwatch on a bookseller’s table at Comic Con and was pleased to see not just the concept art but even the HUD design, as I’d spent eight months getting that stuff on screen, animated, flashing, and so on.\nActually, I was originally contracted to work on the HUD during the final two months of the project, but let me tell you, when you schedule HUD development for the final two months of a game project, it’s going to take eight months.\nHere’s the review I wrote on Goodreads a while back:\nAs a programmer on High Moon Studio’s Darkwatch video game (PS2 and Xbox) three years ago, I felt obligated to buy this book when I saw it at Comicon this year. Like other concept art treatments (this one comes complete with a Syd Mead intro), it’s lavishly filled with fantastic illustrations of the characters, weapons, vehicles and environment, but as such it discusses the much different original premise of the game (starting with a comic western gambler before evolving into a dark vampire western) and details many of the intermediate artistic directions and practical approaches, e.g. focusing design of pistols from the back, since that’s mostly what you see in a first-person shooter. I’m embarrassed to say I didn’t know half of this stuff, even though I was there. The book even discusses design of HUD elements (the area I spent most of my time on), which is usually considered too mundane for this type of book.\nMembers of the concept art team at High Moon Studios are profiled here, so it’s great to see a couple of guys I worked closely with, Billy King and Shane Nakamura, featured prominently, and complete game credits are listed in the back, so as a bonus you can find me there in small print.\nThat twitter thread was right — we should have more game art books.\n","date":"August 1, 2006","externalUrl":null,"permalink":"/blog/book/reviews/artofdarkwatch/","section":"Blog","summary":"I don’t know if it’s my lack of inspiration or the power of twitter, but lately most of my blog ideas have stemmed from twitter threads. The latest was a tweet lamenting the lack of books showcasing the art of video games.\n","title":"The Art of Darkwatch","type":"blog"},{"content":"Reading Cellphone: The Story of the World’s Most Mobile Medium and How It Has Transformed Everything! is like being on the receiving end of the most maddening and pointless conversation you’ve ever had:\nI-have-the-last-word-in-the-argument: In the preface, the author states that he won’t discuss the debate about cell phones causing brain tumors, then immediately adds, “The claims are unsupported by medical evidence.” That’s like my previous boss who would say something rude, followed by “let’s not discuss this anymore,” then toss in a final insult. Anyway, even if I were to trust a professor of media studies to assess medical data, a book ostensibly about the cell phone’s impact on society should at least describe the not insignificant concern about cell phone radiation.\nthe provocative and ridiculous assertion: The author claims the cellphone has had a bigger impact on the world than the Internet. Yet he devotes much of the book to the advances of the Internet. (In fact, much of the book is devoted to the history of telecommunications starting with the telegraph and to non-unique aspects of the cell phone, like the Pavlovian response to phones ringing) He asserts that the videophone coverage in the Iraq war was completely objective, with Geraldo Rivera’s disclosure of his unit’s location as an extreme example of objectivity, while the one exception was Dr. Sanjay Gupta, who interrupted his broadcasting to administer emergency medical treament to a two-year old Iraqi boy. (The author says Dr. Gupta’s objectivity was questioned, but doesn’t say by who). What about Rivera’s relentless self-promotion — that counts as objectivity? Perhaps it’s time for Geraldo to start a new talk show using videophones, that would really add some objectivity.\ndumb analogies: The author cites cites Stephen Jay Gould’s explanation of “preadaptation”, how evolutionary products such as walking limbs later can transform into other functions such as wings, then proposes that thumb-operated cell phone buttons also qualify. That’s ridiculous — cell phones are designed (or mis-designed) for our digits, not the reverse. It’s called user-interface design or human factors engineering, but definitely not evolutionary preadapation, unless our thumbs have started changing shape to match cell phone buttons.\nfacts out of context: The early laptops, circa 1983, are described as limited by their operating system incompatibility with CP/M, DOS and the Macintosh. Well, those three operating systems were incompatible with each other, and there were plenty more at that time — just about every line of computers had its own OS. (even within Apple, there were the mutually incompatible Apple II, Apple III, Lisa and Mac OS’s.)\nrambling: the book is 256 pages, with surprisingly little dedicated to cell phones, but snippets of just about everything media in the twentieth century. Like postcards?\nshameless self-promotion: The book is filled with “See my book…”, and the bibiliography section at the end of the book lists thirteen works by the author.\nannoying coined phrases: The author describes anything cell phone related as “cellphonic”. From now on, I’ll call everything about books “bookolic”.\nCellphone reminds me of my stoned friends pontificating aimlessly and circuitously over technology, society and philosophy. (At least I hope they were stoned — broadcasting several minutes of such interminable discourse would be a more powerful anti-drug message than a two-second display of sizzling fried eggs). I’ve often grumbled about how today’s cellphone culture contributes to short attention spans and disconnected thought — it never occurred to me that a book about cellphone culture could be the worst example.\n","date":"January 1, 2005","externalUrl":null,"permalink":"/blog/book/reviews/cellphone/","section":"Blog","summary":"Reading Cellphone: The Story of the World’s Most Mobile Medium and How It Has Transformed Everything! is like being on the receiving end of the most maddening and pointless conversation you’ve ever had:\n","title":"Cellphone: The Story of the World’s Most Mobile Medium and How It Has Transformed Everything!","type":"blog"},{"content":"Although I technically majored in an electrical engineering department, I’m definitely a software guy — I’m afraid to touch my car battery, and I’ve managed to set fire to a couple of toasters.\nSo I’m not just impressed, I’m positively intimidated by the high school youngsters depicted by Caroline Kettlewell in Electric Dreams: One Unlikely Team of Kids and the Race to Build the Car of the Future. Led and encouraged by an unlikely pair of high school teachers — Eric Ryan, the idealistic Californian who made his way to rural North Carolina via Teach for America, and Harold Miller, the shop teacher who wrapped his boundless imagination and intellect with a Southern drawl and patience — the team at Northampton surprised everyone including themselves by winning a regional electric vehicle contest against elite and well-funded schools.\nWhat the two instructors had in common was faith that in six months their students could turn a decrepit Ford Escort into cruising proof that you can run a car on batteries (the wiry teenage girl Katrina drove the dangerous-sounding yet appropriately named Shocker sixty-five miles in the range competition before time expired, and made her mark as the first African-American female to win on a NASCAR track) And their enthusiasm was contagious — teachers and students from neighboring schools participated, friends and family donated time and money, and local businesses contributed materials, services and expertise, Appropriately, the students’ first-place finish was a victory for their community, demonstrating that their part of the rural South was good for more than just “bailing hay”, as a teacher from a competing school had snobbily remarked.\nMs. Kettlewell’s prose is perfectly paced and casual for this story, imparting the mannerisms and speech of these colorful figures in a way that tells as much about the characters as the Southern culture. (I don’t know if the author has southern roots, but the book reads as if it were narrated while sitting on a front porch with lemonade in hand.)\nI’m also gratified to see this treatment didn’t focus just on the grand idea of entering the contest and the winning of the contest — the construction of Shocker is an excellent engineering case study, and the teachers and kids succeeded by crunching the numbers, making do with the resources they had, and planning ahead (have something running a month ahead of time, they were advised, and they did). Arduous grunt work (packing students into the car to simulate the weight of sixteen heavy batteries) punctuated by nerve-wracking anomalies (the first test-drive emitted oil-burning smoke from a supposedly oil-less vehicle) is rewarded by seeing the fruits of their labors not just work, but work fantastically well.\nThe happy ending does leave us hanging a bit. It’s noted that the big automakers dropped the ball on getting EV vehicles on the market, and there’s a mention of the emergence of the hybrids, but there’s not much analysis of why the EV’s didn’t take off. And while Eric Ryan and Harold Miller went on to to bigger things (Mr. Miller moved up to run a regional EV competition and Mr. Ryan became a science education consultant), it’s not clear what happened to the student participants after they went on to win the national event in Phoenix.\nBut knowing what they’ve accomplished, I’m not worried about what’s ahead of them. Every once in a while, we need a reminder that kids are the future, and Electric Dreams shows what can be accomplished with a little idealism and the support of community, family, schools and industry.\n","date":"January 1, 2005","externalUrl":null,"permalink":"/blog/book/reviews/electricdreams/","section":"Blog","summary":"Although I technically majored in an electrical engineering department, I’m definitely a software guy — I’m afraid to touch my car battery, and I’ve managed to set fire to a couple of toasters.\n","title":"Electric Dreams","type":"blog"},{"content":"","date":"January 1, 2005","externalUrl":null,"permalink":"/tags/law/","section":"Tags","summary":"","title":"Law","type":"tags"},{"content":"From the title of Paul Glen’s Leading Geeks, I expected this book to be asinine and useless. I was half right — it’s asinine but worse than useless.\nThe author both warns against buying into the geek stereotype and promotes it, sometimes in the same sentence: “We will move past useless sterotypes and look into patterns of geek attitudes, beliefs and behaviors that make them both unusual and unusually difficult to lead and understand.” Is this on the Discovery Channel? Or perhaps on one of Fox’s “When Animals Attack” episodes.\n“Geeks are different from other people”. Besides the patronizing and often contradictory characterizations (geeks are introverted, how do you identify extroverted geeks?), there are the useless theories and models: “The tripartite relationship” of Geeks, leaders and geekwork, and the “Hierarchy of Ambiguity”, a pyramid with three layers, environmental, structural, and task ambiguity. Apparently, you just need three different words to produce a model.\nThe author cites project leader Tom West’s political maneuvering in Tracy Kidder’s The Soul of a New Machine as an example of resolving ambiguity and specifying a purpose for his group (developing the Data General Eclipse minicomputer), but here again the point is muddled. West vocalized different purposes for different audiences, and the ultimate purpose was to get a piece of the “glamor” work performed by another division. Which is not what I would call focus. And in the end, the Eclipse, while completed, was not a particularly successful product. However, Tracy Kidder’s book is a good read and provides at least a better anecdotal portrayal of geeks.\nThere are other teaser bits of valid information that go nowhere. The author recommends that geek project leaders use the iterative “spiral” project schedule rather than the monolithic “waterfall” method. (Is he talking to the geek project lead here, or is this more like a football commentary, while we watch?) Really, there is quite a bit more to software development methodology than that, e.g. the now in-vogue Extreme Programming (in which paired programming is one of the well-known recommendations, not quite consistent with the author’s statement that geeks like to work alone).\nThe abundance of software practices and metrics, all produced by “geeks”, refute the author’s blanket characterizations that geeks don’t care about the big picture and that it is difficult to quantify geek productivity (he settles for a qualitative assessment of how well the geek knows his stuff). In fact, he lets geeks off easy when he states that it is unreasonable to ask geeks for time estimates on tasks they are unsure of. That is bad project management, almost as bad as the typical management practice of either dictating or negotiating those estimates. Any engineer, actually any employee, should be aware enough of past experience and comparable efforts by others to make a reasonable prediction. Otherwise, there is no point in trying to manage a project — it’s just an exercise in self-denial.\nWhich points to what I believe is the real issue in leading geeks — it’s not the “geeks”, it’s the “geekwork”, to use Blum’s terminology. If you hire ten engineers from MIT, it’s still extremely unlikely that you will get any of the hardcore geeks behind the well-publicized pranks — you will more likely get an assortment people with varying social social skills, competence and dedication to their work. The management challenge is in managing an engineering problem, and the succesful manager will be knowledgable in the problem domain, problem-solving methods for that domain, and exercise good judgment, which is not “geek” management. It’s just good management.\nChapter Three, “Groups of Geeks”, begins with “If you want to lead geeks, it’s not enough to understand them as individuals”. The author has it backward — we use generalizations as conveniences (in the context of physics, someone once said “all models are wrong, but some are more useful than others”) and fodder for humor, not as a productive way to deal with individuals.\n","date":"January 1, 2005","externalUrl":null,"permalink":"/blog/book/reviews/leadinggeeks/","section":"Blog","summary":"From the title of Paul Glen’s Leading Geeks, I expected this book to be asinine and useless. I was half right — it’s asinine but worse than useless.\nThe author both warns against buying into the geek stereotype and promotes it, sometimes in the same sentence: “We will move past useless sterotypes and look into patterns of geek attitudes, beliefs and behaviors that make them both unusual and unusually difficult to lead and understand.” Is this on the Discovery Channel? Or perhaps on one of Fox’s “When Animals Attack” episodes.\n","title":"Leading Geeks","type":"blog"},{"content":"The death penalty, like abortion, is one of those issues that seems to inspire strong opinions in just about everyone, regardless of personal experience or knowledge. Like most people, I consider myself a moderate — I have been uncertain about the morality of capital punishment and haven’t drawn any conclusion (read, done any research) about its effectiveness as a deterrent, but I have been firm in believing that the government should not be in the execution business.\nI am hardly an activist, but even so I’ve been drawn into vigorous debates about the death penalty with several of my coworkers over the last couple of decades, ranging from a conservative friend right out of college who considered my stance just another part of my liberal pro-Dukakis platform (this was a while ago, and really, I did like Bush Sr.), to one of my project managers several years later who apparently considered my opinion too cerebral and said I should “think with my heart instead of my head”. It seemed to me that heartfelt vengeance wasn’t an improvement over thinking about the issue, but damn my Vulcan logic.\nFortunately, before spending another twenty years repeating and receiving the same arguments, I was rescued by Scott Turow’s Ultimate Punishment: A Lawyer’s Reflections on Dealing with the Death Penalty. Turow is best known for his legal fiction (it would be crass to lump his work in with the other “legal thrillers”) that frames personal conflict within the complexities and moral ambiguities of the legal system, and his writing resonates with authenticity gleaned from his own practicing legal background. Turow brings the same drama, precision and sincerity to Ultimate Punishment, a factual account of Turow’s experiences with capital punishment, culminating with his service on the Illinois commission that motivated Governor George Ryan to commute the sentences of all death row inmates on his last day in office.\nThe commission’s initial charter was to propose reforms for an obviously-flawed system that found, though appeal after appeal, one-third of death-row inmates eventually undeserving of the death penalty, or occassionally even wrongly-convicted. Similarly, Turow doesn’t dwell much on the moral and philosophical debates. As a criminal law attorney Turow is familiar with perpetrators of horrible crimes who are unlikely to redeem themselves, and he considers the European view, and alarm, about government-held executions less relevant to the United States.\nBut that still leaves plenty of more “pragmatic” but no less problematic issues faced by Turow and the comission — for example the death penalty as a deterrent (it’s not), racial criteria in applying the death penalty (it turns out it’s the victim’s race that seems to be the deciding factor), the need for closure by the victims’ families, the risk facing prison staff and inmates from the irredeemably violent, political momentum to apply the death penalty to an ever-widening group of crimes, and inflamed passions of juries and law enforcement in death penalty trials, sometimes extending to outright misconduct by prosecutors and investigators.\nDespite the serious and in-depth treatment of this subject, the writing is accessible and the book is not dense, just over 160 pages. Turow’s book is though-provoking and enlightening enough that some references to other readings and resources on capital punishment would be appropriate, e.g. its history in other states and in other parts of the world, but that is more a tribute to this book than a fault. The death penalty is a subject worth constant reevaluation, (even my young ultra-conservative friend had second thoughts after seeing exultant demonstrators at an execution) and Ultimate Punishment should be required reading.\n","date":"January 1, 2005","externalUrl":null,"permalink":"/blog/book/reviews/ultimatepunishment/","section":"Blog","summary":"The death penalty, like abortion, is one of those issues that seems to inspire strong opinions in just about everyone, regardless of personal experience or knowledge. Like most people, I consider myself a moderate — I have been uncertain about the morality of capital punishment and haven’t drawn any conclusion (read, done any research) about its effectiveness as a deterrent, but I have been firm in believing that the government should not be in the execution business.\n","title":"Ultimate Punishment","type":"blog"},{"content":"Written May 2004 on Epinions:\nEvery season of Buffy the Vampire Slayer is special to me, but over the series’ seven year run, I’d have to say Buffy the Vampire Slayer — The Complete Second Season is the best (insert debate here), with the most cohesive themes and story arc. Season Two takes off from the first season with a running start, continuing the excellent writing and introducing more demons, more Scooby members, more vampires, and even another slayer (apparently there’s a loophole in the “one chosen per generation” clause).\nOne of the major themes for this season is romantic relationships — junior year in school is typically the year for romance, and so it is with Buffy and her demon-slaying Scooby-gang of pals at Sunnydale High in Season Two. Buffy tentatively explores her relationship with her handsome and brooding vampire-cursed-with-a-soul beau Angel. Her Watcher (basically the vampire slayer version of a gymnastics coach), school-librarian-by-day Rupert Giles, has the most high-schoolish of budding romances with saucy computer science teacher and techno-pagan Jenny Calendar. Geeky gal pal Willow catches the eye of laconic Oz (a new character played by Seth Green with almost no muscle movement), guitarist of the local band Dingoes Ate My Baby. And hapless Xander continues to stumble into surprisingly problematic attractions. Even Buffy’s single mother Joyce is on the dating scene, meeting Mister-almost-Right.\nAnd then there’s the new couple in town, Spike and Drusilla, the Sid and Nancy of the vampire world. Leather-clad head-banging Spike and the demented psychic Drusilla add “a little less ritual and a lot more fun” (School Hard) to the melodramatic nemeses Buffy faced in season one and demonstrate that even soulless demons can have passion for each other, in addition to the built-in sensuality of the vampire bloodlust (note that we only see vampires feeding off those of the opposite sex, and the whole “siring” business adds a hint of incestuousness — Drusilla sired Spike, and it turns out that Angel sired Drusilla. How’s that for a twisted triangle?)\nAnother theme spanning this season is innocence and the loss of. At twenty-two episodes (compared to the twelve episodes in Season One), the Buffy creators have essentially packed two seasons into one. The first twelve episodes showcase the innocence and naivete of our protagonists. Xander falls for an older (much older) woman (Inca Mummy Girl). Joyce is entranced by a too-perfect salesman played with expert creepiness by John Ritter (Ted). Buffy, smarting from older Angel’s for-your-own-good rebuffs, and Cordelia, out of shallow high-school adoration for rich college boys, find themselves out of their depth at a frat party (Reptile Boy), and by the way, also discover the truth behind some fraternity chapters’ boasts about the corporate success of their members.\nThe second half of the season is about the loss of that innocence (starting with the aptly-titled episode Innocence) in which Buffy learns the unduly harsh consequences of taking her relationship with Angel too fast. Oz discovers a wild, uncontrollable side in himself (Phases). Xander attempts to heal heartbreak with magic (Bewitched, Bothered and Bewildered), which regular viewers will know is a reliably bad idea. Giles encounters betrayal and loss of love, and seeks revenge (Passion). And Joyce finally has to face her daughter’s true nature at season’s end. (There’s a coming-out undercurrent — “Have you tried not being a slayer?”)\nThe Scooby gang is forced to grow up a bit in this season and some characters, particularly the men, are more completely developed. Giles’ bad boy past comes back to haunt him, literally (The Dark Age). Xander shows he can make the swim team (Go Fish). Angel, not much more than a mysterious romance novel hero in Season One, becomes a pivotal character in this season, and we are afforded glimpses of Angel’s human and vampire past, along with the path that led him to Sunnydale (Becoming). The actor David Boreanaz gets to show his stuff this time around, ranging from the good, bad, and ugly to a flair for comedy (which would serve him well in the Angel spin-off series), such as a fashion moment at a vampire wannabe party (Lie to Me).\nBut again, the female characters are the most compelling. Buffy’s relationship with her mother feels real — Joyce’s disappointment in her daughter’s school performance but fierce protectiveness and pride in her self-reliance (School Hard), the strain between them when a potential stepdad appears (Ted), and when they have “the talk” after Joyce learns Buffy had her most intimate moment with Angel. “And then he changed,” Joyce says knowingly and sympathetically to her daughter, in the understatement of the year. As in Season One, Buffy faces the most difficult choices, and the season-ender is truly heartrending — Buffy must make a decision cruel even beyond the self-sacrifice to duty she encountered in the first season finale.\nAs with the rest of the show’s production values, Buffy the Vampire Slayer:The Complete Second Season on DVD is a more polished package than the first season DVD set. The embedding of commentary features three menus down is still awkward, but the menu transition sequence with a swooping camera move is slick, and the featurettes on set and monster design are quite interesting.\n","date":"May 1, 2004","externalUrl":null,"permalink":"/blog/tv/buffy/betterbuffy/","section":"Blog","summary":"Written May 2004 on Epinions:\nEvery season of Buffy the Vampire Slayer is special to me, but over the series’ seven year run, I’d have to say Buffy the Vampire Slayer — The Complete Second Season is the best (insert debate here), with the most cohesive themes and story arc. Season Two takes off from the first season with a running start, continuing the excellent writing and introducing more demons, more Scooby members, more vampires, and even another slayer (apparently there’s a loophole in the “one chosen per generation” clause).\n","title":"Mo’ Better Buffy","type":"blog"},{"content":"Written on epinions, May 2004\nBy Buffy the Vampire Slayer — The Complete Third Season, we seem to have a pretty good handle on Buffy and her Scooby gang of pals in their final year at Sunnydale High (and the final year of Sunnydale High). Now the theme for this third year is, as the mayor states in the season-ender commencement speech, change. Personal change — facing the past, considering the what-might-have-been, deciding what kind of people we want to be, and making choices for the future.\nThere is the nostalgic past. Buffy tries to reclaim a bit of her popular-girl glory from her pre-slayer days and take Cordelia down a peg by campaigning for Homecoming Queen (Homecoming). And the entire adult population of Sunnydale enjoys an episode of adolescence (Band Candy) in which Giles’ boyhood “Ripper” persona reappears and, in a role reversal, Buffy tries to keep her gum-chewing boy-crazy Mom out of trouble.\nThen there is the what-if past. What if Buffy had never arrived in Sunnydale (The Wish)? You get Evil Willow — skanky, and “kind of gay” (Doppelgangland). What if Buffy didn’t have a strong mother, reliable friends, a trustworthy Watcher, and Angel’s undying love (when he’s not evil). You get midriff-baring Faith, the new Slayer in town, Watcher-less, “five by five” and fancy-free (Faith, Hope \u0026amp; Trick). Ironically, Faith has only faith in her own physical capabilities. Faith is the id to Buffy’s ego. “Want, take, have” she instructs Buffy on a cashless shopping spree in the weapons, er, hunting portion of a sporting goods store.\nAs for the present, at season’s beginning, Buffy is another teen runaway who can’t face life at home (Anne), but duty calls and reminds her she can’t run from herself. Buffy’s mother Joyce is also still reeling from events at the close of the previous season and struggles with her daughter’s recent coming-out as a vampire slayer (“I marched in the slayer pride parade”, she protests), not to mention her new-found knowledge about the existence of vampires, etc.) It seems the rest of Sunnydale isn’t entirely oblivious to the strange happenings in Sunnydale as Mothers Against the Occult (MOO) whips up a hysterical frenzy (Gingerbread) in a jab at library book censorship, school locker searches, and, oh yeah, the Salem with trials.\nThe Scoobies face decisions for their post-grad years — college, career, and their roles in the fight against evil. Angel has to decide whether he can live with what he’s done (Amends), and whether that life should be with Buffy. Cordelia faces life without lots of money (The Prom). Giles has to choose where his loyalties lie — with his charge or with his employer (Helpless). Xander shows he can play the hero instead of the guy who gets donuts (The Zeppo) and anonymously save the world (quite fitting, considering his comic-book tastes). Willow finds she can be an active player in the fight for good (Choices), not to mention an effective witch. In fact, the entire class of ’98 shows some pride in their unusually low mortality rate and they’re willing to Fight, Fight, Fight! for their school (Graduation Day).\nThis season features the richest set of nemeses yet. Spike makes a brief but memorable return as a pathetic lovelorn loser (Lover’s Walk). And the thousand-year old vengeance demon Anyanka who introduced us to Bizarro World gets to try life as a high school student (“and I’m flunking math” she laments). Mr. Trick introduces some color to the Sunnydale vampire community (Sunnydale is largely of the “Caucasion persuasion”, he notes. And the creepiest part of Sunnydale’s evil mayor is his apple-pie wholesomeness (“drink your milk”).\nBuffy the Vampire Slayer: The Complete Third Season on DVD is released in pretty much the same format as the second season DVD set, minus the fancy menu transitions of the latter but similarly equipped with a few commentaries and some production featurettes. The DVD set also continues the tradition of quirky organization of the special features — the featurettes on wardrobe, weapons and special effects are on the final disc, yet the featurette on Buffy-speak (really, Joss-speak) and the season overview reside on the third disc (why would you want to watch the season overview after watching half the episodes?)\nSurprisingly (to me, anyway), the wardrobe featurette is actually more interesting than the one on weapons. And the explanations of how the special effects crew implemented increasingly ambitious CG effects in the three-week post periods gives me a greater appreciation of the demands of the TV production schedule. That said, the quality of the CG monsters hasn’t quite kept up with the other production values of the show (the big bad at show’s end is pretty cheesy).\nBut the consistent excellent writing, strong themes and continuous story arc make this one of the best Buffy seasons in my opinion (I’ve opined in a separate review that Season Two is the best, so this would be a close second). Nearly all the episodes are memorably original and witty, so I couldn’t even pick a favorite — Band Candy, The Wish, Doppelgangland…. I do have a favorite moment — just a few seconds at the end of Helpless expresses the father-daughter relationship between Giles and Buffy with beautiful economy and no dialog. There is just one episode that leaves me cold, Amends, maybe because there’s a lot of Angel soul-searching, maybe because I generally don’t like ghost stories, but, typically, it lays an important foundation for later seasons.\nThe end of Season Three marks the end of an era (“We survived”, Oz remarks, referring to high school, not the various monsters and apocalypses) and would have made a fitting final season, but fortunately, it’s just intermission.\n","date":"May 1, 2004","externalUrl":null,"permalink":"/blog/tv/buffy/slayerfest98/","section":"Blog","summary":"Written on epinions, May 2004\nBy Buffy the Vampire Slayer — The Complete Third Season, we seem to have a pretty good handle on Buffy and her Scooby gang of pals in their final year at Sunnydale High (and the final year of Sunnydale High). Now the theme for this third year is, as the mayor states in the season-ender commencement speech, change. Personal change — facing the past, considering the what-might-have-been, deciding what kind of people we want to be, and making choices for the future.\n","title":"Slayerfest ‘98","type":"blog"},{"content":"I love movies about LA, ranging from Hollywood stories (The Player), comedies (LA Story), to the gritty noir pics based on Walter Mosely and James Ellroy novels (LA Confidential, Devil in a Blue Dress).\nBut the first and most hard-edged LA “locale” movie I remember seeing back in the eighties (dated by the Wang Chung soundtrack) is William Friedkin’s To Live and Die in LA, featuring a baby-faced William Petersen and John Pankow as secret service agents pursuing a master counterfeiter played by Willem Dafoe, who by the way was creepy back then, too.\nAs in Friedkin’s notable works The French Connection and The Exorcist, the main characters in this film obviously have their demons (well OK, literally in the Exorcist) that push them onto self-destructive paths and into conflict with each other. But even with the fine and nuanced performances supplied by the actors, they seem remote and inaccessible. The more sympathetic characters are the supporting ones, such as the devious yet lively fake money courier played by John Turturro.\nBut LA’ers are known to be cold and superficial (as I’ve heard newly-arrived Midwesterns and Southerners say), so it does feel right, along with the many outdoor shots of not-so-pretty LA where the kidnappings, robberies, pursuits, fights and other mayhem ensues. Although strong themes run thoughout this film — the thin line between enforcing the law and breaking it, ambition and frustration, the circle of people using each other — the highlight of the film is the action. The fights are authentically brutal and messy, the pursuits on foot look exhausting (even more so in the “making of” featurette on the DVD), and the car chase is one of the best ever on film (ranking right up there with the famous one in The French Connection).\nIn the director’s commentary, Friedkin deliberately avoids discussion of much detail or interpretation of the film (which is a bit maddening since the end seems to bring up and leave open a lot of questions), but instead focuses on his philosophy of filmmaking and how he put the film together. The account is far from dry, however, and includes quite a few interesting anecdotes. That thread is continued almost seamlessly into the making-of featurette, which thankfully imparts the history of the film in more of an Actor’s Studio style than a promotional clip.\nIn a nice turnabout from the usual, the alternate ending included on the DVD is the dumbed down version pushed by the studio — that ending is so idiotic, it is a relief to know that for once the director’s cut is the one that made it into the theaters. Also atypical, the deleted scene featured on the DVD is one that was cut entirely at the director’s discretion, and Friedkin admits in all candor in the associated commentary that his deletion was a mistake and he wishes he could reintegrate it back into the film.\nAltogether, it’s a nice, fast trip back to the 80’s, even if Wang Chung is not your cup of tea. The film may feel short, but the DVD bonus features compensate and are well worth viewing.\n","date":"February 1, 2004","externalUrl":null,"permalink":"/blog/film/toliveanddieinla/","section":"Blog","summary":"I love movies about LA, ranging from Hollywood stories (The Player), comedies (LA Story), to the gritty noir pics based on Walter Mosely and James Ellroy novels (LA Confidential, Devil in a Blue Dress).\n","title":"Counterfeiting and Car Chases, LA Style","type":"blog"},{"content":"It’d be an exaggeration to say I’m a fan of Kathy Griffin — I haven’t exactly followed her career and I hated that Suddenly Susan show. But I do find her amusing, especially when she gets in trouble (really, did anyone actually believe Dakota Fanning was in rehab?), and I like that she dated the Woz. His appearance on her reality show about her life on the “D-list” was hilarious — the episode in which Team Griffin got pissed off when the anti-money Woz insisted on giving away t-shirts for free.\nThe Woz connection obligated me to buy her book, especially since it included a chapter of Woz-Griffin emails (and was 25% off at Ralph’s). As a bonus, I found the book breezily entertaining with lot of takes on celebrities, as you might expect. As a double-bonus, Griffin goes into surprising depth about unflattering and uncomfortable aspects of her life, like her body issues (resulting in binge eating and cosmetic surgery that nearly killed her) and a rather dangerous and self-destructive family member. As a triple-bonus, you take away from this book an appreciation of how tough it is to be in show-business, even just to get on the “D-list”. OK, I guess I’m a fan.\n","date":"January 1, 2004","externalUrl":null,"permalink":"/blog/book/reviews/kathygriffin/","section":"Blog","summary":"It’d be an exaggeration to say I’m a fan of Kathy Griffin — I haven’t exactly followed her career and I hated that Suddenly Susan show. But I do find her amusing, especially when she gets in trouble (really, did anyone actually believe Dakota Fanning was in rehab?), and I like that she dated the Woz. His appearance on her reality show about her life on the “D-list” was hilarious — the episode in which Team Griffin got pissed off when the anti-money Woz insisted on giving away t-shirts for free.\n","title":"A Memoir According to Kathy Griffin","type":"blog"},{"content":"","date":"January 1, 2004","externalUrl":null,"permalink":"/tags/ai/","section":"Tags","summary":"","title":"AI","type":"tags"},{"content":"I’ve never been a particularly good chess player — when I played on my high school chess team, my rating peaked at just above 1700, which is, well, decent. But ever since I played and lost to my first chess computer, I’ve aspired to writing a great chess program.\nI never got around to it, only writing a series of Othello programs on various platforms, but the dream is still there. So I’m quite taken with Feng-Hsiung Hsu’s twelve-year quest to build a chess computer capable of beating the world chess champion.\nThere are really two major contests in this autobiographical account — the well-publicized final match between Deep Blue and world champion chess grandmaster Garry Kasparov, and the early political tension between the original Deep Thought team at Carnegie-Mellon University and the more established computer chess group led by Hans Berliner at the same institution.\nHsu’s irritation with these two major rivals comes through clearly, but he does attempt to at least sound understanding of their respective positions. The emotional level of disagreement and surprisingly petty behavior (during and after the match, Kasparov insinuated that the Deep Blue team cheated) highlight the fact that this was not just a game to Kasparov and not just an academic exercise to the CMU researchers. All the participants had the pride and work of a lifetime at stake, no less than that of athletes seeking a championship ring or Olympic medal.\nChess and technology enthusiasts should find the level of computer hardware and chess detail interesting, although others may find it tedious. Hsu fails to provide any substantial discussion of other computer chess research, which could lead the reader into thinking all the interesting developments occurred during Deep Thought/Deep Blue’s development, when in fact, computer chess has been a rich topic for decades. For example, one surprising omission — International Master David Levy defeated Deep Thought in an early game, but Hsu doesn’t note that Levy is a well-known computer chess authority and would know how to exploit typical weaknesses of chess programs as well as anyone.\nConsidering he’s not a native English speaker, Hsu’s writing is passable, and his vocabulary is impressive, although the style is somewhat stilted. There is at least one misspelling/typo (the Sports Illustrated “swim suite” edition), but the most distracting aspect of the writing is structural — Hsu recounts some events out of sequence, referring to them back and forth, so I felt a little bit like the time warping traveller in Slaughterhouse Five. For example, Hsu recounts a 1995 international computer chess tournament in Hong Kong before discussing a 1994 tournament in the next chapter.\nCompounding this confusion is the succession of names for the various incarnations of the hardware — Deep Thought, Deep Thought II, Deep Blue, Deep Blue Prototype, Deep Blue Jr. It’s hard to remember the differences between them (it’s still not clear to me how Deep Blue Jr. is different from Deep Blue, aside from being “scaled down”), and I had to flip back the pages a few times to keep track of which version of the hardware was playing at what tournament and when against whom.\nThe naming issue does provide the most humorous anecdote in this tale — when the project was adopted by IBM, corporate insisted on changing the name from Deep Thought, largely because of the trademark issue (Deep Thought was named after the unhelpful computer in Douglas Adam’s Hitchhiker’s Guide to the Galaxy), but also because a surprising number of people, including a nun, kept referring to the computer as Deep Throat.\nIn an attempt to explain his ambition and tendency to bump heads, Hsu intersperses his narrative with some background on his early school years in Taiwan, required service in the Taiwanese army, and his activities at Carnegie-Mellon, but it’s really unnecessary. His personal style comes through loud and clear throughout the rest of the story and there’s no need to explain — some people just have the combination of talent and contrariness to create something like Deep Blue, and in this case, the world had the fortune to watch Hsu and Deep Blue bump heads with a no less intense personality, Garry Kasparov.\n","date":"January 1, 2004","externalUrl":null,"permalink":"/blog/book/reviews/deepblue/","section":"Blog","summary":"I’ve never been a particularly good chess player — when I played on my high school chess team, my rating peaked at just above 1700, which is, well, decent. But ever since I played and lost to my first chess computer, I’ve aspired to writing a great chess program.\n","title":"Behind Deep Blue: Building the Computer that Defeated the World Chess Champion","type":"blog"},{"content":"","date":"January 1, 2004","externalUrl":null,"permalink":"/tags/bruce-campbell/","section":"Tags","summary":"","title":"Bruce Campbell","type":"tags"},{"content":"It’s not easy spreading the Word of Buffy. I tell people that my favorite TV show is Buffy the Vampire Slayerbecause of the excellent writing (the creator, Joss Whedon, also wrote Toy Story), but women in particular tend to give me a knowing look as if I’d just said I read Playboy for the articles.\nSometimes my outreach is rewarded. What was almost a secret society of Buffy fans has been growing, and over the years I’ve had Tuesday-night Buffy dinners with coworkers, worked for a project manager who watched Buffy with his family (if you asked his young daughter what’s the best show on TV, she’d yell “Buffy!”), met Buffy admirers on business trips, and recently my sister became a Buffy addict during the series’ final season. And she used to be one of the skeptics.\nBuffy the Vampire Slayer — Season One is relatively short, only twelve episodes, and it lacks the strong story arc of the later seasons. But each episode, peppered with with witty dialogue and pop-culture Whedonisms (“I can’t believe you of all people are trying to Scully me”), invests in the development of the ensemble cast and plays authentic teenage themes, sometimes comically, sometimes movingly, against the bizarre backdrop of high-schoolers battling the forces of evil.\nBuffy’s struggle with the unfairness of her destiny is a constant theme. The two-part pilot (Welcome to the Hellmouth and The Harvest) opens with Buffy’s arrival in the Southern California town of Sunnydale, eager to start with the “clean slate” that Principal Flutie of Sunnydale High offers Buffy after her expulsion from her previous high school (for burning down the gymnasium, the result of her climactic battle with vampires there — it was a thing, as Joss Whedon would say).\nBuffy’s optimism is short-lived, as she discovers the school librarian, a stuffy Brit named Rupert Giles (played by Anthony Stuart Head, once upon a time the romantic interest in the coffee commercial), is her new Watcher, assigned by the Watchers Council in England to train and guide her, and he informs Buffy that Sunnydale sits atop the Hellmouth, a hotbed of mystical evil complete with an imprisoned uber-vampire called The Master. But she valiantly attempts to live a normal high school life, dating (Never Kill a Boy on the First Date), cheerleading (Witch), and going to the spring dance (Prophecy Girl).\nBuffy does have some assistance besides Giles — her “Scooby gang” of friends who inadvertantly learn of her dual life (“Is there anyone in this town who doesn’t know I’m the slayer?”) and a mysterious tall-dark-and-handsome named Angel. The Scooby members, initially wise-cracking but socially unaccomplished Xander, and meek and mousy Willow, keep Buffy grounded in everyday high-school life but they have their own issues, too. Xander is exposed to the perils of sex peer-pressure and student-teacher romance in Teacher’s Pet and exposes teen-testosterone cruelty and the barbarity of dodgeball in The Pack. Willow shows off her geek skills and experiences her bad turn at romance, the on-line variety, in I Robot…You Jane. The club gains a few unlikely members over the season. Cordelia, the shallow Queen of Mean, disdains the Scoobies as social lepers but is rescued by them more than once. Ms. Calendar, the computer science teacher, turns out to be a “techno-pagan” who scans for the occult over the Internet.\nAlthough Xander is Whedon’s proxy character (we could have guessed even if Whedon didn’t tell us in the commentary), and Giles and Angel play fatherly and romantic-interest roles, respectively, it is the female characters that display the most complexity. While all the actors fill their roles capably, Alyson Hannigan (a quite different nerd in American Pie) is the strongest performer, playing cute, smart and vulnerable — evoking a tug of the heart with a mere look every time her long-time pal Xander unknowingly knowingly injures her. Kristine Sutherland convincingly portrays Buffy’s mother Joyce Summers, trying to start anew as a divorcee and single parent of a teenage daughter who always seems to get in trouble. Her relationship with Buffy is rich with caring and irony (“If you don’t go out it’s the end of the world” she says tiredly to Buffy without realizing the literal truth of her words). Even Cordelia, played by the gorgeous Charisma Carpenter (interestingly, she originally auditioned for Buffy while Sarah Michelle Gellar was cast as Cordelia — can you imagine the reverse casting?), reveals there is depth beneath her shallowness, but her shallowness is delightful (she’s embarrassed that her mother is diagnosed with a disorder so unfashionable as Epstein-Barr).\nYou miss any Buffy episode at your own risk — chances are, there will be some reference to it later, and supporting characters often come back to play major roles. If there’s one episode in Season One that’s dispensable, it’s Nightmares, which shows the teen’s various insecurities come to life, ranging from the shallow (Cordelia’s bad hair day), to the serious (Buffy’s feelings about her parents’ divorce). Some episodes are not critical to following the Buffy epic but are among my favorite just because of the humor and clever premises: The Puppet Show guest stars a horny old ventriloquist dummy and introduces Arman Shimerman (of Star Trek Ferengi fame) as the enjoyably weasely new principal who drafts the Scooby gang into the school talentless competition. Out of Sight, Out of Mind answers the zen question if no one notices you in class, do you really exist?\nOne thing that doesn’t quite ring true (once you get around the demon thing) is the ethnic blandness of Sunnydale, on par with Friends, Seinfeld and Woody Allen movies, not to mention the WB teen shows that have followed. But this is slightly mitigated in later seasons, and the show is still a far cry from 90210.\nThe DVD menu organization leaves something to be desired. The main menu on each disc shows the titles of four episodes arranged as a rectangle, so the desired viewing order is not clear (it’s left to right, top to bottom). The special features should be accessible from the main menu but instead are listed in each episode’s submenus. This causes a few annoying problems — the “Interview with Joss Whedon” that is listed in more than one episode is just the one interview, while the commentaries, although distinct, once selected “stick” so that proceeding on to another episode that has a commentary will automatically play that commentary, and there is no obvious way to turn it off. So I recommend watching the series all the way through before trying the extras.\n","date":"January 1, 2004","externalUrl":null,"permalink":"/blog/tv/buffy/buffynotjustforboys/","section":"Blog","summary":"It’s not easy spreading the Word of Buffy. I tell people that my favorite TV show is Buffy the Vampire Slayerbecause of the excellent writing (the creator, Joss Whedon, also wrote Toy Story), but women in particular tend to give me a knowing look as if I’d just said I read Playboy for the articles.\n","title":"Buffy: Not Just for Boys","type":"blog"},{"content":"Last week, I checked out the local Dave and Buster’s (it’s a happening place on Friday night, like Chuck E Cheese with a bar), and I was reminded of the Epinions meet ‘n greet they held at the Irvine Spectrum Dave and Buster’s oh so long ago, when Epinions was cool and before they were bought by shopping.com (which was later bought by eBay).\nAlong with BBQ wings, some books were handed out at that shindig, including Paul Clayton’s self-published Carl Melcher Goes to Vietnam (I heard he got a publishing deal, but I haven’t seen any other edition of the book). In truth, I made a few abortive attempts at starting the book, but the first-person narrative by young draftee Carl Melcher begins slowly — the tone of the first chapter describing Carl’s transport to Vietnam for his tour of duty seems sterile and his travelling companions uninteresting and somewhat unlikable.\nIn the context of the whole book, I think it works. The autobiographical feel of the book is strengthened by the understated narrative. Carl is not a poet or activist or John Wayne. Carl is the Everyman soldier who’s in Vietnam because he doesn’t feel he has a choice. Yet when he arrives, the experience is almost a disappointment. It’s almost like a trip to summer camp, bunking for a few months with some new buddies, and despite the helicopters and bombing runs and mortar fire and wounded and dead, contact with the enemy is so infrequent that Carl develops a half-serious theory that the whole thing is an elaborate hoax.\nThere are casualties among Carl’s friends, much of it self-inflicted by “Keystone Cops” bungling, but Carl’s fatalistic go-with-the-flow attitude seems to be working — he even falls for a local girl (and I mean girl — she’s just a teenager, which seems a bit shocking until you realize so is Carl) and plans on prolonging his stay in Vietnam to be with her. There’s even a bit of Catch-22 bureaucratic fumbling with his personnel file, so it seems like there might be a happy ending in store for Carl.\nBut this is not a story, it’s real life and real war, and in particular it’s the Vietnam War where politicians posture at peace talks while soldiers try to survive their tours of duty despite themselves, an unpredictably hostile populace and an often faceless enemy. Carl survives, but his friends don’t. He returns home as if awakening from a bad dream, but as the book leaves off, it seems it’s not a dream that he can shake.\nThis may seem like a pointless ending to the story, but that’s the point. Carl Melcher Goes to Vietnam may lack the morality implications of Platoon, the existentialism of Apocalypse Now or the detailed battle intensity of We Were Soldiers, but it feels real enough that I’d like to know how much of it stems from the author’s experience.\n","date":"January 1, 2004","externalUrl":null,"permalink":"/blog/book/reviews/carlmelcher/","section":"Blog","summary":"Last week, I checked out the local Dave and Buster’s (it’s a happening place on Friday night, like Chuck E Cheese with a bar), and I was reminded of the Epinions meet ‘n greet they held at the Irvine Spectrum Dave and Buster’s oh so long ago, when Epinions was cool and before they were bought by shopping.com (which was later bought by eBay).\n","title":"Carl Melcher Goes to Vietnam","type":"blog"},{"content":"I’ve been to the Armand Hammer museum and SF MOMA a few times, but for the most part, modern art leaves me cold.\nSo when I found the first fifty pages of Brad Stone’s Gearheads: The Turbulent Rise of Robotic Sports devoted to Mark Pauline’s exhibitions of large robots wreaking havoc in the name of performance art, I expected the worst. But to my relief, the book moves on to the real action, starting with the Denver Mad Scientists Club, who organized small-scale robot battles for fun at their sci-fi meetings, and ex-ILM engineer Marc Thorpe’s commercialization of the “sport”, with his venture Robot Wars.\nIn the early Robot Wars competitions, after enduring the sometimes artsy preliminary exhibitions, spectators were rewarded with real metal-grinding, suspense-filled entertainment, and so it is with Mr. Stone’s book. The blow-by-blow accounts of the battles in Robot Wars and its eventual competitors, Battlebots, Robotica and the BBC version of Robot Wars, are vivid and mesmerizing — I can almost see La Machine attempting to ram the whirling dervish, Blender, only to be repelled across the arena, leaving a trail of body, er…machine, parts….\nDespite criticism of the violent, albeit machine-on-machine, nature of these spectacles, the robot battles were civilized compared to the legal battles that took place concurrently in the “real” world. Thorpe’s long-running struggle for control over Robot Wars with the litigious Steve Plotnicki of Profile Records set the stage for the birth of Battlebots, probably better known in the US due to it’s presentation on the cable channel Comedy Central. In the meantime, Robot Wars as presented by the BBC has became an even bigger cult phenomenon in the UK.\nThe boys-and-their-toys aura of the robot battlers and the campy presentation of Battlebots on US television (Playboy centerfolds making sexual innuendoes with nerds) belies the passion behind robot battles. Trey Roski, heir to the Majestic Realty empire in Los Angeles, started Battlebots primarily as a means to continue his avocation while Robot Wars was hung up in court and risked litigation himself despite his father’s business advice. Marc Thorpe created Robot Wars with the intent of securing his financial future, particularly with respect to his case of Parkinson’s disease. But his stubborn refusal to give up creative control over his creation and the ensuing litigation left him with mounting bills, worsening health, and a failed marriage.\nBesides the somewhat tenuous connection to Mark Pauline’s SRL performances, the list of participants in the robot battles read’s like a Who’s Who of the hip tech world, for example Will Wright, already a legendary computer game designer (recently, the Sims) when he began participating in Robot Wars, and the founder of Lycos who now has the leisure time and financial resources to build combat robots as a new hobby.\nAs bonus rounds, Mr. Stone provides a welcome treatment near the end of the book to another two engineering visionairies not directly associated with the commercial robot battles but were influential, nonetheless — Woody Flowers, the colorful professor who presided over the longstanding mechanical engineering student competition that is pretty much MIT’s version of the Superbowl, and Dean Kamen, inventor of the Segue human transportation device, who similarly promoted engineering values among high school students with a cooperative competition called FIRST.\nInterestingly, although many robot battle enthusiasts found inspiration from Woody Flowers’ and Dean Kamen’s work, the latter two do not return the favor — they disdain the violent nature of robot combat. However, everyone involved shares the common goal of elevating the status of engineering to that of sports. Given the obsession of Thorpe, Roski, and all those who gave up their day jobs to build the ultimate robot warriors, it’s not just a sport, but a way of life. It’s a movement. It’s art (witness the robot Andyroid, with a freakish Big-Boy like figure wheeling around). And it’s machines beating the crap out of each other. Get me a beer. Hoorah!\n","date":"January 1, 2004","externalUrl":null,"permalink":"/blog/book/reviews/gearheads/","section":"Blog","summary":"I’ve been to the Armand Hammer museum and SF MOMA a few times, but for the most part, modern art leaves me cold.\nSo when I found the first fifty pages of Brad Stone’s Gearheads: The Turbulent Rise of Robotic Sports devoted to Mark Pauline’s exhibitions of large robots wreaking havoc in the name of performance art, I expected the worst. But to my relief, the book moves on to the real action, starting with the Denver Mad Scientists Club, who organized small-scale robot battles for fun at their sci-fi meetings, and ex-ILM engineer Marc Thorpe’s commercialization of the “sport”, with his venture Robot Wars.\n","title":"Gearheads: The Turbulent Rise of Robotic Sport","type":"blog"},{"content":"Bruce Campbell’s self-deprecating wit pervades his memoir, self-deprecatingly and wittily titled If Chins Could Kill: Confessions of a B Movie Actor.\nNonetheless, his unself-pitying account of the toll his career took on his marriage and finances, not to mention days caked in syrup (fake blood) and freezing nights in decrepit cabins, shows how tough it is to make a go of it in Hollywood.\nBut with a career that includes the Evil Dead movies, the TV series Brisco County, Jr., appearances on Homicide: Life on the Street and Xena: Warrior Princess and friends like the Raimis and the Cohen brothers, he’s got plenty to be proud of. And it was good to see him on Burn Notice. Groovy!\n","date":"January 1, 2004","externalUrl":null,"permalink":"/blog/book/reviews/ifchinscouldkill/","section":"Blog","summary":"Bruce Campbell’s self-deprecating wit pervades his memoir, self-deprecatingly and wittily titled If Chins Could Kill: Confessions of a B Movie Actor.\nNonetheless, his unself-pitying account of the toll his career took on his marriage and finances, not to mention days caked in syrup (fake blood) and freezing nights in decrepit cabins, shows how tough it is to make a go of it in Hollywood.\n","title":"If Chins Could Kill: Confessions of a B Movie Actor","type":"blog"},{"content":"Written on epinions, Dec. 2003. Since then, there’s been the movie Serenity, but still, nothing more on the Black Sun Corporation. Also, this set is available now in Blue-Ray.\nJoss Whedon’s television series, notable for their lengthy story arcs, unexpected plot turns, and engaging, yet subtly complex characters, constitute perfect material for DVD season box sets. But unlike his earlier creations, Buffy the Vampire Slayer and its spin-off Angel, Whedon’s sci-fi drama Firefly lasted only one season, and even then was presented in a somewhat mangled fashion.\nSo the DVD box set Firefly — The Complete Series provides a welcome, but bittersweet, opportunity to see these episodes as originally intended. I have to admit, I didn’t take to Firefly immediately when it aired, and I felt (guiltily) that I had missed some crucial episodes. But it turns out that the network didn’t like the original pilot, so it was aired as the last episode, and three episodes were never aired. Once viewed in the proper sequence and original widescreen presentation, Whedon’s vision of a post Civil War galactic “Alliance” empire featuring Western-style “outer colonies” imbued with Asian influences (implying that American and Chinese cultures dominate the future) is intriguing, if not quite compelling. It is distracting and confusing that 1) the Chinese is spoken badly and mostly in the context of swearing, and 2) where are all the Chinese people?\nThe real draw in this series is the misfit crew of the Firefly, and no one is more misfit than the mystery girl River, who seemingly has psychic abilities literally and cruelly sculpted into her brain. Was she intended as a weapon, does she pose a danger to the crew, and who exactly is chasing her? Another mystery is the preacher, a genuinely religous and contemplative man, but why is he so good with a gun, and why does his ID give him special dispensation with the Alliance?\nSome of the other characters seem more like open books, but they contribute complexity in their relationships. Tough, jaded, veteran of the civil war captain Mal Reynolds makes hard cold decisions, yet his sentimentality and loyalty to crew and ship are obvious. The mutual feeling and barrier between Reynolds and Inara, the (high-class prostitute) Guild member is alternatingly amusing and painful to watch. Girlish and gifted mechanic Cayley is no less touching in her genuineness and her crush on the doctor, who despite his silver spoon upbringing managed to rescue his sister River and displays a penchant for plotting grand theft. Brutish and not-too-bright Jayne is motivated by greed and physical needs, but even he is surprised to find himself a hero. Wash the pilot seems to be all wisecrack and no macho, but somehow he’s married to the Amazonian war buddy of the captain.\nThe final DVD in the set includes a “Making of” piece and a treatment of the design and construction of the ship, Serenity, which was constructed in entirety on-set. The bonus features lack some of the usual tidbits, like a cast bio and scripts. These omissions are not terribly important, but it would have been interesting to note that Ron Glass, who plays the preacher, played Detective Harris in Barney Miller (I thought that voice sounded familiar), or review Adam Baldwin’s past roles for anything that utilized him as effectively as Jayne.\nThe content of the commentaries, easy to miss as the option is located in the Language Selection menu, range from slightly adolescent, though entertaining, banter among Whedon and actors Nathan Fillion and Alan Tudyk (“Train Robbery” and “War Stories”, to interesting notes by the writers and costumer designer (“Shindig”), to an intensive explanation bordering on philosophical analysis by Whedon (“Objects in Space”). All the commentaries bring out the camaraderie of the cast, their feeling that Firefly was a unique creative vision and collection of talent, and their frank disappointment at the show’s cancellation.\nEspecially poignant is Tudyk’s recollection that he confiscated the red button from the episode “Out of Gas” and gave it to Whedon to keep in his office. In the episode, the button was to be pressed by Mal to signal the Firefly crew, adrift in the shuttles, that he had successfully revived the stricken ship and they could return. Hopefully, Whedon can one day press that button and Firefly will take off again. And then I can find out what the cannibalistic Reavers look like and what the mysterious Black Sun Corporation is really up to….\n","date":"January 1, 2004","externalUrl":null,"permalink":"/blog/tv/scifi/firefly/","section":"Blog","summary":"Written on epinions, Dec. 2003. Since then, there’s been the movie Serenity, but still, nothing more on the Black Sun Corporation. Also, this set is available now in Blue-Ray.\nJoss Whedon’s television series, notable for their lengthy story arcs, unexpected plot turns, and engaging, yet subtly complex characters, constitute perfect material for DVD season box sets. But unlike his earlier creations, Buffy the Vampire Slayer and its spin-off Angel, Whedon’s sci-fi drama Firefly lasted only one season, and even then was presented in a somewhat mangled fashion.\n","title":"Joss Whedon’s Firefly Burned Briefly but Brightly","type":"blog"},{"content":"Hewlett and Packard. Jobs and Wozniak. Gates and Ballmer. High-tech success stories often revolve around a notable duo, and in the computer game industry, there is no more better-known story than that of id Software, creator of the Doom and Quake series of first-person shooters, and id’s original two principals, John Carmack and John Romero.\nIn Masters of Doom: The True Story of How Two Guys Created a Video Game Empire, Transformed Pop Culture, and Unleashed Doom, David Kushner chronicles the rise and pitfalls of the Two John’s, starting from their disturbingly dysfunctional childhoods to the pinnacle of their Ferrari-buying and Playboy-centerfold dating days. Carmack is considered by many to be the best game programmer around and perhaps the best programmer, period. Romero, perhaps best remembered for his hubris-filled pronouncements to gamers, was considered a game design god by rabid game fans, before he was ousted from id and foundered at his next game venture, Ion Storm.\nKushner’s history of id mirrors the development of the PC game industry. id brought console-quality game performance to the PC, pioneered 3D graphics in games, popularized the first-person shooting genre, encouraged “modding” (customization of the game, to the extent of creating new levels and characters) and was at the center of the still-ongoing controversy over violence in games.\nAfter reading Kushner’s description of Carmack’s childhood isolation and run-ins with the law, and Romero’s abusive treatment at the hands of his stepfather, it seems that violence in video games is the result of youth violence rather than the cause. The success of the two in transcending their unhappy upbringing is gratifying, but the feeling is tempered by their immature and sometimes amoral behavior on their way up. Kushner’s depiction of id’s rowdy atmosphere, extended crunch times and political infighting brings to mind a combination of Revenge of the Nerds, Animal House and Lord of the Flies.\nIrony abounds in this story. Romero, the visionary who first understood the implications of Carmack’s innovations and persuaded Carmack and their team members at SoftDisk to jump ship and start id, had ambitious plans for turning id into a vast gaming empire, but it was Carmack the introverted and ascetic programmer who ended up controlling the direction of the company. Just as the id group had abrubtly abandoned SoftDisk, so did Romero’s team at Ion Storm walk out on him. And while the split between Carmack and Romero was partly fueled by their technology-centric versus design-centric debate, eventually Romero turned to developing games on technologically constrained cell phones and PDA’s, while Carmack’s ultimate goal of approximating a Star Trek holodeck experience was stymied by his game designers.\nAs with many successful game titles, Kushner’s work is thoroughly entertaining, but not without some minor distracting glitches. Some of the technical history is not quite right, e.g. Carmack did not convert Quake 2 to run on the OpenGL graphics library so that it would run on graphics cards from 3dfx, as the book states. On the contrary, 3dfx had inadequate OpenGL support at the time, so Carmack implemented a subset of OpenGL called “QuakeGL” for 3dfx in order to get the game running on that hardware. This effort and his strongly-state preference for OpenGL over other graphics libraries at the time attests to Carmack’s programming prowess and also his sense of hacker purity, which the author does convey clearly.\nThe reader might not obtain a correct sense of proportion from this book. The “video game” business really encompasses arcades, PC games and console games. id is primarily in the PC game business with incidental ports to the console business, and the PC game business, while influential, is currently dwarfed by the console business. Other first-person shooters come off as imitations of Doom and Quake, but many of them were innovative in their own right. For example, Descent featured a floating ship with lateral and vertical 360 degree movement, and I would argue that Marathon, which was released just a year after Doom, was a more interesting game than Doom but limited by it’s Macintosh-only status.\nThere is a printing error resulting in at least one missing line, and some of the grammar is a bit loose, which detracts from the flow of this otherwise absorbing read. But as game reviewers often note, the game play is what counts, and this book plays well from beginning to end.\n","date":"January 1, 2004","externalUrl":null,"permalink":"/blog/book/reviews/mastersofdoom/","section":"Blog","summary":"Hewlett and Packard. Jobs and Wozniak. Gates and Ballmer. High-tech success stories often revolve around a notable duo, and in the computer game industry, there is no more better-known story than that of id Software, creator of the Doom and Quake series of first-person shooters, and id’s original two principals, John Carmack and John Romero.\n","title":"Masters of Doom","type":"blog"},{"content":"Stephen King isn’t one of my favorite writers — I actually like the TV and film adaptations of his work better. But I really enjoyed him writing about writing in his book On Writing. And talking about writing with George Martin.\n","date":"January 1, 2004","externalUrl":null,"permalink":"/blog/book/reviews/onwriting/","section":"Blog","summary":"Stephen King isn’t one of my favorite writers — I actually like the TV and film adaptations of his work better. But I really enjoyed him writing about writing in his book On Writing. And talking about writing with George Martin.\n","title":"On Writing","type":"blog"},{"content":"","date":"January 1, 2004","externalUrl":null,"permalink":"/tags/robot/","section":"Tags","summary":"","title":"Robot","type":"tags"},{"content":"This book made me laugh, it made me cry. And it made me join Epinions.\nThe crying (just a manly tear) was inspired by the story of Hachiko, the famed Japanese dog who waited loyally every day for his owner to arrive at the train station from work, long after the owner had died at work and failed to return. After Hachiko passed away, still waiting for his master at the station, a statue was placed there in his honor.\nWhat does this have to do with “the next social revolution”? Well, nothing, but it is one of the early backdrops in Howard Rheingold’s book, where he notices the profound integration of wireless communication, in particular the vastly popular i-mode service from NTT Docomo, into the lifestyle of Japanese teenagers.\nFrom there, the author jets around the world, observing Scandinavian text-messagers, MIT geeks wearing computers (this is the part where I laughed), wi-fi activism, and self-moderating peer-review communities like Epinions, eBay and Slashdot.\nThe title “Smart Mobs” aptly describes the mass demonstration orchestrated by cell phone and pager that resulted in the downfall of a presidency in the Philippines. It seems a stretch to cast the same label on the book’s other elements, which are rather loosely connected by the element of, well, being wired (and in some cases, wired wirelessly, so to speak).\nIn fact, reading this book is somewhat like reading two year’s issues of Wired magazine. After turning the last page, I have the reader’s equivalent of an ice-cream headache. Mr. Rheingold writes in a first-person travelogue style interspersed with musings, but the tasty treat here is the pure breadth of topics, ranging from the enabling technologies to the behavior of the sociological groups and the philosophical, legal and mathematical implications of it all.\nConsequently, as you read this book, you’ll find yourself bouncing in a web-surfing manner from the congregating habits of short-attention-span teenagers to the state of the cell phone industry in the U.S. versus Japan/Europe to game theory to internet-based peer-reviewing/self-moderating communities to Lawrence Lessig’s work on the Internet as a commons for the public good to the frequency-hopping technology invented by Hedy Lamarr and government policy on allocating spectrum.\nDon’t expect any in-depth explanation and don’t take anything at face-value in this enthusiastic and breathless rush through the wired present and potential future. For example, the author repeats the marketing-invented tidbit that eBay was created to provide a way to auction Pez dispensers on-line. And while i-mode has been a spectacular success, both wireless internet and wireless games have had a tough go both in the US and in Europe.\nBut this book is a great starting point for any topic you find interesting, and there’s bound to be something to interest you. For example, I’ve googled onto Epinions before, and as a programmer I’ve glanced at Slashdot, but only after reading this book have I taken a closer look. Now I’ve tried my hand at a few reviews for Epinions, and I’m comparing the peer-rating and community moderation systems at various open-source sites like Slashdot and Advogato. After I read up on game theory and Lessig’s treatises, maybe I’ll take a trip to Japan and visit the statue of Hachiko.\n","date":"January 1, 2004","externalUrl":null,"permalink":"/blog/book/reviews/smartmobs/","section":"Blog","summary":"This book made me laugh, it made me cry. And it made me join Epinions.\nThe crying (just a manly tear) was inspired by the story of Hachiko, the famed Japanese dog who waited loyally every day for his owner to arrive at the train station from work, long after the owner had died at work and failed to return. After Hachiko passed away, still waiting for his master at the station, a statue was placed there in his honor.\n","title":"Smart Mobs","type":"blog"},{"content":"As a career programmer, and on whimsical occasion an aspiring author, I’ve always thought that programming is more like writing. Aside from the obvious parallels in entering text and following syntax and grammar rules, good code is expressive, succinct and has style. And I have speculated that the organizational and structural challenges in developing large, complex programs are analogous to those posed by novel writing.\nNow I feel validated after reading Terry Brook’s account of his creative process in Sometimes the Magic Works: Lessons from a Writing Life. In spite of the reference to magic in the title, Brooks discourages the aspiring novelist from simply brainstorming some ideas and jumping into writing mode. Instead, he urges the writer to structure the work with an outline beforehand, paying particular attention to creating an incisive beginning and compelling end to the story.\nAs an exercise, he takes the reader through a sample story creation, explaining efficient and unobstrusive character development, noting subtleties such as the choice of character and place names. (The sample story features the protagonist Maud Manx and nemesis Feral Finch in a town called Octegenarian, Montana. OK, it’s not that subtle.)\nIn a novel-like fashion, Mr. Brooks frames this book with a relaxed yet compelling account of his writing life. His literary parents, childhood role-playing and early attempts at writing would seem to foretell of his eventual success, but he credits much of that to serendipity. Nearly thirty years ago, he happened to submit the right manuscript (The Sword of Shannara) to the right editor (Lester Del Rey) at the right time. (Del Rey wanted to prove that science fantasy was a viable genre)\nMr. Brook’s longstanding good relationships with his editors and publishers apparently limits the type of advice he can dispense — there are no examples of how to deal with difficult editors or even how to find a good agent. (He didn’t use an agent until negotiations on the novelization of Star Wars: The Phantom Menace) But his honest retelling of difficult choices (abandoning his law career, starting over on a novel after writing 400 pages) reinforce his warnings and encouragement to those who feel they have the “magic”. And his experience with Hollywood (besides The Phantom Menace, he authored the book version of Hook) is downright hilarious.\nI’m not a science fantasy reader and therefore I haven’t followed Mr. Brook’s bread-and-butter work. But his self-deprecating and easygoing style is delightful enough for me to consider reading his novels. (Even the Phantom Menace novelization. Maybe it’s better than the movie.)\n","date":"January 1, 2004","externalUrl":null,"permalink":"/blog/book/reviews/themagicworks/","section":"Blog","summary":"As a career programmer, and on whimsical occasion an aspiring author, I’ve always thought that programming is more like writing. Aside from the obvious parallels in entering text and following syntax and grammar rules, good code is expressive, succinct and has style. And I have speculated that the organizational and structural challenges in developing large, complex programs are analogous to those posed by novel writing.\n","title":"Sometimes the Magic Works","type":"blog"},{"content":"After countless hours of sitting in front of the TV and exclaiming, “I could write better dialogue than that!”, reading J. Michael straczynski’s The Complete Book of Scriptwriting has given me a better handle on the pragmatics of scriptwriting — the differences between TV and script formats, don’t submit entire unsolicited scripts (it won’t be opened for legal reasons), film pays better than television, and the importance of joining the WGA and getting an agent.\nStraczynski doesn’t provide any convenient formulas for scriptwriting, but he does give some useful common-sense tips. Sound out the dialogue as you write — it might look great on paper but turn into a tongue-twister for the actor. Research your genre (in the case of TV, familiarize yourself with the series you want to write for). Start with an outline. Don’t set the pace too slow and thus lose the audience in the beginning.\nThis book is oriented largely toward television and film scriptwriting (the author was the creator of Babylon 5 and producer/writer on Murder She Wrote — I can’t wait to see the crossover episode). It begins with a history of the television and film industry that explains some of the current technological and business constraints that screen writers face, and ends with a sample episode script from Babylon 5.\nBut the author does include some treatment of playwriting and script writing for radio dramas and animation features. The latter is somewhat related to video game script writing — dialogue for animated characters must not rely on distinct “acting” such as gestures or facial movements. With the increasing number of video games produced with movie-like production values (some of them tied into actual movies), I hope Straczynski will some day update this book with a chapter covering game script writing.\n","date":"January 1, 2004","externalUrl":null,"permalink":"/blog/book/reviews/completebookofscriptwriting/","section":"Blog","summary":"After countless hours of sitting in front of the TV and exclaiming, “I could write better dialogue than that!”, reading J. Michael straczynski’s The Complete Book of Scriptwriting has given me a better handle on the pragmatics of scriptwriting — the differences between TV and script formats, don’t submit entire unsolicited scripts (it won’t be opened for legal reasons), film pays better than television, and the importance of joining the WGA and getting an agent.\n","title":"The Complete Book of Scriptwriting","type":"blog"},{"content":"I suspect when Richard Preston started writing The Demon in the Freezer, he intended the book to be entirely about smallpox — it’s eradication and potential resurrection, either by accident, warfare or terrorism. But after the anthrax-laced postal mailings that occurred shortly after the 9/11 attacks, the author felt compelled to merge the anthrax investigation into his work-in-progress.\nIt’s just a theory, but that would explain the book’s split personality. Although the back cover of this paperback edition only mentions the fight against smallpox, the account begins with the initial anthrax attacks, then flashes back more than twenty years to the smallpox eradication program. The history of the eradication and subsequent debate and research on smallpox occupy the remainder of the book until the end, when the two diseases/bioweapons are linked — the anthrax investigators worry about whether the anthrax mailings might contain smallpox, too. If so, it would have been a far deadlier and catastrophic event.\nThis “in the end, all shall be made clear” progression smacks of a good detective story, and indeed the author provides most of the gripping elements of a good mystery — the various protagonists track smallpox outbreaks, investigate suspected bioweapons research facilities in Russia, attempt to recreate smallpox in lab animals and of course pursue the elusive anthrax mailer. (In one twist, a bioweapons researcher who participated in the fight against smallpox becomes one of the anthrax suspects)\nThe book also feels like a horror story at times. The author’s gory description of smallpox effects on its victims is reminiscent of his earlier book on the Ebola Virus, The Hot Zone. And he does in fact make reference to Ebola while describing smallpox symptoms. Although the depiction is vivid, the author seems to relish phrases like “bleeding out”, and all the oozing pustules actually detract from the gravity of the subject. After a while, the gruesome narration conjures up images of a Troma picture and, as with his earlier Ebola work, it seems improbable that anyone could possibly survive these diseases, but they do. Combined with the lack of much background treatment of anthrax, and a minor omission where a Secure Telephone Unit is referred to as a “stew” phone apparently without recognition of the acronym, I wonder if the author has traded off timeliness and drama for thorough research.\nBut leaving the science aside, this book serves up some interesting and useful background on the bioterror threats that populate the news these days. Bioweapons were a pretext for invading Iraq, yet Russia apparently has been actively researching and manufacturing anthrax and smallpox until a few years ago. The potential adverse effect of the smallpox vaccine on some people is old news. Perhaps most disturbing is the potential to genetically modify smallpox to negate the existing vaccine.\nUnfortunately, the most distressing aspect of this book is the real-life subject — unlike a typical whodunit, there is no sense of closure. Although the anthrax case was eventually solved, the bioterror threat is here to stay.\n","date":"January 1, 2004","externalUrl":null,"permalink":"/blog/book/reviews/demoninthefreezer/","section":"Blog","summary":"I suspect when Richard Preston started writing The Demon in the Freezer, he intended the book to be entirely about smallpox — it’s eradication and potential resurrection, either by accident, warfare or terrorism. But after the anthrax-laced postal mailings that occurred shortly after the 9/11 attacks, the author felt compelled to merge the anthrax investigation into his work-in-progress.\n","title":"The Demon In The Freezer","type":"blog"},{"content":"I have some experience with the design and development process for software and semiconductors, so the layman’s typical surprise at the appearance of bugs in programs and microprocessors always pains me. Software and integrated circuits are essentially machines with thousands to millions of components — their construction and deployment is a mixture of prior art, educated guesses, and crossed fingers. It’s a miracle that anything works at all.\nSo I was enlightened and horrified to find, after reading Henry Petroski’s To Engineer is Human: The Role of Failure in Successful Design, that this uncertainty is not unique to the newer engineering disciplines. Mr. Petroski recounts and dissects high-profile failures through the ages, ranging from the intriguing (evidence that some of the ancient pyramids were built at too steep an angle), to the expensive (pothole-induced mechanical failure in New York City transit buses), to the life-threatening (cracking coolant pipes in nuclear reactors).\nThese failures highlight the fact that buildings and bridges don’t collapse around us all the time, and the airline industry as a whole has an exemplary safety record. The author attributes much of the stability that we take for granted to conservative design, adding safety fudge factors, and replication — most houses don’t break any new ground in civil engineering, bridges are designed to handle several times more than the expected loads (just in case), and once a plane has been deemed safe to fly, many duplicates are manufactured.\nSafety doesn’t necessarily involve trading off innovation. The author cites successful high-profile projects include the Brooklyn Bridge and the much-copied Crystal Palace built for London’s Great Exhibition. The success of these creative designs are due not only to careful analysis, planning, and execution (during construction of the Crystal Palace, every girder was tested on arrival at the site before installation), but to diligent study of past projects, successful and not.\nThe element of postmortem analysis gives a detective mystery flavor to this book. The arduous and belated investigation into the crashes of the early Comet jetliner was hampered by the difficulty in finding the submerged remnants of the disintegrated planes and resolved only after running thousands of compression/decompression tests on the cabin by filling it with water (demonstrating that the riveted areas around the windows would eventually crack). Recovery of the overturned North Sea oil rig was an engineering feat in itself, and examination of all the structures revealed the culprit — the stress fracture that shouldn’t have occurred in one of the support legs was painted over during the initial welding and grew to a critical size after being pounded millions of times by ocean waves.\nOn a lighter note, Mr. Petroski recounts an engineer’s analysis of the mythical Icarus’s first and final flight. Experimentation and analysis similar to that applied to other aerospace accidents provides an alternative but no less interesting interpretation of that story. The author also recounts his attempt to track down a possibly alternate originator of the quote attributed to Santayana, “Those who cannot remember the past are doomed to repeat it.” Despite Mr. Petroski’s beautifully literate writing throughout the book, this last personal tale is not that interesting, but it does serve to emphasize the main point of this book — successful design is built on past failures.\nThis book was published shortly after the Challenger explosion and contains an afterword referencing that accident. Santayana’s dictum is especially poignant in the aftermath of the second space shuttle disaster. The question remains — engineering failures leading to such events can be tracked down and fixed, but what about the institutional practices that masked these problems?\n","date":"January 1, 2004","externalUrl":null,"permalink":"/blog/book/reviews/toengineerishuman/","section":"Blog","summary":"I have some experience with the design and development process for software and semiconductors, so the layman’s typical surprise at the appearance of bugs in programs and microprocessors always pains me. Software and integrated circuits are essentially machines with thousands to millions of components — their construction and deployment is a mixture of prior art, educated guesses, and crossed fingers. It’s a miracle that anything works at all.\n","title":"To Engineer Is Human","type":"blog"},{"content":"We Were Soldiers Once… and Young: Ia Drang — The Battle that Changed the War in Vietnam is one of the most memorable war books I’ve read (up there with Band of Brothers).\nI had already watched the film starring Mel Gibson and enjoyed it, but that didn’t prepare me for the book’s matter-of-fact tone, which somehow makes the recounted bravery and suffering even more stark.\nAnd yet the single moment that lingers in my memory of this book is the end, with the general making the battle-weary soldiers stand in the rain with their food while commending them on what a good job they did. Makes you wonder who the real enemy is.\n","date":"January 1, 2004","externalUrl":null,"permalink":"/blog/book/reviews/weweresoldiers/","section":"Blog","summary":"We Were Soldiers Once… and Young: Ia Drang — The Battle that Changed the War in Vietnam is one of the most memorable war books I’ve read (up there with Band of Brothers).\n","title":"We Were Soldiers","type":"blog"},{"content":"Like his previous work, The Nudist on the Late Shift, Po Bronson’s What Should I Do with My Life: The True Story of People Who Answered the Ultimate Question has an irresistible title. I can’t think of anyone who hasn’t had a moment of doubt about how his or her life has been spent or where it’s going.\nIn a sense, What Should I Do with My Life doesn’t disappoint. The assorted stories of real people all interesting and some are compelling — I was most moved by the lawyer who became a long-haul truck driver to spend more time with his stepson. I found myself absorbed in the first third of the book, reading about diverse characters such as the apparent slacker who turned out to have a passion for improving golf equipment, and the Hollywood exec who left to do something more worthwhile and ended up back in the movies with renewed appreciation and skill in scriptwriting.\nBut the book gets more irritating with the increasing mention of Mr. Bronson own experiences. How he turned down a lucrative financial career and turned to writing, how he put together a writer’s commune in San Francisco, how his dependence on his ex-wife held back his writing — these come off as self-absorbed anecdotes. At least he exhibits some embarrassment when describing a side business he ran at his regular workplace without even trying to do a competent job at his paid position.\nEven more distracting are the author’s conversations with and judgments of his subjects. Despite his introductory protestations that he doesn’t have the answers, he seems to fancy himself a therapist and career counselor. He’s critical of those who flit among occupations, maintaining that one should stay several years to make a mark. He chastises an accomplished screenwriter for not completely disengaging from Hollywood as originally intended.\nNo matter how well-intentioned, I find this advice as welcome as the guidance counselors in my high school who told students what careers they were suited for based on a standardized form. The author’s judgments are based on his own experiences (this isn’t my interpretation — he points to his own experiences each time he makes a judgment), but the variety of paths taken in these stories should make clear that one size doesn’t fit all.\nSome people are just trying to survive, some are searching for validation, some want a career that defines their lives, and some want jobs that allow them to live one. Mr. Bronson has performed an admirable job in collecting these stories, but I think he’s missed the point — while he expects and urges people to find their calling (which is easy for a successful writer to say), it seems to me the important thing is the journey, not the destination.\n","date":"January 1, 2004","externalUrl":null,"permalink":"/blog/book/reviews/whatshouldidowithmylife/","section":"Blog","summary":"Like his previous work, The Nudist on the Late Shift, Po Bronson’s What Should I Do with My Life: The True Story of People Who Answered the Ultimate Question has an irresistible title. I can’t think of anyone who hasn’t had a moment of doubt about how his or her life has been spent or where it’s going.\n","title":"What Should I Do With My Life","type":"blog"},{"content":"My criterion for a five-star movie rating is the desire to watch it over and over again. In some stories, it’s peeling away the layers of a mystery. In others, it’s finding levels of foreshadowing or tracking the development of troubled and complex characters.\nIn Lone Star, the rewarding experience is the search for the truth. Not the I’m-right-you’re-wrong truth, but the murky truth in the middle. Sheriff Sam Deeds lives in the shadow of his late father Buddy Deeds (almost as good-guy a name as Dudley Do-Right). The Anglo community, now in the minority of this small Texas town bordering Mexico, can hear no wrong about the legendary Deeds, and the same is true of old timers in the black and Latino community, as senior Deeds most famous act was standing up to the ruthless Sheriff Charlie Wade, who brutalized and extorted from the non-white in his jurisdiction.\nBut now Sam is presented with an opportunity to drop his old man at least a peg or two with the discovery of Wade’s long-decomposed body in the nearby military firing range. The obvious question — what really happened that night after Buddy Deeds told Wade to get out of town, or else? Buddy was no saint. He apparently had few qualms about using his office for personal benefit. And Buddy was, after all, a man of his times. A bartender informs Sam that his father would have given mixed-race couples a friendly warning “for their own safety”, and Sam has vivid memories of how his father broke up his relationship with a Latino girl, Pilar Cruz, now a local schoolteacher.\nWhether Buddy was a legitimate hero or just a less corrupt and racist version of his predecessor is not the only question in town. It seems everyone is in a divisive situation. In Pilar’s school, the parents vehemently debate who’s history is right, the white or Mexican version. The local businessmen and politicians are agitated about the local election, with hot-button issues like the closing of the military base and building a new prison. Colonel Delmore Payne, temporarily stationed at the base to prepare for its shutdown, harbors deep resentment for his estranged father Otis Payne, now proprietor of the local bar frequented by African Americans and known as the “Mayor of Darktown”.\nThe environment frames the polarized feelings of the people with its own contrasts. We see the sparse cactus-filled landscape and then the richly-colored Mexican decor of the the restaurant owned by Pilar’s mother Rosario. The restaurant is filled with workers just recently from Mexico, while Rosario insists that everyone speak English. The elderly lady who calls Sam “Sheriff Junior” is playing a Game Boy. The military officers stationed nearby transition from the formality and coldness of the base to the lively music and dancing at the local bar.\nKris Kristofferson and Matthew McConnaughey capably play Charlie Wade and Buddy Deeds, respectively, as larger than life characters, but the pleasantly outstanding performances are given by Chris Cooper as the slightly sardonic and mild-mannered (nearly to the point of being morose) Sam Deeds, Elizabeth Pena who manages to be sensual in every role, including this one as a disappointed-with-life mother of two, and Joe Morton as the stiff but perceptibly sensitive Colonel Payne. A brief but lively and somehow simultaneously hilarious and sad appearance is contributed by the versatile Frances McDormand as Sam’s “tightly-wound” ex-wife. She’s obviously a disaster, but she reminds Sam (with no argument from him) that it takes effort from both sides to make a relationship succeed. The truth lies somewhere in between, and while it may be complicated, inconvenient, and perhaps not completely realizable, in that gray area also lies the chance for more understanding and — the reward — a human connection.\n","date":"January 1, 2004","externalUrl":null,"permalink":"/blog/film/whoknewtexansweresodeep/","section":"Blog","summary":"My criterion for a five-star movie rating is the desire to watch it over and over again. In some stories, it’s peeling away the layers of a mystery. In others, it’s finding levels of foreshadowing or tracking the development of troubled and complex characters.\n","title":"Who Knew Texans Were So Deep?","type":"blog"},{"content":"There’s something wrong when a book on screenwriting is tedious to get through. Halfway into Andrew Horton’s Writing the Character-Centered Screenplay, I thought I would scream if I saw the word carnivalesque again.\nBy carnival, the author refers to the mystery, progress and interaction of the developing characters in a screenplay. At least, that’s what I think he’s saying in the first chapter, which is devoted to elaboration of this concept. I think this could be stated in a less high-falutin’ manner with “make the characters interesting”. On the other hand, terms like “plasticity”, “potentiality” and “unfinalizedness” send me running back to the carnival.\nSome of the author’s points on what makes characters engaging, e.g. unexplained backgrounds and behavior that goes against stereotypes are hard to argue against, and some of his examples are among my favorites, such as Northern Exposure and Lonesome Dove.\nBut his thesis that character comes first and plot/structure follows at a distant third (I forget what comes second), doesn’t jibe with me. Several of the character-centered movies that he cites, including Sex, Lies and Videotape and Thelma and Louise, I thought were undermined by a feeble story and not that compelling character-wise, either. And am I the only one who thought Silence of the Lambs was overrated? Hannibal Lecter was not mesmerizing so much because of his mysterious background, but more so because of the devilish performance by Anthony Hopkins.\nAnd while I’m the first to decry the Bruckheimer-blockbuster formulas, to claim that an emphasis on story and structure is a negative, with Star Wars and Indiana Jones among the culprits, is just too extreme.\nAnyway, the latter section of the book does provide some relief in the form of practical advice for screenwriters — the usual tips on coming up with ideas and forming a pitch, listings of software, books, resources for scripts and video libraries, and, surprise, a recipe for gumbo. So at least the author is trying to serve up his own dish of carnival here.\n","date":"January 1, 2004","externalUrl":null,"permalink":"/blog/book/reviews/writingthecharactercenteredscreenplay/","section":"Blog","summary":"There’s something wrong when a book on screenwriting is tedious to get through. Halfway into Andrew Horton’s Writing the Character-Centered Screenplay, I thought I would scream if I saw the word carnivalesque again.\n","title":"Writing the Character-Centered Screenplay","type":"blog"},{"content":"","externalUrl":null,"permalink":"/tags/agile/","section":"Tags","summary":"","title":"Agile","type":"tags"},{"content":"","externalUrl":"https://www.appcraver.com/phil-chu-talks-about-developing-apps-and-unexpected-successes/","permalink":"/about/interview/appcraver/","section":"About","summary":"","title":"AppCraver","type":"about"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"My published and self-published books.\n","externalUrl":null,"permalink":"/books/","section":"Books","summary":"My published and self-published books.\n","title":"Books","type":"books"},{"content":"","externalUrl":null,"permalink":"/tags/bowl/","section":"Tags","summary":"","title":"Bowl","type":"tags"},{"content":"","externalUrl":null,"permalink":"/tags/gamecube/","section":"Tags","summary":"","title":"GameCube","type":"tags"},{"content":"I commissioned this logo from Dakota Snow (artist, singer, barista) after I heard she created the graphics for her band.\nThe hacker avatar was sketched for me by Berkeley Breathed when he gave a talk at an Iowa City High School art class.\nThe background photo was taken at the San Diego Cat Cafe.\nThe homepage icons are from FontAwesome\nThe favicon is from my hand-coded SVG icons.\nThe previous Technicat logo was created by Shane Nakamura.\nSome work-in-progress concepts.\n","externalUrl":null,"permalink":"/about/graphics/","section":"About","summary":"I commissioned this logo from Dakota Snow (artist, singer, barista) after I heard she created the graphics for her band.\nThe hacker avatar was sketched for me by Berkeley Breathed when he gave a talk at an Iowa City High School art class.\n","title":"Graphics","type":"about"},{"content":"","externalUrl":null,"permalink":"/tags/interview/","section":"Tags","summary":"","title":"Interview","type":"tags"},{"content":"","externalUrl":null,"permalink":"/tags/it/","section":"Tags","summary":"","title":"IT","type":"tags"},{"content":"","externalUrl":null,"permalink":"/series/learn-unity/","section":"Series","summary":"","title":"Learn Unity","type":"series"},{"content":"","externalUrl":null,"permalink":"/tags/meeting/","section":"Tags","summary":"","title":"Meeting","type":"tags"},{"content":"","externalUrl":null,"permalink":"/tags/postmortem/","section":"Tags","summary":"","title":"Postmortem","type":"tags"},{"content":"We take no data and leave no cookies. Outside of our control, analytics may be collected by web platforms (probably not as big a concerns since I moved this site to statichost.eu), games integrating Steam, games built with Unity, and iOS apps (you can opt out of device analytics in your device Settings-\u0026gt;Privacy).\n","externalUrl":null,"permalink":"/privacy/","section":"technicat.com","summary":"We take no data and leave no cookies. Outside of our control, analytics may be collected by web platforms (probably not as big a concerns since I moved this site to statichost.eu), games integrating Steam, games built with Unity, and iOS apps (you can opt out of device analytics in your device Settings-\u003ePrivacy).\n","title":"Privacy","type":"page"},{"content":" On Amazon # ","externalUrl":null,"permalink":"/books/learnunity4/reviews/","section":"Books","summary":"Amazon reviews","title":"Reviews","type":"books"},{"content":"","externalUrl":null,"permalink":"/tags/schedule/","section":"Tags","summary":"","title":"Schedule","type":"tags"},{"content":"","externalUrl":null,"permalink":"/tags/screenshots/","section":"Tags","summary":"","title":"Screenshots","type":"tags"},{"content":"","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"},{"content":"","externalUrl":null,"permalink":"/tags/startup/","section":"Tags","summary":"","title":"Startup","type":"tags"},{"content":"","externalUrl":null,"permalink":"/tags/ui/","section":"Tags","summary":"","title":"UI","type":"tags"}]