Posts

  • Visualization of Javascript Testing Resources

    I ran across a nice medium post on the state of Javascript testing. I remember collecting the data for a similar article a couple years ago, but I never edited it down into anything as usable as Vitali Zaidman did. This is good stuff.

  • Visualization of NBA Trades by Team

    “The Warriors look good this year– they’re just all playing for the Lakers.”

  • Introducing Test Pantry

    On two recent Javascript data-based projects, we needed to data to feed into our tests. For many years I’ve used Thoughtbot’s Factory Girl for Ruby, but couldn’t find the equivalent for Javascript. There are several, but I found the syntax baroque, and the benefits didn’t justify the complexity. And of course in Javascript, because of the nice object literal format, it’s pretty easy to just hard-code test data yourself. And that must be what most people do. But as I built out more and more tests, I saw how a tool would help. So I created Test Pantry.

  • 8 Steps to Constructing a Better Software Engineering Homework Interview

    A recent trend in the SF tech scene (along with “project interviews”), is the take-home interview. I’ve been on both sides of this exercise, I’ve noticed it can have unintended consequences: bad assessment coupled with a bad experience. Here are some of the problems, and offer 8 suggestions about how to improve it.

  • Refactoring and Iterating on Generators

    In this post, I delve into writing the same functionality in a myriad of ways. In the process, I’ll evaluate some trade-offs, as well as try out generators of Javascript ES6.

  • Shh! Algolia for the Win

    Sitting in our dining room, discussing our kids’ room full of books, I decided to regale our kids with a story about the old days of the library: rows of “card catalogs,” little pieces of paper to jot down call numbers, etc. This got them very excited, and they love building things, so they were gearing up to re-create just such a system in their bedroom.

  • Should we use multiple input fields to prevent mistakes by users?

    At Stitch Fix, we’re working on our sign-up flow. During this process, we debated whether we should have a single password field, or, as many sites do, two— the second one being a “password confirmation”.

    Some sites use the same technique with email and email confirmation.

  • My Favorite Tech Interview Technique

    Inspired by the fun at hack nights around town, I’ve stumbled upon my new favorite interview exercise. I’ve been meaning to write this up for a couple months, and just stumbled onto a very similar idea by a fella named Ben Schwarz.

    tl;dr – have the candidate bring in an open source project and hack on it together.

    The tech interview is challenging, especially if you’re administering it. At Stitch Fix, we’ve been talking about how to spend our 30-60 minutes to get the best read on a software engineering candidate. Here are a few popular techniques we’ve used, and you probably have too:

  • Switching Away from Root Domains

    This weekend I moved my site amp-what.com from a PHP hosting service to Heroku. This move will give me more control; the site is an SPA, and I’ve struggled to get some page rank in Google with only one page. If I put it behind a node app, I’ll have flexibility to add URLs freely in a way that isn’t possible on LAMP stack.

  • Exploring Dependency Injection in Javascript

    Over the last month I’ve been wrapping my head around Angular JS. I ended up exploring Dependency Injection in depth, and I’d like to share my experiments.

  • Visual Undergrounding of Electrical Wires of Noe Valley

    All the visual clutter of the city gets to me. There are wires and (often confusing) signs everywhere. I imagine sometime if all this noise could just be silenced. I took an hour and some crude Photoshop skills to envision parts of my neighborhood Noe Valley, San Francisco without all the wires.

    These are presented using a NYTimes technique for before/after photos. Go to the page, and then drag the black dividing line to compare the photos.


    As part of a 100-year plan, PG&E is undergrounding some of these wires, but Muni wires will be with us for a long time.

  • AlignColumn jQuery Plugin

    I recently released a new jQuery plugin Align Columnthat aligns HTML table columns based on the (U.S.) decimal point – or whatever you want. Here’s a brief story of why I wrote it.

  • Why Hire an Agile Consultant

    A few years back, I joined Carbon Five, a small agile consulting company specializing in boot-strapping start-ups. Over my three years there, I learned that the expectations of working with agile consultants are very different than working with other consulting companies. Now that I am five years into agile consulting myself, I’ll share my typical introductory remarks.

  • Factor-based Opportunity Analysis

    A few months back I went to a Ruby-on-Rails speed-dating event. I ended up building a spreadsheet tool for myself that a couple people have expressed interest in it. So I thought I’d share it with all of you.

    If it isn’t obvious what a “Ruby-on-Rails speed-dating event” is, here’s the scoop: about 30 developers come and meet 30 hiring managers; you get 3 minutes to pitch your company and/or self (depending on who starts talking first!). I like to be open to new experiences– and I thought I just might find my dream job, so I gave it a shot. If nothing else, I thought I’d get elevator pitch practice.

  • &what?

    I recently published amp-what.com. I created it to solve a problem I have: trying to remember (or google) character entity numbers or names. For example, our last project used the entity » (»). Try googling this if you don’t remember the name! Now, with this tool, I can just type “»” and the character, symbol and number appear.

    It turned out to be surprisingly fun to play with. I discovered chess pieces, planet symbols, all sorts of boxes. There are a surprising number of icons to play with. What have you found that surprise you?

    I initially sourced the tool with the standard 100 or so entities from W3C. Then I supplemented this with 10,000 interesting Unicode characters, and a nice set of entity synonyms from Remy Sharp (whose site is solving the same problem). Seeing that people were sometimes getting no results, I pulled in an internet jargon file for non-conventional names, and supplemented myself, by manually coding them. I am interested in adding more, but want to keep it “offline friendly”, which means not too large.

    **I was intrigued by a couple questions around “mobile”: ** I tried to make it “mobile friendly”, and the initial version was “small”; small enough to fit on an iPhone screen. This ended up looking sad on larger screens, so that clearly is not the answer. I recently refreshed it with a responsive design approach. Now it uses the screen space nicely on both small and large screens.

    I also wanted to build an HTML5 offline app. For those of you with an iDevice, you can save to the home screen and have the reference available whether you are online or not.

    But beyond being mobile “friendly,” I believe that HTML5 offers a good alternative to building a native app. I wanted to push the UX and see if I could get it to feel as responsive as a native app– I think it does a pretty good job at executing quick searches, but I’ll leave it up to you to judge.

    Since the initial prototype, I’ve layered in a few features: It wanted to be able to link to certain queries, so I used the hashtag to do that, so you can share your favorite queries.

    I allow changing the font (using the small (f) in the bottom right corner).

    I found myself wanting to use the Unicode characters in different contexts: not only web pages, but Javascript source and CSS files. I’ve added some ability to customize the display– hex, decimal, Javascript, or URL encoded. Those controls are also at the bottom of the screen.

    Check it out, bookmark it, and please send me feedback.

    Comments

    ndp
    Thanks for using amp what! The intent of the code is that if you click on the symbol itself you copy the symbol, or if on the number, it copies that in the current "mode". I believe this is what you are doing. The mode is the �� 16 and CSS in the right of the search bar. If you can click on the CSS, the copy function should give you a css content attribute appropriate value (although I do see a glitch with how it's working now-- which I'll fix tonight.) Lmk
  • Getting paid by LOCs?

    I don’t get paid by the lines of code I write. But I’ve certainly joked about it: there’s a rumor that Trevor, who writes way too many comments, gets paid by the line (including comments). Über-programmer Dave things his manhood is measured by the size of his commits. On a recent project the codebase was so large that I joked that every commit should be rejected if it didn’t reduce the line count of the project. Haha.

  • Do I really have to write tests?

    Over at the Lean Startup Circle mailing list, they’re discussing what kind of tests to expect from developers. I enjoy this conversation. People are often looking for a clear guideline (“startups don’t need tests”) or “code coverage” figure– or have one in mind. Idealistic agilists insist you always write tests. They equate not writing tests with abandoning quality– the beginning of the end. “Such carelessness will lead to bugs upon bugs and eventually, unmaintainable code.” Reality requires a more nuanced and pragmatic approach suggested below.

    Getting Real

  • Interesting Character Entities

    I spent a couple hours on my character entity finder, and wanted to share some interesting things I’ve discovered. I made two main improvements:
    (1) lookup happens asynchronously, in small batches, so that it suffers less from “locking up”. This allows much more flexible exploration.
    (2) allow you to bookmark queries, so you can share interesting discoveries.

    To recap, I built this tool to find all the weird quotes:

    http://amp-what.com/#q=’
    http://amp-what.com/#q=quot

    Wow, I discovered there’s a nice set of chess pieces:

    http://amp-what.com/#q=chess

    Just a minute ago, I added the ability to bypass the query builder– if you enter a full regular expression. The regular expression is matched against entity names (and numbers, and nicknames). For example, there are all sorts of icons available:

    http://amp-what.com/#q=/97[2-6]\d/
    The currency symbols aren’t easily found with a single query, but you can build a page with a selection of them:

    [http://amp-what.com/#q=/currency euro dollar pound/](http://amp-what.com/#q=/currency euro dollar pound/)

    It’s surprisingly fun to play around with. Give it a spin.

  • Finding entities, characters, glyphs

    My latest “mini-project”, a few hours in, solves the annoying problem of trying to remember entity numbers or names. For example, our last project used the entity » (»), and it seemed like it took me two years to remember it. Now, with this tool, I can just type “»” and the character, symbol and number appear. I tried to make it “mobile friendly”, and may experiment with packaging it as an “app”.

    I’m intrigued by “mini-projects”… something I can put together in a few minutes or hours and provide value to someone. It’s a long-time obsession: in the 90s when I got my first laptop, I tested myself to see what I put together on my 22 minute BART ride from Oakland to 24th Street. It was fun, but I never creating anything of general interest.

    Now, these little tools (and hacks) can be quicker to build out and easier to share. In fact, there are 1000s of “apps” out there, many of which look like they can be done in hours. Anyway, I have a few on my web site.

    What makes things easier is there is so much data out there to build upon. As you’d expect, it takes the entity list of W3C. But I supplemented this with interesting Unicode characters, and a nice set from Remy Sharp.

    Check it out, bookmark it, and please send me feedback. <h2>Comments</h2>

    ndp
    @Kim... finally responding to your comment with a new version. I've added many symbols, including the monkeys http://amp-what.com/#q=monkey This is still a subset, but if you want to use a "full" set of 35K characters, find the link towards the bottom page that says "Click to replace curated list of characters..."
  • Friendlier Session Timeouts 2.0

    As we discovered today, coding up friendly session time-outs involves more than meets the eye. As you know, a session time-out logs the user out after a period of inactivity. But interactions with web sites, and “inactivity,” have changed over the last 10-15 years.

    We have a fairly plain Rails app, and we’re implementing a series of security fixes in anticipation of an audit. In what seemed like a simple “1-pointer”, we were asked to remove the “Remember Me” checkbox from our application, and force the user to be logged out after 20 minutes.

    For the first pass, we simply set the session timeout to 20 minutes and removed the checkbox (and the underlying implementation). Easy eh?

    Sadly, this solution leaves much to be desired. When the user (or Q.A. engineer) returns after 1/2 hour, the page is unchanged and ready for action. But any click redirects, confuses, and potentially loses in-progress work.

    Although this might have be acceptable in 1998, it’s 2011 and we got Ajax. Clicking a link on a Web 1.0 site takes you to another page; if you happen to be logged out, oh well, sign back in and continue– you probably weren’t doing something that important anyhow.

    But these days, on an Ajax page, if your session expires while you’re viewing the page, clicking on any element of the page can reveal a session timeout. This may appear to the user as a server error, or if it’s handled correctly (like we did), a page redirect. Clicking on a disclosure triangle redirects to a new page? Now we have a surprised user.

  • Curing Frequent Selenium File Upload Failures

    The symptom was quite simple: do an upload, and on the next request the server reports an “IOError”. As our Ruby on Rails app is pretty much thin workflow around lots of file uploads, this was a problem. We tended not to see in on production, but us frequent users were seeing it enough to know we had to do something about it.

    But the real complainer was Selenium. About half the time the tests failed and needed to be coaxed into running again.

    JWinky traced the root cause down to a known bug in the temp file class. With a little work (and encouragement by yours truly), he put together a patch that has eliminated the problem. We’ve been running with it for a couple months and haven’t seen the bug once– or heard a peep from Selenium.

    It’s found here: http://github.com/jwinky/ruby_tempfile_ioerror

  • Updated Cheat Sheets

    Five years ago, I was working at Great Schools, and got interested in SEO. I started running all sorts of experiments on my own site, to understand how I could affect things. I reorganized the URLs, added keywords, and followed all the standard recommendations. I quickly realized little tweaks to URLs, meta tags, and optimizing keyword density wasn’t going to help much. These types of changes really are “optimizations”– they’ll give you a small percentage increase, but they are not game changers. If you’ve got millions of visitors, a 1% may mean real money, but if you’re me, it doesn’t matter.

    So, after working on SEO, I pursued another idea. Why not create something of real value to drive people to my site? I had an idea and created some “cheat sheets” to help me with my own development. I created them, and then posted them where I could to get some inbound links. Shortly thereafter, someone at O’Reilly found my page and linked to it, and all of a sudden I was getting hundreds of page views per day. So that was my lesson: If I provide something of value, people will come. That was five years ago. Even though technology changes fast, I still have a bit of tail from those original cheat sheets.

    Last night, I decided that since of 80% of the people hitting my site are seeing those pages, I should take a look at them and see what impression they might be making. I really don’t have a “goal” of driving traffic anywhere else, but I might as well make them look as good as I can. So I cleaned up the visual design and fixed the editing.

    Check out the spruced up pages here: Hibernate Mapping and JSPx Cheatsheet.

  • Color Scheming with Javascript

    In this post, I’ll share my Javascript code for manipuating colors.

    I started a few months back with basic color manipulation routes. Other libraries take a strictly object-oriented approach. This can be a little heavyweight, as it requires explicit conversions throughout the calling code. But in the HTML DOM, colors are generally expressed as hex strings, and if we have routines were built around these, they would be simpler to use. Plus, Javascript is dynamic language, so a String could have color manipulation methods. That’s exactly what I did:

  • Color Factory: Color scheme generators

    While working on a spin-off from bedsider, I created Csster. Alex @ C5 encouraged me (and coached me a bit) on getting through functions around color math, and as far as I know, the functions in Csster is the only Javascript implementations. I find the invaluable as I build out Javascript functionality, and I am working on separating them out from Csster itself.

  • jQuery support in Csster

    I finally got around to adding a little jQuery plugin for my Csster tool, and released it as version 0.9.2.

  • Learning Git?

    I just revised my previous visualization about git with an eye towards better visual design and usability.

    Here’s a little history: As I dove into learning git, I was initially confused about where my code was. I felt pretty confident that git hadn’t lost anything, but less confident I could get it back readily. Sure, it’s distributed, so I expect my code will be more places. But there was also this “index” and “stash”– how do those relate? It’s a little complex coming from Subversion or CVS.

    Once I figured out the basic locations that things could be, understanding the commands is a second challenge. The commands tend to work on one or two targets, moving code from one to the other. But they aren’t named in any obvious way, except for the “stash” commands. To make sense of these, I mapped them onto the locations. In the visualization, just click on “remote repository” to see all the commands that affect it.

    Out of these two frustrations comes my visualization.

  • Intermittent Selenium Failures

    Selenium testing is always a little flakey, but I’ve found a good treatment for this on my last two projects. It’s pretty simple, really:

    If you are using external Javascript services, turn them off.

    This includes Google Analytics, Kiss Metrics, Share This, etc. The number of these services has exploded in the last couple years, and it’s hard to build a site that doesn’t use at least a couple. These tools do what they can to not interfere, but in the fast-paced world of Selenium, they don’t always survive. Just remove them for these tests and you’ll see marked improvement.

    Actually, that reminds me of a good talk I heard the other night. It was by Marcus Westin and Martin Hunt of Meebo, and they talked about developing he “Meebo Bar”. They figured out some really cool tricks to load asynchronously and not interfere with the host website– but even better, supporting security contexts client side (which is pretty nifty if you think about it.) I actually think you could build a pretty clever SSO (single sign on) solution using these patterns, but I haven’t tackled that one yet. Check the slides and presentation. A must read if you’re developing your own widget.

    Credit where credit’s due: it was Justin and Jonah (different companies, different projects, not brothers) who identified this problem, not me.

  • Introducing Csster

    So I’m a bit of a CSS nerd. For years, I’ve been complaining that there’s not enough “engineer” cycles given to CSS. I’ve written endless blog posts about how to organize your CSS. Blank stares when I ask interview candidates “how do you structure your CSS?” Well, now we can write CSS in Javascript with Csster, and maybe– just maybe– the world has been set right.

    In 2000, I ventured into teaching atCity College. To be honest, I’d missed the dot com boom and didn’t know anything about the web. I was really nervous, so checked out every book the school library had about web development, and studied (and learned) thoroughly. Since then, I built quite a few web sites for people, non-profits and businesses, and developed a certain amount of dexterity with CSS. CSS has evolved a bit in the last ten years, but this firm foundation of understanding of the cascade and such has served me well.

    Not to go off into a rant, but lots of CSS ends up a mess. I always felt like it, like C++, needed more restrictions and guidelines to turn out maintainable. I tried to enforce various guidelines with my teams.

    In the last year, there’s been a renewed interested in CSS and the tooling around it. With the advent of tools like SASS, it’s starting to receive the engineering attention it’s always deserved.

    I was a little hesitant to endorse Sass (or even try it). CSS already has too many “degrees of freedom”– more flexibility seemed like a bad idea. It would make the problem worse. I poo-pooed it.

    Okay, stop laughing.

    Finally a couple weeks ago with some changes to my team, I was convinced to give it another shot. At the same time I started a new small project, so I just tried it out. This project was design and Javascript heavy, but small enough to back out if it wasn’t working. Sass was OK, I decided, but I was still maintaining too much junk, and now there was this additional build step.

    On a Friday afternoon, I mentioned to my coworker Jeremy that what I’d really like is to just stay in Javascript. Javascript has this object literal format (JSON), and the whole hierarchy of CSS might just fit in.

    It was a bit of an idea that I just throw out, but over the weekend I pursued a spike implementation of what it would look like. Using test driven design, it came together much faster than I had anticipated. It was a usable tool. Alex at C5 coached me through fixing some of the color functions, and as near as I can tell it equals or exceeds Sass’s feature set.

    In the last couple weeks I’ve used it extensively in my current project and it’s great. Being in a real programming language really does make CSS nice.

  • Chart of Primary Programming Languages

  • jQuery Conf SF

    After traveling around the Bay Area talking about Javascript Unit testing, I scored a shot at the San Francisco jQuery Conference. I’ll be there Sunday afternoon, talking about “Organizing Your Code with Testable jQuery Plugins”. Stop by and say “Hi”

  • Rails Fixtures with Integrity & Validity

    A new developer on the project changed the symbolic name of one fixture record and broke a whole bunch of tests in unexpected ways. Pairing, we discovered a some interesting stuff.

    First, if you’ve never dug into them, it’s critical to understand how symbollically named fixtures work. We rely on them heavily, but only yesterday read the code. If you have a fixture like:

  • Implement Most Popular the Easy Way (hint: use Google Analytics, garb and Rails)

    Over the last few years I’ve implemented “most popular” posts, questions, lists, companies, users, pages, searches, cities, and who knows what else. It’s not difficult. I’ve always implemented this myself– using a few columns in an SQL database, but found something didn’t smell right. We already have this free tool– Google Analytics (GA)– which is collecting usage data on my site. Why would I want to store this data redundantly?

    In this post, I’ll walk you through what we did on my most recent project for the National Campaign. There are three steps: collecting the raw data, processing it into statistics, and displaying it to the user.

    Using GA you can completely outsource the data collection. For the statistical analysis, you gain flexibility– more on that later. Finally, I won’t talk at all about displaying the results to users– that’s up to you.

    Step 1: Collecting the Data

    If you are already using GA, you’re done– you’re collecting data. If not, you simply need to create an account and start using it.

    Fortunately, using RESTful conventions, most using actions end up being “page views” of some sort. But there might be other steps you want to take. For example, we had a page that served up content via Ajax, and I hadn’t bothered to instrument them with GA yet. I added one line of Javascript to the Ajax callback: pageTracker._trackPageview(questionLink); And it can get more complicated: if your definition of popularity involves something beyond your pages, you’ll have to dive into the event tracking or custom variables of GA (which I haven’t done).

    It’s worth pointing out that if you don’t use GA on a project, you need figure out what data to collect and how to store it. This involves the business owners expressing their requirements, and the developers debating which database table to use and how general a solution to build. You can imagine this can be a small sink-hole if you’re not careful.

    Step 2: Processing the Statistics

    The hard problem to solve here is to create a function that calls out to GA, collects the data, and saves it into your database.

    Understanding the API
    Although you really don’t need a deep understanding of the API, you should at least skim it. The salient points are to understand the differences between accounts, profiles and sites. Run off and read it now.

    Install the Rails Gem
    You’ll need to get “garb”– not as in trash, but as in Google Analytics for Ruby. Install it:

  • Recipe for 5 Whys with an XP Software Team

    5 Whys is a great way to get at the root of quality problems. On my last three projects, when I felt like code quality was dropping, I ran a “5 Whys” session. I have found it adds variety, solves a very specific problem, and plugs right in as an alternative to an agile reflection.

    It’s not in every agile software team’s bag of tricks. Asking around our fairy savvy office, I discovered it’s far from universal. In the “State of Agile” report from Version One, which includes survey results from 2500 software developers, it wasn’t mentioned. Since I haven’t seen it show up that much in other agile writings, I thought I’d share my experiences here.

    What is “5 Whys”? I picked up “5 Whys” from the lean software movement, which sprang from Toyota manufacturing. You can read about its history on wikipedia, but it’s pretty simple: at the end of the assembly line, when a widget comes out with a problem, you stop the line and ask “Why?” Whatever the reason, you ask the “Why?” again. Repeat at least 5 times. The goal is to discover the “root cause” of the defect, and fix the root cause, not just some symptom. Wikipedia has a good example around car repair. Here’s a software example:

  • Assert Changes and Fixture Test Helpers

    About a year ago I posted some test helpers for checking pre- and post-conditions during a test. I called them “ assert_changes” and “ assert_no_changes”. They took a ruby expression to evaluate, a block, and did what you expected:

  • Pairing with Designers

    I’ve worked on software with designers for 15 years, ever since software had a visual design. Usually this involves being “handed off” designs, or providing “feedback”, via email. Only occasionally have I worked side-by-side to solve visual design and interaction problems.

    Reflecting back, this seems sad, since working together has all the advantages of pair programming– it’s fun and educational, often much faster, and you can produce a superior result.

    There are many blog posts about the merits of pair programming, but none about pairing between programmers with a designer. Since Carbon Five values pairing and collaboration so heavily, I’ve been trying to do it on all my projects. On my most recent project for the National Campaign, I’ve had the pleasure of “pairing” with several designers.

    The first day of the project was refreshing– I sat side by side with Jef and we broke apart his Illustrator designs, reassembled them in HTML, and fluidly passed ideas and png files back and forth. He was standing next to me, we were sharing a dropbox, and it was very exciting.

    Five months in, a recent experience left Suzanna (our current designer) and me in awe of the merits of working closely together.

  • Scrum, XP, Agile, and Visualizing the Difference

    Visualization of agile practices running here:

    http://ndpsoftware.com/agile_methods/agile_methods.html (If it seems to draw garbage all over the screen, refresh the page. More on that later.)

    What it shows is the main concepts of 5 different agile viewpoints: XP, Scrum, the Agile Manifesto, Lean and Getting Real. Important words for a practice are “attracted” to (gravitationally) to the practices that mention them in their canonical definition.

  • Tips on Taking Autotest for a spin on OS X

    I was excited to get autotest working for my last rails project. In case you don’t know, autotest is a tool that continuously runs your Ruby tests as you work. It monitors your file system watching for changes, and then has a heuristic to figure out which tests to run. Once a test fails, it keeps re-running it until it passes.

  • Working with Agile Developers

    I recently joined Carbon Five, a small agile consulting company specializing in boot-strapping start-ups. I got a chance to work with C5 over the last year (as a client), and I learned that the expectations of working with us are very different than working with other consulting companies.

  • Unit testing time

    We’ve all run across the problem of trying to unit test some code that is dependent on the current date. Such as:

    ` public String elapsedTime(Date d) { final Date now = new Date(); final long ms = now.getTime() - d.getTime(); return “” + ms / 1000 + “ seconds ago”; }`

    How do you test something like this? (or something more sophisticated and useful)

    I found the solution in a posting about mock objects. The trouble is that this code is depending on the Date class, and its behavior of getting the current time. Imagine a Clock interface:

    ` interface Clock { Date getNow(); }`

    and then a rewritten elapsed time:

    ` public String elapsedTime(Date d, Clock clock) { final Date now = clock.getNow(); final long ms = now.getTime() - d.getTime(); return “” + ms / 1000 + “ seconds ago”; }`

    Obviously the Clock can be injected in other ways, but now we have a testable and extensible method.

  • Scriptaculous Effects Demo

    I threw together a demo of Scriptaculous effects: http://ndpsoftware.com/ScriptaculousEffectsDemo.php Nothing crazy here, but I’d like a flexible and interactive demo. Send me ideas or suggestions, Andy

  • Powerbook Battery Rejuve

    My aging G4 Powerbook battery slowly died over the last month or so. It just seemed to hold a charge less and less. Last week it wouldn’t go on for more than a minute or two. This weekend, unplugging the power cord was equivalent to a shutdown. After that, the battery reported “missing”. It seemed like a strange progression– not as organic, following some sort of decay curve, as I would have expected the material to behave. So I looked on the Internet to see if there were any clues. There were a set of my batteries that were recalled, but (damn), mine didn’t qualify. Next, I found a thread about resetting p-ram and other such shenanigans. I was skeptical, but it seemed like there was one trick that worked for people: going into open firmware (Restart with Cmd-option-O-F pressed), and then resetting the chip that manages the battery power (reset-nvram). It was worth a try. So I did this. Wow, what a transformation. Now my battery seems to hold a charge just like it did a month or two ago. I haen’t gone through extensive tests, but it’s workable again. Perhaps that other dead battery will come to life… – report from a year later – Battery life wasn’t that great for very long. It decayed to be mostly unworkable after a month or two. After a year it was down to ten minutes or so, but never as bad as before. Yeah, I’ve bought a new battery.

  • Page layout options

    I put together this little experiment to show the options and technique for doing different page alignment strategies: fixed width, stretch to the browser, or various hybrids you see around the web.

  • First grade first

    Is using temporary variables was messy? I now advocate writing 1st grade code. By that I mean “See Dick run. See Jane smile.” etc. Hey, we’re all adults here, you say, why can’t I write real code.

    Well, writing really simple code makes debugging easier. What do I mean? I’ve had a couple occasions in the last week where debugging would have been easier if I’d writing really simple code. For example, I just got an null pointer exception here:

  • We posted on craigslist.org for a jr. java engineer and gotten the predictable hundreds of responses. I have seen all sorts of mistakes. Normally I wouldn’t repeat this sort of information in a public forum, but what the heck, it’s a blog.
    COVER LETTER
    Follow the directions. If it asks for a cover letter, send one. I kinda like this one: “Hi, Here is my resume. Thanks”, but most people would find it too brief. Really long ones show you can’t prioritize your work. Generic ones that don’t match the listing generally disqualify you. If you’re going to try to make the point that the job sounds “interesting”, you MUST explain why. Nobody’s done it yet. After reading it 100 times, “please email or call me at anytime” seems redundant.
    GENERAL
    Don’t hide behind words. I’m only going to read 20 or so words when I skim your resume. The fewer words you have, the more likely I am to see the important ones. Have someone proofread. I’m waiting for a well-written letter. I don’t care if you worked at the cineplex or best buy. Don’t attempt more formatting than you can handle. Understand the limitations of MS Words or email before going wild with formatting buttons. It looks unprofessional if certain words or phrases are different sizes. Be aware that not everyone will have the same fonts and OS as you. One person put their resume into pdf, but somehow managed to completely mangle it.
    SUBTLETIES
    Don’t cc lots of companies. Think about the name of your resume. “oldresume.doc” is curious. WORST TRANSLATION
    “References available on demand.”
    BEST FOLLOW-UP
    “…Hey, good luck with that. Ya know, you’ll probably find someone too, market being what it is. Sucks.”

subscribe via RSS