Saeco Nina RIP

We loved our Saeco Nina, but after only four or five months, it's hardly usable. It can hardly pull an espresso any more. The pump can't force water through the filter, with or without the auto-pressure gasket, despite our cleaning regimen The pull is inconsistent, sometimes too weak, and other times too bitter. I have given up on it.

At home, I love our relatively new Gaggia Coffee Deluxe. At the office, I'll probably switch to the trusty old French press.


Meetings suck

First he butters me up: "As one of my best managers, I thought I'd get some advice..."

Then he makes a genuine request for help: "... on how perhaps my company should structure one of their processes... in particular, team meetings"

I offer a snarky response: "Meetings suck. Avoid them."

And then I get interrupted and can't finish the IM conversation, so he thinks I'm a jerk.

This is what I would have said if I had thought it through.

The only meetings you need are the ones that help you meet your business goals. Your only true business goal is to make money. Your software engineering team is a constraint on your ability to meet your business goals; you need to do things to make your team efficient. The only meetings you need are the ones that address your software engineering team as a constraint on your organization's ability to make money, the meetings that make your team more efficient.

Here are the specific meetings you need:

Daily greeting
This isn't formal meeting, but it might be the most important meeting of the day. Be friendly! Make sure you talk to people when you don't have a problem or complaint, so they won't mind talking to you when you do bring trouble. If you train people that you talk to them only when you have a complaint or there's a problem, then they'll avoid you. Everyone should offer a friendly daily greeting to everyone they work work, every day, for at least a few minutes each.

Initial project planning meeting
At the beginning of your project, hold a project planning meeting. Discuss project goals and non-goals. Understand the known requirements. Prioritize the product backlog. Outline a plan with timeboxed milestones (sprints) marking a path to the end. Attendees include all the project's stakeholders: the customer or a proxy, the product owner, the business team, the project manager or scrum master, and the project team members. Hold this meeting once, at the beginning of each project, for 2 to 8 hours, depending on your organization's norms.

Sprint review and planning meeting
At the beginning of each sprint, plan the sprint. At the end of each sprint, review the sprint. What did you get done? What did you deliver to your customer? Demo your delivery to the stakeholders and to each other. Discuss what worked well and didn't work well during the sprint. Review and amend your product backlog, and reprioritize it according to your business goals. Let the project team select and commit to completing a subset of the prioritized product backlog for the sprint backlog. Depending on your organization, sprint review and sprint planning can be two distinct meetings, each 2 to 8 hours long, or one combined meeting, 2 to 8 hours long.

Daily stand-up
You must talk to each other every day. The least efficient team members are the ones that never communicate with each other; the next least efficient team members are the ones that only send email to each other. Hold a regular meeting, at the same time, in the same place, every day, for 15 minutes or less. Call it a daily stand-up, a scrum, or whatever you want--my team currently calls it the Super Mega Stand Up. Review what you did since last time and what you plan to do until the next time. Talk about impediments to getting stuff done. Pay attention, and after the meeting, help each other remove the impediments. Don't solve problems here--save that for a follow-up ad hoc problem solving meeting. If this meetings lasts more than 15 minutes, you are wasting people's time, and your team isn't getting stuff done.

Ad hoc problem solving
Got a problem? Talk to each other and solve it now. That's right, talk to each other. Now. Don't send email, wait, and complain about not getting a response. Talk, together, in real time, now, face to face if you can. You made a commitment to your team to get stuff done. Remove the impediment now so you can keep your commitment.

Scrum of scrums
I have internal customers--my boss, his boss, the board of directors--and external customers--the people paying us to build app's for them. I hold regular scrums-of-scrums with them. I act as the scrum master for my teams, reporting what we did since last time, what we plan to do through next time, and our current impediments and plans for removing them. With my internal customers, this is a weekly one hour meeting. With my external customers, this is usually weekly, although it can be twice a week or daily, depending on the project. With external customers, the customer's project manager attends, and he sometimes brings his boss or his team members with him. External scrums-of-scrums usually last up to 30 minutes.

One-on-one meet-up
You need to speak privately with your team members to see how they feel, make sure they are motivated, and make sure they understand the team's short term and long term goals. How's the family? How's the dog? How is the project going? Is anything blocking you from getting stuff done? Are there any conflicts with other team members or stakeholders? Are you planning any vacation time? I hold a one-on-one meet-up with each team member for about 15 minutes, twice a month. Talk to each other in good times and in bad--if you only talk when something is going wrong, you're the bad guy.


G1 please insert disk

Jake attached the G1 to his Windows XP PC via the USB cable. Drive E: appeared in My Computer. He double-clicked E: and saw this message:
Please insert disk into E:
How could he copy files to or from the G1 if Windows wouldn't recognize the file system?

jedman has the answer:
Plug in the USB cable to your G1. USB connected notification is on top of your G1 home screen, scroll it down. Click on the "USB connected" notification. Click "Mount." Go to your computer and select "Removable Disk (G:)" to access your G1 SD card. :)


Firefox tabs broken

Lately, my Firefox 3.0.4 has been misbehaving. Whenever I press Ctrl-t to open a new tab, a window pops up in the bottom right corner, displaying this text:
Ubiquity Notification
An exception occurred while running (). TypeError: window.content is null
Here's a screen shot:

When I type a URL in the new tab's URL text box, the web page open's in the previous tab. When I Crtl-click to open a URL in a new tab, the new web page loads in the current tab.


My best fix is to completely uninstalled Firefox, delete my Firefox settings (folder C:\Documents and Settings\my-user-name\Local Settings\Application Data\Mozilla\Firefox), and reinstall Firefox. After that, everything is back to normal.


Activate G1 without G1 data plan

Update 2009-12-10: Read Activate G1 without Android data plan, redux for fresh information.

The problem: You got your new T-Mobile G1, you already have a $19.99/month Total Internet data plan for yourself and a Family Time Unlimited Messages plan for the family. You don't need or want the new $24.99/month T-Mobile G1 Unlimited Web data plan, but it seems like you can't activate your new G1 without the special G1 data plan.

The solution: With one settings change, you can activate your G1 with the Total Internet data plan. Here's how.

Remove the battery cover and insert your SIM. Snap everything back together and power the phone on. Wait for the boot screens to disappear, and "touch the android to begin." Wait a moment, and the carrier connection signal bars appear; I see 3 of 4 or 4 of 4 bars in my house. Wait another moment, and EDGE data connection icon appears. Wait another moment, and the 3G icon appears, obscuring the EDGE icon. We are up and running with a good data connection, looking at the Setting up your T-Mobile G1 screen.

Press the MENU button, and the APN settings button appears. Tap it, and the APNs screen appears. Scroll to T-Mobile US and tap it. On the Edit access point screen, tap APN. Change the APN from epc.tmobile.com to internet2.voicestream.com wap.voicestream.com [updated 2009-04-24, thanks to the comment from chris]. Click the back button twice to return to the Setting up your T-Mobile G1 screen.

Tap Next. Scroll down to the Already have an account? section and tap Sign in. On the Welcome to T-Mobile G1 screen, type your Google username and password and tap Sign in. Wait a moment, and the next screen appears: Your Google account is now linked to this phone. Success! Tap Finish setup, and you're done. (Thanks to cash743 at modmyGphone for the clues.)

How fast is T-Mobile's 3G network on the G1? Let's find out. On the home screen, tap the browser. Type http://www.dslreports.com/mspeed into the address box and press the Enter key. Tap 100k and wait. The speed test reports that the download was too fast to take a measurement. Tap choose a larger file, and then 1MB. My result: 589 kbit/sec, 0.71s latency, 14.399s d/l time. Wow, that's fast!

Now configure your WiFi connection. Press the MENU button. Tap Settings, Wireless controls, Wi-Fi. The Wi-Fi check box turns green. Tap Wi-Fi settings, and the list of Wi-Fi networks appears. Tap your network. Type your key and tap Connect. Press the Home button, and you're done.

Have fun with your new G1.


Qué tipo

What's your type? Are you a thinker or a feeler? Practical or idealist? A sensor or an intuitor? Typealyzer lets you know.

Typealizer scans your blog and infers a subset of your Myers-Briggs Type Indicator. Typealizer says I am on the ST side of things--a practical, Sensing, Thinking kind of person. I say he's right on.

Thanks to gHacks for the pointer.


Remember the Milk vs Todoist

The first time I tried Remember the Milk, I didn't get it. I was transitioning from a simple Outlook style to do list: a single list of tasks, a high-medium-low priority and a due date for each task. The Remember the Milk UI was too complex, and it wasn't obvious to this dolt how to do something as simple as setting a task's due date. I might not have had JavaScript enabled in my web browser, which certainly didn't help. Frustrated, I settled on the simpler Todist.

I like Todoist's simplicity. I organize my to do list in multiple categories, and each item has a due date. I don't bother with task priorities. I use indenting to group sub-items together.

Todoist's biggest problem is its mobile presentation. This is a Big Deal to me. Moving from Pocket PC to iPhone, I needed a mobile to do list. Todoist works on iPhone's web browser, but it is subpar. The task names are too small to read unless you zoom in, but when you zoom in, you have to do too much horizontal scrolling.

Remember the Milk announced a new native iPhone app, so I tried it again. This time I got it, and I like it, even without the native iPhone app. Oh, that makes sense now: each task has an info square on the right, and that's where you set the due date. You can annotate your tasks with notes, URLs, and other task information, an improvement over Todoist. It has Google Gears support so my to do list is available when my PC is disconnected. The mobile web adaptation is crude, but way better than Todoist: it is completely usable on both the web and on the mobile web.

I moved my to do list from Todoist to Remember the Milk, and so far I'm happy with it.


Take a cheap PC

Need a cheap PC? I have a few to spare:

If you want one, let me know. I will not ship these, so you'll probably live near Boston and make a pickup yourself.

(Thanks to the Blog Doctor for the tip on how to insert a Google Spreadsheet into a blog entry.)


Early stage mobile companies

Last night's MoMoBoston event was an introduction to ten early stage mobile companies. Here are some of the highlights.

David Reich presented AssuredLabor.com. AssuredLabor has a great idea: I need something done around my house, and you want the job. AssuredLabor introduces us via text message, and we're all happy.

Brad Rosen presented Drync. Drync is a mobile wine cellar and tasting diary. You can search for wines by name or photo, research wines, record your tasting notes, and buy wine, all while sitting at your table in a restaurant.

Keith Irskine presented Padpaw. Padpaw makes mobile group messaging easy.

Ponger presented their mobile price comparison shopping companion. One of the interesting technology pieces is image recognition: snap a photo of the product, and they will tell you all about the product. This is a great improvement on the usual UI experience, where you have to type the product's UPC or ISBN.

Jason Jacobs presented RunKeeper. RunKeeper is an iPhone app tracks your running and cycling training, including location tracking for your training routes. It's great to see Jason succeed.

Dan Grover presented Wonder Warp's Shovebox. Dave seems like a great guy with well built tools that solve the simple problems that need solving.

Guiseppe Taibi of SmartWorlds didn't present, but he and I caught up and chatted about some of his exciting new iPhone app's.


Find your lost iPhone

If you want to find your iPhone if it is lost or stolen, then iLocalis is for you. The iLocalis app runs in the background and periodically transmits your phone's location to the iLocalis server. If you lose your phone, you can find its location on a map, send a message to the person holding your phone, or make the phone call you so you can listen in on whomever has it.

Watch this video to learn how to install and register iLocalis. After installing it, change the Location services update rate setting to Every 60 minutes to decrease the drain on your battery. If you lose your phone, log in to the iLocalis web site and click Your iPhone. iLocalis shows you a map of your phone's current location, as well as links to its recent past locations.

Privacy concerns aside, it's fun to use the phone as a tracking device and trace your path throughought the day, and it's valuable to be able to locate your phone if you lose it.

This is an excellent tool. Don't forget to donate to Antonio to keep your iLocalis running after the initial free trial.


PDF Split and Merge

Typing a long Java command line to merge PDFs together is a drag. PDF Split and Merge is a cross-platform tool that makes it easy to do the same thing. Here is a screen shot of PDF Split and Merge in action:


iPhone App Store app's don't work

The problem: All of the App Store app's on iPhone stopped working. You tap any App Store app's icon on the home screen, the app's splash screen appears, and a few seconds later the home screen reappears. Bah! Life without iBowl! You are ruined!

Half a fix: Install, update, or remove any App Store app. The App Store asks you to log in again. After you type your password and the App Store manager takes care of its business, everything is back to normal.

The cause: If you haven't associated your PC's iTunes installation with your iTunes account, then whenever you sync your iPhone with iTunes, your iTunes deauthorizes your App Store app's. This can happen if you have never made the association, and it also seems to happen if you reinstall or upgrade iTunes on your PC.

The fix: Run iTunes on your PC. Click Store / Authorize Computer. Sync your iPhone with iTunes, and everything is good again.

Thanks to Ken Loh for the clue.


iPhone top

Know what's running on your iPhone by installing top and watching processes consume CPU and memory. To install top, run Cydia. Search for the top package, select it, and install it. To run top, run MobileTerminal or ssh into your iPhone and type top at the shell prompt:
richard@richard ~
$ ssh mobile@
mobile@'s password:
jealkb:~ mobile$ top
You'll see output like this:
Processes: 27 total, 1 running, 26 sleeping... 97 threads 09:53:41
Load Avg: 0.37, 0.40, 0.33 CPU usage: 5.45% user, 3.64% sys, 90.91% idle
SharedLibs: num = 0, resident = 0 code, 0 data, 0 linkedit.
MemRegions: num = 3304, resident = 42M + 0 private, 21M shared.
PhysMem: 24M wired, 13M active, 5196K inactive, 42M used, 12M free.
VM: 710M + 0 39425(0) pageins, 49(0) pageouts

291 top 9.9% 0:00.72 1 17 52 436K 856K 1208K 12M
288 bash 0.0% 0:00.17 1 13 55 412K 1632K 1600K 13M
287 sshd 0.0% 0:01.06 1 14 37 376K 1664K 1456K 13M
243 bash 0.0% 0:00.19 1 13 55 380K 1632K 712K 13M
234 sshd 0.0% 0:00.80 1 14 37 376K 1664K 416K 13M
210 bash 0.0% 0:00.18 1 13 56 352K 1632K 696K 13M
209 bash 0.0% 0:00.19 1 13 56 352K 1632K 696K 13M
208 bash 0.0% 0:00.19 1 13 56 352K 1632K 696K 13M
207 bash 0.0% 0:00.28 1 13 56 372K 1632K 700K 13M
206 Terminal 0.0% 0:08.91 7 166 267 6340K 8244K 8212K 69M
179 MobilePhon 0.0% 0:16.94 2 99 249 6420K 6824K 7272K 66M
72 MobileMusi 0.0% 0:21.79 6 111 265 5948K 6768K 6152K 69M
64 SCHelper 0.0% 0:02.48 3 41 76 592K 1336K 672K 14M
30 BTServer 0.0% 0:02.31 2 81 95 964K 1644K 1056K 27M
29 CommCenter 0.0% 0:23.48 9 105 122 1304K 1508K 2612K 20M
26 SpringBoar 0.0% 6:29.04 15 306 715 9188K 8336K 12M 85M
25 fairplayd 0.0% 0:00.96 1 31 66 560K 1336K 576K 15M
24 iapd 0.0% 0:10.16 7 109 163 1432K 3312K 1500K 29M
22 mediaserve 0.0% 12:48.68 11 208 243 2104K 1820K 2600K 40M
21 lockdownd 0.0% 0:07.93 3 64 100 1012K 1652K 1116K 26M
20 update 0.0% 0:04.52 1 13 42 220K 624K 240K 11M
18 iLocalisd 0.0% 0:19.39 5 85 154 1596K 6572K 1744K 60M
15 configd 0.0% 1:22.70 5 160 125 1004K 1548K 1272K 16M
14 syslogd 0.0% 0:13.23 4 37 35 212K 248K 320K 13M
13 notifyd 0.0% 0:06.78 2 315 27 240K 248K 276K 12M
12 mDNSRespon 0.0% 0:08.84 2 46 65 584K 1324K 812K 14M
1 launchd 0.0% 0:09.40 3 80 35 276K 248K 392K 12M
For more information, type top -- at the shell prompt, or type ? within top.


Upgrade unlocked iPhone to 2.1

So, you want to upgrade your unlocked iPhone firmware from 1.1.4 to 2.1, but you're afraid you won't be able to use it on T-Mobile afterward? You've been putting it off because you didn't want to lose your contacts, calendar, and important settings? You feel left out because Cydia tells you your firmware is too old, and you can't install app's from the App Store? Me too, until this weekend. Here's how I upgraded.

Take inventory
First, take inventory of the app's you have installed through Cydia. There are at least three good ways to do this. The first way is to ssh into your iPhone and run dpkg:
kasper@fred ~
$ ssh root@ dpkg -l > iphone-dpkg-l.txt
root@'s password:
kasper@fred ~$ head iphone-dpkg-l.txt
| Status=Not/Installed/Config-files/Unpacked/Failed-config/Half-installed
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Name Version Description
ii adv-cmds 118-7 finger, fingerd, last, lsvfs, md, ps
ii apt advanced packaging tool from Debian
ii base 1-9 underlying system directory structure
ii bash 3.2-14 the best shell ever, written by Brian Fox
ii be.kam.mybattery 1.1 Detailed info on the iPhone Battery and Blue
kasper@fred ~$
Another way is to take inventory is make a list of app icons on the SpringBoard. Here's my list:
A third way is to run Cydia and Installer and make a list of the app's that they say they are managing.

Next, I made a backup of my contacts. It's easy to configure iTunes to sync contacts with Google Contacts. In iTunes, on your device's Info tab, in the Contacts section, check Sync contacts with and select Google Contacts. A window appears, asking you to agree to Apple's terms. Then iTunes asks for your GMail username and password. Type your full GMail email address, and click through. Your iPhone begins syncing. One or two more windows appears, asking whether you're sure you want to do this; tell iTunes it's OK. Wait a few minutes. When it's done syncing, check your Google Contacts. My Google Contacts contained all my iPhone contacts, including many duplicates. This might be an iPhone/iTunes/Google Contacts sync bug, or it might be an artifact from my initial sync from GooSync through Funambol. Delete duplicates in Google Calendar, and you're all set.

Backing up your notes is easier: send each one to yourself via email.

Upgrade firmware
In iTunes, on your device's Summary tab, in the Version section, click Update. I previously let iTunes download firmware 2.1, but I didn't install it. iTunes attempts to make its own backup of your contacts, calendar, and so on, but then complains that it can't--this is a consequence of your having previously jailbreaked the iPhone. Wait a few minutes while iTunes installs firmware 2.1. iTunes reports that it's done, and the phone reboots. iTunes notices the iPhone and reports that an incompatible SIM is installed.

Jailbreak and unlock
Download QuickPwn 2.1-1 and the two bootloader files from iPhone Hacks. Install and run QuickPwn. If QuickPwn complains that it doesn't notice a connected iPhone, press the phone's Home button to wake it up. The iTunes window disappears. In QuickPwn, on the Browse for firmware screen, find your firmware and click the arrow to continue. On the Select settings screen, select everything and click the arrow to continue. On the Bootloaders required screen, fill in the blanks and click the arrow to continue. On the Preparing to Pwn screen, make sure your iPhone is connected by USB and click the arrow to continue.

On the Ready to Pwn screen, pay attention! Follow QuickPwn's instructions carefully. On my first pass through the instructions, I was careless, and QuickPwn made me try again. On my second try, I didn't get the timing quite right, but it worked anyway. The Downloading Jailbreak Data... screen appears on your iPhone, and the phone eventually reboots with Pwnapple logo. Follow the final bootloader instructions on iPhone screen--basically, don't touch the iPhone until it's done. The phone eventually reboots again with Pwnapple logo. The mobile carrier's name on my phone is T-Mobile. Looks like it worked.

Clean, configure, restore
One annoyance of running the iPhone on T-Mobile is that every time you boot the phone, the voicemail red dot indicator is on. Call your voicemail box, and the the red dot disappears.

Next, enable your data connections. Connect to your WiFi network the usual way, by selecting your access point's name and entering the password. Connect to T-Mobile's EDGE network by specifying wap.voicestream.com as your APN, and leave Username and Password empty.

Run iTunes. Tell iTunes that it's a new iPhone. Tell iTunes to sinc your contacts with Google Contacts again, to sync your calendars with none, and to sync your bookmarks with Safari. Agree to use Google Contacts again, and sync begins. When it's done, notice that all your contacts have been reinstalled on your phone. Also notice that none of your old Safari bookmarks are there. That's annoying, but you'll live.

Back in iTunes, change whatever other sync settings you want, like music, photos, and podcasts. Wait while it syncs, and be happy with the result.

Run Cydia. Cydia asks me what kind of person you are; I say Hacker. Tell Cydia it's OK to upgrade essentials. Cydia upgrades and restarts itself. Then Cydia tells you there's something else to upgrade; let him do it. On the Cydia home page, tap User Guides, read the OpenSSH Access How-To, scroll down, and follow the instructions to change your passwords for the root and mobile users.

Restore ringtones the usual way.

Install new app's from Cydia, Installer, and App Store. Here are some of my current favorites:

From Cydia:
From the App Store:
  • MLB.com
  • Translator
  • FS5 Hockey
  • Shazam
  • Spore LE
I'll miss my old free favorites, Tap Tap Revenge and Fring, which used to be free through Cydia and Installer, but now cost money through the App Store.


My view, your view

We watched the Rev's play to a 0-0 draw last night in the first leg of a home-away playoff against Chicago. The match was entertaining, and it was great to see the ref yellow-card Blanco for dissent.

My view at the stadium was partly obscured by a TV camera crane. Your view at home was a little better. (Thanks for the photo, Todd.)


Fix ThinkPad T43 WiFi connection

My ThinkPad T43's wireless network connection stopped working. I'm not sure why, but I'm not the first person to have this kind of problem--Regular Joe had a similar problem. His solution didn't work for me, but he offered a good clue that ThinkVantage Access Connections was the culprit.

Here's how I fixed my problem. In Control Panel / Network Connections, click Change settings of this connection. In the Wireless Networks tab, check Use Windows to configure my wireless network settings. Windows immediately noticed that I was in range of my wireless network, and the rest was obvious.

After my first Windows XP reboot, ThinkVantage Access Connections tried to take over again. For good measure, I uninstalled it, and now everything is stable. I am not using ThinkVantage Access Connections any more, but my WiFi works, and that's all that matters.


Remove ThinkPad Rescue and Recovery

My ThinkPad T43 went blue screen of death so frequently that I labeled it trash. After a while, I smartened up and read the blue screen before it disappeared. The clue: ibmfilter.sys. According to Lenovo support, old versions of ThinkPad Rescue and Recovery contain a broken ibmfilter.sys. I uninstalled Rescue and Recovery, and so far BSODs are less frequent.


Boston Flash Lite Technology Day

I attended the Boston Flash Lite Technology Day today at the Nokia Research Center in Cambridge.

Developing Flash Content with Adobe Creative Suite (aka Flash Lite Overview)
  • Presented by James Talbot of Adobe
  • Advantage of Flash Lite: you can build app's more quickly than with other technologies
  • Demos: YouTube search & play; a game. When the demo doesn't work, "blame it on the network." -Alessandro
  • 800 million Flash devices shipped to date; 1 billion Flash devices projected for 2009
  • Flash Lite is a Flash player optimized for non-PC devices; pre-installed; app's, wallpapers, screensavers; has access to device state info; has video, audio, bitmap support; enables dynamic content,access to XML data (including an XML socket that stays open between player and server for faster request/response), access RSS feeds; 4 versions of Flash Lite
  • Versions: 1.1, 2.0, 2.1, 3.0. Upward compatible from 1.1 to 3.0. Makes it easy to play video from Flash Media Server.
  • No OTA distribution of Flash Lite player on Nokia devices. User must proactively find and download updates. (On BREW, Flash Lite is delivered OTA.) ~0.5mbytes for OTA delivery. Ideal: when end user downloads an app, thep player would come with it.
  • (It seems like everyone in the room is reading stock market news and looking at graphs of the stock market plunge. And that everyone has an iPhone.)
  • Nokia device support: 94 total; 49 S60 phones , 45 S40 phones
  • Use Adobe Creative Suite to build app's: PhotoShop, Fireworks, Illustrator -> Flash tool to create .swf file -> test in the Flash player and on emulated devices in Device Central (the Flash Lite dev and test tool for Creative Sutie) -> deploy in the wild.
  • Device Central includes numerous device profiles, which are easy to update.
  • Discussion about need for better UI and a developer community focused on tools and UI widgets.
I chatted with Anthony Hand, mobile UI designer and a friend from MobileCampBoston.

Flash Lite Tips and Tricks
  • Presented by Alessandro Pace, a Forum Nokia Champion
  • Nokia & Flash Lite content types: S60 (standalone, screensaver, browser), S40 (all those + wallpaper)
  • Do most of the work in the Flash IDE + Device Central emulator
  • Remote Device Access (RDA): S60/S40 Nokia device testing for free via a service like Device Anywhere. I got excited about this and spent most of the rest of this presentation trying it.
  • Optimize graphics to save memory.
  • To save memory, create a master SWF file that load other SWFs.
  • Use WURFL .
  • Use Nokia's tool for OMA DRM.
  • Use Flash video instead of the device's native video player so you can add UI elements and rotate the video.
David Brown of AgencyNet gave a demo of his company's Bacardi mobile app, implemented in Flash Lite, running on an N95. It included themes, animation, and video.

Introduction to Forum Nokia (aka Partership Opportunities)
  • Presented by Ganesh Sivaraman, Internet and Web 2.0 Business Development Manager
  • Over half of smartphone owners have used or purchased a download app.
Flash Lite Video on Nokia Devices
  • Presented by James Talbot
  • Two ways of delivering : device video player or Flash video files (FLVs, rendered directly by the video codec--Sorenson or On2).
  • Availabe in Flash Lite 2 or better.
  • System.Capabilites object has properties decribing the capabilities of the device: hasEmbeddedVideo, hasStreamingVideo, videoMIMETypes
  • ActionScript video class allows play, pause, stop, resume, close
  • video.play("file.3pg")
  • video.play("http://example.com/file.3pg")
  • Flash Media Server can detect network and device capabilities and stream the right video to the device. (True?)
  • Use Adobe Media encoder to produce videos in the codec you want.
  • You can host your video as an HTTP progressive download, but it won't scale well. For good performance, use streaming video and the Flash Media Server. Video starts playing faster. Streaming uses less device memory. Video can be secured. Better network usage. Automatically detect bandwidth. Track, log, and report on video use.
  • Flash Lite limitations: only one way communication from the server to the client; only supports RTMP; cannot record video;
  • Use lower frame rate for mobile devices due to bandwidth and CPU limitations.
I pulled an espresso from Nokia's Starbucks Barista. Yum!

Programming Advanced Nokia Features with Flash Lite
  • Presented by Scott Janousek, a Forum Nokia Champion
  • Founder/Tech Director at Hooken Mobile
  • Home brewer
  • Flash Lite strengths; media capabliites, cross platform/portability across devices, extensive toolset (Adobe CS4, adobe Device Central)
  • Weaknesses; performanc eon low end devices, fragmentation
  • On S60, Flash Lite offers advanced features without much developer experience required.
  • Flash Lite + 3rd party software extender: answer to native Symbian development challenges
  • 3rd party products: KuneryLite, SWF2go, Janus, Flyer
  • Extending Flash Lite pros: additional functionality, access to low level device APis, don't have to learn Symbian S60 programming, saves dev time. Cons: fragmentation outside of S60, etc.
  • KuneriLite: a rapid application development toolkit for Flash Lite
  • Flash Lite <--> Kuneri Lite <--> S60
  • Fast, powerful, transparent to end user, 12 plug ins, easy packaging as .sis file, good device emulator, nice dev wizard takes you step by step through building an app.
  • Plug-ins: accelerometer, camera, connect (text/binary via Bluetooth), DTMF, file, GPS, protect (SWF security protection), ringtone, rotate, system (launch app's from your app), timer (for expiring use free trials), upload/download (via HTTP)
  • 3 licenses; free dev version, pro (non commercial), commercial ($99 per app)
  • Nokia to add extensions: camera, messaging, landmarks, location, contacts, calendar, logging, application manager, system info, sensors, etc.
Flash Lite and Widget programming
  • Presented by Rob Toole , Fidelity Investments
  • Why widgets? Native web browser isn't usable enough. Make it easy to find most relevant content quickly. One click access--no scrolling or typing.
  • Package as .wgz file, a zip file, for distribution and installation.
  • Distribution: Upload your app to MOSH for instant distribution.

Between session chat: DeviceAtlas is a cleaned up WURFL.

Flash Lite for Real App's
  • Presented by Ira Hochman, CTO of Untravel Media
  • The Flash player recognizes device rotation. It automatically rotates the UI and scales UI elements to the proper aspect.
  • Porting is easy.
  • Flash might not be a good target platform in the US because there aren't enough US Nokia users.
  • He believes Flash Lite solves device fragmentation.
A Flash Lite success story (not the actual title)
  • Presented by Rob Toole, Fidelity
My thoughts
Flash Lite is like Java ME, with some of the same characteristics and problems. Its fragmentation is or will be similar to Java's, and looks like it may exactly mimic Java's fragmentation as Nokia introduces custom APIs. The Adobe developer suite looks like a better dev tool set than Java's tools (although NetBeans seems vey good). It is not supported on as many devices as Java.


Don't get cooked by your phone

Beware! You can get cooked by your phone! Of course it's true--haven't you seen the videos of people popping corn or cooking eggs using a few cell phones? If a mobile phone can pop corn or boil an egg, imagine what it's doing to your brain!

But can you really pop corn or boil an egg with mobile phones?

Here's a little thought experiment. My microwave oven at home is a Frigidaire PLMV168KC3. According to the label inside the cooking chamber, it emits 1.58 KW. When I put a single corn kernel on the cooking tray and run the oven at high power for 5 minutes, nothing happens to the kernel. When I put 4 kernels in a tea cup covered with a plate and run the oven at high power, one kernel pops in about 3 minutes.

Mobile phones and microwave ovens both operate in the microwave frequency spectrum. Phones transmit omnidirectionally because the cell tower could be in any direction; the magnetron in an oven only transmits toward the floor of the cooking chamber. Contemporary mobile phones transmit at a maximum of 2 W; my oven transmits at 1,580 W. If you could get 790 phones transmitting at 2 W simultaneously, place some corn kernels in an enclosed container in the center of them, and surround the system with a microwave reflector, you might be able to pop some corn in a few minutes. As long as the phones didn't absorb the microwave energy themselves. Which they would. So it's just not practical to cook with mobile phones.

(Please correct if I am abusing power units, misunderstanding transmission and absorption, or misunderstanding anything else.)


W3C Mobile Web Best Practices

W3C recently published Mobile Web Best Practices, a set of guidelines for mobile web developers. Many of these guidelines are also applicable to downloadable mobile applications. Here are some key notes:
  • Test on as many real devices as possible. Testing in emulators is unacceptable.
  • Keep URIs short. It is difficult to type long URIs on a phone's 12-key keypad.
  • Make URI deliver similar content regardless of the browser.
  • Minimize the amount of navigation links at the top of a page. Use bottom navigation links instead. Screens are small, so don't waste it with navigation links instead of content. Data connections are slow, so don't make people wait for their content.
  • Try to keep content reachable within four request/response transactions.
  • If a link navigates to content that is large, let the user know before he clicks. Data connections are slow and screens are small--maybe the user doesn't want that content right now.
  • Don't auto-refresh a page unless the user can toggle it off.
  • Use server redirects instead of markup redirects. Data connections are slow, so don't make the mobile browser download a page only to be redirected to another page.
  • Keep total page size <= 10 to 20 kbytes for the Default Delivery Context.
  • It's OK for a page to scrool vertically or horizontally, but not both. The screen is small, and it's easy for the user to become disoriented with too much scrolling.
  • Use care with colors; devices often have crappy displays and it's difficult to distinguish colors.
  • Don't use frames. They might not be supported, or the might not be rendered where you expect them.
  • Avoid tables, and especially tables with fixed sizes that won't render well on different screen sizes.
  • Use ALT tags for images. Make pages usable in no-image mode.
  • Use style sheets for presentation control.
  • Don't send content the device can't render.
  • Don't rely on cookies.
  • Allow caching where possible.
  • Avoid text entry. Prefer multiple choice selection.
Also see W3C's Device Independence Principles for more good ideas.


Saeco Nina

We've had a Saeco Nina at the office for a few months. After a lot of trial and error, we think we finally figured out how to get the best cup of coffee from it. Here are our tips.

We usually buy the Starbucks Espresso Roast. We don't necessarily prefer Starbucks or this particular blend and roast, but Starbucks is the nearest bean seller to our office, so it's very convenient and good enough. At our Starbucks, we ask them to set the mill to number 4; the grind is just a little bit coarser than a true espresso grind, and just right for the Nina. We store the coffee in jars rather than in the bag, and we store the jars at room temperature.

We use the rubber gasket, we don't tamp, and we don't use the nipple. This machine pressurizes the coffee with the assistance of the rubber gasket, so we don't need to tamp. We scoop a heaping spoonful of coffee into the filter, and we tap the basket on the table to level the coffee in the filter before screwing the basket onto the pump head. We removed the nipple that directs the coffee to the two spouts--we find that the nipple obliterates our crema and makes the coffee too bitter. We programmed the Nina to pour the right amount for our cute little cups.

We clean the basket and filter at least once a week with Cafiza, and we scrub the filter with a stiff brush.

We love our daily espresso.


Spooler subsystem app has encountered a problem and needs to close

After installing Windows XP SP3 on one of my PCs, the print spooler stopped working. After logging in, error message windows with text like this appeared:
Spooler subsystem app has encountered a problem and needs to close.
I couldn't start the print spooler service, and I couldn't even run Gimp to take screen shots of the error message windows.

Following Microsoft's instructions, I uninstalled all the printer drivers, and the problem was solved. Then I uninstalled and reinstalled the printer drivers I care about (HP Universal Print Driver and PDFCreator), and everything was back to normal.


Real guitars are for old people

I like to observe how people use technology. I watch my family, friends, coworkers, and strangers to see how they use their gadgets in public and private places. Young people and old people use technology differently from each other; mentally cataloging these differences has become a hobby.

When I use the terms "old people" and "young people", I don't mean a particular age group. I do have particular ages in mind: a "young" person is more likely to be a 14 year old, and an old person is more likely to be a 48 year old, but what I'm really trying to convey is a person's style. An old person is stodgy, resistant to change, and inexperienced with newer technology. A young person grew up with a laptop PC, a cell phone, and a DVR, and has plenty of spare time to try new things.

Here are some of my observations and stereotypes:
  • Old people print web pages and carry paper around to show others. Young people just Google it and walk away contented.
  • Old people leave voice mail. Young people don't listen to it.
  • Old people use email. Young people use IM and text messages. (Old people say SMS instead of text message.)
  • Young people read manga and graphic novels. Old people think they are too old for comics.
  • Old people print driving directions. Young people don't drive. Young people who are old enough to drive use the directions on their phone.
  • Young people watch feature films on their iPods. Old people wonder why you'd want to watch a movie on such a small screen.
  • Old people listen to music on their phones. Young people use their iPods because their phones aren't good music players.
  • Old people buy music from iTunes or on CDs. Young people borrow a friend's iPod.
  • Old people wait for the latest sports scores on ESPN or the TV news. Young people look up the latest scores and info on espn.com.
  • Young people read RSS feeds. Old people read the tree killer edition of the newspaper.
  • Young people share to an embarrassing degree on FaceBook. Old people are more careful.
  • Old people play guitar. Young people appropriate, repurpose, and mash up. As Cartman says, "real guitars are for old people."


Traffic signal control

Walking through Porter Square yesterday, we found this open traffic signal control box.

Here is a closer look at the signal controls.

The door to the control switches appears to be "locked" only by this screw-latch.


Firefox upgrade day

Today is Firefox Upgrade Day in my office. I postponed upgrading Firefox from 2.0 to 3.0 because I wanted to make sure my favorite add-ons had caught up to 3.0. The add-ons I care about are: Firefox 3.0 installed itself over Firefox 2.0. The old installs of Adblock Plus, Google Gears, and NoScript already were compatible with 3.0, so those were all set. Firefox found and installed an updated release of Google Toolbar for Firefox, leaving me to take care of Google Browser Sync and Google Web Accelerator.

Downloading and installing Google Web Accelerator seemed like a piece of cake, although it required a Windows reboot. Annoyingly, after going through the tedium of installing it, it is not compatible with Firefox 3.0.

The only add-on left to reinstall was Google Browser Sync. Unfortunately, the Google Browser Sync web page reads:
Google Browser Sync is no longer available for download. Instead, to get similar functionality, we suggest using Mozilla Weave, Google Toolbar for Firefox, or Foxmarks.

Mozilla Weave sounded interesting, so I visited its web page, only to find:

Thank you for the overwhelming response to Weave 0.2!

We've reached our account limit, and have stopped accepting any new registrations at this time.

We apologize for the delay. We will be experimenting with different solutions to scale the service, and will re-open registrations when we are confident that we can support more users. To be notified when registration re-opens, please subscribe to the Mozilla Labs mailing list and newsgroup.

If you already have an account and need the extension for another computer (or you run your own server), you can download it here

I don't already have an account, and I am not prepared to run my own server, so I installed Foxmarks as my last resort. It's not as good as Google Browser Sync was--it doesn't synchronize passwords and cookies--but it's good enough. On the bright side, MyFoxmarks works well on iPhone Safari.


Daily reading 2

Keep reading every day!

After getting started with the iPhone, I have been doing almost all of my daily reading mobile. Here is my current reading list:

Comics: I use Stripr to read the daily and weekly comics. Stripr makes it easy to find and read RSS feeds for your old favorites, and also makes it easy to discover new alternacomics that you won't see in print.

News: I am using Google Reader for all my news. Here is my current list of news-oriented feeds:


Peanut butter jelly time

Do I save money eating PB&J for lunch every day at the office, or am I just making myself miserable? I sometimes wonder about these things. Here is my analysis.

I often eat PB&J for lunch when I am at work. Local restaurants charge $5-8 for a reasonably tasty and filling meal. Over the course of a year (assume 45 weeks x 5 days/week x $6/day), that's a lot of money: $1350.

Here's the price breakdown on the daily PB&J ingredients:
  • I buy bread at the expensive corner store. The store is more of a vice store, making almost all their money on cigarettes and lottery tickets. I feel silly walking out with a loaf of whole grain bread. They charge $3.89 per loaf. Each loaf contains 16 slice, or eight sandwiches, for a price of $0.49 per sandwich.
  • I like plain old peanuts in my peanut butter. That means I buy the relatively expensive wholesome brands like Teddie at $2.69 per jar. According to the label, there are 14 servings per jar. I probably use more than that, so let's call it 9 sandwiches per jar, at $0.30 per sandwich.
  • As far as I can tell, jam is jam. I use the local grocery store brand at $3.79 per jar. The label tell me there are 45 servings per jar. As with the peanut butter, I probably use more than the typical amount, so let's call it 30 sandwiches per jar, at $0.13 per sandwich
My total price per sandwich is $0.92. I eat two PB&Js per day, so that's $1.84. The total price per year (5 days per week x 45 weeks/year x $1.84/day) is $414.

$1.84 for lunch is a good deal, and the annual savings of almost $1000 makes me feel great!

When I really have to eat out, best value is the samosa chole chat for $4.50 at Punjab Foods & Spices/Chai Cafe. It is as super delicious and filling as it is inexpensive. Yum!


MBTA insecurity

Anatomy of a Subway Hack is an interesting look at some of the MBTA's security problems, both physical and electronic. Here are some highlights:
Ryan, Anderson, and Chiesa deserve thanks for letting us know about these problems.


Spring Integration

Mark Fisher of SpringSource gave a talk on Spring Integration at Monday night's Boston Java Meetup. Mark has been with SpringSource for 2.5 years. He is a Spring committer and leads the Spring Integration project.

Spring Integration 1.0 is scheduled to be released in about 1.5 months. Spring Integration is an application of many of the ideas in the book Enterprise Integration Patterns and its related web site.

Mark began with an introduction to Spring. Fundamentally, Spring is an inversion of control (IoC) container, offering dependency injection, aspect oriented programming (AOP), and enterprise support libraries. It supports a POJO based programming model. He gave an overview of Spring features:
  • In Spring 2.5, you can use annotations instead of or in addition to the usual Spring XML configuration files.
  • @Autowired annotation
  • @Test annotation, the EasyMock library
  • AOP for transactions: uses the @Transactional annotation, delegates to the transactionManager that you wired in the XML config. Mark recommends using AOP for anything that's not in your business logic/problem domain, that you'll apply to numerous objects or methods. Doing so lets you focus on business logic.
  • JDBC templates, e.g. getSimpleJdbctemplate().query("select id, balance from account here customer_name=?", accountMapper, customer). In his example, he also uses a PramaterizedRowMapper. The advantage of the JDBC and other templates is that Spring handles the mundane set up work and exception handling for you.
  • JMS templates: Configuring a JMS listener is easy. They are a complete replacement for message-driven beans, and no EJB container required.
Some consequences of using Spring are that your domain model is simplified, layers enforce separation of concerns, and interface contracts promote loose coupling.

A meetup member asked why Spring uses AOP instead of @Interceptor. Mark replied that a problem with that approach is that you must annotate each method @Interceptor everywhere--you can't use AOP cut points defined by regular expressions, for example. He commented that it is still an open question whether EJB3's Interceptor approach is powerful enough

Enterprise integration patterns
Mark continued with an overview of enterprise integration patterns:
  • Pipes and filters architecture: conceptually, just like Unix pipes and filters
  • Message: send Messages through the pipeline. A Message is just a wrapper around a Java object.
  • Message channel: decouples producers from consumers. Can bepoint-to-point or publish/subsribe.
  • Channel adapter: connects a source to the messaging system. Can be anything, like a message bean, a web request, or a file system object.
  • Service activator: lets you invoke any POJO method without the service knowing that it's being using that way
  • Message translator: a payload transformer, converts the type or format of a message
  • Content enricher, content flter: add to or remove from message content
  • Content based router: determines the target channel based on payload type, property value, or header attribute. Decides where to send message. For example, the router might send a message to either the VIP service or the standard service based on importance of sender.
  • Splitter and aggregator
Spring Integration API
Following that, Mark presented the Spring Integration API. In a nutshell, Spring Integration implements enterprise integration patterns in Spring. The primary implementation points are:
  • interface MessageSource.receive: receives messages
  • interface MessageTarget.send: sends messages
  • interface MessageChannel.send, .receive
  • interface MessageHandler.handle
  • Message Bus: aware of components (hadlers, sources), connects them to channels, turns everyting on, runs a task scheduler, creates message end points, and ties them to channels
As a user of Spring Integration, you will specify things in your XML config file or via your annotation-based configuration, e.g. @Handler. You won't, for example, implement the MessageSource interface directly in your business code. This is consistent with Spring's theme: use domain objects everywhere; don't write any special messaging code.

Mark showed us some great demos and code examples, all of which are included in the Spring Integration distribution.

Additional features on the Spring Integration road map include:
  • Additional XML support, including XSLT transformations
  • Quartz scheduling
  • Support for additional channels, including RMI, email, and more


How to assemble the Shaker all in one loft bed

This is a pictorial guide to assembling the Shaker All in One Loft, sold in the Boston area at Bedrooms. This series of photos is my step by step disassembly, with the photos reversed for assembly.

At Bedrooms, the bed is called "Shaker All In One Loft Twin/Twin" and is item #2000. For cross reference, a label on the bed calls it the Innovations Model # 261 Shaker ALL IN ONE TWIN, from Hartford, CT.

This catalog image from Bedrooms shows the bed completely assembled in its model habitat:

Here are the step by step assembly photos:


Here is the simple command line I used to rename the photos and sort them from disassembly order to assembly order:
$ n=0; for f in `ls -1 *.JPG | sort -r`; do newname=${n}.jpg; if [ $n -lt 10 ]; then newname=0$newname; fi; mv $f $newname; n=$(($n+1)); done
My original photos were 8 megapixels each. To resize the images to 1024x768, I used ImageMagick and this simple command line:
$ for f in `echo 2008-07-13-jake-bed-disassembly/*.jpg`; do convert $f -resize 1024x768 2008-07-13-jake-bed-disassembly-1024x768/`basename $f`; done


Related Posts with Thumbnails