Click or scroll down Circle me on Google+ Fork me on GitHub Follow me on Twitter Ask me on Stack Overflow Gild me on Reddit Code Ninja, Entrepreneur, Idiot ChalkHQ — consulting, prototyping, mentoring HighF.in — resolve innefficiencies in your startup's workflow DearDrum.org — online open-mic / creative space The Dirac Equation (click to WikiPedia) A maxim Sun Tzu references in his magnum opus The Art of War

If you know the enemy and know yourself, you need not fear the result of a hundred battles.
If you know yourself but not the enemy, for every victory gained you will also suffer a defeat.
If you know neither the enemy nor yourself, you will succumb in every battle.
Fork me on GitHub

Tags

actionscript ad-hoc networks Adobe AIR anonymous Apple array Browsing convert Debugger Error Facebook file permissions Flash Flex fonts function future Google Google Plus grid hackers html javascript logs loop network p2p php privacy regexp Security Server social ssl technology terminal time Twitter upgrade Web 2.0 Web 3.0 Web 4.0 Web 5.0 wordpress

Featured Posts

  • Javascript: Undefined parameters
  • The Web, A Look Forward
  • Let Postfix send mail through your Gmail Account – Snow Leopard
  • Archives

  • April 2013
  • December 2011
  • July 2011
  • June 2011
  • March 2011
  • February 2011
  • January 2011
  • November 2010
  • October 2010
  • September 2010
  • July 2010
  • May 2010
  • Categories

  • Code
  • Design
  • Opinion
  • Security
  • Tools
  • Uncategorized
  • Latest Posts

    Facebook Mail

    There's not much to say about it. I've read some other posts from really reputable blogs and for whatever reason they're all padded with nonsense. Facebook Mail is an extension of their messaging system that incorporates email, has a kind of priority inbox, and is all based on people rather than threads based on subject. Facebook is aggregating all the ways you communicate to better simulate a conversation as though you were standing next to the person.

    It's a very specific style of communication that speaks directly to teenagers and the way they communicate. While teenagers could and should use a communication method that caters to them, and the new Facebook Messages does that really well, it's not for grown ups, or business, or anyone with any depth or complexity. It's advanced IM(instant messaging).

    Grown ups need threads by subject - whether they choose to organize their inbox as individual messages or threaded, the subjects still differentiate the content of an email or conversation. I may do a lot of work for a client, the absolute last thing I would ever want is to scroll down a bit too far in the conversation and see specs for an old project and incorporate it accidentally in the new one. Or for the client to pitch an idea for a new project, which get's muddled with the current project, or requires a paragraph explaining that it's a different idea and just a pitch and has nothing to do with the current project. One of many examples where subject based organization is a far simpler paradigm.

    Of course we all have a adolescent side - some more than others, and it's that same aspect of ourselves that Facebook appeals to when see what old friends are doing with their lives. It's that same part of our brains, that couples with short sightedness, that makes some people think that peer pressure is more important than preventing access to your personal online life from random third party applications. Why else would anyone do those stupid Facebook Quizzes? It explains why some people believe there's enough value in completing a quiz to give up the keys to their personal life to some shady app developer. Or at least the same short sightedness that becomes so overwhelmed by the social pressures of Facebook that they've never read the TOS or Privacy Policy. Never mind Facebook's but of the third party quizzing application who can do whatever they want with your data.

    The two other issues with integrating Facebook Messages with your email is lack of respect and trust. Giving someone your Facebook email address is an immediate indicator that you don't want communication with that person (or company) to be too complex. You're saying, "Here's my Facebook Email, I'd prefer it if everything we say to each other from now on was part of the same conversation cause DUuuueah I lack the ability for context". As for trust there are two main categories of people. Those who trust Facebook (unfamiliar with their history, never read the Terms, unaware of the frequent privacy control resets, etc.) and those who don't trust Facebook (people with common sense, people who don't live in a bubble, people who can read).

    While I've recently had to reactivate my Facebook account after two years so I could access their developer API for work (I got out during a significant Intelectual Property and Privacy blowup in 2008), I refuse to put any information on it that isn't already public. Why, because I don't trust them. Facebook has done a lot of things in their past that are notably untrustworthy. Their whole approach is based on peer pressure and pushing people around how they see fit, their privacy controls are only meaningful until they decide they're not - which happens frequently enough, and they don't appropriately abstract apps or themselves from your personal data.

    Why would I trust a free service like Google with email and documents and stuff, but not Facebook? Well for one I know that Google has serious restrictions dictating which of their employees have access to my data, even those few select people are meticulously logged and audited, and any violations result in firing and tighter security. On Facebook I have no idea which of their employees can access my data, and I know that at their whim a mere Privacy Policy update could result in all my controls being reset and my private information entering the public domain forever. If the controls are meaningless, and access is ambiguous then there's no trust.

    For a simple analogy; Google is run as a republic. Microsoft is run as a corporation, Apple is run as a dictatorship, Facebook is run by a young dictator.

     

    MySQL Table Order

    Here's the situation. You have User_Table — which is a table of users, and a Content_Table — which is a table of content. They have a column in common called u_id which is the user's unique id whom submitted the content.

    What we want to do is get a list of users where for each user we show their latest piece of content. We want to show every user once, even if they haven't submitted anything, and we want the user list organized by date of last submitted content. You could do this with two queries, the challenge is to do it with one.

    So here's a SQL query:

    "SELECT User_Table.u_id, User_Table.username, Content_Table.c_id FROM User_Table
    LEFT JOIN Content_Table ON User_Table.u_id = Content_Table.u_id
    GROUP BY User_Table.u_id HAVING COUNT(User_Table.u_id) >= 2
    ORDER BY Content_Table.date_added DESC"
    

    Let's just run through the query. We're doing a SELECT on the user's id and username, and the content's id. We want a list of users so we get it FROM the User_Table, and do a LEFT JOIN with the Content_Table based on the u_id column. This multiplies the two tables together and you end up with this big imaginary table so we GROUP BY u_id. We don't want to return the entire big multiplied table, we only want 1 entry for each user and only HAVING more than two entries in the big multiplied table. Because the big multiplied table includes the User_Table there will be at least one row for each user. If there's 2 rows or more it means there's at least 1 row in the Content_Table by that user. We then run an ORDER BY on the resulting smaller imaginary table which will organize the list of users based on the date_added column on the Content_Table.

    If you run this query you likely won't get the results you expected. What you get is a list of users who have submitted at least one content item. The list of users is sorted correctly - by the last content item submitted. So if UserG submitted content after UserD it'll show them in the appropriate order, but if a given user has submitted more than one content item, the c_id fetched will be for the first content item they submitted. This might seem weird because the list of users is correctly sorted based on the last content item they submitted.

    What's happening is MySQL processes the query in the order it's written, so it's running GROUP BY before it runs ORDER BY. What we'd like to happen is for the big imaginary table to be sorted by Content_Table.date_uploaded and then grouped by u_id. There are a number of ways to broach this issue that involve intensely convoluted queries; things like nesting, aliasing, and referencing the same table several times in different ways. That shit is hard to read and not compatible with older MySQL servers or different server configurations.

    Now you could run the following query just before you run the one above:

    "ALTER TABLE Content_Table ORDER BY date_added DESC"
    

    and it'll physically resort the table. The problem with doing this is that if you later INSERT, DELETE, or UPDATE(in some cases) the table, it'll mess with the ordering and reordering the table on the physical disk, and running the ALTER TABLE query can be resource intensive - especially in cases where you have a very large frequently used table.

    When I drafted this post a couple weeks ago I was on a tight deadline working on the new DearDrum.org and decided to de-prioritize the functionality until I had a chance to figure out a better way to do this. Still dealing with deadlines I figured I'd just post it and see if anyone else has a solution, or at least open it up for discussion.

    Monitoring log files over SSH with Tail

    If you have to do some debugging you might need to monitor a log file - without having to reload it every two seconds.

    The solution is to log in to your server via SSH, and use the tail -f command, which follows changes as the file grows and prints them in the terminal.

    So if your php log is located at /logs/php.log just type in

    tail /logs/php.log -f

    to stop it type in crtl+c

     

    Why I Chose OGG Vorbis as the Audio Format on DearDrum.org

    This is from http://deardrum.org/about/html5

    What is HTML5 and why do I need it?

    To put it simply HTML is what websites are made of. HTML5 is just the newest version.

    DearDrum.org uses some pretty advanced stuff under the hood that's only available in HTML5. So in order to play audio on the site and do some other cool things you need a Web Browser that understands HTML5. (more on this below)

    Fortunately there are a few really amazing web browsers out there that do support HTML5 really well. And if you're not comfortable switching to a new browser there's probably a plugin for your browser to get you on board.

    Here are some quick links so you can get started, you only need one, but why not try them all if you have time. I'll go into a bit more detail and walk you through the issues below that if you're interested or confused by any of this.

    Links:

    Google Chrome is - in our professional opinion - the best web browser out there, hands down.
    Download Google Chrome

    Firefox is phenomenal too, and by far the most widely used browser that supports HTML5.
    Download Firefox

    Internet Explorer is, well, incompatible with everything. Google made a plugin called Chrome Frame which brings HTML5 to Internet Explorer. Despite some recent claims to the contrary IE9 will never support HTML5 by itself and requires Chrome Frame in all cases (more on this below).
    Download Google Chrome Frame for Internet Explorer

    Safari is in the same boat as Internet Explorer with regards to HTML5. They claim to support it but intentionally cripple its functionality. On a Mac you can install a plugin called XiphQT which will bring you up to speed. On Windows you'll need to switch to another browser to get proper HTML5 support.
    Download the XiphQT plugin for Mac

    Opera is a less known web browser that totally supports HTML5, and we love them for it.
    Download Opera

    So What is a Web Browser?

    Yeah yeah, I get it. Now What is HTML5? Really.

    You may have seen the code that makes up web pages. If you right click on this page you should see an option to view the source code of the page. That's HTML. Now the internet is an open place and as you can see there are lots of different browsers. So everyone kind of has to agree on the specifics of the HTML language. The specs for HTML5 aren't finalized yet but some of the more advanced browsers are already supporting most of HTML5 already. There is however a big argument going on surrounding HTML5 audio and video.

    At the end of the day HTML5 will have to be open, because the web needs to be open. Imagine if you had to pay $5000 a month to use Google, and that money wasn't even to pay Google, it went to some licence holder who owned use of the letter E... That would be terrible and there'd be no innovation on the web. There'd have been no Facebook or WikiPedia, and no DearDrum.org.

    What exactly is this HTML5 argument about?

    Up until now HTML has not had any built in support for audio or video. If you wanted to play audio or video on the web you had to use a plugin like Adobe Flash Player. Which is fine, but Adobe is a profit motivated company and the web is an open place, so in the interest of choice and freedom the new version of HTML, HTML5 does have built in audio and video support.

    Now the standards body that decides on what HTML5 will be is called W3C. Unfortunately the W3C is dominated by massive corporations who tend to dictate the standards in favour of their profit margin instead of what's best for an open, innovative web, and what's best for all of us. Up until now there hasn't really been much to debate over and it's been a long time since HTML4 came out anyway. Up until now Internet Explorer had majority market share and deliberately didn't follow the standards so web developers would have to focus on supporting IE's defunked and broken interpretation of HTML4. IE's massive market share was purely the result of being packaged with Windows. Microsoft has been sued over this anti-competitive practice because it directly hurt the web for so many years. During this time the other web browsers pushed to become faster and add amazing features to try gain as much market share as possible. It was IE vs. the world and Mozilla was their biggest rival with Firefox. If it wasn't for Firefox we'd all be eating dirt and living in shacks right now in a world where an open DearDrum.org could never even be conceived of.

    The problem with HTML5 audio/video support is that everyone needs to agree on an audio and video format; in the same way .txt is a text format and .jpg is an image format. The issue is licensing. There happen to be some really great audio and video formats out there that are open source, meaning they can be freely used and improved upon by anyone. There also happen to be a lot of big faceless corporations in the W3C, see a list here, some of whom own part of the licensing rights to a particular format known as H.264.

    When it comes to web browsers you have two sides of the argument. Those for an open web, and those whom want to charge everyone obscene amounts of money to use H.264. Currently the H.264 license allows people to use it. This free use has been extended to 2016 for the purposes of convincing non owners in the W3C - and the greater public, that it's free. After 2016 and quite frankly with the right high priced law firm any old time, that could expire and everyone would suddenly be charged $50 a day to watch youtube videos. Or $5000 a year to upload YouTube videos. If H.264 becomes the standard it would be a twisted joke and we would all be royally screwed.

    Microsoft and Apple both own part of the H.264 licensing rights. So they've chosen only to support that format. They could easily support both H.264 and WebM(the open, free format), but they don't because they're hoping that they can prolong the debate long enough that developers will have to support H.264 to reach the majority of people who use those two browsers - both packaged and preinstalled with their respective operating systems.

    Mozilla by it's very nature will always push for an open web, and Google's profit margin is directly tied to people's ability to generate content. Google went so far as to purchase the WebM format AND absolve the entire world from licensing fees should some obscure patent be discovered down the road and some sadistic person try capitalize on it. To Google it's a business expense, but it happened and it benefits everyone.

    The WebM format is a container format, which uses VP8 for video, and OGG Vorbis for audio. For DearDrum.org we decided to use OGG Vorbis as our audio format.

    Wow that was a lot to take in, so why does DearDrum.org use OGG Vorbis instead of MP3?

    While most your music is probably in .mp3 format, it costs a lot of money to transcode audio into the .mp3 format due to licensing. And who knows when that price will go up. When creating DearDrum.org I didn't want to be at the mercy of some company, and we didn't want to charge people to download and use the DearDrum.org Desktop App. We went in favour of choice, freedom, and openness because we value those ideals; and we want the web to remain an innovative grounds for inspiring new ideas.

     

    Flash FileRef Mysterious IOErrorEvent #2038

    This happened twice in the last two days and for the second occurrence I totally forgot what the issue was the first time I fixed it. So the lesson is blogging about this stuff as it happens saves time regardless of deadlines.

    So you're in Flash or Flex and your fileRef is failing to upload. Flash(Flex) Builder is telling you there's an IOError, but the line number given is where you set the local path of the File Reference. "WAHT!," you try an Event Listener and it does nothing. You vain atry/catch statement and it catches nothing. Despite what the compiler is telling you, you expand the try/catch statement to your whole uploading function hoping to narrow the issue down, but it does nothing. Finally you resort to Debugger breakpoints throughout the function and you discover it's actually being triggered by the call to fileRef.upload();. The possible causes just increased by an order of 50.

    Before you break something in your office, you should know that File Reference IOErrors can be triggered by a failing server upload script. Now hold on, you'd think IOErrors would only happen if the upload script URL was wrong or broken, like if you missed a semicolon in your php or some silly thing like that. But thankfully Adobe went the mysterious route and made this as ambiguous as possible. There are a ton of reasons why your upload script might fail in such a way that it triggers this error in flex, or in a non-debug version of your app just stay stuck at 0%, and it might not be immediately apparent or fun to track down. Reading this now you are appropriately upset, but wait another second.

    The first time this happened to me yesterday it happened because the upload name when I was getting the filesize of the temp upload file was wrong. In the following code that's the upfile1 part.

    $filesize = filesize($_FILES['upfile1']['tmp_name']);

    Then about 20 minutes later the same mysterious IOError popped up, but this time it was the server path I was moving the upload to. The path's are relative and I'm dyslexic, nuff said.

    move_uploaded_file($_FILES['upfile1']['tmp_name'], $incorrect_relative_file_path)

    Today however I was _shocked_ to find the crazy IOError because this time I knew all the paths were correct. In fact everything related to files was correct. I was sure, and I felt betrayed. (Once I re-realized that it wasn't a regular rational IOError... again). After a quickly unpleasant hunt through 1000+ lines of code I found a mysql query that was failing outside of an if/else clause. The reason it suddenly broke was that while editing the database at 5am this morning on no sleep I hit the wrong button -- so instead of deleting a column I accidentally dropped a whole table. There were two knew columns added since I backed it up that I had forgotten about in the haze, one of which caused the MySQL query to fail.

    I collapsed asleep last night with this unsolved, I had nightmares that alluded to it. Really. But after 5 hours the frustration overwhelmed my capacity for dreaming and I leaped out of the surreal scene and into another one --Dreamweaver. Now knowing this had a solution and that I'm not gonna have to run through a field at night with a town's worth of pitchforked locals chasing me I feel expansive relief. Makes me wonder if I'm doing this to chase that feeling or if it's just a side affect.

     

    The Stuxnet Trojan Worm

    There's a new trojan worm(a self replicating malware program; think computer virus) calledStuxnet. It infects all versions of Windows back to Windows NT and 2000 and possibly earlier versions as well. It also affects Windows Server, so many of the websites you visit may be leaking your personal information and/or unknowingly infecting your computer just by visiting the website.

    It hides itself on usb sticks inserted into infected systems, the simple act of viewing files on an infected usb stick infects your computer. It's also been discovered that it can infect your computer from website favicons in web browsers, email, office documents, cds, via webdav, ftp, etc.. So anywhere on a Windows system where you see any kind of shortcut icon, the act of viewing that icon will infect your computer - assuming the shortcut is malicious. The bug is in the heart of Windows; the function where Windows parses a shortcut icon to display it to you, will instead install the worm if parsing a malicious icon.

    The worm once installed contacts home(the hackers) and can be used by the hackers to run any code on your computer they want. They can steal your passwords and see everything you type or is displayed on the screen, they can transmit files, they can erase your whole system or crash your drive. anything. They have total control of the system.

    It's already been found infecting Siemens industrial systems and it could easily target core network infrastructure like your ISPs. There are reports that 9000+ newly infected systems are being discovered every day and that the number is skyrocketing. It is currently undetectable by anti-virus software. The exploit has been demonstrated and published for over a week now, so aside from Stuxnet there could be tens of thousands of other related worms and viruses taking advantage of the same security hole.

    Microsoft is unlikely to fix this until the second Tuesday of August, and it's very unlikely they'll fix it in unsupported versions of Windows like 2000 or NT - which constitute millions of computers especially in the corporate world where proprietary information leaks can seriously affect the stock market and national defence. For regular users it means identity theft, system crashes, all your computer activity being monitored and broadcast, your email or Facebook account being used to send the virus to your friends, family, and colleagues, and more.

    Microsoft has released a dirty patch to deactivate the vulnerable part of Windows until there's an actual fix, but it's believed not to be effective at preventing the spread of the worm, AND because the vulnerability exists in such an integral part of Windows it seriously affects your ability to use Windows. To paraphrase Steve Gibson, Windows uses shortcuts as the "glue" to link things together in the OS, even within some dialogues and other places you don't realize, so running the supposedly ineffective Microsoft patch leaves you looking at a lot of white squares and unable to perform certain tasks.

     

    Microsoft Security Advisory:
    http://www.microsoft.com/technet/security/advisory/2286198.mspx

    Symantec's Breakdown:
    http://www.symantec.com/connect/blogs/w32stuxnet-network-operations

    Security Now(The first 30 minutes is about Stuxnet):
    http://twit.tv/sn258

     

     

    Weird Flex Error #2006

    I was getting this weird error whenever switching from a given state to it's parent state in a Flex 3.5 based project.

    RangeError: Error #2006: The supplied index is out of bounds.
    	at flash.display::DisplayObjectContainer/addChildAt()
    	at mx.core::Container/addChildAt()
    	at mx.effects::EffectManager$/removedEffectHandler()
    	at Function/http://adobe.com/AS3/2006/builtin::apply()
    	at mx.core::UIComponent/callLaterDispatcher2()
    	at mx.core::UIComponent/callLaterDispatcher()

    It threw me for a minute because I hadn't made any changes to effects since I last tested the application and I couldn't see any connection between the code I had just written and any effects in the app. But after hunting around I found the culprit. There's a set of components in a Canvas that gets removed when moving to the parent state. What I had done was separate those components into two Canvases(Canvi?). For whatever crazy reason the new second Canvas can't have a RemoveEffect. The code works fine if just the first Canvas has it, but if both or just the second Canvas has it then it throws that error.

    side note: the reason it took me a while to find the source of the error was because I copy/pasted the canvas declaration only changing the id, and I forgot that there was a removedEffect associated with it.

    But wait there's more. The reason I split the components into two distinct Canvases was so I could position one below and the other on top of a third major component in z-space. The solution was to add the first Canvas as a "firstChild" and the second Canvas as a "lastChild". That it seems was the problem. In mxml when changing states you apparently can't add a firstChild before adding a lastChild. so I copy and pasted the first Canvas below the second one, so that all the lastChild additions occurred before all the firstChild additions and voila, presto, it works.

    The reason is that when you move from a state back to its parent state it follows the order in which you add components in the state declaration to remove them. If the first component you add is added as a firstChild then that get's removed first changing the indexes and number of children of the parent container. I guess the underlying state changing function already calculated what the lastChild index was, so when trying to remove a Child with the pre-calculated index of lastChild it triggered an index out of bounds error.

     

    15 Reasons to Ditch Facebook: For Dummies

    Feel free to skip down to The Good Stuff.

    And when you're done here think about reading about the Boycott Facebook movement.

    I left Facebook more than a year ago and it went like this. Unfortunately the final straw causing me to want to finally leave, was the same reason I couldn't. Deleting my Facebook account on that day under that TOS(Terms of Service) would mean Facebook had the right to use my identity, content, and likeness forever, in any context, for any reason. So I deleted all my content on Facebook instead, changed my profile to explain to all my friends what a giant scam and shady organization Facebook was. I hoped and waited for the day that Facebook changed their TOS to back to something less permanent, or at least forgot my old profile data/content.. which was unlikely to happen. The next day a few Facebook groups had already sprung up outraged at the new TOS and petitioning to reverse the horrific changes, they were all rapidly growing in support and I had a little hope.

    A few days later Facebook responded, and temporarily reversed the changes to their TOS while they, to paraphrase, worked with users on a Facebook Bill of Rights. While the old TOS was still shady and demented the permanent ownership of YOU and right to sell/share YOU with any 3rd party(multi-teared) for any reason was lifted. Realizing Facebook's Bill of Rights Bologne was an obvious sham I deleted my account as fast as I could.

    I've spent the last year trying to explain to people what a nightmare Facebook is, and what they're becoming - and not only was I right about the direction they were going in, but nobody listened or cared about (see: Understood) a word I was saying.

    The Good Stuff - 15 Good Reasons to Ditch Facebook

    1. Ever Changing Terms

    Every time Facebook updates their TOS - which is quite often, it becomes more frightening, harder to leave Facebook, Facebook's rights to your identity, and right to share your private personal messages, images, and everything you put on Facebook gets more invasive and pervasive.

    2. Auto-Resetting Privacy Controls

    With every TOS update they kindly reset all your "privacy" controls to public for you, and it remains as such until you manually set it back to your preferred level of privacy.

    You're required to race to Facebook when this happens and change them back before your parents and boss see the photos from that crazy kegger you were at last weekend, and before Google indexes your now public life letting it show up in people's Google searches.

    3. Confusingly Complex Privacy Controls

    Facebook's privacy controls are far too complex and convoluted for anyone to understand, and require an afternoon just to configure all of them. There's absolutely no reason for this other than to coax people into not setting them.

    4. Irrelevant Privacy Controls

    Facebook's privacy controls are irrelevant because the Facebook TOS allows Facebook to share all your activity and content with anyone in the world, regardless of your privacy settings. It doesn't matter if your boss can't log into Facebook and see embarrassing photos of you, when your boss can just call Facebook and ask them to send over all the photos you've ever posted, even private ones, even ones your friends posted and tagged you in.

    5. Facebook Applications Can See Everything

    Before I left Facebook I had made a small Facebook application. While I never used it for this purpose it shocked me to find out that even back then I, a 3rd party developer who had to provide no ID of any kind to Facebook, could access ALL OF THE PRIVATE INFORMATION AND CONTENT of anyone that added my application to their profile and ALL OF THEIR FRIENDS', AND FRIENDS OF FRIENDS' PRIVATE INFORMATION AND CONTENT. I could access everything, and I could do whatever I wanted with that information. I could visit your mother's house and hand her a printed out copy of an embarrassing photo of you. I could start a website where I just published all your personal information.

    6. The new Facebook API - Social Graph

    An API is when a website let's 3rd party programmers access their content from their 3rd party website or app. So the Twitter API let's TweetDeck login to Twitter for you and fetch your friends/updates/etc. so that you can see and interact with Twitter in TweetDeck.

    At their recent developer conference, Facebook unveiled their new API which is currently available for use. It let's any website log into your Facebook and is Opt-Out. Which means you have to deliberately decide not to use it.

    Every porn site, joke site, self-help site will soon have a small chunk of code added which automatically logs you into your Facebook account and gives the random site near total control of your Facebook profile.

    Which means not only does ilikedonkeyshahahowdoistop.com know exactly who you are, who your friends are, and who their friends are, can post to your wall which videos you're watching, questions you're asking, pictures you're looking at. They can also create a Facebook group and make you a member of it, they can email your mother and tell her what you did on their site, they can Facebook message all your Friends and tell them how much you love their unique brand of porn, and that's only the tip of the iceberg.

    Aside from ilikedonkeyshahahowdoistop.com being able to know and do all that and more without any real consent(that's now, soon you won't have to give any consent), Facebook also has all this data. Facebook knows your browsing habits, they know the content of every page you visit. EVEN if there's a mild warning that says "Would you like to let this site use your Facebook?" which there are many ways for the shady site to hide and obfuscate, even if you see that warning and click "No", that Alert/question comes from Facebook who knows exactly where you are on the web, exactly what the content of the page you're on is and can watch what you're doing there. So even if you stay on top of every setting Facebook gives you and opt out of everything, Facebook still knows everything you do on the internet and can and will share that information to ANYONE THEY WANT, ANY TIME IN THE FUTURE, and the 3rd parties they share it with are also allowed to share the data with anyone they want forever.

    7. Beacon

    Beacon was an ad program a while back, that sort of came back on and off, where Facebook would advertise to your friends - without your consent - in your name. For example, Facebook could show your friend Jenny a message saying that "you really like Bacon Slather -a revolutionary new product where you bath in grease, and that last Tuesday when you used it, you had an orgasm and called out her name." They would be able to do this, and did, regardless of whether you had even heard of Bacon Slather.

    They would also turn things you did actually post into an ad. So if you posted an status update saying "Fred is a total douche" Facebook would not only be able to re-word your update, but they would turn the word douche into a link that took any of your friends who clicked on it to a porn site specializing in videos of women douching. The new Facebook API is the latest evolution of Beacon.

    8. Facebook's Revenue

    Facebook makes money, and is setting up greater infrastructure to make money, by selling your private(regardless of privacy settings) information and content to anyone who'll buy it (advertisers, scammers, spammers, the government, the media, a thief, a murderer, your mother, your boss, anyone). Putting anything on Facebook gives Facebook the right to do that forever, so don't think about changing your mind 5, 10, or 5000 years down the line. They keep everything you've ever posted.

    9. Facebook Intends to be a Publicly Traded Company (as in the stock market)

    Aside from the manipulative, convoluted and outright morally wrong behaviour Facebook has and continues to exhibit in the name of exploiting its users for profit. When they go public they will have a legal obligation to its shareholders to maximize profit. Everything bad about Facebook has increased in severity by a factor of 10 since I left a year ago, and will drastically increase as they move towards and begin offering their first stocks.

    10. Facebook Continues to Exploit You After You Die

    Usually when a person dies, their bereaved family sends proof of your death to the various websites you belonged to so that they delete your account, and/or let your family save some of the pictures and memories you stored in the cloud.

    When Facebook get's someone's death certificate the first thing they do is lock the deceased person's account. So even if your husband/girlfiend/whatever knows your password and wants to delete your Facebook profile, they're blocked from logging in. Then the account is given special dead person status, so every one of the dead person's Facebook Friends now knows they're dead. In addition and perhaps most shocking, Facebook then lets any of the dead person's Facebook friends - regardless of privacy settings - comment on the dead person's wall and photos. Often your Facebook friends are not people you really know, friends of friends and complete strangers. There is no way for the grieving family to remove, edit, or otherwise hide obsene, disgusting, and offensive comments, photos, and links posted to the dead person's wall. They just have to watch as the memory of their loved one is tainted and destroyed - and public.

    Facebook will keep a dead person's profile in this locked down public state for about 60 days after the last person visits the page. Because every visit is a chance for you to click on one of the diet ads on the side. So 60 days after everyone forget's about your dead loved one Facebook will take the page down because it no longer generates profit for them.

    11. Facebook is You

    When you use Facebook, you agree to give them equal rights to your identity and likeness. One of the sick things they do with those rights is take control of your Profile.

    Recently they began perpetuating people's profiles after they delete their Facebook account. So you decide you want to leave Facebook today, you delete your account, but your friends can still invite you to events, send you friend requests and pokes, and tag you in photos. Searching for your Facebook account still turns it up - like you never left.

    So deleting your profile and canceling your Facebook account doesn't actually do that, instead what you're doing is going from joint ownership and control of your Facebook account and profile, to giving Facebook complete control.

    It's only a matter of time before Facebook uses your "deleted" account to carry on conversations with your friends in your name, and resurrects random historical profile data, or simply generates new information based on what you've typed in before to make it look like you're still on Facebook.

    If you delete your Facebook account today, you may get a phone call next week from your friend Jenny wondering why you told her you hate her and why you posted a photoshopped image of her profile picture were you replaced her head with a cow's. You'll try explain to her that Facebook is now controlling your profile and it was them and not you, but she won't believe you and you'll have to join Facebook again just so that you can jointly control your profile with Facebook and be dragged back into the site again.

    This also means that some of the people you're interacting with on Facebook - or stalking - aren't really them. It's just Facebook pretending to be them, not that such a thing makes your Facebook relationships any more hollow.

    12. Facebook is Inherently Insecure

    As I explained here aside from the myriad of reasons Facebook is insecure, it contains a very public (regardless of "privacy" settings) list of all your social connections, where you go, and what you do. This information is now being used by spammers and hackers to manipulate you into opening virus laden emails you normally wouldn't by posing as your friends and sending you links to viruses that can't be detected by anti-virus software that's in a social context which you trust. They're scamming people out of money, pretending to be a friend stuck in another country who just needs $900 to get home where they'll pay you back. And also as a resource for answering your secret questions. A lot of sites, including some banks and email providers, let you pick a secret question and answer in the event you forget and/or need to reset your password. One look at yourFacebook data and anyone can reset your accounts locking you out and letting them in.

    13. Tech People in the Media are Leaving Facebook

    The people that stand to lose the most from leaving a social network are finally pulling the plug. These are people that live in the public eye, so they're a lot more comfortable with Facebook's loose privacy, and their leaving Facebook affects their fan base who friended them on the network. About a week ago Leo Laporte deleted his Facebook account citing impossible to understand privacy settings, and the lack of ethics of the company. Leo Laporte for those who don't know is a tech god and hugely trusting, when he has a beef with something or someone it's so justified you'd have to be a turnip not to follow suit.

    14. South Park

    South Park and other comedy shows are starting to point out the hilarity of Facebook's TOS and "privacy" settings.

    15. None of This is a Surprise

    Facebook's founder and creator Mark Zuckerberg stole much of the code, and concept for Facebook from his school friends before he dropped out. They sued him and because Facebook was taking off he was able to settle out of court. He has a history of unethical behaviour, so it's no surprise his creation operates in a completely unethical malicious way.

    What Do We Do Now?

    First of all stop using Facebook immediately. Don't post another real status update, picture, comment, nothing.

    Quite frankly unless you live in a country that enforces your rights and freedoms on the internet, of privacy, and prevents you from being obligated to unreasonable contracts you're totally and royally screwed.

    If you're lucky enough to live in such a country first remove all your Facebook content and data, set all your privacy settings to the maximum privacy (to show intent in case you have to prove in court one day you wanted private) then completely delete and remove your Facebook account and profile. This is an intentionally long, confusing, misleading process and one more way Facebook has decided to abuse you. Document the process with screenshots, and email yourself the evidence so it's timestamped.

    If you live in a country that doesn't care that you foolishly sold your soul to the devil, or the above doesn't work and you find your profile is still active and interacting with its Facebook friends without you, you'll need to opt for plan B.

    Plan B involves keeping, or reactivating your Facebook account, making sure the only content associated with your account is about what an evil entity Facebook is, and have your "privacy" settings set to public. The best thing you can do in that situation is help create awareness and spread the word. Friend people on Facebook, and friend them with a message about why you're not able to delete your account. Start and join groups about it. Get the word out.

    If enough people do this they may temporarily change their TOS to reflect a non-permanent contract which will allow you to actually delete your profile instead of just giving Facebook full control over it.

     

    Flex Skins, Registration Points, and Illustrator CS5

    In Illustrator CS4 it was really easy to make Flex Skins. You just go to File -> Scripts -> Flex Skins -> Create Flex 3 Skin, choose the components you want to skin - optionally give it a style class name, style it, use the same menu to export for Flex, use the Flex Builder skin import feature which creates or adds to your CSS file and blah blah blah. If you want me to do a tutorial on that just comment and ask.

    In Illustrator CS5 they've updated the way registration points work. Flex 3(halo) skins require that the registration points be in the top left of the symbol. Illustrator CS5 defaults to a center registration point, so when you open your CS4 Illustrator skin file in CS5, it updates the registration point mechanism and defaults all your registration points to the center. Don't hulk-smash your computer just yet.

    Another key difference with CS5 is while you get finer registration point control, it takes more work to move the registration point after the symbol is created. Say you've opened your CS4 created Flex 3 skin in CS5 and your registration points have been centered. There are a bunch of ways to edit the symbol. You could double click on the the symbol instance, or the symbol in the symbol pane, or click Edit Symbol at the top. Once editing the symbol, you'd need to drag your symbol around - make sure you get all the layers - positioning it rather than the registration point and don't forget to move the 9-slice guides. This process get's messy fast, it's time consuming, and it'll be hard to get the registration point and guides exactly where you want/need them. It's aggravating that there isn't a faster way to do it, and that in converting the file to work with CS5 it doesn't keep the registration point locations. So if you know a better faster way let me know. Until then here's the fastest way I've found to move all your registration points back to the top left.

    1. First Save as your skin file, you can use the same filename but will get a dialog to save it as a CS5 compatible file
    2. Click on the symbol instance, ie: the Up skin for a button, make sure you've got it selected on the artboard
    3. Click on the Symbol Options button in the Symbol pane
    4. Copy the name to the clipboard (ctrl/option + c)
    5. Click Cancel
    6. Click the Break Link button in the Symbol pane
    7. Make sure the correct symbol is still selected in the Symbol pane, the selection may have jumped to the top left symbol in the list
    8. Click on the Delete Symbol button in the Symbol pane
    9. Delete the symbol, if it tells you there are other instances then take special care and double check that the correct symbol is selected; due to the nature of a flex 3 skin there should only be one instance of each symbol. It's not impossible to have multiple instances, but you would know if you created them.
    10. Click on the New Symbol button in the Symbol pane
    11. Paste the name you have in the clipboard (ctrl/option + v)
    12. Select the top left corner for the registration point
    13. Tick the box for Enable Guides for 9-Slice Scaling
    14. Click Ok, and repeat for every other symbol
    15. Now you can save, backup with DropBox, export as a Flex 3 skin, and finally it's time...
    16. Hulk-SMASH!!! SMASH! this really should have been automated in the import mechanism.. right?

    Adobe AIR Installer Not Default For Opening .AIR FIles

    For some unknown reason - which could likely be attributed to my own stupidity if one were to look into it, .AIR files were associated with the Windows version of Firefox inside a Parallels VM I have set up on my Mac. So trying to install an AIR application, or letting an AIR application auto update itself resulted in launching Parallels.

    I figured I'd post this cause the location of the AIR Application Installer that you would want to be associated with .AIR files eluded me.

    So to fix it just right click on the .AIR file. Choose "Get Info". In the Info window expand the "Open with:" arrow, and make sure "Adobe AIR Application Installer" is selected. If it isn't choose "Other..." in the dropdown list and navigate to Applications->Utilities->Adobe AIR Application Installer, select it and tick the box that says "Always Open With" before clicking "Add". Then back in the Info window click the "Change All..." button to apply it to all .AIR files.