Wednesday, March 23, 2016

Reporting useful weather observations on social media

In the mid-south severe weather is a major topic of discussion in the spring.  The seasonal warming causes atmospheric instability leading to high winds, heavy rainfall, hail, and tornadoes.  No one can disagree that in order to be prepared you must be informed.

There are so many ways to stay informed about severe weather. You could watch the local news stations, or get some "insider information" on blogs written by experts (such as the Arkansas Weather Blog by my friend Todd Yakoubian).

If you really want the raw data without any explanation or corroboration, you could listen to Skywarn weather nets on amateur radio.  In central Arkansas we have the AR Links Skywarn net, which can extend to cover the entire state, and the CAREN Skywarn Net which covers several counties in central Arkansas.

Even if you don't have an amateur radio license, you can help save lives and property during severe weather by sharing what you see where you are.  Being a weather spotter does not involve chasing a tornado or sitting in your car streaming hail stones online.  All it takes is sharing reportable criteria from right where you are.  Reportable criteria is the term used for the specific clues used by meteorologists that can tell them if a storm is strong, weak, or changing in strength.

How to share weather actionable information on social media

Where ever you are, you can help keep meteorologists supplied with relevant, timely, actionable information by sharing what you see on social media.  In order to ensure your observation can be useful, there are a few tips you should follow.

  • Use the appropriate hashtag.  Hashtags make it easier to locate posts that are about the same topic.  In Arkansas we use #ARWX, which is short for "Arkansas weather".
  • Include your location.  On most social media web sites and apps you can add your location with just a click.  Be sure to familiarize yourself with that option before you need it.  By including a specific location, your report goes from "interesting" to "actionable".
  • Don't share or retweet old reports.  Remember the boy who cried wolf?  We would never want that to happen during severe weather.  If someone posted a tornado warning 2 hours ago, don't retweet that now.  Some people may not see that it's old news.  The next time they may think it's old news again, and the unthinkable could happen.  Don't share or retweet old reports.
    • Be cautious of photos shared from unknown sources.  A couple of times every year, someone digs up a photo from a weather event that happened months or years earlier and tries to pass it off as their own.  The best advice is to consider the source.  There are ways to verify photos, but that will have to wait for another post.
  • Be sure to include an accurate description (include a photo or video if safe to do so), and post reportable criteria.  
Which leads us to the most important part of reporting weather observations...

When to speak up or When to shut up

There are key pieces of information that can help meteorologists and first responders, we call these reportable criteria.  If everyone were to get on the various Skywarn radio nets and report that "it's not raining here yet", then the one person who is looking at a funnel cloud won't be able to be heard.  Likewise, if everyone on Twitter shares "The sky looks scary in Conway. #arwx", it would be difficult for officials to see any urgent reports.  Here are the reportable criteria for severe weather.

Tornado or funnel cloud

A tornado is a violently rotating column of air, attached to a cloud structure overhead, and touching the ground.  If it is not touching the ground, then it is a funnel cloud.  Sometimes you might not be able to see where it touches the ground, so look for flying debris at the lowest point you can see.  If you can identify debris, it is probably a tornado.

Before reporting a funnel cloud or tornado, review this checklist:

  1. Are you in a favorable location? (Are you in the southwest corner of a super-cell or southeast corner of a High Precipitation (HP) super-cell?)
  2. Are you in an inflow area? (As you look into the feature, is the wind blowing into your back?)
  3. Is the cloud feature attached to the base of the thunderstorm?
  4. Is the cloud feature rotating? (Spinning like a figure skater or a toy top, normally from left to right, not up and down like a rolling pin.)
  5. Is the rotating feature persistent? (continuing for several minutes)
If you aren't sure about one of these, go ahead and report it, but state the item that you aren't sure about.
"I think I am looking at a funnel cloud. It is southwest of the main storm, attached to a thunderstorm above it and descending from it.  It is spinning, but it is not straight up and down.  It is almost at a 45 degree angle from the ground."
This would give the other party enough information to investigate it further.

Wall cloud

A wall cloud is attached to the base of a thunderstorm and hangs down underneath it.  Sometimes a wall cloud can be seen rotating, but not always.

Wind damage

Any wind estimated to be 50 mph or more should be reported.  With using an anemometer, you can estimate wind speed by observing nearby trees.

  • 25-31 mph - Large tree branches moving. Wires whistle.
  • 32-38 mph - Whole trees moving. Inconvenience walking into the wind.
  • 39-46 mph - Small branches or twigs break off. Impedes walking.
  • 47-54 mph - Slight structural damage (shingles blown off). Large branches break off.
  • 55-63 mph - Structural damage (parts of roofs blown off). Trees snapped off. 

Hail

On social media, feel free to report hail of any size.  However, only hail that is the size of a US quarter (1") is reportable criteria.  Ham radio operators should never report anything smaller than a quarter.

Flooding

A flood is water rising rapidly, flowing over roads, or into buildings.  Be sure not to confusing pooling and flooding.  If the rain were to stop right now, and the water would be gone in seconds, it is not a flood.

Protect life and property

By becoming aware of what information is actionable, and the various methods that can be used to report it, you are a step closer to being a small part of a large solution.

The National Weather Service offers free classes that will make you a certified Skywarn Storm Spotter.  To find a class in your area, visit http://www.nws.noaa.gov/skywarn/skywarn.htm.



Monday, November 23, 2015

Several years ago Google​ kicked me out

Several years ago Google​ kicked me out of one of their programs.

Many of you know that I used to design web sites and web applications "on the side".  I did many of them at or below cost with the agreement that I would include advertisements and a Google​ search bar on the site so I could offer a discount to the site owner and I could recoup the discount through the ad revenue over time.  The ads on the site were placed as part of Google's AdSense​ program.

I never made much through the program.  At the end I was making about $100 each month - not bad for not really doing anything.

I would hope that those who know me would consider me to be an honest person.  (In fact, I know several who might say I can be too honest, and that I should keep some of my true thoughts and feelings to myself.)  I like rules.  I always want to know what the polices and boundaries are, so I can operate within them.

So I was shocked when I received an email from Google in August of 2012 that said they had evidence of "invalid click activity" and were barring me from further participation in the AdSense program.  They said they could not share the details "in order to protect [their] proprietary detection systems".  Google's Terms & Conditions are very clear on the point of being banned: if you are banned, it is indefinite.

I never clicked on my our ads, and I never paid or asked anyone else to do so.  They wouldn't even tell me on which site the "invalid click activity" took place, so I couldn't review the logs to find out what really happened.

Of course I appealed the decision through their system, and have now appealed it three or four times (I've lost count).  Most recently, I appealed yesterday.  All of them had the same outcome: "Thank you for your appeal. We appreciate your continued interest in the AdSense program. However, after thoroughly reviewing your account and taking into consideration the information that you have provided, our specialists have confirmed that we are unable to reinstate your AdSense account."

At this point I no longer maintain any of those original sites.  I've significantly reduced the amount of side jobs I do in lieu of announcing.  But it bothers me that (a) I have this stain on my reputation and (b) I couldn't use AdSense for anything in the future.  I'd really like to start a YouTube channel and monetize it, but that's not in the cards for me.

From what I read online there are lots of people out there who find themselves in my situation.  When it comes to alleged invalid click activity, Google is judge, jury, executioner, and the appeals court... all in one.  Don't misunderstand me, I think Google is a great company.  I think they are one of the most innovative employers, and really come up with some great ideas and programs.  But this process just isn't fair.

Wednesday, August 12, 2015

Web design tip: It's a title, not an afterthought

Many people rely on their browser's "favorites" or "bookmarks" to keep track of web pages they visit often.  Google Chrome even offers a feature that allows you to synchronize favorite sites between all of your  computers and devices.  This works on PC, Mac, iOS, Andriod, and Linux: basically any device on which you can install Chrome or Chromium.

But a bookmark is only helpful if it does it's job: allowing you to quickly access a specific web page.  Part of that is being able to remember or recognize the site by the name of the favorite.  Regardless of the browser, when a page is bookmarked, the browser uses the title of the web page for the title of the favorite.  So it's important that web designers consider this when titling pages.  If it's the home page, then the site title is probably best.  If it's a page inside the site, then it should include the primary headline of the page.

Wikipedia does this elegantly.  Here are some examples:

My descriptionPage titleURL
Wikipedia home page Wikipedia www.wikipedia.org
Page about Suzanne Collins Suzanna Collins - Wikipedia en.wikipedia.org/wiki/Suzanne_Collins

However there are still some sites that, for some reason, use the title for other purposes. I won't go as far as to say it's wrong, but I will admit, I don't understand the strategy.

My descriptionPage titleURL
Goodreads home page Share Book Recommendations With Your Friends, Join Book Clubs, Answer Trivia www.goodreads.com
Page about The Unwanteds Goodreads | The Unwanteds (Unwanteds, #1) by Lisa McMann — Reviews, Discussion, Bookclubs, Lists www.goodreads.com/book/show/9917879-the-unwanteds

With titles this large they can't even be seen on the browser tab, nor on the bookmark button.  So, again, I don't understand the strategy here.  I suppose one could say this helps with search engine optimization (SEO).  However, in HTML, there are meta tags for that very purpose.

Consider this when titling your web pages: the title shouldn't be an afterthought; it deserves some type of strategy.

Friday, March 20, 2015

App Review: IFTTT

A few years ago I discovered probably the most useful web application on the Internet.  Yes, I know that's a pretty bold statement.  However once you've seen what it can do, I think you'll agree.

IFTTT stands for "If This Then That", which is a reference to a conditional statement in programming.  Now don't get all glazey-eyed on me, this isn't an application just for programmers or technogeeks.

The app features the most simple interface; which honestly almost put me off the first time I saw it.  I never would have imagined that something so simple looking could be this powerful.

So what does it do?  Simply put, it allows you to select from many different events that, when triggered, will cause an action.  For example, using the ESPN app and Hue (Internet connected) light bulbs, you can set up IFTTT to make your lights flash if your team scores.  Other examples include:
  • If the date is May 4th, then update your Facebook status to "May the fourth be with you"
  • If your iOS device arrives at home, then text mom that you've arrived home.
  • If you press your Do Button then immediately call your phone to get you out of a conversation with that crazy coworker who doesn't seem to understand when the conversation is over and just won't take social hints or cues that you need him to walk away now... oh, maybe that's just me.
There are hundreds of of channels that you can set up as triggers or as part of the action, and you can set them up in whatever combinations (or "recipes") that you want.  However one that really sounds fun is IFTTT's own "Do Button".  This is a software button that you can add to you iOS or Android device to trigger an event.

IFTTT is a free service that is available at ifttt.com.

Pro tip: If the endless possibilities are so overwhelming that you can't figure out where to start, then (after you log-in) click Browse at the top to see recipes that others have created.

And don't forget to let me know in the comments how you end up using IFTTT!

Saturday, July 13, 2013

The Baofeng UV-5R+

After hearing several people talk about these new, extremely affordable, Chinese ham radios, I had to get one for myself.  Several of the people I know bought one of the Wouxun radios.  These look nice, but I decided to try the latest model from Baofeng (pronounced "bow-fang"... I think).  I purchased the UV-5R+ from Amazon for under $50.  Since we have an Amazon Prime membership, the two-day shipping option was free.

So after reading through the "owner's manuel" (their spelling, not mine), I still have a ton of unanswered questions.  Fortunately, while I was waiting for the radio to arrive I stumbled upon "The (Chinese) Radio Documentation Project"; the project's objective is to create better alternatives to these owners manuals.  Luckily for me, the first manual that the project took on is for the Baofeng UV-5R.

The first thing I learned was to make use of the programming cable (sold separately) along with CHIRP: an open-source (free as in speech) and free (as in beer) utility to program many different radios.  CHIRP really deserves its own review which I will likely write very soon - it is an incredibly useful application.  My favorite feature so far, is its ability to import repeater info based on queries sent online.  For example, I had it import all of the 2 meter and 70 centimeter repeaters in Pulaski County, Arkansas.  Three clicks... done.  Once you query for the repeaters that you want in the memory (or manually enter them through the spreadsheet-like interface), all you have to do is send it to the radio through the programming cable and you're all set.

The UV-5R has several features that I hadn't yet seen in any other model, such as:
  • Audible speech menus comes standard (both English and Chinese)
  • Changing the backlight color (purple, orange or blue) based on certain conditions (receiving, transmitting, default)
  • Alarm
The alarm is an interesting feature.  As you can see in the video below, you can optionally set the alarm to transmit a DTMF tone.


You might have picked up on the fact that the gentleman in the video said that there's no way to change what tones are sent when you use this feature, but here comes CHIRP to the rescue.  In addition to making memory management easy, CHIRP allows you to configure several of the radio's settings that you won't find in it's menu.  I decided to set the alert tones on my radio to the DTMF command that brings up our weather net on our local Skywarn repeater.  I'll see later whether or not that's useful (or a good idea).

So far I'm very impressed with this dual-watch, 128 memory, dual-band radio.  If anyone out there has any questions about it, please email them to me at N5JLC at CAUHF dot org, or simply comment on this post at http://cauhf.blogspot.com/.  I'll update this post with any questions I receive. So if you are interested, check back for updates.

Until next time, 
Joshua Carroll, N5JLC

Thursday, June 6, 2013

App Review: Challonge

Well, I haven't been the best about posting app reviews like I started, but I found an app today that I just have to share: Challonge.

This week I'm leading a chess camp at my son's school.  We've covered basics, opening move strategies, various techniques, and today we started a championship tournament - which led me to this awesome find...

I really needed to create a bracket, but have you ever create a double-elimination tournament bracket for 11 people?  Well, it's not easy.  So I turned to Google, and that's when I found Challonge (www.challonge.com): a free web-based bracket generator with some nice features that are really unexpected and make this more of a full-featured web application.



It took me two minutes (2:00) to create this fantastic looking bracket.  I entered all of their names, then selected a random seeding option.  I was then able to put in up on the projector so the kids could track the standings as we went along using the app's full-screen view.. perfect!  Later I was able to email a URL to the kids' parents so they an see the bracket online.  They loved it!

There are a lot of features that I didn't use this time, but will probably use in the future (Cub Scout pinewood derby) such as displaying seeds, photos of participants, different types of tournaments (single elimination, round robin, Swiss), public sign-up page, maximum number of participants, allow participants to report their own scores and more!

This is obviously an app with a specific niche, but as you can tell I'm a big fan.

Monday, March 25, 2013

Piece, part and scrounge...

This story will likely make several of you Elmers cringe... you've been warned.

My HF radio is an Icom 720a, the old kind that requires a mic with a pre-amp.  For the duration of the time it took me to complete Worked All States, I was using an IC-HM12 microphone - those familiar with that microphone will know that it does not have a pre-amp.  This made for several awkward moments in the house: I would be working a station on the other side of the country and having to talk EXTREMELY LOUDLY INTO THE MICROPHONE JUST SO THE OTHER STATION COULD BARELY HEAR ME.  Things would get awkward when my nine-year-old would wander into my radio shack (my home office) around 9 pm with the ever-present, "Daddy, you're too loud.  I can't sleep." Click.  Off goes the radio for the night.  (Dang, right in the middle of a nice pile-up...)

My dad (N5GC) and I had a great time at the Russellville Hamfest again this year.  We both walked away with some cool new trinkets.  But the one thing that I was very excited to find, was a General Electric desk mic, that someone had installed a homebrew pre-amp in.  Here's the catch: The only plug it has is a quarter inch audio plug.  Here's the other catch: The PTT button was disconnected by the previous owner (why?).

Now, before I go further, I need to explain: I am extremely impatient. Also important to know, I am not the best with a soldering iron.  I just had  to get that mic on the air, but I didn't want to cut the plug off and figure out how to connect it properly.  (I'm sure I don't have the right mic plug for this Icom anyway.)  So, I remembered what the inside of my Rigblaster looked like: well labeled pins with jumpers between the input and output.. BINGO!... and out come the alligator clips.

[There it was.  Did you hear the collective groans and gasps from every old ham everywhere?]

So, let me paint a picture for you: The GE desktop mic has two clips connected to the mic and mic-ground.  Those clips run to the output side of the mic and mic-ground on the Rigblaster.  To run the PTT, I have my original IC-HM12 mic plugged-in to the front of the Rigblaster.  So, yes, all-in-all I'm operating with two microphones.

I know it's crazy: CRAZY AWESOME!  I've been blasting through the recent QRM with my full 200 watts with no problem... and most importantly: no more screaming!

1. Yes, I know this isn't a permanent solution.
2. No, I do not recommend that anyone else try this.

Signed,
The Ham That's Now a Ham
Joshua Carroll, N5JLC
about.me/joshuacarroll
---------------------------------------------------
PS - You may be wondering how I know that my signal improved so well.  Sometime last year I was surfing the web and came across websdr.org.  It is exactly what the name implies: it is several Software Defined Radios that you can control over the web.  They are for receiving only (no transmitting), but that's perfect for those times you're tuning your rig (or have a new pre-amp'd mic jury-rigged through a Rigblaster into a 200 watt HF transceiver) and it would really help if you could just hear yourself!  I like using the W4AX in Atlanta, Georgia because I don't have to wait long for the gray-line to assist with propagation.

73!

Friday, December 23, 2011

Personal Log: I'ma gonna kill that-a wash-a!!

Ok, so this is really more for me than anyone.  Our washing machine is on the fritz, and being the house-handyman... it's my problem.  And since I'm cheap and stubborn, I'm intent on fixing it myself.

The victim: Estate (Whirlpool) washing machine, circa 2003
The crime: Upon entering the spin or agitation cycles, the tub won't move and it makes a horrible noise.

So, as I read more about this washing machine I'm going to add to this article.  Feel free to follow along.

After some initial study, these are the problem areas that can cause this problem that I'll be looking into:

  • motor coupler
  • transmission
  • brake (hasn't released?)
  • belt
  • pump (obstruction)
  • motor pivot
  • trunk bearings
  • basket drive block
  • brake and drive tube
  • clutch
Now.. to figure out what those are and how to check them.




Motor coupler: After removing the housing, pump and motor, I inspected the three parts that make up the coupler between the motor and transmission.  There were no cracks or visible defects.

Transmission: Watched this video:


Using the method described in the video, I put the washer into the spin cycle and tried to move the tub by hand.  It would not move easily at all.  Based on this information and the video, I am assuming the transmission is alright.

Update 12/26/2011 2:00 pm
Alright, so now that the holiday has past I'm back to the honey-do list.  So far today I found an article by Dave Harnish where he describes a quick fix for Whirlpool & Kenmore washer brake lockup problems.  So I followed his tip, which involves adding high-temp grease to the inside of the brake drum, and the tub moves easier but it still won't spin and still sounds terrible.

Ugh...

Update 12/26/2011 5:00 pm
Although I probably should have done this a bit sooner, I checked the pump for obstructions.



Unfortunately I found no socks or thongs. Double ugh...

Ok, so let's just recap where we stand with the possible culprits:


  • motor coupler - no visible defects
  • transmission - tub does not move freely in spin cycle
  • brake (hasn't released?) - greased brake drum
  • belt - direct drive model (no belt)
  • pump (obstruction) - no obstructions in pump or in visible area of drain hose
  • motor pivot
  • trunk bearings
  • basket drive block
  • brake and drive tube
  • clutch


Update 12/28/2011 6:55 pm
After reassembling the machine from the front, I drained it and laid it on its back. This allowed me to remove the motor/clutch/gearbox assembly. After some more study I decided that the problem was indeed with the clutch. So after a quick run to the local appliance parts store... I ended up replacing a perfectly good clutch. At least I can scratch "piss away $52" off my to-do list. Consequently, I can also scratch off the problem being with the clutch.

So, here we go again:

  • motor coupler - no visible defects
  • transmission - tub does not move freely in spin cycle
  • brake (hasn't released?) - greased brake drum
  • belt - direct drive model (no belt)
  • pump (obstruction) - no obstructions in pump or in visible area of drain hose
  • motor pivot
  • trunk bearings
  • basket drive block
  • brake and drive tube
  • clutch - replaced (new clutch)



Sunday, November 27, 2011

App Review: Wishlistr

It's time again for another app review. Last time, I reviewed Sobees (a social network aggregator that makes life easier for eSocial butterflies). This time I thought that with the Christmas season upon us, it would be appropriate to review Wishlistr (www.wishlistr.com).

Wishlistr's website describes it fairly well:
Wishlistr is an easy to use web-based application that will help you collect, organize and keep track of the things you want. It also lets you share those things with friends and family.
As with most of my favorite apps, this one is free. And it's simple, non-intrusive design makes it idyllic for keeping your list of Christmas wishes. For those who are more tech-savvy: Wishlistr even includes an RSS feed, which could be helpful if you want to subscribe to someone's list.

Try out Wishlistr this Christmas and avoid getting another tie or calendar this year.

PS - If this article was just super-helpful, feel free to peruse my wishlist at wishlistr.com/joshuacarroll/ and send me something cool!


Friday, October 14, 2011

The start of a series / Sobees app review

After having a couple of people ask me for my favorite web-app that does _______, I've decided to review several of my overall favorite web apps right here. These apps will range from unique utilities to sites that may only interest a certain demographic - but in each site I think there is a lot to learn: design, application layout, typography, etc. Starting right here I'll review one app at a time in a blog-style format. If this sounds interesting to you, then follow me down this primrose path and let's begin...

Of all the online tools I use, the oldest in my repertoire is Sobees (sobees.com). Sobees touts itself as a "social desktop aggregator". This tool will be extremely interesting to all of the social [media] butterflies out there.

Sobees allows you to view your LinkedIn, Facebook, and Twitter feeds all on one screen. You can even add multiple accounts from each service. So if you want to monitor your personal and business Twitter accounts... you can! They also offer a couple of iPad apps, one for Android, as well as a traditional desktop application for your PC (if you're into that sort of thing).

When you visit the site the first time, you'll notice one of my favorite features: no login. All of your settings are stored in cookies on your computer. Of course this means if you visit the site from another computer, you'll have to set everything up again. But there are options to backup and restore your settings, so you could simply backup your settings on one computer, then restore them on a second computer and… viola… you have the identical setup. The site’s design is simple, sleek and unobtrusive: what more could you ask more in a web app?

While you’re checking it out, don’t overlook the “Search feed” option. In addition to the various supported social media networks, you can also create a custom - near live - search feed. This is especially useful if you really want to stay on top of a certain trending topic. I’ve used this in the past during severe weather (#arwx) and when iOS 5 was about to be released (#ios5).

If you use multiple social networks, check out Sobees at Sobees.com.

(... and just because I realized this sounds like an advertisement, I just wanted to point out that this is an unsponsored review. However, if someone wants to pay me for it, I'm ok with that too.)

Monday, April 19, 2010

No more frames!

If you have been following the development of the HTML5 standard at all, then you're probably ahead of me on this one.  This is my first week that I'm not teaching in a while, so I'm getting caught up with a little "light reading" (pr: reading web standards and specifications).

After a rather assertive student argued with me the merits of using frames in web pages a couple of weeks ago, I found it rather pleasing to learn that it looks like the W3C will be removing the frame, frameset and noframes tags with the release of the HTML5 specification.  These elements specifically are being removed,

"because their usage affected usability and accessibility for the end user in a negative way."
Hmm.  That sounds rather familiar.

Keep in mind that HTML5 is a working draft and may (probably will) change before it is released.  You can read about these and the other currently absent elements at www.w3.org/TR/2010/WD-html5-diff-20100304/#absent-elements.

Thursday, September 3, 2009

National Weather Service changes forecasting XML data

Sometime between 4:30 pm yesterday and 8:00 am this morning (central time), the National Weather Service changed the format of their XML feed for forecast data.  I don't yet know all of the details, but I know that the "time-layout" element no longer has a "period-name" attribute.  If I can find any more information, I'll follow up on this post.

Sample XML feed
Schema

Monday, August 10, 2009

Need references?

I've been working on an app at work that will update "slides" that we show on these huge LCD screens at each of the entrances to the building - things like the weather forecast, current tech news (since we're an IT training center), and where each class is located in the building.

It can be used either interactively or as a Scheduled Task (with the needed parameters passed as arguments in the command line). Until this morning, I've been running it myself from my laptop and updating the jpg's on the units manually about once a week. This really doesn't work for me. I'd much rather have the whole stupid process completely automated, but we're having some network issues that prevent the screens from communicating with our server room (UP&P is being blocked at the router). So until that is fixed (pr: circumvented), the jpg's have to be updated manually with a thumb drive.

Before I go any further, I should explain a little about what the app is actually doing. It opens a Powerpoint 2007 document, updates its content with information provided by the National Weather Server, Google News, and a web service from our local web server (for the course location information). Powerpoint really wasn't needed, but it did make it easier to design the slides.

So, like I said I've been running this from my laptop. I decided that it would be much better to try to put the executable right on the thumb drive and set it up so that anyone could use it. After copying the executable to a thumb drive I tried to run it from another computer (other than my laptop). I had already suspected that I would have some problems since the app is referencing the Powerpoint 2007 interop DLL, which is exactly what happened. Powerpoint 2007 had not been installed on this particular - I had chosen this set up on purpose to see what would happen.

So here was the question: How can I run this executable from a computer that doesn't have the Office 2007 DLL's on it, without having to acutally install this app?

Since I'm normally focused on Web apps, I haven't had to deal with this type of problem before. So after a little exploring in Visual Studio...

In Visual Studio, if you select the specific Reference in question (in this case the Office and Office.Powerpoint references), the IDE will expose several properties of the specific References in the Properties window. The one that I immediately focused on is called "Copy Local". This property indicates whether the reference will be copied to the output directory. After setting this option to "True" for both of the non-.NET DLL's, I rebuilt the app, copied the executable and both DLL's to the thumbdrive, and off to the "other" computer I went.

With the DLL's now in the startup folder of the executable, the app ran just fine. So next time you're at the ITTC, check out our new LCD screens powered by this little app.

Sunday, July 13, 2008

Adding URL's to email messages


I recently received a question from a co-worker about inserting URL's into emails.  Although this isn't a normal topic of this site, I thought others might find it useful as well.

Josh,
I have a quick question. I am interested in how you made this a link. 
I have copied and pasted the info but never been able turn it into a link.
Can you help me?
V/R,
Dana

Absolutely!  Take the red pill and follow me down the rabbit hole...
Outlook will automatically create a link for any valid URL (Uniform Resource
Locator) that you type into an email.  By definition, every URL must start with a protocol.  The most common example of a protocol is seen in your address bar while surfing the Internet: http.  Other examples of protocols include https, mailto, callto and file.
In regards to the last one, let's say you want to create a URL that sends people to:
P:\Information Technology Training Center\Public\SIAC Files\
Keep in mind that the example above is not yet a URL, but it is only a file path.  In order to create a URL from this path, the first thing you need to do is add a protocol at the beginning, like so:
file://P:\Information Technology Training Center\Public\SIAC Files\
Now you can see that the link was created, but it stops after the word "Information".  This is not an error.  This is because of another standard in URL's which states that there can be no spaces in a URL.  There are a couple of ways that we could remove the spaces from this URL:
1. Rename the folders and files from "SIAC Files" to "SIAC_Files", etc.
2. Encode those spaces in our URL into Unicode.
The first option could be a major pain, and probably isn't worth the time, so let's look at the second option.  While it might sound scary at first, encoding spaces into Unicode is very easy.  Simply replace all of the spaces in the URL with %20.  By doing this to our URL, it comes out looking like
this:
And, viola, we have a properly formatted URL!  Outlook, having realized this, has created the link for us.

Tuesday, May 27, 2008

The first date... ever.


I've been working on the third version of Vend-Trak for the past couple of weeks. We're going to incorporate Google Maps with directions, Google Charts (faster than the Java charts we've been using) and some other neat features. But really the biggest changes are all "behind the scenes".
Currently the application is written in ASP Classic (3.0) and is supported by a MySQL database.  These choices were great at the time, and they served us well.  But Vend-Trak has grown so much in the past few months that it's almost grown "too big for it's britches", as we say down here in Arkansas.
So that lead us to the decision that it is time for Vend-Trak to make the jump to ASP.Net.  And we figured we might as well migrate to a full fledged Microsoft SQL Server while we were at it.  This system-based relational database, along with the compiled ASP.Net application, should result in a MUCH faster application for the end-users. (I'll post the results when we're done.)
So that brings me to this blog.  I knew that migrating from MySQL to SQL Server wouldn't be easy.  But after some Googling I came across some helpful information.  First, I needed to install the MySQL ODBC driver on my SQL Server so that I could pull the information from the old server.  At that point I could create a "linked server" on the SQL Server by using a command similar to this:
EXEC master.dbo.sp_addlinkedserver @server = N'MYSQL', @srvproduct=N'MySQL', @provider=N'MSDASQL', @provstr=N'DRIVER={MySQL ODBC 3.51 Driver}; SERVER=127.0.0.1; DATABASE=ORIGINAL_DATABASE_NAME; USER=your_username; PASSWORD=your_password; OPTION=3'
Now that the MySQL server was linked from the SQL Server, I could copy each table from the original server to the new one with a single line:
Select * into newTable from openquery(MySQLServerName, 'select * from oldTable')
Up until this point it looks that maybe this won't be so bad after all. However, I hit a snag.  After importing two of the 33 tables, I received this message:
Error converting data type DBTYPE_DBTIMESTAMP to datetime.
It took me several cups of coffee and lots of research to finally discover that MySQL's datetime datatype has a minimum value of January 1, 1000, while Microsoft SQL Server's datetime datatype begins with the first day of the year after the Gregorian calendar was put into use in British and American records: January 1, 1753.  (Thanks to Peter Gulutzan and Trudy Pelzer for that tidbit of information.)
Now you might be thinking, "Josh, why is the world would you have dates in this database that are before January 1, 1753?"  Well I'll tell you: inadequate error checking.  When we provided inputs for users to be able to enter dates, we didn't consider that they would enter "8" as a year.  Of course, when the users entered such a date and they didn't see the item that they just created on the calendar, then they created it a second time using VALID dates and got the expected result.
So, while there was a valid problem occuring, the end-users probably never realized that this was indeed a valid issue that needed to be reported, and we never considered that such a scenario was taking place.
I hope that this is useful to someone else and saves them from countless hours of frustration.

Wednesday, July 18, 2007

How to: Create "Web 2.0" graphics


Unless you've been under a rock for the past few months, you know that the "Web 2.0" look is becoming a very popular design on web sites.  Web 2.0 isn't really the second version of the World Wide Web; this is a term that has been used to describe everything from AJAX-enabled web sites to the glossy, glass-like design that we'll be looking at in this article.  This type of design can generally be recognized by it's glossy and beveled look.  Most of the time, the subject ends up looking like a rounded piece of glass.  In this article, I'll be showing you how to create your own Web 2.0 graphic with text.  Here's an example of our final product:
For this tutorial I'll be using PhotoShop CS3, but you should be able to follow along with PhotoShop 6 or newer.  So without any further ado, let's get crack-a-lackin!
To start off, you'll need to create a new document in PhotoShop.  I'm going to start mine with a transparent background, width of 400 pixels and a height of 150 pixels (Screenshot).
In order to see what I'll be doing in the next few steps, I'm going to add a background now so that I have something to contract against.  For that Web 2.0 feel I need to use a warm gradient for the background, so I'm going to use a gradient that transitions from black to dark green with the green on top (Screenshot).
Fig. 1

Next, you'll need to add the text that you want displayed.  I've selected a 36pt, Strong, Arial Black font, then I've set the tracking (horizontal letter spacing) to -100 (Screenshot).  This will bring the letters closer together, and will help the reflection and shadow to look more like part of the image later.
Fig. 2

Now we need to create the reflection of the text.  First, create a copy of the layer that contains the text we added, by draging it down to the New Layer button in the Layers panel (Screenshot).  Move the copied layer down a bit (so I can see it) then, with the copied layer still selected, flip it over by clicking on Edit »Transform » Flip Vertical.
Fig. 3

Before we can go any further with the reflection, you'll need to rasterize it: Right-click on the reflection layer and select Rasterize Type (Screenshot).  Once the reflection has been rasterized, you can change the perspective by skewing it a little.  Click on Edit » Transform » Skew, then drag the handles on the bottom left and right corners out, away from the text (Screenshot).  Make sure that you try to drag them an equal distance from their original points.  
Once you have finished skewing the text, select all of the pixels in that layer by holding down CTRL and clicking on the layer thumbnail in the layer window (Screenshot).  Once the selection is loaded, hide the original reflection layer and create a new (blank) layer.  Select the gradient tool and load a gradient that transitions from white to transparent (Screenshot).
With everything set up for it, now you can create the gradient that will be the reflection.  Inside the (still) selected area, start the gradiant at the top of the selected area and have it end about 7/8 of the way down the tallest letter.  The idea here is that the bottom edge of the tallest letters shouldn't be visible (Fig 4).  
Fig. 4
To finish off the reflection, set back the opacity of the reflection layer to around 30% and move the reflection layer so that it meets the bottom of the original text (Fig 5).
Fig. 5

Now that we've finished the reflection all we have left is too create the shadow.  For this, we'll need to use a technique that's a little more detailed than the standard drop shadow effect....
To get started, make another duplicate of our text layer by draging it down to the New Layer button in the Layers panel again.  Rename this new layer as "Shadow".
Before we can go any further, you need to rasterize the Shadow layer.  Change the Lightness of the layer by selecting Image » Adjustments » Hue / Saturation.  Drop the Lightness down to -100 (Screenshot).
Fig. 6

Next, use the Distort tool (Edit » Transform » Distort) to bring the "shadow" layer to a little more than half of its original size, then stretch the top out just a little (not as much as we did on the reflection) (Screenshot).  We're almost done...
Fig. 7

Reorder the layers so that the "shadow" layer is below the original text layer, but above the background.  All that is left to do is to apply a Gaussian Blur (Filters »Blur » Guassian Blur) with a two or three pixel radius (Screenshot).
Fig. 8

That's all there is to it.  I hope this comes in handy for you.  And if it does, please let me know!  I'd love to hear about it.

Sunday, July 8, 2007

I hear the train a comin'...


Over this past weekend, the family and I traveled to St. Louis, as we do about once every other month to visit Christina's family.  Normally we'll drive the 7 hours from Little Rock to St. Louis, we've flown a couple of times, but this time we decided to try something different.  The idea was actually inspired by my 4-year-old step-son who, as most toddlers do, has an infatuation with trains.  Yes, we did; we took a train to St. Louis and back.  I decided to describe the details of our adventure in transportation and provide some suggestions in between.
When we first considered the idea, it sounded novel.  After a short trip across cyber-space we discovered that the cost was actually little more than we would otherwise spend on gas alone.  The phrase, "It's something different", was spoken more times than I can remember as an explanation to our friends and family after we had purchased the tickets online.  As I'm riding home now, I realize just exactly what "different" means.
Having never been on a train before I was expecting a train and station similar to those you see in the movies... I can guarantee you that the Little Rock Train Station will not be seen in Mission Impossible IV.
We arrived at the station in Little Rock at about 11 pm, as all passenger trains travel through the capitol city late at night.  The high-backed wooden benches, tile floor and vaguely present air-conditioning of the station was reminiscent of an old southern church on a summer Sunday night (I expected a sweaty preacher to appear with a "hellfire and brimstone" sermon at any minute).  Most of our fellow passengers seemed to have collaborated on matching luggage: Wal-Mart sacks and trash bags mostly.  I think it really added something to the motif of the station.  So much for first impressions.
I would make some kind comment about security, if there was any.  Ok, all right, I'll take that back... I was asked for my ID... twice.  Seriously though, it was as if we had entered a world where we were no longer at war.  There wasn't a single semblance of any real security: no security guards, no TSA agents, there wasn't even a freaking metal detector for Pete's sake!  Oh, that's ok Mr. Chertoff, I'm sure the enemies of the United States are only interested in hitting airborne targets, you can go back to sleep now.
As we boarded the train in Little Rock, we crept up into the second level of the car where we found our seats.  Most of the people onboard were sleeping in all kinds of positions in their seats.  Once we were settled in, we attempted to do the same.  This became a futile effort.  
Suggestion #1: Get a bed.
While the crew made a valiant effort to provide a comfortable atmosphere for those who wanted to sleep in their seats, you just can't get a good night's rest with an armrest between your cheeks (if you know what I mean).  Upgrading your travel to include a bed is a little more costly, but it will be worth it in the end.
The next morning the conductor stopped by to make sure that we knew that the Dining Car was open for breakfast.  Originally this wasn't part of our plan, but since the train was running about 90 minutes late (and we weren't quite ready to give up our adventurous spirit) we figured we'd give it a shot.
Suggestion #2: Get a bite.
The service and the food in the Dining Car were excellent.  Breakfast being my favorite meal of the day, there's nothing better to start your day than a western omelet, toast, fresh fruit and hot cup of joe, all while enjoying some of America's scenic beauty.
Suggestion #3: Set a loose schedule
We arrived at the station in St. Louis almost two hours late.  Luckily we were able to call ahead and let the rest of the family know not to drive 40 minutes out of their way just yet. Hindsight shows this to be a recurring theme in rail-travel with Amtrak, as our homeward-bound train picked us up over two hours past it's scheduled time and we arrived back in Little Rock a full three hours late.
After trying to decide whether this was a good experience or bad, I think it's best said: this was a learning experience.  Will we do it again?  Maybe so... but we'll definitely get a Sleeper Car with beds... and a hot cup of joe in the morning.

Wednesday, March 14, 2007

Ajax made simple


Any article about Ajax should probably start by explaining that it's not a new programming language. Rather, it's a methodology that enables a greater level of user interactivity in web-based applications. Ajax is based on two languages that have been around for quite a while: JavaScript and eXtensible Markup Language (XML). The "A" in Ajax stands for asynchronous, which literally means, "not at the same time." This is the key that separates Ajax from the classic web page.
In your standard web application model, there is a "back and forth" kind of action. The user requests a web page, the page is served, and in order for the user to see any additional information, he/she must make a separate call for data for more data, which causes (at a minimum) the page to reload. Requests and responses for the new data set occur at the same time, or synchronously.
Using the Ajax methodology, you can add the same level of interactivity to your web-based applications that, previously, was unique to desktop applications. In this model, the user requests a web page and the page is loaded as normal. The difference is that each time the user needs to be presented with more data, a JavaScript makes a call back to the server and retrieves the data in an XML format. This allows the developer to change the content of the page without reloading the entire page. As you can imagine, this can be extremely appealing to the end user. Ok, so lets get started...
In order to fully understand this article, I have to assume that you already have a firm understand of HTML, JavaScript and XML. Teaching these components of Ajax is outside the scope of this article, but you can find some excellent tutorials at http://www.w3schools.org.
Now, let's describe what you are going to create. We are going to create two select boxes from which we can select a Make and Model of vehicle. The Models that we can select from will be determined by the Make that is first selected.
Aside from the HTML present, you'll need an XML file. If you don't have one handy, you can use the one from this example (20070314.xml). After you have an XML file, you'll need a JavaScript that you can call to load the XML document. For this you can copy the script below:
function ajaxRead(url, method, parameters, functionToRunWithXMLResponse) {
          var xmlObj = null;
          if (document.all) { 
               xmlObj = new ActiveXObject("Msxml2.XMLHTTP"); 
          } else { 
               xmlObj = new XMLHttpRequest(); 
          }
          
          xmlObj.onreadystatechange = function() {
               if(xmlObj.readyState == 4) {
                    if (xmlObj.status == 200) {
                         eval(functionToRunWithXMLResponse + "(xmlObj)");
                    }
                    else {
                         alert("The requested operation returned an error code: " + xmlObj.status + "\n\n" + xmlObj.statusText);
                         return;
                    }
               }
          }
          
          xmlObj.open (method, url, true);
          if (method == "POST") {
               xmlObj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
               xmlObj.setRequestHeader("Content-length", parameters.length);
               xmlObj.setRequestHeader("Connection", "close");
          } else {
               parameters = "";  // Just to make sure it was called correctly.
          }
          xmlObj.send (parameters);
     }

  
The ajaxRead function will access the given URL to read the XML file once it reads the XML file it then passes the XML Document Object to whatever function you specify in the functionToRunWithXMLResponse parameter. Here is an example of how the ajaxRead function should be called:
ajaxRead('/xml/cars.xml', 'GET', '', 'loadMakes');
Once you have the XML Document Object, you can simply crack open the XML document itself with JavaScript using the Document Object Model (DOM) and have your way with the data. In the example above I have chosen to simply load the names of the Makes and Models into a pair of select boxes.
function loadMakes(objXML) {
          // Get a handle on the XML Document Object passed from the ajaxRead function.
          var xmlDoc = objXML.responseXML.documentElement;
          var arrLevelOne = xmlDoc.childNodes;
          var intLength;

          //Populate the Makes
          for (var x = 0; x < arrLevelOne.length; x++) {
               intLength = document.form1.selectMake.options.length;
               document.form1.selectMake.options[intLength] = new Option(xmlDoc.childNodes(x).childNodes(0).text, xmlDoc.childNodes(x).childNodes(0).text);
          }
          document.form1.selectMake.options[0] = new Option("Select a Make", "Select a Make");
          document.form1.selectMake.options.selectedIndex = 0;
     }
The last thing I did to complete the example given was create another JavaScript function that loaded the Models based on make that ran when the onChangeevent fired from the Make select box.
Using this method of web application development, developers can create fully interactive applications that enrich the user's experience and actually change the way your site's visitors think about the web.
Supporting documents:

Wednesday, March 7, 2007

PowerPoint tip for giving a presentation on a tight schedule


If you have a tight schedule and a lengthy presentation or class to give, you can add a little something to the master slide of your presentation to make sure you stay on time. Using the steps outlined below, you will be able to add a small notice (for yourself) to let you know when you need wrap up the current topic and move on to the next slide.
Open the master slide of your presentation and place a small graphic in one of the bottom corners. Right-click on the graphic and select Custom Animation. Add an entrance effect of your choosing. (I find that the Fade effect works very well since it is subtle.) After you have selected an effect, it will appear in the window below. Click on the effect, click on the down arrow next to the effect, then select Timing. Set the start event to With Previous, and then set the Delay. This would be however long you want to give yourself for each slide. (I give myself 2.5 minutes for each slide, so I would set the Delay to 150 seconds.) Click Ok and you're done.
Now that you have this set up, as you are going through the presentation glance up at the screen every so often. When you see the graphic appear, you know its time to move on. Be careful to not go crazy watching the screen or your students will notice and will be distracted. I’ve found that this little trick is extremely useful.
Until next time, remember: When working on something important, it's not possible to hit CTRL-S (Save) too many times.

Monday, September 18, 2006

Senator Kennedy Makes a Stand for Net Neutrality (op/ed)


This short post is meant to publicize a video posted by Senator Ted Kennedy on youtube.com. 
Senator Kennedy is one of the first politicians to voice his opinion in favor of Net Neutrality.