Do you know the Waze?

By Joshua Freeman at February 10, 2010 22:05
Filed Under: Blog, Mobile

From handheld GPS to full blown built-in automotive navigation systems, today GPS is becoming a common use technology. I like many of you have probably been using GPS in one form or another for many years. I've never quite been able to shake that feeling though, the one that it could be so much more. Have you ever been in that traffic jam, stuck, moving inches at a time? Ever thought, "if only I had known, I would have went the other way" or "I wish I could tell everyone else, so they don't get stuck here too"? I know I have. Well the day has come thanks to a great mobile program called Waze.

The idea is simple, combine GPS, your phone's internet connection, and a community of drivers. On the surface Waze is just like most other GPS units, a map that shows where you currently are. You can get turn by turn directions and other routing support as well. But that's where the similarity ends. With Waze you also get real time traffic information as you drive. Not the canned, rarely updated, and expensive data you might have come to expect from commercial traffic services, or the often too late information from the local radio station. Nope, real live information provided by the community (you and other drivers using Waze). In a traffic jam, see an accident, pass a speed trap, come across an obstacle in the road? Click the button and let everyone else know. Waze also uses your location and speed to identify traffic problems, reporting it without having to do anything at all. These messages are sent out to others nearby and displayed on their (your) map so that they (you) can see them and avoid them.

The other common problem with GPS, out of date maps. Have you ever used a GPS and came across a new road not yet on the map (maybe added in the last year or two since your maps were updated? Guess what, the maps are also part of the community. You can mark the spot and come back to it later from your web browser to add, edit, or delete roads.

On a fun note, Waze also has a point system. Roads where no one has driven yet have dots on the map, when you drive over them your car turns into a 'road muncher' and eats the dots. Sorta like playing that favorite dot eating video game with your car. Recently Waze also announced that it was offering a Valentine's Day promotion. They are adding special 'goodies' to the maps like cupid's arrows, hearts, and special treasure chests. If you drive over one of these 'goodies' you get bonus points, and with the treasure chests you have the potential to win real world prizes like movie tickets, chocolate, or other prizes. I have to admit I've driven out of my way more than once just to get new dots or grab some 'goodies'.

Waze is 100% community driven and free, so the more people that actively use it, the better it gets. So check it out I don't think you'll be disappointed. Waze is available for iPhone, Android, Windows Mobile, and other mobile devices. Oh and by the way, I use Waze instead of that fancy built-in navigation system in my car because I think it is better!

Happy driving and wazing!

 


.NetCF HttpWebRequest and HttpWebResponse Have No Cookie Support

By Joshua Freeman at April 25, 2009 00:58
Filed Under: .Net Compact Framework

For space saving reasons some parts of the .Net Framework are left out of the .Net Compact Framework. Unfortunately, (at least for me), one of the things not making the cut is the cookie support methods for the HttpWebRequest and HttpWebResponse classes. What this means is developers are left to handle cookies in their own code.

Cookies play an important role in web applications and sometimes your application will be required to read and/or set them. One of my applications Chronobis falls into this category. In order to authenticate to OWA servers using FORM based authentication, you must accept, store, and send cookies. The full version of the .Net Framework handles this almost seamlessly for you. However, in the Compact Framework you are on your own.

I decided to write an encapsulated CookieManager class to solve this problem for Chronobis, which I am providing here as an example of how to handle cookies in your .NET Compact Framework application.

Warning: This code assumes that every cookie stored will be sent. This means that I effectively ignore the cookie attribute values (Comment, Domain, Max-Age, Path, Secure, and Version). If your situation warrants, you might need to extend this code to account for them.

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;

namespace net.frejos.http
{
    public class CookieManager
    {
        private Dictionary cookieValues;

        public Dictionary CookieValues {
            get {
                if (this.cookieValues == null) {
                    this.cookieValues = new Dictionary();
                }

                return this.cookieValues;
            }
        }

        public void PublishCookies(HttpWebRequest webRequest)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("Cookie: ");
            foreach (string key in this.CookieValues.Keys) {
                sb.Append(key);
                sb.Append("=");
                sb.Append(this.CookieValues[key]);
                sb.Append("; ");
                sb.Append("$Path=\"/\"; ");               
            }

            webRequest.Headers.Add(sb.ToString());
            sb = null;
            webRequest = null;
        }

        public void StoreCookies(HttpWebResponse webResponse)
        {
            for (int x=0; x < webResponse.Headers.Count; x++) {
                if (webResponse.Headers.Keys[x].ToLower().Equals("set-cookie")) {
                    this.AddRawCookie( webResponse.Headers[x] );
                }
            }

            webResponse = null;
        }

        private void AddRawCookie(string rawCookieData)
        {
            string key = null;
            string value = null;

            string[] entries = null;

            if (rawCookieData.IndexOf(",") > 0)
            {
                entries = rawCookieData.Split(',');
            }
            else { 
                entries = new string[] { rawCookieData };
            }

            foreach (string entry in entries) {
                string cookieData = entry.Trim();

                if (cookieData.IndexOf(';') > 0)
                {
                    string[] temp = cookieData.Split(';');
                    cookieData = temp[0];
                }

                int index = cookieData.IndexOf('=');
                if (index > 0)
                {
                    key = cookieData.Substring(0, index);
                    value = cookieData.Substring(index + 1);
                }

                if (key != null && value != null)
                {
                    this.CookieValues[key] = value;
                }

                cookieData = null;
            }

            rawCookieData = null;
            entries = null;
            key = null;
            value = null;
        }

        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("[");
            foreach (string key in this.CookieValues.Keys) {
                sb.Append("{");
                sb.Append(key);
                sb.Append(",");
                sb.Append(this.CookieValues[key]);
                sb.Append("}, ");
            }
            if (this.CookieValues.Keys.Count > 0)
            {
                sb.Remove(sb.Length - 2, 2);
            }
            sb.Append("]");

            return sb.ToString();
        }
    }
}

A typical usage of this class would look something like this:

CookieManager cookieManager = new CookieManager();
// Set a cookie value
cookieManager.CookieValues["FavoriteCookie"] = "Chocolate Chip";

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
// Publish the cookies to the request before asking for the response
cookieManager.PublishCookies(webRequest);

HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
// Store any cookies returned from the response
cookieManager.StoreCookies(webResponse);

// Get the value of a cookie
string session = cookieManager.CookieValues["SESSIONID"];

webRequest = (HttpWebRequest)WebRequest.Create(url2);
cookieManager.PublishCookies(webRequest);

webResponse = (HttpWebResponse)webRequest.GetResponse();

Just in case you need a cookie RFC refresher, or need to add the missing functionality, you can find the RFC here.

The example source code contained within this post is provided under the terms of the MIT License. Copyright© 2008-2009 Joshua Freeman.

CookieManager.cs (3.39 kb)

About the Author

I'm Joshua Freeman a Senior Software Developer who has been developing software for the past 14 years, not counting all of those Comadore64 programs as a child. Developing software has always been a passion of mine. I've had the opportunity to use many different technologies over those years, including things like: HTML, JavaScript, Perl, ASP, JSP, SQL. The things that I use most often now are: JBoss, Tomcat, Java, .Net Framework, .Net Compact Framework, Windows Mobile, ASP.Net, JavaServer Faces to name a few.

I finally decided to start a blog in order to share and discuss some of the tools tips and other obscure findings that I've found over the years. So I present circumdev, which is a word that I've created that literally means "around development". (One of the great things about creating words is that their domains are usually still available.)

I hope you find the information that I post here useful in your software development journey, the way that I have found so many others helpful in mine.

Month List

Disclaimer

The opinions expressed within my blog entries, comments, and any other content of this site are those of my own. They do not represent the views of my employer, or those of anyone else in any way.