<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://philchuang.com/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"><channel><title>PhilChuang.com</title><link>http://philchuang.com/cs/blogs/</link><description>Software Development, Politics, Football, Music, Videogames, you name it!</description><dc:language>en-US</dc:language><generator>CommunityServer 2008 SP1 (Build: 30619.63)</generator><item><title>WP7 Marketplace app certification woes</title><link>http://philchuang.com/cs/blogs/dev/archive/2011/05/06/wp7-marketplace-app-certification-woes.aspx</link><pubDate>Fri, 06 May 2011 14:25:00 GMT</pubDate><guid isPermaLink="false">5be18640-eccb-47b9-8b04-4ed791bb5d95:1070</guid><dc:creator>Phil Chuang</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;There&amp;#39;s pros and cons for having a tightly-controlled marketplace which requires app certification. &amp;nbsp; The main advantage is that you have a better ratio of higher-quality, non-malware apps in the marketplace. &amp;nbsp; The main disadvantage is that the certification process experience is entirely dependent on the quality of tester you get.&lt;/p&gt;
&lt;p&gt;I&amp;#39;ve been trying to release &lt;a target="_blank" title="Location Sender" href="http://philchuang.com/cs/blogs/software/pages/location-sender.aspx"&gt;Location Sender&lt;/a&gt;, the free app I built as an example for the &lt;a target="_blank" title="PMVP" href="http://pmvp.codeplex.com/"&gt;PMVP framework&lt;/a&gt;, for 8 days now. &amp;nbsp; It has failed certification 3 times so far, with half the issues being legitimate, and the rest trivial or downright wrong. &amp;nbsp; I love getting certification failed notices when the issues are legitimate, because that keeps normal users from experiencing bugs. &amp;nbsp; Of course, the best solution is to do more robust testing in the first place so the bugs aren&amp;#39;t there and I pass certification the first time, but we all know that&amp;#39;s less likely to happen.&lt;/p&gt;
&lt;p&gt;But I hate it when the tester was obviously being lazy or obtuse and fails my app submission over issues that are not applicable or were fixed in a previous round. &amp;nbsp; That&amp;#39;s another 2+ days wasted.&lt;/p&gt;
&lt;p&gt;My first submission passed certification, but I had submitted it under the name &amp;quot;Here I Am!&amp;quot; - but I didn&amp;#39;t do my due diligence and search to see if that name was already being used, which it was. &amp;nbsp; So I pulled the app after it passed because I didn&amp;#39;t want to be a jerk to the other app&amp;#39;s creator. &amp;nbsp; So I changed the name to Location Sender, and resubmitted it. &amp;nbsp; Much to my surprise, it failed certification that it had passed 2 days ago under a different name. &amp;nbsp; That was silly, but I was ok with it because they were legitimate issues that the first tester didn&amp;#39;t catch - namely 1.1) I didn&amp;#39;t provide a way for the user to opt-in/out of location services and 1.2) I didn&amp;#39;t include a privacy policy.&lt;/p&gt;
&lt;p&gt;So I modified the app to resolve both those issues, and made a common developer mistake: added a new feature in a bugfix release. &amp;nbsp; I also added in a way for the user to opt-in/out of app analytics (I use Preemptive&amp;#39;s RIS), but I didn&amp;#39;t do enough testing on it, which brought me to my 2nd certification failure. &amp;nbsp; The issues this time: 2.1) The application crashes when analytics are disabled and has to be reinstalled and 2.2) the app does not provide a way for the user to prevent it from running under the lock screen.&lt;/p&gt;
&lt;p&gt;Issue 2.1 was totally legitimate and my fault for not testing it fully, and quite frankly I&amp;#39;m ashamed that I didn&amp;#39;t catch it before testing. &amp;nbsp; So I removed analytics entirely until I can debug the issue. &amp;nbsp; However issue 2.2 is puzzling because my app DOESN&amp;#39;T run under the lock screen! &amp;nbsp; I looked in my code, and I have references to a utility for the lock screen setting, however, it was never enabled. &amp;nbsp; So i&amp;#39;m guessing that MS analyzes the code for references to that setting, and the tester never bothered to check if it was being used - only that the app had that reference and that I didn&amp;#39;t provide a way to disable a functionality that could never be enabled anyway. &amp;nbsp; Sigh. &amp;nbsp; So it&amp;#39;s half the tester&amp;#39;s fault for not bothering to check and it&amp;#39;s half my fault for leaving useless code in. &amp;nbsp; So I fixed these issues and resubmitted, for the 4th time.&lt;/p&gt;
&lt;p&gt;Imagine my shock when the app failed certification for a third time! &amp;nbsp; This time the issues were non-existent, non-applicable, and illegitimate - I was furious that they are making me waste another 4 days to get this app out there. &amp;nbsp; They had 2 issues: &lt;br /&gt;3.1) That the application violates the prohibited app policy because they somehow thought that I required the user to buy something else to enable full functionality. &amp;nbsp; I have no idea where the tester got this idea, and apparently they didn&amp;#39;t either, as they didn&amp;#39;t give me any feedback as to why they thought my app violated their policy. &amp;nbsp; An app that is free, the source code is freely available, has no ads, has no references to websites which require money, etc. &amp;nbsp; The tester got it completely wrong here and now they&amp;#39;re just pissing me off.&lt;br /&gt;&lt;br /&gt;Also, the other issue 3.2) was the same as 1.1, where the tester claims I didn&amp;#39;t provide a way for the user to opt-in/out of location services! &amp;nbsp; Which is total BS, because I fixed that issue 2 submissions ago! &amp;nbsp; I added in a dialog that pops up on first run and a settings page, I don&amp;#39;t know how I can make it any clearer. &amp;nbsp; Obviously the tester was being lazy and completely missed the settings page with the &amp;quot;Disable Location Services Access&amp;quot; button.&lt;/p&gt;
&lt;p&gt;So I resubmitted the same exact XAP file and left some scathing comments in the tester notes. &amp;nbsp; We&amp;#39;ll see if the app passes this time or if I end up getting banned from the marketplace for hurting their tester&amp;#39;s feelings.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://philchuang.com/cs/aggbug.aspx?PostID=1070" width="1" height="1"&gt;</description><category domain="http://philchuang.com/cs/blogs/dev/archive/tags/mvp/default.aspx">mvp</category><category domain="http://philchuang.com/cs/blogs/dev/archive/tags/windows-phone/default.aspx">windows-phone</category><category domain="http://philchuang.com/cs/blogs/dev/archive/tags/wp7/default.aspx">wp7</category><category domain="http://philchuang.com/cs/blogs/dev/archive/tags/location-sender/default.aspx">location-sender</category></item><item><title>Automatically resizing Windows Mobile Forms when the SIP is shown</title><link>http://philchuang.com/cs/blogs/dev/archive/2010/06/08/automatically-resizing-windows-mobile-forms-when-the-sip-is-shown.aspx</link><pubDate>Wed, 09 Jun 2010 03:46:00 GMT</pubDate><guid isPermaLink="false">5be18640-eccb-47b9-8b04-4ed791bb5d95:1035</guid><dc:creator>Phil Chuang</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;This was bugging me for awhile, but it took me until now to get around to fixing it.&lt;/p&gt;
&lt;p&gt;I had an issue with forms with text boxes near the bottom, and when the SIP (on-screen keyboard) is shown, then it completely hides the textbox.&amp;nbsp;&amp;nbsp; So I went googling and found this:&lt;/p&gt;
&lt;h4&gt;&lt;a target="_blank" title="Manage soft input panel (SIP)" href="http://www.christec.co.nz/blog/archives/42"&gt;Manage soft input panel (SIP)&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;And with that knowledge, wrote a quick util method to automatically add this behavior:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;public static void AddAutoInputPanelResizing (Control parent, IContainer iContainer)
{
	var p = new Panel
	{
		Height = 0,
		Visible = false,
		Name = &amp;quot;SIP Placeholder&amp;quot;,
		Dock = DockStyle.Bottom,
	};
	parent.Controls.Add (p);
	p.SendToBack ();

	var ip = new InputPanel (iContainer);
	ip.EnabledChanged +=
		(sender, e) =&amp;gt;
		{
			parent.SuspendLayout ();
			p.Visible = ip.Enabled;
			p.Height = ip.Bounds.Height;
			parent.ResumeLayout ();
		};
}
&lt;/pre&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://philchuang.com/cs/aggbug.aspx?PostID=1035" width="1" height="1"&gt;</description><category domain="http://philchuang.com/cs/blogs/dev/archive/tags/csharp/default.aspx">csharp</category><category domain="http://philchuang.com/cs/blogs/dev/archive/tags/windows-mobile/default.aspx">windows-mobile</category></item><item><title>Automatically resizing Sharepoint Excel Web Parts</title><link>http://philchuang.com/cs/blogs/dev/archive/2010/04/28/automatically-resizing-sharepoint-excel-web-parts.aspx</link><pubDate>Wed, 28 Apr 2010 18:51:00 GMT</pubDate><guid isPermaLink="false">5be18640-eccb-47b9-8b04-4ed791bb5d95:1034</guid><dc:creator>Phil Chuang</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;If you&amp;#39;ve ever done excel web parts in sharepoint, you know that most of the time they turn out ugly, due to the fact that they&amp;#39;re rendered in an iframe and therefore the browser doesn&amp;#39;t resize the container to fit the content.&lt;/p&gt;
&lt;p&gt;So I went googling, and found Paul Grenier&amp;#39;s article &lt;a target="_blank" href="http://www.endusersharepoint.com/2009/01/05/jquery-for-everyone-dynamically-sizing-excel-web-parts/" title="http://www.endusersharepoint.com/2009/01/05/jquery-for-everyone-dynamically-sizing-excel-web-parts/"&gt;JQuery for Everyone: Dynamically Sizing Excel Web Parts&lt;/a&gt;.&amp;nbsp;&amp;nbsp; That got me started, but it didn&amp;#39;t quite work so I had to hack it until it did.&lt;/p&gt;
&lt;p&gt;I also adapted the code to resize charts&amp;nbsp;instead of just&amp;nbsp;tables.&lt;/p&gt;
&lt;p&gt;What you&amp;#39;re going to want to do is edit the page where you want the resizing to happen, add in a content editor web part, and paste the following code into the source editor.&lt;/p&gt;
&lt;pre class="brush: js;"&gt;&amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
$(function () { // resizes excel webparts
	$(&amp;quot;td[id^=&amp;#39;MSOZoneCell_WebPart&amp;#39;]&amp;quot;).each (function (i, e) {
		var findIframe = $(e).find (&amp;quot;iframe:first&amp;quot;);
		if (findIframe &amp;amp;&amp;amp; findIframe.attr (&amp;quot;scriptforiframecontent&amp;quot;))
			bindEwaLoaded (&amp;quot;#&amp;quot;+e.id);
	});
});

function bindEwaLoaded(obj) { // bind event to the web part
	$(obj).bind (&amp;quot;ewaLoaded&amp;quot;, function (e) {
		var b = $(e.target).find (&amp;quot;iframe:first&amp;quot;).attr (&amp;quot;postedbackalready&amp;quot;);
		if (b == undefined) // loop until iframe is ready
			setTimeout (function() { $(e.target).trigger (&amp;quot;ewaLoaded&amp;quot;); }, 1000);
		else // try to resize now
			ewaSetSize (e.target);
	}).trigger (&amp;quot;ewaLoaded&amp;quot;); // first trigger now
}

function ewaSetSize(obj) { // resize elements
	// configure paddings
	var excelObjectWidthPadding = 50;
	var excelObjectHeightPadding = 50.
	var w, h, div1, div2;
	var e = $(obj).find (&amp;quot;iframe:first&amp;quot;).contents().find (&amp;quot;table.ewrnav-invisibletable-nopadding:last&amp;quot;);
	if (e.length != 0) { // excel table
		w = e.width ();
		h = e.height ();
		div1 = $(obj).find (&amp;quot;table:first&amp;gt; tbody:first&amp;gt; tr:eq(1)&amp;gt; td&amp;gt; div&amp;gt; div&amp;quot;);
		div2 = $(div1).find (&amp;quot;table:first&amp;gt; tbody:first&amp;gt; tr:eq(1)&amp;gt; td&amp;gt; div&amp;quot;);
	} else {
		e = $(obj).find (&amp;quot;iframe:first&amp;quot;).contents().find (&amp;quot;div.ewrchart-img-div&amp;quot;);
		if (e.length != 0) { // excel chart
			w = e.width ();
			h = e.height ();
			div1 = $(obj).find (&amp;quot;table:first&amp;gt; tbody:first&amp;gt; tr:eq(0)&amp;gt; td&amp;gt; div&amp;gt; div&amp;quot;);
			div2 = $(div1).find (&amp;quot;table:first&amp;gt; tbody:first&amp;gt; tr:eq(1)&amp;gt; td&amp;gt; div&amp;quot;);
		}
	}

	if (w == 0 || w == undefined) { // loop until content is ready
		setTimeout (function() { ewaSetSize (obj); }, 1000);
	} else { // do resize
		w += excelObjectWidthPadding;
		h += excelObjectHeightPadding;
		div1.width (w);
		div2.height (h);
	}
}
&amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Once that&amp;#39;s done, change the Appearance &amp;gt; Chrome Type to &amp;quot;None&amp;quot;.&amp;nbsp;&amp;nbsp; You can also configure excelObjectXXXXPadding to your liking.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://philchuang.com/cs/aggbug.aspx?PostID=1034" width="1" height="1"&gt;</description><category domain="http://philchuang.com/cs/blogs/dev/archive/tags/javascript/default.aspx">javascript</category><category domain="http://philchuang.com/cs/blogs/dev/archive/tags/excel-services/default.aspx">excel-services</category><category domain="http://philchuang.com/cs/blogs/dev/archive/tags/sharepoint/default.aspx">sharepoint</category><category domain="http://philchuang.com/cs/blogs/dev/archive/tags/jquery/default.aspx">jquery</category></item><item><title>Current Projects</title><link>http://philchuang.com/cs/blogs/software/archive/2008/08/24/current-projects.aspx</link><pubDate>Sun, 24 Aug 2008 05:59:00 GMT</pubDate><guid isPermaLink="false">5be18640-eccb-47b9-8b04-4ed791bb5d95:2</guid><dc:creator>Phil Chuang</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Here&amp;#39;s a list of projects I&amp;#39;m developing:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;MobileReceptionist&lt;/b&gt;&lt;br /&gt;Handle incoming calls, SMS, emails by sending notifications, automatic responses.&amp;nbsp;&amp;nbsp; Also allows for phone status monitoring, remote administration.&lt;br /&gt;Status: actively developing, nearing beta&lt;/p&gt;
&lt;p&gt;&lt;b&gt;PicDialer&lt;/b&gt;&lt;br /&gt;A touch interface for dialing contacts using their Outlook contact photo.&lt;br /&gt;Status: not actively developing, close to beta&lt;/p&gt;
&lt;p&gt;&lt;b&gt;WhatIGot&lt;/b&gt;&lt;br /&gt;An inventory application where a user can create a custom inventory with user-defined categories and fields, with plugins for barcode-scanning and Amazon.com, IMDB lookup.&lt;br /&gt;Status: not actively developing, basic design and limited development done.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ContactArchiver&lt;/b&gt;&lt;br /&gt;An application to archive contacts from Outlook.&amp;nbsp;&amp;nbsp; It removes them from the address book but provides a way to look them up later, with import/export to/from the application/outlook.&lt;br /&gt;Status: not actively developing, basic functionality developed and tested.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;So if any of these pique your interest, holler and perhaps I&amp;#39;ll work a little faster on getting it done!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://philchuang.com/cs/aggbug.aspx?PostID=2" width="1" height="1"&gt;</description></item></channel></rss>