I love C#. It takes everything I loved about my years programming in early Java and adds boatloads of wonderful. But, there is one thing that perpetually infuriates me. All C# source code includes coder-included class, type, and other references that are all relative to a list of "using" statements at the top of the source code file and also a list of libraries managed separately in the Visual Studio UI. The problem is that all the wonderfully helpful source code that people post on the web never includes these UI-managed library references, which means that any time you copy and paste those bits of C# source code you will get lots of squiggly red lines telling you that Visual Studio has no idea to what the classes, types, etc. given in the source code refer. And since I've just searched the web because I didn't know how to solve a problem or because I'm learning some new framework or paradigm via some example on a page, I usually have no idea what library or libraries I need to reference in order for all the dependencies to be satisfied.
Case in point, I just had a look at the Google Drive API "Quickstart". They show you a simple snippet of source code you are supposed to try yourself. They do not give you a Visual Studio project, just the code on the screen you need to copy and paste. They also tell you to download the API libraries. I did. The library has what looks like a common library directory with 10 or so DLLs (and various other files) and a separate folder with 45 folders for various "Services" and inside those more DLLs. And I am somehow supposed to know which DLLs this 20 line piece of source code needs??? So to be safe I end up including all the common libraries and both the libraries under the "DriveService". But the code won't compile. All the references are satisfied but now there's ambiguity between because an extension method is defined in two separate imported DLLs. It takes me another 20 minutes to figure out which one I don't need. Why do we have to go through all this??? It is all so utterly needless. I can't tell you how many times I've been unable to try out a piece of source code because something has gone wrong in figuring out and finding the libraries that were needed, and which versions of the libraries were needed (since libraries can radically change with every release).
What boggles the mind is that neither Visual Studio nor third-party VS plugins like ReSharper do anything to help. Surely something could be done to largely eliminate this problem! At the vary least, why couldn't they include a "header" like region at the top of the VS editor UI which lists the actual fulfilled references for that active file. It wouldn't actually be part of the source code, it would just be a handy little (perhaps collapsed) virtual piece of commented code that would be copied whenever you ctrl+a ctrl+c file contents. And when you pasted it elsewhere it would let people know what out-of-band files they were missing. The format would probably just specify the Portable Executable data for the file and the hash (not the actual path which would be less useful and less anonymous).
Here's hoping they do it one day, or someone makes a nice little third-party plugin that is able to sort it out for you (by having a massive DB of exported library functions and some good heuristics)...
All certificate signing agencies basically do the same thing, they provide a means by which a user browsing a site or using a piece of software can know who is operating the site or writing the software. Code signing (and signing in general) is a wonderful thing. I fully believe in it. But you don't need these centralized commercial entities to provide it. And I'm just not convinced of the value add of signing authorities which charge a lot of money to (in my view) add only a thin veneer of security.
The vast majority of those applying for certificates are surely entirely legitimate and provide entirely legitimate details. That means that the vast majority of certificates signing authorities give out are entirely valid. But that's not proof that the system is good. Surely the effectiveness of security is determined not by those who intend to stay within the law but those intend to violate it. Airport security is not good because it finds no bombs on lawful people, it is only good if it is able to find bombs on unlawful people. Certificate agencies' version of due diligence is laughable, they generally require nothing more than emailed (or faxed) images of desired documents. Could someone submit easily photoshopped documents to a signing authority and have their credentials "validated" such that they get a signing certificate? Yes, it's been done. And even if the certified owner was valid at the time the certificate was issued, the security provided to end users (those looking are supposed to rely upon the certificates) is fleeting at best; the certificate owner can always move, disconnect their phones, or give the certificate to others.
Now in no way are these signing authorities radically different than the purveyors of other more traditional security products. It's true that we put locks on our houses and secretly know they would keep out only the laziest or stupidest of criminals (lock picking being an easily acquired skill and glass being easily broken), but signing certificates have the potential to be so much better. The fact that they are not, and that they cost so much for not being so superior to self-signed certificates, frustrates me. I just wish signing authorities would either do more (require you show up face-to-face at an office with a passport to be fingerprinted and DNA mapped) or do less (acknowledge how easily they may be deceived and not make you jump through hoops to proffer false 'proof').
But here we are in the land of is... God bless the industry of false security.
The free, multi-party video conferencing offering Google+ Hangout is a pretty fantastic alternative to Skype (and its paid multi-party option). Wouldn't it be wonderful to have a UI control you could drop into any .NET application that gave you all the power of Google+ Hangout? Well, it would... and I've been working on it, but so far it's not proved easy.
First a bit of back story. I have been working on an app which features embedded video conferencing and had gone initially with Skype. Skype has been a somewhat miserable experience thus far, workable but only just. The only way I've been able to integrate with Skype thus far has been their Skype4COM option. Skype4COM allows you to remote control certain features of Skype from a third-party application. You can initiate calls, hangup, mute, and things but you can't hide the original Skype interface or embed its video in your own application. There is a way to do all that, and it's SkypeKit. But for reasons unknown to me they seem to have suspended SkypeKit access. I applied to the program many months ago and my account still says something like, "We'll get back to you about SkypeKit when we're ready for you." I've heard from others that that's just the way it is right now, that they are redoing SkypeKit or something. At any rate... Skype isn't a great solution at the moment. Google+ Hangout on the other hand would be perfect, if only it worked.
I spent a few days a few weeks ago trying to create a Windows control that would let me embed Google+ Hangout inside a Windows control. The logical approach to do that would be to customize a web browser control to load up the web-based Google+ Hangout and just modify the rendered content and inject JS as necessary to achieve the desired control-ifying of Hangout. I've done that before, so I didn't think it would prove so tricky.
Microsoft WebBrowser Control
I first tried using the built-in Microsoft WebBrowser control as the hosting control. I automated Google account sign-in and had it load up the Google+ Hangout page. I hit the first major roadblock. The page gave me a warning about my browser agent not being supported. I went back and added code to spoof it, but that didn't seem to work as the WebBrowser control isn't all that sophisticated and only spoofs the user agent for the first request, not subsequent ones or ones that the loaded page fetches. I tried several alternative WebBrowser extension classes that try to intercept navigating requests and replace them with navigate calls that include the spoofing, but they didn't seem to work properly. If memory serves I did reach a point where I was able to call the JS to start a hangout but everything hung when it tried to install/start the hangout.
The next option I tried was Awesomium, a Chromium-based behind the scenes browser rendering system. After looking at some of their examples and struggling a bit with their concept (which differed radically from the WebBrowser control and MozNET control approaches I was used to) I ended up realizing I could use one of their demo apps as a quick way to test the concept. They had a tabbed web browser demo which I used to access Hangout. I was able to initiate a Hangout but the video of the Hangout was not contained as it should have been within the Awesomium demo browser, the Hangout window was at the top left of the screen whereas the browser was in the middle. So it worked but if they couldn't control where it was rendering then I didn't think an Awesomium would be an easy solution.
MozNET / Xulrunner
Next I tried my old friend, MozNET. MozNET is a XULrunner implementation which I've quite enjoyed using before. There again I wen the easy route first and used a demo browser example to see if I could get it working. Sadly it did not work. It would just hang at the step where Hangout is checking for its plugin. I feel like a MozNET solution wouldn't be too hard to achieve, but I don't have the depth of knowledge in it to make it happen easily. I know MozNET can be made to work with various XPI-based plugins.
Oddly enough, Google+ Hangout doesn't seem to be an XPI plugin. I did a procmon.exe dump of a Firefox when using Hangout and I see access to:
And a separate EXE gets launched:
C:\Users\foo\AppData\Local\Google\Google Talk Plugin\googletalkplugin.exe
But I'm not sure how what is doing the communication between Firefox and the Hangout code.
If anyone has any thoughts they'd like to share, please let me know! I think the world would benefit from an embeddable Google+ Hangout control... I know I would.
When Kindles (and all the other e-reader marketplaces) came into the world one of the big selling points was that books would now be cheaper! And how could they not be cheaper, there was no physical book to manufacture or ship! All the various e-reader marketplaces do showcase many lower priced books, but more and more I'm seeing the Kindle version of books priced much higher than the physical books (BOTH hardcover and paperback)!
Take this recent example, the paperless Kindle version of "The Art of Innovation" is 13% more expensive than the hardcover and 70% more than the paperback!
The original logic of "it costs less to publish an ebook so we'll charge less and the consumer will then buy more e-books" has now given way to "let's charge the consumer more for the convenience of an e-book, bank the extra profit, and who cares if they buy more e-books". I'm not saying publishers can't do what they like, shouldn't do what they like, I'm just a little tired of being white lied to. If the ultimate goal is to screw us into paying more for books, don't butter us up and suggest the future will be the complete opposite.
“Be American! Buy American!” Says the Foreign-Born Mini-Mart Owner Selling Chinese Lighters, Drug Paraphernalia, and Porn
When I first saw the sign I was ready to be offended, assuming the sign was a misguided attack against completely legal, hard-working immigrants who often found employment the only place they could, at mini-marts. But the moment I walked into the store the tables suddenly turned and suggested that I was the one discriminating against someone, not them. The store was in fact owned and operated by a family who immigrated from India.
The odd thing is, even now (months after I first saw it) the sign still bugs me and I can't figure out exactly why.
Part of my frustration with the sign stems from the fact that I still don't know exactly what it means. Typically someone telling you to "Buy American" means you should buy products made by US companies at factories in the US. But this sign can't possibly mean that because the store is hardly so exclusive, they sell all your typical, cheap, Chinese-made mini-mart crap and then some. So the next likely interpretation is that it means you should buy from stores owned or operated by Americans (as opposed to buying from stores owned by foreign corporations or staffed by illegal aliens). But this also confuses me because so far as I'm aware there are no stores within 5+ miles which are not owned and operated by Americans. We're in rural Pennsylvania, the vast majority of people around here have been here since at least the civil war. In fact the nearest and most popular competitor to this mini-mart is one called Sheetz, an American owned chain, operated by a whole lot of lily-white, native speakers. So, what would be the point of a sign saying you should do something that realistically you cannot avoid doing anyway? And that's what seems to generate most of my dislike for the sign. It feels not like a sign meant to celebrate, cement, and secure the owner's adopted homeland, but like a gimmick, a cheap marketing technique intended to somehow justify their excess prices, encourage a faithful customer base, or discourage robberies by patriotic Americans. Fueling my dislike for the sign and the store is also that the store is hardly representative of an America I want encouraged. Unlike other local mini-marts, this blue-blooded American neighborhood mini-mart sells many unsavory things: drug paraphernalia and raunchy porn. Perhaps those items were made in America, but I'm not sure that's sufficient justification for selling it. (The drug paraphernalia are mesh screens (which I understand are used for smoking various drugs), a large selection of rolling papers, Swisher Sweetz (and other cigarillos that people seem to put drugs into), etc.)
Separate and apart from my dislike for the nature of the shop and my suspicion about motivation for the sign, I can't help but admit to some vague and hard to define (or defend) uneasiness with the "new kid on the block" telling us native-borns what to do. I love the USA and I love that other people love it, too. I want people to become lawful citizens, marry themselves to our culture, accept our best and our worst, and want to join in our attempt to be better united than we are apart. But were I to move abroad and become a citizen of elsewhere it would never occur to me to tell anyone there how they should be. They were there first, they know their culture far better than I do, they "get" the nation I will be forever getting. I certainly do and will defend any new or old citizen of the USA their right to share their thoughts and opinions, but it doesn't mean I have to like it. Maybe that is a prejudiced position, or maybe it's just a natural position that all cultures have to encourage stability and discourage imposed change from unfamiliar or outside influences. I don't know.
A few times a year I run into situations where an application, a driver, or something effectively locks me out of my computer. After trying various remedies I am ultimately forced to do a hard power down of the computer. I cringe every time I am forced to take that action, praying I don't end up with corrupted files.
Today I had enough. I went to shutdown my laptop and head out the door to go get a working lunch only to have my computer log me out and show me Acronis True Image's dreaded, "Operations are in progress. Please wait. The machine will be turned off automatically after the operations are complete." That is Acronis True Image's way of saying, "We're not going to shut down until a backup or backup verification finishes." The problem is those operations can take hours, and nine times out of ten the message is bogus, indicating not something in progress but a job that's hung. Today's case was one such example that would have left me waiting forever; the backup drive was disconnected, so Acronis True Image could not have been doing anything at all. When this message is displayed there's no normal way to force a shutdown other than forcing a power off with the power button. There is no ability to log in locally, no ability to log in remotely via RDP, no ability to use System Internal's remote tools (I am not sure if the reasons relate to permissions or not, I've not adequately investigated). So, today I decided to put in a back door which will save me in such situations.
Schedule a Task to Periodically Run a Remotely Editable Batch File
In all the cases where these sorts of things have happened I've noticed that I can still remotely access the computer's file system just fine. This got me to thinking I could use that as a vector for forcing Windows to execute some code to force the shutdown. To that end I created a shared folder on the laptop called "backdoor", made sure permissions allow only myself the privilege of editing its files, and created a single batch file inside it called backdoor.bat. I then set up a task in Windows Task Scheduler to execute that batch file as administrator (UAC) every 5 minutes from now until forever. When not needed the batch file is effectively empty, just a couple of commented out batch commands. If I find myself locked out I can populate the file with whatever executable commands might be appropriate to force the shutdown (e.g., System Internals' pslist, pskill, psshutdown).
Since setting this up a month ago I've already had two occasions where this method saved me and allowed me to shutdown my computer gracefully!
For anyone curious, the commands I put in the backdoor.bat file are:
C:\systeminternals\pslist -accepteula > pslist.txt
C:\systeminternals\pskill -accepteula trueimagehomeservice
C:\systeminternals\pskill -accepteula trueimagehomenotify
Those lines are commented out until and unless I need them. The first line lets me grab a snapshot of the running processes and put them in a text file I can read, very useful if the system still doesn't shut down. Since my task will only run every 5 minutes if the first attempt doesn't shut things down I've got several minutes to review the process list and find other processes to try and kill. The last two lines kill the processes that are typically hanging my shutdowns (I haven't bothered to check which of the two processes is the problem, so I just list both.)
Initially I tried to just use a more generic approach and force a shutdown ("psshutdown -accepteula -r -f -t 60") but I could never get this method to work, it didn't ever seem to kill the jobs that were hanging things up.
Since setting this up I've needed to use it a dozen times or more, saving me almost as many hard resets. The most frequent situation in which I need to use it has been when Stardock's Multiplicity prevents my keyboard and mouse from being used and when Acronis' True Image prevents shutdown (see above).
Multiplicity is a fantastic app that lets your mouse and keyboard seamlessly switch between different computers as though they were just extra monitors on the one computer. It is brilliant software, but has had a hugely serious bug in it for all the years as I've used it. If Multiplicity gave focus to another computer and that computer went offline (network outage, sleep/shutdown, software crash) it won't let you regain the use of your primary computer. Whatever timeout logic should restore your ability to use your primary computer fails the vast majority of the time and you are locked out of your own computer, unable to send commands to it. My backdoor trick lets me kill off Multiplicity and regain access.
I couldn't help but be a little intrigued by all Raspberry Pi hype. A computer smaller than a deck of playing cards, able to run Linux/ChromeOs/etc. and costing only $25-35 (depending on the model), sure sounded interesting. There are no end to computing projects I have in mind to undertake, so this seemed the perfect platform for them, particularly when the Raspberry Pi community is so friendly and supportive.
Well, having had my Raspberry Pi (model 2) for a week now I can certainly say that it's cool alright, but I'm increasingly convinced that its use in the desktop-related computing projects I had in mind is severely limited. The official Raspberry Pi Debian release runs, and includes a resource friendly web browser and other resource friendly apps, but attempting to run anything else is painful. One project I am working on uses JonDo, the magnificent privacy proxy, so I tried to see if the JonDo client would work with Raspberry Pi. It does install, and run, but it is painfully slow as to be utterly unusable (perhaps because of the Java overhead or perhaps because of the encryption demands). So much for that.
The thing I love most about the Raspberry Pi so far has less to do with it and more to do with the discontinued Motorola Lapdock. A couple years ago some people at Motorola and elsewhere thought that what people really wanted was a way to use their phone as a laptop and I remember all the hype surrounding the "lapdock" which would let you do just that. Unfortunately, at a price of $500 people really didn't want it, opting instead for cheaper $250 netbooks and $250-600 iOS/Android tablets. Sad for Motorola but great for anyone now because these over-produced lapdocks have been hitting the deep discount sales sites for the last year or so, currently selling them for $49! What you get for $49 is a fabulously elegantly, slim 10" display with keyboard, touch pad, and built-in rechargeable battery back! I seriously know of no better tech deal ever! Now, the cool part is that rather than use some proprietary connectors the lapdock uses separate micro HDMI and micro USB connections, and being universal standards you can connect a Raspberry Pi or anything else you want up to these connectors! I bought a second Motorola Lapdock to use as part of my emergency computer repair tool kit, with this thing and a few cables I've got a mobile keyboard/mouse/monitor I can hook up to any down server or computer with questionable peripherals.
In the case of Raspberry Pi this means that for $49 (Motorola Lapdock) + $35 (Raspberry Pi model 2) + $10 (cost of cables) you have a $94 laptop. Admittedly it's a pretty underwhelming laptop in a field where vastly more powerful laptops can be had for just over $200, but still... If you're buying a Raspberry Pi for anything other than experimenting then you're doing it wrong.
Watch the video above to learn what cables you need and how to modify them; the girl in the video throws me off a bit, I think it's the Ferdinand the Bull nose ring and reddish hair. Also, check out this cool modification to learn how to add a super capacitor to your Raspberry Pi as a great little backup battery/brownout protector (which is particularly useful with the lapdock).
If you used your Windows 8 Upgrade media to install a clean copy of Windows you've probably discovered by now that Windows 8 won't activate, telling you that your key is for upgrade and not clean install. Don't fret, there is a simple solution which does not require you pointlessly installing an old copy of XP, Vista, or Windows 7!
The easy three-step solution is:
- Modify the registry key HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\OOBE and set the MediaBootInstall value to 0 (zero).
- Open an elevated command-prompt (run command as admin) and execute this command: "slmgr -rearm"
I'm not sharing this tip as a way to cheat Microsoft out of a dollar, I'm sharing it because anyone experienced enough to be installing a copy of Windows 8 on a clean hard drive has surely owned enough Microsoft computers over the years to legitimately qualify for the upgrade. With Windows XP through Windows 7 qualifying I know in the last 12 years I've owned and still have legal rights to at least 10 - 15 installations (mostly from retired computers).
Every year it seems like I receive an email forward from irate Christians wanting to remind me about how Christmas is being co-opted by the gay, feminist, atheist, capitalist agenda who are hell bent on taking the Christ out of Christmas... This year I couldn't help but respond to the most recent forwarder, my dad, who had attached his own screed. This is my response.
You poor, poor American Christians. How oppressed you are with your undefeated record of electing 44 Christian Presidents (unless of course you conveniently think Obama is Muslim), your vast 89% majority in Congress, your significant 77% majority of the US population. Oh, but of course maybe those aren't "true" Christians. Funny, they look pretty good on paper with 61% of the population believing that evolution is a lie, and 45% of the population believing the Earth is less than 10,000 years old.
But you go on with your hypocritical lives, your convenient selective memory of the Old Testament and the New. Keep quoting the Old Testament to stop the queers from their equality, your marvelous quotes about slavery kept those uppity Negroes in chains for a few hundred extra years. And don't worry, I'm an atheist so I don't have the mandate to stone you for working on the Sabbath, for eating shellfish, getting tattoos, or association with menstruating women. And I'll try to resist quoting Matthew 5:17-20 and all that stuff about, "Don’t think that I came to destroy the law or the prophets. I didn’t come to destroy, but to fulfill. For most certainly, I tell you, until heaven and earth pass away, not even one smallest letter or one tiny pen stroke shall in any way pass away from the law, until all things are accomplished." I'm just an amoral, compassless heathen apparently bent on doing all I can to make some tasty s'mores while I watch the world burn.
Oh, and as for Jesus Christ ruling forever, good luck with that. Hope He has a bit more staying power than the Sumerian religion, the Babylonian religion, the Assyrian religion, the Egyption religion, the Greek religion, the Roman/Mithra relition, the Germanic/Norse religion, the Maya religion, and all the others that have faded into history. All those religions sure seemed convinced they were the real deal, and I'm sure all their followers sure were pretty miffed when you people started taking the Zeus out of Zeusmas, the Isis out of Ismas, etc. So I get it, you are right to be outraged. Shout "Merry Christmas" or "I love Jesus" at whoever you want as loud as you want, nobody will punch you in the mouth like they would me if I yelled out "Merry Jesus is a Myth Day". But you're right, you're the oppressed, distressed, offended people here. I keep forgetting that.
It's a funny thing, outraged Christians sure sound a lot like outraged white males, probably because so many of them are. A few thousand years of ideological domination and the subjugation of others just never feels like enough, does it? Even when you accept the notion that equality is probably inevitable you sure do grouse about the thought that women, blacks, gays, foreigners might temporarily get 'unfair' educational, career, financial advantage. How dare the pendulum swing even a tenth of a degree in their favor, what an affront to a system you'd so carefully rigged over centuries with all your social and religious mores.
Funny thing is, I'm actually all for you loving your Lord. I want you to find spiritual sustenance wherever you may. I am not the least bit offended nor do I shy away from your Merry Christmases. There is much to respect about the modern interpretation of Christ, certainly a lot more than the interpretation which brought us inquisitions, crusades, the burning of misidentified witches, and whatever horrors future interpretations may bring. It just irks me when you whine about your lot, at the notion that others might dare for a few moments here or there to be as loud and as obnoxious as you felt quite comfortable being during various parts of your continued Western World domination.
Be gracious winners, not whiners. Your majority rule hasn't ended yet. Try to enjoy your declining years, it sounds like you are the ones confusing a trip to a big box department store with a trip to a church. I read nothing about the exchange of big screen flat panel TVs in the New Testament. I can't imagine mixing up the joy at my savior's birth with the joy of unwrapping a toxic toy made by children in China. If you expect God to be found in Best Buy or City Hall you're bound to be increasingly disappointed, try visiting your perpetually-renewing local house of worship instead. All public traditions get co-opted, by non-believers, by capitalists, by the ignorant, by people who simply see a good birthday party and want to attend without giving a damn whose birthday it is. I didn't turn your Christmas into a business proposition, that was you believing folk who made a religious celebration commercial, who took to exchanging increasingly expensive items as a proxy for religious passion.
This atheist wishes you all a very Merry Christmas, in the truest sense of it. Enjoy Christ, love Christ, celebrate Christ this December 25th. And quit your bitching about people at the local mall or city hall or school awkwardly trying to make room for others at your table of largess. But, do let me know if any of those folk wander into your church and try to make your pastor take the Christ out of Christmas, that's when you'll have my full support.
> On Thu, Nov 29, 2012 at 10:40 PM, My Dad<*********@msn.com> wrote:
> Powerful, alarming,sad,sobering, all-too-true message. In response, I AM thinking of, and invoking a message of:
> Wonderful, Counselor, Almighty God, the Everlasting Father...the Prince of Peace...and He shall
> reign forever and ever...and the Kingdom of this world shall become the Kingdom of OUR GOD AND
> OF HIS CHRIST, AND HE SHALL RULE FOREVER AND EVER....AMEN...AAAAMMMENNN...AND...AMEN!!!
> PEACE, Indeed!Thank you...(I am sending this to many)
> From: Somebody
> Date: Thu, 29 Nov 2012 18:46:53 -0500
> Subject: Fwd: Fw: Your First Christmas card
> To: Lots of people
> MERRY CHRISTMAS
> YOUR FIRST CHRISTMAS CARD
> Cleverly done!!!
> Twas the month before Christmas
> When all through our land,
> Not a Christian was praying
> Nor taking a stand.
> Why the PC Police had taken away
> The reason for Christmas - no one could say.
> The children were told by their schools not to sing
> About Shepherds and Wise Men and Angels and things.
> It might hurt people's feelings, the teachers would say
> December 25th is just a ' Holiday '.
> Yet the shoppers were ready with cash, checks and credit
> Pushing folks down to the floor just to get it!
> CDs from Madonna, an X BOX, an I-Pod
> Something was changing, something quite odd!
> Retailers promoted Ramadan and Kwanzaa
> In hopes to sell books by Franken & Fonda.
> As Targets were hanging their trees upside down
> At Lowe's the word Christmas - was no where to be found.
> At K-Mart and Staples and Penny's and Sears
> You won't hear the word Christmas; it won't touch your ears.
> Inclusive, sensitive, Di-ver-is-ty
> Are words that were used to intimidate me.
> Now Daschle, Now Darden, Now Sharpton, Wolf Blitzen
> On Boxer, on Rather, on Kerry, on Clinton !
> At the top of the Senate, there arose such a clatter
> To eliminate Jesus, in all public matter.
> And we spoke not a word, as they took away our faith
> Forbidden to speak of salvation and grace
> The true Gift of Christmas was exchanged and discarded
> The reason for the season, stopped before it started.
> So as you celebrate 'Winter Break' under your 'Dream Tree'
> Sipping your Starbucks, listen to me.
> Choose your words carefully, choose what you say
> Shout MERRY CHRISTMAS,
> not Happy Holiday!
> Please, all Christians join together and
> wish everyone you meet
> MERRY CHRISTMAS!
> Christ is The Reason for the Christ-mas Season!
> If you agree please forward, if not, simply delete.