Dan Benjamin posted a screenshot of recent Twitter spammers, which willieabrams said:

Twitter needs a really good batch block/spam reporting tool for getting rid of these time wasters. It could be as simple as the Gmail interface.

While I don’t have the knowledge to write up a quick web-based service for doing this, it is fairly simple to accomplish in Terminal (on a Mac or any Unix-y environment):

#!/bin/sh

NAME=`basename $0`

for TWIT in $*
do

     BLOCKSTATUS=`curl -D - -s -u "YourTwitterName:YourTwitterPassword" \
    -d "" "http://twitter.com/blocks/create/$TWIT.xml"  |\
     egrep "^Status:" | awk '{print $2}'`

     if [ "$BLOCKSTATUS" = "200" ]
     then

            echo "$NAME: you have blocked $TWIT"

     else
            echo "$NAME: Error trying to block $TWIT. 
            Please check the username and try again. 
            (HTTP status code received: $BLOCKSTATUS)"
     fi     

done

Copy and paste into a text file, save it (twitter-batch-block.sh) to your ~/Desktop (or wherever, but for the purposes of this example), open Terminal.app and type:

sh ~/Desktop/twitter-batch-block.sh

And that should do it.

If you’d like to see who you are blocking on Twitter, I have a script for that too.

Any questions, feel free to ask me on Twitter.

I suppose the first response a lot of people will have is: “Um, doesn’t Twitter already send DMs as email?”

Yes. They do. If you go to the Twitter account notifications page, you can turn on “Direct Text Emails” (poor choice of words, by the way, these are Direct Messages not “Texts” which makes it sound like it is related to SMS notifications of Direct Messages, which is actually set under the Devices tab).

However…

DM Email Format 1.png Awhile ago Twitter changed from “plain text” Direct Messages to HTML. That isn’t so bad in-and-of itself, but they also changed the wording. If you use Gmail, you can no longer see the beginning of the message. Instead, you see something like this:

“Hi, Your Real Name,

You have a new direct message:

This is completely useless because the Subject of the Direct Message is now:

“Direct Message from [Their 'Real Name' On Twitter]“

So I already know that I have a new Direct Message.

Instead, I’d rather see as much of the message as possible.

My format uses:

1) From: line which shows their “Real Name” which is usually longer than the @name.

2) Subject: line “DM from @twittername” (as opposed to the Replies Via Email script which uses the message as the Subject: line. But this helps group DMs from the same person, which may be helpful to help you keep track of the conversation.

3) It also doesn’t include Follow/Block links, but does include a “Reply by DM” link.

Download: send-dms-as-email.sh

(Note: Updated 2009-07-26.)

1) Problem: Twitter will send you DMs (Direct Messages) via email, but not “Mentions”.

Solution: Use the Twitter API to fetch mentions.

2) Problem: Sometimes “@replies” come in and I have absolutely no idea what the person is replying to.

Solution: If a “mention” is actually an “@reply”, send the text of the original message

(Also: if you are mentioned in someone else’s @reply, you get to see the context of that conversation.)

3) Problem: Someone you do not know may @reply/mention you, and you don’t know anything about them.

Solution: Include their Twitter icon, Follower/Friends/Post Count, as well as the Bio, Location, and URL (if the latter have not been filled in, they will be blank). Drawbacks: Images are stored on Amazon’s servers. If the user changes his/her image later, the old version is deleted, and the image will not render.

The actual text of the Mention is sent in the Subject of the email. This avoids accidental “grouping” of messages in Gmail with unrelated messages, and also maximizes the possibility that you will be able to read the message in Gmail without having to actually open it.

Since Twitter messages are capped at 140 characters, we know they won’t be too long to be displayed either in Gmail or on the iPhone (the only two mail clients I’m worried about)

Notes: emails are sent from a specific email address (so I can filter off that) although the From: line will show the Full Name and Screen Name of the person who sent the message.

Here’s what the results look like in Gmail (list):

At Reply Gmail List.png

Here’s what an Individual Message looks like in Gmail:

lindstifa at reply.png

Same Message on the iPhone:

photo.jpg

Note the From: line shows the @Name first, since that is more likely to fit (and I tend to know the @Name more often than the real name).

The “In Reply To” is the message that she was responding to (from me).

The “Bio/URL/Where” are at the bottom, because those may not be filled out at all.

How?

So how is this accomplished?

As with most things, a shell script, which I have un-creatively called: send-mentions-as-email.sh

The shell script uses ‘curl’ to interact with Twitter, and expects your Twitter login and password to be in a file ~/.netrc which should be a plain text file with this line in it:

machine twitter.com login LUOMAT password FISHFOOD

change ‘luomat’ to your Twittername (without the @) and change FISHFOOD to your Twitter password. (Be sure to do “chmod 600 ~/.netrc” when you are done.

The script is designed to be called by cron every X number of minutes. Note: every time the script is executed, it costs one “Twitter API hit”. You get 150 of these per hour as of 2009-07-19. That number has been 100 and may be raised or lowered at any time. If you only use Twitter via the website, then you don’t need to worry about running out of API hits, as the website doesn’t count against them.

However, if you use a client such as Tweetie, Twitterrific, TwitterBerry, or TweetDeck, either on your computer/iPhone/Blackberry, then you do need to make sure that you don’t run out. I suggest running this script no more than every 5 minutes. The script will check for the latest 20 “mentions” each time it runs. Few people will get more than 20 in 5 minutes.

If all of this sounds like a foreign language to you, this is probably not the program for you. I’m not able to provide technical support for it, so if you do want to try it out, you’re on you’re own.

Download: send-mentions-as-email.sh

(Note: If you want to share this link, you can use the short URL http://luo.ma/64.)

Updated

A few tweaks since the initial version:

  1. Fixed ’source’ line to only try to read file if it is found
  2. Now uses doesfollow to report if the person who sent the @reply is someone who follows you, and if you follow them. This is useful for #4 below.
  3. Made several items into variables to make it easier to update the plain text and HTML versions of the emails
  4. Added links to Twitter.com to Reply (with proper “in_reply_to” linking), or DM (which is one reason to use ‘doesfollow.sh’ above), or block, or report someone as a spammer via DM or @reply.
  5. EXPERIMENTAL: Added links to reply on the iPhone using Tweetie or Twitterrific (Twitterrific support is spotty, it appears to open the app but not start the @reply.) NOTE: replies sent this way will not have the proper “in reply to” set.
  6. Pipe “Real Name” and message through “lynx” to attempt to get a more clear message (this will avoid seeing " and other HTML entities, especially for people who like to use extended characters to make their names appear upside down, etc.)

The Link

If you want to post a short link to this page, please use http://luo.ma/46

Jump to The List

FAQ

Q: “What is this?”

A: It’s a list of people who are on Twitter who are also on Tumblr.

Q: “Everyone?”

A: No, of course not everyone, you ninny. Just people who asked to be added.

Q: “But you already know my Twitter and Tumblr, why didn’t you just add me?”

A: It’s 100% opt-in. You have to ask to be added. This isn’t meant to be exclusive, this is meant to honor the requests of some folks who prefer to keep their online “identities” separate. Better to err on the side of caution, IMP.

Q: “Can I reblog this?”

a) If you want to post this to your Tumblr, please post it as a LINK pointing to this page, rather than reblogging the entire page. Why? Because that way if someone finds it later, it will not be out of date.

b) Reblogging it will not get you added to the list.

Q: Why is (isn’t) the alphabetized? Why are entries at the bottom not alphabetized? Why are some out of order?

A: It grew unwieldy and it was easier to catch duplicates when alphabetized. Newer entries might not be alphabetized at the top of the list but will be the next time I do a full refresh.

Q: Why doesn’t my picture show up?

A: You probably changed your Twitter icon since I posted the list. If you let me know that happened I can fix it.

Q: Why isn’t this list on Tumblr?

A: For some reason Tumblr wasn’t able to handle the list after it grew to a certain size and it would only display a blank page. I got tired of trying to figure out why, when there seemed to be no rhyme or reason. As Han would say, “It’s not my fault.”

The List

In addition to their personal Tumblrs, don’t miss LowResolutionTheatre (by @Tony_D & @ange_black) and Jesus and Judas (by @aedison).

Twitter IconTwitter Name
Tumblr URL(s)
@abigvictory
inthefade.tumblr.com
@adamisacson
adamisacson.tumblr.com
@ads_infinitum
adsinfinitum.tumblr.com
@aedison
www.averyedison.com
@Aimee_B_Loved
aimee-b-loved.tumblr.com
@alinasmith
silversmith.tumblr.com
@alsoyourmom
jaydensmommie.tumblr.com
@ampersands1
ampersands.tumblr.com
@androo
www.illywhack.com
@ange_black
angelablack.tumblr.com
@ariahfine
tumblr.tryingtofollow.com
@ashamedtosay
ashamedtosay.tumblr.com
@atsirhc
atsirhc.tumblr.com
@badarama_
badarama.tumblr.com
@badkitty_
badkitty-.tumblr.com
@baileygenine
baileygenine.tumblr.com
@bajema
bajema.tumblr.com
@bbibb
bbibb.tumblr.com
@bcompton
copycatr.com
@bdix
bdix.tumblr.com
@bergus
deathofapig.tumblr.com
@berimbauone
berimbauone.tumblr.com
@bettylies
bettylies-.tumblr.com
@billygoat
smartgoat.tumblr.com
@binsky
binskykitten.tumblr.com
@biorhythmist
biorhythmist.tumblr.com
@bjornkri
tumblr.bjornkri.com
@blobert
blobert.tumblr.com
@blondediva11
blanddiva11.tumblr.com
@brienis
brienis.tumblr.com
@bsheepies
milkglassmao.tumblr.com
@burwell
burwell.tumblr.com
@camh
ready-able.tumblr.com
@CaseOfWine
caseofwine.tumblr.com
@ccake
artvark.tumblr.com
@ccake
ccake.tumblr.com
@ChiNurse
monkeyfrog.tumblr.com
@Chokladkakan
crumble.streipel.se
@cholmes96
cholmes.tumblr.com
@CityYear
cityyear.tumblr.com
@cjereneta
chrisereneta.tumblr.com
@clapifyoulikeme
clapifyoulikeme.tumblr.com
@classiclemon
classiclemon.tumblr.com
@cleversimon
blog.simoncrowley.net
@courtneyreimer
reimer.tumblr.com
@crazycolours
crazycolours.tumblr.com
@crispycracka
crispycracka.tumblr.com
@d_g_
dig-the-cat.tumblr.com
@damon
damon.tumblr.com
@dascola
dascola.tumblr.com
@davio1962
davio1962.tumblr.com
@deadlymiho
tonedeaf.tumblr.com
@dlayphoto
dlayphoto.com
@donchiefnerd
donchiefnerd.tumblr.com
@doo_over
do-over.tumblr.com
@doublejack
doublejack.tumblr.com
@dylancoyle
dylancoyle.tumblr.com
@dylancoyle
raencloud.com
@eclaggs
eclaggs.tumblr.com
@Effingboring
misseffieb.tumblr.com
@elisharene
ifthisthenthat.tumblr.com
@elizabite
elizabite.com
@elmorse
whatstheproblem.tumblr.com
@emilyelisabeth
emilyelisabeth.tumblr.com
@emmyinabox
emmyinabox.tumblr.com
@emzbulletproof
emzbulletproof.tumblr.com
@eoporto
eoporto.tumblr.com
@esandberg
esandberg.tumblr.com
@escapereality
escapereality.tumblr.com
@everydaydude
everydaydude.tumblr.com
@Evy26
evy26.tumblr.com
@eyeteegee
eyeteegee.tumblr.com
@faneffingtastic
justfantastic.tumblr.com
@fedge
glueslabs.tumblr.com
@fistsoffolly
fistsoffolly.tumblr.com
@fizzboy
fizzboy.tumblr.com
@frageelay
frageelaytwit.tumblr.com
@frostinglickr
frostinglicker.tumblr.com
@frostinglickr
tomlinstravels.tumblr.com
@garysucks
fun.garyh.org
@gesteves
blog.gesteves.com
@gesteves
photo.gesteves.com
@girlvanized
girlvanized.tumblr.com
@giromide
giromide.tumblr.com
@glessner
glessner.tumblr.com
@gorillasushi
gorillasushi.tumblr.com
@GPappalardo
puzzld.tumblr.com
@grossefemme
grossefemme.tumblr.com
@groverviolet
groverviolet.tumblr.com
@hannamg08
randomspots.tumblr.com
@heatherwis
heatherwis.tumblr.com
@Hella
hellamike.tumblr.com
@Hello_Nurse
hellonurse.tumblr.com
@hotheadred
hotheadred.tumblr.com
@hurtling
hurtling.tumblr.com
@hyprnova
blog.exhero.com
@iamnotdiddy
iamnotdiddy.tumblr.com
@Igniter
blog.shldlss.com
@Igniter
blog.svcommons.com
@Igniter
blog.thread.io
@Igniter
tumblog.igniter.com
@imaginaryreview
fuiru.tumblr.com
@imaudihere
robisanevilgenius.tumblr.com
@ImAVeronica
piscesinpurple.tumblr.com
@inkscar
inkscar.tumblr.com
@InsoOutso
insooutso.tumblr.com
@jackholt
redcloud.tumblr.com
@jamietie
jamietie.com
@jasonpermenter
jasonpermenter.tumblr.com
@JeffHouck
notfunnyfunny.tumblr.com
@Jessabelle2o7
jessabelle2o7.tumblr.com
@jmvanderpol
vanderpol.me
@joeschmitt
joeschmitt.tumblr.com
@jollilama
akashic-rik.tumblr.com
@jollilama
Jollilama.tumblr.com
@jonathaneunice
jonathaneunice.tumblr.com
@jqgill
jqgill.tumblr.com
@jth
john.hoffoss.com
@jughed
jughed.tumblr.com
@Just_Alison
alisonagosti.tumblr.com
@justinleon
justinleon.com
@justwinston
wnstnlinks.tumblr.com
@jxpx777
blog.jxpx777.com
@kariedwards
kariedwards.tumblr.com
@katbeee
10110101.tumblr.com
@katydidsays
katydidsays.tumblr.com
@kellydeal
kellydeal.tumblr.com
@kenmat
kenmat.tumblr.com
@kerry_anne
kerryanne.tumblr.com
@kindasleepy
kindasleepy.tumblr.com
@kurtw
kurtw.tumblr.com
@lafix
lafix.tumblr.com
@lefauxfrog
lefauxblog.tumblr.com
@liabo
liabolicious.tumblr.com
@lilykily
lilykily.tumblr.com
@lindstifa
lindstifa.tumblr.com
@lionelster
moistrobot.tumblr.com
@LisaG732
lisag732.tumblr.com
@lucaswagner
lucas.tumblr.com
@mannyteee
mannyteee.tumblr.com
@markbean
markbean.tumblr.com
@markbean
pflix.com
@mathcat345
mathcat345.tumblr.com
@MattJH2
mattonfire.tumblr.com
@mayafish
mayafish.tumblr.com
@melissasantos
melissasantos.tumblr.com
@memymarie
memymarie.tumblr.com
@mhaggz
mhaggz.tumblr.com
@mhglover
blogfu.tumblr.com
@michael_messina
michaelmessina.tumblr.com
@mikemorrow
morrowplanet.tumblr.com
@mitten
mitten.tumblr.com
@moltz
Johnmoltz.com
@MsNovember
msnovember.tumblr.com
@myracles
myrm.tumblr.com
@nicbarajas
nicbarajas.tumblr.com
@Nicky36
Nicky36.tumblr.com
@ninjakai
theweeklylaugh.com
@nostrich
tumblr.quisby.net
@Notactuallyme
Notactuallyme.tumblr.com
@oati
opalandtheidiot.tumblr.com
@ohmnisign
www.illywhack.com
@OhSoSinister
ohsosinister.tumblr.com
@OneSmallFire
OneSmallFire.tumblr.com
@paul_e_wog
paulewogblog.tumblr.com
@PaulosG
paulosthegreek.tumblr.com
@peachcherub
peachcherub.tumblr.com
@penbleth
penbleth.tumblr.com
@PenLlawen
penllawen.tumblr.com
@phillh
scifide.com
@phyllisstein
rewrites.tumblr.com
@phyllisstein
vignuttes.tumblr.com
@phyllisstein
waywewere.tumblr.com
@piscesinpurple
piscesinpurple.tumblr.com
@poeks
poeks.tumblr.com
@Porto_Rock
portorock.tumblr.com
@potjie
potjie.tumblr.com
@prolix21
prolix21.tumblr.com
@quintsee
quintsee.tumblr.com
@Rachelskirts
rachelskirts.tumblr.com
@rafitorres
rafitorres.tumblr.com
@randomfreak
rand0mflora.tumblr.com
@rascoagogo
rascoagogo.tumblr.com
@Rayke
www.curbcheckedenthusiasm.com
@reagank
tumblelog.reagank.com
@redrabbit
rrrrred.tumblr.com
@rejecter
rejecter.tumblr.com
@rexbarrett
rexbarrett.tumblr.com
@richrama
richrama.tumblr.com
@rinaedin
rinaedin.tumblr.com
@rlockman
hugesuccess.tumblr.com
@robertpalmer
robertpalmer.tumblr.com
@robotwisdom
robotwisdom.tumblr.com
@rolandfox
rolandfox.com
@ronbailey
ronbailey.tumblr.com
@royaltygt
royaltygt.tumblr.com
@rsmallbone
rsmallbone.tumblr.com
@saidme
saidme.tumblr.com
@samhey
samhey.com
@sandwichpolice
sandwichpolice.tumblr.com
@sapochat
tightgrip.tumblr.com
@SarahInMI
inmi.tumblr.com
@SCCWC
elsi.tumblr.com
@seanhussey
thememegeneration.tumblr.com
@sendchocolate
sendchocolate.tumblr.com
@sharilyn
stolencamera.tumblr.com
@shoesonwrong
shoesonwrong.tumblr.com
@Silverstar98121
Silverstar98121.tumblr.com
@sista_flapjack
chicofgeek.com
@smartasshat
smartasshat.tumblr.com
@sniffyjenkins
sniffyjenkins.tumblr.com
@sofiapeepee
sofiawee.tumblr.com
@spdracerx
thevertigomonologues.com
@stacey727
stacey727.tumblr.com
@Starletty
arletty.tumblr.com
@steelopus
steelopus.tumblr.com
@stevewhitaker
wordishness.com
@stuffinmybrain
stuff-in-my-brain.tumblr.com
@swamibooba
swamibooba.tumblr.com
@sween
atsween.tumblr.com
@tams77
tams77.tumblr.com
@tbmimsthethird
tbmimsthethird.tumblr.com
@tbridge
bits.tombridge.com
@tehawesome
tehawesome.tumblr.com
@TerryBain
terrybain.tumblr.com
@texburgher
texburgher.tumblr.com
@the_dza
leavethatalone.com
@theduty
theduty.tumblr.com
@thefount
thefount.tumblr.com
@TheInfamousGdub
gdub.tumblr.com
@theresa_lauren
theresa-c.tumblr.com
@TheRobotDevil
nilszero.tumblr.com
@thestoryofb
thestoryofb.tumblr.com
@thumbscrew
thumbscrew.tumblr.com
@tj
funsizebytes.com
@tj
talesofbeingtj.com
@toldorknown
toldorknown.com
@tony_d
delgrosso.tumblr.com
@toosweet4rnr
toosweet4rnr.tumblr.com
@toplessmama
lubranoexposed.tumblr.com
@toplessmama
prestonthegnome.tumblr.com
@tylerball
blog.tylerball.net
@ungraceful
timestolen.tumblr.com
@urbanape
urbanape.tumblr.com
@urbanape
urbanapelinks.tumblr.com
@urbanape
urbanapesketches.tumblr.com
@vasta
squandrous.com
@vhata
vhata.tumblr.com
@whlteXbread
srsly.thisisreal.net
@wifeoftj
wifeoftj.tumblr.com
@wink
winkchin.tumblr.com
@xntrek
xntrek.tumblr.com
@Yardboy
b.holyjeeb.us
@Yayaa
yayaa.tumblr.com
@yhf
yhf.tumblr.com
@yidago
yidago.tumblr.com
@YoBigMel
yobigmel.tumblr.com
@yodelmachine
yodelmachine.tumblr.com
@zuhl
zuhl.tumblr.com
@_laurenh
cisne.tumblr.com
@40ozphil
filthyphil.tumblr.com
@120pagemonster
120pagemonster.tumblr.com

You can submit your information to the Google Spreadsheet if you would like to be added.

super-monkey-ball.PNG Yay! Super Monkey Ball now has a “More SEGA Games” button!

This is a sure sign that the game is absolutely perfect, that there were absolutely no bugs that needed to be fixed, so all they had to do was add this one button.

It’s not as if the gameplay is so hyper-sensitive that every slight movement sends the Stupid Fucking Monkey over the edge of the platform, falling to his death in the ocean as I scream “DIE YOU STUPID FUCKING MONKEY! DIE! I HOPE YOU DROWN!”

Perhaps it is obvious by now, but I hate Super Monkey Ball.

But more importantly, I have come to see Super Monkey Ball is the perfect example of why the App Store needs some kind of demo mode.

Given the tone of some comments about App Store pricing, I expect someone to say: “It was only $10, you cheap bastard! Do you have any idea how much it cost to make?! That’s only 2 cups of coffee at Starbucks!”

Which seems to be to miss the point entirely, especially since I don’t drink coffee.

You’re talking about two different things as if they were the same. They aren’t. I have different expectations for something I buy to eat and software that I plan to use. I’ve bought bad meals before and felt like I’ve wasted money. Last night I bought a slice of pizza and it was old and dry and utter crap.

Know what I did? I went back up to the counter and asked for a different slice. They happily gave me one. If they didn’t have any, I would have expected that I would either get my money back or something else instead.

For a $2 slice of pizza.

Cheap bastard? Maybe. But more importantly I was hungry. I paid for something that I expected to enjoy, and I didn’t enjoy it because it wasn’t good.

Ever been to a restaurant, ordered something you’ve never tried before and found that you really didn’t like it? A good waiter/waitress will notice, ask if everything is OK. On more than one occasion I have said, “I thought I’d try something new, but I didn’t like it.” She (in my experience it’s more often a ’she’) will ask me if I’d like something else. I’ve had the manager then come over and ask if I wanted something else. Very often they will take whatever it was that was ordered-but-not-eaten off the bill.

Why?

Because they want absolute certainty that we won’t hesitate to come back to eat there again. A small financial loss (one entree, or a free dessert) leaves the customer with a positive experience instead of a negative one.

Developers who are in this for the long haul ought to have the same desire.

Would you rather people be able to freely try out your programs and decide for themselves if they like it? Or risk that they will buy something, decide they don’t like it, regret it, and then be more hesitant next time they see an app that might be good?

Question: in the world of software outside of the App Store, how common are demos?

Answer: as common as oxygen in the air.

With few exceptions, you can get a demo of almost any piece of software. Sometimes it’s restricted somehow, sometimes it’s time-limited, but most of the exceptions are the ginormous software companies which don’t need more business.

It’s not a matter of spending another $5 on another Twitter app, only to use it for a few minutes and realize that — as nice as it is — there’s something about it that makes it unlikely that you will use it.

The solution is not as simple as having a demo video on your website. I saw the demo videos of Super Monkey Ball, and it looked awesome. Same with Enigmo. The demo videos looked awesome. I bought them both as soon as they were available. I have spent less than an hour playing each one.

If I added up all the various games and programs that I’ve bought and hardly ever use, it’s easily well over $100. At what point do we talk about the cumulative effect of “It’s only $2/$5/$10″? Sure, yours is only $5. Then there’s another one. And another.

“If it’s not worth $5, don’t buy it!” is a common sneer. But I have no way of knowing if it is worth $5 until I actually use it. If I’m never going to use it, $5 is a waste of $5, even if it is “only $5″.

“App Store prices are artificially low!” is another complaint. On this we agree. If the average price for a piece of software on the App Store was $20, I bet we’d have a working demo system in place, because there aren’t many people who buy a new program without a demo at that price.

“Do you have any idea how much it costs to develop for the iPhone?” is the strangest argument I’ve heard. Are we asking people to buy software, or support developers, even if the developers aren’t developing applications that I want to use? I’m fully in support of developers, but that still doesn’t mean that I ought to pay to demo your software just because you’ve chosen the develop for the iPhone.

And you know who will have a more difficult time (long term) with the no-demo policy of the App Store? Smaller “indie” developers.

As your potential customers pile up $100, $200 worth of apps which they “buy to try” and then don’t use, there will be a growing (possibly subconscious) resistance to trying new apps because they are disappointing. It will be tempting to only buy apps from developers you already know or developers who have a good reputation.

I hope that my friends whom I respect and admire will stop calling other people cheap bastards for simply wanting what is completely natural to want: demo versions.

The easiest solution I can imagine would be for Apple to implement some kind of a time restriction, and allow developers to set 1,5,7,14,30,X number of days when people can use their applications1 before a little alert box will appear and say: “The demo time for [App] has expired. Do you wish to purchase it for $4.99 or delete it?”

That would lower the bar significantly for trying all sorts of applications. It would help sites like TUAW, Macworld, etc. do reviews without developers having to give away licenses of the applications (unless the developer chose to do so). I’d probably download a bunch of apps every week.

I hope it is only a matter of time until demos come to the App Store. It can only benefit Apple, developers, and App Store customers in the long-run.


  1. As with all demos, this period of days should begin when the user actually launches the application, not when they download it. Ideally, “7 day demo” should mean “You can use it on 7 different, not necessarily consecutive, days” but that’s another article for another day. 

I have been curious to see a list of people I have blocked on Twitter.

Turns out there’s an easy way to do this:

curl -s --netrc http://twitter.com/blocks/blocking.xml |\
fgrep -B2 '<screen_name>' |\
tr '\012' ' ' |\
sed 's#<id>#\
#g' |\
sed 's#</id>.*<name>#   #g; s#</name>.*<screen_name>#   #g; s#</screen_name>.*# #g;'

It will give you a format like this:

15517541    buddiedaya44    buddiedaya44
15774186    Beth Varela ladylatasia

Where the first column is the Twitter ID and the last is their Twitter name. The middle is their “Real Name” (or their Twitter name again, if they have not entered a “Real Name”).

Note:

Your Twitter username and password must be in a plain text file ~/.netrc in order for this to work. The format of the file should look like this:

machine twitter.com
    login NAME
    password SEKRIT

where NAME is your Twittername (without the @) and SEKRIT is your actual password. You can put it all on one line:

machine twitter.com login NAME password SEKRIT

I just prefer the original formatting as it is easier to read.

Be sure to also do “chmod 600 ~/.netrc” so no one else can read the file.

You can also use curl like this

curl -s -u NAME:SEKRIT http://twitter.com/blocks/blocking.xml |\
fgrep -B2 '<screen_name>' |\
tr '\012' ' ' |\
sed 's#<id>#\
#g' |\
sed 's#</id>.*<name>#   #g; s#</name>.*<screen_name>#   #g; s#</screen_name>.*# #g;'

but that might reveal your Twitter username to other people who are logged onto the computer if they happen to run ‘ps’ at just the right time. Plus once it is in ~/.netrc you can reuse it for all the scripts and not have to keep typing it.

Many of you are frantically refreshing web pages today, waiting for iPhone OS 3.0 to be released.

Over on the Twitter, Erica Sadun posted this:

curl -s -L http://phobos.apple.com/version | grep -i restore | grep ‘_3.’ | open -f

to which I thought “Hrm. That looks like the job for a shell script and cron.”

So I built one.

Step One: Where will it go?

Well, I’m going to download it to my Dreamhost account where I host TnTLuoma because it has a fast internet connection, so I made a new directory, and then put that directory into a variable

DIR=/home/luomat/tntluoma.com/temp/iphone3

Why a variable? Well, what if I decide I want to run that script on my local Mac? That directory isn’t going to exist. No problem. We’ll just check to see if the directory exists, and if it doesn’t, use a different one:

if [ ! -d "$DIR" ]
then
    DIR=$HOME
fi  

Now if that directory isn’t found, we’ll use $HOME (aka ~) instead.

Oh, don’t forget to make $DIR your Current Working Directory by adding this line:

cd "$DIR"

Step Two: Create Temp File

That command Erica suggested is going to throw some output. We need to store that output somewhere.

FILE=$DIR/urls.txt

A simple text file will do.

Now, here comes the fun part:

curl -s -L http://phobos.apple.com/version |\
fgrep -i restore |\
fgrep '_3.'|\
sed 's#.*<string>##g; s#</string>##g' |\
sort -u > $FILE
  • Line 1 fetches the file
  • Line 2 says “only tell me about lines in the file which include the word ‘restore’ (case insensitive)
  • Line 3 says “Of the lines remaining (see Line 2), only show me those which match ‘_3.’
  • Line 4 says “Delete everything up to and including the word ‘<string>’ on each line AND the word ‘</string> as well
  • Line 5 says “Sort the lines, remove duplicates, and output to the $FILE we defined earlier

Step Three: Process Temp File

In all likelihood, we now have a file.

Whether or not that file is any use is still up for debate.

Maybe Apple’s servers didn’t respond. Maybe the network connection is down. Maybe gremlins ate it.

The first question is: “Is the file empty?” because if the file is “size = 0 bytes” then there’s not much use in going any further.

if [ ! -s "$FILE" ]
then
    echo "$FILE is empty"
    exit 0
fi

You could wrap the code below in an IF statement such as “if [ -s $FILE ]” but I prefer to make a quick test for what we do not want and exit if we match that condition. Why? The fewer lines separating the IF and the FI means less chance that one of them will get lost or another syntax error might be introduced.

Here comes the loop (Note to the Overly Fussy: yes, I know it’s a “Useless Use of Cat” but I prefer this format for readability.)

cat $FILE | while read line
do

        # the filename will be sent with a Windows EOL code (^M)
        # so we used 'cat -v' to make it visible
        # and 'sed' to remove the path and the ^M
    SHORTNAME=`echo $line | cat -v | sed 's#.*/##g; s#\^M##g'`

    if [ -f "$SHORTNAME" ]
    then
        echo "Found $SHORTNAME, skipping"
        # Note that we do NOT want to exit here, because 
        # we're looping. However this prevents us from re-downloading
        # the same file
        # Note that we do NOT test whether or not the file
        # was completely downloaded

    else

        # If we did NOT find a file with the same name
        # download remote file
        # be sure to specify our name 
        # otherwise you'll get a filename that ends ^M or /r
        # which is Not Good.

        echo "Did not find $SHORTNAME. Attempting to download"
        curl "$line" -o "$SHORTNAME"

    fi

done

Step Four: There is No Step Four

Well, I suppose ‘exit 0′ could be a Step Four.

Or adding the script to your crontab.

If you don’t know how to add it to crontab, just try running this script every 5-10 minutes or so (please don’t run it more than once every minute. You’re just wasting hits on Apple’s servers on a very busy day).

Engadget is reporting that the iPhone OS 3.0 will be released about 1:00 pm Eastern time (USA).

Finally, be sure to read Erica’s followup comment for an important note on what the filenames mean.

Be sure to use the right file for your iPhone!

My current version of the script (as well as the files) can be found at http://tntluoma.com/temp/iphone3/ which may vary slightly from the code above, but probably not in any really significant ways.

Post Script

So, how did it work?

Really well, overall. When the files actually hit Apple’s servers, I saw this:

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                Dload  Upload   Total   Spent    Left  Speed
100  230M  100  230M    0     0  3225k      0  0:01:13  0:01:13 --:--:-- 1334k

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                Dload  Upload   Total   Spent    Left  Speed
100  229M  100  229M    0     0  4176k      0  0:00:56  0:00:56 --:--:-- 2039k

showing that the iPhone 3G and “Classic” firmwares were downloaded.

But then I saw this:

curl: (1) Unsupported protocol: protected

curl: (1) Unsupported protocol: protected

I quit the program and checked out the urls.txt file (this is another good reason to use a temp file) and saw this:

http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-6578.20090617.VfgtU/iPhone1,2_3.0_7A341_Restore.ipsw
http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-6580.20090617.XsP76/iPhone1,1_3.0_7A341_Restore.ipsw
http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-6582.20090617.LlI87/iPhone2,1_3.0_7A341_Restore.ipsw
protected://pfd.apple.com/ProtectedAsset/iPodTouch/061-6579.20090527.Xde3T/iPod1,1_3.0_7A341_Restore.ipsw
protected://pfd.apple.com/ProtectedAsset/iPodTouch/061-6581.20090527.PiKu7/iPod2,1_3.0_7A341_Restore.ipsw

Aha! The last two are obviously for the iPod Touch, which is “protected” since it is not a free upgrade ($10).

So we have to edit the main part of our script:

curl -s -L http://phobos.apple.com/version |\
fgrep -i restore |\
fgrep '_3.'|\
sed 's#.*<string>##g; s#</string>##g' |\
egrep -v "^protected://"
sort -u > $FILE

Note the ‘egrep’ line which is new, and says:

“Remove any line which begins with the word “protected://”

Voilà!

Again, thanks to the amazingly talented Erica Sadun for giving me the inspiration and information that I needed to get started with this in the first place. You can often find her writing over at TUAW and of course on the Twitter as @ericasadun.

Post-Post Script

So a friendly bird told me that it was a bad idea to mirror the IPSW files. So instead I provide you with download links:

Original iPhone

iPhone 3G

iPhone 3GS

So if you get this started but it doesn’t finish, maybe try downloading this on the command-line:

curl -O -C - http://appldnld.apple.com.edgesuite.net/content.info.apple.com/iPhone/061-6580.20090617.XsP76/iPhone1,1_3.0_7A341_Restore.ipsw

(use the appropriate URL above)

Then hold down the Option/Alt key when you click “Update” in iTunes and navigate to the file you downloaded.

(If you download them in Safari they may end up with a “.zip” at the end. Rename them to end with .ipsw.)

See also: Erica’s post at TUAW.

In June 2008 when Apple announced the 3G iPhone, I was in no real hurry to get one, because (since I already have a real GPS) all it meant was a higher monthly bill for a service that I couldn’t use.

Here is a picture of the coverage map which I took almost exactly a year ago:

3G Ain't Nothing To Me

Here is that same map in June 2009:

AT&T 3G Coverage as of 2009-06-16

Both pictures taken using the official AT&T Coverage Map

The good news for me is that wide swath of blue near where I live (unfortunately my house is right on the, ahem, edge of their coverage, and I don’t expect to actually be able to make/receive calls at home, but I have a landline and WiFi internet connection at home.

What I wish I had was a year-old list of cities that they claimed to cover. Since I don’t, I decided to make one that reflects what they offer as of today (2009-06-16) and see how it compares to next June.

A List of Cities with AT&T 3G Service

Alabama

Birmingham, Huntsville, Mobile, Montgomery

Alaska

Anchorage, Wasilla

Arizona

Chandler, Flagstaff, Gilbert, Glendale, Mesa, Peoria, Phoenix, Scottsdale, Tempe, Tucson

Arkansas

Fayetteville, Fort Smith, Little Rock, Texarkana

California

Anaheim, Arden-Arcade, Bakersfield, Berkeley, Burbank, Chula Vista, Concord, Daly City, East Los Angeles, Escondido, Fairfield, Fremont, Fresno, Glendale, Hayward, Irvine, Lake Tahoe, Long Beach, Los Angeles, Merced, Modesto, Monterey, Norwalk, Oakland, Oceanside, Ontario, Oxnard, Pasadena, Pomona, Redding, Richmond, Roseville, Sacramento, San Diego, San Francisco, San Jose, Santa Ana, Santa Clara, Santa Rosa, Stockton, Sunnyvale, Vallejo

Colorado

Avon, Aspen, Colorado Springs, Denver, Grand Junction

Connecticut

Bridgeport, Hartford, New Haven, New London

Delaware

Delaware Beach, Wilmington

District of Columbia

Washington, DC

Florida

Cape Canaveral, Clearwater, Coral Springs, Daytona Beach, Fort Lauderdale, Fort Myers, Fort Pierce, Gainesville, Hialeah, Hollywood, Indian River, Jacksonville, Lakeland, Miami, Miramar, Orlando, Pembroke Pines, Pensacola, St. Petersburg, Southwest Florida, Tallahassee, Tampa, The Keys, West Palm Beach

Georgia

Athens, Atlanta, Augusta, Columbus, Savannah

Hawaii

Hawaii, Honolulu, Kauai, Maui

Idaho

Boise, Coeur d’Alene

Illinois

Bloomington, Chicago, Elgin, Joliet, Rockford, Springfield

Indiana

Elkhart, Evansville, Fort Wayne, Gary, Indianapolis, Lafayette, South Bend

Iowa

Cedar Rapids, Davenport, Des Moines

Kansas

Kansas City, Lawrence, Olathe, Overland Park, Topeka, Wichita

Kentucky

Bowling Green, Hopkinsville, Lexington, Louisville

Louisiana

Baton Rouge, Lafayette, Lake Charles, Metairie, New Orleans, Shreveport

Maryland

Baltimore

Massachusetts

Boston, Cambridge, Hyannis, Lowell, Springfield, Worcester

Michigan

Clinton, Detroit, Flint, Grand Rapids, Holland, Lansing, Livonia, Sterling Heights, Warren

Minnesota

Minneapolis, Rochester, St. Cloud

Mississippi

Biloxi, Columbus, Gulfport, Hattiesburg, Meridian, Jackson, Oxford, Starkville, Vicksburg

Missouri

Columbia, Independence, Jefferson City, Kansas City, Springfield, St. Joseph, St. Louis

Nebraska

Lincoln, Omaha

Nevada

Carson City, Henderson, Las Vegas, North Las Vegas, Paradise, Reno, Spring Valley, Sunrise Manor

New Hampshire

Manchester

New Jersey

Atlantic City, Elizabeth, Jersey City, Long Branch, Newark, New Brunswick, Ocean County, Trenton, Vineland

New Mexico

Albuquerque

New York

Albany, Buffalo, Glens Falls, Ithaca, Hamptons, New York, Rochester, Suffolk County (LI), Syracuse, Utica, Watertown

North Carolina

Cary, Charlotte, Durham, Fayetteville, Greensboro, Jacksonville, Outer Banks, Raleigh, Winston-Salem

Ohio

Akron, Cincinnati, Cleveland, Columbus, Dayton, Gallipolis, Steubenville, Toledo

Oklahoma

Bartlesville, Enid, Lawton, Oklahoma City, Tulsa

Oregon

Eugene, Medford, Oregon Coast, Portland, Salem

Pennsylvania

Allentown, Altoona, Harrisburg, Johnstown, Lancaster, Northeast-Scranton, Philadelphia, Pittsburgh, Reading, State College, York

Puerto Rico

Bayamon, Carolina, San Juan

Rhode Island

Providence

South Carolina

Charleston, Columbia, Greenville

Tennessee

Chattanooga, Knoxville, Memphis, Nashville, Tri-Cities

Texas

Amarillo, Arlington, Austin, Bastrop, Beaumont, Boerne, Bryan, College Station, Carrollton, Corpus Christi, Dallas, El Paso, Fort Worth, Garland, Grand Prairie, Houston, Irving, Killeen, Laredo, Longview, Lubbock, Marshall, McAllen, Mesquite, Midland, Odessa, Pasadena, Plano, Richardson, San Angelo, San Antonio, Temple, Tyler, Uvalde, Victoria, Waco

Utah

Logan/Cache Valley, Provo, Salt Lake City, St. George, West Valley

Virginia

Alexandria, Arlington, Newport News, Norfolk, Richmond

Washington

Bellevue, Bellingham, Mount Vernon, Olympia, Pullman, Seattle, Spokane, Tacoma, Vancouver, Yakima

West Virginia

Charleston, Huntington, Parkersburg, Wheeling

Wisconsin

Madison, Milwaukee

Twitter recently changed the format of the emails which are sent when you receive a Direct Message. Most of these changes were very bad from a usability standpoint, especially for Gmail users. If you can use procmail (and not everyone can), I can show you how to make them much better. [Continued…]

Summary: These are followup notes from my attempts to setup a dual-mode Airport Extreme Network. This started at the Apple Discussion Forum for Airport Extreme but since forums have a way of disappearing over time, I wanted to preserve this somewhere else.

(See updates/notes at the end of the article.)

The Problem

I have an AppleTV which is 802.11n-capable. It gets media from my iMac which is 802.11n-capable.

Unfortunately I have these other non-802.11n-capable devices: iPhone, MacBook, and a Powerbook. [Ed: just to clarify, all current MacBooks are 802.11n-capable, but when I wrote this I was using a 1st generation MacBook which was neither capable nor upgradable.]

Which means I was getting very little of the 802.11n-goodness. When I was growing up, “Does Not Work Up To His Potential” was the most devastating of all report-card notes. You could be forgiven for not getting an “A” but you had to at least put in the effort.

The iMac to AppleTV connection is solely for the purposes of pushing large media files, commonly referred to as “Movies” or “TV Shows”. For that we need to be living up to our full potential.

So the idea came to me that I had this older Airport Extreme which was 802.11g compatible (now referred to as “Airport Not As Extreme As His Big Brother”).

Why not put the 802.11n devices on one network and the 802.11g devices on another? That way you get the maximum performance.

Turns out I’m not the first genius to come up with this idea. In fact it even has a name: a Dual-Band Network. Its name is derived from the fact that it is a network using two bands. Clever, eh?

I received help from Apple Discussion Forum Member Duane who currently has 21,730 posts online in the forum out of a total of 54,894 “Total Posts” and is considered a “Level 5” with a ranking of 100,940. I don’t know what any of that last stuff means, but I’m guessing it means that if you play “Apple Related Trivial Pursuit” with Duane, Duane first kicks your ass and then takes your name. Or do you take names before you kick ass? I’m not sure. Duane knows though.

In any case, Duane kindly pointed out that this information could be found in the Designing AirPort Networks Using AirPort Utility (PDF) [henceforth “DANUAU”] document provided by Apple which I had heard of before, and quite possibly even had a copy of somewhere on my hard drive, but had neglected to check because I didn’t realize this was a common thing that people wanted to do. My thanks to Duane for not only being super-helpful, but also refraining from using the term RTFM anywhere in his post. He did use the term “Dual-Band” which meant that I now had a good search term to use.

[Update 2009-01-04: The old document "Designing AirPort Networks Using AirPort Utility: Mac + PC" Designing_AirPort_Networks_Using_AirPort_Utility.pdf (local file) has been superseded by "Designing AirPort Networks Using AirPort Utility: Mac OS X v10.5 + Windows" Designing_AirPort_Networks_10.5-Windows.pdf. Thanks to a comment by "spaceMan" for drawing my attention to this. Since Apple couldn't be bothered to keep the URL alive and redirect it to the new file, I put local copies here in addition to linking to it above.]

The DANUAU document proved useful in explaining that yes, this can be done, and, in fact, it is fairly simple. Here are the instructions from that document:

Setting up a Dual-Band (2.4 GHz and 5 GHz) Network

You can set up a dual-band network that utilizes both the 2.4 GHz and 5 GHz frequency bands, so client computers using 802.11n wireless cards join the 5 GHz segment of the network, and computers using 802.11b or 802.11g wireless cards join the 2.4 GHz segment. Dual Band Diagram Setting up a dual-band network:
See “Choosing the Radio Mode” on page 21 for instructions about how to set up your AirPort Extreme 802.11n Base Station in the 5 GHz frequency range. Set up your base station to connect to the Internet based on the type of service you use (DSL or cable modem service, or connecting to an existing Ethernet network that has Internet access). Give your 5 GHz network a name, such as Business 5G, so that 802.11n client computers can join the 5 GHz segment of the network. Connect your 2.4 GHz AirPort Extreme or AirPort Express Base Station to your 802.11n base station using Ethernet. Follow the instructions earlier in this chapter to set up your base station as a bridge. Give the 2.4 GHz segment of your network a different name, such as Business 2.4 so that 802.11b and 802.11g client computers can join the 2.4 GHz segment of the network.

That’s it. That’s all they tell you. Which really didn’t seem like a lot. It also didn’t answer several of my questions, including “Can the 2.4Ghz clients communicate with the 5Ghz clients?” (Yes, they can, once you get it working properly.)

Here are the steps:

Step 1) Hookup Extreme-N to Internet connection (cable, DSL, whatever) on the WAN/Internet Port. This is probably the simplest step since most likely you have done it already with whatever network setup you have.

Step 2) Setup a 5G Wireless Network. This is fairly straight-forward, except that in my case the Extreme-N base station had previously been setup as an WDS base station, and I had to change the Wireless Mode to “Create a wireless network” before “Radio Mode” would show the option for “802.11n Only (5 Ghz)” would even show up. Also note: Using 5G means that the Channel selection is automatic, so you don’t have to choose from the 1-11 range that you have been used to. This answered the question for me as to whether the Extreme-G Airport Extreme should be setup as the same channel or a different one.

Step 3) Make Sure “Connection Sharing” is set to “Share a public IP address” under the “Internet” settings. It probably already is, but double check.

Step 4) Plug the Extreme-G into one of the Extreme-N LAN Ethernet Ports. You can tell the LAN ports from the WAN port on the Extreme-N by the fact that there are 3 LAN ports and they all have the same hieroglyphic symbol over them (This is an improvement over the Extreme-G model, which has one LAN port and one WAN port, meaning that I am never sure which is which. Sure Apple could have labeled them WAN and LAN but what fun would that be when they could use symbols instead?!?)

This is where it gets tricky. Or could get tricky if you don’t read carefully.

When is a network not a network? When it’s two networks. Except it’s not.

Step 5) Configure the Extreme-G to setup another wireless network.

I went into this process thinking that I was setting up two different networks…. which I am… but only sorta.

Technically this is called a “dual-band network:” Note the singular: “network.” This is one network which has two bands (G and N). I would have realized this sooner if I had read the DANUAU more carefully, because it clearly states that these are instructions for “Setting up a dual-band network” and Duane had said “It is commonly referred to as a dual-band network”

Think of it this way: you are building a highway which has a fast lane (N) and a slow lane (G).

I also found this confusing because I’ve been used to dealing with setting up WDS networks where it is one big network with several access points. However, to get the 5Ghz option for the Extreme-N, I had to change that to “Create a Wireless Network” as mentioned above.

(It was also confusing because I could not, at first, get the Extreme-G to be G-only. I had to set it to B/G and then Apply Changes and then go in and change it to G-Only.)

At this point I had two working networks. Computers on both networks could access the Internet.

They could not, however, communicate with each other (file or screen sharing).

I went into Airport Utility and realized that the Extreme-N was setup as a 192.168.x.x network and the Extreme-G was setup as a 10.x.x.x network. So I changed the Extreme-G to also be in the 192.168.x.x range.

My next brilliant idea was that I would have the Extreme-N give out IPs in the range 192.168.1.100 – 192.168.1.199 and have the Extreme-G give out IPs in the range 192.168.1.200 – 192.168.1.250. Brilliant!

Except it wouldn’t work.

Airport Utility wouldn’t let me do it, telling me that: “The DHCP range you have entered conflicts with the WAN IP address of your base station” (which was 192.168.1.199). I tried restarting the Extreme-G. Which worked.

Except that now it wouldn’t get any IP.

Now some of you have already figured out what is wrong, but I had no idea. But Airport Utility told me when I hovered the little yellow “There Is Something Wrong” button:

Airport Problem Redacted

Now that might be the most helpful error message that I’ve ever seen. Not only did they tell me what was wrong, they told me how to fix it. The key line is

“You should probably switch your base station to be in bridge mode”

When I went back and re-read the DANUAU, it had clearly told me this already: “Follow the instructions earlier in this chapter to set up your base station as a bridge.”

I had simply missed it.

A few moments of clicking around in the configuration settings for the Extreme-G led me to the Internet tab (which probably really ought to be called “Networking” but that’s a minor quibble) and at the bottom there are options for “Connection Sharing” where “Share a Public IP Address” is the default but “Off (Bridge Mode)” is also available.

Airport Dual Band Bridge Mode Selection.png

Now this is easier to understand if you remember that this is A Dual-Band Network (singular). You are not setting up Dual-Band Networks (plural). The Extreme-G is set to “Create a Wireless Network” in “Wireless Mode” (as is the Extreme-N) but it is operating as a single network.

File and Screen Sharing works. Everyone has Internet access. Life is good.

Update: Someone asked if both of the networks appear in the menu bar WiFi dropdown. Indeed they do:

Airport Dual Band Wifi Dropdown.png

Update 2009-01-04: Macworld has recently run two articles which might be of interest: When AirPort is not enough and Buyer’s Guide: Wi-Fi Routers which gives you options besides what Apple offers.

Update 2009-07-06: the newest Airport Extreme can do dual-band without the need for a second unit, but there are still a lot of the old Airport Extreme units around, so I hope this article will continue to be useful. Also of note: as of this writing, the only “G” devices in our household are the iPhones.

Update 2009-09-11: I tried to simplify my home network by replacing the “Airport Extreme-N” with one of the new Airport Extreme Dual-Band units. That worked fine, and allows me to actually have three networks: one A/N, one B/G, and one “guest”. However, it seems impossible to use my existing B/G equipment to extend the B/G portion of the Dual-Band network when using one of these new models. Fortunately the only non-N equipment I have anymore are two iPhones (mine and my wife’s) so I expect that the entire need for a B/G network will be gone in a few years. In the meantime, I’ve replaced the Dual-Band unit with the older version as I originally had it.