• 2011-03-10 14:00:00

    Additional storage for Google Apps users

    I have been using Google Apps for a number of years now and I have gotten so used to it that I cannot fathom any other way of operating. I am sure that some of you share that sentiment. :)

    Limitations

    Up until a few months ago, Google Apps had its limitations. The actual Apps was in some sort of a jailshell, isolated from the whole Google suite of applications. For that reason you could not use your Google Apps login to enjoy the service of Google Reader for instance. You had to be sneaky about it. You had to create a Google Account with the same username (and password if you liked) as your Google Apps domain and although the two did not communicate, you could have effectively "one login" for all services.

    This limitation became more apparent with the increased usage of Android phones (where you need to have a Google Account on your phone) as well as Google Voice. Users have been asking about the "merge" and Google responded with significant infrastructure changes to cater for the transition. In my blog post Google Apps and Google Accounts Merge I present additional information about this, inclusive of a How-To on the transition for administrators of Google Apps. Unfortunately the process is not perfect and there are still some services that are not fully integrated with the new infrastructure (but will be in the future). For instance in my domain, since I use Google Voice with my domain email account, I am still on the "old" system because the account could not be transitioned. It will happen in the end, it just takes time.

    Storage Needs

    The biggest issue for me that was related to these two separated accounts (Google Apps Account vs. Google Account) was Picasa and Google Docs.

    I have been very methodical in my filing, utilizing electronic storage as much as possible. For that reason I have been scanning documents and uploading them to Google Docs (or if they were available in PDF format I would just upload them). The documents would range from personal, utility bills, bank statements, anything that I want to store. Soon I realized that the 1GB that Google Apps offers for documents will not cut it. I therefore created a new account which I named DocsMule1 (clearly to signify its purpose). I created one folder in that account, uploaded as many documents as I could there and shared that document with my own account as well as my wife's. Soon I found more limitations since I ended up with 3 mule accounts. Since there was no option for me to upgrade the storage (even if I paid for it), I had to change my strategy. Managing documents from 3 or more different accounts is not an easy and convenient task.

    I downloaded all my documents back to my computer (gotta love Google's Data Liberation) and deleted them from the Google Apps mule accounts and then deleted those accounts - just to keep everything tidy. I then launched my Gmail account and signed into Google Docs. I created one folder which I shared with my Google Apps accounts (my wife's and mine) and then paid $50.00 for a whole year - which provided me with 200GB of space. You can always check how much space you are using by visiting the Manage Storage page of your Google Account.

    Once that was done, I started creating my folders (collections now) and uploaded all my documents up there. In addition to that, since my parents live in Greece, they rely on VoIP chat as well as my Picasa to stay in touch with their grandchildren. My wife and I, through the use of our mini camera as well as our Android phones, take a lot of pictures of the kids, documenting the little things that they do on a regular basis. This serves as a good archive for them when they grow up but also as a good way to stay in touch with my parents. Google's additional storage was the solution.

    Problem solved. With minimal money I had everything sorted out. It did however inconvenience me quite a bit in the end, since a lot of my data was scattered now. The GMail account would keep Picasa and Docs, the Google Apps account my email, my Google account my Reader, Web history etc. Not very convenient but it works.

    Storage for Google Apps

    Around February, Google announced that they will be offering the option to Google Apps users to purchase additional storage. I was really happy about that since I could therefore ditch the GMail account for handling my docs and keep everything under the domain account. However something was wrong. When Google revealed their pricing (the announcement is not there any more but the prices I am quoting are real), I quickly found out that for the storage I currently have, I would need to spend $700.00 a year instead of $50.00. That did not make sense at all. Needless to say, I stayed with my existing plan.

    Initial Pricing Plan
     Storage     Price (per year)
       5 GB         17.50 USD
      20 GB         70.00 USD
      80 GB        280.00 USD
     200 GB        700.00 USD  <==
     400 GB      1,400.00 USD
       1 TB      3,500.00 USD
       2 TB      7,000.00 USD
       4 TB     14,000.00 USD
       8 TB     28,000.00 USD
      16 TB     56,000.00 USD
    
    New Pricing Plan

    A few days ago, Google announced changes in the pricing of additional storage for Google Apps users as well as changes to the free storage that Google offers for Picasa. Picasa Web Albums does offer 1GB of free storage but now photos of 800x800 pixels or less as well as videos of 15 minutes or less do not count against the 1GB of storage. You can read more about the Picasa Web Albums storage in the relevant help page.

     Storage     Price (per year)
      20 GB         5.00 USD
      80 GB        20.00 USD
     200 GB        50.00 USD
     400 GB       100.00 USD
       1 TB       256.00 USD
       2 TB       512.00 USD
       4 TB     1,024.00 USD
       8 TB     2,048.00 USD
      16 TB     4,096.00 USD
    

    As far as the new pricing is concerned, Google brought everything in line with Google Accounts pricing (effectively scrapping the initial - expensive - pricing plan for extra storage). The help page Google Storage - How it Works offers additional information for those that want to use/upgrade their storage while using a Google Apps account. Effectively it now costs exactly the same to purchase additional space for your Google Apps account (to store documents) as it would if you were using a different Google Account. That probably means that I have to download everything to my computer and re-upload it to my Google Apps account....

    To take advantage of this feature, you will have to go to the Purchase additional storage page while logged in with the Google Apps account that you wish to purchase storage for. Note that there is a warning that appears in red (see image) that warns you that you are using a Google Apps account. Google provides this information since your Google Apps account relies on the Google Apps administrator. If you have an account on Google Apps and you purchase storage, that storage will be gone if the administrator deletes or restricts access to your account.

    Conclusion

    In my view, Google has done it again. They now offer an extremely affordable and secure way of storing your data. There are loads of people that have concerns about where their data is stored, who has ownership of the data stored, what does Google do with the data etc. A lot of these questions can easily be answered if you google (duh) the relevant terms or search in Google's Help Center. Data Liberation allows you to retrieve your data whenever you want to. If on the other hand you are skeptical and do not wish to store your data there, don't. It is your choice.

    References

  • 2010-06-21 12:31:00

    Android 2.2 (Froyo) Review

    Android 2.2 (Froyo)

    The newest version of the Android Operating System has been codenamed Froyo (as in Frozen Yogurt).

    Although I have heard of the name, I was not following very closely the development of the said OS, so I did not know what to expect. The presentation on Day 2 at Google I/O was more than impressive so I had to get my hands on it :)

    After the GoogleIO presentation, I was regularly checking (Settings – About Phone – System Updates) my phone to see what kind of version I am running and whether the update was waiting for me. Unfortunately I was disappointed every time, therefore I resigned to the idea that it will update when it is pushed to my phone.

    A few days later though, reports on the blogosphere started appearing of users now running on Froyo. The update started rolling out so it was a matter of time for me. Most of the reports were coming from California, so if I were to look at the geography, it would take the update quite a bit of time to reach West Virginia :)

    Through my regular research on the Internet, I found a few interesting blog posts that claimed that one can update the Nexus One without waiting for the update to be rolled out. Having nothing to lose, I decided to try it on my phone and see what happens.

    Upgrade to Froyo

    Below is how I upgraded my Nexus One to Froyo. I had a couple of failed attempts, loads of Googling but I finally managed to get it to work. Luckily a couple of days later an article appeared on Lifehacker which confirmed that the steps I took were the correct ones!

    I connected my Nexus One to my computer using the USB cable.

    The phone was detected and I mounted the SD card from the phone (bring down the notification area and select the USB connection – select mount to mount the SD card)

    When I performed these steps I had to navigate to a URL on the Android website (see article on Lifehacker).

    I copied the file and pasted it on my newly mounted drive which was the SD card of my Nexus One

    The file is 45Mb and when the copy was completed, I unmounted the SD card from the computer initially (click the status area and select Safely remove drive) and then from the phone (from the notification area select USB connection and select Unmount)

    The update instructions below are the original work of SimonNWalker and can be referenced here.

    With the update file uploaded on the Nexus One, all I had to do is shut down the device so that I can reboot it in recovery mode. The steps I took are as follows:


    I clicked and held the power button until the menu appeared. I selected Power Off, confirming that I wish the phone to power off.

    Once the phone powered off completely, I pressed and held the trackball button down and then pressed the power button. A new screen appeared (which, like myself, you probably have never seen before) with three androids on skateboards at the bottom and several options at the top.

    I navigated using the power and the volume buttons. I selected the first option (Bootloader) using the volume buttons and pressed the power button to activate it.

    A new menu appeared with the following options:

    FASTBOOT

    RECOVERY

    CLEAR STORAGE

    SIMLOCK

    I navigated to RECOVERY and selected it

    The familiar Nexus One X appeared on the screen. A few seconds later, a little android with a big exclamation mark in a triangle replaced the X.

    The next step I took was to press simultaneously the power button and the volume up button.

    This brought a new menu at the top.

    The options available were:

    • reboot system now
    • apply sdcard:update.zip
    • wipe data/factory reset
    • wipe cache partition

    Using the trackball, I navigated to the second option and pressed the trackball button down.

    At this point the update started and some information was flashing on the screen for a while, where some files were patched, some deleted, new ones copied and others replaced accordingly. The whole process took roughly 5 minutes from start to finish.

    Features that I found

    Please note that these are my own observations. Some of the features here might have been present in the previous version of Android (Eclair) and I simply did not notice them. If that is the case please let me know and I will correct the post accordingly.

    Phone search (Search throughout the phone itself)

    This is one of the updates that I just love. Froyo allows you to search a lot of content that is stored on your phone. The content includes your contacts, sms messages, applications, twitter feeds and many more. With all this power it is very easy to find the information you are looking for with the press of a few keys on the virtual keyboard (Figure 4).

    Since with great power comes great responsibility, Froyo allows you to select what can be searched. Go to Settings - Search - Searchable Items and you will find the following options:

    • Web (web search, bookmarks and browser history)
    • Aldiko (only if you have it installed)
    • Apps (names of installed applications)
    • Contacts (names of your contacts)
    • Finance (stock tickers, company names) (only if you have it installed)
    • Google Sky Map (only if you have it installed)
    • Messaging (text in your messages)
    • Music (artists, albums and tracks)
    • Twitter (searchable tweets) (only if you have it installed)

    I am sure that the search extends to other applications. Your results might vary based on the apps you have installed.

    Tethering - Wi-Fi Hotspot

    When I first heard about this feature during the presentation of Froyo at Google I/O>, I was really excited.

    I spend every day 3 hours on the train, where I mostly work on my notebook. Having the ability to tether my phone and work online is essential. A couple of years back when I bought my first iPhone, I managed to jailbreak it and installed iPhoneModem on it to achieve the functionality that I wanted (tethering). It wasn't fancy (after all don't expect miracles with AT&T's EDGE network) but it worked. I could get my emails reply quickly and disconnect.

    When I got my Nexus One, I bought PDA Net to achieve the same result. It worked too but again in a very basic mode but it was draining the battery very fast and was running the phone very hot.

    After I upgraded to Froyo, I uninstalled PDA Net and have been working with the built in functionality ever since.

    To access the Tethering options, you will need to go to Settings - Wireless & Networks - Tethering & portable hotspot. The options shown on Figure 6 appear, which allow you to switch the Wi-Fi hotspot on or off. A USB tethering option also exists for those that want to keep their phone charged with the power that comes from their notebook or attached device. Once the hotspot is enabled, a blue icon appears at the top notification bar. The configuration of the hotspot is really easy and can be seen in figures 7 and 8. For those wondering why I chose the SSID of my hotspot to be one of the most infectious (Windows) viruses ever, it is exactly for that reason. Apart from the WPA2 encryption, the name itself is a deterrent for anyone that might get ideas in stealing bandwidth.

    Everything works perfectly apart from AT&T's EDGE network, which is really slow. The Nexus One I have can support T-Mobile's 3G network. I haven't switched to T-Mobile yet since there was no need. I fear though that I will not be able to escape the inevitable.

    On June 2nd AT&T issued press release where they showed us once again that they don't give a damn about their customers since they lie, deceive and overcharge for a mediocre (at best) service. You can read the press release and draw your own conclusions but to me it seemed once again a slap in the face.

    No more unlimited data plans for new customers, yet it is not clear what will happen to existing customers such as myself. I read somewhere in the blogosphere that those plans will remain as is, but this is AT&T that we are talking about - the same company that claims that calls to 1-800 numbers are free yet they charge you minutes for it.

    I have signed for the unlimited data plan, yet AT&T does not allow me to tether. Why? What difference does it make? They still offer the same crappy EDGE network whether I watch a YouTube video on my phone or on my computer. The answer is in the press release. They want more money. As phones get 'smarter' they phone companies get greedier. John Gruber offers a good analysis of the new AT&T data plans.

    I do not know how this will evolve but I will definitely continue using the Wi-Fi hotspot on my train ride, whether this will be with AT&T or T-Mobile. Perhaps if I change to T-Mobile I will be able to have better coverage. AT&T in West Virginia is not the greatest carrier. Notable is a recent phone conversation that I had with my wife while I was driving (I am wearing the headsets btw) where the line dropped 9 times :(

    Phone/Web buttons at the bottom of every screen and desktop

    This was something that was needed in my opinion (Figure 9). I was pressing way too many buttons to get to the phone, especially if I was not on the main screen. This little shortcut is very well received and thought of. I do not think that there is enough space for an additional 2 buttons (for the future release of Android) but you never know.

    Perhaps a future version will allow you to customize those buttons.

    Android development though has to be very cautious when releasing functionality. I am sure that Apple is checking everything that Android does with a microscope. With their enormous patent book near by, they will not hesitate to sue Android (or Google for that matter) for patent infringement (see Apple sues HTC).

    More accounts to sync with

    This area can be accessed via Settings - Accounts & sync settings<.

    I noticed that not only my regular GMail and Google Apps accounts appear but also YouTube as well as Twitter. I have installed the official Twitter application so I am pretty sure that this synchronization appears because of that application.

    I have not tried it with Seesmic or any other twitter application, so if you have any additional information please let me know and I will modify this post accordingly.

    I would also be very interested to know which other applications offer synchronization capabilities or take advantage of Android's synchronization API. If you have any other applications that synchronize on your phone, please let me know and I will include it in this post too.

    Easy account switch (Email)

    When I switched from an iPhone to an Android based phone, certain things were just "not right", not because there was something wrong with them - it was how I was used to things being done. One of those areas was the email. With the iPhone I was used to a traditional listing of accounts and then once something was selected I would go into the folders and then emails. If I wanted to change accounts I would have to go back two steps and then enter the account that I wanted.

    This seems a very logical approach and it is easy to get used to. Although the Android has a better email management interface, it lacked the ability to quickly switch accounts and thus not spend time tapping away going back or forth. In that area the iPhone was better. Note the was. It was not because the user will tap less times, but because you would tap the back button twice which was located in the same area of the screen at all times. For the Android you had to press the menu button and then select Accounts. This was again the same amount of steps but the iPhone approach felt more natural.

    With Froyo a new button appears at the top right of your email screen which will allow you to quickly go to the account selection screen. This effectively reduces the steps by one.

    Analyzing briefly my emails, I can say that on average I receive 25 emails on my personal account and 35 on my business (I chose the two accounts that I get the most traffic). So if in theory I get two emails every time I check my email, that would mean that I am checking my phone 12 - 17 times a day (assuming again that I get the batches of emails on both accounts at the same time). It would therefore be safe to assume that I check my emails 15 times a day where I need to switch from one account to another.

    So the math gives us:

    Taps Average Email Checks per Day Week Month Year
    iPhone 2 15 210 900 10,950
    Android 1 15 105 450 5,475

    Clearly with the above I am using now half of the screen taps than I used to with Android Eclair or with the iPhone. However the this rough calculation shows how much I was tapping in the past prior to Froyo. Goodbye RSI. :)

    Colored labels in your email (like GMail)

    If you are like me and use Google Apps or GMail, you are by now accustomed to the colored labels on your emails, that you don't know what you have been doing without them all this time.

    With Froyo, this functionality is now available in my mobile device allowing me to visually identify emails of high interest.

    For instance, Figure 12 shows my setup. As you can see I mark clients with a green label color and financial institutions (bills mainly) with a red color. When an email reaches my mailbox and is automatically labeled due to a relevant filter, I can easily identify its importance using this color coding.

    Having this functionality on my mobile device is invaluable!

    Easier navigation between emails - New < > buttons appear on the phone to get you from email to email

    Another huge improvement in the navigation part as far as emails are concerned came in the screen where I read a specific email.

    There are two extra buttons at the bottom of that screen which allow navigation to the previous or next message.

    Another great tap saving feature!

    Better voice recognition

    I had some problems with this feature from time to time primarily due to my accent – a blend of Greek – English British – German and English American. After a few tries on the new system, I can say that there is improvement since it recognized now queries that it had failed in the past.

    The voice search will probably never be able to detect everything that everyone is saying due to the different accents and voices of people but it is getting pretty close to perfect in my case.

    One thing that I love about voice search is the voice navigation. I have purchased the car dock for my Nexus One and I use the voice navigation almost everywhere I go. Understanding that I want to go to Rockville, MD instead of Rock Creek is awesome!

    Marketplace – Update all, autoupdate for each application

    This feature was missing and was probably one of the ones that were mostly requested by the users. The Update All to the installed applications.

    Luckily the Android developers have heard our pleas and Froyo now features an Update All button at the bottom of the Downloads section in the Marketplace application.

    Adding to this functionality, the user now has the ability to automatically update selected (or all) applications. When clicking on one of the applications to update, a checkbox appears which allows for automatic updates. If the checkbox is checked, the next time the selected application has an update, the phone will download it and install it.

    There will always be a notification regarding the action in the notification area, but unless you know where the application is coming from (and you trust the source) you should keep this checked off. I know I might be getting a bit paranoid here but that is what I did.

    Different notification for Text Messages (trackball)

    I am not sure if this existed in Eclair but I just noticed it. When an email arrives, the trackball will start glowing briefly in regular intervals with a white color to visually notify me about the email(s) waiting for me.

    If I receive a Google Voice message though, the trackball will still start glowing but this time it will be with a green color. This way I know that a text message is waiting for me.

    I have sent a text message to my AT&T number and did see the trackball glowing but this time it was only white. It appears that the green trackball notification is a feature of Google Voice on Froyo or again it was always a Google Voice feature and I hadn't noticed, at which point I am getting excited for nothing :)

    New icons for USB Connect/Disconnect and USB debugging

    These ones I loved them the first time I saw them. If USB debugging is enabled (Settings - Applications - Development - USB Debugging), the minute the phone is connected to the computer using the USB cable, a new icon will appear in the notification area (Figure 15). It appears that it is an android bug of sorts :)

    When the phone is connected to the computer via the USB cable, the user has the ability to use the SD card as a storage device. Once the relevant entry in the notification bar is tapped, the screen with the "Turn on USB storage" will appear. If I switch the USB storage on, the screen changes slightly.

    These were two really cool (in my view) new screens that engage the user even more in exploring their device!

    Camera control

    A new enhancement appeared in the Camera application (Figure 18).

    The new menu that changes position based on the orientation of your phone (horizontal or vertical) allow for zooming, flash control, white balance control, geolocation and exposure.

    The options available are:

    • Zoom: 1x, 1.2x, 1.4x, 1.7x, 2x
    • Flash mode: Auto, On, Off
    • White balance: Auto, Incandescent, Daylight, Fluorescent, Cloudy
    • Store location: Off, On
    • Focus mode: Auto, Infinity
    • Exposure: -2, -1, 0, +1, +2

    Unfortunately these controls only appear when taking photos and not when shooting video. I am sure however that this functionality (and more) will be extended to the video capturing aspect of the camera application.

    Select text

    This is an area where the iPhone was far better than the Eclair and unfortunately still is with Froyo. The gap though has decreased significantly.

    With Froyo I can now select text from say an email and paste it somewhere else - even a different application. The Select Text option is hidden under the More menu button and once selected, it creates a small mouse pointer. That is the start of where it will start selecting (Figure 20).

    I simply point to the top left area I want to copy from and drag my finger diagonally to end up at the bottom right of the area I want to select. This will select the text in a very appealing pink color and as soon as I lift my finger from the screen it will copy the text on the keyboard (Figure 21).

    The technique on the iPhone is better but not by much - as I wrote the gap has decreased significantly. On the iPhone you have a magnifying glass where you can pinpoint exactly where you want to start copying (or inserting text - same functionality).

    Again unfortunately this functionality (the one with the magnifying glass for selecting text) is patented by Apple Inc. and will not be seen on an Android based phone but I am sure that the Android developers will come up with something that will give us the same if not better user experience.

    FLASH Support

    Steve Jobs never kept secret his thoughts about Flash support on an iPhone. Although many people were hopeful that something will be worked out with Adobe in the end, Mr. Jobs shut the door on Adobe. Adobe then invested time and resources to work something out and right before they were able to release their solution Apple changed the iPhone Developer License Agreement to allow only applications written in Objective-C, C, C++ or Javascript and executed by the OS Webkit engine. Adobe had enough and issued a 'screw you apple' (not officially of course).

    The presentation on Day 2 at Google I/O included the news that Flash will be allowed and supported on Android based phones that run Froyo (or newer versions).

    I have to admit, the first version of Flash that I installed (it is still in BETA) was really slow. However three versions later, I am happy to announce that it works as well as a desktop machine. I have not tried to load a heavy flash based website but my brother in law's website (www.dnm.gr) loads just fine and you can see all the information that you need to see :)

    I am sure that in the coming months we will see a lot more progress in that area.

    Conclusion

    The Android 2.2 (Froyo) is a huge step forward. It provides users with a lot of functionality that transforms a phone to a multifunction communication device. The only thing that we are missing now is proper coverage from the national carriers (AT&T this one is for you) and without having to sell our first born children to pay for the monthly bills (AT&T this one is for you too).

    Update

    There has been another blog post on AndroidAndMe explaining how to update Froyo to the latest build (this one is a patch not the real thing).

    Update 2010-07-04

    Happy 4th of July! It came with the update for Froyo (officially now) on my cellphone. I am now running the FFR91 build (and so does my wife).

  • 2010-02-28 12:00:00

    From iPhone to Nexus One

    References: Leaving the iPhone by Matt Cutts, Android Equivalency Table and Good Things: Ubuntu and Android by Alex Payne. I am pretty sure that there are other reviews and how-to's on the Internet, outlining that one of the above (or none) is the killer of the other. I am just posting what I did to switch effortlessly.

    Homework

    Of the applications currently installed on my iPhone, some are really very essential (i.e. email, web, podcast manager etc.) and some I can easily live without (Sportacular). Below is a list of the applications that I have listed in importance order and their counterparts in Android.

    Severity iPhone App Nexus One App
    H Calendar Calendar (built in - syncs automatically with the account you log in)
    H Google Voice Google Voice (integrates with the Nexus One so you call using your Voice number)
    H GV Mobile Google Voice
    H iPhoneModem PDANet ($30) or if you root your Nexus One other applications. PDANet requires Bluetooth or the USB cable, the others can hook up a WiFi connection
    H iPod Listen (by Google)
    H Mail Mail (built in - allows for IMAP, Exchange, POP - it also syncs easily Google based email)
    H Maps Web based
    H Phone Phone (built in - can be replaced by Google Voice)
    H pTerm Connectbot
    H Browser Browser
    H Solebon Solitaire (not as advanced as the paid Solebon but it will do)
    H Stanza Apparently Panda Reader is out but I could not find it. I gave up on this since I mostly work on the notebook and not longer read books on my mobile device
    H WunderRadio Streamfurious - not as good as WunderRadio but it has the stations I listen to
    H YouTube YouTube
    M Buzz Web based
    M Calculator Calculator
    M Camera Camera
    M CardStar Key Ring Reward Cards
    M Clock Clock - does not have countdown or stopwatch
    M Cycorder Camera (built in)
    M FuelGauge aCar
    M Google Earth Google Earth
    M iTunes Android Marketplace
    M Lattitude Lattitude (a lot of privacy warnings - even an email - to ensure that you want to switch it on)
    M LinkedIn Droidln
    M Photos Photos
    M QuickMark Barcode Scanner
    M RedLaser Goggles, Barcode Scanner
    M Shazam Shazam
    M TweetDeck Seesmic
    M TWiT TWiT
    M VNC Remote VNC Lite
    L Dictionary Dictionary
    L Facebook Facebook
    L Flixster Flixter
    L Messages Messages (built in - integrates with Google Voice)
    L Notes Evernote, like a billion other note apps some of which sync to Google Docs or other similar services, Tomdroid
    L Pregnancy A lot of applications, Pregnancy Assistant one that comes close to Pregnancy for the iPhone - either way I won't need this after May (I think :))
    L Sears2Go Sears2Go
    L Skype Fring, I also use Skype Go so no problem for me there
    L SnapTell Goggles
    L Sportacular Scoreboard
    L Stocks Finance
    L TrafficInfo INRIX Traffic
    L USAA USAA Mobile
    L Voice Memos Google Voice
    L Weather Weather on the top bar of one of the screens, News and Weather application
    L Wordpress Wordpress

    The Purchase

    I knew I wanted to buy the Nexus One the minute it was presented to the world :) There were however a lot of factors to take into account, the applications that I had and what their replacements will be (see table above), whether it would work reliably with AT&T's network or whether I would have to switch to T-Mobile etc.

    I have been following closely web posts regarding experiences with the Nexus One and I must admit, it was one of the main factors that helped me make the decision to switch. The icing on the cake was Matt Cutts's post regarding the same issue: Leaving the iPhone. I decided that I would get the phone and if it works satisfactory on AT& T I will stay with them, otherwise I will switch to T-Mobile.

    I discussed the issue with the boss (my wife who else :)) and the purchase was approved. As a matter of fact she was disappointed when I told her that I am going to order it because she had plans to buy it for me for my birthday in April. My eagerness to get the new phone spoiled the surprise but we both agreed that I got my birthday present two months in advance :)

    The purchase was really trouble free. I also purchased the dock and the really nice surprise is that Google offers free overnight FedEx to your location. It came in handy since I really wanted the phone there and then!

    First experience

    The phone arrived while I was at work. When I came back home, two really nice boxes were waiting for me. As you can see the packaging is really nice and the Google colors appear subtly on it.

    The packaging is simply awesome. Great ergonomics which easily match the ones of the iPhone. The Nexus One was wrapped in a plastic protective wrap, while in the package there was a protective sleeve, the USB cable, the headset and the charger. The packaging for the Nexus One Dock was equally good and it contained the dock and its charger.

    Abiding to the instructions, I opened the phone, inserted the battery  and plugged it in so that I will get a full charge prior to doing anything else.

    As soon as I put the battery in, the phone booted up. Really slick graphics!

    While the Nexus One was charging, I inspected my iPhone once more and synced it to my computer so that I do not lose any data. Once the phone was fully charged, I removed the battery and inserted the AT& T card in it. The network was identified immediately and I was able to log in using my Google Apps account! :) After a few steps of setting up the phone was ready for use.

    I plugged in the dock and set the phone up on it so that it charges prior to turning in. A nice surprise was the again subtle green digital clock that appeared on the phone while it is docked. I always wanted to have a nice clock on my bed stand - now I got it :)

    The day after

    I started the day with the attitude of Forget the iPhone and start anew. It was difficult, I must admit, but I think I managed quite well. The more I was using the Nexus One the more I liked it. I installed all the applications that I wanted (see table above) and set up the screens with the relevant application icons, trying to resemble what I had on the iPhone so that I won't spend much time looking for application icons.

    I set up Google Voice and that was one thing that really impressed me. The task was completed in a matter of minutes and now everyone will receive calls from my Google Voice number and not from my AT& T number. I no longer have to go to GV Mobile or the web based application to search for a contact and then call using Google Voice. Big plus here for Nexus One over the iPhone.

    Another pleasant surprise came a bit later when my wife and I had to go to a car dealer to view some cars (minivan here we come). I had the instructions and I had added the address of the car dealer in the event in Google Calendar. Usually I would use Google Maps and calculate the mileage that I travel with what Google Maps says and before I reach the next milestone I look at the map again. This time I saw a 'Navigate' link in the menu that appeared and for the fun of it I chose it. I was in turn greeted with a female voice telling me exactly where to go. As I am really notorious for getting lost, the female voice proceeded to tell me to make a U-turn to get back on track :) Really slick and accurate! Big plus again for the Nexus One over the iPhone.

    The notifications for the emails (I set up all my email accounts) are equally good for both phones. The Nexus One has a very slight advantage here in my opinion, since the notification area pulls up all the notifications that you have - from installed applications, text messages, missed phone calls, new emails etc. On the iPhone you get notifications on a per application basis so you need to be on the screen that lists the application that you received a notification for. Plus again for the Nexus One over the iPhone.

    Website rendering is where the Nexus One gets another plus. I think it is hardware since I am using the same AT&T network but the sites load noticeably faster on the Nexus One over the iPhone. This is normal browsing in the house so the location is pretty much the same. Big plus again for the Nexus One over the iPhone.

    Email management is where the iPhone is better. If I have say 4 emails to read and I click on one of them, I have to click the menu and then the 'Newer' button to get to the next email that I have not read. On the iPhone you have an up and a down arrow that allows you to navigate a lot easier. Also on the iPhone there is a logical hierarchy of accounts and folders, so you go back to change to a different account. Although this is a lot more work than it should, it seems a lot more logical than the approach the Nexus One has. With the Nexus One all you have to do is click the menu button and click Accounts to quickly access another account. It is a lot less clicks and I guess it would have made perfect sense should I had just come from a flip phone and never knew the iPhone. Still personal preference goes with the iPhone implementation, despite the fact that I am getting used to the new way of doing things :) Big plus for the iPhone over the Nexus One.

    Multitasking - multiple application notifications. This one has been the most discussed thing on the Internet regarding the iPhone (and now the iPad). You cannot run multiple applications at the same time. I just received a notification that I have a new email and someone replied to one of my tweets. The Nexus One notification bar showed both notifications and I read both messages in no time. On the iPhone though I had to keep the TweetDeck application on so that I can get the notification OR the Mail application on so that I can get the email. Huge plus for the Nexus One over the iPhone.

    There are other areas that I could discuss here but they are mostly focused on personal preferences on how things are done or should be done.

    Conclusion

    Overall I am really glad that I made the switch. The screen and camera are amazing, the phone is really responsive and apart from a couple of times that I didn't know how to do something and I had to Google it, I am using it as if I had it for a long time. I have no restrictions, I don't have to jailbreak the device so that I can get some applications that Apple deemed that they ruin the user experience (according to their reply to the FCC regarding Google Voice), my data is synchronized with the cloud and I can get it out of there at will. I can even develop my own application and install it if I wish to. This is something that the iPhone does not provide and notable is the fact that I had to retype all my store cards that I used Cardscan for in the Key Card scanner and there is no way for me to get the data that FuelGauge has stored in it and potentially transfer it to aCar.

    I would say that the iPhone would suit someone that is not that tech savvy and is not impressed by the technical abilities of the phone, rather is focused on the amount of applications that exist for that phone (iPhone is superior there). The Nexus One though raised the bar way high and it will take a long time for the iPhone to even come close to it. Once the Apple introduces the ability to allow multiple applications to run at the same time, provide the liberty to get your data out of it if you wish to, stop trying to police people by restricting applications, then the gap would have been bridged but until then... in my humble opinion the Nexus One is king!

  • 2009-12-01 14:00:00

    The world with Angular - Part III

    Continued from Part II

    Presentation of Data

    Presenting data with <angular/> is really easy. All we need to do is to tell <angular/> how we want the data to be presented and where.

    From Part II you have seen that I have declared an entity called Incident. Also in the <body> tag I have initialized the <angular/> engine, requested all() the Incident objects and stored them in the incidents variable.

    <body ng-entity="incident=Incident" ng-init="incidents=Incident.all()">
    

    I am creating a HTML table where I will display all the records. The header of the table is as follows:

    <tr>
      <th> </th>
      <th>Date</th>
      <th>Shift Start/End</th>
      <th>Animal Code</th>
      <th>Situation Code</th>
      <th>Resolution Code</th>
      <th>City</th>
      <th>State</th>
      <th>Description</th>
    </tr>
    

    Now I need to show the data on screen. I can reference the variables that I have used earlier in my input elements i.e. incident.shiftstart, incident.shiftend, incident.animalcode etc. The variables represent the fields of each record so incident is the document/record if you like and animalcode is the field. If I add them just like that, <angular/> will correctly show me data but only one record since it will not know otherwise. As usual I will need a loop for this. The loop will work directly on the <tr> definitions to give me a row per record.

    <tr ng-repeat="record in incidents">
      <td class="centercell" style="white-space:nowrap;">
        E D
      </td>
      <td class="centercell">{{record.shiftdate}}</td>
      <td class="centercell">{{record.shiftstart}}<br />{{record.shiftend}}</td>
      <td class="centercell">{{record.animalcode}}</td>
      <td class="centercell">{{record.situationcode}}</td>
      <td class="centercell">{{record.resolutioncode}}</td>
      <td class="centercell">{{record.city}}</td>
      <td class="centercell">{{record.state}}</td>
      <td>{{record.details}}</td>
    </tr>
    

    I am using the ng-repeat directive to repeat that block of code. Since I am using it in a <tr> the ng-repeat will match the closing tag for that element i.e. </tr>. ng-repeat repeats that block of code for every recordin incidents. incidentsis the variable I have stored all the results earlier from the <body> declaration. Each piece of information is stored in the database and referenced the same way that it was stored. Note that I have used the variable name recordto access the loop elements but I could have used anything I liked. recordrefers to one object of the incidentsvariable at a time.

    The full block of code is below:

    <table style='width:100%'>
    <tr>
      <th> </th>
      <th>Date</th>
      <th>Shift Start/End</th>
      <th>Animal Code</th>
      <th>Situation Code</th>
      <th>Resolution Code</th>
      <th>City</th>
      <th>State</th>
      <th>Description</th>
    </tr>
    <tr ng-repeat="record in incidents">
      <td class="centercell" style="white-space:nowrap;">
        E D
      </td>
      <td class="centercell">{{record.shiftdate}}</td>
      <td class="centercell">{{record.shiftstart}}<br />{{record.shiftend}}</td>
      <td class="centercell">{{record.animalcode}}</td>
      <td class="centercell">{{record.situationcode}}</td>
      <td class="centercell">{{record.resolutioncode}}</td>
      <td class="centercell">{{record.city}}</td>
      <td class="centercell">{{record.state}}</td>
      <td>{{record.details}}</td>
    </tr>
    </table>
    

    So now I have a basic application that allows me to store and display data. If you have tried this code so far and run it, you will see that the data is entered immediately on the screen and there are no page refreshes which significantly enhances the user experience.

    You might have noticed that I have "E D" in the first column of every row of the HTML table. These are for Edit and Delete.

    Editing Data

    Each record has a unique identifier as I showed you earlier when adding records. In order for the "E" to link to the respective record, I need to use that id. The hyperlink around the "E" becomes then:

    <a href="#incident={{record.id}}">E</a>
    

    Every document/record has an id field. I can it as usual with the double brackets and referencing the incident loop variable (inside the <tr> loop). Note that since I have decided to name my entity incident, I am referencing each record with that parameter in the URL. If my entity's name was different, say testentity, then the URL would have changed to:

    <a href="#testentity={{record.id}}">E</a>
    

    html

    Deleting Data

    To delete data, instead of referencing the unique identifier of each record, I will use the record variable and the $delete() method on it. Note that the recordvariable is the one that allows us to have access to every object in the incidentsvariable and it is used in the display data loop.:

    <a href="#" ng-action="record.$delete()">D</a>
    
    Searching Data

    The initial design never catered for emptying the database in regular intervals. Therefore a search function is in order to ensure quick retrieval of information. As you will see it is really easy and it does not need any <form> elements or anything else.

    The search box is just an <input> element with a specific name (which can be whatever you like)

    [ Search: <input name="wrlfilter" /> ]
    

    This piece of code appears above the table that displays data in my example. I need to make one more change to ensure that the data is filtered. The change is in the <tr> statement where I run the loop to display the data. So the block of code:

    <tr ng-repeat="record in incidents">
    

    becomes

    <pre class="brush:html"><tr ng-repeat="record in incidents.$filter(wrlfilter)">
    

    As you can see I am using the $filter() method and the parameter passed is the name of the input box that I have defined earlier. This way whatever I type in the search box, <angular/> will try to match it with the currently displayed data and filter accordingly, thus giving me the search functionality that I want.

    Sorting data

    Another easy task in <angular/> is sorting. Since I already have a table that I present data with, I am going to use that and its table headings to allow my user to sort. Also I am going to have a default sorting option of Shift Date descending and Shift Start descending.

    In general sorting is done by the $orderBy(), $orderByToggle() and $orderByDirection() methods. The + or - prefixing the name of a field passed defines ascending or descending order. To create a compound sorting key with multiple fields I need to enclose the field names in quotes and separate them with commas.

    First of all I need to initialize the sorting mechanism. The best place for that is the table that displays the data. Therefore I get:

    <table style='width:100%' ng-init="wrlorder=['-shiftdate','-shiftstart']">
    

    This statement initializes the wrlorder variable to contain a shiftdate and a shiftstart field in descending order. Note that the shiftdate and shiftstart are the same names of the fields that I have used throughout this article.

    I save my changes and reload the page but there is no sorting. I actually haven't told <angular/> what data to sort. Since the data that I want to sort are in the table, I will enhance my $filter() method with an $orderBy(). This is the statement that we have worked with earlier.

    <tr ng-repeat="record in incidents.$filter(wrlfilter).$orderBy(wrlorder)">
    

    Save and refresh and voila! The results are sorted by Shift Date descending and Shift Start descending. If I enter a new record, it will be displayed on screen sorted in the correct position. Note that the statement above allows for a combination of methods to be run against the incidents variable (filter and sort).

    For the purposes of this exercise and for debugging, I have also added the wrlorder variable next to the search box so that I know what my sort fields are.

    [ Search: <input name="wrlfilter" /> ] - [ Order: {{wrlorder}} ]
    

    Refreshing the page shows me now

    - [ Order: -shiftdate, -shiftstart ]
    

    I am nearly there. All I need to do now is to make the table headings clickable so that the data is sorted anyway I want to. I will use the $orderByToggle() and $orderByDirection() methods on the wrlorder variable. My table heading becomes:

    <th> </th>
    <th>
        <a href="" 
           ng-action="order.$orderByToggle('shiftdate')" 
           ng-class="order.$orderByDirection('shiftdate')">Date</a>
    </th>
    <th>
        <a href="" 
           ng-action="order.$orderByToggle('shiftstart')" 
           ng-class="order.$orderByDirection('shiftstart')">Shift Start</a>/
        <a href="" 
           ng-action="order.$orderByToggle('shiftend')" 
           ng-class="order.$orderByDirection('shiftend')">End</a>
    </th>
    <th>
        <a href="" 
           ng-action="order.$orderByToggle('animalcode')" 
           ng-class="order.$orderByDirection('animalcode')">Animal Code</a>
    </th>
    <th>
        <a href="" 
           ng-action="order.$orderByToggle('situationcode')" 
           ng-class="order.$orderByDirection('situationcode')">Situation Code</a>
    </th>
    <th>
        <a href="" 
           ng-action="order.$orderByToggle('resolutioncode')" 
           ng-class="order.$orderByDirection('resolutioncode')">Resolution Code</a>
    </th>
    <th>
        <a href="" 
           ng-action="order.$orderByToggle('city')" 
           ng-class="order.$orderByDirection('city')">City</a>
    </th>
    <th>
        <a href="" 
           ng-action="order.$orderByToggle('state')" 
           ng-class="order.$orderByDirection('state')">State</a>
    </th>
    <th>
        <a href="" 
           ng-action="order.$orderByToggle('details')" 
           ng-class="order.$orderByDirection('details')">Description</a>
    </th>
    

    The ng-action allows for the interchange in sorting order (ascending/descending) while the ng-class shows a nice arrow next to the header name, indicating the current sort order.

    Refreshing the page shows me the final product. I can now sort in any way I like and the sorting is compounded.

    Widgets

    <angular/> has a lot of widgets that can be used as validators but also as means to enhance the user experience. One of them is the DatePicker. I am going to use it to collect data in the shiftdate field. So the:

    <input name="incident.shiftdate" />
    

    becomes:

    <input name="incident.shiftdate" ng-widget="datepicker" size="8" />
    

    and that's it. Now when I click on the input box or when it gets focus, a nice dropdown calendar appears that allows me to select the date.

    Final thoughts

    The example above is not the final product for the WRL. There are some things missing, such as clearing up the order, enhancing the search, expanding/collapsing the add new record etc. This article is not meant as the final solution but more as a guide on what is feasible.

    <angular/> is definitely a new way of looking at web programming. It is fast, agile and easy to learn. <angular/> provides the hobbyist a tool that they can use to create an online application that will suit their needs without complex installations, expensive hosting companies, RDBMS management etc. I can also see experienced programmers using it to address a quick fix or a very urgent requirement that demands RAD.

    I encourage you to visit getangular.com} and give <angular/> a try. I am sure you will not be disappointed.

  • 2009-12-01 13:00:00

    The world with Angular - Part II

    Continued from Part I

    The Wildlife Rescue League application

    Design

    For those that do not know, the Wildlife Rescue League

    is a non-profit organization providing care for sick, injured and orphaned wildlife in order to return them to the wild. Our licensed rehabilitators, located throughout Virginia and suburban Maryland, work with animal shelters, humane societies, wildlife groups, nature centers and veterinary hospitals to provide care to creatures in need. WRL operates a wildlife hotline in the Northern Virginia and surrounding areas to assist the public in obtaining information and assistance in locating a wildlife rehabilitator. WRL is also committed to educating the public about the natural history of native wildlife, coexisting with it and preventing the need for wildlife rehabilitation. We can provide brochures, educational material and educational programs to suit your needs.

    The WRL hotline records all phone calls that the volunteers answer and organizes that data in a manner that would help the organization in the future (anticipated call volume etc.) In the past the data collection method was a simple sheet of paper that was mailed to one volunteer, who then had to decode everything and create the relevant spreadsheet for data analysis. Later on this model evolved into a spreadsheet which was copied and distributed to the volunteers. Again the data had to be collected (via email now) and merged for a meaningful analysis to take place.

    I have therefore created a simple application using <angular/> to allow the volunteers to enter their data in a centralized repository. I am going to explain in detail how I utilized <angular/> to perform this task, needing only a few hours (mostly spent in cosmetic changes) until I had a working copy of what I wanted.

    This blog post will be missing the authentication mechanism and a couple of other bits and pieces. I am hoping to show you a different way or programming and encourage you to explore <angular/> and its power.

    Thinking about my application I will need to store the data. I will need the following fields:

    Date
    Shift Start
    Shift End
    Animal Code
    Situation Code
    Resolution Code
    City
    State
    Description of incident
    
    Creating the database

    The data needs to be stored in the database. So logging into my account in getangular.com (do so if you haven't done this already) I created my library and my new database (both called testwrl) and I am set. Everything else will be controlled in the HTML document.

    Initial HTML file

    My HTML file is very simple.

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
                          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
    <meta http-equiv="Content-Type"
          content="text/html; charset=utf-8" />
    <meta name="robots" content="index, follow" />
    <style type="text/css">
    body {
        font-family:Verdana,Arial,Helvetica;
        font-size:10pt;
    }
    th,td {
        text-alignment:center;
    }
    th, .inputBox {
        background:#000066;
        color:#00FF00;
        font-weight:bold;
    }
    .incident {
        border:1px solid #000000;
    }
    .incidentheader {
        padding:5px;
        border:1px solid #000000;
        font-weight:bold;
        background:#000099;
        color:#00EE00;
    }
    .centercell {
        text-align:center;
    }
    img {
        border:none;
    }
    </style>
    <script type="text/javascript"
            src="http://testwrl.getangular.com/angular-1.0a.js#database=testwrl"></script>
    </head>
    <body>
    </body>
    </html>
    

    Note the JavaScript line at the bottom part of the snippet. It references a subdomain of getangular.com (testwrl.getangular.com) as well as the database I am using to store data (database=testwrl).

    Creating the HTML input elements

    I need to create a form to store the data. The programming is done with HTML <input> elements. Once I have everything mapped nicely on screen I need to bind them in the database. First of all I need to describe what I want to work with. I will use the ng-entity attribute in my body element. The ng-entity uses the expression [instance=]Entity[:template]. Effectively Entity is the name of the entity that will be stored in my database under that name.

    Therefore in my HTML file I need to change the body element:

    <body ng-entity="incident=Incident" ng-init="incidents=Incident.all()">
    

    So I am storing the Incident in the database. incident is the document of this entity (Incident) that is stored under the name of that instance.

    The ng-init declaration in the body element assigns all the records of the entity Incident (Incident.all()) to a variable (incidents). The name of the variable is arbitrary - you can choose whatever you like.

    Since incident is the document, I need to reference all my elements (the input ones) towards that. The way this is done is via the name attribute of each of the HTML elements. So for instance for the Date that I want to store, my HTML input declaration changes to:

    <input name="incident.shiftdate" />
    

    I repeat the same methodology and I name my elements incident.shiftstart, incident.shiftend, incident.animalcode etc.

    Notable is the fact that I haven't used the <form> element at all. I am going to add a Save button at the end of this HTML block which is nothing more than a submit element:

    <input type="submit" value="Save" />
    

    <angular/> takes care of all the data posting from the browser to the server so I do not need any <form> elements and POST control.

    The HTML script as is right now is below:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
                   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
    <meta http-equiv="Content-Type"
             content="text/html; charset=utf-8" />
    <meta http-equiv="Pragma" content="no-cache" />
    <meta http-equiv="Expires" content="-1" />
    <meta http-equiv="Cache-Control" content="no-cache" />
    <meta name="description"
             content="Wildlife Rescue League Hotline" />
    <meta name="keywords"
             content="WRL, wildlife, hotline, volunteer work" />
    <meta name="robots" content="index, follow" />
    <style type="text/css">
    body {
      font-family:Verdana,Arial,Helvetica;
      font-size:10pt;
    }
    th,td {
      text-alignment:center;
    }
    th, .inputBox {
      background:#000066;
      color:#00FF00;
      font-weight:bold;
    }
    .incident {
      border:1px solid #000000;
    }
    .incidentheader {
      padding:5px;
      border:1px solid #000000;
      font-weight:bold;
      background:#000099;
      color:#00EE00;
    }
    .centercell {
      text-align:center;
    }
    img {
      border:none;
    }
    </style>
    <script type="text/javascript"
      src="http://testwrl.getangular.com/angular-1.0a.js#database=testwrl"></script>
    </head>
    <body ng-entity="incident=Incident" ng-init="incidents=Incident.all()">
      <span style='float:right;font-size:10px;'>
        Powered by <a href='http://www.getangular.com'>`<angular/>`</a>
      </span>
      <br />
      <div class="incident">
        <div class="incidentheader">WRL Hotline Incidents</div>
        [ <a href="#">New Incident</a> ]
        <br />
        <table style='width:100%'>
        <tr>
          <td style='text-align:right;'>
            <label>Date</label>
          </td>
          <td>
            <input name="incident.shiftdate" />
          </td>
          <td style='text-align:right;'>
            <label>Shift Start/End</label>
          </td>
          <td>
            <select name="incident.shiftstart">
              <option value=""></option>
              <option value="08:00 AM">08:00 AM</option>
              <option value="08:30 AM">08:30 AM</option>
              <option value="09:00 AM">09:00 AM</option>
              <option value="09:30 AM">09:30 AM</option>
              <option value="10:00 AM">10:00 AM</option>
              <option value="10:30 AM">10:30 AM</option>
              <option value="11:00 AM">11:00 AM</option>
              <option value="11:30 AM">11:30 AM</option>
              <option value="12:00 PM">12:00 PM</option>
              <option value="12:30 PM">12:30 PM</option>
              <option value="13:00 PM">01:00 PM</option>
              <option value="13:30 PM">01:30 PM</option>
              <option value="14:00 PM">02:00 PM</option>
              <option value="14:30 PM">02:30 PM</option>
              <option value="15:00 PM">03:00 PM</option>
              <option value="15:30 PM">03:30 PM</option>
              <option value="16:00 PM">04:00 PM</option>
              <option value="16:30 PM">04:30 PM</option>
              <option value="17:00 PM">05:00 PM</option>
              <option value="17:30 PM">05:30 PM</option>
              <option value="18:00 PM">06:00 PM</option>
              <option value="18:30 PM">06:30 PM</option>
              <option value="19:00 PM">07:00 PM</option>
              <option value="19:30 PM">07:30 PM</option>
              <option value="20:00 PM">08:00 PM</option>
              <option value="20:30 PM">08:30 PM</option>
            </select>
             /
            <select name="incident.shiftend">
              <option value=""></option>
              <option value="08:00 AM">08:00 AM</option>
              <option value="08:30 AM">08:30 AM</option>
              <option value="09:00 AM">09:00 AM</option>
              <option value="09:30 AM">09:30 AM</option>
              <option value="10:00 AM">10:00 AM</option>
              <option value="10:30 AM">10:30 AM</option>
              <option value="11:00 AM">11:00 AM</option>
              <option value="11:30 AM">11:30 AM</option>
              <option value="12:00 PM">12:00 PM</option>
              <option value="12:30 PM">12:30 PM</option>
              <option value="13:00 PM">01:00 PM</option>
              <option value="13:30 PM">01:30 PM</option>
              <option value="14:00 PM">02:00 PM</option>
              <option value="14:30 PM">02:30 PM</option>
              <option value="15:00 PM">03:00 PM</option>
              <option value="15:30 PM">03:30 PM</option>
              <option value="16:00 PM">04:00 PM</option>
              <option value="16:30 PM">04:30 PM</option>
              <option value="17:00 PM">05:00 PM</option>
              <option value="17:30 PM">05:30 PM</option>
              <option value="18:00 PM">06:00 PM</option>
              <option value="18:30 PM">06:30 PM</option>
              <option value="19:00 PM">07:00 PM</option>
              <option value="19:30 PM">07:30 PM</option>
              <option value="20:00 PM">08:00 PM</option>
              <option value="20:30 PM">08:30 PM</option>
            </select>
          </td>
        </tr>
    
        <tr>
          <td style='width:20%;text-align:right;'>
            <label>Animal Code</label>
          </td>
          <td>
            <select name="incident.animalcode">
              <option value=""></option>
              <option value="B">Songbird</option>
              <option value="C">Corvine</option>
              <option value="M">Mammal</option>
              <option value="R">Raptor</option>
              <option value="RE">Reptile</option>
              <option value="U">Unknown</option>
              <option value="W">Waterfowl</option>
    
              <option value="OTH">Other</option>
            </select>
          </td>
          <td style='text-align:right;'>
            <label>Situation Code</label>
          </td>
          <td>
            <select name="incident.situationcode">
              <option value=""></option>
              <option value="A">Attacked (details for attacker)</option>
              <option value="I">Injured</option>
              <option value="K">Killed</option>
              <option value="N">Nuisance (explain in details)</option>
              <option value="O">Orphaned</option>
              <option value="OTH">Other (explain in details)</option>
              <option value="U">Unknown</option>
            </select>
    
            <label>Resolution Code</label>
    
            <select name="incident.resolutioncode">
              <option value=""></option>
              <option value="D">Died</option>
              <option value="GA">Gave advice only</option>
              <option value="LM">Left Message</option>
              <option value="OTH">Other</option>
              <option value="RR">Referred to Rehabber</option>
              <option value="RS">Referred to Shelter</option>
              <option value="RV">Referred to Vet</option>
              <option value="WCB">Watch and Call Back</option>
            </select>
          </td>
        </tr>
        <tr>
    
          <td style='width:20%;text-align:right;'>
            <label>City</label>
          </td>
          <td>
            <input name="incident.city" type="text" />
          </td>
          <td style='text-align:right;'>
            <label>State</label>
          </td>
          <td>
            <select name="incident.state">
              <option value=""></option>
              <option value="MD">Maryland</option>
              <option value="VA">Virginia</option>
              <option value="DC">Washington DC</option>
            </select>
          </td>
        </tr>
        <tr>
          <td style='width:20%;text-align:right;'>
            <label>Description</label>
          </td>
          <td colspan="3">
            <textarea name="incident.details" rows="5" cols="80"></textarea>
          </td>
        </tr>
        </table>
        <input type="submit" value="Save" class="inputBox" />
      </div>
    
    Adding data

    The entry screen is complete and if you type some data and click the Save button, you will store that data in the database. You will notice that this is the case since your URL will change to something like

    .../#incident=abcdefg7896456464532132135498a
    

    That is effectively the id of that record. If you delete that #incident..... and reload the page, you will be presented with an empty form where you can add more data. Clicking the Save button will save that record and you will notice that the new id is different than the previous one.

    I really don't want to have to delete the #incident.... from my address bar every time I want to add a new record. I am sure that the users of the WRL will not like it either. For that, I have added a link at the top of the screen which is already in the script that I have a few lines up. The line:

    [ <a href="#">New Incident</a> ]
    

    is the one that will reload the page allowing me to add a new record whenever I click that link.

    Continued in Part III

  • 2009-12-01 12:00:00

    The world with Angular - Part I

    If you haven't heard about <angular/>, this article is intended to give you a brief overview of the features and functionality that it exposes.

    <angular/> is a declarative programming language that provides the programmer with a wealth of tools using a simplistic model. <angular/> lives in the HTML file and references all the necessary libraries and tools using a single JavaScript file. This approach removes the need of complex scripts, installations of development/production environments (like AMP, Microsoft equivalent or other) and makes upgrading a breeze since the developer doesn't have to deal with it - it's all managed in the cloud. Development IDEs are rendered obsolete and all the developer needs is Notepad/Textmate/gEdit or a similar text editor.

    Backed by the latest cloud technologies, <angular/> is built for scalability. It can handle virtually any task or load right off the box but should the developer need more resources, they can easily contact Brat Tech LLC. and additional arrangements can be made. Ruby on Rails and Amazon EC2 along with CouchDB are the core components that utilizes, making it highly scalable, reliable and extremely fast!

    According to their website (http://www.getangular.com/) <angular/> provides:

    • A managed database - manages data for you
    • HTML & CSS - Full control of the look and feel
    • Security - Authentication and permissions
    • Embeddable - In third-party sites such ad blogs and wikis
    • Declarative - No need to learn a new language
    • Rich Widgets - Date-picker, Barcodes, Charts, etc.

    All of the above (and much more available through the documentation make <angular/> a really good and wise choice for the starter in web programming, the hobbyist who wants some variety in his/her website, the knowledgeable web developer or the expert in web programming.

    So why am I excited about this? For starters it is a really easy language to learn. It is by no means intimidating to any user and people that always wanted to enhance their website with some 'scripting' magic, can do so now with with no installations of any software on their sites.

    To start you need to go and create an account on the website (http://www.getangular.com/). In there you can select your subscription level. There is a free subscription (the default) and two paid ones at 14.95 USD and 45.95 USD per month respectively. The different subscription levels provide more functionality (i.e. SSL support, versioning, more documents etc.)

    Continued in Part II

  • 2009-11-18 12:00:00

    Google Paid Storage

    A week or so ago I read a blog post in my Google Reader about Google providing now more storage for less money.

    To be quite frank I did not read the whole post but I did get the message. Google was offering 10GB for $20.00 and now they are offering 20GB for $5.00. This extra storage is mostly for Picasa and web albums but it can be used for other products like GMail (if you ever get above the 7.5GB that you already have there).

    Although I was really happy to see such a move, I was kinda saddened since not more than a month ago I decided to purchase the 10GB for $20.00 and I didn't take advantage of the new rate. The reason for the extra storage is that I can store pictures and videos for my family to see. Since most of my part of the family is located in Greece and my family and I are in the US, it only makes sense to take advantage of the Internet to keep in touch. Photographs of different events that we attend are available now to them too, while we keep a good journal of events through the years.

    Logging into my web album in Picasa I was pleasantly surprised to see that my storage is not 10GB but 81GB! I could not believe my eyes and frankly I thought that Google made a mistake. I dug up the blog post and found out what had happened. It appears that by not reading the whole article, I missed the

    and people who have extra storage will be automatically upgraded.

    The funny thing is that they even counted the 1GB that Picasa comes with (for free) once you sign up for their web albums.

    All I can say is that now I will probably store more and more media online, not only for my family abroad to watch but for backup reasons too.

    All we need now is a GDrive - a drive extension to connect to our online storage so that we can store everything online and never worry about anything - computer crashes and all....

  • 2009-11-16 11:10:00

    Google Apps

    I was one of the first people to beta test GMail when the only way you could get an account was by an invitation. I did manage to get one and created an email account which I still use until now.

    Since then Google Mail has grown and has been enhanced so much that in my view made it the best webmail software there is.

    The ability to group emails in discussions, add multiple labels to an email conversation and the powerful search make GMail my only webmail application.

    With the introduction of Google Documents and Dpreadsheets and the fact that most of my documents are either OpenOffice Writer or OpenOffice Calc (MS Word or MS Excel for Microsoft users), I started considering the totally mobile office. After all, most of the documents that I have are sitting there in a corner of my hard drive collecting electronic dust. I do however need to access them whenever I need to and sometimes I might not have my notebook with me. Google Documents and Spreadsheets gave me the solution that I was looking for.

    I always had problems with SPAM. Buy this, enhance that, you all know what I am talking about. The last year though the situation became unbearable. The spammers would find ways to bypass the spam filter of my domain and eventually get through. I would even have 50 spam emails per day at times, increasing the chance of me deleting a valid email from a customer or a friend.

    A couple of months back I saw that Google offers services for domain holders. Effectively you can migrate your whole domain to Google and your email most importantly. In an interface familiar to me (like GMail) I now have all my domain's emails handled by Google and to my pleasant surprise I have no spam at all. The filters set by Google are very good since I only saw one message come through in the past two months. There is ample space (2Gb) and of course the option to upgrade if one needs more at a small fee.

    Most of this domain is handled by Google Apps :)

    Not everything is perfect though. There is still work to be done, like integrating more Google Apps to the hosted solution but I am sure those will come in due course. Thus far though, I am impressed and satisfied by the technology offered.

    I know that some might turn and say that I am biased and I only see the good things about Google Apps and that there are other products out there, potentially better. I agree to that. However in my view, Google has set the benchmark on what people should do to catch them and surpass them. I am glad that technology progresses the way it is, since the end users benefit from enhanced tools to make our lives better and more efficient :)

  • 2009-11-05 12:00:00

    Google Apps review

    I was one of the first people to beta test GMail when the only way you could get an account was by an invitation. I did manage to get one and created an email account which I still use until now.

    Since then Google Mail has grown and has been enhanced so much that in my view made it the best webmail software there is.

    The ability to group emails in discussions, add multiple labels to an email conversation and the powerful search make GMail my only webmail application.

    Later on I explored Google's personal homepage (http://www.google.com/ig). The gadgets that one can add in their page and the information gathered in a nicely customizable page is simply precious.

    With the introduction of Google Documents and Spreadsheets and the fact that most of my documents are either OpenOffice Writer or OpenOffice Calc (MS Word or MS Excel for Microsoft users), I started considering the totally mobile office. After all, most of the documents that I have are sitting there in a corner of my hard drive collecting electronic dust. I do however need to access them whenever I need to and sometimes I might not have my notebook with me. Google Documents and Spreadsheets gave me the solution that I was looking for.

    I always had problems with SPAM. Buy this, enhance that, you all know what I am talking about. The last year though the situation became unbearable. The spammers would find ways to bypass the spam filter of my domain and eventually get through. I would even have 50 spam emails per day at times, increasing the chance of me deleting a valid email from a customer or a friend.

    A couple of months back I saw that Google offers services for domain holders. Effectively you can migrate your whole domain to Google and your email most importantly. In an interface familiar to me (like GMail) I now have all my domain's emails handled by Google and to my pleasant surprise I have no spam at all. The filters set by Google are very good since I only saw one message come through in the past two months. There is ample space (2Gb) and of course the option to upgrade if one needs more at a small fee.

    Most of this domain is handled by Google Apps (excluding this blog) :)

    Not everything is perfect though. There is still work to be done, like integrating more Google Apps to the hosted solution but I am sure those will come in due course. Thus far though, I am impressed and satisfied by the technology offered.

    I know that some might turn and say that I am biased and I only see the good things about Google Apps and that there are other products out there, potentially better. I agree to that. However in my view, Google has set the benchmark on what people should do to catch them and surpass them. I am glad that technology progresses the way it is, since the end users benefit from enhanced tools to make our lives better and more efficient :)