There comes a point, I guess, no matter how young you feel, where you realize you’re old.

My boys have their own computer where they play games I’ve installed which seem to not cross my boundaries for what’s ok for kids to play. One of the games I’m sort of on the fence about because it seems to bring out a lot of creativity, while also creating an unpredictable anxiety in them, is Minecraft.

So I limit their time with the game while I monitor their behavior surrounding their exposure to it. It’s not like it’s all that different from other games, but for some reason they get really into it and fight over who gets to play on the computer.

This means their computer gets lots of use. Which is cool, since it’s the laptop I bought back in 2008 that has been the bane of my professional life for at least 2 years. I put an SSD in it and 6 gigs of ram to buy it new life, so I’m glad it’s finding a useful retirement phase.

The thing is, though, my kids have never known or used a computer you turn off. The iPad and iPhones they’re used to just turn off when you’re done with them.

Without my guidance, they’ve discovered how to “turn off” the computer.

> Hit the mute button on the keyboard.
> Hit the power button on the monitor.

So I end up sitting here for much of the night after they go to bed half consciously trying to figure out why one of my devices is fans-ablaze until finally I realize that Minecraft taxes the shit out of that laptop and it’s been on since 8:00 with nobody even paying attention to Steve’s needs or intentions. (I think Steve is the Mincraft guy’s name…my kids call him Steve.)

I pick up the mouse, turn on the monitor, and Steve’s just standing there, staring into a wall or the sky or something. And the fans are at top speed trying to keep the processors and ram cool.

Command Q quits the game and within 30 seconds the fans whir down to silent. So, next step, after Ian’s potty trained, teach them how to quit a game on a computer that doesn’t just handle all that shit for you.

Computers that don’t need to be turned off, programs that don’t need to be quit, documents that don’t need to be saved, information that doesn’t need to be backed up, software that uses the same data source, no matter where you’re using it. That’s quickly making me feel old with these devices that were so transformative for me, so freeing, but are now so confounding to my kids.

How websites track you without tracking you

Every time I look up a product on Amazon, Facebook shows me ads for it. Items I’ve decided, for various reasons to find out more about through Amazon’s great online shopping mall, consumer ratings, aggregated storefront, and official-like repository of information about basically any mass produced, consumer oriented product you might ever find yourself needing more information about.

But, usually, any item I take the time to read about on Amazon I’m ready to buy as long as it fits my requirements. If I didn’t buy it I’ve formed a negative opinion of that product, so all I think when I see the ad is, “I didn’t get that one because it sucks.”

“Clear your cookies,” says old fashioned wisdom.

I did just that. FB made me log in again, but I cleared my cookies and set 3rd party cookies to banned. It’s probably too late though. Amazon and FB have traded info about me and then they told two friends, and they told two friends…and so on.

And, in all honesty, you give little bits about yourself to any site that asks for it because you think it’s not personally identifying information. But you say, “I want the weather for 98122. I’m ok with giving them my ZIP code since there are tens of thousands of people with the same.” But then that site make a deal with a company who has your IP address or some other anchor point for tying this data together. And some other site asks for your email address, buys into the data aggregation system (sometimes not knowing they’re doing so…) giving another anchor point.

Then every single little detail you give to any site gets connected through these aggregators to some personally identifying anchor data. There are companies that exist simply to aggregate data about you and all of these sites that you frequent can know way more about you than what you tell them.

Then there’s a database with all of these data points where someone smart enough can go in and say, “a male, birthdate 1/1/1980, with the username tonyj logged into my site from this IP address. What else can I find out about him.”

The answer is EVERYTHING. Sites always promise to never share personally identifiable information about you. But with everything that’s out there about you, a concise picture can be compiled of who you are, what you Google, which sites you visit, when you were born, your skin color, your address, your OS preference, which browser you use, and what you do for a living.

These services can find you and your compiled profile with a few bits of information you don’t realize you’ve freely given to a service that aggregates information that is, alone, not “personally identifiable,” but when it’s all anchored to something even vaguely unique you are easy to identify.

Just Google your personal email address or full name. Pick up anything that is correctly associated with you and put it into a spreadsheet. Anything there can be, and is, used to identify you by anyone with your email or IP address. Do the same with your common user names.

I have a desire to set up a project that randomizes names, addresses, interests, genders, ethnicities, professions, afflictions, fetishes, user names, family history, etc. Each interested party can retrieve a completely random set of personal details for their fake persona. Then in ten steps or less, the system will ask them for “non-personally identifiable” information that they’d be fine with divulging to any one entity. Fake ZIP code, fake first name, fake gender.

In two to three jumps, it will show them their exact profile. Along the way, I’d like the system to show users how it’s narrowed down so easily: Gender F. 600,000 possibilities. Of those, ZIP 90210. 7,800 possibilities among registered individuals. Of those, First Name Tanya. 12 possibilities. Of those, once searched for “red sweaters” and made a purchase using a credit card. 1 possibility. Tanya Johnsen. Address 1234 7th Ave. Attended UCLA. Last known phone number, according to student roster, 415-234-5555. Purchases large, cheap bottles of wine at Safeway using that phone number to receive a discount.

What time is the Super Bowl?

The Atlantic has a fascinating piece on search engine optimization that goes fully meta. What time is the Super Bowl? Even as I look at these letters, words, it almost looks like every “l” is a number one. A “1″ as compared to a “l”. It’s late. Or early, depending on your specific outlook. Here’s a specific paragraph that I felt like quoting.

HuffPo, Time, and the Washington Post all got good at this game, running operations to arbitrage Google’s at-that-time extensive trend data. The operation didn’t exclusively concern itself with traffic, though: By writing about what people were searching for, you were writing about what they were thinking and wondering, too. You could glimpse the web’s conversations taking place.

I liked the use of words in this post. I should list a few of my favorites here:

Arbitrage:
Screen Shot 2014-02-01 at 6.57.04 AM

Etymological:
Screen Shot 2014-02-01 at 6.59.56 AM

Mr Meyer, writing for the Huffington Post, self-referentially in this article The HuffPo, writes about “When Does the Super Bowl Start?” in a manner that references search engine optimization as a subject, not just a goal. Simultaneously making it a goal, the article seems to skirt the meta SEO, discussing how to optimize while following its own guidelines.

The Super Bowl starts at 6:00 pm, I think. My friend Brad made a whole post about this. The Super Bowl. Not the meta nerdiness of it. That’s my job here.

Being conservative has its benefits

I’m a huge nerd. I serve HariKari.com from my house using Mac OS X Server only because I love this technology. I love the pressure it creates for me to learn something I might otherwise not even be involved in.

The bloggers here might take umbrage. It’s been pretty smooth sailing, with the occasional sea-sickness, but nothing like this past week. So for me to have different goals from theirs – the spreading of democracy and the informing of the masses – I can see it being something I have to explain.

The site went down last week and, as has been the case before, I was sure that a reboot, or DNS change, or permissions issue, or unpaid bill was the root cause. But no such luck. Unfortunately, it turns out, my liberal policy of early adoption of new tech, ironically, is what took the site down.

I have an obligation to these guys to keep the site up. They don’t pay me, they don’t ask for 24/7 support, I’m a volunteer, and so are they. We’re a team of people who care about what we’re doing. That’s why this works.

Last week, however, I decided to upgrade to a developer preview of the software that HariKari.com is served with. It turned out to be a huge mistake because everything just stopped working and, due to it being pre-release software, only available to people who’ve signed a non-disclosure agreement, there’s no stackexchange.com thread to help you figure out what you did wrong.

In this case, I should have been more conservative. I shouldn’t have risked something as important as this blog is to my friends to satisfy my curiosity about emerging technologies.

But, as I started writing this mea-culpa, I came across some interesting realizations. First, I think there’s a lot of intentional conflation between being conservative when it involves imposing your own interests on those to whom you have a social obligation and being conservative to preserve your own investment in the status quo. In fact, the former strikes me as quite liberal.

Second, being considerate of how your needs might impose upon others doesn’t strike me as liberal. This is probably the same point I was making previously, but holding back your need to impose your beliefs on others seems quite conservative!

More personally, being conservative in my adoption of new technology has never benefitted me in the jobs marketplace. I’ve been an early adopter all my life and it’s served me well. Both socially and technologically, I’ve benefitted from forward thinking and adaptation.

Where being conservative has benefitted me is where I held back my own passions to make consideration for others. When I’ve been unsure that the risks I’m willing to take won’t work to the detriment of those to whom I have obligations, holding back conservatively has always been the right choice.

In this case, I didn’t. I mistakenly let my trust in my own techno-lust override my judgment and screwed over some people to whom I have not only a professional, but also a personal and emotional obligation.

For that, I apologize.

Harikari shutdown

Greetings loyal readers. Harikari is back online. We can either blame the temporary shutdown on a new developer version of OS X that has some connectivity problems, or we can blame it on John Boehner. I am going with Boehner. Everything bad that happens now – I blame John Boehner.

Thanks to webmaster Tony and President Obama for getting it up and running again.

Better Native PHP Syntax Support in Xcode

I’m a big fan of the Xcode IDE from Apple. Unfortunately, it is myopically focused on development for iOS and Mac OS X, using Objective-C. A long time ago, it was a lot more open. You could find a variety of plugins that would extend its functionality to include the projects you work with, outside of the Apple software ecosystem. But for the past several years Apple has made it difficult to extend the IDE beyond their intended purposes. I’m mainly a backend PHP developer, but I have been a long-time Mac user. This puts me in the position of having second-rate tools for the biggest reason I use my computer. Yes, there are IDEs for Mac OS X that focus on PHP, but they’re all cross-platform and written in Java, which is, itself, a second class citizen on the Mac platform. I’ve suffered through using Netbeans, Eclipse, and PHPStorm for years, all the while yearning for a grown-up IDE like Xcode to do my job. No longer! With Xcode 4, Apple introduced CodeSnippets that allow a user to not only save commonly used code snippets to an easily accessible palette, but we can tokenize the snippets and define the prefix text to which Xcode’s autocomplete feature will respond. Type “fore…” and if you have a snippet called “foreach”, Xcode will offer up the helpful autocomplete list with your snippet. Hit tab or enter and the snippet will be inserted at the cursor. Hit tab again and you’ll be guided through the snippet’s tokens, one by one, allowing you to fill in the blanks. With this in mind, I went to work creating over 5,000 snippets to cover the entirety of the PHP language. See my github repo here: https://github.com/tonyjohnston/PHP-Xcode-Autocomplete Now I have native-like autocomplete for Xcode. I start typing “str” and here’s what I see:Screen Shot 2013-06-07 at 6.21.41 PM   I tap enter and this is what results:Screen Shot 2013-06-07 at 6.23.58 PM I type “if” and Xcode presents this:Screen Shot 2013-06-07 at 6.25.17 PM Arrow down to ifelse and tap enter:Screen Shot 2013-06-07 at 6.26.30 PM Each of those blue rectangular ovals is a tabable token, just waiting for you to enter your specifics, just like Xcode’s support for Objective-C. It’s a huge advancement in the arena of Mac PHP IDEs. It took me about 6 hours to put this whole thing together so I’m sure that it can get better. Feel free to fork my GitHub repo for PHP Xcode Support and help make PHP a first class citizen on the only great IDE for the Mac.

I spent half an hour on the “service chat” with AT&T and eliminated $20 worth of overpriced services I wasn’t using. Here’s the script…

AT&T sales representatives are happy to assist you with your questions. AT&T sales representatives will not have access to your personal account. This service is provided to you under AT&Ts Terms and Conditions and Privacy Policy. 

You are now chatting with Lorena, an AT&T sales representative.

Lorena: Welcome to AT&T online Feature Sales. How may I assist you with your features today?
Tony: I’m only using about 10% of my data plan. How can I choose a cheaper plan?
Lorena: I’d be happy to help you with our features today, Tony. Which data plan do you have now?
Tony: Or, if it’s possible, how can I add data and device tethering so that I can drop my home internet and just tether to my phone?
Tony: It looks like I’ve got Data Pro 2GB LTE
Tony: for iPhone
Lorena: The tethering/hotspot data plan is the 5GB for $50 if you wanted to do that. If you want to lower your data plan, we do have the 300MB for $20 that you can switch to. You wouldn’t be able to tether/hotspot with your phone unless you have the 5GB.
Tony: hm. No, I guess that’s not a better option. I get unlimited data via my cable provider for $47.
Tony: so it’s $25 for 2gb and $20 for 300mb?
Lorena: That’s correct. The 2GB data plan is no longer available though so once you switch from it, you won’t be bale to get it back.
Tony: what is available now?
Tony: The only option I see is the one I currently have.
Lorena: The 300MB for $20 and the 3GB for $30.
Tony: huh. that’s crappy.
Tony: Is there any way for you to look at my plan and usage and suggest something that could save me money?
Lorena: We actually do not have access to the accounts through chat since we are guides. We are available to assist you with managing your account online and changing features online through the self-service system. Which other plans and features do you have?
Tony: What’s the cheapest iPhone plan available?
Lorena: Do you like to text?
Tony: I’ve probably got a year left on my current contract.
Tony: Well, yeah, but text plans are more expensive than they’re worth. If it saves me money I can start using Facebook messaging.
Tony: Can you tell me what the cheapest iPhone plan is?
Lorena: Well, if you did the 450 Nation Talk Plan with the 300MB data plan, you’re looking at $59.99 a month before taxes without any messaging. Unlimited Messaging is $20 if you wanted to add it.
Lorena: Do you have just one line on your account?
Tony: Yes
Lorena: Thank you. Do you know which voice plan you have?
Tony: So, I have $25 data, $5 text. My current charges before taxes and fees is $80./
Tony: If I drop the data to 300mb and ditch the text plan, that would still only bring me down to $70.
Lorena: Do you know which voice plan you have?
Tony: Do you know where on the website I can find that?
Lorena: Do you see the myAT&T tab at the top? Please mouse over the word “Wireless” below it. You’ll see a drop box appear and you can select “Change Rate Plan” from there.
Tony: Oh, I have Family Talk Nation 550 with Rollover.
Lorena: Thank you. That’s odd. We can certainly switch you to an individual plan if you have just the 1 line on your account.
Tony: That appears t be the cheapest.
Tony: Can you do that right now or is it something I need to do on the website?
Lorena: Our Care chat is available now to do the switch for you since I do not have access to the accounts through this chat.
Tony: I don’t know what that means.
Lorena: The 450 Nation Talk Plan would be the smallest voice plan for individuals and is $20 less than the 550. Would you like to change your data plan before I transfer you over?
Tony: Oh man. That would be great! I didn’t realize I was paying $20 more than I need to. I almost never talk on the phone.
Lorena: Ok! I can certainly transfer you over so our Customer Care team can change your plan for you. Would you like to change your data plan before I transfer you over?
Tony: No, if I can save $20 by changing my voice plan I don’t need the $5 extra to have a crappy data plan.
Lorena: Alrighty. Give me just a moment to transfer you over.
Tony: Thank you!

Please wait while I transfer you to an operator at AT&T Wireless Customer Care.
Welcome! You are now chatting with ‘Chara Cooper’.

Chara Cooper: Hello Tony
Tony: Hi Chara.
Chara Cooper: thank you for chatting in with me today
Chara Cooper: how can i help you?
Tony: You’re welcome.
Chara Cooper: so How can i do you tonight my dear.
Tony: So Lorena was helping come up with a way to minimize the total cost of my plan based on my usage. She said that there’s a cheaper voice plan than what I’ve got and I’m paying $20 more than I need to since I rarely actually use my phone as a phone.
Tony: She suggested the 450 Nation Talk plan.
Chara Cooper: what kind of phone do you have Tony?
Tony: Is that the cheapest voice plan?
Chara Cooper: okay, what kind of phone do you have?
Tony: It’s an iPhone 5.
Chara Cooper: okay so you can get a regular nation plan, but because you have a smartpone you are required to have a data plan with that.
Chara Cooper: yes because it is a smart phone
Tony: Well, yeah. If I could have data only that’s what I’d go with. My phone is rarely at my ear. Is there a plan that drops voice service?
Chara Cooper: LOL:) no honey.
Chara Cooper: that would be nice though.
Tony: If not, I just want to know what is the cheapest voice plan I have to agree to.
Tony: My bill starts out at $80 a month right now. When I got my first iPhone that was $60. But I can’t find a way to get it back down to $60 on the website.
Chara Cooper: tony pleas give me your cell number area code first
Tony: ###-##4-5666
Tony: ###-##-GLOOM, if that helps.
Tony: I gotta hurry through this. My kids are exploiting my distraction to stay up past their bed time.
Chara Cooper: :))) thats funny and cute
Tony: :)
Chara Cooper: whats the last four digits of your social please?
Tony: ####
Chara Cooper: thank you Tony.
Tony: Is it against the rules for you to just tell me which is the cheapest voice plan? Because that’s all I really need to know. I just want to switch to the government mandated minimum plan since I hate talking on the phone and only put up with people calling me because having the internet in my pocket makes me all powerful.
Chara Cooper: okay Tony Im looking at your account
Chara Cooper: and i do see that you are on the 550 plan
Tony: yes.
Chara Cooper: you can move to the 450
Chara Cooper: and keep the data pro
Tony: and save $20?
Chara Cooper: is that absolutely.
Chara Cooper: i meant
Chara Cooper: absolutely!!!
Tony: hahaha…
Tony: ok. do it.
Chara Cooper: okay sure.
Tony: Also, block calls from my ex girlfriend.
Chara Cooper: :)))) too bad for her.
Tony: hehe
Chara Cooper: lol!!
Chara Cooper: you men are funny
Tony: Just kidding. All of my exes love me.
Tony: Well there’s this one who still hates me.
Chara Cooper: are you an aries
Chara Cooper: or a sagittarius
Tony: If I give you her name can you block her?
Tony: No. The opposite. Virgo.
Tony: Ok, I gotta get out of here. The kids are taking over the asylum.
Tony: You got me taken care of?
Tony: Or is there something else I need to do?
Chara Cooper: illl text you the information
Chara Cooper: good night
Tony: cool. Thanks, Chara!
Tony: Have a good night.
Chara Cooper: your welcome
Chara Cooper: I will send a trext to confirm that the plan has been changed for you to nation 450
Tony: great. thanks for your help and your sense of humor ;)
Chara Cooper: :) your welcome.

How to run PHP scripts inside your Objective-C Mac OS X application

Picking a starting point

I spent a lot of time looking around the web for instruction on how to execute PHP inside of a Mac OS X application created in Xcode (version 4.3) only to find a whole lot of nothing. I knew it could be done since there are several apps in the Mac App Store that allow you to interpret PHP on the fly, so I set out to do it without the help I believed I needed. It turns out to be one of the easiest things I’ve done in Objective-C.

The first thing I did was to download the JavaScript Interpreter sample code from the Apple developer site for reference. It’s old code and doesn’t compile readily on a 64 bit system with the OS X Lion SDK, so to get it to run I had to change the target to fit my system as shown below. Xcode will also ask you if you want to update the code to current standards – go ahead and do that.

Xcode screenshot

Getting Objective-C to execute PHP scripts

Next, I changed the code to skip the JavaScript interpreter and use PHP instead. This involves the NSTask Class from the Foundation Framework. Luckily the Foundation Framework is already included in the JSInterpreter sample code. While we’re talking about included Frameworks, you can go ahead and remove the reference to the JavaScript Framework now. To get rid of the red squiggly lines and error messages, delete the #import directive at the top of the MyController.m file along with all of the code inside the evaluateScript method.

Next, I searched for a way to run a command line script similar to “> php testing.php” that would allow me to execute a script and see its output. As always, Stack Overflow came to my rescue. I took the basics of the code there and went to (not very much) work.

First, I had to replace the NSTask LaunchPath with the php binary executable on my system, which is at /usr/bin/php.

Next I had to replace the arguments with the code I wanted to run, which was at ~/tonyj/Sites/harikari/test/testing.php – a script that simply echos “Hello world!” To keep from having to alter the existing code too much, I put in the whole path but left out the filename so that I could type it into the input field of the original application and have it executed when I clicked the button.

That’s it. I built and ran the application and I had a window with an input field and an output filed. I typed the name of my script into the input field and, ta-da!, “Hello world!” appeared in the output field.

A standalone application?

Next I wanted to see if I could make the whole thing a standalone application. This being my first attempt at writing a Mac OS X application in Xcode, I had no idea where to start. So I just went for it. I added my PHP binary to my application (File -> Add Files to JSInterpreter) and then added my script to the project. I wasn’t quite sure what the path was going to be for either of them in the application bundle, so I went back to Stack Overflow to find out about [NSBundle mainBundle] resourcePath] as a method for getting the path to the inside of your application, wherever it may be.

It worked!

With one caveat: I haven’t worked through all of the details yet, so I’m sure there are some dependencies in the PHP binary that my system provides in the place that PHP is looking for them. But I’m confident that it would not be difficult to find and eliminate or compensate for them.

Also, Objective-C doesn’t automatically wait for the return value from a task the way PHP does. And PHP is sometimes a little slow to respond. So you have to figure out how to make it wait around for a response from PHP and your script, especially if it’s a lengthy one. Once again, Stack Overflow helped me find information about the NSNotificationCenter. I don’t know much about it, but it basically notifies your code when the PHP output file is done loading.

Now I can load any PHP script into my application and send and receive messages to and from it. I might try adding MySQL tomorrow.

The code:

-(NSString *) evaluateScript:(NSString*)scriptName
{
    NSTask *task = [[NSTask alloc] init];
    NSString *taskPath =
        [NSString stringWithFormat:@"%@/%@",
        [[NSBundle mainBundle] resourcePath], @"php"];
    [task setLaunchPath: taskPath];

    NSArray *args;
    NSString* scriptPath =
        [NSString stringWithFormat:@"%@/%@",
        [[NSBundle mainBundle] resourcePath], scriptName];
    NSLog(@"script file path: %@",scriptPath);
    args = [NSArray arrayWithObjects:scriptPath, nil];
    [task setArguments: args];

    NSPipe *pipe = [NSPipe pipe];
    [task setStandardOutput: pipe];

    NSFileHandle *file = [pipe fileHandleForReading];
    [file waitForDataInBackgroundAndNotify];
    [[NSNotificationCenter defaultCenter]
 addObserver:self 
           selector:@selector(receivedData:) 
               name:NSFileHandleDataAvailableNotification 
             object:file];
    [task launch];

    NSData *data = [file readDataToEndOfFile];
    NSString *string =
        [[NSString alloc] initWithData: data
 encoding: NSUTF8StringEncoding];

    return string;
}

- (void)receivedData:(NSNotification *)notif {
    NSFileHandle *file = [notif object];
    NSData *data = [file availableData];
    NSString *str = [[NSString alloc] initWithData:data
 encoding:NSASCIIStringEncoding];
    NSLog(@"%@",str);
}

Altering the code

This is an example of how to type in the name of any file included in your project, but you may want to just execute raw PHP commands or fully integrate PHP into your app. To do this, just look at the line above where the args variable is set. You want your array to have filepath as its first element, then any arguments you want to have available in the argv[] array.

If you want to execute single PHP functions, your first arg will be “-r”, followed by the function as in the following example.

args = [NSArray arrayWithObjects:@"-r",@"is_array(array(1,2,3))", nil];

Hilarious Tech Guy Call

Over the weekend a woman called into a radio talk show to complain that her “Linksys wireless connection” has disappeared.

Via Mashable:

Meet Jennifer, she had been unwittingly yoinking Wi-Fi for more than a year and a half when the gravy train ran out, after which she called into Leo Laporte’s Tech Guy radio show in a state of utter confusion.

Even as I chuckle to myself thinking about this woman, I am reminded of my many friends and family who rely upon me for various levels of technical support and the questions and confusion that often ensues.  But, none of it compares to this, truly priceless.

I think it’s the fact that she knows what she did and is still seeking some sort of solution from the Tech Guy.  Perhaps if she just said “oooooh, now I get it….” and hung up it wouldn’t be so funny to me.

1984 Arrives in 2010

School districts across the country are supplying students with laptops for students to use both at school and home.

Unfortunately, one school district has decided to use the laptops as a means of invading the privacy of the students and their families.  It is alleged that the Lower Merion School District in Pennsylvania , used the embedded camera as a way to monitor the behavior and activities of students.

According to TechNewsWorld:

What sparked the discovery was Assistant Principal Lindy Matsko’s assertion in early November that Harriton High School student Blake Robbins had been “engaging in improper behavior in his home,” the filing explains. Matsko allegedly used as evidence of that behavior a photograph taken by the webcam in Robbins’ computer.

Robbins’ father then confirmed with the school that the district had the ability to remotely activate the webcams in the laptops it gives its students. Documentation accompanying the laptops, the family charged, made no reference to that ability.

“As the laptops at issue were routinely used by students and family members while at home, it is believed and therefore averred that many of the images captured and intercepted may consist of images of minors and their parents or friends in compromising or embarrassing positions, including, but not limited to, in various stages of dress or undress,” the filing states.

The functionality to monitor computer use as discussed in this article is not unusual, and is well known to those who use their employer’s computers.  What makes unusual is the use of the webcam to capture images of the user, without prior notice,  whether or not the user is at the keyboard.

As I write this I keep looking at my own webcam staring at me.  I never use it, but can’t help but think what it could capture if someone had control over it…