You’re a smart guy, figure it out!

Mike Grushin’s thoughts on everything tech-related and more…

Archive for the ‘Development’ Category

Xamarin Evolve 2013 – Calabash – Cross-Platform Automated UI Testing

Posted by mikeg on April 17, 2013

  • Speaker – Karl Krukow
  • Xamarin purchased LessPainful, makers of Calabash (http://www.calaba.sh) https://github.com/calabash
  • UI Test Automation for iOS & Android
  • Code reuse for logic but by nature of different UIs there will be different test logic
    • Objective C, Java and Ruby
  • Native and Hybrid apps
  • Ruby API (C# API in the making)
  • Behavior Driven Development (BDD)
    • it is NOT
      • programming in plain text
      • writable by your boss
    • specification
    • readable by all project members
  • High-Level Architecture

image

image

  • Sample high level test case (readable by business people), click on each line to go into code

image

  • Images show code for each line – they are generic enough to be XPlat, but then .login implementation is platform specific

imageimage

  • iOS Implementation of .login

image

  • Android implementation of .login

image

  • Running the tests

imageimage

  • Ability to drive the app through the console

image

  • Including map and screen rotation

imageimage

  • CI is fully supported
  • Hybrid apps are supported through CSS selectors

Posted in Conferences, Development, Mobile Development, Xamarin | Tagged: , , , , | Leave a Comment »

Xamarin Evolve 2013 – Rdio – Beating Android Fragmentation

Posted by mikeg on April 16, 2013

image_thumb

  • Presenter: Brett Duncavage, Rdio, Session Info
  • Rdio is on 2704 different devices
  • Basic Defense
    • Set targetSdk to the current highest API level
    • Use helper classes to encapsulate OS version checking logic. Reflection will not work, But you can check Build.VERSION.SdkInt
    • Optionally set minSdk to the lower bound of Android API level your app supports
    • It is possible to have multiple APKs in Google Play that support different Android API levels
  • Stas:
    • Rdio’s long tail – top 10 devices are only 23% of users
    • Devices with over 1000 users is only 2%
    • Devices with 1 user 31
    • Devices with >1 and <100 – 67%
    • 255 devices represent 85% of all users
    • 894 devices have exactly 1 user
  • How to get data
    • Not Google Play
    • Embed Build.Model, Build.Production, Build.VERSION.SdkInt into User-Agent header
    • A service that pings an API endpoint every 24 hours
  • Samsung Galaxy S3 has at least 5 unique model strings – important to be granular because Rdio had specific bug on one of the versions
  • Pick your battles
    • Use data to drive your development focus
    • Make smart decisions on where you cut off support
    • Focus on device-specific issues with most of your users
  • Use SDK tools to help during design
  • Tools
    • Android support library – adds support for certain features (such as fragments) all the way back to 1.6
    • ActionBar Sherlock – open source lib that adds support for ActionBar to all versions of Android
    • android-ui-utils: https;//code.google.com/p/android-ui-utils
      • Asset generator
      • device preview
  • Use Fragments – Activities are heavy, fragments are light – speed went up 2x-3x after starting to use Fragments
  • Think in Points, not Pixels
    • You can’t make a pixel perfect implementation, don’t try
    • 9-patch is your friend. If designers are not using 9-patch, make them
  • Design for Android
    • Use Android UI idioms
    • RTFM! Google provides excellent resources on how to design and develop apps to support different display types
  • Level-up your layout
    • dimens.xml and integers.xml
    • Use Android’s resource directory structure to include multiple versions
    • use layout aliases – this saves you from having duplicate layouts residing in different Layout directories
  • Don’t Forget about focused state – without the focused state, the pointing device becomes useless
  • Hardware Fragmentation
    • Use manifest (requires camera, etc)
    • Use available APIs to determine fallback action at runtime if optional peripheral is not available (Ex: SensorManager)
    • check for Memory Class (16, 32, etc) to make decisions on how much to buffer, put in memory
  • External Storage
    • Not always external or removable
    • Never use a hardcoded path! /sdcard is wrong
    • Environment.ExternalDirectory can return a path to internal storage
    • Store vital application data on internal storage (sqlite database, etc)
  • Media Framework
    • OEMs use many different vendors for their media hardware needs
    • OEM can’t always use default Android MediaPlayer
    • This means MediaPlayer can behave in insane ways
  • How Rdio mitigates device issues
    • Trial and Error
    • Beta users group
    • Send one-off test builds to affected users
    • Remote device laboratories such as DeviceAnywhere and Perfecto Mobile – bad experience with both
  • Using Xamarin for over a year
  • sample app around layouts, etc : https://github/bduncavage/evolve2013

Posted in Android, Conference, Mobile Development, Xamarin | Tagged: , , , , , | Leave a Comment »

Xamarin Evolve 2013 – Conference Keynote

Posted by mikeg on April 16, 2013

imageimage

  • 400 training attendees
  • 630 conference attendees, from 15 countries
  • 1K of live stream attendees
  • Today: 2.6 Billion Devices, soon 7B
  • Nat’s favorite book on developing mobile apps: Tapworthy by Josh Clark
  • 15K Paying Customers
  • Featured Apps:
  • Xamarin’s goal is to “Delight Developers”
  • Miguel:
    • Loves C# – solved a lot of challenges while providing performance
    • C# was a life changing event
  • Since launching component store 6 weeks ago:
    • 40 new components
    • 2K developers using
  • Featured Components/Vendors
    • Signature Pad by Timothy Risi
    • Shinobi Controls – charting components, data is being rendered by GPU – fastest and more interactive
    • Cocos2D – 4K apps created, library for education and gaming
      • now supported on all platforms
      • angry ninjas – open source sample app
  • Backend Services
    • Azure Mobile Services – if you don’t have backend: auth, data storage, push, etc
    • Parse – Data, Push, Cloud Code
    • Dropbox
  • Responsiveness
    • iPhone refreshes screen 60fps – need to be below 16ms to feel “responsive”
    • 32ms is ok
    • 64ms – 15fps start choppy
  • Announcements
    • C# 5.0 Async, An Async Primer
    • Support for F#
    • Rebuild of Mono compiler/VM
    • iOS Designer outside of XCode (Visual Studio is coming, for now in Xamarin Studio)
    • Xamarin Test Cloud – Automatically test your app on 100s of real devices in the cloud
      • Bunch of great features – as you step through test cases you can see memory utilization and responsiveness of the app
      • Calabash – widely used open source tool for automated UI testing. LessPainful (authors) were acquired by Xamarin
      • http://xamarin.com/test-cloud – Beta with a number of customers

image

  • Android Fragmentation
    • Samsung has 27 different screen sizes
    • Facebook: “top 100 of android devices cover about a third of our users” (Mark Shaver, Engineering Director, Facebook)
  • Automated UI Tests

image

    • No good tools today
    • Why aren’t we using automated UI Testing
      • Test labs require expensive devices are difficult to setup
      • High-realist test scripts are difficult to create
      • Image recognition-based test are fragile
    • The real mobile testing solution
      • tests your app at the UI level
      • Takes minutes – not days – to get started
      • Tests on hundreds of real devices
      • Is resilient to visual changes in UI
      • Has a delightful user experience

Posted in Conferences, Mobile Development, Xamarin | Tagged: , , , , | Leave a Comment »

Xamarin Evolve 2013–Training Days

Posted by mikeg on April 16, 2013

Overview

We are done with 2 days of Xamarin training sessions – conference itself starts tomorrow. So far very much impressed with the technology and the company itself – everyone we’ve met seems to be very knowledgeable, friendly and really enjoying what they do. Sounds like a recipe for success. A few general comments:

  • While Xamarin technology allows C# developers to develop native mobile apps, there is still a pretty steep learning curve for web developers. Web developers are used to dealing with single-page requests where native app development is very different – dealing with performance, responsiveness, background threads, various hardware, etc makes it a lot more complex
  • With that said the fact that C# and general .net knowledge can be reused is very powerful – especially the fact that developers can continue working in arguably the best development environment (Visual Studio 2012)
    • Task Parallel Library is a very convenient way to handle async tasks and seems a lot simpler than native iOS/Android approaches
    • Code sharing and using nunit for unit testing of shared code is great
    • Xamarin Component Marketplace holds a lot of promise in making development easier – I expect vendors (possibly available already) such as Telerik and Infragistics start offering XPlat components that will further increase code reuse while look native on respective OSes

Below are notes from the sessions – mostly useful/interesting links/comments that were made during the sessions

 

MVC

  • MVC was created in 1979
  • iOS approach to MVC:
  • Controller
    • Wires Everything together
    • Listens for Requests from View
    • Manages Other Controllers
    • Populate View from Model
  • Views and Controllers in iOS
    • Responsible for UI in CocoaTouch
    • Views and Controllers – UIKit
      • UIViewController – just a controller, slightly confusing name
      • UIView
    • First Controller = Root Controller
  • Navigation Controller
    • UINavigationController – controller has its own UI (navigation bar)
      • Hooks for Forward Navigation
      • Title Bar and Back Button
    • Other methods of Navigation
      • Tab Bar Controller
      • Split View Controller
  • PushViewController
    • Segues are Great, but won’t work for everything
      • Dynamically loaded screens
      • Screens defined in Code
    • Have to Push Programmatically
    • NavigationController.PushViewController

Tables in iOS

  • Most commonly used – anything that looks like a list is likely to be a table, including “grouped” lists
  • overview
    • UITableView
    • UITableViewCell
    • UITableViewSource – this is what usually is used to connect to Model
    • NSIndexPath – a reference to section and row of what was “touched”
    • UITableViewController
  • layoutSubviews() – robust way of laying out content to react to different screen sizes , rotation, edit mode

Android

Cross-Platform Navigation

  • Navigating Stacks  – “back stack”
    • iOS – “local” to the stack you are in
    • Android – used to be hardware button
    • Windows – hardware button
  • Tab Alternatives – Satellite Menu (Path app)

image

Introduction to Cross-Platform Development and Visual Studio

  • UX in iOS != Android != Windows Phone
  • UX Metaphors are different
    • Navigation Controller vs. Back Button
  • Write-Once, Run-Anywhere is Problematic – Users Expect Native UX
  • Minimize Device Targets
    • Start with single OS first and then add additional
  • For Android, focus on top 5 phones at that time
  • Develop with Xplat Architecture
    • Good Architecture will Maximize Code Reuse
    • More expensive to change later
  • Code-Sharing Options
    • Two Major Options
      • File Linking
      • Portable Class Libraries (PCL)
    • File Linking is Generally Recommended (easier to setup, not architecturally pure)
    • PCL support is still under dev and complicated to setup and use
  • File Linking
    • Easy
    • can use conditional compilation
    • note: in visual studio there is “project linker” extension that makes this easy
    • also able to share folders, not just individual files
  • Platforms + Devices vary widely
    • File locations for DBs, etc
    • Some shared code needs to be platform-aware
  • Devices differ widely, even within a platform
    • hardware features: camera, compass, nfc
    • form factor: screen sizes, ratio, density
    • API differences between hardware vendors
    • check for device feature before using
  • Conditional Compilation (page 12 in PDF)
  • use sqllite.net orm
    • tasky pro shows how to access DB 
  • Architectural Abstraction
    • Inheritance/Polymorphism
      • Interfaces
      • Virtual Classes
    • Provider Pattern
    • Inversion of Control (Simple Dependency) – same as provider pattern
  • Cross-Platform Libraries
    • Xamarin.Mobile & Xamarin.Social
    • Monotouch.Dialog
    • Third-party libraries
      • MonoCross (http://www.monocross.net) cross platform forms
      • MvvmCross
      • Vernacular – localization library build by rdio
      • MonoGame – XNA port
  • Visual Studio Highlights
    • Can use one solution for iOS, Android and Windows
    • Android dev is nearly identical to Xamarin Studio
    • iOS is somewhat different

Web Services

  • System.Net.WebClient – blocks main thread
  • Json.NET – robust library for JSON
    • ServiceStack.Text – small quick
  • Calling Async
    • *Async versions of methods. Example: WebClient.DownloadDataAsync()
    • Start a background thread
    • Task Parallel Library (TPL) – Recommended
  • object stores
    • Axure Mobile Services
    • ServiceStack
    • Parse

Components & Social

  • Add awesome functionality quickly from the Xamarin Component Store
  • Xamarin.Mobile
    • Photo Library & Camera
    • Image Filtering
    • Access to Social Networks
    • Address Book
    • Email

Patterns

  • Data Transfer Object – simple, properties only
  • Adapter – translate a class interface to a different interface that is required by the consumer
  • Façade (or Manager) – encapsulates complex logic in a simple, higher-level API
  • Provider – build multiple implementations of an API for use in different scenarios (or on different platforms)
  • Model View Controller
    • View and Controller are usually platform specific
    • Model – Shared (might include Façade)
  • Model View View Model (Microsoft)
    • View – Platform Specific
    • ViewModel & Model – Shared
    • it’s like an adapter
  • Field Service pre-build app – MVVM example (TODO: review)
  • XPlan UI
  • Maximize Shared Code
    • SQLite-NET
    • Web Services
    • Business Logic
    • Input Validation
    • File Operations (& caching)
    • Background Tasks
    • Localization

Memory and Performance Best Practices

  • Reducing Pressure on Garbage Collector
    • Two things to care about
      • How often collections Occur
      • How long they take – depends on the size of the objects (t-shirts vs winter coat analogy)
    • Generational vs Non-Generational GC
    • Avoiding Collections
  • Be careful with container.AddSubview() – creates Strong Reference
  • Dealing with Strong Reference Cycles
    • Set Link to Container to Null
    • Remove Contained Object From Container
    • Call Dispose on the Objects
    • Use WeakReference<T>
  • Avoiding Strong Reference Cycles
    • Remove Event Handlers When Done ( –=)
    • NSObject-derived Classes Shouldn’t Keep Strong Reference to Parents
    • NSObjects Shouldn’t Keep Strong References to other NSObject Ancestors
  • Reducing App Size
    • Don’t build with “Don’t Link”
    • Build for Single Architecture (ARMv7)
    • Don’t enable debug
    • Use LLVM Compiler for release – slower but worth it from app size
    • Link All Assemblies
    • Create shared code
  • Creating Responsive Apps – recommendation to use TPL
  • Additional Performance Tips
    • Avoid Garbage Collection in Tight Loops
    • Use SQLite.NET
    • Test on All Platforms
  • iOS Specific Tips
    • Performance Considerations
      • Emulator vs Device – always profile/optimize on the device
      • Screen refresh rates for games
      • Core Animation performance hits
      • Avoid code generation – while your code doesn’t do it, library you are using might so need to test
  • Profiling/Diagnostics
    • Tools menu in Xamarin Studio – Launch Instruments
      • iOS – Memory – Allocations
      • Choose Target – choose app
      • Use search bar to search for specific type (UIImage)
    • CPU analysis can point to C# code

Posted in Conference, Mobile Development, Xamarin | Tagged: , , , , , , , , | Leave a Comment »

I am at Xamarin Evolve 2013

Posted by mikeg on April 14, 2013

We are developing quite a few mobile apps lately and these days it is no longer just about iOS – in most cases it is also Android and some customers are also interested in Windows 8 (desktop and phone)

The idea of code reuse is obviously very compelling and it seems that Mono has a new application in the mobile space – make sure to click around on www.xamarin.com and docs.xamarin.com for information on how it works. The idea is very slick and it is run by very smart folks: Nat Friedman and Miguel de Icaza

http://xamarin.com/evolve is split into 2 parts: 2 days of developer training (fundamentals and advanced tracks) and then conference itself (presentations, vendors, etc)

A few points from developer keynote:

  • Xamarin was created in May 2011, bootstrapped for about 12 months till reaching break even
  • As of April 2013 company is 70 people. Offices in SF and Boston with employees across 14 countries
  • I think I heard that there are 400 people attending – not clear if all 400 attending training or conference
  • Xamarin talks to a lot of clients and overwhelmingly they hear that there are not enough mobile devs
  • Study was quoted that .Net developer makes ~25K less than a mobile developer these days
  • According to analysts companies will be spending 4x more on mobile than on desktop (didn’t catch in which year and not clear what is meant by “desktop” – traditional desktop apps or web apps as well. If i had to guess just desktop)
  • For iOS secret sauce is ahead-of-time compilation
  • For Android secret sauce is Mono VM – mature virtual machine with higher performance than Dalvik. “Apps written in Xamarin will most of the time run faster than apps written in Java and fixes a lot of issues that exist in Dalvik (heap size, etc).”
  • Xamarin android UI designer is best of class for Android
  • Conference attendees will be the first ones to have access to certification, free for attendees
  • Useful links:
  • docs.xamarin.com – 800 pages of documentation, sample apps, etc
  • forums.xamarin.com -
  • chat.xamarin.com – staff, EST time
  • stackoverflow.com/tags/xamarin

Posted in Conferences, Mobile Development, Xamarin | Tagged: , , , , , , , | Leave a Comment »

Dr. Dobbs – The Death of Beta Testing

Posted by mikeg on March 20, 2013

The Death of Beta Testing contains a list of useful alternative testing mechanisms that will help you release more frequently.  Learn about dogfooding, dark launch, expert-sourcing, etc.  It’s published over on Dr. Dobbs by Fumi Matsumoto. (via assembla blog)

Posted in Development, Product Development | Tagged: , , , , | Leave a Comment »

Adobe Summit 2013–Lab: Developing Engaging Mobile Apps with Built-in Analytics and Targeting

Posted by mikeg on March 6, 2013

  • http://developer.omniture.com
    • Documentation, SDK, list of platforms, forum is monitored
    • SDKs are updated frequently (bug fixes, enhancements)
  • Supported platforms: iOS, Android, Windows Phone 7 and Xbox, PhoneGap Plugin for iOS and Android
  • Lifecycle Metrics – passed by default
    • Dimensions
      • Install Date
      • App ID
      • Number of Launches
      • Days Since First Use
      • Days Since Last Use
      • Hour of Day
      • Day of Week
      • Days Since Last Upgrade
      • Launches Since Upgrade
      • Device name
      • OS & OS Version
      • Carrier Name
      • Resolution
    • Events
      • Installs
      • Upgrades
      • Daily Engaged users
      • Monthly Engaged users
      • Launches
      • Crashes
      • Previous Session Length
  • Google Play Download Campaign Tracking – Auto Tracked Dimensions
    • Campaign Source, Medium, Term, Content, Name
    • Based on properly formatted url
  • SiteCatalyst Bloodhound
    • proxy/testing tool that catches calls from SDK to help debug/configure/test
    • allows code generation by creating/configuring fake events within UI – then code can be imported into the project
      • Objective-C
      • Java
      • C#
      • C++
      • Javascript
    • Allows to save “session” and then verify that all use cases were hit after changes/updates
  • Lab was a hands-on coding within Xcode to implement SiteCatalyst and Adobe Target into a simple iOS app
  • Recommendations:
    • Over-track then under-track (per hit due to cost)
    • Use context variables – allows redirect of evars without re-deploy of the app
  • Adobe Scene7 – dynamic resizing of assets based on user device/screen size
    • on-the-fly changing of PSD layers (example shown was changing color of the couch from yellow to red, preserves shading)
  • Distimo – app data from iOS/Android app stores integrated into SiteCatalyst
    • Numbers, revenue are currnetly
    • reviews and ratings will be integrated in next version

Posted in Adobe, Analytics, Development, Mobile Development | Tagged: , , , , , | 1 Comment »

Powershell – downloading files

Posted by mikeg on January 4, 2012

I was planning to learn Powershell for some time now and this seemed like a good opportunity to learn a few basic things: we had a txt file with urls of multiple images (one per line) and needed to download them while preserving directory structure. Below is the powershell script with comments. Things that it illustrates:

  • Using System.Net.WebClient
  • Join-Path helper
  • 2.0 error handling using try/catch
$webclient = New-Object System.Net.WebClient                        
            
$dest = "D:\temp"            
            
$errors = @()            
            
$images = (get-content $dest"\images.txt")                        
            
for ($i=0; $i -le $images.Length  1; $i++) {            
    $url = $images[$i]                        
            
    # DownloadFile doesn't like spaces            
    $url = $url.toString().trim();            
                
    # also requires "http://" for URL            
    if ($url.indexOf("http://") -eq -1) {            
        $url = "http://" + $url            
    }            
                
    Write-Host ($i + 1) " / " $images.Length " : " $url            
                
    if ($url -ne "") {            
        # Example URL: http://www.example.com/aaaa/bbb/image.jpg            
                
        # requirement was to preserve the folder structure            
        # removing http://                        
        $str = $url.replace("http://", "")         # www.example.com/aaaa/bbb/image.jpg            
                    
        # removing domain name            
        $str = $str.substring($str.indexOf("/"))   # /aaaa/bbb/image.jpg            
        $str = $str.replace("/", "\")              # \aaa\bbb\image.jpg            
                    
        # determining folder structure by removing file name                        
        $dir = $str.substring(0, $str.lastIndexOf("\"))            # \aaaa\bbb            
                    
        # if folder doesn't exist locally, create it            
        $imageDir = Join-Path $dest $dir            
        if (!(test-path $imageDir -pathtype container)) {            
            # md create full folder strucutre if provided.             
            # Example: D:\A\B\C\D will create all subfolders            
            md $imageDir            
        }            
                    
        $localImagePath = Join-Path $dest $str            
        Write-Host $localImagePath            
                    
        #http://stackoverflow.com/questions/2182666/powershell-2-0-try-catch-how-to-access-the-exception            
        try {            
            $webclient.DownloadFile($url, $localImagePath)            
        }             
        catch [Exception] {            
            $errors += $url            
            Write-Host "ERROR: " + $_.Exception.ToString() -foregroundcolor "red"            
        }            
    }                        
}                        
Write-Host "done. errors: "            
$errors            

Posted in Development, Powershell | Tagged: , | 3 Comments »

SMTP Relays – a way to avoid SPAM/Bulk email folder

Posted by mikeg on December 3, 2009

Every web application sends emails: registration, forgot password, reminders, etc. How do you make sure that these emails get into your user’s Inbox? There are 2 ways: “free” do-it-yourself approach is described at the end of this post. The easier, but not free, approach uses an SMTP Relay Provider.

These providers usually have relationships with major web-based email solutions (gmail, yahoo, hotmail, etc) and also follow the latest standards and best practices for making sure that your email is delivered. Some of the things these companies do is outlined in the DYI portion.

SMTP Relays should not be confused with “email marketing” offerings. Email marketing offerings usually specialize in List Management, opt-in/opt-out, tracking, etc. Most of SMTP Relays do not offer these features.

Here is a list of the providers that I found while researching this:

SMTP Relay Providers

www.unifiedemail.net

  • We implemented this for a customer (their choice) and had no issues with it. Implementation was easy, pricing seems reasonable.
  • Site is a bit sparse on information but customer reported that phone support was prompt and helpful
  • You can find pricing here, but to give an example: with 5K daily limit/75K monthly limit you will pay $99.95/month

www.sailthru.com

  • NYC-based, recommended by a few people on nextNY list
  • Pricing: $6 per thousand of emails, $60 monthly minimum, discounts after 500K
  • Seems to offer a few additional features on top of regular relay: “Triggermail — Our flagship service monitors delivery of transactional email into the user Inbox. If it gets sent we’ll tell you when it was delivered and what happened when it was opened.”

www.authsmtp.com

  • Another one that was recommended by a few people on nextNY list
  • When looking at pricing keep in mind that listed limits are monthly, but the price is yearly. Here are monthly prices to make it easier to compare to other services:
    • $2/month for 1K emails/month
    • $14/month for 10K emails/month
    • $134/month for 100K emails/month
    • $667/month for 500K emails/month
    • goes up from there

www.socketlabs.com/od

  • Pricing:
    • $79/month for 25K emails/month
    • $249/month for 100K emails/month
    • $449/month for 500K emails/month
  • You do not get a dedicated ip with the first 2 plans. Not sure how big of an issue as long as SocketLabs keeps their IP range clean

www.smtp2go.com

  • Looks like they target consumers as their highest plan allows for up to 300 emails a day
  • They offer “corporate” product (https://smtpcorp.com/signup/), but it still doesn’t look like an STMP Relay product

www.port25.com

  • Pricing is not listed on the site – you have to contact them. Hard to believe that companies still play “personalized quote” game

www.sendgrid.com

  • If you use this link you can also get 25% off the regular price.  So check them out and give SendGrid a try.

DYI Approach

Very good post on this topic can be found here: How to ensure your email gets delivered

This covers email marketing techniques, but applies to this discussion as well: How can I prevent my emails being marked as spam or from being blacklisted

Note: This checklist below is a modified version of a post from Oct 2007 by Tobin Schwaiger-Hastanan on Business of Software List.

First steps:

  • Make sure your mail host is a valid A record
  • Make sure your MX record is set to the full host name of your mail host (which is set up as a A record)
  • Make sure you can do a reverse lookup of your mail hosts IP address.  (This will be important for setting up SPF/Sender ID records)
  • Set up SPF/SenderID information as a TXT record. (www.zytrax.com/books/dns/ch9/spf.html)

Once above is configured

  • Verify DNS/MX records using http://www.dnsstuff.com/. Make sure there are no warnings or errors before contacting support for any of the email services. Yahoo has a policy of not reviewing changes for 6 months after the last request is made
  • Test your emails with Spam Assassin.  Send yourself an email from your web application and copy the raw message (including headers) to a text file and run it against spam assassin’s command line test. The lower the score the better.  A score of 5 or more means that your email will most likely get filtered out by any spam filter.  I’ve also been told that anything 3 or higher is bad.
  • Once you’ve tested out your emails in spam assassin, try testing it out across other services.  I initially was using Email Reach (www.emailreach.com). I think it’s a great service, but it’s still a young/small company. So if you find issues/bugs with their product, you will need to have patience with their customer service.  It’s a cheap product for what it does.  It will test delivery of your email to a large list of email providers, ISPs, and even email clients.

Tips

  • If you are sending plain text emails, make sure you have the charset in the Content-Type header set to ISO-8859-1. When I changed the charset to ISO-8859-1, gmail was no longer delivering my emails to the spam folder.  However hotmail and yahoo still were.
  • Yahoo! Mail allows you to view the headers of incoming emails.  You can see items they’ve added to the header.  Review them
  • Visit http://postmaster.hotmail.com and review their policies and troubleshooting guides. If you adhere to their rules, try to contact them
  • Implement DomainKeys on your mail server.  This is basically a crypto key that is stored in a DNS TXT record, and some work done on your mail server to get it to sign outgoing mail.

Posted in Development, Web Development | Tagged: , , , , | 5 Comments »

IE6 “tax” — interesting point of view

Posted by mikeg on November 6, 2008

http://pingv.com/blog/laura/2008/internet-explorer-6-tax

…when you’re spending 35-50% of your theming time just trying to get a cool new design to work on one rather archaic browser, it’s no small matter.

It’s a ≈40% tax on web theming

Posted in Development, Web Development | Tagged: | Leave a Comment »

 
Follow

Get every new post delivered to your Inbox.

Join 180 other followers