<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Miguel Pais' blog</title>
    <link>http://www.miguelpais.com/site/rss</link>
    <description>Miguel Pais' blog</description>
    <language>en-us</language>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/miguelpais" type="application/rss+xml" /><item>
      <title>Twivie.com launched | your tweets rating movies</title>
      <pubDate>Sun, 15 Mar 2009 07:16:14 
-0500</pubDate>
      <description>&lt;div style="text-align: center"&gt;&lt;a href="http://twivie.com" target="_blank" title="twivie"&gt;&lt;img src="http://miguelpais.com/images/logo-small.jpg" alt="Twivie logo" title="Twivie logo" width="266" height="106" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;It&amp;#39;s for &lt;a href="../../" target="_blank" title="miguel pais"&gt;all&lt;/a&gt; &lt;a href="http://pedrodiogo.com" target="_blank" title="pedro diogo"&gt;of&lt;/a&gt; &lt;a href="http://twitter.com/brunofranco" target="_blank" title="bruno franco&amp;#39;s twitter page"&gt;us&lt;/a&gt; a great honour to anounce &lt;a href="http://twivie.com" target="_blank" title="Twivie"&gt;Twivie.com&lt;/a&gt;, one of the first attempts to create a community around &lt;a href="http://twitter.com" target="_blank" title="Twitter"&gt;Twitter&lt;/a&gt; on movies!&lt;/p&gt;&lt;p&gt;Well, what is Twivie? Think about this, people are used to tweet about pretty much everything, including movies, and there is a lot of information on movies circulating on Twitter, but no one catches it and presents it in a website where you can easily keep track of the movies being talked about that matter. &lt;a href="http://twivie.com" target="_blank" title="Twivie"&gt;Twivie&lt;/a&gt; attempts to solve this problem by catching all the tweets with a certain syntax, and presents some nice statistics on them.&lt;/p&gt;&lt;p&gt;&amp;nbsp;See, Twitter is, at the moment, the greatest web forum ever, but very few people are using it to pull out the information being shared there. Twivie is our attempt on movies and will be nice to follow the growth of this application.&lt;/p&gt;&lt;p&gt;I hope you enjoy it and take a moment to check the website.&lt;/p&gt;&lt;p&gt;Start twiving!&amp;nbsp; &lt;/p&gt;</description>
      <link>http://feedproxy.google.com/~r/miguelpais/~3/E0cWQvHizCU/38</link>
      <guid isPermaLink="false">http://www.miguelpais.com/site/view/38</guid>
    <feedburner:origLink>http://www.miguelpais.com/site/view/38</feedburner:origLink></item>
    <item>
      <title>Magalhães, the review</title>
      <pubDate>Thu, 19 Feb 2009 17:15:55 
-0600</pubDate>
      <description>&lt;p&gt;&lt;em&gt;(this post is only written in english due to the exportation of these Magalh&amp;atilde;es (Magalhaes/Magellan) laptops to non-portuguese speaking countries like Venezuela, who there might find this post useful)&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="text-align: center"&gt;&lt;a href="http://miguelpais.com/images/maga.jpg" target="_blank"&gt;&lt;img src="http://miguelpais.com/images/maga_s.jpg" alt="The Magalh&amp;atilde;es" title="The Magalh&amp;atilde;es" width="328" height="307" /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;So it has arrived, finally, the &lt;a href="http://www.eescolinha.net/" target="_blank" title="Magalh&amp;atilde;es Project Homepage"&gt;Magalh&amp;atilde;es&lt;/a&gt; netbook that the portuguese government has been using to increase the usage of computers by children. Adopting the idea of the portuguese company &lt;a href="http://www.jpsacouto.pt/" target="_blank" title="JP S&amp;aacute; Couto webpage"&gt;JP S&amp;aacute; Couto&lt;/a&gt;, and being supported by &lt;a href="http://intel.com" target="_blank" title="Intel homepage"&gt;Intel&lt;/a&gt;, as the computer is nothing else than a &lt;a href="http://www.classmatepc.com/" target="_blank" title="Intel&amp;#39;s Classmate PC"&gt;Classmate PC&lt;/a&gt;, the portuguese started a campaign that rivals the ones did by &lt;a href="http://laptop.org/en/" target="_blank" title="OLPC project homepage"&gt;OLPC&lt;/a&gt; and at the same time appears to succeed over them all by the quick partnerships done with African and South American countries, which might turn this project in the de facto cheap laptop for every child in a considerable number of countries. Nothing more than a victory to Intel...&lt;br /&gt;&lt;br /&gt;Anyway, here in Portugal, the laptop that was promised to be delivered to all the children still wasn&amp;#39;t to most of them. But let&amp;#39;s talk about the laptop itself, pros and cons.&lt;/p&gt;&lt;p&gt;&amp;nbsp;The system features two USB ports, audio-in, audio-out, ethernet port, wireless card and SD memory card slot.&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="text-align: center"&gt;&lt;a href="http://miguelpais.com/images/compare.JPG" target="_blank" title="Magalh&amp;atilde;es compared with 13&amp;quot; MacBook White"&gt;&lt;img src="http://miguelpais.com/images/compare_s.jpg" alt="MacBook White 13&amp;quot; and Magalh&amp;atilde;es" title="MacBook White 13&amp;quot; and Magalh&amp;atilde;es" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The first thing anyone will notice is the keyboard as it&amp;#39;s very tiny (as you can see in the image above compared with a 13&amp;quot; MacBook White). Any adult will find difficult not mistyping any word, but since this laptop is not for them that can&amp;#39;t really be counted as a con, although we may expect this to be the only computer of the teens of tomorrow, who will certainly feel the laptop too small for them over time. The same goes to the screen. But overall, externally the laptop seems very resistant in its strong plastic body and also very light and portable. Also, the system seems well synched in its components resulting in a very good experience both in Windows XP and in Caixa M&amp;aacute;gica Linux (a portuguese GNU/Linux distribution). &lt;/p&gt;&lt;p&gt;&amp;nbsp;What&amp;#39;s wrong then? The main problem that arises is in the disk formatting. When you hear a system with a hard drive of 30GB, you expect it to have at least 15GB of free disk space even if Windows XP is already installed. But in this case, since there is no CD/DVD drive and we&amp;#39;re talking about a dual boot system (with two operating systems) the practical result is that users end up with something like 4/6GB of free disk space in the system. Thumbs down. This arises, as said, from the dual boot installation, with Windows XP on a 15GB NTFS partition taking already from the start something like 12GB of it, a 5/6GB Linux partition, a 4GB NTFS for data (the only really free space), and two other partitions of 2GB each for recovery of both operating systems, since there is no cd drive (careful, these recovery partitions will not replace most of the software pre installed, like the Office suite in Windows). In the images below you can see a list of the partitions made on the Magalh&amp;atilde;es&amp;#39; hard drive, and below that, the amount of free space a Windows user will get right from the start. &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="text-align: center"&gt;&lt;a href="http://miguelpais.com/images/fdisk.png" target="_blank"&gt;&lt;img src="http://miguelpais.com/images/fdisk_s.png" alt="Fdisk -l runned on CaixaMagica Linux" title="Fdisk -l runned on CaixaMagica Linux" width="512" height="300" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center"&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: center"&gt;&lt;img src="http://miguelpais.com/images/space.JPG" alt="Space left on Windows partition" title="Space left on Windows partition" /&gt;&amp;nbsp; &lt;img src="http://miguelpais.com/images/space2.JPG" alt="Data partition" title="Data partition" width="295" height="318" /&gt;&lt;/div&gt;&lt;div style="text-align: center"&gt;&amp;nbsp;&lt;/div&gt;Although there are a lot of pressures both from Microsoft, that has a long partnership with the portuguese government (that seems to enjoy paying the licenses), and from Caixa M&amp;aacute;gica, that has managed to deploy its distribution on the Magalh&amp;atilde;es, I would say that if there is a shortage of disk space, the worst thing you can do is turn it even shorter, even more if, as in Portugal, there is simply no decent formation on Linux on the IT teachers, let alone the elementary school teachers. The fact is that, although Caixa M&amp;aacute;gica clearly made an effort do deploy a very decent Linux distribution, more consistent, intuitive and good looking than Windows and its antivirus popups, Linux will be ultimately left behind and rarely opened, and that will turn useless all this partitioning scheme that offers children 4GB of free space in a hard drive where it could simply deploy only Windows or Linux, and offer 16/18GB of free space. Anyway, there is a SD card slot which will certainly help. &lt;p&gt;&amp;nbsp; &lt;/p&gt;&lt;div style="text-align: center"&gt;&lt;a href="http://miguelpais.com/images/linux.png" target="_blank"&gt;&lt;img src="http://miguelpais.com/images/linux_s.png" alt="Caixa Magica Linux on Magalh&amp;atilde;es" title="Caixa Magica Linux on Magalh&amp;atilde;es" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Fear not, in September this year is expected to be realized the &lt;a href="http://www.youtube.com/watch?v=LtSCoVHFqS8" target="_blank" title="video about the Magalh&amp;atilde;es 2"&gt;Magalh&amp;atilde;es 2&lt;/a&gt;, which appears to include at least a 80GB hard drive, but be aware that JP S&amp;aacute; Couto stated that it is the country adopting the computers that will have to choose the version. In case it&amp;#39;s the first one, be ready for the unhappiness of the children.&lt;br /&gt;&lt;br /&gt;The Windows installation features a pre installed Office 2007, which I find abusive since version 2000/2003 would be enough for the kids and take less disk space. There is already Avast antivirus installed, and Parental Controls blocking by default any website not in the white list. An annoying bar will appear at the top too due to some e-learning program. At first run the user will have to configure the usual stuff as administrator passwords and user accounts, and in the end the usual Windows desktop will appear already featuring three columns of icons, which may not be the best start to a child (turning on &lt;a href="http://magicdesktop.easybits.com/en/" target="_blank" title="Magic Desktop homepage"&gt;MagicDesktop&lt;/a&gt; will not be either).&lt;br /&gt;&lt;br /&gt;On Caixa M&amp;aacute;gica the system presents a very nice and intuitive desktop widget that presents applications under groups like Working, Fun, Internet, which certainly will be far more intuitive to children. Internet Connection will be fairly simple to manage even if you&amp;#39;re behind some WPA protected wireless network, something still a lot of linux distros can&amp;#39;t handle without the user digging in man pages. Parental Controls will also be turned on by default but the program behind seemed to me less capable than the Windows one, since it only allows or blocks programs. That means, or all Internet, or no Internet. I don&amp;#39;t believe in parental controls either way...&lt;br /&gt;&lt;br /&gt;Although the disk space problems, it&amp;#39;s a surprisingly good and well thought system, at least for the price it&amp;#39;s being sold to the children. But if you&amp;#39;re not under the &amp;quot;e-escolhinhas&amp;quot; program, paying 280-330&amp;euro; may be a little too much compared to alternatives as the Asus Eee PC.&lt;/p&gt;</description>
      <link>http://feedproxy.google.com/~r/miguelpais/~3/qjUNLdntQI0/37</link>
      <guid isPermaLink="false">http://www.miguelpais.com/site/view/37</guid>
    <feedburner:origLink>http://www.miguelpais.com/site/view/37</feedburner:origLink></item>
    <item>
      <title>Google has a website launcher: taking it a bit further</title>
      <pubDate>Tue, 10 Feb 2009 12:05:07 
-0600</pubDate>
      <description>&lt;p&gt;Everyone at some point in the past must have dropped bookmarks. Remember the times prior to Google? Bookmarking was lots of useful. What if that awesome site you discovered the other day wasn&amp;#39;t bookmarked and got forgotten? Searching for it could easily be a fruitless mission. But there came Google, and most of the new users that were now arriving and still arrive to the web today may even not be aware of the existence of bookmarks, that tool of the browser that lets them remind useful or largely accessed links. Why should they? They have Google, the thing that reads their thoughts and never presents anything but what they want in the first result.&lt;br /&gt;&lt;br /&gt;Of course bookmarks are still useful and the proof of that is, for example, &lt;a href="http://del.icio.us" target="_blank" title="Del.icio.us webpage"&gt;Del.icio.us&lt;/a&gt;, but for a totally different purpose, the purpose of being a warehouse of links we think we may find useful in the future. We are talking about website launching here and even things like the Bookmarks toolbar in your browser are getting pretty useless by now with the recent improvements on Google, namely Google Search Wiki and Google Labs&amp;#39; experiment &lt;a href="http://www.google.com/experimental/" target="_blank" title="Page where you can find the Keyboard Shortcuts experiment"&gt;KeyboardShortcuts&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="text-align: center"&gt;&lt;img src="../../Picture%204.png" alt="Firefox&amp;#39;s Bookmarks Toolbar" title="Firefox&amp;#39;s Bookmarks Toolbar" width="200" height="85" /&gt;&lt;/div&gt;&amp;nbsp;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Let me first talk about Keyboard Shortcuts and what an awesome google labs feature it is. It&amp;#39;s a known fact in computers that keyboards are much more faster to work with than the mouse. This experiment brings exactly that. The ability to be able to mouselessly scroll through the search results with keys &amp;#39;J&amp;#39; and &amp;#39;K&amp;#39;. But the best part is in the fact that the first result is always highlighted by default and a simple Return over a search result will get to that website. You won&amp;#39;t loose that second of getting to the mouse (which will probably take itself most of total time wasted if you&amp;#39;re not using a touchpad on a laptop), moving it and clicking on the first result. Your search will get where it&amp;#39;s supposed to be in a split second.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;This would all mean little if Google had attributed a key to the &amp;quot;I&amp;#39;m feeling lucky button&amp;quot; besides the return to the usual search. That way, searches done for website launching would be direct, and faster.&lt;br /&gt;&lt;br /&gt;But you can still improve a little more with what is currently available, and another good thing is Google Search Wiki. With it you can add or remove results from a certain query, make your own websites the first on google (if not) and thus faster accessed. But why are we still typing all that text to get to a website, if Google Search Wiki lets us make any query a direct path to the result we defined? Why not start making our own aliases like searching on google for &amp;quot;tc&amp;quot;, and right after the appearance of the results, simply pressing Return with the keyboard shortcut experiment to get to TechCrunch instead of TC Electronic, Teachers College or ThomsonCenter who could mean nothing to you. All with a faster than anything &amp;quot;tc&amp;quot; + Return + Return on google.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="text-align: center"&gt;&lt;img src="../../Picture%201.png" alt="Adding TechCrunch has a valid result for &amp;#39;tc&amp;#39;" title="Adding TechCrunch has a valid result for &amp;#39;tc&amp;#39;" width="652" height="230" /&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;This is what I&amp;#39;ve been recently thinking, and decided to do, but this usage of Google has a website launcher, and our tweaking of its own tools to give us faster access to the websites we want is problematic. Google has not yet confirmed if the search Wiki choices of the users will ever have any influence in the global results, but if they ever do, search could be compromised with our urge to faster and faster access to what matters to us but to anyone else.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="text-align: center"&gt;&lt;img src="../../Picture%202.png" alt="TechCrunch has the first result for tc" title="TechCrunch has the first result for tc" /&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Anyway, I think still very few people are aware of the productivity boost they can have by using these tools, so I thought I better pass the word.&lt;/p&gt;</description>
      <link>http://feedproxy.google.com/~r/miguelpais/~3/IjHKDq2luX0/36</link>
      <guid isPermaLink="false">http://www.miguelpais.com/site/view/36</guid>
    <feedburner:origLink>http://www.miguelpais.com/site/view/36</feedburner:origLink></item>
    <item>
      <title>A Twitter RSS Notifier</title>
      <pubDate>Fri, 30 Jan 2009 12:37:13 
-0600</pubDate>
      <description>&lt;p&gt;If you&amp;#39;re a heavy user of twitter you probably already experienced this: you cannot miss a bit of what is happening on twitter so you always have your Twitter client fired up getting you the updates with a high frequency check (my Twitterific is on a 3min check), and although you have all of your RSS subscriptions safely managed by GoogleReader or your client of choice, you end up knowing the news first on Twitter, by your followers conversations than by deliberately accessing GoogleReader, which itself has an unknown frequency check. Also, if on GoogleReader you have content that&amp;#39;s highly important to you (data thats updated by RSS, not your regular blog post) constant accesses to GoogleReader may distract you from the job your doing locally, just to end up knowing nothing knew is there.&lt;br /&gt;&lt;br /&gt;Of course you could just forget to check GoogleReader and be notified by a simple RSS Notifier, but why would you install another program if your twitter client already does that?&lt;br /&gt;&lt;br /&gt;So I decided to create a Twitter account that gets fed by a simple Ruby script that checks my most important feeds in 3 minutes time loops and if there is any new content, the first 140 characters of it gets posted on twitter (you may edit it to post the entire post but be careful, twitter has a 100 connections per hour limit), because in the feed I&amp;#39;m talking about that is enough to know what happened. So let&amp;#39;s get to the code. &lt;/p&gt;&lt;p&gt;&lt;font face="courier new,courier"&gt;&lt;font size="1"&gt;&lt;font size="2"&gt;require &amp;#39;net/https&amp;#39;&lt;br /&gt;require &amp;#39;rexml/document&amp;#39;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp; f = File.new(&amp;quot;data.txt&amp;quot;, &amp;quot;r&amp;quot;) &lt;br /&gt;rescue Errno::ENOENT&lt;br /&gt;&amp;nbsp; #File doesn&amp;#39;t exists, fill it with sample data&lt;br /&gt;&amp;nbsp; f = File.new(&amp;quot;data.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;&amp;nbsp; info = {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;so&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;eo&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;aced&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;po&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;ges&amp;quot; =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;ppi&amp;quot; =&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; Marshal.dump(info,f)&lt;br /&gt;&amp;nbsp; f.close&lt;br /&gt;&amp;nbsp; f = File.new(&amp;quot;data.txt&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;info = Marshal.load(f)&lt;br /&gt;f.close&lt;br /&gt;&lt;br /&gt;urls = {&lt;br /&gt;&amp;nbsp; &amp;quot;po&amp;quot; =&amp;gt; &amp;quot;/external/announcementsRSS.do?announcementBoardId=243496&amp;quot;,&lt;br /&gt;&amp;nbsp; &amp;quot;so&amp;quot; =&amp;gt; &amp;quot;/external/announcementsRSS.do?announcementBoardId=243523&amp;quot;,&lt;br /&gt;&amp;nbsp; &amp;quot;aced&amp;quot; =&amp;gt; &amp;quot;/external/announcementsRSS.do?announcementBoardId=244762&amp;quot;, &lt;br /&gt;&amp;nbsp; &amp;quot;ges&amp;quot; =&amp;gt; &amp;quot;/external/announcementsRSS.do?announcementBoardId=243508&amp;quot;,&lt;br /&gt;&amp;nbsp; &amp;quot;ppi&amp;quot; =&amp;gt; &amp;quot;/external/announcementsRSS.do?announcementBoardId=243511&amp;quot;,&lt;br /&gt;&amp;nbsp; &amp;quot;eo&amp;quot; =&amp;gt; &amp;quot;/external/announcementsRSS.do?announcementBoardId=243514&amp;quot;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;actual_info = &amp;quot;&amp;quot;&lt;br /&gt;urls.each { |id,url|&lt;br /&gt;&amp;nbsp; begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; http = Net::HTTP.new(&amp;#39;fenix.ist.utl.pt&amp;#39;, &amp;#39;443&amp;#39;) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; http.use_ssl = true&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; http.start do |http|&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; request = Net::HTTP::Get.new(url)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; response = http.request(request)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; actual_info = response.body&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;&lt;br /&gt;&amp;nbsp; rescue Net::HTTPExceptions&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; next #do nothing if couldn&amp;#39;t get feed, it&amp;#39;ll in the near future&lt;br /&gt;&amp;nbsp; end&lt;br /&gt;&lt;br /&gt;&amp;nbsp; if info[id] != actual_info&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; info[id] = actual_info&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; doc = REXML::Document.new(info[id])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; root = doc.root&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; title = String.new(doc.elements[&amp;quot;*/channel/item/title&amp;quot;].text)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; desc = String.new(doc.elements[&amp;quot;*/channel/item/description&amp;quot;].text)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; desc = desc.gsub(/&amp;lt;[^&amp;gt;]*&amp;gt;/,&amp;#39;&amp;#39;)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http = Net::HTTP.new(&amp;#39;twitter.com&amp;#39;, &amp;#39;443&amp;#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http.use_ssl = true&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http.start do |http|&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; limit = 140 - (2 + 2 + 2 + title.length)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; request = Net::HTTP::Post.new(&amp;#39;/statuses/update.xml&amp;#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; request.basic_auth &amp;#39;&lt;strong&gt;&lt;font color="#ff0000"&gt;username&lt;/font&gt;&lt;/strong&gt;&amp;#39;, &amp;#39;&lt;strong&gt;&lt;font color="#ff0000"&gt;password&lt;/font&gt;&lt;/strong&gt;&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; request.set_form_data({&amp;quot;status&amp;quot;=&amp;gt;id.upcase+&amp;quot;::&amp;quot;+title+&amp;quot;::&amp;quot;+desc.slice(0,limit)})&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; response = http.request(request)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rescue Net::HTTPExceptions&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #The submission to twitter failed, forget it! (critical)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;&amp;nbsp; end&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;f = File.new(&amp;quot;data.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;Marshal.dump(info,f)&lt;br /&gt;f.close&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;The script is intended to be run by crontab, there you may specify the time interval in which you want the script to be run. The script itself stores the feeds info in a string which for itself is stored in a hashtable that contains all the feed strings indexed by an id that you must provide and be equal in both hash tables, the one for the info, and the one with the URL&amp;#39;s of the feeds. In my script all the feeds were located under the same host, so the connection was always and opened with &amp;#39;fenix.ist.utl.pt&amp;#39; (and SSL). If that is different with you, store the host in another hashtable indexed by the same id&amp;#39;s. At last you may want (have) to change the items selected in the XML file returned by the call to be posted on the twitter post. In my example all the feeds started by:&lt;br /&gt;&lt;br /&gt;&amp;lt;channel&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tittle&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;description&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;...&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;...&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/item&amp;gt;&lt;br /&gt;&amp;lt;/channel&amp;gt;&lt;br /&gt;&lt;br /&gt;So I select the title and split the description in a way to not fill more than 140 chars total. At last you will have to create a TwitterAccount and provide its username and password in the last connection that is done, the one to Twitter.&lt;br /&gt;&lt;br /&gt;I hope this may be useful to you. The result of mine is at &lt;a href="http://twitter.com/istalert" target="_blank" title="The RSS Twitter Bot page"&gt;@istalert&lt;/a&gt;.&lt;/p&gt;</description>
      <link>http://feedproxy.google.com/~r/miguelpais/~3/WRu5Hyoa5fE/35</link>
      <guid isPermaLink="false">http://www.miguelpais.com/site/view/35</guid>
    <feedburner:origLink>http://www.miguelpais.com/site/view/35</feedburner:origLink></item>
    <item>
      <title>Experiments with Twitter, who are your mutual followers</title>
      <pubDate>Thu, 25 Dec 2008 14:18:05 
-0600</pubDate>
      <description>&lt;p&gt;A week ago, I suddently got curious about a recent drop in &lt;a href="http://twitter.com/miguelpais" target="_blank" title="My twitter profile page"&gt;my&lt;/a&gt; followers count on Twitter which, I didn&amp;#39;t know about, had been because of a bot removal action. Anyway, I came to thought about how many of my contacts were following me back. Althought there are plenty of sites that tell you that, I could name none by the time (check &lt;a href="http://lessfriends.com/" target="_blank" title="LessFriends"&gt;Lessfriends.com&lt;/a&gt; or &lt;a href="http://friendorfollow.com/" target="_blank" title="FriendOrFollow"&gt;FriendOrFollow&lt;/a&gt;), so I thought it would be just faster to write my own thing to do it.&lt;br /&gt;&lt;br /&gt;Here&amp;#39;s the result, just feed username and password with yours and it should work.&lt;br /&gt;&lt;br /&gt;Note: if you&amp;#39;ve over 100 followers the script might not work due to Twitter&amp;#39;s API restriction of 100 requests per hour. If that is the case, just use the web alternatives, this is mostly educational. &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font face="courier new,courier"&gt;require &amp;#39;net/https&amp;#39;&lt;br /&gt;require &amp;quot;rexml/document&amp;quot;&lt;br /&gt;&lt;br /&gt;username = &amp;quot;&amp;quot;&lt;br /&gt;password = &amp;quot;&amp;quot;&lt;br /&gt;friendsxml = &amp;quot;&amp;quot;&lt;br /&gt;&lt;br /&gt;friends = Array.new&lt;br /&gt;friendlist = Array.new&lt;br /&gt;nonlist = Array.new&lt;br /&gt;&lt;br /&gt;http = Net::HTTP.new(&amp;#39;twitter.com&amp;#39;, 443)&lt;br /&gt;http.use_ssl = true&lt;br /&gt;http.start do |http|&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; request = Net::HTTP::Get.new(&amp;#39;/statuses/friends/&amp;#39; + username + &amp;#39;.xml&amp;#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; request.basic_auth username, password&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; response = http.request(request)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; friendsxml = response.body&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;doc = REXML::Document.new(friendsxml)&lt;br /&gt;doc.elements.each(&amp;quot;*/user/screen_name&amp;quot;) {&lt;br /&gt;&amp;nbsp; |element| friends &amp;lt;&amp;lt; element.text&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;friends.each do |f|&lt;br /&gt;&amp;nbsp; isfriend = &amp;quot;&amp;quot;&lt;br /&gt;&amp;nbsp; http.start do |http|&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; request = Net::HTTP::Get.new(&amp;quot;/friendships/exists.xml?user_a=&amp;quot; + f + &amp;quot;&amp;amp;user_b=&amp;quot;+ username)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; request.basic_auth username, password&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; response = http.request(request)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; isfriend = response.body&lt;br /&gt;&amp;nbsp; end&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; if isfriend == &amp;quot;&amp;lt;friends&amp;gt;true&amp;lt;/friends&amp;gt;&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; friendlist &amp;lt;&amp;lt; f&lt;br /&gt;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; nonlist &amp;lt;&amp;lt; f&lt;br /&gt;&amp;nbsp; end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;puts &amp;quot;:::::::Your true friends:::::::&amp;quot;&lt;br /&gt;friendlist.each do |f|&lt;br /&gt;&amp;nbsp; puts f&lt;br /&gt;end&lt;br /&gt;puts &amp;quot;Total: &amp;quot;&lt;br /&gt;puts friendlist.size&lt;br /&gt;&lt;br /&gt;puts &amp;quot;::::::::::Non friends::::::::::&amp;quot;&lt;br /&gt;nonlist.each do |f|&lt;br /&gt;&amp;nbsp; puts f&lt;br /&gt;end&lt;br /&gt;puts &amp;quot;Total: &amp;quot;&lt;br /&gt;puts nonlist.size&lt;/font&gt; &lt;/p&gt;&lt;/blockquote&gt;</description>
      <link>http://feedproxy.google.com/~r/miguelpais/~3/StkZNTe9cPY/34</link>
      <guid isPermaLink="false">http://www.miguelpais.com/site/view/34</guid>
    <feedburner:origLink>http://www.miguelpais.com/site/view/34</feedburner:origLink></item>
    <item>
      <title>All for OpenID, none for it</title>
      <pubDate>Fri, 31 Oct 2008 18:25:32 
-0500</pubDate>
      <description>&lt;p&gt;Some months ago it was big news for OpenID. Yahoo was the first big player to announce the YahooID system as a valid OpenID provider, a crucial step that brought some long desired support from major players to the movement. Some weeks ago, Microsoft did the same with their Live accounts, and Google could only follow. &lt;br /&gt;&lt;br /&gt;Awesome, right? Well, no. In fact, all that these companies are doing is marketing OpenID as one of those features that everyone claps at, but few stop to realize it means nothing to the movement.&lt;br /&gt;&lt;br /&gt;Let&amp;#39;s think. Although I already had an OpenID at myopenid.net, I now have my GoogleID has an OpenID, great. Where can I sign in with it? Surely at Flickr from Yahoo, which is an OpenID supporter, right? Actually, no. Well, perhaps on Live Maps this OpenID may be useful. Wrong again. So, what does it mean to me, the OpenID user, to have so many major companies endorsing the system? Zero.&lt;br /&gt;&lt;br /&gt;Please, stop trying to turn every existing ID into an OpenID, what we want is not that. We end up having all our previous ID&amp;#39;s being all valid OpenIDs, for usage on the same all small sites. Start giving some utility to the feature you&amp;#39;re giving us! &lt;/p&gt;</description>
      <link>http://feedproxy.google.com/~r/miguelpais/~3/gEJpb04iSZo/33</link>
      <guid isPermaLink="false">http://www.miguelpais.com/site/view/33</guid>
    <feedburner:origLink>http://www.miguelpais.com/site/view/33</feedburner:origLink></item>
    <item>
      <title>Ubiquity's Priberam script: take two</title>
      <pubDate>Thu, 18 Sep 2008 17:54:03 
-0500</pubDate>
      <description>&lt;p&gt;I just wanted to note that I had several problems with the code from the post &lt;a href="../site/view/30" target="_blank" title="Blog post about developping for ubiquity"&gt;Developping for Ubiquity: Priberam&amp;#39;s dictionary&lt;/a&gt;, so I changed the system a bit, mainly in the url used and now it&amp;#39;s working and rocking, so I corrected the post.&lt;/p&gt;&lt;p&gt;Anyway, now you can install it from &lt;a href="http://miguelpais.com/ubiquity/priberam_install" target="_blank" title="install priberam&amp;#39;s script"&gt;here&lt;/a&gt;.&amp;nbsp; &lt;/p&gt;&lt;p&gt;P.S.: In resume if you don&amp;#39;t know what I&amp;#39;m talking about, this script searches for a definition of a portuguese word in the &lt;a href="http://www.priberam.pt/dlpo/dlpo.aspx" target="_blank" title="Priberam&amp;#39;s dictionary"&gt;Priberam&lt;/a&gt;&amp;#39;s dicitonary and shows the definition on-the-fly in preview. &lt;/p&gt;</description>
      <link>http://feedproxy.google.com/~r/miguelpais/~3/UzAkgkIZD6w/32</link>
      <guid isPermaLink="false">http://www.miguelpais.com/site/view/32</guid>
    <feedburner:origLink>http://www.miguelpais.com/site/view/32</feedburner:origLink></item>
  </channel>
</rss>
