<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4554418604921908606</id><updated>2012-03-01T17:00:34.218-05:00</updated><category term='SqlConnection'/><category term='NUnit'/><category term='facebook'/><category term='functional test'/><category term='SqlDataReader'/><category term='Xcode'/><category term='Selenium RC'/><category term='asp.mvc'/><category term='IEnumerable'/><category term='SqlConnectionStringBuilder AttachDBFilename InitialCatalog  .Net ADO.NET'/><category term='.Net'/><category term='perl'/><category term='hudson'/><category term='itunesconnect'/><category term='.net c# Button Focus Steal Take'/><category term='C#'/><category term='xcodebuild'/><category term='permissions'/><category term='iphone'/><category term='XmlSerializer'/><category term='symbolicatecrash'/><category term='sql'/><category term='sdk'/><category term='software'/><category term='showPermissionDialog'/><category term='Firebird ISQL CREATE DATABASE EMBEDDED BATCH File COMMANDLINE'/><category term='yield return'/><category term='ToolStripControlHost designer .net visual studio'/><category term='itunes'/><category term='subversion'/><category term='developer toolkit'/><title type='text'>The code should be silent</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://silent-code.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://silent-code.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ed Hughes</name><uri>http://www.blogger.com/profile/15450443296640679451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4554418604921908606.post-8776640568143557884</id><published>2011-12-19T11:58:00.007-05:00</published><updated>2011-12-19T14:08:40.697-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Firebird ISQL CREATE DATABASE EMBEDDED BATCH File COMMANDLINE'/><title type='text'>Using Firebird ISQL to create embedded database files</title><content type='html'>ISQL is a command line tool that enables the execution of SQL statements either interactively or by input script file.&lt;br /&gt;&lt;br /&gt;I was struggling to get ISQL to work with my Firebird Embedded database files until I stumbled upon a little nugget of information in one of my many google searches.&lt;br /&gt;&lt;br /&gt;The problem was that ISQL wasn't using the embedded client!  Doh!&lt;br /&gt;&lt;br /&gt;The fix was simple!  To get ISQL working the way I needed it to all I had to do was:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Copy isql.exe into the Firebird embedded directory.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Rename fbembed.dll to fbclient.dll&lt;/li&gt;&lt;/ul&gt;Now I can create and connect to embedded database files using the ISQL command line tool.&lt;br /&gt;&lt;br /&gt;isql.exe" -q -i myDatabase.sql&lt;br /&gt;&lt;br /&gt;where the file myDatabase.sql contains:&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;CREATE DATABASE&lt;/span&gt; 'TEST.FDB'&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;USER&lt;/span&gt; 'SYSDBA' &lt;span style="color: rgb(51, 51, 255);"&gt;PASSWORD&lt;/span&gt; 'masterkey'&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;PAGE_SIZE &lt;/span&gt;8192&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;DEFAULT CHARACTER SET NONE;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;CREATE ROLE &lt;/span&gt;RDB$&lt;span style="color: rgb(0, 0, 0);"&gt;ADMIN&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;CREATE TABLE MYTABLE(&lt;br /&gt; ID &lt;span style="color: rgb(51, 51, 255);"&gt;INTEGER NOT NULL,&lt;/span&gt;&lt;br /&gt; NAME &lt;span style="color: rgb(51, 51, 255);"&gt;VARCHAR(500) NOT NULL&lt;/span&gt;&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;ALTER TABLE &lt;/span&gt;MYTABLE&lt;br /&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;ADD CONSTRAINT&lt;/span&gt; PK_MYTABLE_1&lt;br /&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;PRIMARY KEY&lt;/span&gt; (ID);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;COMMIT&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Why did I want to do this? &lt;/span&gt;&lt;br /&gt;My want was driven by a desire to have my build server create/modify database files for our product install.  Treating the database creation scripts like code negates the need for a "Golden" database file that no one, other than myself, knows how to create.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554418604921908606-8776640568143557884?l=silent-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silent-code.blogspot.com/feeds/8776640568143557884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://silent-code.blogspot.com/2011/12/firebird-isql-create-database-file.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/8776640568143557884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/8776640568143557884'/><link rel='alternate' type='text/html' href='http://silent-code.blogspot.com/2011/12/firebird-isql-create-database-file.html' title='Using Firebird ISQL to create embedded database files'/><author><name>Ed Hughes</name><uri>http://www.blogger.com/profile/15450443296640679451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554418604921908606.post-1377846082162890970</id><published>2011-10-13T08:58:00.012-04:00</published><updated>2011-10-26T14:47:52.852-04:00</updated><title type='text'>Firebird embedded with .Net</title><content type='html'>&lt;span style="font-family: arial;font-family:courier new;" &gt;&lt;span style="font-size:78%;"&gt;Here's a simple getting started with Firebird embedded&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Step one: Download FireBird embedded and the .Net provider&lt;/h1&gt;There are numerous options available for download but I opted for the zip packages as only the assemblies and supporting files are needed.&lt;br /&gt;http://www.firebirdsql.org/en/server-packages/&lt;br /&gt;http://www.firebirdsql.org/en/net-provider/&lt;br /&gt;http://www.firebirdsql.org/manual/ufb-cs-embedded.html#ufb-cs-embedded-windows&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-family:courier new;" &gt;&lt;span style="font-size:78%;"&gt;&lt;h1&gt;Step two: Create your database file&lt;/h1&gt;&lt;/span&gt;&lt;/span&gt;There are many administrative tools available for FireBird but I opted to use FlameRobin as its free.  &lt;span style="font-family: arial;font-family:courier new;" &gt;&lt;span style="font-size:78%;"&gt;http://www.flamerobin.org/&lt;br /&gt;&lt;br /&gt;In order to get flame robin to communicate with an embedded FireBird database there are a couple of steps required.&lt;br /&gt;Copy the following FireBird embedded client files to the FlameRobin installation folder (Default C:\Program Files\FlameRobin)&lt;br /&gt;fbembed.dll (Rename to fbclient.dll)&lt;br /&gt;firebird.msg&lt;br /&gt;icudt30.dll&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-family:courier new;" &gt;&lt;span style="font-size:78%;"&gt;icuin30.dll&lt;br /&gt;icuuc30.dll&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-family:courier new;" &gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;Register Server&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" style="font-family: arial;" href="http://1.bp.blogspot.com/-jmggweEKYHM/TpbnzcCD1cI/AAAAAAAAAAg/kFDQbDMEkTc/s1600/Register.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 165px;" src="http://1.bp.blogspot.com/-jmggweEKYHM/TpbnzcCD1cI/AAAAAAAAAAg/kFDQbDMEkTc/s320/Register.png" alt="" id="BLOGGER_PHOTO_ID_5662968452349154754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-family:courier new;" &gt;&lt;span style="font-size:78%;"&gt;Display name&lt;br /&gt;leave hostname and port empty&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-family:courier new;" &gt;&lt;span style="font-size:78%;"&gt;Create a new database&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" style="font-family: arial;" href="http://3.bp.blogspot.com/-GvmuLwWz6qc/TpbtwaoN6YI/AAAAAAAAAAs/o06a_bwKTL4/s1600/NewDatabase.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 209px;" src="http://3.bp.blogspot.com/-GvmuLwWz6qc/TpbtwaoN6YI/AAAAAAAAAAs/o06a_bwKTL4/s320/NewDatabase.png" alt="" id="BLOGGER_PHOTO_ID_5662974997502486914" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" style="font-family: arial;" href="http://4.bp.blogspot.com/-Gv8BYocGaj0/Tpbt-FBTB8I/AAAAAAAAAA4/RdrbCUhgcms/s1600/CreateTable.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 223px;" src="http://4.bp.blogspot.com/-Gv8BYocGaj0/Tpbt-FBTB8I/AAAAAAAAAA4/RdrbCUhgcms/s320/CreateTable.png" alt="" id="BLOGGER_PHOTO_ID_5662975232220268482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-family:courier new;" &gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" style="font-family: arial;" href="http://2.bp.blogspot.com/-aKtp2NrA360/TpbuIQDoPrI/AAAAAAAAABE/QH7uFk_hh6Y/s1600/CompleteDB.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 209px; height: 320px;" src="http://2.bp.blogspot.com/-aKtp2NrA360/TpbuIQDoPrI/AAAAAAAAABE/QH7uFk_hh6Y/s320/CompleteDB.png" alt="" id="BLOGGER_PHOTO_ID_5662975406981529266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-family:courier new;" &gt;&lt;span style="font-size:78%;"&gt;Step 3:  Create your .Net project.&lt;br /&gt;Add a reference to the .Net Provider.&lt;br /&gt;FirebirdSql.Data.FirebirdClient.dll&lt;br /&gt;The files icudt30.dll and icuuc30.dll need to be in the build directory.  Add them to the project (I added as a link as all my third party components live in a single place) and set to copy to output build directory.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" style="font-family: arial;" href="http://1.bp.blogspot.com/-eVby-2uA74k/Tpbufm9GMcI/AAAAAAAAABQ/rqBrC1r2Rxs/s1600/References.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 267px; height: 252px;" src="http://1.bp.blogspot.com/-eVby-2uA74k/Tpbufm9GMcI/AAAAAAAAABQ/rqBrC1r2Rxs/s320/References.png" alt="" id="BLOGGER_PHOTO_ID_5662975808265138626" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-family:courier new;" &gt;&lt;span style="font-size:78%;"&gt;Step 4:  Write the code.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:78%;"&gt;using System;&lt;br /&gt;using FirebirdSql.Data.FirebirdClient;&lt;br /&gt;&lt;br /&gt;namespace FirebirdClient&lt;br /&gt;{&lt;br /&gt;class Program&lt;br /&gt;{&lt;br /&gt;static void Main(stri&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:78%;"&gt;ng[] args)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:78%;"&gt;   {&lt;br /&gt;var builder = new FbConnectionStringBuilder&lt;br /&gt;{&lt;br /&gt;UserID = "SYSDBA",&lt;br /&gt;Password = "masterkey",&lt;br /&gt;ServerType = FbServerType.Embedded,&lt;br /&gt;Dialect = 3,&lt;br /&gt;Database = @"C:\MyDatabases\MyDB1.fb"&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;using (var conn = new FbConnection(builder.ConnectionString))&lt;br /&gt;{&lt;br /&gt;conn.Open();&lt;br /&gt;&lt;br /&gt;using (var cmd = new FbCommand("select * from MyTable", conn))&lt;br /&gt;using (var reader = cmd.ExecuteReader())&lt;br /&gt;{&lt;br /&gt;while (reader.Read())&lt;br /&gt;{&lt;br /&gt;Console.WriteLine(string.Format("{0} {1}", reader["MyCol1"], reader["MyCol2"]));&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Console.ReadLine();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554418604921908606-1377846082162890970?l=silent-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silent-code.blogspot.com/feeds/1377846082162890970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://silent-code.blogspot.com/2011/10/firebird-embedded-with-net.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/1377846082162890970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/1377846082162890970'/><link rel='alternate' type='text/html' href='http://silent-code.blogspot.com/2011/10/firebird-embedded-with-net.html' title='Firebird embedded with .Net'/><author><name>Ed Hughes</name><uri>http://www.blogger.com/profile/15450443296640679451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-jmggweEKYHM/TpbnzcCD1cI/AAAAAAAAAAg/kFDQbDMEkTc/s72-c/Register.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554418604921908606.post-3445393252185738206</id><published>2010-09-28T09:15:00.003-04:00</published><updated>2010-09-28T09:22:24.461-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SqlConnectionStringBuilder AttachDBFilename InitialCatalog  .Net ADO.NET'/><title type='text'>Control catalog name when using AttachDBFilename</title><content type='html'>I was using the AttachDBFilename and discovered that the database name ended up being the full path of the file being attached.&lt;br /&gt;&lt;br /&gt;Setting InitialCatalog as well enable me to control the catalog name of the attached file.&lt;br /&gt;&lt;br /&gt;var cb = new  SqlConnectionStringBuilder {&lt;br /&gt;IntegratedSecurity = true,&lt;br /&gt;DataSource = ".\MyInstance",&lt;br /&gt;AttachDBFilename = @"c:\mypath\mydb.mdf",&lt;br /&gt;InitialCatalog = "mydb catalog name"&lt;br /&gt; };&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554418604921908606-3445393252185738206?l=silent-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silent-code.blogspot.com/feeds/3445393252185738206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://silent-code.blogspot.com/2010/09/control-catalog-name-when-using.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/3445393252185738206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/3445393252185738206'/><link rel='alternate' type='text/html' href='http://silent-code.blogspot.com/2010/09/control-catalog-name-when-using.html' title='Control catalog name when using AttachDBFilename'/><author><name>Ed Hughes</name><uri>http://www.blogger.com/profile/15450443296640679451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554418604921908606.post-7586420057507489132</id><published>2010-09-23T15:36:00.003-04:00</published><updated>2010-09-23T15:47:12.841-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ToolStripControlHost designer .net visual studio'/><title type='text'>Visual studio designer hangs and fails to load ToolStripControlHost  derived class</title><content type='html'>I found a problem using a ToolStripControlHost derived class when the class is being built in the same solution as the form that uses the component.&lt;br /&gt;&lt;br /&gt;When performing a rebuild the designer would freeze and wouldn't redraw the toolbar.  The fix I discovered solves the problem where the designer disposes the object and then attempts to access it after the rebuild.&lt;br /&gt;&lt;br /&gt;public class CustomButtonToolStripHost : ToolStripControlHost&lt;br /&gt;{&lt;br /&gt;  public CustomButtonToolStripHost ()&lt;br /&gt;        : base(CustomToolStripButton())&lt;br /&gt;    {       &lt;br /&gt;    }&lt;br /&gt;    /// &lt;summary&gt;Used to overcome a designer error when rebuilding the project.&lt;/summary&gt;&lt;br /&gt;    private class CustomToolStripButton : Button // Replace with your control&lt;br /&gt;    {&lt;br /&gt;        /// &lt;summary&gt;Override CreateHandle to avoid exception if called when object is disposed.&lt;br /&gt;        /// This occurs when the designer updates after a rebuild.&lt;/summary&gt;&lt;br /&gt;        protected override void CreateHandle()&lt;br /&gt;        {&lt;br /&gt;            if (!IsDisposed)&lt;br /&gt;            {&lt;br /&gt;                base.CreateHandle();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554418604921908606-7586420057507489132?l=silent-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silent-code.blogspot.com/feeds/7586420057507489132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://silent-code.blogspot.com/2010/09/visual-studio-designer-hangs-and-fails.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/7586420057507489132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/7586420057507489132'/><link rel='alternate' type='text/html' href='http://silent-code.blogspot.com/2010/09/visual-studio-designer-hangs-and-fails.html' title='Visual studio designer hangs and fails to load ToolStripControlHost  derived class'/><author><name>Ed Hughes</name><uri>http://www.blogger.com/profile/15450443296640679451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554418604921908606.post-8710452852747551162</id><published>2010-09-23T15:32:00.003-04:00</published><updated>2010-09-23T15:36:34.181-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net c# Button Focus Steal Take'/><title type='text'>.Net button that doesn't take/steal focus</title><content type='html'>This is a simple solution that I've came up with after some thinking:&lt;br /&gt;&lt;br /&gt;public class MyButton : Button&lt;br /&gt;    {&lt;br /&gt;        public MyButton()&lt;br /&gt;        {&lt;br /&gt;            if (!DesignMode)&lt;br /&gt;            {&lt;br /&gt;                SetStyle(ControlStyles.Selectable, false);&lt;br /&gt;            }               &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;Much easier than trying to handle mouse activation messages etc...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554418604921908606-8710452852747551162?l=silent-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silent-code.blogspot.com/feeds/8710452852747551162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://silent-code.blogspot.com/2010/09/net-button-that-doesnt-takesteal-focus.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/8710452852747551162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/8710452852747551162'/><link rel='alternate' type='text/html' href='http://silent-code.blogspot.com/2010/09/net-button-that-doesnt-takesteal-focus.html' title='.Net button that doesn&apos;t take/steal focus'/><author><name>Ed Hughes</name><uri>http://www.blogger.com/profile/15450443296640679451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554418604921908606.post-2739998404965572448</id><published>2010-03-23T16:05:00.006-04:00</published><updated>2010-10-04T10:58:55.160-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='SqlDataReader'/><category scheme='http://www.blogger.com/atom/ns#' term='IEnumerable'/><category scheme='http://www.blogger.com/atom/ns#' term='SqlConnection'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='yield return'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Isolation from database</title><content type='html'>So I'm working on a legacy project and quite intent to re-factor the heck out of it.  One of my goals was to make the code testable and to do that I had to rip out the dependency on the database/DataSet implementation.&lt;br /&gt;&lt;br /&gt;To do this I created a data provider class and then implemented an iterator block and used the yield statement.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;public override IEnumerable MyDataObjects&lt;br /&gt;{&lt;br /&gt;    get&lt;br /&gt;    {&lt;br /&gt;        using (var connection = new SqlConnection(ConnectionString))&lt;br /&gt;        {&lt;br /&gt;            connection.Open();&lt;br /&gt;            using (var command = new SqlCommand{CommandText = "...", Connection = connection })&lt;br /&gt;            {&lt;br /&gt;                using (var reader = command.ExecuteReader())&lt;br /&gt;                {&lt;br /&gt;                    while (reader != null &amp;amp;&amp;amp; reader.Read())&lt;br /&gt;                    {&lt;br /&gt;                        yield return new MyDataObject&lt;br /&gt;                        {&lt;br /&gt;                        //extract the column values&lt;br /&gt;                        };&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Now the consumer of the data doesn't know where the data is coming from and that's just fine!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;foreach(var myData in provider.MyDataObjects)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;{&lt;/span&gt;&lt;br /&gt;//do stuff with the object&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554418604921908606-2739998404965572448?l=silent-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silent-code.blogspot.com/feeds/2739998404965572448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://silent-code.blogspot.com/2010/03/isolation-from-database.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/2739998404965572448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/2739998404965572448'/><link rel='alternate' type='text/html' href='http://silent-code.blogspot.com/2010/03/isolation-from-database.html' title='Isolation from database'/><author><name>Ed Hughes</name><uri>http://www.blogger.com/profile/15450443296640679451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554418604921908606.post-2091458287083242546</id><published>2009-11-04T14:03:00.004-05:00</published><updated>2009-11-04T14:27:44.233-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='showPermissionDialog'/><category scheme='http://www.blogger.com/atom/ns#' term='developer toolkit'/><category scheme='http://www.blogger.com/atom/ns#' term='permissions'/><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='asp.mvc'/><title type='text'>Get Facebook user's permission</title><content type='html'>In using the Facebook developer toolkit it was necessary to ask the user for extended permission to publish to their wall server side.&lt;br /&gt;&lt;br /&gt;The FbPermissions class is initialized with the required permissions.  Calling the GetPermissionFromUser will display the facebook permissions dialog. &lt;br /&gt;&lt;br /&gt;If all permissions were granted the dialog will not be invoked next time.  This prevents a momentary flash of the permissions dialog if you're using AJAX to make server requests.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:10px"&gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;function FbPermissions(options){&lt;br /&gt;&amp;nbsp;this.requiredPermissions = options["RequiredPermissions"];&amp;nbsp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;FbPermissions.prototype.callback = function(e, successCallback, failureCallback){&lt;br /&gt;&amp;nbsp;if(e === false){&lt;br /&gt;&amp;nbsp;&amp;nbsp;if(failureCallback != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;failureCallback();&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;else if(e == null || e === ""){&lt;br /&gt;&amp;nbsp;&amp;nbsp;if(failureCallback != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;failureCallback();&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;else{&lt;br /&gt;&amp;nbsp;&amp;nbsp;if(successCallback != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;successCallback();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;//Simple length check should be sufficient&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;if(this.requiredPermissions.split(',').length == e.split(',').length)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.requiredPermissions = "";&lt;br /&gt;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;FbPermissions.prototype.GetPermissionFromUser = function(successCallback, failureCallback)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;var me = this;&lt;br /&gt;&amp;nbsp;if(this.requiredPermissions != null &amp;&amp; this.requiredPermissions.length != 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;FB.Connect.showPermissionDialog(this.requiredPermissions, function(e){me.callback(e, successCallback, failureCallback);});   &lt;br /&gt;&amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;successCallback();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Usage&lt;/h2&gt;&lt;br /&gt;Using the class is simple.  Just initialize the FbPermissions with the required permissions using a server side script block.  Then invoke the GetPermissionFromUser function with a success and failure callback method.&lt;br /&gt;&lt;span style="font-size:10px"&gt;&lt;br /&gt;var permissions = new FbPermissions({RequiredPermissions : '&amp;lt;%= Model.RequiredFacebookPermissions %&amp;gt;'});&lt;br /&gt;&lt;br /&gt;function PostToWall(message) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;permissions.GetPermissionFromUser( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;function(){/*Call your facebook application here*/}, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;function(){alert('You must grant permission');})&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;a href="#" onclick="PostToWall('hi'); return false;"&amp;gt;click me&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554418604921908606-2091458287083242546?l=silent-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silent-code.blogspot.com/feeds/2091458287083242546/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://silent-code.blogspot.com/2009/11/get-facebook-users-permission.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/2091458287083242546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/2091458287083242546'/><link rel='alternate' type='text/html' href='http://silent-code.blogspot.com/2009/11/get-facebook-users-permission.html' title='Get Facebook user&apos;s permission'/><author><name>Ed Hughes</name><uri>http://www.blogger.com/profile/15450443296640679451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554418604921908606.post-7755273219334114564</id><published>2009-09-15T16:07:00.004-04:00</published><updated>2009-09-15T16:41:54.895-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NUnit'/><category scheme='http://www.blogger.com/atom/ns#' term='Selenium RC'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Selenium RC timing issues</title><content type='html'>Even the best Selenium test will fall victim to timing issues which will cause tests to fail some what randomly.  &lt;br /&gt;&lt;br /&gt;This class attempts to isolate the test from timing issues by performing an automatic retry.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:10px;"&gt;public static class SeleniumRetry&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;public static void Invoke&amp;lt;TArg&amp;gt;(Action&amp;lt;TArg&amp;gt; action, TArg arg)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Invoke(() =&amp;gt; action.Invoke(arg));&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;public static void Invoke&amp;lt;TArg1, TArg2&amp;gt;(Action&amp;lt;TArg1, TArg2&amp;gt; action2, TArg1 arg1, TArg2 arg2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Invoke(() =&amp;gt; action2.Invoke(arg1, arg2));&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;public static void Invoke(Action action)&lt;br /&gt;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;var attempt = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;const int maxAttempts = 5;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (true)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;action.Invoke();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch (Exception e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(e.Message);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (++attempt &amp;gt; maxAttempts)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread.Sleep(500);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Using the class is simple:&lt;/span&gt;&lt;br /&gt;This scenario shows how to automate a dynamically loaded login form that is created when the PopupLogon link is clicked.&lt;br /&gt;&lt;br /&gt;SeleniumRetry.Invoke(Browser.Click, "PopupLogon");            &lt;br /&gt;&lt;br /&gt;SeleniumRetry.Invoke(Browser.Type, "input_email", "fake@email.com");&lt;br /&gt;SeleniumRetry.Invoke(Browser.Type, "password", "12345");&lt;br /&gt;&lt;br /&gt;//First click selects the button, second performs action.&lt;br /&gt;SeleniumRetry.Invoke(Browser.Click, "submitBtn");            &lt;br /&gt;SeleniumRetry.Invoke(Browser.Click, "submitBtn");&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554418604921908606-7755273219334114564?l=silent-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silent-code.blogspot.com/feeds/7755273219334114564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://silent-code.blogspot.com/2009/09/selenium-rc-timing-issues.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/7755273219334114564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/7755273219334114564'/><link rel='alternate' type='text/html' href='http://silent-code.blogspot.com/2009/09/selenium-rc-timing-issues.html' title='Selenium RC timing issues'/><author><name>Ed Hughes</name><uri>http://www.blogger.com/profile/15450443296640679451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554418604921908606.post-6406311641674574032</id><published>2009-09-10T17:04:00.003-04:00</published><updated>2009-09-14T15:13:52.984-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional test'/><category scheme='http://www.blogger.com/atom/ns#' term='NUnit'/><category scheme='http://www.blogger.com/atom/ns#' term='Selenium RC'/><title type='text'>Automatically start and stop SeleniumRC with NUnit</title><content type='html'>&lt;p&gt;You can use NUnit and SeleniumRC to run automated functional tests of your website.  This is a simple class that starts selenium at the beginning of a unit test suite and shuts it down when done.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;using System.Diagnostics;&lt;br /&gt;using System.Net;&lt;br /&gt;using NUnit.Framework;&lt;br /&gt;&lt;br /&gt;[SetUpFixture]&lt;br /&gt;public class SeleniumRcSetup&lt;br /&gt;{&lt;br /&gt;private readonly Process SeleniumRC = new Process();&lt;br /&gt;[SetUp]&lt;br /&gt;public void StartSelniumRc()&lt;br /&gt;{&lt;br /&gt;const string pathRelativeToProjBinDebug = @"path to your selenium installation";&lt;br /&gt;SeleniumRC.StartInfo.FileName = "java";&lt;br /&gt;SeleniumRC.StartInfo.Arguments = string.Format("-jar {0}selenium-server.jar", pathRelativeToProjBinDebug);&lt;br /&gt;SeleniumRC.Start();&lt;br /&gt;}&lt;br /&gt;[TearDown]&lt;br /&gt;public void StopSeleniumRc()&lt;br /&gt;{&lt;br /&gt;var r = WebRequest.Create("http://localhost:4444/selenium-server/driver/?cmd=shutDown");&lt;br /&gt;r.GetResponse();&lt;br /&gt;SeleniumRC.WaitForExit(5000);&lt;br /&gt;SeleniumRC.Close();&lt;br /&gt;}&lt;br /&gt;}&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554418604921908606-6406311641674574032?l=silent-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silent-code.blogspot.com/feeds/6406311641674574032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://silent-code.blogspot.com/2009/09/automatically-start-and-stop-seleniumrc.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/6406311641674574032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/6406311641674574032'/><link rel='alternate' type='text/html' href='http://silent-code.blogspot.com/2009/09/automatically-start-and-stop-seleniumrc.html' title='Automatically start and stop SeleniumRC with NUnit'/><author><name>Ed Hughes</name><uri>http://www.blogger.com/profile/15450443296640679451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554418604921908606.post-25214185998904049</id><published>2009-09-09T15:12:00.010-04:00</published><updated>2009-09-14T15:14:23.736-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XmlSerializer'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Using XmlSerializer without rendering document declaration or namespace</title><content type='html'>Using xmlSerializer to serialize an object will by default add the xml namespace and document declaration.  &amp;lt;strong&amp;gt;Example&amp;lt;/strong&amp;gt;:&lt;br /&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="Windows-1252"?&amp;gt;&lt;br /&gt;&amp;lt;node xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" uID="12345"&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/node&amp;gt;&lt;br /&gt;&lt;br /&gt;But if all you want is to write out the xml fragment like:&lt;br /&gt;&amp;lt;node uid="12345"&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/node&amp;gt;&lt;br /&gt;&lt;br /&gt;You need to configure the serializer before you use it.  The following code will not render the document declaration or namespace.&lt;br /&gt;&lt;br /&gt;public void SerializeWithNoDeclarationNoNamespace&amp;lt;T&amp;gt;(TextWriter writer, T theObject)&lt;br /&gt;{&lt;br /&gt; var settings = new XmlWriterSettings&lt;br /&gt; {&lt;br /&gt;  Indent = true,&lt;br /&gt;  IndentChars = " ",&lt;br /&gt;  NewLineHandling = NewLineHandling.Replace,&lt;br /&gt;  NewLineChars = Environment.NewLine,&lt;br /&gt;  OmitXmlDeclaration = true&lt;br /&gt; };&lt;br /&gt;&lt;br /&gt; using (var xmlWriter = XmlWriter.Create(writer, settings))&lt;br /&gt; {&lt;br /&gt;  var xmlnsEmpty = new XmlSerializerNamespaces();&lt;br /&gt;  xmlnsEmpty.Add("", "");&lt;br /&gt;&lt;br /&gt;  new XmlSerializer(typeof(T)).Serialize(xmlWriter, theObject, xmlnsEmpty);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; writer.WriteLine("");&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554418604921908606-25214185998904049?l=silent-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silent-code.blogspot.com/feeds/25214185998904049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://silent-code.blogspot.com/2009/09/using-xmlserializer-without-rendering.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/25214185998904049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/25214185998904049'/><link rel='alternate' type='text/html' href='http://silent-code.blogspot.com/2009/09/using-xmlserializer-without-rendering.html' title='Using XmlSerializer without rendering document declaration or namespace'/><author><name>Ed Hughes</name><uri>http://www.blogger.com/profile/15450443296640679451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554418604921908606.post-8248150900837400806</id><published>2009-07-31T10:45:00.005-04:00</published><updated>2009-07-31T11:01:47.415-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='itunesconnect'/><category scheme='http://www.blogger.com/atom/ns#' term='symbolicatecrash'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>iTunesConnect crash reports</title><content type='html'>One nice feature of iTunesConnect is that you get crash reports from real users. You can use the &lt;strong&gt;symbolicatecrash &lt;/strong&gt;script to map the crash report to line numbers in your code.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;symbolicatecrash&lt;/strong&gt; attempts to be very clever at finding the symbol files based on the applicaton GUID found in the crash report. Unfortunately even if you use a revision control system, get the exact revision of the code you released to the iTunes store and re-build, &lt;strong&gt;symbolicatecrash &lt;/strong&gt;wont find the debug symbols because the applications GUIDs don't match.&lt;br /&gt;&lt;br /&gt;In a pinch you can break open the &lt;strong&gt;symbolicatecrash &lt;/strong&gt;script file, brush up on your Perl skills and force it to use the symbol file created by the re-build.&lt;br /&gt;&lt;br /&gt;But for all future releases you can just have Hudson archive the debug symbol files for you and life will be much easier.&lt;br /&gt;&lt;br /&gt;zip -r -T -y "myApp_ProdSymbols.zip" "myApp.app.dSYM"&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554418604921908606-8248150900837400806?l=silent-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silent-code.blogspot.com/feeds/8248150900837400806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://silent-code.blogspot.com/2009/07/itunesconnect-crash-reports.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/8248150900837400806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/8248150900837400806'/><link rel='alternate' type='text/html' href='http://silent-code.blogspot.com/2009/07/itunesconnect-crash-reports.html' title='iTunesConnect crash reports'/><author><name>Ed Hughes</name><uri>http://www.blogger.com/profile/15450443296640679451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554418604921908606.post-2904696331934030738</id><published>2009-07-17T16:52:00.017-04:00</published><updated>2009-07-22T12:49:37.525-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='xcodebuild'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>iPhone app distribution made easy - Part 4</title><content type='html'>&lt;strong&gt;Introducing Subversion&lt;br /&gt;&lt;/strong&gt;One of the most important items for any kind of software development is a version/revision control system. There are many flavors of version control systems and many arguments for and against each one. Ultimately they all provide the ability to track changes in code over time and provide the ability to manage development paths. For the purpose of this post I'll be referencing SubVersion (&lt;a href="http://subversion.tigris.org/"&gt;http://subversion.tigris.org/&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Introducing Hudson&lt;/strong&gt;&lt;br /&gt;Hudson is a continuous integration build system that enables easy tracking and running of builds. Hudson can be downloaded from &lt;a href="https://hudson.dev.java.net/"&gt;https://hudson.dev.java.net/&lt;/a&gt; and is very easy to get started and can be run on the Mac with the following command "java -jar hudson.war".&lt;br /&gt;&lt;br /&gt;Hudson is integrated with subversion so builds can be triggered by subversion code commits. Builds can also be launched manually. One of the great strengths of Hudson is that it manages all the build numbers and build artifacts for you so you don't have to think about it.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Basic steps&lt;/strong&gt;&lt;br /&gt;The steps to get Hudson building your iPhone applications are quite simple and follows the format:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Create a new hudson job&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Point Hudson to your subversion repository&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Create a build step to run the build scripts developed earlier in Part 2 and Part 3.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Instruct Hudson to save the build output.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Example Build step&lt;/strong&gt;&lt;br /&gt;The following build step starts by creating some variables for build folders etc using some of Hudson's built in environment variables. It then builds the AppStore and AdHoc distributions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:10;font-family:courier new;color:#009900;"&gt;PROJDIR=${WORKSPACE}/myApp&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10;font-family:courier new;color:#009900;"&gt;ADHOC_BUILDDIR="${PROJDIR}/build/myAppAdHoc/DistributionAdHoc-iphoneos"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10;font-family:courier new;color:#009900;"&gt;APPSTORE_BUILDDIR="${PROJDIR}/build/myAppAppStore/DistributionAppStore-iphoneos"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10;font-family:courier new;color:#009900;"&gt;BASEFILENAME="${JOB_NAME}_${BUILD_NUMBER}(rev-${SVN_REVISION})" &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:10;font-family:courier new;color:#009900;"&gt;echo Building AppStore release&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10;font-family:courier new;color:#009900;"&gt;cd "${PROJDIR}"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10;font-family:courier new;color:#009900;"&gt;xcodebuild -target "myAppAppStore" -configuration "DistributionAppStore" -sdk iphoneos2.1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10;font-family:courier new;color:#009900;"&gt;cd "${APPSTORE_BUILDDIR}"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10;font-family:courier new;color:#009900;"&gt;zip -r -T -y "${BASEFILENAME}_AppStoreApp.zip" "myApp.app" &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:10;font-family:courier new;color:#009900;"&gt;&lt;br /&gt;echo Building AdHoc release&lt;br /&gt;cd "${PROJDIR}"&lt;br /&gt;xcodebuild -target "myAppAdHoc" -configuration "DistributionAdHoc" -sdk iphoneos2.1&lt;br /&gt;cd "${ADHOC_BUILDDIR}"&lt;br /&gt;zip -r -T -y "${BASEFILENAME}_AdHocApp.zip" "myApp.app"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;color:#000000;"&gt;The output zip file name will include the build number &amp;amp; subversion revision number for easy reference.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Example: myApp_13(rev-99619)_ProdApp.zip&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Example artifacts archive&lt;/strong&gt;&lt;br /&gt;Hudson has the ability to perform wild card searches when looking for build artifacts. The following will search both the AdHoc and AppStore build folders for their output files.&lt;br /&gt;&lt;br /&gt;myApp/build/**/*.zip&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br /&gt;So hopefully you are now inspired or atleast aware of how you can make your own iPhone development easier.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554418604921908606-2904696331934030738?l=silent-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silent-code.blogspot.com/feeds/2904696331934030738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://silent-code.blogspot.com/2009/07/iphone-app-distribution-made-easy-part_957.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/2904696331934030738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/2904696331934030738'/><link rel='alternate' type='text/html' href='http://silent-code.blogspot.com/2009/07/iphone-app-distribution-made-easy-part_957.html' title='iPhone app distribution made easy - Part 4'/><author><name>Ed Hughes</name><uri>http://www.blogger.com/profile/15450443296640679451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554418604921908606.post-669387311529940624</id><published>2009-07-17T16:38:00.004-04:00</published><updated>2009-07-20T13:03:46.961-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Xcode'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='itunes'/><title type='text'>iPhone app distribution made easy - Part 3</title><content type='html'>Now that we've built the distributions with &lt;strong&gt;xcodebuild&lt;/strong&gt; it seems a shame to use Finder to compress the app bundle for submission to the App Store.&lt;br /&gt;&lt;br /&gt;So lets use the "zip" command line utility to compress the app bundle:&lt;br /&gt;&lt;br /&gt;zip -r -T -y "myApp_AppStoreDistribution.zip" "myApp.app"&lt;br /&gt;&lt;br /&gt;The important option to note here is the "-y" option that stores symbolic links as the link. This is important because the app bundle contains symbolic links to the code signature folder.&lt;br /&gt;&lt;br /&gt;If the symbolic links don't exist the application will not be accepted and iTunesConnect will complain with an error like:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#ff0000;"&gt;The binary you uploaded was invalid. The signature was invalid, or it was not signed with an Apple submission certificate...&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Now all that is left for us to do is formalize the build process and we're good to go. Next time I'll introduce the continuous integration engine called Hudson.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554418604921908606-669387311529940624?l=silent-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silent-code.blogspot.com/feeds/669387311529940624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://silent-code.blogspot.com/2009/07/iphone-app-distribution-made-easy-part_1466.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/669387311529940624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/669387311529940624'/><link rel='alternate' type='text/html' href='http://silent-code.blogspot.com/2009/07/iphone-app-distribution-made-easy-part_1466.html' title='iPhone app distribution made easy - Part 3'/><author><name>Ed Hughes</name><uri>http://www.blogger.com/profile/15450443296640679451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554418604921908606.post-7068542333271236405</id><published>2009-07-17T16:26:00.007-04:00</published><updated>2009-07-17T21:05:27.310-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sdk'/><category scheme='http://www.blogger.com/atom/ns#' term='xcodebuild'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>iPhone app distribution made easy - Part 2</title><content type='html'>Being able to build various distributions in the XCode IDE is great but you have to think about what you're doing very carefully. Thankfully the 3.0 version of the SDK comes with an improved command line build utility called "xcodebuild".&lt;br /&gt;&lt;br /&gt;Here's an example of how to build the AppStore distribution:&lt;br /&gt;&lt;span style="font-size:12px"&gt;&lt;br /&gt;&lt;strong&gt;xcodebuild &lt;/strong&gt;-target "myAppAppStore" -configuration "DistributionAppStore" -sdk iphoneos2.1&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;As you'll notice the target, configuration and the sdk to use are being specified. &lt;em&gt;Note: The sdk option is new for the 3.0 sdk and can take either the name or path of the sdk to use. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;You can view all of the installed sdks by running the following command:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;xcodebuild&lt;/strong&gt; -showsdks&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;So now we have the ability to build the distributions without thinking about it. We could put this in a script and call it a day but lets not stop there. Next time we'll zip up the app bundle for submission to the AppStore or AdHoc users.&lt;/em&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554418604921908606-7068542333271236405?l=silent-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silent-code.blogspot.com/feeds/7068542333271236405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://silent-code.blogspot.com/2009/07/iphone-app-distribution-made-easy-part_17.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/7068542333271236405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/7068542333271236405'/><link rel='alternate' type='text/html' href='http://silent-code.blogspot.com/2009/07/iphone-app-distribution-made-easy-part_17.html' title='iPhone app distribution made easy - Part 2'/><author><name>Ed Hughes</name><uri>http://www.blogger.com/profile/15450443296640679451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554418604921908606.post-74330990495553867</id><published>2009-07-17T09:40:00.003-04:00</published><updated>2009-07-17T20:32:03.194-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Xcode'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>iPhone app distribution made easy - Part 1</title><content type='html'>This is the first in a multi part series that will explore one approach to making iPhone app distribution a single click operation. The purpose is to take the thought out of generating a distribution and leave you free to concentrate on the real work. There are some &lt;span id="SPELLING_ERROR_0" class="blsp-spelling-corrected"&gt;prerequisites&lt;/span&gt; that I'll assume you have completed:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Registered for the iPhone developer program.&lt;/li&gt;&lt;li&gt;Created you unique &lt;span id="SPELLING_ERROR_1" class="blsp-spelling-error"&gt;AppID&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Requested your code signing certificate.&lt;/li&gt;&lt;li&gt;Created your distribution profiles for &lt;span id="SPELLING_ERROR_2" class="blsp-spelling-error"&gt;iTunes&lt;/span&gt; store and &lt;span id="SPELLING_ERROR_3" class="blsp-spelling-error"&gt;AdHoc&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Installed these items on your development machine.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Armed with these items we'll begin by setting up the project.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Creating distribution configurations&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Using the "&lt;em&gt;project info"&lt;/em&gt; window's "&lt;em&gt;configurations" &lt;/em&gt;tab duplicate the Release configuration twice. I named the two configurations "&lt;strong&gt;&lt;span id="SPELLING_ERROR_4" class="blsp-spelling-error"&gt;DistributionAdHoc&lt;/span&gt;&lt;/strong&gt;" and "&lt;strong&gt;&lt;span id="SPELLING_ERROR_5" class="blsp-spelling-error"&gt;DistributionAppStore&lt;/span&gt;&lt;/strong&gt;" but you're free to come up with your own &lt;span id="SPELLING_ERROR_6" class="blsp-spelling-corrected"&gt;convention&lt;/span&gt;. &lt;/p&gt;&lt;p&gt;The next step is to assign the "&lt;em&gt;code signing identity"&lt;/em&gt; to the corresponding distribution profile. Do this in the "&lt;em&gt;build&lt;/em&gt;" tab.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Creating the &lt;span id="SPELLING_ERROR_7" class="blsp-spelling-error"&gt;AdHoc&lt;/span&gt; target&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The only difference with the &lt;span id="SPELLING_ERROR_8" class="blsp-spelling-error"&gt;AdHoc&lt;/span&gt; target is that it has the &lt;span id="SPELLING_ERROR_9" class="blsp-spelling-error"&gt;iTunesArtwork&lt;/span&gt; file so that &lt;span id="SPELLING_ERROR_10" class="blsp-spelling-error"&gt;iTunes&lt;/span&gt; will display the application icon. The application icon for the &lt;span id="SPELLING_ERROR_11" class="blsp-spelling-error"&gt;iTunes&lt;/span&gt; for the AppStore distribution will actually come from the &lt;span id="SPELLING_ERROR_12" class="blsp-spelling-error"&gt;iTunes&lt;/span&gt; store.&lt;/p&gt;&lt;p&gt;Create a new target by selecting the projects current target and duplicate it. Rename the target to something that indicates that its the &lt;span id="SPELLING_ERROR_13" class="blsp-spelling-error"&gt;AdHoc&lt;/span&gt; target. Add the &lt;span id="SPELLING_ERROR_14" class="blsp-spelling-error"&gt;iTunesArtwork&lt;/span&gt; file to the "&lt;em&gt;Copy Bundle Resources"&lt;/em&gt; step of the target. &lt;/p&gt;&lt;p&gt;Note: The &lt;span id="SPELLING_ERROR_15" class="blsp-spelling-error"&gt;iTunesArtWork&lt;/span&gt; file is a 512x512 &lt;span id="SPELLING_ERROR_16" class="blsp-spelling-error"&gt;png&lt;/span&gt; file with no extension in the root of the app bundle.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;One step closer&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;So now you should be able to select the &lt;strong&gt;Target&lt;/strong&gt;, &lt;strong&gt;Configuration&lt;/strong&gt; and &lt;strong&gt;&lt;span id="SPELLING_ERROR_17" class="blsp-spelling-error"&gt;SDK&lt;/span&gt;&lt;/strong&gt; and build your specific distribution.&lt;/p&gt;&lt;p&gt;Next time we'll use the command line build utility &lt;strong&gt;&lt;span id="SPELLING_ERROR_18" class="blsp-spelling-error"&gt;xcodebuild&lt;/span&gt;&lt;/strong&gt; to take the thought out of building.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554418604921908606-74330990495553867?l=silent-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silent-code.blogspot.com/feeds/74330990495553867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://silent-code.blogspot.com/2009/07/iphone-app-distribution-made-easy-part.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/74330990495553867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/74330990495553867'/><link rel='alternate' type='text/html' href='http://silent-code.blogspot.com/2009/07/iphone-app-distribution-made-easy-part.html' title='iPhone app distribution made easy - Part 1'/><author><name>Ed Hughes</name><uri>http://www.blogger.com/profile/15450443296640679451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4554418604921908606.post-7842519488503764038</id><published>2009-07-16T19:46:00.000-04:00</published><updated>2009-07-16T19:52:27.484-04:00</updated><title type='text'>Giving back</title><content type='html'>Apart from some rather niche forums (XP Embedded for example, don't know what XPE is?  I did say niche) I'll admit to taking a lot of knowledge but rarely giving anything back. &lt;br /&gt;&lt;br /&gt;I hope to rectify this by sharing tips and tricks that I've learned along the way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4554418604921908606-7842519488503764038?l=silent-code.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://silent-code.blogspot.com/feeds/7842519488503764038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://silent-code.blogspot.com/2009/07/giving-back.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/7842519488503764038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4554418604921908606/posts/default/7842519488503764038'/><link rel='alternate' type='text/html' href='http://silent-code.blogspot.com/2009/07/giving-back.html' title='Giving back'/><author><name>Ed Hughes</name><uri>http://www.blogger.com/profile/15450443296640679451</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
