<?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>Igor Ostrovsky Blogging &#187; Uncategorized</title>
	<atom:link href="http://igoro.com/archive/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://igoro.com</link>
	<description>On programming, technology, and random things of interest</description>
	<lastBuildDate>Fri, 23 Jul 2010 05:24:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Use C# dynamic typing to conveniently access internals of an object</title>
		<link>http://igoro.com/archive/use-c-dynamic-typing-to-conveniently-access-internals-of-an-object/</link>
		<comments>http://igoro.com/archive/use-c-dynamic-typing-to-conveniently-access-internals-of-an-object/#comments</comments>
		<pubDate>Fri, 02 Apr 2010 08:47:28 +0000</pubDate>
		<dc:creator>Igor Ostrovsky</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://igoro.com/?p=556</guid>
		<description><![CDATA[Sometimes you need to access private fields and call private methods on an object – for testing, experimentation, or to work around issues in third-party libraries. .NET has long provided a solution to this problem: reflection. Reflection allows you to call private methods and read or write private fields from outside of the class, but [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes you need to access private fields and call private methods on an object – for testing, experimentation, or to work around issues in third-party libraries.</p>
<p>.NET has long provided a solution to this problem: reflection. Reflection allows you to call private methods and read or write private fields from outside of the class, but is verbose and messy to write. In C# 4, this problem can be solved in a neat way using dynamic typing.</p>
<p>As a simple example, I’ll show you how to access internals of the List&lt;T&gt; class from the BCL standard library. Let’s create an instance of the List&lt;int&gt; type:</p>
<pre class="code"><span style="color: #2b91af">List</span>&lt;<span style="color: blue">int</span>&gt; realList = <span style="color: blue">new </span><span style="color: #2b91af">List</span>&lt;<span style="color: blue">int</span>&gt;();</pre>
<p>To access the internals of List&lt;int&gt;, we’ll wrap it with ExposedObject – a type I’ll show you how to implement:</p>
<pre class="code"><span style="color: blue">dynamic </span>exposedList = <span style="color: #2b91af">ExposedObject</span>.From(realList);</pre>
<p>And now, via the exposedList object, we can access the private fields and methods of the List&lt;&gt; class:</p>
<pre class="code"><span style="color: green">// Read a private field - prints 0
</span><span style="color: #2b91af">Console</span>.WriteLine(exposedList._size);

<span style="color: green">// Modify a private field
</span>exposedList._items = <span style="color: blue">new int</span>[] { 5, 4, 3, 2, 1 };

<span style="color: green">// Modify another private field
</span>exposedList._size = 5;

<span style="color: green">// Call a private method
</span>exposedList.EnsureCapacity(20);</pre>
<p>Of course, _size, _items and EnsureCapacity() are all private members of the List&lt;T&gt; class! In addition to the private members, you can still access the public members of the exposed list:</p>
<pre class="code"><span style="color: green">// Add a value to the list
</span>exposedList.Add(0);

<span style="color: green">// Enumerate the list. Prints &quot;5 4 3 2 1 0&quot;
</span><span style="color: blue">foreach </span>(<span style="color: blue">var </span>x <span style="color: blue">in </span>exposedList) <span style="color: #2b91af">Console</span>.WriteLine(x);</pre>
<p>Pretty cool, isn’t it?</p>
<h3>How does ExposedObject work?</h3>
<p>The example I showed uses ExposedObject to access private fields and methods of the List&lt;T&gt; class. ExposedObject is a type I implemented using the dynamic typing feature in C# 4.</p>
<p>To create a dynamically-typed object in C#, you need to implement a class derived from DynamicObject. The derived class will implement a couple of methods whose role is to decide what to do whenever a method gets called or a property gets accessed on your dynamic object.</p>
<p>Here is a dynamic type that will print the name of any method you call on it:</p>
<pre class="code"><span style="color: blue">class </span><span style="color: #2b91af">PrintingObject </span>: <span style="color: #2b91af">DynamicObject </span>
{
    <span style="color: blue">public override bool </span>TryInvokeMember(
            <span style="color: #2b91af">InvokeMemberBinder </span>binder, <span style="color: blue">object</span>[] args, <span style="color: blue">out object </span>result)
    {
        <span style="color: #2b91af">Console</span>.WriteLine(binder.Name); <span style="color: green">// Print the name of the called method
        </span>result = <span style="color: blue">null</span>;
        <span style="color: blue">return true</span>;
    }
}</pre>
<p>Let’s test it out. This program prints “HelloWorld” to the console:</p>
<pre class="code"><span style="color: blue">class </span><span style="color: #2b91af">Program </span>
{
    <span style="color: blue">static void </span>Main(<span style="color: blue">string</span>[] args)
    {
        <span style="color: blue">dynamic </span>printing = <span style="color: blue">new </span><span style="color: #2b91af">PrintingObject</span>();
        printing.HelloWorld();<span style="color: green">
        </span><span style="color: blue">return</span>;
    }
}</pre>
<p>There is only a small step from PrintingObject to ExposedObject – instead of printing the name of the method, ExposedObject will find the appropriate method and invoke it via reflection. A simple version of the code looks like this:</p>
<pre class="code"><span style="color: blue">class </span><span style="color: #2b91af">ExposedObjectSimple </span>: <span style="color: #2b91af">DynamicObject </span>
{
    <span style="color: blue">private object </span>m_object;

    <span style="color: blue">public </span>ExposedObjectSimple(<span style="color: blue">object </span>obj)
    {
        m_object = obj;
    }

    <span style="color: blue">public override bool </span>TryInvokeMember(
            <span style="color: #2b91af">InvokeMemberBinder </span>binder, <span style="color: blue">object</span>[] args, <span style="color: blue">out object </span>result)
    {
        <span style="color: green">// Find the called method using reflection
        </span><span style="color: blue">var </span>methodInfo = m_object.GetType().GetMethod(
            binder.Name,
            <span style="color: #2b91af">BindingFlags</span>.NonPublic | <span style="color: #2b91af">BindingFlags</span>.Public | <span style="color: #2b91af">BindingFlags</span>.Instance);

        <span style="color: green">// Call the method
        </span>result = methodInfo.Invoke(m_object, args);
        <span style="color: blue">return true</span>;
    }
}</pre>
<p>This is all you need in order to implement a simple version of ExposedObject.</p>
<h3>What else can you do with ExposedObject?</h3>
<p>The ExposedObjectSimple implementation above illustrates the concept, but it is a bit naive – it does not handle field accesses, multiple methods with the same name but different argument lists, generic methods, static methods, and so on. I implemented a more complete version of the idea and published it as a CodePlex project: <a title="http://exposedobject.codeplex.com/" href="http://exposedobject.codeplex.com/">http://exposedobject.codeplex.com/</a></p>
<p>You can call static methods by creating an ExposedClass over the class. For example, let’s call the private File.InternalExists() static method:</p>
<pre class="code"><span style="color: blue">dynamic </span>fileType = <span style="color: #2b91af">ExposedClass</span>.From(<span style="color: blue">typeof</span>(System.IO.<span style="color: #2b91af">File</span>));
<span style="color: blue">bool </span>exists = fileType.InternalExists(<span style="color: #a31515">&quot;somefile.txt&quot;</span>);</pre>
<p>You can call generic methods (static or non-static) too:</p>
<pre class="code"><span style="color: blue">dynamic </span>enumerableType = <span style="color: #2b91af">ExposedClass</span>.From(<span style="color: blue">typeof</span>(System.Linq.<span style="color: #2b91af">Enumerable</span>));
<span style="color: #2b91af">Console</span>.WriteLine(
    enumerableType.Max&lt;<span style="color: blue">int</span>&gt;(<span style="color: blue">new</span>[] { 1, 3, 5, 3, 1 }));</pre>
<p>Type inference for generics works too. You don’t have to specify the int generic argument in the Max method call:</p>
<pre class="code"><span style="color: blue">dynamic </span>enumerableType = <span style="color: #2b91af">ExposedClass</span>.From(<span style="color: blue">typeof</span>(System.Linq.<span style="color: #2b91af">Enumerable</span>));
<span style="color: #2b91af">Console</span>.WriteLine(
    enumerableType.Max(<span style="color: blue">new</span>[] { 1, 3, 5, 3, 1 }));</pre>
<p>And to clarify, all of these different cases have to be explicitly handled. Deciding which method should be called is normally done by the <strong>compiler</strong>. The logic on overload resolution is hidden away in the compiler, and so unavailable at runtime. To duplicate the method binding rules, we have to duplicate the logic of the compiler.</p>
<p>You can also cast a dynamic object either to its own type, or to a base class:</p>
<pre class="code"><span style="color: #2b91af">List</span>&lt;<span style="color: blue">int</span>&gt; realList = <span style="color: blue">new </span><span style="color: #2b91af">List</span>&lt;<span style="color: blue">int</span>&gt;();
<span style="color: blue">dynamic </span>exposedList = <span style="color: #2b91af">ExposedObject</span>.From(realList);

<span style="color: #2b91af">List</span>&lt;<span style="color: blue">int</span>&gt; realList2 = exposedList;
<span style="color: #2b91af">Console</span>.WriteLine(realList == realList2); <span style="color: green">// Prints &quot;true&quot;
</span></pre>
<p>So, after casting the exposed object (or assigning it into an appropriately typed variable), you can get back the original object!</p>
<h3>Updates</h3>
<p>Based on some of the responses the article is getting, I should clarify: I am definitely not suggesting that you use ExposedObject regularly in your production code! That would be a terrible idea.</p>
<p>As I said in the article, ExposedObject can be useful for testing, experimentation, and rare hacks. Also, it is an interesting example of how dynamic typing works in C#.</p>
<p>Also, apparently <a href="http://bugsquash.blogspot.com/">Mauricio Scheffer</a> came up with <a href="http://bugsquash.blogspot.com/2009/05/testing-private-methods-with-c-40.html">the same idea</a> almost a year before me.</p>
<div style="border-bottom: black 1px solid; border-left: black 1px solid; padding-bottom: 10px; background-color: #f0f0ff; margin-top: 20px; padding-left: 10px; padding-right: 10px; margin-bottom: 20px; margin-left: 10px; border-top: black 1px solid; border-right: black 1px solid; padding-top: 10px">
<p>Read more of my articles:</p>
<p><a href="http://igoro.com/archive/gallery-of-processor-cache-effects/">Gallery of processor cache effects</a></p>
<p><a href="http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/">What really happens when you navigate to a URL</a></p>
<p><a href="http://igoro.com/archive/human-heart-is-a-turing-machine-research-on-xbox-360-shows-wait-what/">Human heart is a Turing machine, research on XBox 360 shows. Wait, what?</a></p>
<p><a href="http://igoro.com/archive/skip-lists-are-fascinating/">Skip lists are fascinating!</a></p>
<p>And if you like my blog, <a href="http://igoro.com/feed/">subscribe</a>!</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://igoro.com/archive/use-c-dynamic-typing-to-conveniently-access-internals-of-an-object/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>RoboZZle hacked, and 100+ sites are still compromised</title>
		<link>http://igoro.com/archive/robozzle-hacked-and-100-sites-are-still-compromised/</link>
		<comments>http://igoro.com/archive/robozzle-hacked-and-100-sites-are-still-compromised/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 09:59:31 +0000</pubDate>
		<dc:creator>Igor Ostrovsky</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://igoro.com/?p=328</guid>
		<description><![CDATA[Around two weeks ago, I found this email in my inbox, with the subject “Complaint about Robozzle”: Hi Igor Robozzle is really cute, I like it, but why on earth is it polluted with hundreds of invisible links to porn sites? From a guy like you I don&#8217;t expect to do such dirty things. pls [...]]]></description>
			<content:encoded><![CDATA[<p><!-- blockquote { border: 1px solid #d0d0d0 } --></p>
<p><img style="border-right-width: 0px; margin: 0px 0px 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="j0434750" src="http://igoro.com/wordpress/wp-content/uploads/2009/10/j0434750.png" border="0" alt="j0434750" width="36" height="36" align="right" /> Around two weeks ago, I found this email in my inbox, with the subject “Complaint about Robozzle”:</p>
<blockquote><p>Hi Igor</p>
<p>Robozzle is really cute, I like it, but why on earth is it polluted with hundreds of invisible links to porn sites? From a guy like you I don&#8217;t expect to do such dirty things. pls remove them.</p>
<p>David</p></blockquote>
<p><span id="more-328"></span></p>
<p>Hoping for a simple explanation, I looked at the source of the <a href="http://robozzle.com/">RoboZZle</a> front page. And my heart sunk as I saw <strong>hundreds</strong> of spam links on the bottom:</p>
<blockquote><p>&lt;a href=&#8221;&lt;a hijacked site&gt;.com/files/cms/7/pornhud.com-20076.html&#8221;&gt;porn hud.com&lt;/a&gt;<br />
&lt;a href=&#8221;&lt;a hijacked site&gt;.com/files/cms/7/www.tube.com8-5852.html&#8221;&gt;www.tube.com 8&lt;/a&gt;<br />
…</p></blockquote>
<p>The links were inside a &lt;p&gt; tag with visibility set to “hidden”, so the links were only visible to search engines, not to human visitors.</p>
<p>I wondered if this affected how my site shows up in search engines. So, I searched for RoboZZle on Google (results in Bing or Yahoo! were not affected), and here is what I got:</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="robozzle_bad" src="http://igoro.com/wordpress/wp-content/uploads/2009/10/robozzle_bad1.png" border="0" alt="robozzle_bad" width="563" height="103" /></p>
<p>Oh crap. This sucks. How did it happen?</p>
<h3>Site infestation</h3>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="j0438025" src="http://igoro.com/wordpress/wp-content/uploads/2009/10/j0438025.png" border="0" alt="j0438025" width="144" height="144" align="right" /></p>
<p>So what did the hackers do to my poor game? I looked around to find what has changed:</p>
<ol>
<li><strong>Planted links<br />
</strong>Multiple pages on my site have been modified to import a planted config.ini file. The config.ini file contained hundreds of fake links, and was updated every couple hours with a new set of links. The links all pointed to spammy content planted on another hijacked site.<br />
 </li>
<li><strong>Planted content</strong><br />
My site also contained thousands of small planted HTML files, similar to the spammy stuff that the planted links pointed to. An odd folder (something like http://robozzle.com/old/old2/) contained the HTML files, all with links to suspicious content, and all infested with spammy keywords.<br />
 </li>
<li><strong>Backdoor PHP scripts</strong><br />
And finally, my site also contained a couple of PHP backdoor scripts. If you visited a particular URL on the robozzle.com domain, you’d get a file manager that lets you upload, delete, and manage files on my site, no passwords needed. As I found out later, the hackers actually knew my FTP password so they didn’t need the backdoors, but they left the backdoors so that they can get in once I change my password.</li>
</ol>
<p>I carefully checked my site and removed all of this stuff. Even after I removed the PHP backdoors, the config.ini file continued to get updated until I changed my FTP password. From that point, I was pretty sure that the attackers somehow got my FTP password.</p>
<h3>Looking for other hijacked sites</h3>
<p>After cleaning up my site, one of the first things I did was notify the other compromised site, which hosted the planted content linked from my site.</p>
<p>I also wondered if more sites have been hacked in a similar way. I tried various online tools to find other sites that contain the same links that have been planted on my site.</p>
<p>I found a handful of hacked sites right away. The fact that the links change every few hours made the task more difficult, though. The newest links generally point to content that has not yet been crawled by search engines. But, there is a simple solution. By looking at older versions of several compromised sites in a service like Google Cache, I eventually found older links that lead me to many more hijacked sites.</p>
<p>After repeating the process for a couple hours, I ended up with a list of over a <strong>150 infected sites</strong>, including some fairly major sites. The larger sites generally removed the infestation quickly, though. Here are a few sites that haven’t cleaned up, despite the fact that I alerted them at least two weeks ago:</p>
<ul>
<li>bayonnenj.org – City of Bayonne, NJ</li>
<li>steinercollege.edu &#8211; Rudolf Steiner College</li>
<li>dillard.senategop.org &#8211; GOP Senator Kirk Dillard</li>
<li>egnc-ibm.gov.eg &#8211; Egypt-IBM Nanotechnology Research Center</li>
</ul>
<p style="color: #800000"><strong>Don’t go to these sites unless you know what you are doing. At the time of writing this post, these sites appear to be compromised, so they may well contain viruses or malware.</strong></p>
<p><strong>UPDATE:</strong> Most of the sites are suddenly not showing the links. My guess is that the hacker group distributed an empty config.ini file after this story became popular on reddit. I don&#8217;t believe that so many obscure sites on my list would be fixed over night when they have been infected for months before. Some sites still contain the planted links, but those seem to be the ones that haven&#8217;t been updating the links regularly. These are probably the sites that the hackers only have partial control over at this point (e.g., FTP password changed, but there is still a backdoor on the site somewhere). You should be able to view the planted links on all infected sites by looking at Google Cache.</p>
<p>I did my best to contact owners of as many hijacked sites as I could. Looking for contact information on that many sites – most of them not in English &#8211; is a time-consuming endeavor, though.</p>
<h3>Tools I used</h3>
<p>I found these tools useful when tracking down other sites that have been hijacked:</p>
<table border="0" cellspacing="0" cellpadding="2" width="667">
<tbody>
<tr>
<td width="161" valign="top"><a href="http://siteexplorer.search.yahoo.com/">Yahoo! Site Explorer</a></td>
<td width="504" valign="top">This is the best tool I found to search for sites that link to a particular URL. At least for my purposes, it worked much better than “link:” queries in Google.<br />
 </td>
</tr>
<tr>
<td width="161" valign="top"><a href="http://proxify.org/">Proxify</a></td>
<td width="504" valign="top">When visiting sites controlled by hackers, it is worthwhile to be cautious, since the site may be infested by malware. Proxify sends the request on your behalf, and in the Source mode, sends you the HTTP response as text. So, the infested site won’t see your IP address, and any HTML it sends back will not be rendered, just shown in text format.<br />
 </td>
</tr>
<tr>
<td width="161" valign="top">Web caches</td>
<td width="504" valign="top">As you probably know, all major search engines (Google, Bing, Yahoo!) let you view the version of the page cached by the service. This gives you a version of the page as it was a few days or weeks ago.<br />
 </td>
</tr>
</tbody>
</table>
<p> </p>
<h3>And how did I get hacked in the first place?</h3>
<p>Of course, I have been wondering about how the hackers got my FTP password in the first place. It wasn’t really guessable or discoverable by brute force, and I didn’t use the same password on other sites.</p>
<p>And then I got an email from my webhost, notifying me that FTP passwords <strong>may have</strong> been stolen due to a vulnerability. They tracked down the issue to a particular software package they use.</p>
<p>So, I assume that my password got stolen this way. If not, it is also possible that I logged into my site on a computer with a particular virus. <a href="http://blog.tigertech.net/posts/ftp-password-viruses/">Apparently</a>, that’s how many FTP passwords get stolen.</p>
<blockquote><p>If you liked this article, check out these ones:</p>
<p><a href="http://igoro.com/archive/human-heart-is-a-turing-machine-research-on-xbox-360-shows-wait-what/">Human heart is a Turing machine, research on XBox 360 shows. Wait, what?</a></p>
<p><a href="http://igoro.com/archive/numbers-that-cannot-be-computed/">Numbers that cannot be computed</a></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://igoro.com/archive/robozzle-hacked-and-100-sites-are-still-compromised/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>It&#8217;s official: I exist</title>
		<link>http://igoro.com/archive/its-official-i-exist/</link>
		<comments>http://igoro.com/archive/its-official-i-exist/#comments</comments>
		<pubDate>Fri, 20 Jul 2007 17:09:47 +0000</pubDate>
		<dc:creator>Igor Ostrovsky</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Misc]]></category>

		<guid isPermaLink="false">http://igoro.com/?p=18</guid>
		<description><![CDATA[Says who? Google search engine, none other. Yesterday, I searched for my name, and my blog appeared as the fourth link. That surprised me, because I did not intend to make the blog public before I have some content here. As far as I know, nobody links here so far, so I didn&#8217;t expect Google to find me. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://igoro.com/wordpress/wp-content/uploads/2007/07/google.png" title="google.png"><img align="left" src="http://igoro.com/wordpress/wp-content/uploads/2007/07/google.thumbnail.png" alt="google.png" style="margin: 5px; border: blue 2px solid" title="google.png" /></a>Says who? Google search engine, none other. Yesterday, I searched for my <a href="http://www.google.com/search?hl=en&amp;q=igor+ostrovsky">name</a>, and my blog appeared as the fourth link. That surprised me, because I did not intend to make the blog public before I have some content here. As far as I know, nobody links here so far, so I didn&#8217;t expect Google to find me. Maybe they automatically index newly registered domains?</p>
<p><span id="more-18"></span></p>
<p>Anyways, now that Google says I exist, and on top of that <a href="http://www.igoro.com/">www.igoro.com</a> is my blog,  I better get to blogging. I don&#8217;t want to disappoint the Google spiders.</p>
<p>So far, Igor Ostrovsky, software developer from Staten Island gets the first and third Google result. The second belongs to Igor Ostrovsky from Brookline, MA. The next three results are mine, closely followed by Igor Ostrovsky, a swimming coach and creator of underwater wrestling (!). My ambition is to be <strong>the</strong> Igor Ostrovsky in the world one day. Igor Ostrovsky from Staten Island, watch out!</p>
<p>Here is the current ranklist:</p>
<table style="border: black 1px solid">
<tr>
<th style="color: white; background-color: black">Rank</th>
<th style="color: white; background-color: black">Igor Ostrovsky</th>
</tr>
<tr>
<td>1.</td>
<td>Igor Ostrovsky from Staten Island, NY</td>
</tr>
<tr>
<td>2.</td>
<td>Igor Ostrovsky from Brookline, MA</td>
</tr>
<tr>
<td>3.</td>
<td><strong>Igor Ostrovsky from Seattle, WA aka me</strong></td>
</tr>
<tr>
<td>4.</td>
<td>Igor Ostrovsky, underwater wrestling inventor</td>
</tr>
</table>
<p><a href="http://igoro.com/wordpress/wp-content/uploads/2007/07/google.png" title="google.png"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://igoro.com/archive/its-official-i-exist/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>French internet kiosk made my life difficult</title>
		<link>http://igoro.com/archive/17/</link>
		<comments>http://igoro.com/archive/17/#comments</comments>
		<pubDate>Tue, 26 Jun 2007 15:12:57 +0000</pubDate>
		<dc:creator>Igor Ostrovsky</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Misc]]></category>

		<guid isPermaLink="false">http://igoro.com/wordpress/?p=17</guid>
		<description><![CDATA[On the Paris Charles de Gaulle airport, I encountered this internet kiosk: Nothing unusual? That&#8217;s what I thought, too. Until I took a closer look at the keyboard: The first thing you&#8217;ll notice is the unusual keyboard layout, at least for us QWERTY people &#8211; presumably this is how they like their keyboards in France. [...]]]></description>
			<content:encoded><![CDATA[<p>On the Paris Charles de Gaulle airport, I encountered this internet kiosk:</p>
<p><span id="more-17"></span></p>
<p><img src="http://igoro.com/wordpress/wp-content/uploads/2007/06/kiosk2.JPG" id="image16" alt="kiosk2.JPG" /></p>
<p>Nothing unusual? That&#8217;s what I thought, too. Until I took a closer look at the keyboard:</p>
<p><img src="http://igoro.com/wordpress/wp-content/uploads/2007/06/kiosk1.JPG" id="image15" alt="kiosk1.JPG" /></p>
<p>The first thing you&#8217;ll notice is the unusual keyboard layout, at least for us QWERTY people &#8211; presumably this is how they like their keyboards in France. But a worse thing is that the keyboard does not have a whole bunch of &#8220;useless&#8221; keys, such as say underscore (_). As it turns out, my email password contains an underscore.</p>
<p>So how do I sign into my email? I tried to find the underscore character on the web (Google: underscore), and copy-and-paste it into the password box. To make it more interesting, the keyboard does not have a CTRL key, so no CTRL+C. Also, no other conventional way of using the clipboard seems to work. Eventually, after I nearly gave up, I discovered that the kiosk app has clipboard features on the toolbar above the browser window, and I finally managed to type in my password.</p>
<p>Time to type my password: 6 minutes.</p>
]]></content:encoded>
			<wfw:commentRss>http://igoro.com/archive/17/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Salesmen never lie</title>
		<link>http://igoro.com/archive/salesmen-never-lie/</link>
		<comments>http://igoro.com/archive/salesmen-never-lie/#comments</comments>
		<pubDate>Sat, 23 Jun 2007 01:43:48 +0000</pubDate>
		<dc:creator>Igor Ostrovsky</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Misc]]></category>

		<guid isPermaLink="false">http://igoro.com/wordpress/?p=4</guid>
		<description><![CDATA[It was an early morning when I received a call from one of the numerous firms that sell preparation materials for the various IT certification exams. The call woke me up, and perhaps because of my initial confusion, I did not hang up as quickly as I would normally do. Encouraged that he was still [...]]]></description>
			<content:encoded><![CDATA[<p>It was an early morning when I received a call from one of the numerous firms that sell preparation materials for the various IT certification exams. The call woke me up, and perhaps because of my initial confusion, I did not hang up as quickly as I would normally do. Encouraged that he was still on the line, the salesperson began telling me about the life-changing effects of certifications. In the heat of his passionate speech, he exclaimed:</p>
<p><span id="more-4"></span></p>
<blockquote><p>&#8220;You are not going to make six digits in this industry if you don&#8217;t get certs!&#8221;</p>
</blockquote>
<p>That is such a misleading generalization that it is funny. Nevertheless, I am sure there are people out there who will fall for the trick.</p>
]]></content:encoded>
			<wfw:commentRss>http://igoro.com/archive/salesmen-never-lie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
