<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0" xml:base="http://arancaytar.ermarian.net">
<channel>
 <title>Aranfoolcaytar</title>
 <link>http://arancaytar.ermarian.net</link>
 <description />
 <language>en</language>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/aranfoolcaytar" type="application/rss+xml" /><item>
 <title>Spam, redux</title>
 <link>http://feedproxy.google.com/~r/aranfoolcaytar/~3/K8C-faNVQlI/spam-redux</link>
 <description>&lt;!-- google_ad_section_start --&gt; &lt;p&gt;It has been apparent for at least half a year, but reCAPTCHA is now widely being broken by spambots on this site. I have had to clean up over a hundred spam messages from the last week alone. For now, I have simply blocked commenters from entering their homepage, and handed out a number of IP blocks. &lt;/p&gt;
&lt;p&gt;It&amp;#039;s clear though that I&amp;#039;ll end up having to solve this problem again, for the nth time. Who knows, maybe I&amp;#039;ll simply have to disable public comments and ask for email responses instead. Of the last few hundred comments, only around a dozen were not spam and most of those were simply replies directly to me rather than public discussions.&lt;/p&gt;
 &lt;!-- google_ad_section_end --&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/T_d8OK0F2HOHlXlSEBBhylAHxY8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/T_d8OK0F2HOHlXlSEBBhylAHxY8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/T_d8OK0F2HOHlXlSEBBhylAHxY8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/T_d8OK0F2HOHlXlSEBBhylAHxY8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aranfoolcaytar/~4/K8C-faNVQlI" height="1" width="1"/&gt;</description>
 <comments>http://arancaytar.ermarian.net/2009/07/05/spam-redux#comments</comments>
 <category domain="http://arancaytar.ermarian.net/news/personal/aranfoolcaytar">Aranfoolcaytar</category>
 <category domain="http://arancaytar.ermarian.net/keyword/captcha">captcha</category>
 <category domain="http://arancaytar.ermarian.net/keyword/recaptcha">recaptcha</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://arancaytar.ermarian.net/crss/node/197</wfw:commentRss>
 <pubDate>Sun, 05 Jul 2009 00:48:02 +0000</pubDate>
 <dc:creator>Arancaytar</dc:creator>
 <guid isPermaLink="false">197 at http://arancaytar.ermarian.net</guid>
<feedburner:origLink>http://arancaytar.ermarian.net/2009/07/05/spam-redux</feedburner:origLink></item>
<item>
 <title>Three Years of Foolishness</title>
 <link>http://feedproxy.google.com/~r/aranfoolcaytar/~3/yke4SL8hNcg/three-years-foolishness</link>
 <description>&lt;!-- google_ad_section_start --&gt; &lt;p&gt;This day marks the third anniversary of my blog. Or at least, of the blog being moved from &lt;a href="http://arancaytar.blogspot.com" title="http://arancaytar.blogspot.com"&gt;BlogSpot&lt;/a&gt; to my own domain, switching from being powered by Blogger to the Drupal CMS (in fact, the second Drupal site I ever installed and the oldest one that still remains), and of course being renamed from &amp;quot;Arancaytar&amp;#039;s Little Corner&amp;quot; (a name that was &lt;em&gt;exactly&lt;/em&gt; as cheesy as the posts) to &amp;quot;Aranfoolcaytar&amp;quot; (in other words, the blog is still cheesy but at least now it&amp;#039;s a bit self-mocking).&lt;/p&gt;
&lt;p&gt;Since that time, the blog has survived many trials: One change of hosts (to DreamHost), the best decision I ever made (and no, I didn&amp;#039;t get paid for this), because friendly and tech-savvy support is worth way more than some three extra nines of uptime. Two separate major version upgrades in Drupal, from 4.7.x to 5.x to 6.x (and any Drupal user can attest to how much fun those are). My own increasingly invasive meddling with the core code as I learnt to develop for Drupal myself - though for the current code base, I managed to get back down to six core hacks. I tried out at least four different approaches to spam: Manual moderation, admin-approved registration required, Akismet auto-moderation, and finally ReCAPTCHA which rocks. Around 5-6 custom modules in various states of disrepair (though I can say I&amp;#039;m proud of how &lt;a href="http://ermarian.net/downloads/drupal/xbbcode/" title="http://ermarian.net/downloads/drupal/xbbcode/"&gt;xbbcode&lt;/a&gt; turned out).&lt;/p&gt;
&lt;p&gt;More theme changes than I can remember. My archives say I started out using the &lt;a href="http://drupal.org/project/slash" title="http://drupal.org/project/slash"&gt;Slash theme&lt;/a&gt; that imitates &lt;a href="http://slashdot.org" title="http://slashdot.org"&gt;Slashdot&lt;/a&gt;. I probably used &lt;a href="http://drupal.org/project/Pleroma" title="http://drupal.org/project/Pleroma"&gt;Pleroma&lt;/a&gt; which I also used on the Grand Endeavor while it was still online. For a long time I simply used a green-shifted color mod (yay for color.module) of Garland, similar to what you can now see at &lt;a href="http://barred.ermarian.net" title="http://barred.ermarian.net"&gt;proxydb&lt;/a&gt;). The last theme I invested much time in was &lt;a href="http://drupal.org/project/agregado" title="http://drupal.org/project/agregado"&gt;Agregado&lt;/a&gt; which I eventually got rid of because of its poor support for fluid width and wide screens.&lt;/p&gt;
&lt;p&gt;I didn&amp;#039;t quite manage to break the 200 nodes mark at the same time, but at least I&amp;#039;m pretty close, this post being &lt;code&gt;nid #196&lt;/code&gt;. Thanks to comment spam and the flood of notices generated by shoddily written contrib modules, the other two indicator numbers are the &lt;code&gt;cid&lt;/code&gt; (comment ID) #1549, and the &lt;code&gt;wid&lt;/code&gt; (error log ID) #1191949. &lt;/p&gt;
&lt;p&gt;One of the more significant changes in this time has been that I finally found a desktop client I liked, namely Drivel. It was a bit tricky to get it to work with inline tags (you see, the Movable Type API separates post saving and taxonomy saving into two actions, and so &lt;a href="http://drupal.org/project/inlinetags" title="http://drupal.org/project/inlinetags"&gt;Inline Tags&lt;/a&gt; has some trouble saving the inline taxonomy without getting it overwritten a second later), but it works very well.&lt;/p&gt;
&lt;p&gt;Here&amp;#039;s to three more years! I hope all my regular readers will stay with me that long - all three of you. &lt;img src="http://arancaytar.ermarian.net/sites/arancaytar.ermarian.net/files/smileys/smile.gif" title="Smile" alt="Smile" class="smiley-content"/&gt;&lt;/p&gt;
 &lt;!-- google_ad_section_end --&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IuOTTIZ-pyKDF7OOZFxGwj0i2L8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IuOTTIZ-pyKDF7OOZFxGwj0i2L8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IuOTTIZ-pyKDF7OOZFxGwj0i2L8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IuOTTIZ-pyKDF7OOZFxGwj0i2L8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aranfoolcaytar/~4/yke4SL8hNcg" height="1" width="1"/&gt;</description>
 <comments>http://arancaytar.ermarian.net/2009/06/26/three-years-foolishness#comments</comments>
 <category domain="http://arancaytar.ermarian.net/keyword/anniversary">anniversary</category>
 <category domain="http://arancaytar.ermarian.net/news/personal/aranfoolcaytar">Aranfoolcaytar</category>
 <category domain="http://arancaytar.ermarian.net/keyword/blog">blog</category>
 <category domain="http://arancaytar.ermarian.net/keyword/fool">fool</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://arancaytar.ermarian.net/crss/node/196</wfw:commentRss>
 <pubDate>Fri, 26 Jun 2009 15:39:11 +0000</pubDate>
 <dc:creator>Arancaytar</dc:creator>
 <guid isPermaLink="false">196 at http://arancaytar.ermarian.net</guid>
<feedburner:origLink>http://arancaytar.ermarian.net/2009/06/26/three-years-foolishness</feedburner:origLink></item>
<item>
 <title>Twitter via P2P</title>
 <link>http://feedproxy.google.com/~r/aranfoolcaytar/~3/TKDzFxcKJns/twitter-p2p</link>
 <description>&lt;!-- google_ad_section_start --&gt; &lt;p&gt;This is a bit of speculative brainstorming. A lot of this must have been thought of before, and when I have time I will research to see what papers have been written about it.&lt;/p&gt;
&lt;p&gt;One premise is that &lt;a href="http://twitter.com" title="http://twitter.com"&gt;Twitter&lt;/a&gt;&amp;#039;s social network is currently being used in a different way than just a community of contacts. It is also a network through which messages spread virally, repeated and relayed from person to person. Casual users of Twitter may not have seen much of the informal so-called &amp;quot;RT&amp;quot; code yet. It is an abbreviation for &amp;quot;Re-Tweet&amp;quot;, and is used interchangeably to signify that a certain message should be resubmitted by anyone who reads it, or that it already is a resubmission originally by someone else. This technique is used particularly in the #iran/#neda &amp;quot;tweetsphere&amp;quot;, where news updates are globally significant rather than being personal communication between individuals.&lt;/p&gt;
&lt;p&gt;A sample of what such updates may look like is here, picked up some minutes ago.&lt;/p&gt;
&lt;div class="codeblock"&gt;&lt;br /&gt;(14:16:50) Twitter: iranbaan: Mousavi: I don&amp;#039;t fear responding to the gov. allegations #IranElection&lt;br /&gt;(14:17:28) Twitter: iranbaan: Mousavi: I&amp;#039;m ready to show those who run the #election are now lining up with those who commit riots and #IranElection&lt;br /&gt;(14:17:52) Twitter: iranbaan: Mousavi: I won&amp;#039;t back down by threats that their characters are known to our people #Iranelection&lt;br /&gt;(14:18:13) Twitter: iranbaan: Mousavi:If those who committed atrocities in 1999 in Tehr. Univ. has been punished we wouldn&amp;#039;t see today #Iranelection&lt;br /&gt;(14:18:30) Twitter: dominiquerdr: RT : Mousavi has officially announce that he can not get in touch with ppl. &lt;a href="http://tinyurl.com/kvbewq" title="http://tinyurl.com/kvbewq"&gt;http://tinyurl.com/kvbewq&lt;/a&gt; #iranelection&lt;br /&gt;(14:18:47) Twitter: dominiquerdr: RT : Mousavi: I don&amp;#039;t fear responding to the gov. allegations #IranElection&lt;br /&gt;(14:19:03) Twitter: dominiquerdr: RT : Mousavi: I&amp;#039;m ready to show those who run the #election are now lining up with those who commit riots and #IranElection&lt;br /&gt;(14:19:15) Twitter: lotfan: Ahmadinejad Assails Obama as Opposition Urges Defiance   &lt;a href="http://bit.ly/2h1wK" title="http://bit.ly/2h1wK"&gt;http://bit.ly/2h1wK&lt;/a&gt; #iranelection #gr88&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;This acts as a mass-moderated, &lt;em&gt;theoretically&lt;/em&gt; decentralized network spreading short messages between peers without requiring every broadcast to be sent to every person, allowing indirect messages to spread further the more significantly they are considered by the people who read them.&lt;/p&gt;
&lt;p&gt;I say &amp;quot;theoretically&amp;quot; because in practice, all this still happens over the Twitter database. Twitter&amp;#039;s social network is a virtual construct within the central entity of Twitter. &amp;quot;Retweeting&amp;quot; does not actually do anything like &amp;quot;passing on a message&amp;quot;; it merely produces a copy of the same message on the same server, readable by other subscribers. To block this communication, all a censor has to do is filter access to twitter.com (which is in fact happening in Iran, last I heard).&lt;/p&gt;
&lt;p&gt;Yesterday around three in the morning, I spent some time feverishly wondering whether Twitter&amp;#039;s virtual &amp;quot;relay network&amp;quot; on a single database could be turned into an actual decentralized relay network between a multitude of computers, highly resistant to filtering.&lt;/p&gt;
&lt;p&gt;The threats that this network must be safe from are these:&lt;/p&gt;
&lt;dl&gt;&lt;dd&gt;&lt;/dd&gt;&lt;dt&gt;Port blocking&lt;/dt&gt;&lt;dd&gt; The software must either communicate via randomized ports or via a port that cannot be blocked unilaterally (80).&lt;/dd&gt;&lt;dt&gt;Active Infiltration&lt;/dt&gt;&lt;dd&gt; The network must be resistant to malicious flooding/spamming. This would work via a web of trust where peers are gradually gaining more trust the more of their messages are passed on.&lt;/dd&gt;&lt;dt&gt;Attacking the center&lt;/dt&gt;&lt;dd&gt; Whatever mechanism the network uses to introduce peers to each other, no central database is safe from attack.&lt;/dd&gt;&lt;dt&gt;Passive Infiltration&lt;/dt&gt;&lt;dd&gt; The network must not allow peers to harvest peer identities, because privacy is a matter of life or death in Iran right now.&lt;/dd&gt;&lt;dd&gt;&lt;/dd&gt;&lt;/dl&gt;
&lt;p&gt;Protections against the first two threats are solidly established, and implemented in many Peer-to-Peer technologies in the wild, such as BitTorrent (which already has reputation networks for prioritizing those peers known to be the best contributors).&lt;/p&gt;
&lt;p&gt;The second threat is somewhat tricky, as &lt;a title="Blue Frog on Wikipedia" href="http://www.wikipedia.org/wiki/Blue Frog"&gt;Blue Frog&lt;/a&gt; and more recently &lt;a title="The Pirate Bay on Wikipedia" href="http://www.wikipedia.org/wiki/The Pirate Bay"&gt;The Pirate Bay&lt;/a&gt; have shown. Blue Security, for those who missed it, used a peer-based approach to spam fighting three years ago. In May/June 2006, Blue Security was hit by vast DDoS attacks and eventually shut down: The central server, the vulnerable Achilles heel in the system, had been disabled. The Pirate Bay is presently embroiled in a lawsuit for &amp;quot;enabling&amp;quot; copyright infringement, and in spite of the existence of &amp;quot;trackerless Torrents&amp;quot; via a &lt;a title="Distributed Hash Table on Wikipedia" href="http://www.wikipedia.org/wiki/Distributed Hash Table"&gt;Distributed Hash Table&lt;/a&gt;, it is clear that without a central tracker like TPB, discovering an initial peer i less simple.&lt;/p&gt;
&lt;p&gt;The last is even more intricate, as it makes discovery of peers barely possible. When you join a BitTorrent cloud, you subscribe to a tracker database that contains your IP and those of the other peers. An interested entity (such as the RIAA and its slightly more evil cousin, the Iranian secret police) can easily subscribe to the same tracker, discover those peers that happen to be within its sphere of influence and then act accordingly (sue for millions, beat to death with axes, &lt;em&gt;et cetera&lt;/em&gt;). Those who use BitTorrent for copyright violations don&amp;#039;t bother with more privacy, as legal proceedings in the US impose (some) rules on what constitutes evidence or ethical investigation. Basij on motorcycles with axes knocking on your door at night don&amp;#039;t have such inhibitions, so people need &lt;em&gt;hard&lt;/em&gt; crypto.&lt;/p&gt;
&lt;p&gt;The basic dilemma is: how can a decentralized network grow dynamically, while no single computer is allowed access to all peers, and no central database is safe from attack? It seems like a chicken-and-egg problem. Some steganography ideas come to mind (hiding peer addresses in remote corners of the web or in spam mail), or some indirect routing ideas (eg. all connections inside a censoring country must first go outside that country across jurisdictional boundaries), but that&amp;#039;s very theoretical. I don&amp;#039;t know enough about network technology.&lt;/p&gt;
&lt;p&gt;Brainstorm out.&lt;/p&gt;
 &lt;!-- google_ad_section_end --&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DrO-jv-CxILuOiG1-PhNzc7XV0A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DrO-jv-CxILuOiG1-PhNzc7XV0A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/DrO-jv-CxILuOiG1-PhNzc7XV0A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DrO-jv-CxILuOiG1-PhNzc7XV0A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aranfoolcaytar/~4/TKDzFxcKJns" height="1" width="1"/&gt;</description>
 <comments>http://arancaytar.ermarian.net/2009/06/25/twitter-p2p#comments</comments>
 <category domain="http://arancaytar.ermarian.net/keyword/censorship">Censorship</category>
 <category domain="http://arancaytar.ermarian.net/keyword/crypto">crypto</category>
 <category domain="http://arancaytar.ermarian.net/keyword/iran">Iran</category>
 <category domain="http://arancaytar.ermarian.net/keyword/networks">networks</category>
 <category domain="http://arancaytar.ermarian.net/keyword/p2p">p2p</category>
 <category domain="http://arancaytar.ermarian.net/keyword/privacy">privacy</category>
 <category domain="http://arancaytar.ermarian.net/keyword/twitter">Twitter</category>
 <category domain="http://arancaytar.ermarian.net/keyword/web">web</category>
 <category domain="http://arancaytar.ermarian.net/news/technology">Technology</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://arancaytar.ermarian.net/crss/node/195</wfw:commentRss>
 <pubDate>Thu, 25 Jun 2009 14:43:08 +0000</pubDate>
 <dc:creator>Arancaytar</dc:creator>
 <guid isPermaLink="false">195 at http://arancaytar.ermarian.net</guid>
<feedburner:origLink>http://arancaytar.ermarian.net/2009/06/25/twitter-p2p</feedburner:origLink></item>
<item>
 <title>Twitter Daemon, follow-up</title>
 <link>http://feedproxy.google.com/~r/aranfoolcaytar/~3/kB1vKWSZXzE/twitter-daemon-follow</link>
 <description>&lt;!-- google_ad_section_start --&gt; &lt;p&gt;In re my &lt;a href="http://arancaytar.ermarian.net/2009/06/22/my-very-own-twitter-daemon" title="http://arancaytar.ermarian.net/2009/06/22/my-very-own-twitter-daemon"&gt;previous post&lt;/a&gt;, needless to say it is nearly impossible to properly operate a terminal if the background scripts interrupts each minute by injecting messages directly into the character console. Particularly when you are trying to edit a text file in vim at the moment.&lt;/p&gt;
&lt;p&gt;I saw the light of reason and am now simply appending the messages to a text file. Then, I can open another terminal, set it to follow the text file using &lt;code&gt;tail -f file&lt;/code&gt;. Whew. My shell is calm and peaceful again.&lt;/p&gt;
 &lt;!-- google_ad_section_end --&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kuZDximPMXuI8cKAlLN3weY1p98/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kuZDximPMXuI8cKAlLN3weY1p98/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kuZDximPMXuI8cKAlLN3weY1p98/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kuZDximPMXuI8cKAlLN3weY1p98/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aranfoolcaytar/~4/kB1vKWSZXzE" height="1" width="1"/&gt;</description>
 <comments>http://arancaytar.ermarian.net/2009/06/24/twitter-daemon-follow#comments</comments>
 <category domain="http://arancaytar.ermarian.net/keyword/bash">bash</category>
 <category domain="http://arancaytar.ermarian.net/keyword/console">console</category>
 <category domain="http://arancaytar.ermarian.net/keyword/daemon">daemon</category>
 <category domain="http://arancaytar.ermarian.net/keyword/shell">shell</category>
 <category domain="http://arancaytar.ermarian.net/keyword/terminal">terminal</category>
 <category domain="http://arancaytar.ermarian.net/keyword/twitter">Twitter</category>
 <category domain="http://arancaytar.ermarian.net/news/technology/programming">Programming</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://arancaytar.ermarian.net/crss/node/194</wfw:commentRss>
 <pubDate>Wed, 24 Jun 2009 13:59:51 +0000</pubDate>
 <dc:creator>Arancaytar</dc:creator>
 <guid isPermaLink="false">194 at http://arancaytar.ermarian.net</guid>
<feedburner:origLink>http://arancaytar.ermarian.net/2009/06/24/twitter-daemon-follow</feedburner:origLink></item>
<item>
 <title>Taking leave from blog.module</title>
 <link>http://feedproxy.google.com/~r/aranfoolcaytar/~3/XLI_2krcDLs/taking-leave-blogmodule</link>
 <description>&lt;!-- google_ad_section_start --&gt; &lt;p&gt;This is my first post with the new, custom-created &lt;code&gt;article&lt;/code&gt; content type. There is very little to outwardly distinguish it from the &lt;code&gt;blog&lt;/code&gt; content type provided by Drupal&amp;#039;s &lt;code&gt;blog.module&lt;/code&gt;, except that the latter does not have a link to &amp;quot;Arancaytar&amp;#039;s blog&amp;quot; below each entry (which is superfluous seeing as I am the only author on this site, and my blog is equivalent to the front page).&lt;/p&gt;
&lt;p&gt;I am exploring a way out of &lt;code&gt;blog.module&lt;/code&gt; because I do follow Drupal&amp;#039;s core development very closely, and I have the feeling that this module is becoming an unloved stepchild (and not without reason, since most of its features are hard-coded versions of what could be done with contributed modules like Views). Ultimately, since this is a single-user blog, the recommended content type for me is the &lt;code&gt;article&lt;/code&gt; type (what used to be &lt;code&gt;story&lt;/code&gt; in Drupal 5).&lt;/p&gt;
&lt;p&gt;This post serves as a kind of prototype. If I can make sure &lt;code&gt;article&lt;/code&gt; nodes have the same settings as &lt;code&gt;blog&lt;/code&gt; nodes, I will begin experimenting with switching my old nodes to the new type all at once.&lt;/p&gt;
 &lt;!-- google_ad_section_end --&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pw-EFU5oSUrBPLKp7gs-QmBH0EY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pw-EFU5oSUrBPLKp7gs-QmBH0EY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pw-EFU5oSUrBPLKp7gs-QmBH0EY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pw-EFU5oSUrBPLKp7gs-QmBH0EY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aranfoolcaytar/~4/XLI_2krcDLs" height="1" width="1"/&gt;</description>
 <comments>http://arancaytar.ermarian.net/2009/06/24/taking-leave-blogmodule#comments</comments>
 <category domain="http://arancaytar.ermarian.net/news/personal/aranfoolcaytar">Aranfoolcaytar</category>
 <category domain="http://arancaytar.ermarian.net/keyword/blog">blog</category>
 <category domain="http://arancaytar.ermarian.net/keyword/blogging">Blogging</category>
 <category domain="http://arancaytar.ermarian.net/keyword/drupal">drupal</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://arancaytar.ermarian.net/crss/node/193</wfw:commentRss>
 <pubDate>Wed, 24 Jun 2009 02:20:41 +0000</pubDate>
 <dc:creator>Arancaytar</dc:creator>
 <guid isPermaLink="false">193 at http://arancaytar.ermarian.net</guid>
<feedburner:origLink>http://arancaytar.ermarian.net/2009/06/24/taking-leave-blogmodule</feedburner:origLink></item>
<item>
 <title>My very own Twitter Daemon</title>
 <link>http://feedproxy.google.com/~r/aranfoolcaytar/~3/3a7E1CadGQ0/my-very-own-twitter-daemon</link>
 <description>&lt;!-- google_ad_section_start --&gt; &lt;p&gt;I&amp;#039;ve built myself a twitter notifications daemon out of duct-tape and spit (with liberal application of bash)!&lt;/p&gt;
&lt;p&gt;First of all, here is the daemon script itself. It is in bash, and runs in a continuous loop until killed. I use several components, most notably &amp;quot;twidge&amp;quot; to download new messages. Twidge is a command line utility for twitter. When twidge receives new messages, I display them with &lt;code&gt;notify-send&lt;/code&gt;.&lt;/p&gt;
&lt;div class="hl-main"&gt;
&lt;pre&gt;&lt;span class="hl-special"&gt;#!/bin/bash&lt;/span&gt;&lt;span class="hl-code"&gt;
&lt;/span&gt;&lt;span class="hl-reserved"&gt;echo&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-string"&gt;Starting demon...&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt;
 
&lt;/span&gt;&lt;span class="hl-reserved"&gt;while&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-reserved"&gt;true&lt;/span&gt;&lt;span class="hl-code"&gt;
&lt;/span&gt;&lt;span class="hl-reserved"&gt;do&lt;/span&gt;&lt;span class="hl-code"&gt;
  &lt;/span&gt;&lt;span class="hl-reserved"&gt;echo&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-string"&gt;Downloading messages on &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-quotes"&gt;`&lt;/span&gt;&lt;span class="hl-string"&gt;date&lt;/span&gt;&lt;span class="hl-quotes"&gt;`&lt;/span&gt;&lt;span class="hl-code"&gt;
  &lt;/span&gt;&lt;span class="hl-identifier"&gt;messages&lt;/span&gt;&lt;span class="hl-code"&gt;=&lt;/span&gt;&lt;span class="hl-quotes"&gt;`&lt;/span&gt;&lt;span class="hl-string"&gt;twidge -c ~/.twidgecron lsrecent -alsu|tac|awk -F &amp;quot;t&amp;quot; '{print &lt;/span&gt;&lt;span class="hl-var"&gt;$2&lt;/span&gt;&lt;span class="hl-string"&gt;,&lt;/span&gt;&lt;span class="hl-var"&gt;$4&lt;/span&gt;&lt;span class="hl-string"&gt;}'&lt;/span&gt;&lt;span class="hl-quotes"&gt;`&lt;/span&gt;&lt;span class="hl-code"&gt;
  &lt;/span&gt;&lt;span class="hl-reserved"&gt;if&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-brackets"&gt;[&lt;/span&gt;&lt;span class="hl-code"&gt; ! -&lt;/span&gt;&lt;span class="hl-identifier"&gt;z&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-var"&gt;$messages&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-brackets"&gt;]&lt;/span&gt;&lt;span class="hl-code"&gt;
  &lt;/span&gt;&lt;span class="hl-reserved"&gt;then&lt;/span&gt;&lt;span class="hl-code"&gt;
    &lt;/span&gt;&lt;span class="hl-reserved"&gt;echo&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-string"&gt;New messages!&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt;
    &lt;/span&gt;&lt;span class="hl-reserved"&gt;for&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-identifier"&gt;terminal&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-reserved"&gt;in&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;`&lt;/span&gt;&lt;span class="hl-string"&gt;ls /dev/pts&lt;/span&gt;&lt;span class="hl-quotes"&gt;`&lt;/span&gt;&lt;span class="hl-code"&gt;
    &lt;/span&gt;&lt;span class="hl-reserved"&gt;do&lt;/span&gt;&lt;span class="hl-code"&gt;
      &lt;/span&gt;&lt;span class="hl-reserved"&gt;echo&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-quotes"&gt; /&lt;/span&gt;&lt;span class="hl-string"&gt;dev&lt;/span&gt;&lt;span class="hl-quotes"&gt;/&lt;/span&gt;&lt;span class="hl-identifier"&gt;pts&lt;/span&gt;&lt;span class="hl-code"&gt;/&lt;/span&gt;&lt;span class="hl-var"&gt;$terminal&lt;/span&gt;&lt;span class="hl-code"&gt;
      &lt;/span&gt;&lt;span class="hl-reserved"&gt;echo&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-string"&gt;New Tweets!&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-quotes"&gt; /&lt;/span&gt;&lt;span class="hl-string"&gt;dev&lt;/span&gt;&lt;span class="hl-quotes"&gt;/&lt;/span&gt;&lt;span class="hl-identifier"&gt;pts&lt;/span&gt;&lt;span class="hl-code"&gt;/&lt;/span&gt;&lt;span class="hl-var"&gt;$terminal&lt;/span&gt;&lt;span class="hl-code"&gt;
    &lt;/span&gt;&lt;span class="hl-reserved"&gt;done&lt;/span&gt;&lt;span class="hl-code"&gt;
 
    &lt;/span&gt;&lt;span class="hl-reserved"&gt;echo&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-var"&gt;$messages&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt;|&lt;/span&gt;&lt;span class="hl-reserved"&gt;while&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-reserved"&gt;read&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-identifier"&gt;message&lt;/span&gt;&lt;span class="hl-code"&gt;
    &lt;/span&gt;&lt;span class="hl-reserved"&gt;do&lt;/span&gt;&lt;span class="hl-code"&gt;
      &lt;/span&gt;&lt;span class="hl-identifier"&gt;message&lt;/span&gt;&lt;span class="hl-code"&gt;=&lt;/span&gt;&lt;span class="hl-brackets"&gt;(&lt;/span&gt;&lt;span class="hl-var"&gt;$message&lt;/span&gt;&lt;span class="hl-brackets"&gt;)&lt;/span&gt;&lt;span class="hl-code"&gt;
      &lt;/span&gt;&lt;span class="hl-identifier"&gt;sender&lt;/span&gt;&lt;span class="hl-code"&gt;=$&lt;/span&gt;&lt;span class="hl-brackets"&gt;{&lt;/span&gt;&lt;span class="hl-identifier"&gt;message&lt;/span&gt;&lt;span class="hl-brackets"&gt;[&lt;/span&gt;&lt;span class="hl-number"&gt;0&lt;/span&gt;&lt;span class="hl-brackets"&gt;]&lt;/span&gt;&lt;span class="hl-brackets"&gt;}&lt;/span&gt;&lt;span class="hl-code"&gt;
      &lt;/span&gt;&lt;span class="hl-identifier"&gt;icon&lt;/span&gt;&lt;span class="hl-code"&gt;=/&lt;/span&gt;&lt;span class="hl-identifier"&gt;usr&lt;/span&gt;&lt;span class="hl-code"&gt;/&lt;/span&gt;&lt;span class="hl-identifier"&gt;share&lt;/span&gt;&lt;span class="hl-code"&gt;/&lt;/span&gt;&lt;span class="hl-identifier"&gt;icons&lt;/span&gt;&lt;span class="hl-code"&gt;/&lt;/span&gt;&lt;span class="hl-identifier"&gt;gnome&lt;/span&gt;&lt;span class="hl-code"&gt;/&lt;/span&gt;&lt;span class="hl-identifier"&gt;scalable&lt;/span&gt;&lt;span class="hl-code"&gt;/&lt;/span&gt;&lt;span class="hl-identifier"&gt;status&lt;/span&gt;&lt;span class="hl-code"&gt;/&lt;/span&gt;&lt;span class="hl-identifier"&gt;mail&lt;/span&gt;&lt;span class="hl-code"&gt;-&lt;/span&gt;&lt;span class="hl-identifier"&gt;unread&lt;/span&gt;&lt;span class="hl-code"&gt;.&lt;/span&gt;&lt;span class="hl-identifier"&gt;svg&lt;/span&gt;&lt;span class="hl-code"&gt;
      &lt;/span&gt;&lt;span class="hl-identifier"&gt;icon&lt;/span&gt;&lt;span class="hl-code"&gt;=&lt;/span&gt;&lt;span class="hl-quotes"&gt;`&lt;/span&gt;&lt;span class="hl-string"&gt;bash ~/scripts/twitter-user-pic &lt;/span&gt;&lt;span class="hl-var"&gt;$sender&lt;/span&gt;&lt;span class="hl-quotes"&gt;`&lt;/span&gt;&lt;span class="hl-code"&gt;
      &lt;/span&gt;&lt;span class="hl-identifier"&gt;content&lt;/span&gt;&lt;span class="hl-code"&gt;=$&lt;/span&gt;&lt;span class="hl-brackets"&gt;{&lt;/span&gt;&lt;span class="hl-identifier"&gt;message&lt;/span&gt;&lt;span class="hl-brackets"&gt;[&lt;/span&gt;&lt;span class="hl-code"&gt;@&lt;/span&gt;&lt;span class="hl-brackets"&gt;]&lt;/span&gt;&lt;span class="hl-code"&gt;:&lt;/span&gt;&lt;span class="hl-number"&gt;1&lt;/span&gt;&lt;span class="hl-brackets"&gt;}&lt;/span&gt;&lt;span class="hl-code"&gt;
      &lt;/span&gt;&lt;span class="hl-identifier"&gt;notify&lt;/span&gt;&lt;span class="hl-code"&gt;-&lt;/span&gt;&lt;span class="hl-identifier"&gt;send&lt;/span&gt;&lt;span class="hl-code"&gt; -&lt;/span&gt;&lt;span class="hl-identifier"&gt;i&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-var"&gt;$icon&lt;/span&gt;&lt;span class="hl-code"&gt; -&lt;/span&gt;&lt;span class="hl-identifier"&gt;t&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-number"&gt;15000&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-var"&gt;$sender&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-var"&gt;$content&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt;
      &lt;/span&gt;&lt;span class="hl-reserved"&gt;for&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-identifier"&gt;terminal&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-reserved"&gt;in&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;`&lt;/span&gt;&lt;span class="hl-string"&gt;ls /dev/pts&lt;/span&gt;&lt;span class="hl-quotes"&gt;`&lt;/span&gt;&lt;span class="hl-code"&gt;
      &lt;/span&gt;&lt;span class="hl-reserved"&gt;do&lt;/span&gt;&lt;span class="hl-code"&gt;
        &lt;/span&gt;&lt;span class="hl-reserved"&gt;echo&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-var"&gt;$sender&lt;/span&gt;&lt;span class="hl-string"&gt; &lt;/span&gt;&lt;span class="hl-var"&gt;$content&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-quotes"&gt; /&lt;/span&gt;&lt;span class="hl-string"&gt;dev&lt;/span&gt;&lt;span class="hl-quotes"&gt;/&lt;/span&gt;&lt;span class="hl-identifier"&gt;pts&lt;/span&gt;&lt;span class="hl-code"&gt;/&lt;/span&gt;&lt;span class="hl-var"&gt;$terminal&lt;/span&gt;&lt;span class="hl-code"&gt;
      &lt;/span&gt;&lt;span class="hl-reserved"&gt;done&lt;/span&gt;&lt;span class="hl-code"&gt;
    &lt;/span&gt;&lt;span class="hl-reserved"&gt;done&lt;/span&gt;&lt;span class="hl-code"&gt;
  &lt;/span&gt;&lt;span class="hl-reserved"&gt;else&lt;/span&gt;&lt;span class="hl-code"&gt;
    &lt;/span&gt;&lt;span class="hl-reserved"&gt;echo&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-string"&gt;Nothing new.&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt;
  &lt;/span&gt;&lt;span class="hl-reserved"&gt;fi&lt;/span&gt;&lt;span class="hl-code"&gt;
  &lt;/span&gt;&lt;span class="hl-reserved"&gt;sleep&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-number"&gt;60&lt;/span&gt;&lt;span class="hl-code"&gt;
&lt;/span&gt;&lt;span class="hl-reserved"&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &amp;quot;twitter-user-pic&amp;quot; bash script downloads and stores user&amp;#039;s profile images. It looks like this.&lt;/p&gt;
&lt;div class="hl-main"&gt;
&lt;pre&gt;&lt;span class="hl-special"&gt;#!/bin/bash&lt;/span&gt;&lt;span class="hl-code"&gt;
 
&lt;/span&gt;&lt;span class="hl-reserved"&gt;if&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-brackets"&gt;[&lt;/span&gt;&lt;span class="hl-code"&gt; ! -&lt;/span&gt;&lt;span class="hl-identifier"&gt;z&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-var"&gt;$1&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-brackets"&gt;]&lt;/span&gt;&lt;span class="hl-code"&gt;
&lt;/span&gt;&lt;span class="hl-reserved"&gt;then&lt;/span&gt;&lt;span class="hl-code"&gt;
  &lt;/span&gt;&lt;span class="hl-identifier"&gt;picture&lt;/span&gt;&lt;span class="hl-code"&gt;=&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-var"&gt;$HOME&lt;/span&gt;&lt;span class="hl-string"&gt;/graphics/avatars/twitter/&lt;/span&gt;&lt;span class="hl-var"&gt;$1&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt;
  &lt;/span&gt;&lt;span class="hl-reserved"&gt;if&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-brackets"&gt;[&lt;/span&gt;&lt;span class="hl-code"&gt; -&lt;/span&gt;&lt;span class="hl-identifier"&gt;f&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-var"&gt;$picture&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-brackets"&gt;]&lt;/span&gt;&lt;span class="hl-code"&gt;
  &lt;/span&gt;&lt;span class="hl-reserved"&gt;then&lt;/span&gt;&lt;span class="hl-code"&gt;
    &lt;/span&gt;&lt;span class="hl-reserved"&gt;echo&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-var"&gt;$picture&lt;/span&gt;&lt;span class="hl-code"&gt;
  &lt;/span&gt;&lt;span class="hl-reserved"&gt;else&lt;/span&gt;&lt;span class="hl-code"&gt;
    &lt;/span&gt;&lt;span class="hl-identifier"&gt;url&lt;/span&gt;&lt;span class="hl-code"&gt;=&lt;/span&gt;&lt;span class="hl-quotes"&gt;`&lt;/span&gt;&lt;span class="hl-string"&gt;python2.6 ~/scripts/python/twitchy/twitchy.py picture -u &amp;quot;&lt;/span&gt;&lt;span class="hl-var"&gt;$1&lt;/span&gt;&lt;span class="hl-string"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-quotes"&gt;`&lt;/span&gt;&lt;span class="hl-code"&gt;
    &lt;/span&gt;&lt;span class="hl-reserved"&gt;if&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-brackets"&gt;[&lt;/span&gt;&lt;span class="hl-code"&gt; ! -&lt;/span&gt;&lt;span class="hl-identifier"&gt;z&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-var"&gt;$url&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-brackets"&gt;]&lt;/span&gt;&lt;span class="hl-code"&gt;
    &lt;/span&gt;&lt;span class="hl-reserved"&gt;then&lt;/span&gt;&lt;span class="hl-code"&gt;
      &lt;/span&gt;&lt;span class="hl-identifier"&gt;picture&lt;/span&gt;&lt;span class="hl-code"&gt;=&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-var"&gt;$HOME&lt;/span&gt;&lt;span class="hl-string"&gt;/graphics/avatars/twitter/&lt;/span&gt;&lt;span class="hl-var"&gt;$1&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt;
 
      &lt;/span&gt;&lt;span class="hl-identifier"&gt;wget&lt;/span&gt;&lt;span class="hl-code"&gt; -&lt;/span&gt;&lt;span class="hl-quotes"&gt;qO&lt;/span&gt;&lt;span class="hl-string"&gt; - &amp;quot;$url&amp;quot;  &amp;quot;$picture&amp;quot;
 
      echo $picture
    fi
  fi
fi&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;quot;twitchy.py&amp;quot; is my own little Python script that can currently only query user profile picture URLs (may be extended later). As you can see, the twitter-user-pic script checks a local file cache to see if the picture exists, and otherwise downloads it. Everything about this is rickety and hacky, starting from the lack of file extensions.&lt;/p&gt;
&lt;p&gt;This is my python script:&lt;/p&gt;
&lt;div class="hl-main"&gt;
&lt;pre&gt;&lt;span class="hl-comment"&gt;#!/usr/bin/python2.6&lt;/span&gt;&lt;span class="hl-code"&gt;
&lt;/span&gt;&lt;span class="hl-reserved"&gt;import&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-identifier"&gt;sys&lt;/span&gt;&lt;span class="hl-code"&gt;;
&lt;/span&gt;&lt;span class="hl-reserved"&gt;import&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-identifier"&gt;getopt&lt;/span&gt;&lt;span class="hl-code"&gt;;
&lt;/span&gt;&lt;span class="hl-reserved"&gt;import&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-identifier"&gt;twitter&lt;/span&gt;&lt;span class="hl-code"&gt;;
 
&lt;/span&gt;&lt;span class="hl-reserved"&gt;def&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-identifier"&gt;main&lt;/span&gt;&lt;span class="hl-brackets"&gt;(&lt;/span&gt;&lt;span class="hl-identifier"&gt;argv&lt;/span&gt;&lt;span class="hl-brackets"&gt;)&lt;/span&gt;&lt;span class="hl-code"&gt;:
  &lt;/span&gt;&lt;span class="hl-identifier"&gt;api&lt;/span&gt;&lt;span class="hl-code"&gt; = &lt;/span&gt;&lt;span class="hl-identifier"&gt;twitter&lt;/span&gt;&lt;span class="hl-code"&gt;.&lt;/span&gt;&lt;span class="hl-identifier"&gt;Api&lt;/span&gt;&lt;span class="hl-brackets"&gt;(&lt;/span&gt;&lt;span class="hl-brackets"&gt;)&lt;/span&gt;&lt;span class="hl-code"&gt;;
  &lt;/span&gt;&lt;span class="hl-identifier"&gt;api&lt;/span&gt;&lt;span class="hl-code"&gt;.&lt;/span&gt;&lt;span class="hl-identifier"&gt;SetCredentials&lt;/span&gt;&lt;span class="hl-brackets"&gt;(&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-string"&gt;arancaytar&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt;, &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-string"&gt;OC3TaQHqONi1PuAr&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-brackets"&gt;)&lt;/span&gt;&lt;span class="hl-code"&gt;;
  
  &lt;/span&gt;&lt;span class="hl-identifier"&gt;command&lt;/span&gt;&lt;span class="hl-code"&gt; = &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt;
  &lt;/span&gt;&lt;span class="hl-identifier"&gt;user&lt;/span&gt;&lt;span class="hl-code"&gt; = &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt;
 
  &lt;/span&gt;&lt;span class="hl-reserved"&gt;if&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-identifier"&gt;argv&lt;/span&gt;&lt;span class="hl-brackets"&gt;[&lt;/span&gt;&lt;span class="hl-number"&gt;0&lt;/span&gt;&lt;span class="hl-brackets"&gt;]&lt;/span&gt;&lt;span class="hl-brackets"&gt;[&lt;/span&gt;&lt;span class="hl-number"&gt;0&lt;/span&gt;&lt;span class="hl-brackets"&gt;]&lt;/span&gt;&lt;span class="hl-code"&gt; != &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-string"&gt;-&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt;:
    &lt;/span&gt;&lt;span class="hl-identifier"&gt;command&lt;/span&gt;&lt;span class="hl-code"&gt; = &lt;/span&gt;&lt;span class="hl-identifier"&gt;argv&lt;/span&gt;&lt;span class="hl-brackets"&gt;[&lt;/span&gt;&lt;span class="hl-number"&gt;0&lt;/span&gt;&lt;span class="hl-brackets"&gt;]&lt;/span&gt;&lt;span class="hl-code"&gt;
    &lt;/span&gt;&lt;span class="hl-identifier"&gt;argv&lt;/span&gt;&lt;span class="hl-code"&gt; = &lt;/span&gt;&lt;span class="hl-identifier"&gt;argv&lt;/span&gt;&lt;span class="hl-brackets"&gt;[&lt;/span&gt;&lt;span class="hl-number"&gt;1&lt;/span&gt;&lt;span class="hl-code"&gt;:&lt;/span&gt;&lt;span class="hl-brackets"&gt;]&lt;/span&gt;&lt;span class="hl-code"&gt;
  &lt;/span&gt;&lt;span class="hl-identifier"&gt;opts&lt;/span&gt;&lt;span class="hl-code"&gt;, &lt;/span&gt;&lt;span class="hl-identifier"&gt;args&lt;/span&gt;&lt;span class="hl-code"&gt; = &lt;/span&gt;&lt;span class="hl-identifier"&gt;getopt&lt;/span&gt;&lt;span class="hl-code"&gt;.&lt;/span&gt;&lt;span class="hl-identifier"&gt;getopt&lt;/span&gt;&lt;span class="hl-brackets"&gt;(&lt;/span&gt;&lt;span class="hl-identifier"&gt;argv&lt;/span&gt;&lt;span class="hl-code"&gt;, &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-string"&gt;c:u:&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt;, &lt;/span&gt;&lt;span class="hl-brackets"&gt;[&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-string"&gt;command=&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt;, &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-string"&gt;user=&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-brackets"&gt;]&lt;/span&gt;&lt;span class="hl-brackets"&gt;)&lt;/span&gt;&lt;span class="hl-code"&gt;;
  &lt;/span&gt;&lt;span class="hl-reserved"&gt;for&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-identifier"&gt;opt&lt;/span&gt;&lt;span class="hl-code"&gt;, &lt;/span&gt;&lt;span class="hl-identifier"&gt;arg&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-reserved"&gt;in&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-identifier"&gt;opts&lt;/span&gt;&lt;span class="hl-code"&gt;:
    &lt;/span&gt;&lt;span class="hl-reserved"&gt;if&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-identifier"&gt;opt&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-identifier"&gt;in&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-brackets"&gt;(&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-string"&gt;-c&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt;, &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-string"&gt;--command&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-brackets"&gt;)&lt;/span&gt;&lt;span class="hl-code"&gt;:
      &lt;/span&gt;&lt;span class="hl-identifier"&gt;command&lt;/span&gt;&lt;span class="hl-code"&gt; = &lt;/span&gt;&lt;span class="hl-identifier"&gt;arg&lt;/span&gt;&lt;span class="hl-code"&gt;
    &lt;/span&gt;&lt;span class="hl-reserved"&gt;elif&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-identifier"&gt;opt&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-identifier"&gt;in&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-brackets"&gt;(&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-string"&gt;-u&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt;, &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-string"&gt;--user&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-brackets"&gt;)&lt;/span&gt;&lt;span class="hl-code"&gt;:
      &lt;/span&gt;&lt;span class="hl-identifier"&gt;user&lt;/span&gt;&lt;span class="hl-code"&gt; = &lt;/span&gt;&lt;span class="hl-identifier"&gt;arg&lt;/span&gt;&lt;span class="hl-code"&gt;
  &lt;/span&gt;&lt;span class="hl-reserved"&gt;if&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-identifier"&gt;user&lt;/span&gt;&lt;span class="hl-code"&gt; != &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt;:
    &lt;/span&gt;&lt;span class="hl-identifier"&gt;account&lt;/span&gt;&lt;span class="hl-code"&gt; = &lt;/span&gt;&lt;span class="hl-identifier"&gt;api&lt;/span&gt;&lt;span class="hl-code"&gt;.&lt;/span&gt;&lt;span class="hl-identifier"&gt;GetUser&lt;/span&gt;&lt;span class="hl-brackets"&gt;(&lt;/span&gt;&lt;span class="hl-identifier"&gt;user&lt;/span&gt;&lt;span class="hl-brackets"&gt;)&lt;/span&gt;&lt;span class="hl-code"&gt;
    &lt;/span&gt;&lt;span class="hl-reserved"&gt;if&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-identifier"&gt;command&lt;/span&gt;&lt;span class="hl-code"&gt; == &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-string"&gt;picture&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt;:
      &lt;/span&gt;&lt;span class="hl-reserved"&gt;print&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-identifier"&gt;account&lt;/span&gt;&lt;span class="hl-code"&gt;.&lt;/span&gt;&lt;span class="hl-identifier"&gt;profile_image_url&lt;/span&gt;&lt;span class="hl-code"&gt;
  &lt;/span&gt;&lt;span class="hl-reserved"&gt;else&lt;/span&gt;&lt;span class="hl-code"&gt;:
    &lt;/span&gt;&lt;span class="hl-reserved"&gt;if&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-identifier"&gt;command&lt;/span&gt;&lt;span class="hl-code"&gt; == &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-string"&gt;picture&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt;:
      &lt;/span&gt;&lt;span class="hl-reserved"&gt;print&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-string"&gt;picture command requires -u user&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt;
 
 
&lt;/span&gt;&lt;span class="hl-identifier"&gt;main&lt;/span&gt;&lt;span class="hl-brackets"&gt;(&lt;/span&gt;&lt;span class="hl-identifier"&gt;sys&lt;/span&gt;&lt;span class="hl-code"&gt;.&lt;/span&gt;&lt;span class="hl-identifier"&gt;argv&lt;/span&gt;&lt;span class="hl-brackets"&gt;[&lt;/span&gt;&lt;span class="hl-number"&gt;1&lt;/span&gt;&lt;span class="hl-code"&gt;:&lt;/span&gt;&lt;span class="hl-brackets"&gt;]&lt;/span&gt;&lt;span class="hl-brackets"&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So now you can see that while the endless-loop script runs, I will get messages sent both to the desktop (where they are unfortunately not clickable, as notify-send doesn&amp;#039;t do actions). Instead, I&amp;#039;m broadcasting them (again, in a pretty dirty way, using /dev/pts/*) to all open TTYs (which I&amp;#039;m anticipating will crash something badly, but nothing has happened so far).&lt;/p&gt;
&lt;p&gt;Then I have a starting and stopping script that works like this:&lt;/p&gt;
&lt;div class="hl-main"&gt;
&lt;pre&gt;&lt;span class="hl-special"&gt;#!/bin/bash&lt;/span&gt;&lt;span class="hl-code"&gt;
&lt;/span&gt;&lt;span class="hl-reserved"&gt;if&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-brackets"&gt;[&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-var"&gt;$1&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt; == &lt;/span&gt;&lt;span class="hl-quotes"&gt;'&lt;/span&gt;&lt;span class="hl-string"&gt;start&lt;/span&gt;&lt;span class="hl-quotes"&gt;'&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-brackets"&gt;]&lt;/span&gt;&lt;span class="hl-code"&gt;
&lt;/span&gt;&lt;span class="hl-reserved"&gt;then&lt;/span&gt;&lt;span class="hl-code"&gt;
  &lt;/span&gt;&lt;span class="hl-reserved"&gt;if&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-brackets"&gt;[&lt;/span&gt;&lt;span class="hl-code"&gt; ! -&lt;/span&gt;&lt;span class="hl-identifier"&gt;f&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-var"&gt;$HOME&lt;/span&gt;&lt;span class="hl-string"&gt;/.twitterd.pid&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-brackets"&gt;]&lt;/span&gt;&lt;span class="hl-code"&gt;
  &lt;/span&gt;&lt;span class="hl-reserved"&gt;then&lt;/span&gt;&lt;span class="hl-code"&gt;
    &lt;/span&gt;&lt;span class="hl-reserved"&gt;echo&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-string"&gt;Starting&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt;
    ~/&lt;/span&gt;&lt;span class="hl-identifier"&gt;scripts&lt;/span&gt;&lt;span class="hl-code"&gt;/&lt;/span&gt;&lt;span class="hl-identifier"&gt;twitcron&lt;/span&gt;&lt;span class="hl-code"&gt;.&lt;/span&gt;&lt;span class="hl-identifier"&gt;sh&lt;/span&gt;&lt;span class="hl-quotes"&gt; /&lt;/span&gt;&lt;span class="hl-string"&gt;dev&lt;/span&gt;&lt;span class="hl-quotes"&gt;/&lt;/span&gt;&lt;span class="hl-identifier"&gt;null&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-number"&gt;2&lt;/span&gt;&lt;span class="hl-code"&gt;/&lt;/span&gt;&lt;span class="hl-identifier"&gt;dev&lt;/span&gt;&lt;span class="hl-code"&gt;/&lt;/span&gt;&lt;span class="hl-identifier"&gt;null&lt;/span&gt;&lt;span class="hl-code"&gt; 
    &lt;/span&gt;&lt;span class="hl-reserved"&gt;echo&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-var"&gt;$!&lt;/span&gt;&lt;span class="hl-code"&gt;  &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-var"&gt;$HOME&lt;/span&gt;&lt;span class="hl-string"&gt;/.twitterd.pid&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt;
  &lt;/span&gt;&lt;span class="hl-reserved"&gt;else&lt;/span&gt;&lt;span class="hl-code"&gt;
    &lt;/span&gt;&lt;span class="hl-reserved"&gt;echo&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-string"&gt;Already running: &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-quotes"&gt;`&lt;/span&gt;&lt;span class="hl-string"&gt;cat &lt;/span&gt;&lt;span class="hl-var"&gt;$HOME&lt;/span&gt;&lt;span class="hl-string"&gt;/.twitterd.pid&lt;/span&gt;&lt;span class="hl-quotes"&gt;`&lt;/span&gt;&lt;span class="hl-code"&gt;
  &lt;/span&gt;&lt;span class="hl-reserved"&gt;fi&lt;/span&gt;&lt;span class="hl-code"&gt;
&lt;/span&gt;&lt;span class="hl-reserved"&gt;else&lt;/span&gt;&lt;span class="hl-code"&gt;
  &lt;/span&gt;&lt;span class="hl-reserved"&gt;if&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-brackets"&gt;[&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-var"&gt;$1&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt; == &lt;/span&gt;&lt;span class="hl-quotes"&gt;'&lt;/span&gt;&lt;span class="hl-string"&gt;stop&lt;/span&gt;&lt;span class="hl-quotes"&gt;'&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-brackets"&gt;]&lt;/span&gt;&lt;span class="hl-code"&gt;
  &lt;/span&gt;&lt;span class="hl-reserved"&gt;then&lt;/span&gt;&lt;span class="hl-code"&gt;
    &lt;/span&gt;&lt;span class="hl-reserved"&gt;if&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-brackets"&gt;[&lt;/span&gt;&lt;span class="hl-code"&gt; -&lt;/span&gt;&lt;span class="hl-identifier"&gt;f&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-var"&gt;$HOME&lt;/span&gt;&lt;span class="hl-string"&gt;/.twitterd.pid&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-brackets"&gt;]&lt;/span&gt;&lt;span class="hl-code"&gt;
    &lt;/span&gt;&lt;span class="hl-reserved"&gt;then&lt;/span&gt;&lt;span class="hl-code"&gt;
      &lt;/span&gt;&lt;span class="hl-reserved"&gt;echo&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-string"&gt;Stopping&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt;
      &lt;/span&gt;&lt;span class="hl-identifier"&gt;pid&lt;/span&gt;&lt;span class="hl-code"&gt;=&lt;/span&gt;&lt;span class="hl-quotes"&gt;`&lt;/span&gt;&lt;span class="hl-string"&gt;cat &lt;/span&gt;&lt;span class="hl-var"&gt;$HOME&lt;/span&gt;&lt;span class="hl-string"&gt;/.twitterd.pid&lt;/span&gt;&lt;span class="hl-quotes"&gt;`&lt;/span&gt;&lt;span class="hl-code"&gt;
      &lt;/span&gt;&lt;span class="hl-identifier"&gt;kill&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-var"&gt;$pid&lt;/span&gt;&lt;span class="hl-code"&gt;
      &lt;/span&gt;&lt;span class="hl-reserved"&gt;rm&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-var"&gt;$HOME&lt;/span&gt;&lt;span class="hl-code"&gt;/.&lt;/span&gt;&lt;span class="hl-identifier"&gt;twitterd&lt;/span&gt;&lt;span class="hl-code"&gt;.&lt;/span&gt;&lt;span class="hl-identifier"&gt;pid&lt;/span&gt;&lt;span class="hl-code"&gt;
    &lt;/span&gt;&lt;span class="hl-reserved"&gt;else&lt;/span&gt;&lt;span class="hl-code"&gt;
      &lt;/span&gt;&lt;span class="hl-reserved"&gt;echo&lt;/span&gt;&lt;span class="hl-code"&gt; &lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-string"&gt;Not running.&lt;/span&gt;&lt;span class="hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="hl-code"&gt;
    &lt;/span&gt;&lt;span class="hl-reserved"&gt;fi&lt;/span&gt;&lt;span class="hl-code"&gt;
  &lt;/span&gt;&lt;span class="hl-reserved"&gt;fi&lt;/span&gt;&lt;span class="hl-code"&gt;
&lt;/span&gt;&lt;span class="hl-reserved"&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And it actually works! I&amp;#039;ve launched the process and now get those tweets live to the desktop and the terminal. It&amp;#039;s great. &lt;img src="http://arancaytar.ermarian.net/sites/arancaytar.ermarian.net/files/smileys/smile.gif" title="Smile" alt="Smile" class="smiley-content"/&gt;&lt;/p&gt;
 &lt;!-- google_ad_section_end --&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1NQu4gnt0h3epHlsTp7juJwzXWs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1NQu4gnt0h3epHlsTp7juJwzXWs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1NQu4gnt0h3epHlsTp7juJwzXWs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1NQu4gnt0h3epHlsTp7juJwzXWs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aranfoolcaytar/~4/3a7E1CadGQ0" height="1" width="1"/&gt;</description>
 <comments>http://arancaytar.ermarian.net/2009/06/22/my-very-own-twitter-daemon#comments</comments>
 <category domain="http://arancaytar.ermarian.net/keyword/bash">bash</category>
 <category domain="http://arancaytar.ermarian.net/keyword/daemon">daemon</category>
 <category domain="http://arancaytar.ermarian.net/keyword/gnome">Gnome</category>
 <category domain="http://arancaytar.ermarian.net/keyword/python">python</category>
 <category domain="http://arancaytar.ermarian.net/keyword/scripting">scripting</category>
 <category domain="http://arancaytar.ermarian.net/keyword/twidge">twidge</category>
 <category domain="http://arancaytar.ermarian.net/keyword/twitter">Twitter</category>
 <category domain="http://arancaytar.ermarian.net/news/technology/programming">Programming</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://arancaytar.ermarian.net/crss/node/192</wfw:commentRss>
 <pubDate>Mon, 22 Jun 2009 14:31:31 +0000</pubDate>
 <dc:creator>Arancaytar</dc:creator>
 <guid isPermaLink="false">192 at http://arancaytar.ermarian.net</guid>
<feedburner:origLink>http://arancaytar.ermarian.net/2009/06/22/my-very-own-twitter-daemon</feedburner:origLink></item>
<item>
 <title>Blog redesign</title>
 <link>http://feedproxy.google.com/~r/aranfoolcaytar/~3/PJJrSsSEVso/blog-redesign</link>
 <description>&lt;!-- google_ad_section_start --&gt; &lt;p&gt;Half a year has passed since the last theme change, so tradition dictates I pick a new one again. Actually, this time I wanted to change because &lt;a href="http://drupal.org/project/agregado" title="http://drupal.org/project/agregado"&gt;Agregado&lt;/a&gt; lacks fluid-width support. Seeing your website on a 2000px monitor, all alone in a narrow vertical beam in the center, really makes you question your web skills.&lt;/p&gt;
&lt;p&gt;This new one is &lt;a href="http://drupal.org/project/colourised" title="http://drupal.org/project/colourised"&gt;Colourised&lt;/a&gt;, and it is lovely. Lovely I say. I particularly love the prismatic spectrum in the background.&lt;/p&gt;
&lt;p&gt;Naturally, I had to tweak quite heavily, as with all themes. The default is for the content to start well in the bottom half of the screen, for no other clear reason than to offer a clear view of the background image. Which is admittedly lovely, but it can be admired just as well behind the text. My tweak shifts the header, slogan and content all up a few notches.&lt;/p&gt;
&lt;p&gt;Afte setting up the theme, my next priority was getting my page to validate again. This is something you need to retest regularly, because there will always be something around to break it again. In this case, I had to rewrite Drupal&amp;#039;s entire linebreak generator, which wasn&amp;#039;t able to work around in-line divs and headings in XHTML-valid ways. Pleased to say that it works very well now.&lt;/p&gt;
&lt;p&gt;You can also see I have added a Latest Tweets block to my sidebar, since I&amp;#039;m using Twitter quite heavily these days.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I think I&amp;#039;ve been coding on one thing or another (proxydb, dhtml_menu, shell scripts, xbbcode) for well over twelve hours now. Mostly to avoid having to &lt;a href="http://twitter.com/#search?q=neda" title="http://twitter.com/#search?q=neda"&gt;follow the news&lt;/a&gt;. I don&amp;#039;t think I&amp;#039;ve felt physically ill like this since &lt;a href="http://rachelcorrie.org/" title="http://rachelcorrie.org/"&gt;March 2003&lt;/a&gt;. Why do politics need to turn wonderful human beings into martyrs?&lt;/p&gt;
 &lt;!-- google_ad_section_end --&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hxgP8UTPekNLAf1t6-AYpyP21k8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hxgP8UTPekNLAf1t6-AYpyP21k8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hxgP8UTPekNLAf1t6-AYpyP21k8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hxgP8UTPekNLAf1t6-AYpyP21k8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aranfoolcaytar/~4/PJJrSsSEVso" height="1" width="1"/&gt;</description>
 <comments>http://arancaytar.ermarian.net/2009/06/22/blog-redesign#comments</comments>
 <category domain="http://arancaytar.ermarian.net/news/personal/aranfoolcaytar">Aranfoolcaytar</category>
 <category domain="http://arancaytar.ermarian.net/keyword/colourised">colourised</category>
 <category domain="http://arancaytar.ermarian.net/keyword/drupal">drupal</category>
 <category domain="http://arancaytar.ermarian.net/keyword/politics-0">Politics</category>
 <category domain="http://arancaytar.ermarian.net/keyword/theme">theme</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://arancaytar.ermarian.net/crss/node/191</wfw:commentRss>
 <pubDate>Mon, 22 Jun 2009 02:52:17 +0000</pubDate>
 <dc:creator>Arancaytar</dc:creator>
 <guid isPermaLink="false">191 at http://arancaytar.ermarian.net</guid>
<feedburner:origLink>http://arancaytar.ermarian.net/2009/06/22/blog-redesign</feedburner:origLink></item>
<item>
 <title>Proxy DB 0.3</title>
 <link>http://feedproxy.google.com/~r/aranfoolcaytar/~3/mvHe4HEwkEc/proxy-db-03</link>
 <description>&lt;!-- google_ad_section_start --&gt; &lt;p&gt;I&amp;#039;ve toiled on a few more features for the Proxy DB module (described in the &lt;a href="http://arancaytar.ermarian.net/keyword/proxydb" title="http://arancaytar.ermarian.net/keyword/proxydb"&gt;past few posts&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Changes include:&lt;/p&gt;
&lt;ul class=""&gt;&lt;li&gt;Password protection is optional (if no password is set, the list of random proxies is freely displayed).&lt;/li&gt;&lt;li&gt;If the PHP installation supports &lt;a href="http://php.net/geoip" title="http://php.net/geoip"&gt;GeoIP&lt;/a&gt;, and a list of flag icons is independently downloaded to &lt;code&gt;flag-icons/&lt;/code&gt; in the file directory, then the location of every proxy will be marked with a flag icon.&lt;/li&gt;&lt;li&gt;Whole lists of proxies can now be submitted in batch (by uploading a file or pasting its contents directly). These lists can include proxies with multiple ports open (such as &lt;code&gt;3128,8080-8090,55555&lt;/code&gt;). The lot will be tested using Drupal&amp;#039;s Batch API, with a neat progress bar, and only functional proxies will be saved.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;The Proxy DB module is available for &lt;a href="http://ermarian.net/downloads/drupal/proxydb" title="http://ermarian.net/downloads/drupal/proxydb"&gt;download from the Ermarian Network&lt;/a&gt;, and there is a live production site at &lt;a href="http://barred.ermarian.net" title="http://barred.ermarian.net"&gt;barred.ermarian.net&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;* * *&lt;/p&gt;
&lt;p&gt;In other news, it appears &lt;a href="http://edition.cnn.com/2009/WORLD/meast/06/21/iran.woman.twitter/" title="http://edition.cnn.com/2009/WORLD/meast/06/21/iran.woman.twitter/"&gt;a young woman was killed in the protests&lt;/a&gt; (among many others) yesterday. RIP Neda.&lt;/p&gt;
 &lt;!-- google_ad_section_end --&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZCBXSp0uMjgDZCdOC7a04Gn7zpc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZCBXSp0uMjgDZCdOC7a04Gn7zpc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZCBXSp0uMjgDZCdOC7a04Gn7zpc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZCBXSp0uMjgDZCdOC7a04Gn7zpc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aranfoolcaytar/~4/mvHe4HEwkEc" height="1" width="1"/&gt;</description>
 <comments>http://arancaytar.ermarian.net/2009/06/21/proxy-db-03#comments</comments>
 <category domain="http://arancaytar.ermarian.net/keyword/censorship">Censorship</category>
 <category domain="http://arancaytar.ermarian.net/keyword/drupal">drupal</category>
 <category domain="http://arancaytar.ermarian.net/keyword/iran">Iran</category>
 <category domain="http://arancaytar.ermarian.net/keyword/neda">Neda</category>
 <category domain="http://arancaytar.ermarian.net/keyword/proxy">Proxy</category>
 <category domain="http://arancaytar.ermarian.net/keyword/proxydb">proxydb</category>
 <category domain="http://arancaytar.ermarian.net/news/technology/web/php">PHP</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://arancaytar.ermarian.net/crss/node/190</wfw:commentRss>
 <pubDate>Sun, 21 Jun 2009 13:17:42 +0000</pubDate>
 <dc:creator>Arancaytar</dc:creator>
 <guid isPermaLink="false">190 at http://arancaytar.ermarian.net</guid>
<feedburner:origLink>http://arancaytar.ermarian.net/2009/06/21/proxy-db-03</feedburner:origLink></item>
<item>
 <title>Proxy database live</title>
 <link>http://feedproxy.google.com/~r/aranfoolcaytar/~3/KdiEuNbpym8/proxy-database-live</link>
 <description>&lt;!-- google_ad_section_start --&gt; &lt;p&gt;My last post on &lt;a href="http://arancaytar.ermarian.net/2009/06/18/proxy-db" title="http://arancaytar.ermarian.net/2009/06/18/proxy-db"&gt;a Drupal-based database of proxy servers&lt;/a&gt; provided a link to the proxydb module I wrote. However, realistically the only potential user of the module, right now, is myself, since it is a very buggy unfinished version. So I set up a site ready for production use (after much further debugging).&lt;/p&gt;
&lt;p&gt;The site runs on Drupal 7, which is extremely sleek. I still get almost 9M memory peak for bootstrap, unfortunately - but premature performance-tweaking is the root of all evil.&lt;/p&gt;
&lt;p&gt;The newest code of the module can be downloaded at &lt;a href="http://ermarian.net/downloads/drupal-addons/proxydb/proxydb-7.x-0.2-r355.tar.gz" title="http://ermarian.net/downloads/drupal-addons/proxydb/proxydb-7.x-0.2-r355.tar.gz"&gt;proxydb-7.x-0.2-r355.tar.gz&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The production site is at &lt;a href="http://barred.ermarian.net" title="http://barred.ermarian.net"&gt;barred.ermarian.net&lt;/a&gt;. (I had the barred subdomain left over, and it seemed close enough in meaning to be repurposed for this).&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;Note that I am a newcomer to all this: &lt;a href="http://blog.austinheap.com/" title="http://blog.austinheap.com/"&gt;Austin Heap&lt;/a&gt; already has a very good &lt;a href="http://clintbellanger.net/proxyheap/" title="http://clintbellanger.net/proxyheap/"&gt;proxy list&lt;/a&gt; running (the development of which I&amp;#039;m following, and which I might contribute to as well). However, just as the proxies themselves, these resources are all at risk of filtering, so you could say &amp;quot;the more the merrier&amp;quot;.&lt;/p&gt;
 &lt;!-- google_ad_section_end --&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SSpH065e5rC4oZtUPDjD6mi7Yss/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SSpH065e5rC4oZtUPDjD6mi7Yss/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/SSpH065e5rC4oZtUPDjD6mi7Yss/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SSpH065e5rC4oZtUPDjD6mi7Yss/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aranfoolcaytar/~4/KdiEuNbpym8" height="1" width="1"/&gt;</description>
 <comments>http://arancaytar.ermarian.net/2009/06/20/proxy-database-live#comments</comments>
 <category domain="http://arancaytar.ermarian.net/keyword/censorship">Censorship</category>
 <category domain="http://arancaytar.ermarian.net/news/technology/web/drupal">Drupal</category>
 <category domain="http://arancaytar.ermarian.net/keyword/drupal">drupal</category>
 <category domain="http://arancaytar.ermarian.net/keyword/proxy">Proxy</category>
 <category domain="http://arancaytar.ermarian.net/keyword/proxydb">proxydb</category>
 <category domain="http://arancaytar.ermarian.net/keyword/web">web</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://arancaytar.ermarian.net/crss/node/189</wfw:commentRss>
 <pubDate>Sat, 20 Jun 2009 02:18:18 +0000</pubDate>
 <dc:creator>Arancaytar</dc:creator>
 <guid isPermaLink="false">189 at http://arancaytar.ermarian.net</guid>
<feedburner:origLink>http://arancaytar.ermarian.net/2009/06/20/proxy-database-live</feedburner:origLink></item>
<item>
 <title>Proxy DB</title>
 <link>http://feedproxy.google.com/~r/aranfoolcaytar/~3/rdxUlThOdpk/proxy-db</link>
 <description>&lt;!-- google_ad_section_start --&gt; &lt;p&gt;After my last post on &lt;a href="http://arancaytar.ermarian.net/2009/06/18/testing-proxy-servers" title="http://arancaytar.ermarian.net/2009/06/18/testing-proxy-servers"&gt;testing proxy servers&lt;/a&gt;, I spent the past 10 or so hours on what inevitably happens whenever I develop even the simplest web application: A Drupal module.&lt;/p&gt;
&lt;p&gt;This particular module incorporates your basic &amp;quot;database table, create record, administer records&amp;quot; functionality for web proxies, but also uses a testing function similar to the one in the previous post, as well as a &amp;quot;continuous retesting&amp;quot; feature that rechecks the 15 oldest servers on each cron run (and eventually gives up on a server after a test repeatedly fails).&lt;/p&gt;
&lt;p&gt;It&amp;#039;s still full of bugs, since I don&amp;#039;t actually &lt;em&gt;have&lt;/em&gt; a database with dozens of proxies, and some parts are still untested. But I&amp;#039;ve managed to run it locally, add my own local proxy server to it, and then see it in the list.&lt;/p&gt;
&lt;p&gt;The code is available over at the &lt;a href="http://ermarian.net/downloads/drupal-addons/proxydb/" title="http://ermarian.net/downloads/drupal-addons/proxydb/"&gt;Ermarian Network&lt;/a&gt;, like my other Drupal modules that are not fit for d.o contrib (yet).&lt;/p&gt;
&lt;p&gt;(Disclaimer: The above does not endorse any political view beyond that of defeating censorship in all its forms. As the sadly-fictional UN comissioner Pravin Lal said in &lt;em&gt;Alpha Centauri&lt;/em&gt;: &amp;quot;Beware of anyone who would deny you access to information.&amp;quot; I&amp;#039;ll interfere in that any day. &lt;img src="http://arancaytar.ermarian.net/sites/arancaytar.ermarian.net/files/smileys/smile.gif" title="Smile" alt="Smile" class="smiley-content"/&gt; )&lt;/p&gt;
 &lt;!-- google_ad_section_end --&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/x5MPmdxnsBNRMuDGMmTy-Qi2ypY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/x5MPmdxnsBNRMuDGMmTy-Qi2ypY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/x5MPmdxnsBNRMuDGMmTy-Qi2ypY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/x5MPmdxnsBNRMuDGMmTy-Qi2ypY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/aranfoolcaytar/~4/rdxUlThOdpk" height="1" width="1"/&gt;</description>
 <comments>http://arancaytar.ermarian.net/2009/06/18/proxy-db#comments</comments>
 <category domain="http://arancaytar.ermarian.net/keyword/censorship">Censorship</category>
 <category domain="http://arancaytar.ermarian.net/keyword/drupal">drupal</category>
 <category domain="http://arancaytar.ermarian.net/keyword/iran">Iran</category>
 <category domain="http://arancaytar.ermarian.net/keyword/politics-0">Politics</category>
 <category domain="http://arancaytar.ermarian.net/keyword/proxy">Proxy</category>
 <category domain="http://arancaytar.ermarian.net/keyword/proxydb">proxydb</category>
 <category domain="http://arancaytar.ermarian.net/news/technology/web/php">PHP</category>
 <wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://arancaytar.ermarian.net/crss/node/188</wfw:commentRss>
 <pubDate>Thu, 18 Jun 2009 21:12:05 +0000</pubDate>
 <dc:creator>Arancaytar</dc:creator>
 <guid isPermaLink="false">188 at http://arancaytar.ermarian.net</guid>
<feedburner:origLink>http://arancaytar.ermarian.net/2009/06/18/proxy-db</feedburner:origLink></item>
</channel>
</rss>
