<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Robert LaThanh &#187; Web Technology</title>
	<atom:link href="http://robertlathanh.com/category/web-technology/feed/" rel="self" type="application/rss+xml" />
	<link>http://robertlathanh.com</link>
	<description></description>
	<lastBuildDate>Fri, 20 Jan 2012 14:34:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>View Your Google Apps Calendar in Outlook 2007/2010</title>
		<link>http://robertlathanh.com/2010/08/view-your-google-apps-calendar-in-outlook-2007-2010/</link>
		<comments>http://robertlathanh.com/2010/08/view-your-google-apps-calendar-in-outlook-2007-2010/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 00:27:09 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[Personal Technology]]></category>
		<category><![CDATA[Web Technology]]></category>

		<guid isPermaLink="false">http://robertlathanh.com/?p=121</guid>
		<description><![CDATA[Microsoft Outlook (2007 and 2010) and Google calendar both support the iCalendar format, which means you can view your Google calendars in Outlook. This is great if you, for example, want to be able to see your Google Apps personal &#8230; <a href="http://robertlathanh.com/2010/08/view-your-google-apps-calendar-in-outlook-2007-2010/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Microsoft Outlook (2007 and 2010) and Google calendar both support the <a href="http://en.wikipedia.org/wiki/ICalendar">iCalendar</a> format, which means you can view your Google calendars in Outlook. This is great if you, for example, want to be able to see your Google Apps personal calendar and Exchange work calendars in one place. It looks like this:</p>
<div id="attachment_122" class="wp-caption alignnone" style="width: 710px"><img class="size-full wp-image-122" title="Outlook - All calendars - Overlaid" src="http://robertlathanh.com/wp-content/uploads/2010/08/Outlook-All-calendars-Overlaid.png" alt="" width="700" height="599" /><p class="wp-caption-text">Outlook and Google Calendars overlaid in one view. The color of an item indicates which calendar it's from.</p></div>
<p>If you’re a regular Gmail user, you may follow the directions at <a href="http://www.howtogeek.com/howto/microsoft-office/view-your-google-calendar-in-outlook-2007/">How-To Geek</a>. However, if you’re using Google Apps for your domain/business (or organization, family, or whatever), you would likely run into a couple obstacles with those steps.</p>
<p>Note that this is for just <em>viewing</em> your calendar &#8212; you will not be able to add or edit events to your Google Calendar. This might be your best option when other solutions aren&#8217;t appropriate, for example:</p>
<ul>
<li>you&#8217;re not a Premium Edition user and can&#8217;t use Google Apps Sync or</li>
<li>you can&#8217;t use Google Apps Sync because you need full use of Exchange at the same time</li>
</ul>
<p>Here&#8217;s what you&#8217;ll need to do to add a Google Apps calendar to Outlook, which includes enabling this feature for your domain (needs to be done by an Administrator) and a tiny bit of URL hacking&#8230;<br />
<span id="more-121"></span></p>
<h3>1. Allow Private Calendar Access in Google Apps for Domains</h3>
<p>If you can&#8217;t see the Private Address of your calendar (next step, below), then it hasn&#8217;t been enabled for your domain. Your administrator will need to follow these steps:</p>
<ol>
<li>Go to the &#8216;Google Apps control panel&#8217; for your domain, which you can get to by clicking on &#8216;Manage this domain&#8217; at the top of your email inbox.</li>
<li>Go to Calendar settings (under Service settings)</li>
<li>Under &#8216;Sharing Options&#8217; / &#8216;Outside [Your Domain name] – set user ability&#8217;, choose: &#8220;Share all information, and outsiders can change calendars.&#8221;<br />
As documented at <a href="http://www.google.com/support/a/bin/answer.py?hl=en&amp;answer=60765">Google Apps Admin help</a>, <em>this will allow users to share their calendar information with people outside your domain. This includes guest list, location, and description</em>.</li>
</ol>
<h3>2. Get the private iCalendar URL for the calendar you want to add to Outlook</h3>
<ol>
<li>Click on the down-arrow next to the calendar that you want to Outlook, and choose &#8216;Calendar settings&#8217;:<br />
<img src="http://robertlathanh.com/wp-content/uploads/2010/08/Google-Apps-Calendar-settings.png" alt="Getting to a Calendar&#039;s settings" title="Google Apps - Getting to a Calendar&#039;s settings" width="337" height="263" class="alignnone size-full wp-image-126" /></li>
<li>At the bottom of the page will be a &#8216;Private Address&#8217; section. Click on &#8216;ICAL&#8217;:<br />
<img src="http://robertlathanh.com/wp-content/uploads/2010/08/Google-Apps-Calendar-settings-Private-Address.png" alt="Calendar&#039;s Private Address" title="Google Apps - Calendar settings - Private Address" width="600" height="92" class="alignnone size-full wp-image-125" /></li>
<li>A dialog will appear with the private iCalendar URL that looks like this:<br />
<code>https://www.google.com/calendar/ical/you%40example.com/private-9a7b3ff028c79ea79aa8927bcb9dd810/basic.ics</code></li>
<li>Copy that URL to your clipboard by right-clicking on it and choosing &#8216;Copy Shortcut&#8217;, &#8216;Copy Link Location&#8217;, or &#8216;Copy Link Address&#8217;</li>
</ol>
<h3>3. Add to Outlook</h3>
<p>If you tried to add the calendar to Outlook the regular way (add new Internet Calendar within Outlook), you might have gotten a message like this:</p>
<blockquote><p>Cannot verify or add the Internet Calendar in Outlook. Verify the link is a valid calendar link:</p></blockquote>
<p>We need to do a tiny bit of URL hacking and Internet Explorer&#8217;s help to add this to Outlook.</p>
<ol>
<li>Paste the URL into Internet Explorer. Before pressing Enter or clicking Go, change &#8216;https&#8217; to &#8216;webcals&#8217; at the beginning of the URL:<br />
<img src="http://robertlathanh.com/wp-content/uploads/2010/08/Internet-Explorer-ICal-webcals-in-address-bar.png" alt="iCal address in IE address bar" title="Internet Explorer - ICal webcals in address bar" width="605" height="100" class="alignnone size-full wp-image-127" /></li>
<li>Press enter or click Go.</li>
<li>You should get one or two security confirmation dialogs; click &#8216;Allow&#8217; in both of them<br />
<img src="http://robertlathanh.com/wp-content/uploads/2010/08/Internet-Explorer-Security-allow.png" alt="" title="Internet Explorer - Security - allow" width="411" height="284" class="alignnone size-full wp-image-128" /><br />
<img src="http://robertlathanh.com/wp-content/uploads/2010/08/Internet-Explorer-Security-2-allow.png" alt="" title="Internet Explorer - Security 2 - allow" width="467" height="284" class="alignnone size-full wp-image-129" /></li>
<li>Outlook will also ask you to confirm that you want to add the calendar. Click &#8216;Yes&#8217;:<br />
<img src="http://robertlathanh.com/wp-content/uploads/2010/08/Outlook-Add-Internet-Calendar-Confirm.png" alt="Outlook - Add Internet Calendar - Confirm" title="Outlook - Add Internet Calendar - Confirm" width="374" height="166" class="alignnone size-full wp-image-133" /></li>
</ol>
<h3>Done!</h3>
<p>Now, when you go to your calendar view, you can choose to view your Google Apps calendar at the same time as your Outlook/Exchange calendar by checking the box next to each:<br />
<img src="http://robertlathanh.com/wp-content/uploads/2010/08/Outlook-All-calendars-Side-by-side.png" alt="Outlook - All calendars - Side-by-side" title="Outlook - All calendars - Side-by-side" width="700" height="609" class="alignnone size-full wp-image-134" /></p>
<p>If you want all of your calendar items to show up on one calendar in the Calendar view instead of having several calendars side-by-side (like in the first screenshot at the top of this article), you can use &#8216;Overlay Mode&#8217;. Click on the tab of the calendar that you want to join with the others then choose &#8216;View in Overlay Mode&#8217; in the &#8216;View&#8217; menu:<br />
<img src="http://robertlathanh.com/wp-content/uploads/2010/08/Oulook-menu-View-View-in-Overlay-Mode.png" alt="Oulook - menu - View - View in Overlay Mode" title="Oulook - menu - View - View in Overlay Mode" width="191" height="334" class="alignnone size-full wp-image-135" /></p>
]]></content:encoded>
			<wfw:commentRss>http://robertlathanh.com/2010/08/view-your-google-apps-calendar-in-outlook-2007-2010/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>s3nukem &#8211; Delete large Amazon S3 buckets</title>
		<link>http://robertlathanh.com/2010/07/s3nukem-delete-large-amazon-s3-buckets/</link>
		<comments>http://robertlathanh.com/2010/07/s3nukem-delete-large-amazon-s3-buckets/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 23:13:40 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[Web Technology]]></category>

		<guid isPermaLink="false">http://robertlathanh.com/?p=111</guid>
		<description><![CDATA[s3nukem is a slightly improved version of s3nuke, a Ruby script by Steve Eley that relatively quickly deletes an Amazon Web Services (AWS) Simple Storage Service (S3) bucket with many objects (millions) by using multiple threads to retrieve and delete &#8230; <a href="http://robertlathanh.com/2010/07/s3nukem-delete-large-amazon-s3-buckets/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://github.com/lathanh/s3nukem">s3nukem</a> is a slightly improved version of <a href="http://github.com/SFEley/s3nuke">s3nuke</a>, a Ruby script by <a href="http://extraneous.org/past/2009/9/10/s3nuke_delete_those_large_buckets/">Steve Eley</a> that relatively quickly deletes an Amazon Web Services (AWS) Simple Storage Service (S3) bucket with many objects (millions) by using multiple threads to retrieve and delete the individual objects.</p>
<p>Improvements include:</p>
<ul>
<li>The key retrieval thread will pause when the queue contains <code>1000 * thread_count</code> items. The original script&#8217;s queue would grow unabated, eating up memory unnecessarily.</li>
<li>All output is automatically flushed, which ensures you can keep an eye on progress in real-time.</li>
<li>Added the number of seconds elapsed since the start of the script to the output so you can calculate the rate at which items are being deleted.</li>
</ul>
<p><span id="more-111"></span></p>
<h3>Background</h3>
<p>I, <a href="http://extraneous.org/past/2009/9/10/s3nuke_delete_those_large_buckets/">like</a> <a href="http://echeng.com/journal/2008/07/14/how-to-delete-an-s3-bucket-with-lots-of-files-in-it/">many</a> <a href="http://www.google.com/search?q=s3+delete+bucket">others</a>, have needed to delete an S3 bucket with many items, but, as you may know, you first have to delete all the objects in the bucket &#8212; not a quick task if the bucket has hundreds of thousands or millions of objects.</p>
<p>The bucket I needed to delete had 99 <em>million</em> objects. Attempts to delete the bucket through <code>S3fox</code> and even through the AWS Management Console would fail!</p>
<p><code>s3cmd</code>, which deletes with a single thread, was deleting objects at a rate of about 1,800/minute (2.5 million / day). At that rate, the deletion would have taken about 40 days.</p>
<p><code>s3nuke</code>/<code>s3nukem</code>, which I ran with the default 10 threads, deleted objects at a rate of about 9,000/minute (13 million / day), reducing the job to about 7-1/2 days.</p>
<p>Since my deletion was a bit larger than Steve&#8217;s (his was about 260,000), I had to make a couple improvements to <code>s3nuke</code> (listed above) so that it wouldn&#8217;t slow down and crash and so that I could keep an eye on its progress. You can find my fork at <a href="http://github.com/lathanh/s3nukem">http://github.com/lathanh/s3nukem</a></p>
<p>Quick download: <a href="http://github.com/lathanh/s3nukem/raw/master/s3nukem">http://github.com/lathanh/s3nukem/raw/master/s3nukem</a></p>
]]></content:encoded>
			<wfw:commentRss>http://robertlathanh.com/2010/07/s3nukem-delete-large-amazon-s3-buckets/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>WREST (Website REST)</title>
		<link>http://robertlathanh.com/2009/10/wrest-website-rest/</link>
		<comments>http://robertlathanh.com/2009/10/wrest-website-rest/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 05:10:27 +0000</pubDate>
		<dc:creator>Robert</dc:creator>
				<category><![CDATA[Web Technology]]></category>
		<category><![CDATA[portmanteau]]></category>

		<guid isPermaLink="false">http://robertlathanh.com/?p=86</guid>
		<description><![CDATA[WREST [rest] = Website + REST -noun A RESTful API service that is made available to its own website. The distinguishing behavior from a regular RESTful API is that calls coming from the client are identified the same way as &#8230; <a href="http://robertlathanh.com/2009/10/wrest-website-rest/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong><em>WREST</em></strong> [rest] = Website + REST</p>
<p>-noun</p>
<ol>
<li>A RESTful API service that is made available to its own website. The distinguishing behavior from a regular RESTful API is that calls coming from the client are identified the same way as other calls made by the client&#8217;s browser (viz., the client&#8217;s cookie(s)) rather than by API keys and secrets/signatures.</li>
</ol>
<p>I&#8217;m currently working on a service that has both a website (usable by the general public), and a <a href="http://en.wikipedia.org/wiki/REST">REST</a>ful API (currently used by our iPhone app, and later usable by partners). A Flash component of the website also uses the RESTful API when it needs needs data from the server. And while partners will need to obtain an API key, get user approval to make calls on their behalf, and sign calls, it would not be appropriate to expect the same of the Flash component.</p>
<p>So, I made some of the RESTful API calls available in a way such that the client can be identified by cookies instead of an API authorization token.</p>
<p>This results in the service having four classes of HTTP calls:<span id="more-86"></span></p>
<ol>
<li><strong>Regular website calls</strong> &#8211; calls made by a client&#8217;s web browser, where the response is HTML or a resource such as a JPG, CSS, or JS file. Clients are identified by their cookie(s)</li>
<li><strong>REST</strong> &#8211; calls to RESTful API methods made by non-web-based client or via a 3rd-party. Every call must include the caller&#8217;s Application API key and be signed with their API secret. The user the call is being made on behalf of (if applicable) is identified by an authorization token included as a request parameter. For us, the response is XML (and for others it may be another data interchange format such as JSON).</li>
<li><strong>AJAX</strong> &#8211; calls made by a client&#8217;s web browser (typically asynchronously) where the response is XML but the call is not an API call (viz., not RESTful). They are specifically designed to serve website needs, and likely characteristics are that they:
<ul>
<li>include HTML fragments to be included in the page dynamically, or</li>
<li>include other data or parameters specifically to dynamically alter a portion of the current web page.</li>
</ul>
</li>
<li><strong>WREST</strong> &#8211; RESTful API calls made by the website. For us, this is primarily used by the Flash component(s). The client is identified using cookies and the session like the website, but respond purely with structured data (in XML) like the &#8216;REST API&#8217;. The controllers that serve these calls are generally the same controllers used by the REST API servlet. A good rule of thumb is that: if the call would not make a good (REST) API call, it is probably an AJAX call and not a WREST call. Thus, WREST is generally a subset of REST.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://robertlathanh.com/2009/10/wrest-website-rest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

